From f36b6a458268a0d388fcc62174358d8e72495a03 Mon Sep 17 00:00:00 2001 From: Vasilito Date: Mon, 11 May 2026 10:10:11 +0100 Subject: [PATCH] feat: add display stack dependency recipes Add lcms2, libdisplay-info, libepoxy, and libxcvt recipes required by the KWin/Mesa display stack. Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus --- .../libs/lcms2/source/.github/dependabot.yml | 10 + .../lcms2/source/.github/workflows/build.yml | 240 + .../.github/workflows/codeql-analysis.yml | 72 + .../source/.github/workflows/scorecard.yml | 55 + local/recipes/libs/lcms2/source/.gitignore | 64 + local/recipes/libs/lcms2/source/AUTHORS | 60 + .../recipes/libs/lcms2/source/CMakeLists.txt | 39 + local/recipes/libs/lcms2/source/ChangeLog | 355 + local/recipes/libs/lcms2/source/INSTALL | 2 + local/recipes/libs/lcms2/source/LICENSE | 22 + local/recipes/libs/lcms2/source/Lib/BC/BC.txt | 1 + local/recipes/libs/lcms2/source/Lib/MS/MS.TXT | 1 + local/recipes/libs/lcms2/source/Makefile.am | 45 + local/recipes/libs/lcms2/source/Makefile.in | 941 + .../libs/lcms2/source/Projects/.gitignore | 11 + .../source/Projects/BorlandC_5.5/lcms2.rc | 30 + .../source/Projects/BorlandC_5.5/lcmsdll.lk | 31 + .../source/Projects/BorlandC_5.5/lcmsdll.lst | 29 + .../Projects/BorlandC_5.5/mklcmsdll.bat | 14 + .../lcms2/source/Projects/Qt/lcms2/lcms2.pro | 53 + .../Projects/VC2019/jpegicc/jpegicc.vcxproj | 307 + .../VC2019/jpegicc/jpegicc.vcxproj.filters | 31 + .../lcms2/source/Projects/VC2019/lcms2.rc | 104 + .../lcms2/source/Projects/VC2019/lcms2.sln | Bin 0 -> 27136 bytes .../VC2019/lcms2_DLL/lcms2_DLL.vcxproj | 345 + .../lcms2_DLL/lcms2_DLL.vcxproj.filters | 121 + .../VC2019/lcms2_static/lcms2_static.vcxproj | 287 + .../lcms2_static/lcms2_static.vcxproj.filters | 108 + .../Projects/VC2019/linkicc/linkicc.vcxproj | 273 + .../VC2019/linkicc/linkicc.vcxproj.filters | 28 + .../Projects/VC2019/psicc/psicc.vcxproj | 273 + .../VC2019/psicc/psicc.vcxproj.filters | 28 + .../lcms2/source/Projects/VC2019/resource.h | 16 + .../Projects/VC2019/testbed/testbed.vcxproj | 297 + .../VC2019/testbed/testbed.vcxproj.filters | 28 + .../Projects/VC2019/tiffdiff/tiffdiff.vcxproj | 300 + .../VC2019/tiffdiff/tiffdiff.vcxproj.filters | 28 + .../Projects/VC2019/tifficc/tifficc.vcxproj | 300 + .../VC2019/tifficc/tifficc.vcxproj.filters | 33 + .../Projects/VC2019/transicc/transicc.vcxproj | 278 + .../VC2019/transicc/transicc.vcxproj.filters | 33 + .../Projects/VC2022/fuzzers/fuzzers.vcxproj | 168 + .../VC2022/fuzzers/fuzzers.vcxproj.filters | 22 + .../Projects/VC2022/jpegicc/jpegicc.vcxproj | 307 + .../VC2022/jpegicc/jpegicc.vcxproj.filters | 31 + .../lcms2/source/Projects/VC2022/lcms2.rc | 104 + .../lcms2/source/Projects/VC2022/lcms2.sln | 238 + .../VC2022/lcms2_DLL/lcms2_DLL.vcxproj | 345 + .../lcms2_DLL/lcms2_DLL.vcxproj.filters | 121 + .../VC2022/lcms2_static/lcms2_static.vcxproj | 287 + .../lcms2_static/lcms2_static.vcxproj.filters | 108 + .../Projects/VC2022/linkicc/linkicc.vcxproj | 273 + .../VC2022/linkicc/linkicc.vcxproj.filters | 28 + .../Projects/VC2022/psicc/psicc.vcxproj | 273 + .../VC2022/psicc/psicc.vcxproj.filters | 28 + .../lcms2/source/Projects/VC2022/resource.h | 16 + .../Projects/VC2022/testbed/testbed.vcxproj | 298 + .../VC2022/testbed/testbed.vcxproj.filters | 28 + .../Projects/VC2022/tiffdiff/tiffdiff.vcxproj | 300 + .../VC2022/tiffdiff/tiffdiff.vcxproj.filters | 28 + .../Projects/VC2022/tifficc/tifficc.vcxproj | 300 + .../VC2022/tifficc/tifficc.vcxproj.filters | 33 + .../Projects/VC2022/transicc/transicc.vcxproj | 278 + .../VC2022/transicc/transicc.vcxproj.filters | 33 + .../Projects/VC2026/fuzzers/fuzzers.vcxproj | 168 + .../VC2026/fuzzers/fuzzers.vcxproj.filters | 22 + .../Projects/VC2026/jpegicc/jpegicc.vcxproj | 315 + .../VC2026/jpegicc/jpegicc.vcxproj.filters | 31 + .../lcms2/source/Projects/VC2026/lcms2.rc | 104 + .../lcms2/source/Projects/VC2026/lcms2.sln | 247 + .../VC2026/lcms2_DLL/lcms2_DLL.vcxproj | 349 + .../lcms2_DLL/lcms2_DLL.vcxproj.filters | 121 + .../VC2026/lcms2_static/lcms2_static.vcxproj | 290 + .../lcms2_static/lcms2_static.vcxproj.filters | 108 + .../Projects/VC2026/linkicc/linkicc.vcxproj | 275 + .../VC2026/linkicc/linkicc.vcxproj.filters | 28 + .../Projects/VC2026/psicc/psicc.vcxproj | 275 + .../VC2026/psicc/psicc.vcxproj.filters | 28 + .../lcms2/source/Projects/VC2026/resource.h | 16 + .../Projects/VC2026/testbed/testbed.vcxproj | 302 + .../VC2026/testbed/testbed.vcxproj.filters | 28 + .../Projects/VC2026/tiffdiff/tiffdiff.vcxproj | 320 + .../VC2026/tiffdiff/tiffdiff.vcxproj.filters | 28 + .../Projects/VC2026/tifficc/tifficc.vcxproj | 308 + .../VC2026/tifficc/tifficc.vcxproj.filters | 33 + .../Projects/VC2026/transicc/transicc.vcxproj | 280 + .../VC2026/transicc/transicc.vcxproj.filters | 33 + .../lcms2/lcms2.xcodeproj/project.pbxproj | 1387 + .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../lcms2/lcms2.xcodeproj/project.pbxproj | 1436 + .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../lcms2/lcms2.xcodeproj/project.pbxproj | 1685 + .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../source/Projects/cppcheck/lcms2.cppcheck | 9 + local/recipes/libs/lcms2/source/README.md | 18 + local/recipes/libs/lcms2/source/SECURITY.md | 27 + local/recipes/libs/lcms2/source/aclocal.m4 | 1364 + local/recipes/libs/lcms2/source/autogen.sh | 103 + .../lcms2/source/cmake/Lcms2Features.cmake | 72 + .../lcms2/source/cmake/Lcms2Library.cmake | 168 + .../lcms2/source/cmake/Lcms2Options.cmake | 31 + .../lcms2/source/cmake/Lcms2Packaging.cmake | 148 + .../lcms2/source/cmake/Lcms2Plugins.cmake | 91 + .../libs/lcms2/source/cmake/Lcms2Tests.cmake | 90 + .../libs/lcms2/source/cmake/Lcms2Tools.cmake | 182 + .../lcms2/source/cmake/lcms2-config.cmake.in | 3 + local/recipes/libs/lcms2/source/compile | 364 + local/recipes/libs/lcms2/source/config.guess | 1480 + local/recipes/libs/lcms2/source/config.sub | 1971 + local/recipes/libs/lcms2/source/configure | 24176 ++++++++ local/recipes/libs/lcms2/source/configure.ac | 439 + local/recipes/libs/lcms2/source/depcomp | 792 + .../lcms2/source/doc/LittleCMS2.19 API.pdf | Bin 0 -> 1210924 bytes .../source/doc/LittleCMS2.19 Plugin API.pdf | Bin 0 -> 704682 bytes .../source/doc/LittleCMS2.19 tutorial.pdf | Bin 0 -> 641284 bytes .../libs/lcms2/source/doc/logo-small.png | Bin 0 -> 2811 bytes .../lcms2/source/fuzzers/corpus/alltags.icc | Bin 0 -> 218352 bytes .../libs/lcms2/source/fuzzers/fuzzers.c | 198 + .../libs/lcms2/source/fuzzers/fuzzers.exp | Bin 0 -> 5140 bytes .../libs/lcms2/source/include/Makefile.am | 7 + .../libs/lcms2/source/include/Makefile.in | 607 + .../recipes/libs/lcms2/source/include/lcms2.h | 2029 + .../libs/lcms2/source/include/lcms2_plugin.h | 700 + .../libs/lcms2/source/include/meson.build | 8 + local/recipes/libs/lcms2/source/install-sh | 518 + local/recipes/libs/lcms2/source/lcms2.pc.in | 11 + local/recipes/libs/lcms2/source/ltmain.sh | 11517 ++++ .../source/m4/ax_append_compile_flags.m4 | 46 + .../libs/lcms2/source/m4/ax_append_flag.m4 | 50 + .../lcms2/source/m4/ax_check_compile_flag.m4 | 53 + .../lcms2/source/m4/ax_gcc_func_attribute.m4 | 242 + .../libs/lcms2/source/m4/ax_pthread.m4 | 522 + .../lcms2/source/m4/ax_require_defined.m4 | 37 + local/recipes/libs/lcms2/source/m4/libtool.m4 | 8491 +++ .../recipes/libs/lcms2/source/m4/ltoptions.m4 | 467 + local/recipes/libs/lcms2/source/m4/ltsugar.m4 | 124 + .../recipes/libs/lcms2/source/m4/ltversion.m4 | 24 + .../libs/lcms2/source/m4/lt~obsolete.m4 | 99 + local/recipes/libs/lcms2/source/meson.build | 127 + .../libs/lcms2/source/meson_options.txt | 10 + local/recipes/libs/lcms2/source/missing | 236 + .../libs/lcms2/source/plugins/Makefile | 662 + .../libs/lcms2/source/plugins/Makefile.am | 1 + .../libs/lcms2/source/plugins/Makefile.in | 662 + .../libs/lcms2/source/plugins/README.1ST | 6 + .../source/plugins/fast_float/COPYING.GPL3 | 674 + .../source/plugins/fast_float/Makefile.am | 1 + .../source/plugins/fast_float/Makefile.in | 662 + .../VC2019/lcms2_fast_float_plugin.vcxproj | 203 + .../lcms2_fast_float_plugin.vcxproj.filters | 75 + .../lcms2_fast_float_plugin_testbed.vcxproj | 170 + ..._fast_float_plugin_testbed.vcxproj.filters | 22 + .../VC2022/lcms2_fast_float_plugin.vcxproj | 286 + .../lcms2_fast_float_plugin.vcxproj.filters | 72 + .../lcms2_fast_float_plugin_testbed.vcxproj | 240 + ..._fast_float_plugin_testbed.vcxproj.filters | 22 + .../VC2026/lcms2_fast_float_plugin.vcxproj | 286 + .../lcms2_fast_float_plugin.vcxproj.filters | 72 + .../lcms2_fast_float_plugin_testbed.vcxproj | 240 + ..._fast_float_plugin_testbed.vcxproj.filters | 22 + ...ittleCMS floating point extensions 1.7.pdf | Bin 0 -> 253570 bytes .../plugins/fast_float/include/Makefile.am | 6 + .../plugins/fast_float/include/Makefile.in | 606 + .../fast_float/include/lcms2_fast_float.h | 150 + .../plugins/fast_float/include/meson.build | 1 + .../source/plugins/fast_float/meson.build | 3 + .../source/plugins/fast_float/src/Makefile.am | 27 + .../source/plugins/fast_float/src/Makefile.in | 769 + .../plugins/fast_float/src/fast_16_tethra.c | 385 + .../plugins/fast_float/src/fast_8_curves.c | 422 + .../plugins/fast_float/src/fast_8_matsh.c | 384 + .../plugins/fast_float/src/fast_8_matsh_sse.c | 426 + .../plugins/fast_float/src/fast_8_tethra.c | 494 + .../fast_float/src/fast_float_15bits.c | 568 + .../fast_float/src/fast_float_15mats.c | 358 + .../plugins/fast_float/src/fast_float_cmyk.c | 393 + .../fast_float/src/fast_float_curves.c | 480 + .../fast_float/src/fast_float_internal.h | 282 + .../plugins/fast_float/src/fast_float_lab.c | 435 + .../plugins/fast_float/src/fast_float_matsh.c | 386 + .../fast_float/src/fast_float_separate.c | 199 + .../plugins/fast_float/src/fast_float_sup.c | 118 + .../fast_float/src/fast_float_tethra.c | 362 + .../fast_float/src/lcms2_fast_float.rc.in | 52 + .../source/plugins/fast_float/src/meson.build | 50 + .../plugins/fast_float/testbed/Makefile.am | 23 + .../plugins/fast_float/testbed/Makefile.in | 658 + .../plugins/fast_float/testbed/demo_cmyk.c | 151 + .../fast_float/testbed/fast_float_testbed.c | 2739 + .../plugins/fast_float/testbed/meson.build | 16 + .../libs/lcms2/source/plugins/meson.build | 9 + .../source/plugins/test_profiles/meson.build | 1 + .../source/plugins/test_profiles/test0.icc | Bin 0 -> 568 bytes .../source/plugins/test_profiles/test1.icc | Bin 0 -> 557536 bytes .../source/plugins/test_profiles/test2.icc | Bin 0 -> 654496 bytes .../source/plugins/test_profiles/test3.icc | Bin 0 -> 28484 bytes .../source/plugins/test_profiles/test5.icc | Bin 0 -> 3240 bytes .../source/plugins/threaded/COPYING.GPL3 | 674 + .../lcms2/source/plugins/threaded/Makefile.am | 1 + .../lcms2/source/plugins/threaded/Makefile.in | 662 + .../VC2022/lcms2_threaded_plugin.vcxproj | 274 + .../lcms2_threaded_plugin.vcxproj.filters | 42 + .../lcms2_threaded_plugin_testbed.vcxproj | 241 + ...s2_threaded_plugin_testbed.vcxproj.filters | 27 + .../VC2026/lcms2_threaded_plugin.vcxproj | 274 + .../lcms2_threaded_plugin.vcxproj.filters | 42 + .../lcms2_threaded_plugin_testbed.vcxproj | 241 + ...s2_threaded_plugin_testbed.vcxproj.filters | 27 + .../doc/LittleCMS threaded extensions 1.0.pdf | Bin 0 -> 190980 bytes .../plugins/threaded/include/Makefile.am | 6 + .../plugins/threaded/include/Makefile.in | 606 + .../plugins/threaded/include/lcms2_threaded.h | 59 + .../plugins/threaded/include/meson.build | 1 + .../lcms2/source/plugins/threaded/meson.build | 3 + .../source/plugins/threaded/src/Makefile.am | 27 + .../source/plugins/threaded/src/Makefile.in | 724 + .../plugins/threaded/src/lcms2_threaded.rc.in | 52 + .../source/plugins/threaded/src/meson.build | 35 + .../plugins/threaded/src/threaded_core.c | 165 + .../plugins/threaded/src/threaded_internal.h | 79 + .../plugins/threaded/src/threaded_main.c | 43 + .../plugins/threaded/src/threaded_scheduler.c | 108 + .../plugins/threaded/src/threaded_split.c | 216 + .../plugins/threaded/testbed/Makefile.am | 23 + .../plugins/threaded/testbed/Makefile.in | 657 + .../plugins/threaded/testbed/meson.build | 16 + .../threaded/testbed/threaded_testbed.c | 888 + .../recipes/libs/lcms2/source/src/Makefile.am | 31 + .../recipes/libs/lcms2/source/src/Makefile.in | 809 + .../recipes/libs/lcms2/source/src/cmsalpha.c | 650 + .../recipes/libs/lcms2/source/src/cmscam02.c | 490 + .../recipes/libs/lcms2/source/src/cmscgats.c | 3310 + .../recipes/libs/lcms2/source/src/cmscnvrt.c | 1226 + local/recipes/libs/lcms2/source/src/cmserr.c | 750 + .../recipes/libs/lcms2/source/src/cmsgamma.c | 1514 + local/recipes/libs/lcms2/source/src/cmsgmt.c | 662 + local/recipes/libs/lcms2/source/src/cmshalf.c | 535 + .../recipes/libs/lcms2/source/src/cmsintrp.c | 1330 + local/recipes/libs/lcms2/source/src/cmsio0.c | 2201 + local/recipes/libs/lcms2/source/src/cmsio1.c | 1045 + local/recipes/libs/lcms2/source/src/cmslut.c | 1852 + local/recipes/libs/lcms2/source/src/cmsmd5.c | 313 + local/recipes/libs/lcms2/source/src/cmsmtrx.c | 176 + .../recipes/libs/lcms2/source/src/cmsnamed.c | 1210 + local/recipes/libs/lcms2/source/src/cmsopt.c | 1992 + local/recipes/libs/lcms2/source/src/cmspack.c | 4062 ++ local/recipes/libs/lcms2/source/src/cmspcs.c | 950 + .../recipes/libs/lcms2/source/src/cmsplugin.c | 1055 + local/recipes/libs/lcms2/source/src/cmsps2.c | 1642 + local/recipes/libs/lcms2/source/src/cmssamp.c | 599 + local/recipes/libs/lcms2/source/src/cmssm.c | 736 + .../recipes/libs/lcms2/source/src/cmstypes.c | 6252 ++ local/recipes/libs/lcms2/source/src/cmsvirt.c | 1364 + .../recipes/libs/lcms2/source/src/cmswtpnt.c | 353 + .../recipes/libs/lcms2/source/src/cmsxform.c | 1506 + local/recipes/libs/lcms2/source/src/lcms2.def | 384 + .../recipes/libs/lcms2/source/src/lcms2.rc.in | 56 + .../libs/lcms2/source/src/lcms2_internal.h | 1158 + .../recipes/libs/lcms2/source/src/meson.build | 72 + .../libs/lcms2/source/testbed/Makefile.am | 34 + .../libs/lcms2/source/testbed/Makefile.in | 672 + .../libs/lcms2/source/testbed/alpha_test.c | 306 + .../recipes/libs/lcms2/source/testbed/bad.icc | 21 + .../libs/lcms2/source/testbed/bad_mpe.icc | Bin 0 -> 300 bytes .../libs/lcms2/source/testbed/crayons.icc | Bin 0 -> 8760 bytes .../libs/lcms2/source/testbed/ibm-t61.icc | Bin 0 -> 25244 bytes .../libs/lcms2/source/testbed/meson.build | 31 + .../recipes/libs/lcms2/source/testbed/new.icc | Bin 0 -> 67268 bytes .../libs/lcms2/source/testbed/test1.icc | Bin 0 -> 557536 bytes .../libs/lcms2/source/testbed/test2.icc | Bin 0 -> 654496 bytes .../libs/lcms2/source/testbed/test3.icc | Bin 0 -> 28484 bytes .../libs/lcms2/source/testbed/test4.icc | Bin 0 -> 61020 bytes .../libs/lcms2/source/testbed/test5.icc | Bin 0 -> 3240 bytes .../libs/lcms2/source/testbed/testcms2.c | 9928 +++ .../libs/lcms2/source/testbed/testcms2.h | 91 + .../libs/lcms2/source/testbed/testplugin.c | 1583 + .../libs/lcms2/source/testbed/testthread.cpp | 120 + .../libs/lcms2/source/testbed/toosmall.icc | Bin 0 -> 158 bytes .../libs/lcms2/source/testbed/zoo_icc.c | 309 + .../lcms2/source/utils/common/meson.build | 9 + .../libs/lcms2/source/utils/common/utils.h | 101 + .../libs/lcms2/source/utils/common/vprf.c | 338 + .../libs/lcms2/source/utils/common/xgetopt.c | 100 + .../lcms2/source/utils/delphi/delphidemo.dpr | 13 + .../source/utils/delphi/delphidemo.dproj | 114 + .../lcms2/source/utils/delphi/delphidemo.res | Bin 0 -> 876 bytes .../libs/lcms2/source/utils/delphi/demo1.dfm | Bin 0 -> 4400 bytes .../libs/lcms2/source/utils/delphi/demo1.pas | 322 + .../lcms2/source/utils/delphi/lcms2dll.pas | 2159 + .../lcms2/source/utils/jpgicc/LICENSE_iccjpeg | 67 + .../lcms2/source/utils/jpgicc/Makefile.am | 22 + .../lcms2/source/utils/jpgicc/Makefile.in | 751 + .../libs/lcms2/source/utils/jpgicc/iccjpeg.c | 248 + .../libs/lcms2/source/utils/jpgicc/iccjpeg.h | 73 + .../libs/lcms2/source/utils/jpgicc/jpgicc.1 | 122 + .../libs/lcms2/source/utils/jpgicc/jpgicc.c | 1275 + .../lcms2/source/utils/jpgicc/meson.build | 17 + .../lcms2/source/utils/linkicc/Makefile.am | 19 + .../lcms2/source/utils/linkicc/Makefile.in | 751 + .../libs/lcms2/source/utils/linkicc/linkicc.1 | 123 + .../libs/lcms2/source/utils/linkicc/linkicc.c | 378 + .../lcms2/source/utils/linkicc/meson.build | 16 + .../libs/lcms2/source/utils/matlab/howto.txt | 4 + .../libs/lcms2/source/utils/matlab/icctrans.c | 724 + .../libs/lcms2/source/utils/matlab/lcms_rsp | 30 + .../libs/lcms2/source/utils/meson.build | 10 + .../libs/lcms2/source/utils/psicc/Makefile.am | 19 + .../libs/lcms2/source/utils/psicc/Makefile.in | 751 + .../libs/lcms2/source/utils/psicc/meson.build | 16 + .../libs/lcms2/source/utils/psicc/psicc.1 | 46 + .../libs/lcms2/source/utils/psicc/psicc.c | 248 + .../lcms2/source/utils/samples/Makefile.am | 19 + .../lcms2/source/utils/samples/Makefile.in | 611 + .../libs/lcms2/source/utils/samples/itufax.c | 138 + .../libs/lcms2/source/utils/samples/mkcmy.c | 170 + .../lcms2/source/utils/samples/mkgrayer.c | 93 + .../libs/lcms2/source/utils/samples/mktiff8.c | 150 + .../lcms2/source/utils/samples/roundtrip.c | 99 + .../libs/lcms2/source/utils/samples/vericc.c | 65 + .../libs/lcms2/source/utils/samples/wtpt.1 | 28 + .../libs/lcms2/source/utils/samples/wtpt.c | 146 + .../lcms2/source/utils/tificc/Makefile.am | 25 + .../lcms2/source/utils/tificc/Makefile.in | 751 + .../lcms2/source/utils/tificc/meson.build | 27 + .../libs/lcms2/source/utils/tificc/tifdiff.c | 708 + .../libs/lcms2/source/utils/tificc/tificc.1 | 117 + .../libs/lcms2/source/utils/tificc/tificc.c | 1316 + .../lcms2/source/utils/transicc/Makefile.am | 19 + .../lcms2/source/utils/transicc/Makefile.in | 751 + .../lcms2/source/utils/transicc/meson.build | 16 + .../lcms2/source/utils/transicc/transicc.1 | 89 + .../lcms2/source/utils/transicc/transicc.c | 1332 + .../recipes/libs/libdisplay-info/source/di.c | 401 + .../source/include/libdisplay-info/cta.h | 3 + .../include/libdisplay-info/displayid.h | 3 + .../source/include/libdisplay-info/edid.h | 3 + .../source/include/libdisplay-info/info.h | 108 + .../libs/libepoxy/source/.dir-locals.el | 6 + .../libs/libepoxy/source/.editorconfig | 22 + .../source/.github/scripts/epoxy-ci-linux.sh | 32 + .../source/.github/scripts/epoxy-ci-osx.sh | 27 + .../source/.github/workflows/linux.yml | 38 + .../source/.github/workflows/macos.yml | 26 + .../source/.github/workflows/msvc-env.yml | 23 + .../source/.github/workflows/msys2.yml | 27 + local/recipes/libs/libepoxy/source/.gitignore | 79 + local/recipes/libs/libepoxy/source/COPYING | 50 + local/recipes/libs/libepoxy/source/README.md | 126 + .../libepoxy/source/cross/fedora-mingw64.txt | 18 + .../libs/libepoxy/source/doc/Doxyfile.in | 241 + .../libs/libepoxy/source/doc/meson.build | 25 + .../libepoxy/source/include/epoxy/common.h | 63 + .../libs/libepoxy/source/include/epoxy/egl.h | 54 + .../libs/libepoxy/source/include/epoxy/gl.h | 112 + .../libs/libepoxy/source/include/epoxy/glx.h | 57 + .../libepoxy/source/include/epoxy/meson.build | 43 + .../libs/libepoxy/source/include/epoxy/wgl.h | 61 + .../recipes/libs/libepoxy/source/meson.build | 229 + .../libs/libepoxy/source/meson_options.txt | 21 + .../libs/libepoxy/source/registry/README.md | 13 + .../libs/libepoxy/source/registry/egl.xml | 3282 + .../libs/libepoxy/source/registry/gl.xml | 51429 ++++++++++++++++ .../libs/libepoxy/source/registry/glx.xml | 2202 + .../libs/libepoxy/source/registry/wgl.xml | 2003 + .../libepoxy/source/src/dispatch_common.c | 926 + .../libepoxy/source/src/dispatch_common.h | 206 + .../libs/libepoxy/source/src/dispatch_egl.c | 122 + .../libs/libepoxy/source/src/dispatch_glx.c | 172 + .../libs/libepoxy/source/src/dispatch_wgl.c | 196 + .../libs/libepoxy/source/src/gen_dispatch.py | 932 + .../libs/libepoxy/source/src/meson.build | 121 + .../libs/libepoxy/source/test/cgl_core.c | 54 + .../libs/libepoxy/source/test/cgl_epoxy_api.c | 83 + .../libs/libepoxy/source/test/dlwrap.c | 325 + .../libs/libepoxy/source/test/dlwrap.h | 67 + .../libs/libepoxy/source/test/egl_common.c | 54 + .../libs/libepoxy/source/test/egl_common.h | 25 + .../libs/libepoxy/source/test/egl_epoxy_api.c | 148 + .../libs/libepoxy/source/test/egl_gl.c | 130 + .../source/test/egl_has_extension_nocontext.c | 75 + .../libepoxy/source/test/egl_without_glx.c | 165 + .../libs/libepoxy/source/test/gl_version.c | 91 + .../source/test/glx_alias_prefer_same_name.c | 82 + .../libs/libepoxy/source/test/glx_beginend.c | 107 + .../libs/libepoxy/source/test/glx_common.c | 129 + .../libs/libepoxy/source/test/glx_common.h | 39 + .../libs/libepoxy/source/test/glx_gles2.c | 118 + .../test/glx_glxgetprocaddress_nocontext.c | 57 + .../source/test/glx_has_extension_nocontext.c | 56 + .../libepoxy/source/test/glx_public_api.c | 123 + .../source/test/glx_public_api_core.c | 181 + .../libs/libepoxy/source/test/glx_static.c | 70 + .../libs/libepoxy/source/test/headerguards.c | 60 + .../libepoxy/source/test/khronos_typedefs.c | 65 + .../libepoxy/source/test/khronos_typedefs.h | 47 + .../source/test/khronos_typedefs_nonepoxy.c | 69 + .../libs/libepoxy/source/test/meson.build | 184 + .../libs/libepoxy/source/test/miscdefines.c | 67 + .../libs/libepoxy/source/test/wgl_common.c | 128 + .../libs/libepoxy/source/test/wgl_common.h | 27 + .../libepoxy/source/test/wgl_core_and_exts.c | 80 + .../source/test/wgl_per_context_funcptrs.c | 165 + .../libepoxy/source/test/wgl_usefontbitmaps.c | 74 + .../libs/libxcvt/source/.gitlab-ci.yml | 112 + .../libxcvt/source/.gitlab-ci/ci.template | 118 + .../libs/libxcvt/source/.gitlab-ci/config.yml | 9 + .../libxcvt/source/.gitlab-ci/meson-build.sh | 48 + local/recipes/libs/libxcvt/source/COPYING | 67 + local/recipes/libs/libxcvt/source/README.md | 36 + local/recipes/libs/libxcvt/source/cvt/cvt.c | 257 + .../libs/libxcvt/source/cvt/meson.build | 10 + .../libxcvt/source/include/libxcvt/libxcvt.h | 46 + .../source/include/libxcvt/libxcvt_mode.h | 56 + .../source/include/libxcvt/meson.build | 1 + .../libs/libxcvt/source/include/meson.build | 1 + .../recipes/libs/libxcvt/source/lib/libxcvt.c | 301 + .../libs/libxcvt/source/lib/meson.build | 6 + local/recipes/libs/libxcvt/source/man/cvt.man | 41 + .../libs/libxcvt/source/man/meson.build | 12 + local/recipes/libs/libxcvt/source/meson.build | 28 + recipes/libs/lcms2 | 1 + recipes/libs/libdisplay-info | 1 + recipes/libs/libepoxy | 1 + recipes/libs/libxcvt | 1 + 430 files changed, 233137 insertions(+) create mode 100644 local/recipes/libs/lcms2/source/.github/dependabot.yml create mode 100644 local/recipes/libs/lcms2/source/.github/workflows/build.yml create mode 100644 local/recipes/libs/lcms2/source/.github/workflows/codeql-analysis.yml create mode 100644 local/recipes/libs/lcms2/source/.github/workflows/scorecard.yml create mode 100644 local/recipes/libs/lcms2/source/.gitignore create mode 100644 local/recipes/libs/lcms2/source/AUTHORS create mode 100644 local/recipes/libs/lcms2/source/CMakeLists.txt create mode 100644 local/recipes/libs/lcms2/source/ChangeLog create mode 100644 local/recipes/libs/lcms2/source/INSTALL create mode 100644 local/recipes/libs/lcms2/source/LICENSE create mode 100644 local/recipes/libs/lcms2/source/Lib/BC/BC.txt create mode 100644 local/recipes/libs/lcms2/source/Lib/MS/MS.TXT create mode 100644 local/recipes/libs/lcms2/source/Makefile.am create mode 100644 local/recipes/libs/lcms2/source/Makefile.in create mode 100644 local/recipes/libs/lcms2/source/Projects/.gitignore create mode 100644 local/recipes/libs/lcms2/source/Projects/BorlandC_5.5/lcms2.rc create mode 100644 local/recipes/libs/lcms2/source/Projects/BorlandC_5.5/lcmsdll.lk create mode 100644 local/recipes/libs/lcms2/source/Projects/BorlandC_5.5/lcmsdll.lst create mode 100644 local/recipes/libs/lcms2/source/Projects/BorlandC_5.5/mklcmsdll.bat create mode 100644 local/recipes/libs/lcms2/source/Projects/Qt/lcms2/lcms2.pro create mode 100644 local/recipes/libs/lcms2/source/Projects/VC2019/jpegicc/jpegicc.vcxproj create mode 100644 local/recipes/libs/lcms2/source/Projects/VC2019/jpegicc/jpegicc.vcxproj.filters create mode 100644 local/recipes/libs/lcms2/source/Projects/VC2019/lcms2.rc create mode 100644 local/recipes/libs/lcms2/source/Projects/VC2019/lcms2.sln create mode 100644 local/recipes/libs/lcms2/source/Projects/VC2019/lcms2_DLL/lcms2_DLL.vcxproj create mode 100644 local/recipes/libs/lcms2/source/Projects/VC2019/lcms2_DLL/lcms2_DLL.vcxproj.filters create mode 100644 local/recipes/libs/lcms2/source/Projects/VC2019/lcms2_static/lcms2_static.vcxproj create mode 100644 local/recipes/libs/lcms2/source/Projects/VC2019/lcms2_static/lcms2_static.vcxproj.filters create mode 100644 local/recipes/libs/lcms2/source/Projects/VC2019/linkicc/linkicc.vcxproj create mode 100644 local/recipes/libs/lcms2/source/Projects/VC2019/linkicc/linkicc.vcxproj.filters create mode 100644 local/recipes/libs/lcms2/source/Projects/VC2019/psicc/psicc.vcxproj create mode 100644 local/recipes/libs/lcms2/source/Projects/VC2019/psicc/psicc.vcxproj.filters create mode 100644 local/recipes/libs/lcms2/source/Projects/VC2019/resource.h create mode 100644 local/recipes/libs/lcms2/source/Projects/VC2019/testbed/testbed.vcxproj create mode 100644 local/recipes/libs/lcms2/source/Projects/VC2019/testbed/testbed.vcxproj.filters create mode 100644 local/recipes/libs/lcms2/source/Projects/VC2019/tiffdiff/tiffdiff.vcxproj create mode 100644 local/recipes/libs/lcms2/source/Projects/VC2019/tiffdiff/tiffdiff.vcxproj.filters create mode 100644 local/recipes/libs/lcms2/source/Projects/VC2019/tifficc/tifficc.vcxproj create mode 100644 local/recipes/libs/lcms2/source/Projects/VC2019/tifficc/tifficc.vcxproj.filters create mode 100644 local/recipes/libs/lcms2/source/Projects/VC2019/transicc/transicc.vcxproj create mode 100644 local/recipes/libs/lcms2/source/Projects/VC2019/transicc/transicc.vcxproj.filters create mode 100644 local/recipes/libs/lcms2/source/Projects/VC2022/fuzzers/fuzzers.vcxproj create mode 100644 local/recipes/libs/lcms2/source/Projects/VC2022/fuzzers/fuzzers.vcxproj.filters create mode 100644 local/recipes/libs/lcms2/source/Projects/VC2022/jpegicc/jpegicc.vcxproj create mode 100644 local/recipes/libs/lcms2/source/Projects/VC2022/jpegicc/jpegicc.vcxproj.filters create mode 100644 local/recipes/libs/lcms2/source/Projects/VC2022/lcms2.rc create mode 100644 local/recipes/libs/lcms2/source/Projects/VC2022/lcms2.sln create mode 100644 local/recipes/libs/lcms2/source/Projects/VC2022/lcms2_DLL/lcms2_DLL.vcxproj create mode 100644 local/recipes/libs/lcms2/source/Projects/VC2022/lcms2_DLL/lcms2_DLL.vcxproj.filters create mode 100644 local/recipes/libs/lcms2/source/Projects/VC2022/lcms2_static/lcms2_static.vcxproj create mode 100644 local/recipes/libs/lcms2/source/Projects/VC2022/lcms2_static/lcms2_static.vcxproj.filters create mode 100644 local/recipes/libs/lcms2/source/Projects/VC2022/linkicc/linkicc.vcxproj create mode 100644 local/recipes/libs/lcms2/source/Projects/VC2022/linkicc/linkicc.vcxproj.filters create mode 100644 local/recipes/libs/lcms2/source/Projects/VC2022/psicc/psicc.vcxproj create mode 100644 local/recipes/libs/lcms2/source/Projects/VC2022/psicc/psicc.vcxproj.filters create mode 100644 local/recipes/libs/lcms2/source/Projects/VC2022/resource.h create mode 100644 local/recipes/libs/lcms2/source/Projects/VC2022/testbed/testbed.vcxproj create mode 100644 local/recipes/libs/lcms2/source/Projects/VC2022/testbed/testbed.vcxproj.filters create mode 100644 local/recipes/libs/lcms2/source/Projects/VC2022/tiffdiff/tiffdiff.vcxproj create mode 100644 local/recipes/libs/lcms2/source/Projects/VC2022/tiffdiff/tiffdiff.vcxproj.filters create mode 100644 local/recipes/libs/lcms2/source/Projects/VC2022/tifficc/tifficc.vcxproj create mode 100644 local/recipes/libs/lcms2/source/Projects/VC2022/tifficc/tifficc.vcxproj.filters create mode 100644 local/recipes/libs/lcms2/source/Projects/VC2022/transicc/transicc.vcxproj create mode 100644 local/recipes/libs/lcms2/source/Projects/VC2022/transicc/transicc.vcxproj.filters create mode 100644 local/recipes/libs/lcms2/source/Projects/VC2026/fuzzers/fuzzers.vcxproj create mode 100644 local/recipes/libs/lcms2/source/Projects/VC2026/fuzzers/fuzzers.vcxproj.filters create mode 100644 local/recipes/libs/lcms2/source/Projects/VC2026/jpegicc/jpegicc.vcxproj create mode 100644 local/recipes/libs/lcms2/source/Projects/VC2026/jpegicc/jpegicc.vcxproj.filters create mode 100644 local/recipes/libs/lcms2/source/Projects/VC2026/lcms2.rc create mode 100644 local/recipes/libs/lcms2/source/Projects/VC2026/lcms2.sln create mode 100644 local/recipes/libs/lcms2/source/Projects/VC2026/lcms2_DLL/lcms2_DLL.vcxproj create mode 100644 local/recipes/libs/lcms2/source/Projects/VC2026/lcms2_DLL/lcms2_DLL.vcxproj.filters create mode 100644 local/recipes/libs/lcms2/source/Projects/VC2026/lcms2_static/lcms2_static.vcxproj create mode 100644 local/recipes/libs/lcms2/source/Projects/VC2026/lcms2_static/lcms2_static.vcxproj.filters create mode 100644 local/recipes/libs/lcms2/source/Projects/VC2026/linkicc/linkicc.vcxproj create mode 100644 local/recipes/libs/lcms2/source/Projects/VC2026/linkicc/linkicc.vcxproj.filters create mode 100644 local/recipes/libs/lcms2/source/Projects/VC2026/psicc/psicc.vcxproj create mode 100644 local/recipes/libs/lcms2/source/Projects/VC2026/psicc/psicc.vcxproj.filters create mode 100644 local/recipes/libs/lcms2/source/Projects/VC2026/resource.h create mode 100644 local/recipes/libs/lcms2/source/Projects/VC2026/testbed/testbed.vcxproj create mode 100644 local/recipes/libs/lcms2/source/Projects/VC2026/testbed/testbed.vcxproj.filters create mode 100644 local/recipes/libs/lcms2/source/Projects/VC2026/tiffdiff/tiffdiff.vcxproj create mode 100644 local/recipes/libs/lcms2/source/Projects/VC2026/tiffdiff/tiffdiff.vcxproj.filters create mode 100644 local/recipes/libs/lcms2/source/Projects/VC2026/tifficc/tifficc.vcxproj create mode 100644 local/recipes/libs/lcms2/source/Projects/VC2026/tifficc/tifficc.vcxproj.filters create mode 100644 local/recipes/libs/lcms2/source/Projects/VC2026/transicc/transicc.vcxproj create mode 100644 local/recipes/libs/lcms2/source/Projects/VC2026/transicc/transicc.vcxproj.filters create mode 100644 local/recipes/libs/lcms2/source/Projects/Xcode_12/lcms2/lcms2.xcodeproj/project.pbxproj create mode 100644 local/recipes/libs/lcms2/source/Projects/Xcode_12/lcms2/lcms2.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 local/recipes/libs/lcms2/source/Projects/Xcode_12/lcms2/lcms2.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 local/recipes/libs/lcms2/source/Projects/Xcode_12/lcms2/lcms2.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 local/recipes/libs/lcms2/source/Projects/Xcode_14/lcms2/lcms2.xcodeproj/project.pbxproj create mode 100644 local/recipes/libs/lcms2/source/Projects/Xcode_14/lcms2/lcms2.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 local/recipes/libs/lcms2/source/Projects/Xcode_14/lcms2/lcms2.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 local/recipes/libs/lcms2/source/Projects/Xcode_14/lcms2/lcms2.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 local/recipes/libs/lcms2/source/Projects/Xcode_26/lcms2/lcms2.xcodeproj/project.pbxproj create mode 100644 local/recipes/libs/lcms2/source/Projects/Xcode_26/lcms2/lcms2.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 local/recipes/libs/lcms2/source/Projects/Xcode_26/lcms2/lcms2.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 local/recipes/libs/lcms2/source/Projects/Xcode_26/lcms2/lcms2.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100755 local/recipes/libs/lcms2/source/Projects/cppcheck/lcms2.cppcheck create mode 100644 local/recipes/libs/lcms2/source/README.md create mode 100644 local/recipes/libs/lcms2/source/SECURITY.md create mode 100644 local/recipes/libs/lcms2/source/aclocal.m4 create mode 100755 local/recipes/libs/lcms2/source/autogen.sh create mode 100644 local/recipes/libs/lcms2/source/cmake/Lcms2Features.cmake create mode 100644 local/recipes/libs/lcms2/source/cmake/Lcms2Library.cmake create mode 100644 local/recipes/libs/lcms2/source/cmake/Lcms2Options.cmake create mode 100644 local/recipes/libs/lcms2/source/cmake/Lcms2Packaging.cmake create mode 100644 local/recipes/libs/lcms2/source/cmake/Lcms2Plugins.cmake create mode 100644 local/recipes/libs/lcms2/source/cmake/Lcms2Tests.cmake create mode 100644 local/recipes/libs/lcms2/source/cmake/Lcms2Tools.cmake create mode 100644 local/recipes/libs/lcms2/source/cmake/lcms2-config.cmake.in create mode 100755 local/recipes/libs/lcms2/source/compile create mode 100755 local/recipes/libs/lcms2/source/config.guess create mode 100755 local/recipes/libs/lcms2/source/config.sub create mode 100755 local/recipes/libs/lcms2/source/configure create mode 100644 local/recipes/libs/lcms2/source/configure.ac create mode 100755 local/recipes/libs/lcms2/source/depcomp create mode 100644 local/recipes/libs/lcms2/source/doc/LittleCMS2.19 API.pdf create mode 100644 local/recipes/libs/lcms2/source/doc/LittleCMS2.19 Plugin API.pdf create mode 100644 local/recipes/libs/lcms2/source/doc/LittleCMS2.19 tutorial.pdf create mode 100644 local/recipes/libs/lcms2/source/doc/logo-small.png create mode 100644 local/recipes/libs/lcms2/source/fuzzers/corpus/alltags.icc create mode 100644 local/recipes/libs/lcms2/source/fuzzers/fuzzers.c create mode 100644 local/recipes/libs/lcms2/source/fuzzers/fuzzers.exp create mode 100644 local/recipes/libs/lcms2/source/include/Makefile.am create mode 100644 local/recipes/libs/lcms2/source/include/Makefile.in create mode 100644 local/recipes/libs/lcms2/source/include/lcms2.h create mode 100644 local/recipes/libs/lcms2/source/include/lcms2_plugin.h create mode 100644 local/recipes/libs/lcms2/source/include/meson.build create mode 100755 local/recipes/libs/lcms2/source/install-sh create mode 100644 local/recipes/libs/lcms2/source/lcms2.pc.in create mode 100644 local/recipes/libs/lcms2/source/ltmain.sh create mode 100644 local/recipes/libs/lcms2/source/m4/ax_append_compile_flags.m4 create mode 100644 local/recipes/libs/lcms2/source/m4/ax_append_flag.m4 create mode 100644 local/recipes/libs/lcms2/source/m4/ax_check_compile_flag.m4 create mode 100644 local/recipes/libs/lcms2/source/m4/ax_gcc_func_attribute.m4 create mode 100644 local/recipes/libs/lcms2/source/m4/ax_pthread.m4 create mode 100644 local/recipes/libs/lcms2/source/m4/ax_require_defined.m4 create mode 100644 local/recipes/libs/lcms2/source/m4/libtool.m4 create mode 100644 local/recipes/libs/lcms2/source/m4/ltoptions.m4 create mode 100644 local/recipes/libs/lcms2/source/m4/ltsugar.m4 create mode 100644 local/recipes/libs/lcms2/source/m4/ltversion.m4 create mode 100644 local/recipes/libs/lcms2/source/m4/lt~obsolete.m4 create mode 100644 local/recipes/libs/lcms2/source/meson.build create mode 100644 local/recipes/libs/lcms2/source/meson_options.txt create mode 100755 local/recipes/libs/lcms2/source/missing create mode 100644 local/recipes/libs/lcms2/source/plugins/Makefile create mode 100644 local/recipes/libs/lcms2/source/plugins/Makefile.am create mode 100644 local/recipes/libs/lcms2/source/plugins/Makefile.in create mode 100644 local/recipes/libs/lcms2/source/plugins/README.1ST create mode 100644 local/recipes/libs/lcms2/source/plugins/fast_float/COPYING.GPL3 create mode 100644 local/recipes/libs/lcms2/source/plugins/fast_float/Makefile.am create mode 100644 local/recipes/libs/lcms2/source/plugins/fast_float/Makefile.in create mode 100644 local/recipes/libs/lcms2/source/plugins/fast_float/Projects/VC2019/lcms2_fast_float_plugin.vcxproj create mode 100644 local/recipes/libs/lcms2/source/plugins/fast_float/Projects/VC2019/lcms2_fast_float_plugin.vcxproj.filters create mode 100644 local/recipes/libs/lcms2/source/plugins/fast_float/Projects/VC2019/lcms2_fast_float_plugin_testbed.vcxproj create mode 100644 local/recipes/libs/lcms2/source/plugins/fast_float/Projects/VC2019/lcms2_fast_float_plugin_testbed.vcxproj.filters create mode 100644 local/recipes/libs/lcms2/source/plugins/fast_float/Projects/VC2022/lcms2_fast_float_plugin.vcxproj create mode 100644 local/recipes/libs/lcms2/source/plugins/fast_float/Projects/VC2022/lcms2_fast_float_plugin.vcxproj.filters create mode 100644 local/recipes/libs/lcms2/source/plugins/fast_float/Projects/VC2022/lcms2_fast_float_plugin_testbed.vcxproj create mode 100644 local/recipes/libs/lcms2/source/plugins/fast_float/Projects/VC2022/lcms2_fast_float_plugin_testbed.vcxproj.filters create mode 100644 local/recipes/libs/lcms2/source/plugins/fast_float/Projects/VC2026/lcms2_fast_float_plugin.vcxproj create mode 100644 local/recipes/libs/lcms2/source/plugins/fast_float/Projects/VC2026/lcms2_fast_float_plugin.vcxproj.filters create mode 100644 local/recipes/libs/lcms2/source/plugins/fast_float/Projects/VC2026/lcms2_fast_float_plugin_testbed.vcxproj create mode 100644 local/recipes/libs/lcms2/source/plugins/fast_float/Projects/VC2026/lcms2_fast_float_plugin_testbed.vcxproj.filters create mode 100644 local/recipes/libs/lcms2/source/plugins/fast_float/doc/LittleCMS floating point extensions 1.7.pdf create mode 100644 local/recipes/libs/lcms2/source/plugins/fast_float/include/Makefile.am create mode 100644 local/recipes/libs/lcms2/source/plugins/fast_float/include/Makefile.in create mode 100644 local/recipes/libs/lcms2/source/plugins/fast_float/include/lcms2_fast_float.h create mode 100644 local/recipes/libs/lcms2/source/plugins/fast_float/include/meson.build create mode 100644 local/recipes/libs/lcms2/source/plugins/fast_float/meson.build create mode 100644 local/recipes/libs/lcms2/source/plugins/fast_float/src/Makefile.am create mode 100644 local/recipes/libs/lcms2/source/plugins/fast_float/src/Makefile.in create mode 100644 local/recipes/libs/lcms2/source/plugins/fast_float/src/fast_16_tethra.c create mode 100644 local/recipes/libs/lcms2/source/plugins/fast_float/src/fast_8_curves.c create mode 100644 local/recipes/libs/lcms2/source/plugins/fast_float/src/fast_8_matsh.c create mode 100644 local/recipes/libs/lcms2/source/plugins/fast_float/src/fast_8_matsh_sse.c create mode 100644 local/recipes/libs/lcms2/source/plugins/fast_float/src/fast_8_tethra.c create mode 100644 local/recipes/libs/lcms2/source/plugins/fast_float/src/fast_float_15bits.c create mode 100644 local/recipes/libs/lcms2/source/plugins/fast_float/src/fast_float_15mats.c create mode 100644 local/recipes/libs/lcms2/source/plugins/fast_float/src/fast_float_cmyk.c create mode 100644 local/recipes/libs/lcms2/source/plugins/fast_float/src/fast_float_curves.c create mode 100644 local/recipes/libs/lcms2/source/plugins/fast_float/src/fast_float_internal.h create mode 100644 local/recipes/libs/lcms2/source/plugins/fast_float/src/fast_float_lab.c create mode 100644 local/recipes/libs/lcms2/source/plugins/fast_float/src/fast_float_matsh.c create mode 100644 local/recipes/libs/lcms2/source/plugins/fast_float/src/fast_float_separate.c create mode 100644 local/recipes/libs/lcms2/source/plugins/fast_float/src/fast_float_sup.c create mode 100644 local/recipes/libs/lcms2/source/plugins/fast_float/src/fast_float_tethra.c create mode 100644 local/recipes/libs/lcms2/source/plugins/fast_float/src/lcms2_fast_float.rc.in create mode 100644 local/recipes/libs/lcms2/source/plugins/fast_float/src/meson.build create mode 100644 local/recipes/libs/lcms2/source/plugins/fast_float/testbed/Makefile.am create mode 100644 local/recipes/libs/lcms2/source/plugins/fast_float/testbed/Makefile.in create mode 100644 local/recipes/libs/lcms2/source/plugins/fast_float/testbed/demo_cmyk.c create mode 100644 local/recipes/libs/lcms2/source/plugins/fast_float/testbed/fast_float_testbed.c create mode 100644 local/recipes/libs/lcms2/source/plugins/fast_float/testbed/meson.build create mode 100644 local/recipes/libs/lcms2/source/plugins/meson.build create mode 100644 local/recipes/libs/lcms2/source/plugins/test_profiles/meson.build create mode 100644 local/recipes/libs/lcms2/source/plugins/test_profiles/test0.icc create mode 100644 local/recipes/libs/lcms2/source/plugins/test_profiles/test1.icc create mode 100644 local/recipes/libs/lcms2/source/plugins/test_profiles/test2.icc create mode 100644 local/recipes/libs/lcms2/source/plugins/test_profiles/test3.icc create mode 100644 local/recipes/libs/lcms2/source/plugins/test_profiles/test5.icc create mode 100644 local/recipes/libs/lcms2/source/plugins/threaded/COPYING.GPL3 create mode 100644 local/recipes/libs/lcms2/source/plugins/threaded/Makefile.am create mode 100644 local/recipes/libs/lcms2/source/plugins/threaded/Makefile.in create mode 100644 local/recipes/libs/lcms2/source/plugins/threaded/Projects/VC2022/lcms2_threaded_plugin.vcxproj create mode 100644 local/recipes/libs/lcms2/source/plugins/threaded/Projects/VC2022/lcms2_threaded_plugin.vcxproj.filters create mode 100644 local/recipes/libs/lcms2/source/plugins/threaded/Projects/VC2022/lcms2_threaded_plugin_testbed.vcxproj create mode 100644 local/recipes/libs/lcms2/source/plugins/threaded/Projects/VC2022/lcms2_threaded_plugin_testbed.vcxproj.filters create mode 100644 local/recipes/libs/lcms2/source/plugins/threaded/Projects/VC2026/lcms2_threaded_plugin.vcxproj create mode 100644 local/recipes/libs/lcms2/source/plugins/threaded/Projects/VC2026/lcms2_threaded_plugin.vcxproj.filters create mode 100644 local/recipes/libs/lcms2/source/plugins/threaded/Projects/VC2026/lcms2_threaded_plugin_testbed.vcxproj create mode 100644 local/recipes/libs/lcms2/source/plugins/threaded/Projects/VC2026/lcms2_threaded_plugin_testbed.vcxproj.filters create mode 100644 local/recipes/libs/lcms2/source/plugins/threaded/doc/LittleCMS threaded extensions 1.0.pdf create mode 100644 local/recipes/libs/lcms2/source/plugins/threaded/include/Makefile.am create mode 100644 local/recipes/libs/lcms2/source/plugins/threaded/include/Makefile.in create mode 100644 local/recipes/libs/lcms2/source/plugins/threaded/include/lcms2_threaded.h create mode 100644 local/recipes/libs/lcms2/source/plugins/threaded/include/meson.build create mode 100644 local/recipes/libs/lcms2/source/plugins/threaded/meson.build create mode 100644 local/recipes/libs/lcms2/source/plugins/threaded/src/Makefile.am create mode 100644 local/recipes/libs/lcms2/source/plugins/threaded/src/Makefile.in create mode 100644 local/recipes/libs/lcms2/source/plugins/threaded/src/lcms2_threaded.rc.in create mode 100644 local/recipes/libs/lcms2/source/plugins/threaded/src/meson.build create mode 100644 local/recipes/libs/lcms2/source/plugins/threaded/src/threaded_core.c create mode 100644 local/recipes/libs/lcms2/source/plugins/threaded/src/threaded_internal.h create mode 100644 local/recipes/libs/lcms2/source/plugins/threaded/src/threaded_main.c create mode 100644 local/recipes/libs/lcms2/source/plugins/threaded/src/threaded_scheduler.c create mode 100644 local/recipes/libs/lcms2/source/plugins/threaded/src/threaded_split.c create mode 100644 local/recipes/libs/lcms2/source/plugins/threaded/testbed/Makefile.am create mode 100644 local/recipes/libs/lcms2/source/plugins/threaded/testbed/Makefile.in create mode 100644 local/recipes/libs/lcms2/source/plugins/threaded/testbed/meson.build create mode 100644 local/recipes/libs/lcms2/source/plugins/threaded/testbed/threaded_testbed.c create mode 100644 local/recipes/libs/lcms2/source/src/Makefile.am create mode 100644 local/recipes/libs/lcms2/source/src/Makefile.in create mode 100644 local/recipes/libs/lcms2/source/src/cmsalpha.c create mode 100644 local/recipes/libs/lcms2/source/src/cmscam02.c create mode 100644 local/recipes/libs/lcms2/source/src/cmscgats.c create mode 100644 local/recipes/libs/lcms2/source/src/cmscnvrt.c create mode 100644 local/recipes/libs/lcms2/source/src/cmserr.c create mode 100644 local/recipes/libs/lcms2/source/src/cmsgamma.c create mode 100644 local/recipes/libs/lcms2/source/src/cmsgmt.c create mode 100644 local/recipes/libs/lcms2/source/src/cmshalf.c create mode 100644 local/recipes/libs/lcms2/source/src/cmsintrp.c create mode 100644 local/recipes/libs/lcms2/source/src/cmsio0.c create mode 100644 local/recipes/libs/lcms2/source/src/cmsio1.c create mode 100644 local/recipes/libs/lcms2/source/src/cmslut.c create mode 100644 local/recipes/libs/lcms2/source/src/cmsmd5.c create mode 100644 local/recipes/libs/lcms2/source/src/cmsmtrx.c create mode 100644 local/recipes/libs/lcms2/source/src/cmsnamed.c create mode 100644 local/recipes/libs/lcms2/source/src/cmsopt.c create mode 100644 local/recipes/libs/lcms2/source/src/cmspack.c create mode 100644 local/recipes/libs/lcms2/source/src/cmspcs.c create mode 100644 local/recipes/libs/lcms2/source/src/cmsplugin.c create mode 100644 local/recipes/libs/lcms2/source/src/cmsps2.c create mode 100644 local/recipes/libs/lcms2/source/src/cmssamp.c create mode 100644 local/recipes/libs/lcms2/source/src/cmssm.c create mode 100644 local/recipes/libs/lcms2/source/src/cmstypes.c create mode 100644 local/recipes/libs/lcms2/source/src/cmsvirt.c create mode 100644 local/recipes/libs/lcms2/source/src/cmswtpnt.c create mode 100644 local/recipes/libs/lcms2/source/src/cmsxform.c create mode 100644 local/recipes/libs/lcms2/source/src/lcms2.def create mode 100644 local/recipes/libs/lcms2/source/src/lcms2.rc.in create mode 100644 local/recipes/libs/lcms2/source/src/lcms2_internal.h create mode 100644 local/recipes/libs/lcms2/source/src/meson.build create mode 100644 local/recipes/libs/lcms2/source/testbed/Makefile.am create mode 100644 local/recipes/libs/lcms2/source/testbed/Makefile.in create mode 100644 local/recipes/libs/lcms2/source/testbed/alpha_test.c create mode 100644 local/recipes/libs/lcms2/source/testbed/bad.icc create mode 100644 local/recipes/libs/lcms2/source/testbed/bad_mpe.icc create mode 100644 local/recipes/libs/lcms2/source/testbed/crayons.icc create mode 100755 local/recipes/libs/lcms2/source/testbed/ibm-t61.icc create mode 100644 local/recipes/libs/lcms2/source/testbed/meson.build create mode 100644 local/recipes/libs/lcms2/source/testbed/new.icc create mode 100755 local/recipes/libs/lcms2/source/testbed/test1.icc create mode 100755 local/recipes/libs/lcms2/source/testbed/test2.icc create mode 100755 local/recipes/libs/lcms2/source/testbed/test3.icc create mode 100755 local/recipes/libs/lcms2/source/testbed/test4.icc create mode 100755 local/recipes/libs/lcms2/source/testbed/test5.icc create mode 100644 local/recipes/libs/lcms2/source/testbed/testcms2.c create mode 100755 local/recipes/libs/lcms2/source/testbed/testcms2.h create mode 100755 local/recipes/libs/lcms2/source/testbed/testplugin.c create mode 100644 local/recipes/libs/lcms2/source/testbed/testthread.cpp create mode 100755 local/recipes/libs/lcms2/source/testbed/toosmall.icc create mode 100755 local/recipes/libs/lcms2/source/testbed/zoo_icc.c create mode 100644 local/recipes/libs/lcms2/source/utils/common/meson.build create mode 100644 local/recipes/libs/lcms2/source/utils/common/utils.h create mode 100644 local/recipes/libs/lcms2/source/utils/common/vprf.c create mode 100644 local/recipes/libs/lcms2/source/utils/common/xgetopt.c create mode 100644 local/recipes/libs/lcms2/source/utils/delphi/delphidemo.dpr create mode 100644 local/recipes/libs/lcms2/source/utils/delphi/delphidemo.dproj create mode 100755 local/recipes/libs/lcms2/source/utils/delphi/delphidemo.res create mode 100755 local/recipes/libs/lcms2/source/utils/delphi/demo1.dfm create mode 100644 local/recipes/libs/lcms2/source/utils/delphi/demo1.pas create mode 100644 local/recipes/libs/lcms2/source/utils/delphi/lcms2dll.pas create mode 100755 local/recipes/libs/lcms2/source/utils/jpgicc/LICENSE_iccjpeg create mode 100644 local/recipes/libs/lcms2/source/utils/jpgicc/Makefile.am create mode 100644 local/recipes/libs/lcms2/source/utils/jpgicc/Makefile.in create mode 100644 local/recipes/libs/lcms2/source/utils/jpgicc/iccjpeg.c create mode 100644 local/recipes/libs/lcms2/source/utils/jpgicc/iccjpeg.h create mode 100644 local/recipes/libs/lcms2/source/utils/jpgicc/jpgicc.1 create mode 100644 local/recipes/libs/lcms2/source/utils/jpgicc/jpgicc.c create mode 100644 local/recipes/libs/lcms2/source/utils/jpgicc/meson.build create mode 100644 local/recipes/libs/lcms2/source/utils/linkicc/Makefile.am create mode 100644 local/recipes/libs/lcms2/source/utils/linkicc/Makefile.in create mode 100644 local/recipes/libs/lcms2/source/utils/linkicc/linkicc.1 create mode 100644 local/recipes/libs/lcms2/source/utils/linkicc/linkicc.c create mode 100644 local/recipes/libs/lcms2/source/utils/linkicc/meson.build create mode 100644 local/recipes/libs/lcms2/source/utils/matlab/howto.txt create mode 100644 local/recipes/libs/lcms2/source/utils/matlab/icctrans.c create mode 100644 local/recipes/libs/lcms2/source/utils/matlab/lcms_rsp create mode 100644 local/recipes/libs/lcms2/source/utils/meson.build create mode 100644 local/recipes/libs/lcms2/source/utils/psicc/Makefile.am create mode 100644 local/recipes/libs/lcms2/source/utils/psicc/Makefile.in create mode 100644 local/recipes/libs/lcms2/source/utils/psicc/meson.build create mode 100644 local/recipes/libs/lcms2/source/utils/psicc/psicc.1 create mode 100644 local/recipes/libs/lcms2/source/utils/psicc/psicc.c create mode 100644 local/recipes/libs/lcms2/source/utils/samples/Makefile.am create mode 100644 local/recipes/libs/lcms2/source/utils/samples/Makefile.in create mode 100644 local/recipes/libs/lcms2/source/utils/samples/itufax.c create mode 100644 local/recipes/libs/lcms2/source/utils/samples/mkcmy.c create mode 100644 local/recipes/libs/lcms2/source/utils/samples/mkgrayer.c create mode 100644 local/recipes/libs/lcms2/source/utils/samples/mktiff8.c create mode 100644 local/recipes/libs/lcms2/source/utils/samples/roundtrip.c create mode 100644 local/recipes/libs/lcms2/source/utils/samples/vericc.c create mode 100644 local/recipes/libs/lcms2/source/utils/samples/wtpt.1 create mode 100644 local/recipes/libs/lcms2/source/utils/samples/wtpt.c create mode 100644 local/recipes/libs/lcms2/source/utils/tificc/Makefile.am create mode 100644 local/recipes/libs/lcms2/source/utils/tificc/Makefile.in create mode 100644 local/recipes/libs/lcms2/source/utils/tificc/meson.build create mode 100644 local/recipes/libs/lcms2/source/utils/tificc/tifdiff.c create mode 100644 local/recipes/libs/lcms2/source/utils/tificc/tificc.1 create mode 100644 local/recipes/libs/lcms2/source/utils/tificc/tificc.c create mode 100644 local/recipes/libs/lcms2/source/utils/transicc/Makefile.am create mode 100644 local/recipes/libs/lcms2/source/utils/transicc/Makefile.in create mode 100644 local/recipes/libs/lcms2/source/utils/transicc/meson.build create mode 100644 local/recipes/libs/lcms2/source/utils/transicc/transicc.1 create mode 100644 local/recipes/libs/lcms2/source/utils/transicc/transicc.c create mode 100644 local/recipes/libs/libdisplay-info/source/di.c create mode 100644 local/recipes/libs/libdisplay-info/source/include/libdisplay-info/cta.h create mode 100644 local/recipes/libs/libdisplay-info/source/include/libdisplay-info/displayid.h create mode 100644 local/recipes/libs/libdisplay-info/source/include/libdisplay-info/edid.h create mode 100644 local/recipes/libs/libdisplay-info/source/include/libdisplay-info/info.h create mode 100644 local/recipes/libs/libepoxy/source/.dir-locals.el create mode 100644 local/recipes/libs/libepoxy/source/.editorconfig create mode 100755 local/recipes/libs/libepoxy/source/.github/scripts/epoxy-ci-linux.sh create mode 100755 local/recipes/libs/libepoxy/source/.github/scripts/epoxy-ci-osx.sh create mode 100644 local/recipes/libs/libepoxy/source/.github/workflows/linux.yml create mode 100644 local/recipes/libs/libepoxy/source/.github/workflows/macos.yml create mode 100644 local/recipes/libs/libepoxy/source/.github/workflows/msvc-env.yml create mode 100644 local/recipes/libs/libepoxy/source/.github/workflows/msys2.yml create mode 100644 local/recipes/libs/libepoxy/source/.gitignore create mode 100644 local/recipes/libs/libepoxy/source/COPYING create mode 100644 local/recipes/libs/libepoxy/source/README.md create mode 100644 local/recipes/libs/libepoxy/source/cross/fedora-mingw64.txt create mode 100644 local/recipes/libs/libepoxy/source/doc/Doxyfile.in create mode 100644 local/recipes/libs/libepoxy/source/doc/meson.build create mode 100644 local/recipes/libs/libepoxy/source/include/epoxy/common.h create mode 100644 local/recipes/libs/libepoxy/source/include/epoxy/egl.h create mode 100644 local/recipes/libs/libepoxy/source/include/epoxy/gl.h create mode 100644 local/recipes/libs/libepoxy/source/include/epoxy/glx.h create mode 100644 local/recipes/libs/libepoxy/source/include/epoxy/meson.build create mode 100644 local/recipes/libs/libepoxy/source/include/epoxy/wgl.h create mode 100644 local/recipes/libs/libepoxy/source/meson.build create mode 100644 local/recipes/libs/libepoxy/source/meson_options.txt create mode 100644 local/recipes/libs/libepoxy/source/registry/README.md create mode 100644 local/recipes/libs/libepoxy/source/registry/egl.xml create mode 100644 local/recipes/libs/libepoxy/source/registry/gl.xml create mode 100644 local/recipes/libs/libepoxy/source/registry/glx.xml create mode 100644 local/recipes/libs/libepoxy/source/registry/wgl.xml create mode 100644 local/recipes/libs/libepoxy/source/src/dispatch_common.c create mode 100644 local/recipes/libs/libepoxy/source/src/dispatch_common.h create mode 100644 local/recipes/libs/libepoxy/source/src/dispatch_egl.c create mode 100644 local/recipes/libs/libepoxy/source/src/dispatch_glx.c create mode 100644 local/recipes/libs/libepoxy/source/src/dispatch_wgl.c create mode 100755 local/recipes/libs/libepoxy/source/src/gen_dispatch.py create mode 100644 local/recipes/libs/libepoxy/source/src/meson.build create mode 100644 local/recipes/libs/libepoxy/source/test/cgl_core.c create mode 100644 local/recipes/libs/libepoxy/source/test/cgl_epoxy_api.c create mode 100644 local/recipes/libs/libepoxy/source/test/dlwrap.c create mode 100644 local/recipes/libs/libepoxy/source/test/dlwrap.h create mode 100644 local/recipes/libs/libepoxy/source/test/egl_common.c create mode 100644 local/recipes/libs/libepoxy/source/test/egl_common.h create mode 100644 local/recipes/libs/libepoxy/source/test/egl_epoxy_api.c create mode 100644 local/recipes/libs/libepoxy/source/test/egl_gl.c create mode 100644 local/recipes/libs/libepoxy/source/test/egl_has_extension_nocontext.c create mode 100644 local/recipes/libs/libepoxy/source/test/egl_without_glx.c create mode 100644 local/recipes/libs/libepoxy/source/test/gl_version.c create mode 100644 local/recipes/libs/libepoxy/source/test/glx_alias_prefer_same_name.c create mode 100644 local/recipes/libs/libepoxy/source/test/glx_beginend.c create mode 100644 local/recipes/libs/libepoxy/source/test/glx_common.c create mode 100644 local/recipes/libs/libepoxy/source/test/glx_common.h create mode 100644 local/recipes/libs/libepoxy/source/test/glx_gles2.c create mode 100644 local/recipes/libs/libepoxy/source/test/glx_glxgetprocaddress_nocontext.c create mode 100644 local/recipes/libs/libepoxy/source/test/glx_has_extension_nocontext.c create mode 100644 local/recipes/libs/libepoxy/source/test/glx_public_api.c create mode 100644 local/recipes/libs/libepoxy/source/test/glx_public_api_core.c create mode 100644 local/recipes/libs/libepoxy/source/test/glx_static.c create mode 100644 local/recipes/libs/libepoxy/source/test/headerguards.c create mode 100644 local/recipes/libs/libepoxy/source/test/khronos_typedefs.c create mode 100644 local/recipes/libs/libepoxy/source/test/khronos_typedefs.h create mode 100644 local/recipes/libs/libepoxy/source/test/khronos_typedefs_nonepoxy.c create mode 100644 local/recipes/libs/libepoxy/source/test/meson.build create mode 100644 local/recipes/libs/libepoxy/source/test/miscdefines.c create mode 100644 local/recipes/libs/libepoxy/source/test/wgl_common.c create mode 100644 local/recipes/libs/libepoxy/source/test/wgl_common.h create mode 100644 local/recipes/libs/libepoxy/source/test/wgl_core_and_exts.c create mode 100644 local/recipes/libs/libepoxy/source/test/wgl_per_context_funcptrs.c create mode 100644 local/recipes/libs/libepoxy/source/test/wgl_usefontbitmaps.c create mode 100644 local/recipes/libs/libxcvt/source/.gitlab-ci.yml create mode 100644 local/recipes/libs/libxcvt/source/.gitlab-ci/ci.template create mode 100644 local/recipes/libs/libxcvt/source/.gitlab-ci/config.yml create mode 100755 local/recipes/libs/libxcvt/source/.gitlab-ci/meson-build.sh create mode 100644 local/recipes/libs/libxcvt/source/COPYING create mode 100644 local/recipes/libs/libxcvt/source/README.md create mode 100644 local/recipes/libs/libxcvt/source/cvt/cvt.c create mode 100644 local/recipes/libs/libxcvt/source/cvt/meson.build create mode 100644 local/recipes/libs/libxcvt/source/include/libxcvt/libxcvt.h create mode 100644 local/recipes/libs/libxcvt/source/include/libxcvt/libxcvt_mode.h create mode 100644 local/recipes/libs/libxcvt/source/include/libxcvt/meson.build create mode 100644 local/recipes/libs/libxcvt/source/include/meson.build create mode 100644 local/recipes/libs/libxcvt/source/lib/libxcvt.c create mode 100644 local/recipes/libs/libxcvt/source/lib/meson.build create mode 100644 local/recipes/libs/libxcvt/source/man/cvt.man create mode 100644 local/recipes/libs/libxcvt/source/man/meson.build create mode 100644 local/recipes/libs/libxcvt/source/meson.build create mode 120000 recipes/libs/lcms2 create mode 120000 recipes/libs/libdisplay-info create mode 120000 recipes/libs/libepoxy create mode 120000 recipes/libs/libxcvt diff --git a/local/recipes/libs/lcms2/source/.github/dependabot.yml b/local/recipes/libs/lcms2/source/.github/dependabot.yml new file mode 100644 index 0000000000..2390d8c809 --- /dev/null +++ b/local/recipes/libs/lcms2/source/.github/dependabot.yml @@ -0,0 +1,10 @@ +version: 2 +updates: + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "monthly" + groups: + github-actions: + patterns: + - "*" diff --git a/local/recipes/libs/lcms2/source/.github/workflows/build.yml b/local/recipes/libs/lcms2/source/.github/workflows/build.yml new file mode 100644 index 0000000000..1852c8a952 --- /dev/null +++ b/local/recipes/libs/lcms2/source/.github/workflows/build.yml @@ -0,0 +1,240 @@ +name: Build + +on: [push, pull_request] + +concurrency: + group: ${{ github.workflow }}-${{ github.job }}-${{ github.ref }} + cancel-in-progress: true + +permissions: read-all + +jobs: + + Ubuntu: + strategy: + matrix: + runner: [ ubuntu-latest ] + runs-on: ${{ matrix.runner }} + steps: + - uses: actions/checkout@v6.0.2 + - name: Build Ubuntu + run: | + ./configure --with-fastfloat --with-threaded + make + make check + + macOS: + strategy: + matrix: + runner: [ macos-14, macos-latest ] + runs-on: ${{ matrix.runner }} + steps: + - uses: actions/checkout@v6.0.2 + - name: Build macOS + run: | + ./configure --with-fastfloat --with-threaded + make + make check + + Windows: + strategy: + matrix: + include: + - arch: win32 + runner: windows-latest + - arch: x64 + runner: windows-latest + # - arch: arm64 + # runner: windows-11-arm + + runs-on: ${{ matrix.runner }} + steps: + - name: Checkout Repository + uses: actions/checkout@v6.0.2 + + - name: Setup MSVC Build Environment + uses: ilammy/msvc-dev-cmd@v1 + with: + arch: ${{ matrix.arch }} + + - name: Build Windows + run: devenv .\Projects\VC2019\lcms2.sln /Rebuild "Release|${{ matrix.arch }}" /Project testbed + + - name: Run tests + run: testbed\testbed.exe --chdir testbed + + Ubuntu-meson: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6.0.2 + + - name: Install packages + run: | + sudo apt-get -y install build-essential python3-pip ninja-build + pip install meson==0.52.0 + + - name: Build Ubuntu + run: | + meson setup build -Dfastfloat=true -Dthreaded=true + cd build + ninja + meson test + + VisualStudio-meson: + runs-on: windows-latest + + steps: + - uses: actions/checkout@v6.0.2 + + - name: Install packages + run: | + pip install meson==0.52.0 + + - uses: ilammy/msvc-dev-cmd@v1 + - name: Build Windows + run: | + meson setup build + cd build + ninja + meson test + + Ubuntu-cmake: + strategy: + matrix: + runner: [ ubuntu-latest ] + runs-on: ${{ matrix.runner }} + steps: + - uses: actions/checkout@v6.0.2 + + - name: Install packages + run: sudo apt-get -y install build-essential cmake ninja-build + + - name: Configure + run: | + cmake -B build \ + -G Ninja \ + -DCMAKE_BUILD_TYPE=Release \ + -DLCMS2_WITH_FASTFLOAT=ON \ + -DLCMS2_WITH_THREADS=ON \ + -DLCMS2_BUILD_TESTS=ON + + - name: Build + run: cmake --build build --parallel + + - name: Run tests + run: ctest --test-dir build --output-on-failure + + macOS-cmake: + strategy: + matrix: + runner: [ macos-14, macos-latest ] + runs-on: ${{ matrix.runner }} + steps: + - uses: actions/checkout@v6.0.2 + + - name: Configure + run: | + cmake -B build \ + -G Ninja \ + -DCMAKE_BUILD_TYPE=Release \ + -DLCMS2_WITH_FASTFLOAT=ON \ + -DLCMS2_WITH_THREADS=ON \ + -DLCMS2_BUILD_TESTS=ON + + - name: Build + run: cmake --build build --parallel + + - name: Run tests + run: ctest --test-dir build --output-on-failure + + Windows-cmake: + strategy: + matrix: + include: + - arch: Win32 + runner: windows-latest + - arch: x64 + runner: windows-latest + # - arch: ARM64 + # runner: windows-11-arm + + runs-on: ${{ matrix.runner }} + steps: + - name: Checkout Repository + uses: actions/checkout@v6.0.2 + + - name: Configure + run: | + cmake -B build -A ${{ matrix.arch }} ` + -DLCMS2_WITH_FASTFLOAT=ON ` + -DLCMS2_WITH_THREADS=ON ` + -DLCMS2_BUILD_TESTS=ON + + - name: Build + run: cmake --build build --config Release --parallel + + - name: Run tests + run: ctest --test-dir build -C Release --output-on-failure + + MSYS2-cmake: + strategy: + matrix: + sys: [ MINGW64, UCRT64 ] + runs-on: windows-latest + defaults: + run: + shell: msys2 {0} + steps: + - uses: actions/checkout@v6.0.2 + + - uses: msys2/setup-msys2@v2 + with: + msystem: ${{ matrix.sys }} + update: true + pacboy: cmake:p gcc:p ninja:p + + - name: Configure + run: | + cmake -B build \ + -G Ninja \ + -DCMAKE_BUILD_TYPE=Release \ + -DLCMS2_WITH_FASTFLOAT=ON \ + -DLCMS2_WITH_THREADS=ON \ + -DLCMS2_BUILD_TESTS=ON + + - name: Build + run: cmake --build build --parallel + + - name: Run tests + run: ctest --test-dir build --output-on-failure + + Cygwin-cmake: + runs-on: windows-latest + env: + CHERE_INVOKING: "1" + defaults: + run: + shell: C:\cygwin64\bin\bash.exe --login -eo pipefail -o igncr '{0}' + steps: + - uses: actions/checkout@v6.0.2 + + - uses: cygwin/cygwin-install-action@v6 + with: + install-dir: 'C:\cygwin64' + packages: cmake ninja gcc-core gcc-g++ + + - name: Configure + run: | + cmake -B build \ + -G Ninja \ + -DCMAKE_BUILD_TYPE=Release \ + -DLCMS2_WITH_FASTFLOAT=ON \ + -DLCMS2_WITH_THREADS=ON \ + -DLCMS2_BUILD_TESTS=ON + + - name: Build + run: cmake --build build --parallel + + - name: Run tests + run: ctest --test-dir build --output-on-failure + diff --git a/local/recipes/libs/lcms2/source/.github/workflows/codeql-analysis.yml b/local/recipes/libs/lcms2/source/.github/workflows/codeql-analysis.yml new file mode 100644 index 0000000000..8386c67959 --- /dev/null +++ b/local/recipes/libs/lcms2/source/.github/workflows/codeql-analysis.yml @@ -0,0 +1,72 @@ +# For most projects, this workflow file will not need changing; you simply need +# to commit it to your repository. +# +# You may wish to alter this file to override the set of languages analyzed, +# or to provide custom queries or build logic. +name: "CodeQL" + +on: + push: + branches: [master] + pull_request: + # The branches below must be a subset of the branches above + branches: [master] + schedule: + - cron: '0 6 * * 5' + +permissions: read-all + +jobs: + analyze: + name: Analyze + runs-on: ubuntu-latest + permissions: + actions: read # for github/codeql-action/init to get workflow details + contents: read # for actions/checkout to fetch code + security-events: write # for github/codeql-action/autobuild to send a status report + + strategy: + fail-fast: false + matrix: + # Override automatic language detection by changing the below list + # Supported options are ['csharp', 'cpp', 'go', 'java', 'javascript', 'python'] + language: ['cpp'] + # Learn more... + # https://docs.github.com/en/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#overriding-automatic-language-detection + + steps: + - name: Checkout repository + uses: actions/checkout@v6.0.2 + with: + # We must fetch at least the immediate parents so that if this is + # a pull request then we can checkout the head. + fetch-depth: 2 + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v4.35.1 + with: + languages: ${{ matrix.language }} + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. + # queries: ./path/to/local/query, your-org/your-repo/queries@main + + # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). + # If this step fails, then you should remove it and run the build manually (see below) + - name: Autobuild + uses: github/codeql-action/autobuild@v4.35.1 + + # ℹ️ Command-line programs to run using the OS shell. + # 📚 https://git.io/JvXDl + + # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines + # and modify them (or add more) to build your code if your project + # uses a compiled language + + #- run: | + # make bootstrap + # make release + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v4.35.1 diff --git a/local/recipes/libs/lcms2/source/.github/workflows/scorecard.yml b/local/recipes/libs/lcms2/source/.github/workflows/scorecard.yml new file mode 100644 index 0000000000..0a87763282 --- /dev/null +++ b/local/recipes/libs/lcms2/source/.github/workflows/scorecard.yml @@ -0,0 +1,55 @@ +name: Scorecard supply-chain security +on: + # For Branch-Protection check. Only the default branch is supported. See + # https://github.com/ossf/scorecard/blob/main/docs/checks.md#branch-protection + branch_protection_rule: + # To guarantee Maintained check is occasionally updated. See + # https://github.com/ossf/scorecard/blob/main/docs/checks.md#maintained + schedule: + - cron: '38 3 * * 5' + push: + branches: [ "master" ] + +# Declare default permissions as read only. +permissions: read-all + +jobs: + analysis: + name: Scorecard analysis + runs-on: ubuntu-latest + permissions: + # Needed to upload the results to code-scanning dashboard. + security-events: write + # Needed to publish results and get a badge (see publish_results below). + id-token: write + + steps: + - name: "Checkout code" + uses: actions/checkout@0c366fd6a839edf440554fa01a7085ccba70ac98 # v4.1.1 + with: + persist-credentials: false + + - name: "Run analysis" + uses: ossf/scorecard-action@4eaacf0543bb3f2c246792bd56e8cdeffafb205a # v2.4.3 + with: + results_file: results.sarif + results_format: sarif + + # Publish results to OpenSSF REST API for easy access by consumers and allows the repository to include the Scorecard badge. + # See https://github.com/ossf/scorecard-action#publishing-results + publish_results: true + + # Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF + # format to the repository Actions tab. + - name: "Upload artifact" + uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 + with: + name: SARIF file + path: results.sarif + retention-days: 5 + + # Upload the results to GitHub's code scanning dashboard. + - name: "Upload to code-scanning" + uses: github/codeql-action/upload-sarif@b623f5fd572a69d335c9da3487c1ce53741a09bf # v2.24.0 + with: + sarif_file: results.sarif diff --git a/local/recipes/libs/lcms2/source/.gitignore b/local/recipes/libs/lcms2/source/.gitignore new file mode 100644 index 0000000000..c9fa1e9d5f --- /dev/null +++ b/local/recipes/libs/lcms2/source/.gitignore @@ -0,0 +1,64 @@ +.autotools +.cproject +.project +.settings +*.o +*.Plo +*.a +*.so.* +*.la +*.lai +*.lo +*.Po +*.pc +*.so +*.lib +Thumbs.db +*.obj +*.pdb +*.user +*.aps +*.pch +*.vspscc +*_i.c +*_p.c +*.ncb +*.suo +*.tlb +*.tlh +*.bak +*.cache +*.ilk +*.log +*.exe +[Bb]in +[Dd]ebug*/ +*.sbr +obj/ +[Rr]elease*/ +_ReSharper*/ +[Tt]est[Rr]esult* +.vs/ +#Nuget packages folder +packages/ +/config.status +/utils/common/.dirstamp +/testbed/.libs/lt-testcms +/testbed/.libs/testcms +/testbed/testcms +#Xcode +libtool +Build +DerivedData +.libs +/utils/transicc/transicc +/utils/tificc/tificc +/utils/psicc/psicc +/utils/linkicc/linkicc +/utils/jpgicc/jpgicc +*.tlog +*.ipdb +*.iobj +*.recipe +*.idb +*.lastcodeanalysissucceeded diff --git a/local/recipes/libs/lcms2/source/AUTHORS b/local/recipes/libs/lcms2/source/AUTHORS new file mode 100644 index 0000000000..bf65c4e7ad --- /dev/null +++ b/local/recipes/libs/lcms2/source/AUTHORS @@ -0,0 +1,60 @@ + +Main Author +------------ +Marti Maria + + +Contributors +------------ +Bob Friesenhahn +Kai-Uwe Behrmann +Stuart Nixon +Jordi Vilar +Richard Hughes +Auke Nauta +Chris Evans (Google) +Lorenzo Ridolfi +Robin Watts (Artifex) +Shawn Pedersen +Andrew Brygin +Samuli Suominen +Florian Hch +Aurelien Jarno +Claudiu Cebuc +Michael Vhrel (Artifex) +Michal Cihar +Daniel Kaneider +Mateusz Jurczyk (Google) +Paul Miller +Sbastien Lon +Christian Schmitz +XhmikosR +Stanislav Brabec (SuSe) +Leonhard Gruenschloss (Google) +Patrick Noffke +Christopher James Halse Rogers +John Hein +Thomas Weber (Debian) +Mark Allen +Noel Carboni +Sergei Trofimovic +Philipp Knechtges +Amyspark +Lovell Fuller +Eli Schwartz +Diogo Teles Sant'Anna +Vlad Erium + +Special Thanks +-------------- +Artifex software +AlienSkin software +libVIPS +Jan Morovic +Jos Vernon (WebSupergoo) +Harald Schneider (Maxon) +Christian Albrecht +Dimitrios Anastassakis +Lemke Software +Tim Zaman +Amir Montazery and Open Source Technology Improvement Fund (ostif.org), Google, for fuzzer fundings. \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/CMakeLists.txt b/local/recipes/libs/lcms2/source/CMakeLists.txt new file mode 100644 index 0000000000..cf8dcb832d --- /dev/null +++ b/local/recipes/libs/lcms2/source/CMakeLists.txt @@ -0,0 +1,39 @@ +cmake_minimum_required(VERSION 3.16...3.29) + +project(lcms2 + VERSION 2.19 + LANGUAGES C +) + +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake") + +include(Lcms2Options) +include(Lcms2Features) +include(Lcms2Library) +include(Lcms2Tools) +include(Lcms2Plugins) +include(Lcms2Tests) +include(Lcms2Packaging) + +lcms2_setup_options() +lcms2_detect_features() + +if(LCMS2_BUILD_TESTS) + enable_testing() +endif() + +lcms2_add_library() + +if(LCMS2_BUILD_TOOLS) + lcms2_add_tools() +endif() + +lcms2_add_plugins() + +if(LCMS2_BUILD_TESTS) + lcms2_add_tests() +endif() + +lcms2_setup_packaging() + + diff --git a/local/recipes/libs/lcms2/source/ChangeLog b/local/recipes/libs/lcms2/source/ChangeLog new file mode 100644 index 0000000000..bdafdb56f8 --- /dev/null +++ b/local/recipes/libs/lcms2/source/ChangeLog @@ -0,0 +1,355 @@ +----------------------- +2.19 Featured release +----------------------- +CMake build system. Thanks to Vlad Erium for the initial implementation and kmilos for improvements. +Large files support to use profiles up to 4Gb +Black point compensation works on multi-channel profiles +Added more test platforms/architectures in GitHub tests, Cygwin and MSYS are now fully checked. +jpgicc banner is not shown on normal operation, only when help is requested. +Added a way to access internal transform pipelines. For read only. +Add a way to retrieve the CMM signature +Added extra checks on postscript undocumented functions +Added guard on integer overflow when reading .cube files +Added unneeded checks as a try to get rid of spam reports about "vulnerabilities" that are not real. +Utility program names generated by Visual Studio 2026 are now same as all other platforms. +Creating an output profile by cmsTransform2DeviceLink does not propagate correctly the colorant table. Fixed. +Added some profile class definitions from iccMAX +Deprecated uint16 and uint32 types removed from tifdiff + +----------------------- +2.18 Maintenance release +----------------------- +Add an extra check for completeness only. +Fix a signed integer overflow which could trigger a FPE_INTOVF +Fix Microsoft'2 MHC2 private tag +Added projects for XCode 26 & Visual Studio 2026 +Added documentation for PCS illuminants and chromatic adaptation +Check for a possible out-of-bounds in softproofing transforms when using cmsCreateExtendedTransform +Fix for a out-of-bound read, issue #522 +Add an extra check for out-of-bounds read when misusing a support function +avoid divide by zero, special case from spec. notes on CAM02 +Fix CGATS parser bug when number has a "+" sign +Fix a typo when handling a special case for BPC +Fixed a loss of precision when Lab16 is used as input color space on integer transforms +Fixes hypotetical corrupted pointer in non-happy path. Cannot happen in real world +Fix a theoretical memory leak. +Add support of localized descriptions in v2 profiles for MacOS +Mark some tables as const +Make the param of cmsCreateLab4Profile() to refer to the media white instead of the illuminant +fix a warning in unit tests +Remove redundant check. Fixes #497 +Update autotools +fix plugins soname + add oklab to transicc (experimental) +meson: ability to disable .so.version libraries +Fix black point detection when using darker colorant. +testcms2.c: Fix incorrect string comparisons +Fix CICp tag size. +Fix broken linkicc +meson: Bump minimum Meson version to 0.52 for visibility:hidden +meson: Disable unused fs import +Add a guard against a wrong use of flags +Fix for #469 heap buffer overflow on convert_utf16_to_utf32() + +----------------------- +2.17 Maintenance release +----------------------- +Add fuzzers foundation. Many thanks to Amir Montazery and Open Source Technology Improvement Fund (ostif.org), Google, for funding that. +Add ability to disable building tests in meson +Fixed gamut warning not working on certain conditions +Mac sequoia added to test beds +Add the possibility of duplicating a NULL context for cloning defaults. +Small cleanup of CGATS parser +Change computation of profile ID to follow actual ICC spec (yes, they changed the spec!) +Allow to apply color management on memory blocks > 4Gb +Get rid of samples on meson compilation +Increase coverage of premultiplied alpha. +Bug fixing and cosmetical work on sources. + +----------------------- +2.16 Featured release +----------------------- +New import .CUBE files as RGB devicelinks +New Read/Write MHC2 tags for Windows GPU access +New Support for UTF8 on multilocalized unicode functions +New Support for OkLab color space, built-in and formatter. +Improved floating point transforms float -> integer are now honored as float +Improved MSYS2, mingw is now supported +Improved proferred CMM, platform and creator now survives profile edition. +Fixed tificc now can deal with Lab TIFF +Fixed code can now be compiled by a C++17 compiler, "register" keyword use detected at compile time. +Fixed Reverted postcript creation that corrupted some interpreters. + +----------------------- +2.15 Maintenance release +----------------------- +New MESON build system, many thanks to amispark and Lovell Fuller for bringing this. +Fixed a bug that caused memory corruption on colord +cmsReadRawTag can read portions of tags again. Removing this caused colord to segfault when dumping profiles +Added more checks based of fuzzer discoveries. +MSYS2 can now compile lcms2 +Checked on Apple Silicon M1 and M2 +Fixed a bug of fastfloat plug-in that affected Krita CMYK color selector + +----------------------- +2.14 Featured release +----------------------- +lcms2 now implements ICC specification 4.4 +New multi-threaded plug-in +several fixes to keep fuzzers happy +Remove check on DLL when CMS_NO_REGISTER_KEYWORD is used +Added more validation against broken profiles +Add more help to several tools + +----------------------- +2.13.1 Hot fix +----------------------- +Fix for pure white going gray in grayscale transforms. + +----------------------- +2.13 Featured release +----------------------- +Added support for premultiplied alpha +tifficc can now handle alpha channels, both unassociated and premultiplied +Better documentation +CGATS parser can now deal with very long strings +Added Projects for Visual Studio 2020 +Travis CI discontinued, GitHub actions used instead +Added a very preliminar meson build script (thanks to xclaesse) +Added ARM64 target to visual studio 2019 (thanks to gaborkertesz-linaro) +Added thread safe code to get time +Added automatic linear space detection +Added cmsGetStageContextID function +Added cmsDetectRGBProfileGamma function +configure now accepts --without-fastfloat to turn plugin off +autogen.sh has now a --distclean toggle to get rid of all autotools generated files +Checked to work on STM32 Cortex-A, Cortex-M families +Bug & typos fixing (thanks to many reporters and contributors) + +----------------------- +2.12 Maintenance release +----------------------- +Added new built-in sigmoidal tone curve +Added XCode 12 project +Added support for multichannel input up to 15 channels +Fix LUT8 write matrix +Fix version mess on 10/11 +Fix tools & samples xgetopt +Fix warnings on different function pointers +Fix matlab MEX compilation +plugin: cleanup and better SSE detection +plugin: add lab to any on float +plugin: it can now be compiled as C++ +recover PDF documentation, but try to keep it under a reasonable size. +Prevent a rare but possible out-of-bounds read in postscript generator +Remove unused variables + +----------------------- +2.11 Maintenance release +----------------------- +Fixed __cpuid() on fast float plugin to allow gnu gcc +Fixed copy alpha bounds check +Fixed data race condition on contexts pool +Fixed LUT16 write matrix on multichannel V2 profiles + +----------------------- +2.10 Featured release +----------------------- +Added a compilation toggle to remove "register" keyword in API. +Previously commercial, fast_float plug-in is now released as open source under GPL3 license. +MD5 functions are now accessible through plug-in API. +Added support for Visual Studio 2019 +Bug fixing. + + +----------------------- +2.9 Maintenance release +----------------------- +Several fixes related with security, and therefore not detailed here. +C++ compiles now without warnings +Added OSX and clang in travis +Added a travis-ci test matrix for many compilers and OS. Thanks to Thomas Weber (debian) for this great improvement. +testbed can now work with dynamic versions of library +Fixed wrong planar formatters regarding linestride interpretation + +----------------------- +2.8 Featured release +----------------------- + +Changed ChangeLog direction +Fixed many typos in comments, thanks to Stefan Weil for doing that. +Fixed localization bug, added a new test case crayons.icc thanks to Richard Hughes for providing the profile. +Fixed a bug in optimizer that made some formats (i.e, bits planar) unavailable +Fixed misalignment problems on Alpha. The compiler does not align strings, and accessing begin of string as a uint16 makes code to fail. +Added some extra checks to the tools and examples. +Fixed a bug that prevented to read luminance tag +BIG amount of functionality contributed/Sponsored by Alien Skin Software: TransformStride, copyAlpha, performance plug-ins. Fixes some warnings as well. +Added an extra _ to _stdcall to make it more portable +Fixed a bug in transicc for named color profiles +Fixed several compiler warnings +Added support for Visual Studio 2015 +Fixed for XCODE project + +----------------------- +2.7 Maintenance release +----------------------- + +Added a version retrieval function +Added an option in transicc for working in bounded mode +Fixed wrong handling of extra channels in some formatters. +Added a project for VS2013 +Added license for iccjpeg.c +New project for mac +Added a global optimization that merges consecutive matrices in pipelines. Fixes loss of precision in some transforms +Added a flag to clip negative values in unbounded transforms (only gray, rgb, cmyk) +Move unused var suppresor before the `return` statements. +Remove dead code. +Add missing comma in CGATS parser +utils/jpgicc/iccjpeg.c: Fix check if unsigned variable 'total_length'… … +Some maintenance fixes +Remove unused vcproj files +Added a function to retrieve the iohandler of a given profile object +Added a safety check on named color lists +Fixed a macro clash on SNONE. +Fixed a possible segmentation fault in a non-happy path + +----------------------- +2.6 Featured release +----------------------- + +Added pthread dependency. From now lcms supports multithreading +Fix for delete tag memory corruption +Added directories for tiff, jpeg in configure script +New locking plug-in, from Artifex +Big revamp on Contexts, from Artifex +Fixed memory leaks on error handling +Changed endianness detection for PowerPC +Added a way to retrieve matrix shaper always, no matter LUT is present +Fixed a bug in PCS/Colorspace order when reading V2 Lab devicelinks +Fixed some indexing out of bounds in floating point interpolation +Fixed a double free in recovering from a previous error in default intent handler. + +----------------------- +2.5 Maintenance release +----------------------- + +Added some checks for non-happy path, mostly failing mallocs +Transform2Devicelink now keeps white point when guessing deviceclass is enabled +Rendering intent used when creating the transform is now propagated to profile header in cmsTransform2Devicelink. This is because 7.2.15 in spec 4.3 +Added a simple project for cppcheck +Added support for VS2012 +Remove spurious tabs added by git merge of pull request +Fixed a bug in parametric curves +Added some fixes from XhmikosR +Added TIFF Lab16 handling on tifficc +More changes from Artifex +Added identity curves support for write V2 LUT +Added a way to read the profile creator from header +Added a reference for Mac MLU tag +Fixed devicelink generation for 8 bits +Several minor issues found by cppcheck +Several improvements in cgats parser. +Fixed some bugs on floating point curves. +Fixed a bug on big endian platforms not supporting uint64 or long long. +Added error descriptions on cmsSmoothToneCurve +Added new cmsPlugInTHR() and fixed some race conditions (thanks to Artifex) +update black point detection algorithm to reflect ICC changes +Fixed some 64 bit warnings on size_t to uint32 conversions +Fixed a multithead bug on optimization (StageDEF) +RGB profiles using same tone curves for several channels are storing now only one copy of the curve (saves space) +User defined parametric curves can now be saved in ICC profiles. + +-------------------- +2.4 Featured release +-------------------- + +Added a check for maximum input channels +Fixed an uninitialized read on PatchLUT +Fixed a bug in XYZ floating point PCS +added half float variants (ABGR and so) +Added formatter resolution after xform optimization plugin +Fixed a bug in transicc when clot tables are present +Added a conditional compilatio flag for "half" support +Fixed a bug on named color profiles. +Fixed a typo on tificc and jpgicc names, thanks to Elle Stone for reporting. +Added half float support +Increased security checks, thanks to Mateusz Jurczyk, from Google. +Fixed a bug on IT8 reading of negative numbers. +Fixed a bug on ending zero when saving a IT8 to memory +Internal stage structs are now accessible through plug-in API +Added a new plug-in type +Added getPipelineContextID +Fixed a bug in pipeline duplication +gamma 1.0 can now operate in unbounded mode +Exposed internal overview table for tone curves +Added a new plug in entry for full transform +Added support for transforms on planar data with different stride +Added black point detection algorithm from Adobe paper +Fixed a bug in black preservation checking +Added performance improvements from several contributors, mostly Artifex +Fixed uint64 to work in systems without long long native type +Fixed a bug in the named color devicelink generation + +----------------------- +2.3 Maintenance release +----------------------- + +Added compatibility with Argyll's CGATS parser +Updated to ICC spec 4.3 +Adding a memory alignment macro for CGATS parser +Fixed a bug on the range of data in transicc, when colorant tag is specified +Fixed Absolute colorimetric intent issues +Fixed encoding for floating point tags in Lab/XYZ +Fixed a 0 byte allocation issue in _cmsCreateSubAllocChunk + +----------------------- +2.2 Maintenance release +----------------------- + +Pascal unit now is supported by Free Pascal Compiler +Fixed a bug on ReadRAWtag +Added dictionary metatag support +Fixed a bug in black preservation and slightly non-monotonic curves +Added named color functionality +Fixed a bug that made crash black preservation on CMYK2CMYK devicelinks +Added functions to retrieve formatters from transforms +Profiles with weird curves are not prone to p`relinearization optimization. +changed memmove to memcpy in cache for xput improvement +Fixed GBD bug (out of bounds memory overwrite) +Fixed some potential issues as NULL dereferencing +Updated linkicc to 2.1, cleanup +Removed pthreads need +Fixed severa bugs in absolute colorimetric intent + +----------------------- +2.1 Maintenance release +----------------------- + +Added bound check in floating point interpolation +Fixed a bug on curve reversing when source curves have few points +Added Duotone support (Bilinear interpolation) +Fixed delphi interface +linkicc now stores the rendering intent in the profile header +Fixed several integer overflow and other integrity checks, thanks to Chris Evans +Fixed an issue on curve inversion +Fixed memory leaks on when recovering from errors +Fixed a bug in psid and profile sequence tags +Fixed a bug in device link creation on v4 profiles +Fixed a bug in tificc in floating point formats +Peliminary Delphi wrapper +Fixed some typos in error messages +Added cmsTagLinkedTo +Fixed VC2010, VC2008 projects +Added a check on jpgicc for NULL transforms +Added UTILS_UNUSED_PARAMETER for samples +Added cmsChangeBufferFormat for backwards compatibility +Fixed a bug on Lab + Alpha float formatters, added such predefined formatters as well +Fixed a bug on transicc that made profiles with output colorants info to malfunction +Fixed a bug that prevented linkicc to work +Fixed a bug on V2 CHAD construction, affects absolute colorimetric intent + +----------------------- +2.0 Major version bump +----------------------- + + + diff --git a/local/recipes/libs/lcms2/source/INSTALL b/local/recipes/libs/lcms2/source/INSTALL new file mode 100644 index 0000000000..2e5ee4adf9 --- /dev/null +++ b/local/recipes/libs/lcms2/source/INSTALL @@ -0,0 +1,2 @@ + + Please see the documentation in doc folder diff --git a/local/recipes/libs/lcms2/source/LICENSE b/local/recipes/libs/lcms2/source/LICENSE new file mode 100644 index 0000000000..85480b50b0 --- /dev/null +++ b/local/recipes/libs/lcms2/source/LICENSE @@ -0,0 +1,22 @@ +MIT License + +Copyright (c) 2023 Marti Maria Saguer + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject +to the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/local/recipes/libs/lcms2/source/Lib/BC/BC.txt b/local/recipes/libs/lcms2/source/Lib/BC/BC.txt new file mode 100644 index 0000000000..146228d6af --- /dev/null +++ b/local/recipes/libs/lcms2/source/Lib/BC/BC.txt @@ -0,0 +1 @@ +BC \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/Lib/MS/MS.TXT b/local/recipes/libs/lcms2/source/Lib/MS/MS.TXT new file mode 100644 index 0000000000..32dfbc9fa6 --- /dev/null +++ b/local/recipes/libs/lcms2/source/Lib/MS/MS.TXT @@ -0,0 +1 @@ +MS \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/Makefile.am b/local/recipes/libs/lcms2/source/Makefile.am new file mode 100644 index 0000000000..3b52a485b5 --- /dev/null +++ b/local/recipes/libs/lcms2/source/Makefile.am @@ -0,0 +1,45 @@ +# +# Top-Level Makefile for building LittleCMS 2 +# + +# Don't require all the GNU mandated files +AUTOMAKE_OPTIONS = 1.7.2 dist-zip foreign + +ACLOCAL_AMFLAGS = -I m4 + +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ + +USER_PLUGINS = +if COND_FASTFLOAT + USER_PLUGINS += plugins/fast_float +endif + +if COND_THREADED + USER_PLUGINS += plugins/threaded +endif + +# Directories containing Makefiles to 'make' +SUBDIRS = src include utils/tificc utils/transicc utils/linkicc utils/jpgicc utils/psicc testbed $(USER_PLUGINS) + +# Additional files to distribute +EXTRA_DIST = AUTHORS COPYING ChangeLog doc Projects include bin Lib INSTALL README.md autogen.sh lcms2.pc.in plugins + +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = lcms2.pc + + +# Make sure get rid of VC stuff... +clean-local: + rm -rf autom4te.cache + find Projects -name "*.user" | xargs rm -rf + find Projects -name "Release" | xargs rm -rf + find Projects -name "Debug" | xargs rm -rf + find Projects -name "*.aps" | xargs rm -rf + find Projects -name "*.suo" | xargs rm -rf + find Projects -name "*.log" | xargs rm -rf + find Projects -name "*.sdf" | xargs rm -rf + find Projects -name "*.opensdf" | xargs rm -rf + find Projects -name "ipch" | xargs rm -rf + + diff --git a/local/recipes/libs/lcms2/source/Makefile.in b/local/recipes/libs/lcms2/source/Makefile.in new file mode 100644 index 0000000000..a7ca93641b --- /dev/null +++ b/local/recipes/libs/lcms2/source/Makefile.in @@ -0,0 +1,941 @@ +# Makefile.in generated by automake 1.18.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2025 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# +# Top-Level Makefile for building LittleCMS 2 +# + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +am__rm_f = rm -f $(am__rm_f_notfound) +am__rm_rf = rm -rf $(am__rm_f_notfound) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +@COND_FASTFLOAT_TRUE@am__append_1 = plugins/fast_float +@COND_THREADED_TRUE@am__append_2 = plugins/threaded +subdir = . +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_append_compile_flags.m4 \ + $(top_srcdir)/m4/ax_append_flag.m4 \ + $(top_srcdir)/m4/ax_check_compile_flag.m4 \ + $(top_srcdir)/m4/ax_gcc_func_attribute.m4 \ + $(top_srcdir)/m4/ax_pthread.m4 \ + $(top_srcdir)/m4/ax_require_defined.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ + $(am__configure_deps) $(am__DIST_COMMON) +am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ + configure.lineno config.status.lineno +mkinstalldirs = $(install_sh) -d +CONFIG_CLEAN_FILES = lcms2.pc +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ + ctags-recursive dvi-recursive html-recursive info-recursive \ + install-data-recursive install-dvi-recursive \ + install-exec-recursive install-html-recursive \ + install-info-recursive install-pdf-recursive \ + install-ps-recursive install-recursive installcheck-recursive \ + installdirs-recursive pdf-recursive ps-recursive \ + tags-recursive uninstall-recursive +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && echo $$files | $(am__xargs_n) 40 $(am__rm_f); }; \ + } +am__installdirs = "$(DESTDIR)$(pkgconfigdir)" +DATA = $(pkgconfig_DATA) +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +am__recursive_targets = \ + $(RECURSIVE_TARGETS) \ + $(RECURSIVE_CLEAN_TARGETS) \ + $(am__extra_recursive_targets) +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ + cscope distdir distdir-am dist dist-all distcheck +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +DIST_SUBDIRS = src include utils/tificc utils/transicc utils/linkicc \ + utils/jpgicc utils/psicc testbed plugins/fast_float \ + plugins/threaded +am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/lcms2.pc.in AUTHORS \ + ChangeLog INSTALL README.md compile config.guess config.sub \ + install-sh ltmain.sh missing +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +distdir = $(PACKAGE)-$(VERSION) +top_distdir = $(distdir) +am__remove_distdir = \ + if test -d "$(distdir)"; then \ + find "$(distdir)" -type d ! -perm -700 -exec chmod u+rwx {} ';' \ + ; rm -rf "$(distdir)" \ + || { sleep 5 && rm -rf "$(distdir)"; }; \ + else :; fi +am__post_remove_distdir = $(am__remove_distdir) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +DIST_ARCHIVES = $(distdir).tar.gz $(distdir).zip +GZIP_ENV = -9 +DIST_TARGETS = dist-gzip dist-zip +# Exists only to be overridden by the user if desired. +AM_DISTCHECK_DVI_TARGET = dvi +distuninstallcheck_listfiles = find . -type f -print +am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ + | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' +distcleancheck_listfiles = \ + find . \( -type f -a \! \ + \( -name .nfs* -o -name .smb* -o -name .__afs* \) \) -print +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ETAGS = @ETAGS@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FILECMD = @FILECMD@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +JPEGICC_DEPLIBS = @JPEGICC_DEPLIBS@ +LCMS_LIB_DEPLIBS = @LCMS_LIB_DEPLIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBRARY_AGE = @LIBRARY_AGE@ +LIBRARY_CURRENT = @LIBRARY_CURRENT@ +LIBRARY_REVISION = @LIBRARY_REVISION@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_DEPS = @LIBTOOL_DEPS@ +LIB_JPEG = @LIB_JPEG@ +LIB_MATH = @LIB_MATH@ +LIB_PLUGINS = @LIB_PLUGINS@ +LIB_THREAD = @LIB_THREAD@ +LIB_TIFF = @LIB_TIFF@ +LIB_ZLIB = @LIB_ZLIB@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_CXX = @PTHREAD_CXX@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +TIFFICC_DEPLIBS = @TIFFICC_DEPLIBS@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__rm_f_notfound = @am__rm_f_notfound@ +am__tar = @am__tar@ +am__untar = @am__untar@ +am__xargs_n = @am__xargs_n@ +ax_pthread_config = @ax_pthread_config@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +inline = @inline@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +# Don't require all the GNU mandated files +AUTOMAKE_OPTIONS = 1.7.2 dist-zip foreign +ACLOCAL_AMFLAGS = -I m4 +USER_PLUGINS = $(am__append_1) $(am__append_2) + +# Directories containing Makefiles to 'make' +SUBDIRS = src include utils/tificc utils/transicc utils/linkicc utils/jpgicc utils/psicc testbed $(USER_PLUGINS) + +# Additional files to distribute +EXTRA_DIST = AUTHORS COPYING ChangeLog doc Projects include bin Lib INSTALL README.md autogen.sh lcms2.pc.in plugins +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = lcms2.pc +all: all-recursive + +.SUFFIXES: +am--refresh: Makefile + @: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ + $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + echo ' $(SHELL) ./config.status'; \ + $(SHELL) ./config.status;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + $(SHELL) ./config.status --recheck + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + $(am__cd) $(srcdir) && $(AUTOCONF) +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) +$(am__aclocal_m4_deps): +lcms2.pc: $(top_builddir)/config.status $(srcdir)/lcms2.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool config.lt +install-pkgconfigDATA: $(pkgconfig_DATA) + @$(NORMAL_INSTALL) + @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \ + done + +uninstall-pkgconfigDATA: + @$(NORMAL_UNINSTALL) + @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir) + +# This directory's subdirectories are mostly independent; you can cd +# into them and run 'make' without going through this Makefile. +# To change the values of 'make' variables: instead of editing Makefiles, +# (1) if the variable is set in 'config.status', edit 'config.status' +# (which will cause the Makefiles to be regenerated when you run 'make'); +# (2) otherwise, pass the desired values on the 'make' command line. +$(am__recursive_targets): + @fail=; \ + if $(am__make_keepgoing); then \ + failcom='fail=yes'; \ + else \ + failcom='exit 1'; \ + fi; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-recursive +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-recursive + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscope: cscope.files + test ! -s cscope.files \ + || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) +clean-cscope: + -rm -f cscope.files +cscope.files: clean-cscope cscopelist +cscopelist: cscopelist-recursive + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + -rm -f cscope.out cscope.in.out cscope.po.out cscope.files + +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) + $(am__remove_distdir) + $(AM_V_at)$(MKDIR_P) "$(distdir)" + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done + -test -n "$(am__skip_mode_fix)" \ + || find "$(distdir)" -type d ! -perm -755 \ + -exec chmod u+rwx,go+rx {} \; -o \ + ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ + || chmod -R a+r "$(distdir)" +dist-gzip: distdir + tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz + $(am__post_remove_distdir) + +dist-bzip2: distdir + tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 + $(am__post_remove_distdir) + +dist-bzip3: distdir + tardir=$(distdir) && $(am__tar) | bzip3 -c >$(distdir).tar.bz3 + $(am__post_remove_distdir) + +dist-lzip: distdir + tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz + $(am__post_remove_distdir) + +dist-xz: distdir + tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz + $(am__post_remove_distdir) + +dist-zstd: distdir + tardir=$(distdir) && $(am__tar) | zstd -c $${ZSTD_CLEVEL-$${ZSTD_OPT--19}} >$(distdir).tar.zst + $(am__post_remove_distdir) + +dist-tarZ: distdir + @echo WARNING: "Support for distribution archives compressed with" \ + "legacy program 'compress' is deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 + tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z + $(am__post_remove_distdir) + +dist-shar: distdir + @echo WARNING: "Support for shar distribution archives is" \ + "deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 + shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz + $(am__post_remove_distdir) +dist-zip: distdir + -rm -f $(distdir).zip + zip -rq $(distdir).zip $(distdir) + $(am__post_remove_distdir) + +dist dist-all: + $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' + $(am__post_remove_distdir) + +# This target untars the dist file and tries a VPATH configuration. Then +# it guarantees that the distribution is self-contained by making another +# tarfile. +distcheck: dist + case '$(DIST_ARCHIVES)' in \ + *.tar.gz*) \ + eval GZIP= gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ + *.tar.bz2*) \ + bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ + *.tar.bz3*) \ + bzip3 -dc $(distdir).tar.bz3 | $(am__untar) ;;\ + *.tar.lz*) \ + lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ + *.tar.xz*) \ + xz -dc $(distdir).tar.xz | $(am__untar) ;;\ + *.tar.Z*) \ + uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ + *.shar.gz*) \ + eval GZIP= gzip -dc $(distdir).shar.gz | unshar ;;\ + *.zip*) \ + unzip $(distdir).zip ;;\ + *.tar.zst*) \ + zstd -dc $(distdir).tar.zst | $(am__untar) ;;\ + esac + chmod -R a-w $(distdir) + chmod u+w $(distdir) + mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst + chmod a-w $(distdir) + test -d $(distdir)/_build || exit 0; \ + dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ + && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ + && am__cwd=`pwd` \ + && $(am__cd) $(distdir)/_build/sub \ + && ../../configure \ + $(AM_DISTCHECK_CONFIGURE_FLAGS) \ + $(DISTCHECK_CONFIGURE_FLAGS) \ + --srcdir=../.. --prefix="$$dc_install_base" \ + && $(MAKE) $(AM_MAKEFLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) $(AM_DISTCHECK_DVI_TARGET) \ + && $(MAKE) $(AM_MAKEFLAGS) check \ + && $(MAKE) $(AM_MAKEFLAGS) install \ + && $(MAKE) $(AM_MAKEFLAGS) installcheck \ + && $(MAKE) $(AM_MAKEFLAGS) uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ + distuninstallcheck \ + && chmod -R a-w "$$dc_install_base" \ + && ({ \ + (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ + distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ + } || { rm -rf "$$dc_destdir"; exit 1; }) \ + && rm -rf "$$dc_destdir" \ + && $(MAKE) $(AM_MAKEFLAGS) dist \ + && rm -rf $(DIST_ARCHIVES) \ + && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ + && cd "$$am__cwd" \ + || exit 1 + $(am__post_remove_distdir) + @(echo "$(distdir) archives ready for distribution: "; \ + list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ + sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' +distuninstallcheck: + @test -n '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: trying to run $@ with an empty' \ + '$$(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + $(am__cd) '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left after uninstall:" ; \ + if test -n "$(DESTDIR)"; then \ + echo " (check DESTDIR support)"; \ + fi ; \ + $(distuninstallcheck_listfiles) ; \ + exit 1; } >&2 +distcleancheck: distclean + @if test '$(srcdir)' = . ; then \ + echo "ERROR: distcleancheck can only run from a VPATH build" ; \ + exit 1 ; \ + fi + @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left in build directory after distclean:" ; \ + $(distcleancheck_listfiles) ; \ + exit 1; } >&2 +check-am: all-am +check: check-recursive +all-am: Makefile $(DATA) +installdirs: installdirs-recursive +installdirs-am: + for dir in "$(DESTDIR)$(pkgconfigdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -$(am__rm_f) $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || $(am__rm_f) $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libtool clean-local mostlyclean-am + +distclean: distclean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-libtool \ + distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: install-pkgconfigDATA + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf $(top_srcdir)/autom4te.cache + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-pkgconfigDATA + +.MAKE: $(am__recursive_targets) install-am install-strip + +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ + am--refresh check check-am clean clean-cscope clean-generic \ + clean-libtool clean-local cscope cscopelist-am ctags ctags-am \ + dist dist-all dist-bzip2 dist-bzip3 dist-gzip dist-lzip \ + dist-shar dist-tarZ dist-xz dist-zip dist-zstd distcheck \ + distclean distclean-generic distclean-libtool distclean-tags \ + distcleancheck distdir distuninstallcheck dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-pkgconfigDATA install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs installdirs-am \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am uninstall-pkgconfigDATA + +.PRECIOUS: Makefile + + +# Make sure get rid of VC stuff... +clean-local: + rm -rf autom4te.cache + find Projects -name "*.user" | xargs rm -rf + find Projects -name "Release" | xargs rm -rf + find Projects -name "Debug" | xargs rm -rf + find Projects -name "*.aps" | xargs rm -rf + find Projects -name "*.suo" | xargs rm -rf + find Projects -name "*.log" | xargs rm -rf + find Projects -name "*.sdf" | xargs rm -rf + find Projects -name "*.opensdf" | xargs rm -rf + find Projects -name "ipch" | xargs rm -rf + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: + +# Tell GNU make to disable its built-in pattern rules. +%:: %,v +%:: RCS/%,v +%:: RCS/% +%:: s.% +%:: SCCS/s.% diff --git a/local/recipes/libs/lcms2/source/Projects/.gitignore b/local/recipes/libs/lcms2/source/Projects/.gitignore new file mode 100644 index 0000000000..03da67f996 --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/.gitignore @@ -0,0 +1,11 @@ +# Visual Studio +**.opensdf +**.sdf +**.suo +**.user +Debug/ +Release/ +# Xcode & macOS +xcuserdata/ +.DS_Store +._* diff --git a/local/recipes/libs/lcms2/source/Projects/BorlandC_5.5/lcms2.rc b/local/recipes/libs/lcms2/source/Projects/BorlandC_5.5/lcms2.rc new file mode 100644 index 0000000000..0b1590a30c --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/BorlandC_5.5/lcms2.rc @@ -0,0 +1,30 @@ + + +1 VERSIONINFO +FILEVERSION 2, 17, 0, 0 +PRODUCTVERSION 2, 17, 0, 0 +FILEOS VOS_NT_WINDOWS32 +FILETYPE VFT_DLL +{ + BLOCK "StringFileInfo" + { + BLOCK "040904E4" + { + VALUE "CompanyName", "Marti Maria\000\000" + VALUE "FileDescription", "lcms color engine\000" + VALUE "FileVersion", "2.17\000\000" + VALUE "InternalName", "lcms2\000" + VALUE "LegalCopyright", "Copyright © Marti Maria 2024\000\000" + VALUE "OriginalFilename", "lcms2.dll\000" + } + + } + + BLOCK "VarFileInfo" + { + VALUE "Translation", 0x409, 1252 + } + +} + + diff --git a/local/recipes/libs/lcms2/source/Projects/BorlandC_5.5/lcmsdll.lk b/local/recipes/libs/lcms2/source/Projects/BorlandC_5.5/lcmsdll.lk new file mode 100644 index 0000000000..ed4c0fcf63 --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/BorlandC_5.5/lcmsdll.lk @@ -0,0 +1,31 @@ +/x/aa/c/Tpd C0D32.OBJ+ +cmsalpha.obj+ +cmscam02.obj+ +cmscgats.obj+ +cmscnvrt.obj+ +cmserr.obj+ +cmsgamma.obj+ +cmsgmt.obj+ +cmshalf.obj+ +cmsintrp.obj+ +cmsio0.obj+ +cmsio1.obj+ +cmslut.obj+ +cmsmd5.obj+ +cmsmtrx.obj+ +cmsnamed.obj+ +cmsopt.obj+ +cmspack.obj+ +cmspcs.obj+ +cmsplugin.obj+ +cmsps2.obj+ +cmssamp.obj+ +cmssm.obj+ +cmstypes.obj+ +cmsvirt.obj+ +cmswtpnt.obj+ +cmsxform.obj +..\..\bin\lcms2.dll + +cw32mt.lib import32.lib +..\..\src\lcms2.def \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/Projects/BorlandC_5.5/lcmsdll.lst b/local/recipes/libs/lcms2/source/Projects/BorlandC_5.5/lcmsdll.lst new file mode 100644 index 0000000000..1c14947614 --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/BorlandC_5.5/lcmsdll.lst @@ -0,0 +1,29 @@ +-5 -C -DCMS_DLL -DCMS_DLL_BUILD +-I..\..\include -K -O2 -a8 -d -ff -w -wucp -wsig -wdef -wnod -wamb +-OS -RT- -R- -tWM -tWD -w- -x- -c +..\..\src\cmscam02.c +..\..\src\cmscgats.c +..\..\src\cmscnvrt.c +..\..\src\cmserr.c +..\..\src\cmsgamma.c +..\..\src\cmsgmt.c +..\..\src\cmsintrp.c +..\..\src\cmsio0.c +..\..\src\cmsio1.c +..\..\src\cmslut.c +..\..\src\cmsmd5.c +..\..\src\cmsmtrx.c +..\..\src\cmsnamed.c +..\..\src\cmsopt.c +..\..\src\cmspack.c +..\..\src\cmspcs.c +..\..\src\cmsplugin.c +..\..\src\cmsps2.c +..\..\src\cmssamp.c +..\..\src\cmssm.c +..\..\src\cmstypes.c +..\..\src\cmsvirt.c +..\..\src\cmswtpnt.c +..\..\src\cmsxform.c +..\..\src\cmshalf.c +..\..\src\cmsalpha.c \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/Projects/BorlandC_5.5/mklcmsdll.bat b/local/recipes/libs/lcms2/source/Projects/BorlandC_5.5/mklcmsdll.bat new file mode 100644 index 0000000000..6db2f72470 --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/BorlandC_5.5/mklcmsdll.bat @@ -0,0 +1,14 @@ +@echo off +echo. +echo This will build the littlecms DLL using Borland C 5.5 compiler. +echo. +echo Press Ctrl-C to abort, or +pause +bcc32 @lcmsdll.lst +if errorlevel 0 ilink32 @lcmsdll.lk +if errorlevel 0 brc32 -fe ..\..\bin\lcms2.dll lcms2.rc +del *.obj +del *.res +echo Done! + + diff --git a/local/recipes/libs/lcms2/source/Projects/Qt/lcms2/lcms2.pro b/local/recipes/libs/lcms2/source/Projects/Qt/lcms2/lcms2.pro new file mode 100644 index 0000000000..1b6e839e2a --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/Qt/lcms2/lcms2.pro @@ -0,0 +1,53 @@ +QT -= gui + +TEMPLATE = lib +CONFIG += staticlib + +CONFIG += c++17 + +# You can make your code fail to compile if it uses deprecated APIs. +# In order to do so, uncomment the following line. +#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 + +INCLUDEPATH += ../../../include ../../../src + +HEADERS += \ + ../../../include/lcms2.h \ + ../../../include/lcms2_plugin.h \ + ../../../src/lcms2_internal.h + +SOURCES += \ + ../../../src/cmsalpha.c \ + ../../../src/cmscam02.c \ + ../../../src/cmscgats.c \ + ../../../src/cmscnvrt.c \ + ../../../src/cmserr.c \ + ../../../src/cmsgamma.c \ + ../../../src/cmsgmt.c \ + ../../../src/cmshalf.c \ + ../../../src/cmsintrp.c \ + ../../../src/cmsio0.c \ + ../../../src/cmsio1.c \ + ../../../src/cmslut.c \ + ../../../src/cmsmd5.c \ + ../../../src/cmsmtrx.c \ + ../../../src/cmsnamed.c \ + ../../../src/cmsopt.c \ + ../../../src/cmspack.c \ + ../../../src/cmspcs.c \ + ../../../src/cmsplugin.c \ + ../../../src/cmsps2.c \ + ../../../src/cmssamp.c \ + ../../../src/cmssm.c \ + ../../../src/cmstypes.c \ + ../../../src/cmsvirt.c \ + ../../../src/cmswtpnt.c \ + ../../../src/cmsxform.c + + + +# Default rules for deployment. +unix { + target.path = $$[QT_INSTALL_PLUGINS]/generic +} +!isEmpty(target.path): INSTALLS += target diff --git a/local/recipes/libs/lcms2/source/Projects/VC2019/jpegicc/jpegicc.vcxproj b/local/recipes/libs/lcms2/source/Projects/VC2019/jpegicc/jpegicc.vcxproj new file mode 100644 index 0000000000..532e763587 --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/VC2019/jpegicc/jpegicc.vcxproj @@ -0,0 +1,307 @@ + + + + + Debug + ARM64 + + + Debug + Win32 + + + Debug + x64 + + + Release + ARM64 + + + Release + Win32 + + + Release + x64 + + + + {62812507-F926-4968-96A9-17678460AD90} + jpegicc + Win32Proj + 10.0 + + + + Application + Unicode + true + v142 + + + Application + Unicode + true + v142 + + + Application + Unicode + true + v142 + + + Application + Unicode + v142 + + + Application + Unicode + v142 + + + Application + Unicode + v142 + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.21006.1 + ..\..\..\bin\ + ..\..\..\bin\ + ..\..\..\bin\ + $(Configuration)\ + $(Configuration)\ + $(Configuration)\ + true + true + true + ..\..\..\bin\ + ..\..\..\bin\ + ..\..\..\bin\ + $(Configuration)\ + $(Configuration)\ + $(Configuration)\ + false + false + false + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + $(IncludePath);;C:\code\jpeg-9a + $(IncludePath);;C:\code\jpeg-9a + $(IncludePath);;C:\code\jpeg-9a + $(LibraryPath);;C:\code\jpeg-9a + $(LibraryPath);;C:\code\jpeg-9a + $(LibraryPath);;C:\code\jpeg-9a + $(IncludePath);;C:\code\jpeg-9a + $(IncludePath);;C:\code\jpeg-9a + $(IncludePath);;C:\code\jpeg-9a + $(LibraryPath);;C:\code\jpeg-9a + $(LibraryPath);;C:\code\jpeg-9a + $(LibraryPath);;C:\code\jpeg-9a + + + + Disabled + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + EditAndContinue + true + + + libjpeg.lib;%(AdditionalDependencies) + true + Console + MachineX86 + false + + + + + Disabled + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + EditAndContinue + true + + + libjpeg.lib;%(AdditionalDependencies) + true + Console + false + + + + + Disabled + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + ProgramDatabase + true + + + libjpeg.lib;%(AdditionalDependencies) + true + Console + false + + + + + Full + true + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level3 + ProgramDatabase + Speed + true + true + true + false + + + libjpeg.lib;%(AdditionalDependencies) + true + Console + true + true + MachineX86 + false + + + true + + + + + Full + true + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level3 + ProgramDatabase + Speed + true + true + true + false + + + libjpeg.lib;%(AdditionalDependencies) + true + Console + true + true + false + + + true + + + + + Full + true + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level3 + ProgramDatabase + Speed + true + true + true + + + libjpeg.lib;%(AdditionalDependencies) + true + Console + true + true + false + + + + + + + + + + + {71dede59-3f1e-486b-a899-4283000f76b5} + false + + + + + + \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/Projects/VC2019/jpegicc/jpegicc.vcxproj.filters b/local/recipes/libs/lcms2/source/Projects/VC2019/jpegicc/jpegicc.vcxproj.filters new file mode 100644 index 0000000000..a05c36d6d9 --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/VC2019/jpegicc/jpegicc.vcxproj.filters @@ -0,0 +1,31 @@ + + + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/Projects/VC2019/lcms2.rc b/local/recipes/libs/lcms2/source/Projects/VC2019/lcms2.rc new file mode 100644 index 0000000000..4ed298d2c0 --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/VC2019/lcms2.rc @@ -0,0 +1,104 @@ +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#define APSTUDIO_HIDDEN_SYMBOLS +#include "windows.h" +#undef APSTUDIO_HIDDEN_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// Spanish (Spain, International Sort) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ESN) +LANGUAGE LANG_SPANISH, SUBLANG_SPANISH_MODERN +#pragma code_page(1252) + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +1 VERSIONINFO + FILEVERSION 2,17,0,0 + PRODUCTVERSION 2,17,0,0 + FILEFLAGSMASK 0x0L +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904e4" + BEGIN + VALUE "CompanyName", "Marti Maria" + VALUE "FileDescription", "lcms color engine" + VALUE "FileVersion", "2.17.0.0" + VALUE "InternalName", "lcms2" + VALUE "LegalCopyright", "Copyright © Marti Maria 2025" + VALUE "OriginalFilename", "lcms2.dll" + VALUE "ProductName", "LittleCMS color engine" + VALUE "ProductVersion", "2.17.0.0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1252 + END +END + + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#define APSTUDIO_HIDDEN_SYMBOLS\r\n" + "#include ""windows.h""\r\n" + "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + +#endif // Spanish (Spain, International Sort) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/local/recipes/libs/lcms2/source/Projects/VC2019/lcms2.sln b/local/recipes/libs/lcms2/source/Projects/VC2019/lcms2.sln new file mode 100644 index 0000000000000000000000000000000000000000..6a3d35afaa155742ab9ae53de5aabe5ce59a77da GIT binary patch literal 27136 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 U_#B^kJS*h9_XXa)$~F7oKmS3E4gdfE literal 0 HcmV?d00001 diff --git a/local/recipes/libs/lcms2/source/Projects/VC2019/lcms2_DLL/lcms2_DLL.vcxproj b/local/recipes/libs/lcms2/source/Projects/VC2019/lcms2_DLL/lcms2_DLL.vcxproj new file mode 100644 index 0000000000..a6de782abd --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/VC2019/lcms2_DLL/lcms2_DLL.vcxproj @@ -0,0 +1,345 @@ + + + + + Debug + ARM64 + + + Debug + Win32 + + + Debug + x64 + + + Release + ARM64 + + + Release + Win32 + + + Release + x64 + + + + {8C51BE48-ADB8-4089-A9EC-F6BF993A0548} + lcms2_DLL + Win32Proj + 10.0 + + + + DynamicLibrary + Unicode + true + v142 + + + DynamicLibrary + Unicode + true + v142 + + + DynamicLibrary + Unicode + true + v142 + + + DynamicLibrary + Unicode + v142 + + + DynamicLibrary + Unicode + v142 + + + DynamicLibrary + Unicode + v142 + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.21006.1 + ..\..\..\bin\ + ..\..\..\bin\ + ..\..\..\bin\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + true + true + true + ..\..\..\bin\ + ..\..\..\bin\ + ..\..\..\bin\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + false + false + false + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + + + lcms2 + + + lcms2 + + + lcms2 + + + lcms2 + + + lcms2 + + + lcms2 + + + + Disabled + ../../../include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_WINDOWS;_USRDLL;CMS_DLL_BUILD;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + true + false + + + ..\..\..\src\lcms2.def + true + Windows + MachineX86 + + + + + Disabled + ../../../include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_WINDOWS;_USRDLL;CMS_DLL_BUILD;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + true + false + + + ..\..\..\src\lcms2.def + true + Windows + + + + + Disabled + ../../../include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_WINDOWS;_USRDLL;CMS_DLL_BUILD;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + true + false + + + + + true + Windows + $(OutDir)$(TargetName)$(TargetExt) + + + + + Full + true + Speed + true + true + true + ../../../include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_WINDOWS;_USRDLL;CMS_DLL_BUILD;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + MultiThreaded + true + + + Level4 + true + OnlyExplicitInline + true + + + ..\..\..\src\lcms2.def + true + Windows + true + true + MachineX86 + + + true + + + + + Full + true + Speed + true + true + true + ../../../include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_WINDOWS;_USRDLL;CMS_DLL_BUILD;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + MultiThreaded + true + + + Level4 + true + OnlyExplicitInline + true + + + ..\..\..\src\lcms2.def + true + Windows + true + true + + + true + + + + + Full + true + Speed + true + true + true + ../../../include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_WINDOWS;_USRDLL;CMS_DLL_BUILD;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + MultiThreaded + true + + + Level4 + true + OnlyExplicitInline + true + + + + + true + Windows + true + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + true + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/Projects/VC2019/lcms2_DLL/lcms2_DLL.vcxproj.filters b/local/recipes/libs/lcms2/source/Projects/VC2019/lcms2_DLL/lcms2_DLL.vcxproj.filters new file mode 100644 index 0000000000..255a147077 --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/VC2019/lcms2_DLL/lcms2_DLL.vcxproj.filters @@ -0,0 +1,121 @@ + + + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + Source Files + + + Resource Files + + + + + Resource Files + + + + + Source Files + + + \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/Projects/VC2019/lcms2_static/lcms2_static.vcxproj b/local/recipes/libs/lcms2/source/Projects/VC2019/lcms2_static/lcms2_static.vcxproj new file mode 100644 index 0000000000..10a0f7edd9 --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/VC2019/lcms2_static/lcms2_static.vcxproj @@ -0,0 +1,287 @@ + + + + + Debug + ARM64 + + + Debug + Win32 + + + Debug + x64 + + + Release + ARM64 + + + Release + Win32 + + + Release + x64 + + + + {71DEDE59-3F1E-486B-A899-4283000F76B5} + lcms2_static + Win32Proj + 10.0 + + + + StaticLibrary + Unicode + true + v142 + + + StaticLibrary + Unicode + true + v142 + + + StaticLibrary + Unicode + true + v142 + + + StaticLibrary + Unicode + v142 + + + StaticLibrary + Unicode + v142 + + + StaticLibrary + Unicode + v142 + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.21006.1 + ..\..\..\Lib\MS\ + ..\..\..\Lib\MS\ + ..\..\..\Lib\MS\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + ..\..\..\Lib\MS\ + ..\..\..\Lib\MS\ + ..\..\..\Lib\MS\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + + + + Disabled + ../../../include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + true + EnableFastChecks + + + Level4 + EditAndContinue + + + true + MultiThreadedDebugDLL + + + + + Disabled + ../../../include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + true + EnableFastChecks + + + Level4 + EditAndContinue + + + true + MultiThreadedDebugDLL + + + + + Disabled + ../../../include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebug + + + Level4 + ProgramDatabase + + + true + Default + + + + + MaxSpeed + true + ../../../include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + MultiThreaded + true + + + Level4 + ProgramDatabase + Speed + true + false + OnlyExplicitInline + false + true + Precise + false + false + false + + + true + + + + + MaxSpeed + true + ../../../include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + MultiThreaded + true + + + Level4 + ProgramDatabase + Speed + true + false + OnlyExplicitInline + false + true + Precise + false + false + false + + + true + + + + + MaxSpeed + true + ../../../include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + MultiThreaded + true + + + Level4 + ProgramDatabase + Speed + true + true + OnlyExplicitInline + false + true + true + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/Projects/VC2019/lcms2_static/lcms2_static.vcxproj.filters b/local/recipes/libs/lcms2/source/Projects/VC2019/lcms2_static/lcms2_static.vcxproj.filters new file mode 100644 index 0000000000..58d3cb7ee7 --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/VC2019/lcms2_static/lcms2_static.vcxproj.filters @@ -0,0 +1,108 @@ + + + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + Source Files + + + \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/Projects/VC2019/linkicc/linkicc.vcxproj b/local/recipes/libs/lcms2/source/Projects/VC2019/linkicc/linkicc.vcxproj new file mode 100644 index 0000000000..de7a778927 --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/VC2019/linkicc/linkicc.vcxproj @@ -0,0 +1,273 @@ + + + + + Debug + ARM64 + + + Debug + Win32 + + + Debug + x64 + + + Release + ARM64 + + + Release + Win32 + + + Release + x64 + + + + {FBFBE1DC-DB84-4BA1-9552-B4780F457849} + linkicc + Win32Proj + 10.0 + + + + Application + Unicode + true + v142 + + + Application + Unicode + true + v142 + + + Application + Unicode + true + v142 + + + Application + Unicode + v142 + + + Application + Unicode + v142 + + + Application + Unicode + v142 + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.21006.1 + ..\..\..\bin\ + ..\..\..\bin\ + ..\..\..\bin\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + true + true + true + ..\..\..\bin\ + ..\..\..\bin\ + ..\..\..\bin\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + false + false + false + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + + + + Disabled + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDLL + + + Level4 + EditAndContinue + true + + + true + Console + MachineX86 + + + + + Disabled + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDLL + + + Level4 + EditAndContinue + true + + + true + Console + + + + + Disabled + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebug + + + Level4 + ProgramDatabase + true + + + true + Console + + + + + MaxSpeed + true + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Level4 + ProgramDatabase + true + false + MultiThreaded + + + true + Console + true + true + MachineX86 + + + true + + + + + MaxSpeed + true + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Level4 + ProgramDatabase + true + false + MultiThreaded + + + true + Console + true + true + + + true + + + + + MaxSpeed + true + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Level4 + ProgramDatabase + true + MultiThreaded + + + true + Console + true + true + + + + + + + + + + {71dede59-3f1e-486b-a899-4283000f76b5} + false + + + + + + \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/Projects/VC2019/linkicc/linkicc.vcxproj.filters b/local/recipes/libs/lcms2/source/Projects/VC2019/linkicc/linkicc.vcxproj.filters new file mode 100644 index 0000000000..95c77cdbe2 --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/VC2019/linkicc/linkicc.vcxproj.filters @@ -0,0 +1,28 @@ + + + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Source Files + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/Projects/VC2019/psicc/psicc.vcxproj b/local/recipes/libs/lcms2/source/Projects/VC2019/psicc/psicc.vcxproj new file mode 100644 index 0000000000..adc7b30329 --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/VC2019/psicc/psicc.vcxproj @@ -0,0 +1,273 @@ + + + + + Debug + ARM64 + + + Debug + Win32 + + + Debug + x64 + + + Release + ARM64 + + + Release + Win32 + + + Release + x64 + + + + {EF6A8851-65FE-46F5-B9EF-14F0B671F693} + psicc + Win32Proj + 10.0 + + + + Application + Unicode + true + v142 + + + Application + Unicode + true + v142 + + + Application + Unicode + true + v142 + + + Application + Unicode + v142 + + + Application + Unicode + v142 + + + Application + Unicode + v142 + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.21006.1 + ..\..\..\bin\ + ..\..\..\bin\ + ..\..\..\bin\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + true + true + true + ..\..\..\bin\ + ..\..\..\bin\ + ..\..\..\bin\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + false + false + false + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + + + + Disabled + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + EditAndContinue + true + + + true + Console + MachineX86 + + + + + Disabled + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + EditAndContinue + true + + + true + Console + + + + + Disabled + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + ProgramDatabase + true + + + true + Console + + + + + MaxSpeed + true + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreaded + true + + + Level4 + ProgramDatabase + true + false + + + true + Console + true + true + MachineX86 + + + true + + + + + MaxSpeed + true + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreaded + true + + + Level4 + ProgramDatabase + true + false + + + true + Console + true + true + + + true + + + + + MaxSpeed + true + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreaded + true + + + Level4 + ProgramDatabase + true + + + true + Console + true + true + + + + + + + + + + {71dede59-3f1e-486b-a899-4283000f76b5} + false + + + + + + \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/Projects/VC2019/psicc/psicc.vcxproj.filters b/local/recipes/libs/lcms2/source/Projects/VC2019/psicc/psicc.vcxproj.filters new file mode 100644 index 0000000000..c42429d8be --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/VC2019/psicc/psicc.vcxproj.filters @@ -0,0 +1,28 @@ + + + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Source Files + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/Projects/VC2019/resource.h b/local/recipes/libs/lcms2/source/Projects/VC2019/resource.h new file mode 100644 index 0000000000..7655978dd4 --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/VC2019/resource.h @@ -0,0 +1,16 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by lcms2.rc +// + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NO_MFC 1 +#define _APS_NEXT_RESOURCE_VALUE 101 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1000 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/local/recipes/libs/lcms2/source/Projects/VC2019/testbed/testbed.vcxproj b/local/recipes/libs/lcms2/source/Projects/VC2019/testbed/testbed.vcxproj new file mode 100644 index 0000000000..80a2df91c6 --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/VC2019/testbed/testbed.vcxproj @@ -0,0 +1,297 @@ + + + + + Debug + ARM64 + + + Debug + Win32 + + + Debug + x64 + + + Release + ARM64 + + + Release + Win32 + + + Release + x64 + + + + {928A3A2B-46EF-4279-959C-513B3652FF0E} + testbed + Win32Proj + 10.0 + + + + Application + Unicode + true + v142 + + + Application + Unicode + true + v142 + + + Application + Unicode + true + v142 + + + Application + Unicode + v142 + + + Application + Unicode + v142 + + + Application + Unicode + v142 + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.21006.1 + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + true + true + true + ..\..\..\testbed\ + ..\..\..\testbed\ + ..\..\..\testbed\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + false + false + false + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + ..\..\..\testbed\ + ..\..\..\testbed\ + ..\..\..\testbed\ + + + + Disabled + ../../../include;../../../src;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + EditAndContinue + true + + + true + Console + MachineX86 + false + + + + + Disabled + ../../../include;../../../src;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + EditAndContinue + true + + + true + Console + false + + + + + Disabled + ../../../include;../../../src;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebug + + + Level3 + ProgramDatabase + true + + + true + Console + false + + + + + Full + true + Speed + true + false + ../../../include;../../../src;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + false + true + NotSet + + + Level3 + ProgramDatabase + Cdecl + true + false + + + true + Console + true + true + MachineX86 + false + + + true + + + + + Full + true + Speed + true + false + ../../../include;../../../src;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + false + true + NotSet + + + Level3 + ProgramDatabase + Cdecl + true + false + + + true + Console + true + true + false + + + true + + + + + Full + true + Speed + true + true + ../../../include;../../../src;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreaded + false + true + NotSet + + + Level3 + ProgramDatabase + Cdecl + true + + + true + Console + true + true + false + + + + + {71dede59-3f1e-486b-a899-4283000f76b5} + false + + + + + + + + + + + \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/Projects/VC2019/testbed/testbed.vcxproj.filters b/local/recipes/libs/lcms2/source/Projects/VC2019/testbed/testbed.vcxproj.filters new file mode 100644 index 0000000000..993ee15119 --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/VC2019/testbed/testbed.vcxproj.filters @@ -0,0 +1,28 @@ + + + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Source Files + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/Projects/VC2019/tiffdiff/tiffdiff.vcxproj b/local/recipes/libs/lcms2/source/Projects/VC2019/tiffdiff/tiffdiff.vcxproj new file mode 100644 index 0000000000..385b0960fa --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/VC2019/tiffdiff/tiffdiff.vcxproj @@ -0,0 +1,300 @@ + + + + + Debug + ARM64 + + + Debug + Win32 + + + Debug + x64 + + + Release + ARM64 + + + Release + Win32 + + + Release + x64 + + + + {75B91835-CCD7-48BE-A606-A9C997D5DBEE} + tiffdiff + Win32Proj + 10.0 + + + + Application + Unicode + true + v142 + + + Application + Unicode + true + v142 + + + Application + Unicode + true + v142 + + + Application + Unicode + v142 + + + Application + Unicode + v142 + + + Application + Unicode + v142 + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.21006.1 + ..\..\..\bin\ + ..\..\..\bin\ + ..\..\..\bin\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + true + true + true + ..\..\..\bin\ + ..\..\..\bin\ + ..\..\..\bin\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + false + false + false + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + C:\jpeg-8d;$(IncludePath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff + C:\jpeg-8d;$(IncludePath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff + C:\jpeg-8d;$(IncludePath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff + C:\jpeg-8d;$(LibraryPath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff + C:\jpeg-8d;$(LibraryPath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff + C:\jpeg-8d;$(LibraryPath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff + C:\jpeg-8d;$(IncludePath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff + C:\jpeg-8d;$(IncludePath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff + C:\jpeg-8d;$(IncludePath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff + C:\jpeg-8d;$(LibraryPath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff + C:\jpeg-8d;$(LibraryPath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff + C:\jpeg-8d;$(LibraryPath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff + + + + Disabled + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + EditAndContinue + true + + + libtiff.lib;%(AdditionalDependencies) + true + Console + MachineX86 + false + + + + + Disabled + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + EditAndContinue + true + + + libtiff.lib;%(AdditionalDependencies) + true + Console + false + + + + + Disabled + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebug + + + Level4 + ProgramDatabase + true + + + libtiff.lib;%(AdditionalDependencies) + true + Console + false + + + + + MaxSpeed + true + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level4 + ProgramDatabase + true + false + + + libtiff.lib;%(AdditionalDependencies) + true + Console + true + true + MachineX86 + $(OutDir)$(TargetName)$(TargetExt) + false + + + true + + + + + MaxSpeed + true + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level4 + ProgramDatabase + true + false + + + libtiff.lib;%(AdditionalDependencies) + true + Console + true + true + $(OutDir)$(TargetName)$(TargetExt) + false + + + true + + + + + MaxSpeed + true + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level4 + ProgramDatabase + true + + + libtiff.lib;%(AdditionalDependencies) + true + Console + true + true + $(OutDir)$(TargetName)$(TargetExt) + false + + + + + + + + + + {71dede59-3f1e-486b-a899-4283000f76b5} + false + + + + + + \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/Projects/VC2019/tiffdiff/tiffdiff.vcxproj.filters b/local/recipes/libs/lcms2/source/Projects/VC2019/tiffdiff/tiffdiff.vcxproj.filters new file mode 100644 index 0000000000..b7f9a80d10 --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/VC2019/tiffdiff/tiffdiff.vcxproj.filters @@ -0,0 +1,28 @@ + + + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Source Files + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/Projects/VC2019/tifficc/tifficc.vcxproj b/local/recipes/libs/lcms2/source/Projects/VC2019/tifficc/tifficc.vcxproj new file mode 100644 index 0000000000..eec6941173 --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/VC2019/tifficc/tifficc.vcxproj @@ -0,0 +1,300 @@ + + + + + Debug + ARM64 + + + Debug + Win32 + + + Debug + x64 + + + Release + ARM64 + + + Release + Win32 + + + Release + x64 + + + + {2256DE16-ED92-4A6F-9C54-F65BB61E64A2} + tifficc + Win32Proj + 10.0 + + + + Application + Unicode + true + v142 + + + Application + Unicode + true + v142 + + + Application + Unicode + true + v142 + + + Application + Unicode + v142 + + + Application + Unicode + v142 + + + Application + Unicode + v142 + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.21006.1 + ..\..\..\bin\ + ..\..\..\bin\ + ..\..\..\bin\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + true + true + true + ..\..\..\bin\ + ..\..\..\bin\ + ..\..\..\bin\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + false + false + false + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + $(IncludePath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff + $(IncludePath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff + $(IncludePath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff + $(LibraryPath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff + $(LibraryPath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff + $(LibraryPath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff + $(IncludePath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff + $(IncludePath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff + $(IncludePath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff + $(LibraryPath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff + $(LibraryPath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff + $(LibraryPath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff + + + + Disabled + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + EditAndContinue + true + + + libtiff.lib;%(AdditionalDependencies) + true + Console + MachineX86 + false + + + + + Disabled + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + EditAndContinue + true + + + libtiff.lib;%(AdditionalDependencies) + true + Console + false + + + + + Disabled + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + ProgramDatabase + true + + + libtiff.lib;%(AdditionalDependencies) + true + Console + false + + + + + MaxSpeed + true + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level4 + ProgramDatabase + true + false + + + libtiff.lib;%(AdditionalDependencies) + true + Console + true + true + MachineX86 + false + + + true + + + + + MaxSpeed + true + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level4 + ProgramDatabase + true + false + + + libtiff.lib;%(AdditionalDependencies) + true + Console + true + true + false + + + true + + + + + MaxSpeed + true + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level4 + ProgramDatabase + true + + + libtiff.lib;%(AdditionalDependencies) + true + Console + true + true + false + + + + + + + + + + + + + {71dede59-3f1e-486b-a899-4283000f76b5} + false + + + + + + \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/Projects/VC2019/tifficc/tifficc.vcxproj.filters b/local/recipes/libs/lcms2/source/Projects/VC2019/tifficc/tifficc.vcxproj.filters new file mode 100644 index 0000000000..2e0e44d1ea --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/VC2019/tifficc/tifficc.vcxproj.filters @@ -0,0 +1,33 @@ + + + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Source Files + + + Source Files + + + Source Files + + + + + Header Files + + + \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/Projects/VC2019/transicc/transicc.vcxproj b/local/recipes/libs/lcms2/source/Projects/VC2019/transicc/transicc.vcxproj new file mode 100644 index 0000000000..92d4967c89 --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/VC2019/transicc/transicc.vcxproj @@ -0,0 +1,278 @@ + + + + + Debug + ARM64 + + + Debug + Win32 + + + Debug + x64 + + + Release + ARM64 + + + Release + Win32 + + + Release + x64 + + + + {9EE22D66-C849-474C-9ED5-C3E141DAB160} + transicc + Win32Proj + 10.0 + + + + Application + Unicode + true + v142 + + + Application + Unicode + true + v142 + + + Application + Unicode + true + v142 + + + Application + Unicode + v142 + + + Application + Unicode + v142 + + + Application + Unicode + v142 + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.21006.1 + ..\..\..\bin\ + ..\..\..\bin\ + ..\..\..\bin\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + true + true + true + ..\..\..\bin\ + ..\..\..\bin\ + ..\..\..\bin\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + false + false + false + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + + + + Disabled + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + EditAndContinue + true + + + true + Console + MachineX86 + + + + + Disabled + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + EditAndContinue + true + + + true + Console + + + + + Disabled + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + ProgramDatabase + true + + + true + Console + + + + + MaxSpeed + true + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level4 + ProgramDatabase + true + false + + + true + Console + true + true + MachineX86 + + + true + + + + + MaxSpeed + true + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level4 + ProgramDatabase + true + false + + + true + Console + true + true + + + true + + + + + MaxSpeed + true + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreaded + true + + + Level4 + ProgramDatabase + true + + + true + Console + true + true + + + + + false + + + + + + + + + + {71dede59-3f1e-486b-a899-4283000f76b5} + false + + + + + + \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/Projects/VC2019/transicc/transicc.vcxproj.filters b/local/recipes/libs/lcms2/source/Projects/VC2019/transicc/transicc.vcxproj.filters new file mode 100644 index 0000000000..3d45443026 --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/VC2019/transicc/transicc.vcxproj.filters @@ -0,0 +1,33 @@ + + + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Source Files + + + Source Files + + + Source Files + + + + + Header Files + + + \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/Projects/VC2022/fuzzers/fuzzers.vcxproj b/local/recipes/libs/lcms2/source/Projects/VC2022/fuzzers/fuzzers.vcxproj new file mode 100644 index 0000000000..2c10e6ac21 --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/VC2022/fuzzers/fuzzers.vcxproj @@ -0,0 +1,168 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 17.0 + Win32Proj + {32e8c094-1d6b-4959-90ad-9a443df4ae9a} + fuzzers + 10.0 + + + + Application + true + v143 + Unicode + true + true + + + Application + false + v143 + true + Unicode + true + true + + + Application + true + v143 + Unicode + true + true + + + Application + false + v143 + true + Unicode + true + true + + + + + + + + + + + + + + + + + + + + + ..\..\..\fuzzers\ + ../../../include;$(IncludePath) + $(Configuration)_$(Platform)\ + + + ..\..\..\fuzzers\ + ../../../include;$(IncludePath) + $(Configuration)_$(Platform)\ + + + ..\..\..\fuzzers\ + ../../../include;$(IncludePath) + $(Configuration)_$(Platform)\ + + + ..\..\..\fuzzers\ + ../../../include;$(IncludePath) + $(Configuration)_$(Platform)\ + + + + Level3 + true + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Level3 + true + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + Level3 + true + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Level3 + true + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + + + + {71dede59-3f1e-486b-a899-4283000f76b5} + + + + + + \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/Projects/VC2022/fuzzers/fuzzers.vcxproj.filters b/local/recipes/libs/lcms2/source/Projects/VC2022/fuzzers/fuzzers.vcxproj.filters new file mode 100644 index 0000000000..b0cec15f19 --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/VC2022/fuzzers/fuzzers.vcxproj.filters @@ -0,0 +1,22 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Source Files + + + \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/Projects/VC2022/jpegicc/jpegicc.vcxproj b/local/recipes/libs/lcms2/source/Projects/VC2022/jpegicc/jpegicc.vcxproj new file mode 100644 index 0000000000..c4d7866fc6 --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/VC2022/jpegicc/jpegicc.vcxproj @@ -0,0 +1,307 @@ + + + + + Debug + ARM64 + + + Debug + Win32 + + + Debug + x64 + + + Release + ARM64 + + + Release + Win32 + + + Release + x64 + + + + {62812507-F926-4968-96A9-17678460AD90} + jpegicc + Win32Proj + 10.0 + + + + Application + Unicode + true + v143 + + + Application + Unicode + true + v143 + + + Application + Unicode + true + v143 + + + Application + Unicode + v143 + + + Application + Unicode + v143 + + + Application + Unicode + v143 + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.21006.1 + ..\..\..\bin\ + ..\..\..\bin\ + ..\..\..\bin\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + true + true + true + ..\..\..\bin\ + ..\..\..\bin\ + ..\..\..\bin\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + false + false + false + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + $(IncludePath);;C:\code\jpeg-9a + $(IncludePath);;C:\code\jpeg-9a + $(IncludePath);;C:\code\jpeg-9a + $(LibraryPath);;C:\code\jpeg-9a + $(LibraryPath);;C:\code\jpeg-9a + $(LibraryPath);;C:\code\jpeg-9a + $(IncludePath);;C:\code\jpeg-9a + $(IncludePath);;C:\code\jpeg-9a + $(IncludePath);;C:\code\jpeg-9a + $(LibraryPath);;C:\code\jpeg-9a + $(LibraryPath);;C:\code\jpeg-9a + $(LibraryPath);;C:\code\jpeg-9a + + + + Disabled + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + EditAndContinue + true + + + libjpeg.lib;%(AdditionalDependencies) + true + Console + MachineX86 + false + + + + + Disabled + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + EditAndContinue + true + + + libjpeg.lib;%(AdditionalDependencies) + true + Console + false + + + + + Disabled + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + ProgramDatabase + true + + + libjpeg.lib;%(AdditionalDependencies) + true + Console + false + + + + + Full + true + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level3 + ProgramDatabase + Speed + true + true + true + false + + + libjpeg.lib;%(AdditionalDependencies) + true + Console + true + true + MachineX86 + false + + + true + + + + + Full + true + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level3 + ProgramDatabase + Speed + true + true + true + false + + + libjpeg.lib;%(AdditionalDependencies) + true + Console + true + true + false + + + true + + + + + Full + true + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level3 + ProgramDatabase + Speed + true + true + true + + + libjpeg.lib;%(AdditionalDependencies) + true + Console + true + true + false + + + + + + + + + + + {71dede59-3f1e-486b-a899-4283000f76b5} + false + + + + + + \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/Projects/VC2022/jpegicc/jpegicc.vcxproj.filters b/local/recipes/libs/lcms2/source/Projects/VC2022/jpegicc/jpegicc.vcxproj.filters new file mode 100644 index 0000000000..a05c36d6d9 --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/VC2022/jpegicc/jpegicc.vcxproj.filters @@ -0,0 +1,31 @@ + + + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/Projects/VC2022/lcms2.rc b/local/recipes/libs/lcms2/source/Projects/VC2022/lcms2.rc new file mode 100644 index 0000000000..9bdd53dd6b --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/VC2022/lcms2.rc @@ -0,0 +1,104 @@ +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#define APSTUDIO_HIDDEN_SYMBOLS +#include "windows.h" +#undef APSTUDIO_HIDDEN_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// Spanish (Spain, International Sort) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ESN) +LANGUAGE LANG_SPANISH, SUBLANG_SPANISH_MODERN +#pragma code_page(1252) + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +1 VERSIONINFO + FILEVERSION 2,19,0,0 + PRODUCTVERSION 2,19,0,0 + FILEFLAGSMASK 0x0L +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904e4" + BEGIN + VALUE "CompanyName", "Marti Maria" + VALUE "FileDescription", "lcms color engine" + VALUE "FileVersion", "2.19.0.0" + VALUE "InternalName", "lcms2" + VALUE "LegalCopyright", "Copyright © Marti Maria 2026" + VALUE "OriginalFilename", "lcms2.dll" + VALUE "ProductName", "LittleCMS color engine" + VALUE "ProductVersion", "2.19.0.0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1252 + END +END + + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#define APSTUDIO_HIDDEN_SYMBOLS\r\n" + "#include ""windows.h""\r\n" + "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + +#endif // Spanish (Spain, International Sort) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/local/recipes/libs/lcms2/source/Projects/VC2022/lcms2.sln b/local/recipes/libs/lcms2/source/Projects/VC2022/lcms2.sln new file mode 100644 index 0000000000..177f32e795 --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/VC2022/lcms2.sln @@ -0,0 +1,238 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.32014.148 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testbed", "testbed\testbed.vcxproj", "{928A3A2B-46EF-4279-959C-513B3652FF0E}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tifficc", "tifficc\tifficc.vcxproj", "{2256DE16-ED92-4A6F-9C54-F65BB61E64A2}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lcms2_DLL", "lcms2_DLL\lcms2_DLL.vcxproj", "{8C51BE48-ADB8-4089-A9EC-F6BF993A0548}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "linkicc", "linkicc\linkicc.vcxproj", "{FBFBE1DC-DB84-4BA1-9552-B4780F457849}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "transicc", "transicc\transicc.vcxproj", "{9EE22D66-C849-474C-9ED5-C3E141DAB160}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "jpegicc", "jpegicc\jpegicc.vcxproj", "{62812507-F926-4968-96A9-17678460AD90}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tiffdiff", "tiffdiff\tiffdiff.vcxproj", "{75B91835-CCD7-48BE-A606-A9C997D5DBEE}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lcms2_static", "lcms2_static\lcms2_static.vcxproj", "{71DEDE59-3F1E-486B-A899-4283000F76B5}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "psicc", "psicc\psicc.vcxproj", "{EF6A8851-65FE-46F5-B9EF-14F0B671F693}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "plugins", "plugins", "{8349DD7F-F750-4910-A5A5-0628223BD3EB}" + ProjectSection(SolutionItems) = preProject + ..\..\plugins\README.1ST = ..\..\plugins\README.1ST + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "fast_float", "fast_float", "{1696CDC1-F411-4F84-BC94-C63FEB867D06}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lcms2_fast_float_plugin", "..\..\plugins\fast_float\Projects\VC2022\lcms2_fast_float_plugin.vcxproj", "{AD9FF79B-CF6E-4971-A7CF-DAA47D636676}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lcms2_fast_float_plugin_testbed", "..\..\plugins\fast_float\Projects\VC2022\lcms2_fast_float_plugin_testbed.vcxproj", "{7629D670-C419-402B-8A90-747952EE9FC0}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lcms2_threaded_plugin", "..\..\plugins\threaded\Projects\VC2022\lcms2_threaded_plugin.vcxproj", "{6A44744B-BED4-49EC-87BB-83978458CE19}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "threaded", "threaded", "{09D18587-D927-4047-977F-49918A174D5E}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lcms2_threaded_plugin_testbed", "..\..\plugins\threaded\Projects\VC2022\lcms2_threaded_plugin_testbed.vcxproj", "{F56B9CBA-A34D-4C68-9003-A6919236399E}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fuzzers", "fuzzers\fuzzers.vcxproj", "{32E8C094-1D6B-4959-90AD-9A443DF4AE9A}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|ARM64 = Debug|ARM64 + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|ARM64 = Release|ARM64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {928A3A2B-46EF-4279-959C-513B3652FF0E}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {928A3A2B-46EF-4279-959C-513B3652FF0E}.Debug|ARM64.Build.0 = Debug|ARM64 + {928A3A2B-46EF-4279-959C-513B3652FF0E}.Debug|Win32.ActiveCfg = Debug|Win32 + {928A3A2B-46EF-4279-959C-513B3652FF0E}.Debug|Win32.Build.0 = Debug|Win32 + {928A3A2B-46EF-4279-959C-513B3652FF0E}.Debug|x64.ActiveCfg = Debug|x64 + {928A3A2B-46EF-4279-959C-513B3652FF0E}.Debug|x64.Build.0 = Debug|x64 + {928A3A2B-46EF-4279-959C-513B3652FF0E}.Release|ARM64.ActiveCfg = Release|ARM64 + {928A3A2B-46EF-4279-959C-513B3652FF0E}.Release|ARM64.Build.0 = Release|ARM64 + {928A3A2B-46EF-4279-959C-513B3652FF0E}.Release|Win32.ActiveCfg = Release|Win32 + {928A3A2B-46EF-4279-959C-513B3652FF0E}.Release|Win32.Build.0 = Release|Win32 + {928A3A2B-46EF-4279-959C-513B3652FF0E}.Release|x64.ActiveCfg = Release|x64 + {928A3A2B-46EF-4279-959C-513B3652FF0E}.Release|x64.Build.0 = Release|x64 + {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Debug|ARM64.Build.0 = Debug|ARM64 + {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Debug|Win32.ActiveCfg = Debug|Win32 + {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Debug|Win32.Build.0 = Debug|Win32 + {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Debug|x64.ActiveCfg = Debug|x64 + {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Debug|x64.Build.0 = Debug|x64 + {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Release|ARM64.ActiveCfg = Release|ARM64 + {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Release|ARM64.Build.0 = Release|ARM64 + {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Release|Win32.ActiveCfg = Release|Win32 + {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Release|Win32.Build.0 = Release|Win32 + {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Release|x64.ActiveCfg = Release|x64 + {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Release|x64.Build.0 = Release|x64 + {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Debug|ARM64.Build.0 = Debug|ARM64 + {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Debug|Win32.ActiveCfg = Debug|Win32 + {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Debug|Win32.Build.0 = Debug|Win32 + {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Debug|x64.ActiveCfg = Debug|x64 + {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Debug|x64.Build.0 = Debug|x64 + {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Release|ARM64.ActiveCfg = Release|ARM64 + {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Release|ARM64.Build.0 = Release|ARM64 + {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Release|Win32.ActiveCfg = Release|Win32 + {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Release|Win32.Build.0 = Release|Win32 + {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Release|x64.ActiveCfg = Release|x64 + {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Release|x64.Build.0 = Release|x64 + {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Debug|ARM64.Build.0 = Debug|ARM64 + {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Debug|Win32.ActiveCfg = Debug|Win32 + {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Debug|Win32.Build.0 = Debug|Win32 + {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Debug|x64.ActiveCfg = Debug|x64 + {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Debug|x64.Build.0 = Debug|x64 + {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Release|ARM64.ActiveCfg = Release|ARM64 + {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Release|ARM64.Build.0 = Release|ARM64 + {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Release|Win32.ActiveCfg = Release|Win32 + {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Release|Win32.Build.0 = Release|Win32 + {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Release|x64.ActiveCfg = Release|x64 + {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Release|x64.Build.0 = Release|x64 + {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Debug|ARM64.Build.0 = Debug|ARM64 + {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Debug|Win32.ActiveCfg = Debug|Win32 + {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Debug|Win32.Build.0 = Debug|Win32 + {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Debug|x64.ActiveCfg = Debug|x64 + {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Debug|x64.Build.0 = Debug|x64 + {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Release|ARM64.ActiveCfg = Release|ARM64 + {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Release|ARM64.Build.0 = Release|ARM64 + {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Release|Win32.ActiveCfg = Release|Win32 + {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Release|Win32.Build.0 = Release|Win32 + {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Release|x64.ActiveCfg = Release|x64 + {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Release|x64.Build.0 = Release|x64 + {62812507-F926-4968-96A9-17678460AD90}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {62812507-F926-4968-96A9-17678460AD90}.Debug|ARM64.Build.0 = Debug|ARM64 + {62812507-F926-4968-96A9-17678460AD90}.Debug|Win32.ActiveCfg = Debug|Win32 + {62812507-F926-4968-96A9-17678460AD90}.Debug|Win32.Build.0 = Debug|Win32 + {62812507-F926-4968-96A9-17678460AD90}.Debug|x64.ActiveCfg = Debug|x64 + {62812507-F926-4968-96A9-17678460AD90}.Debug|x64.Build.0 = Debug|x64 + {62812507-F926-4968-96A9-17678460AD90}.Release|ARM64.ActiveCfg = Release|ARM64 + {62812507-F926-4968-96A9-17678460AD90}.Release|ARM64.Build.0 = Release|ARM64 + {62812507-F926-4968-96A9-17678460AD90}.Release|Win32.ActiveCfg = Release|Win32 + {62812507-F926-4968-96A9-17678460AD90}.Release|Win32.Build.0 = Release|Win32 + {62812507-F926-4968-96A9-17678460AD90}.Release|x64.ActiveCfg = Release|x64 + {62812507-F926-4968-96A9-17678460AD90}.Release|x64.Build.0 = Release|x64 + {62812507-F926-4968-96A9-17678460AD90}.Release|x64.Deploy.0 = Release|x64 + {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Debug|ARM64.Build.0 = Debug|ARM64 + {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Debug|Win32.ActiveCfg = Debug|Win32 + {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Debug|Win32.Build.0 = Debug|Win32 + {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Debug|x64.ActiveCfg = Debug|x64 + {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Debug|x64.Build.0 = Debug|x64 + {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Release|ARM64.ActiveCfg = Release|ARM64 + {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Release|ARM64.Build.0 = Release|ARM64 + {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Release|Win32.ActiveCfg = Release|Win32 + {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Release|Win32.Build.0 = Release|Win32 + {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Release|x64.ActiveCfg = Release|x64 + {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Release|x64.Build.0 = Release|x64 + {71DEDE59-3F1E-486B-A899-4283000F76B5}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {71DEDE59-3F1E-486B-A899-4283000F76B5}.Debug|ARM64.Build.0 = Debug|ARM64 + {71DEDE59-3F1E-486B-A899-4283000F76B5}.Debug|Win32.ActiveCfg = Debug|Win32 + {71DEDE59-3F1E-486B-A899-4283000F76B5}.Debug|Win32.Build.0 = Debug|Win32 + {71DEDE59-3F1E-486B-A899-4283000F76B5}.Debug|x64.ActiveCfg = Debug|x64 + {71DEDE59-3F1E-486B-A899-4283000F76B5}.Debug|x64.Build.0 = Debug|x64 + {71DEDE59-3F1E-486B-A899-4283000F76B5}.Release|ARM64.ActiveCfg = Release|ARM64 + {71DEDE59-3F1E-486B-A899-4283000F76B5}.Release|ARM64.Build.0 = Release|ARM64 + {71DEDE59-3F1E-486B-A899-4283000F76B5}.Release|Win32.ActiveCfg = Release|Win32 + {71DEDE59-3F1E-486B-A899-4283000F76B5}.Release|Win32.Build.0 = Release|Win32 + {71DEDE59-3F1E-486B-A899-4283000F76B5}.Release|x64.ActiveCfg = Release|x64 + {71DEDE59-3F1E-486B-A899-4283000F76B5}.Release|x64.Build.0 = Release|x64 + {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Debug|ARM64.Build.0 = Debug|ARM64 + {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Debug|Win32.ActiveCfg = Debug|Win32 + {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Debug|Win32.Build.0 = Debug|Win32 + {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Debug|x64.ActiveCfg = Debug|x64 + {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Debug|x64.Build.0 = Debug|x64 + {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Release|ARM64.ActiveCfg = Release|ARM64 + {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Release|ARM64.Build.0 = Release|ARM64 + {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Release|Win32.ActiveCfg = Release|Win32 + {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Release|Win32.Build.0 = Release|Win32 + {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Release|x64.ActiveCfg = Release|x64 + {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Release|x64.Build.0 = Release|x64 + {AD9FF79B-CF6E-4971-A7CF-DAA47D636676}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {AD9FF79B-CF6E-4971-A7CF-DAA47D636676}.Debug|ARM64.Build.0 = Debug|ARM64 + {AD9FF79B-CF6E-4971-A7CF-DAA47D636676}.Debug|Win32.ActiveCfg = Debug|Win32 + {AD9FF79B-CF6E-4971-A7CF-DAA47D636676}.Debug|Win32.Build.0 = Debug|Win32 + {AD9FF79B-CF6E-4971-A7CF-DAA47D636676}.Debug|x64.ActiveCfg = Debug|x64 + {AD9FF79B-CF6E-4971-A7CF-DAA47D636676}.Debug|x64.Build.0 = Debug|x64 + {AD9FF79B-CF6E-4971-A7CF-DAA47D636676}.Release|ARM64.ActiveCfg = Release|ARM64 + {AD9FF79B-CF6E-4971-A7CF-DAA47D636676}.Release|ARM64.Build.0 = Release|ARM64 + {AD9FF79B-CF6E-4971-A7CF-DAA47D636676}.Release|Win32.ActiveCfg = Release|Win32 + {AD9FF79B-CF6E-4971-A7CF-DAA47D636676}.Release|Win32.Build.0 = Release|Win32 + {AD9FF79B-CF6E-4971-A7CF-DAA47D636676}.Release|x64.ActiveCfg = Release|x64 + {AD9FF79B-CF6E-4971-A7CF-DAA47D636676}.Release|x64.Build.0 = Release|x64 + {7629D670-C419-402B-8A90-747952EE9FC0}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {7629D670-C419-402B-8A90-747952EE9FC0}.Debug|ARM64.Build.0 = Debug|ARM64 + {7629D670-C419-402B-8A90-747952EE9FC0}.Debug|Win32.ActiveCfg = Debug|Win32 + {7629D670-C419-402B-8A90-747952EE9FC0}.Debug|Win32.Build.0 = Debug|Win32 + {7629D670-C419-402B-8A90-747952EE9FC0}.Debug|x64.ActiveCfg = Debug|x64 + {7629D670-C419-402B-8A90-747952EE9FC0}.Debug|x64.Build.0 = Debug|x64 + {7629D670-C419-402B-8A90-747952EE9FC0}.Release|ARM64.ActiveCfg = Release|ARM64 + {7629D670-C419-402B-8A90-747952EE9FC0}.Release|ARM64.Build.0 = Release|ARM64 + {7629D670-C419-402B-8A90-747952EE9FC0}.Release|Win32.ActiveCfg = Release|Win32 + {7629D670-C419-402B-8A90-747952EE9FC0}.Release|Win32.Build.0 = Release|Win32 + {7629D670-C419-402B-8A90-747952EE9FC0}.Release|x64.ActiveCfg = Release|x64 + {7629D670-C419-402B-8A90-747952EE9FC0}.Release|x64.Build.0 = Release|x64 + {6A44744B-BED4-49EC-87BB-83978458CE19}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {6A44744B-BED4-49EC-87BB-83978458CE19}.Debug|ARM64.Build.0 = Debug|ARM64 + {6A44744B-BED4-49EC-87BB-83978458CE19}.Debug|Win32.ActiveCfg = Debug|Win32 + {6A44744B-BED4-49EC-87BB-83978458CE19}.Debug|Win32.Build.0 = Debug|Win32 + {6A44744B-BED4-49EC-87BB-83978458CE19}.Debug|x64.ActiveCfg = Debug|x64 + {6A44744B-BED4-49EC-87BB-83978458CE19}.Debug|x64.Build.0 = Debug|x64 + {6A44744B-BED4-49EC-87BB-83978458CE19}.Release|ARM64.ActiveCfg = Release|ARM64 + {6A44744B-BED4-49EC-87BB-83978458CE19}.Release|ARM64.Build.0 = Release|ARM64 + {6A44744B-BED4-49EC-87BB-83978458CE19}.Release|Win32.ActiveCfg = Release|Win32 + {6A44744B-BED4-49EC-87BB-83978458CE19}.Release|Win32.Build.0 = Release|Win32 + {6A44744B-BED4-49EC-87BB-83978458CE19}.Release|x64.ActiveCfg = Release|x64 + {6A44744B-BED4-49EC-87BB-83978458CE19}.Release|x64.Build.0 = Release|x64 + {F56B9CBA-A34D-4C68-9003-A6919236399E}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {F56B9CBA-A34D-4C68-9003-A6919236399E}.Debug|ARM64.Build.0 = Debug|ARM64 + {F56B9CBA-A34D-4C68-9003-A6919236399E}.Debug|Win32.ActiveCfg = Debug|Win32 + {F56B9CBA-A34D-4C68-9003-A6919236399E}.Debug|Win32.Build.0 = Debug|Win32 + {F56B9CBA-A34D-4C68-9003-A6919236399E}.Debug|x64.ActiveCfg = Debug|x64 + {F56B9CBA-A34D-4C68-9003-A6919236399E}.Debug|x64.Build.0 = Debug|x64 + {F56B9CBA-A34D-4C68-9003-A6919236399E}.Release|ARM64.ActiveCfg = Release|ARM64 + {F56B9CBA-A34D-4C68-9003-A6919236399E}.Release|ARM64.Build.0 = Release|ARM64 + {F56B9CBA-A34D-4C68-9003-A6919236399E}.Release|Win32.ActiveCfg = Release|Win32 + {F56B9CBA-A34D-4C68-9003-A6919236399E}.Release|Win32.Build.0 = Release|Win32 + {F56B9CBA-A34D-4C68-9003-A6919236399E}.Release|x64.ActiveCfg = Release|x64 + {F56B9CBA-A34D-4C68-9003-A6919236399E}.Release|x64.Build.0 = Release|x64 + {32E8C094-1D6B-4959-90AD-9A443DF4AE9A}.Debug|ARM64.ActiveCfg = Debug|x64 + {32E8C094-1D6B-4959-90AD-9A443DF4AE9A}.Debug|ARM64.Build.0 = Debug|x64 + {32E8C094-1D6B-4959-90AD-9A443DF4AE9A}.Debug|Win32.ActiveCfg = Debug|Win32 + {32E8C094-1D6B-4959-90AD-9A443DF4AE9A}.Debug|Win32.Build.0 = Debug|Win32 + {32E8C094-1D6B-4959-90AD-9A443DF4AE9A}.Debug|x64.ActiveCfg = Debug|x64 + {32E8C094-1D6B-4959-90AD-9A443DF4AE9A}.Debug|x64.Build.0 = Debug|x64 + {32E8C094-1D6B-4959-90AD-9A443DF4AE9A}.Release|ARM64.ActiveCfg = Release|x64 + {32E8C094-1D6B-4959-90AD-9A443DF4AE9A}.Release|ARM64.Build.0 = Release|x64 + {32E8C094-1D6B-4959-90AD-9A443DF4AE9A}.Release|Win32.ActiveCfg = Release|Win32 + {32E8C094-1D6B-4959-90AD-9A443DF4AE9A}.Release|Win32.Build.0 = Release|Win32 + {32E8C094-1D6B-4959-90AD-9A443DF4AE9A}.Release|x64.ActiveCfg = Release|x64 + {32E8C094-1D6B-4959-90AD-9A443DF4AE9A}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {1696CDC1-F411-4F84-BC94-C63FEB867D06} = {8349DD7F-F750-4910-A5A5-0628223BD3EB} + {AD9FF79B-CF6E-4971-A7CF-DAA47D636676} = {1696CDC1-F411-4F84-BC94-C63FEB867D06} + {7629D670-C419-402B-8A90-747952EE9FC0} = {1696CDC1-F411-4F84-BC94-C63FEB867D06} + {6A44744B-BED4-49EC-87BB-83978458CE19} = {09D18587-D927-4047-977F-49918A174D5E} + {09D18587-D927-4047-977F-49918A174D5E} = {8349DD7F-F750-4910-A5A5-0628223BD3EB} + {F56B9CBA-A34D-4C68-9003-A6919236399E} = {09D18587-D927-4047-977F-49918A174D5E} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + QtVersion = $(DefaultQtVersion) + SolutionGuid = {E95EA102-6884-4CAD-AF6D-9BF36C69A33D} + EndGlobalSection +EndGlobal diff --git a/local/recipes/libs/lcms2/source/Projects/VC2022/lcms2_DLL/lcms2_DLL.vcxproj b/local/recipes/libs/lcms2/source/Projects/VC2022/lcms2_DLL/lcms2_DLL.vcxproj new file mode 100644 index 0000000000..711b169bf9 --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/VC2022/lcms2_DLL/lcms2_DLL.vcxproj @@ -0,0 +1,345 @@ + + + + + Debug + ARM64 + + + Debug + Win32 + + + Debug + x64 + + + Release + ARM64 + + + Release + Win32 + + + Release + x64 + + + + {8C51BE48-ADB8-4089-A9EC-F6BF993A0548} + lcms2_DLL + Win32Proj + 10.0 + + + + DynamicLibrary + Unicode + true + v143 + + + DynamicLibrary + Unicode + true + v143 + + + DynamicLibrary + Unicode + true + v143 + + + DynamicLibrary + Unicode + v143 + + + DynamicLibrary + Unicode + v143 + + + DynamicLibrary + Unicode + v143 + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.21006.1 + ..\..\..\bin\ + ..\..\..\bin\ + ..\..\..\bin\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + true + true + true + ..\..\..\bin\ + ..\..\..\bin\ + ..\..\..\bin\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + false + false + false + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + + + lcms2 + + + lcms2 + + + lcms2 + + + lcms2 + + + lcms2 + + + lcms2 + + + + Disabled + ../../../include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_WINDOWS;_USRDLL;CMS_DLL_BUILD;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + true + false + + + ..\..\..\src\lcms2.def + true + Windows + MachineX86 + + + + + Disabled + ../../../include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_WINDOWS;_USRDLL;CMS_DLL_BUILD;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + true + false + + + ..\..\..\src\lcms2.def + true + Windows + + + + + Disabled + ../../../include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_WINDOWS;_USRDLL;CMS_DLL_BUILD;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + true + false + + + + + true + Windows + $(OutDir)$(TargetName)$(TargetExt) + + + + + Full + true + Speed + true + true + true + ../../../include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_WINDOWS;_USRDLL;CMS_DLL_BUILD;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + MultiThreaded + true + + + Level4 + true + OnlyExplicitInline + true + + + ..\..\..\src\lcms2.def + true + Windows + true + true + MachineX86 + + + true + + + + + Full + true + Speed + true + true + true + ../../../include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_WINDOWS;_USRDLL;CMS_DLL_BUILD;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + MultiThreaded + true + + + Level4 + true + OnlyExplicitInline + true + + + ..\..\..\src\lcms2.def + true + Windows + true + true + + + true + + + + + Full + true + Speed + true + true + true + ../../../include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_WINDOWS;_USRDLL;CMS_DLL_BUILD;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + MultiThreaded + true + + + Level4 + true + OnlyExplicitInline + true + + + + + true + Windows + true + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + true + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/Projects/VC2022/lcms2_DLL/lcms2_DLL.vcxproj.filters b/local/recipes/libs/lcms2/source/Projects/VC2022/lcms2_DLL/lcms2_DLL.vcxproj.filters new file mode 100644 index 0000000000..255a147077 --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/VC2022/lcms2_DLL/lcms2_DLL.vcxproj.filters @@ -0,0 +1,121 @@ + + + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + Source Files + + + Resource Files + + + + + Resource Files + + + + + Source Files + + + \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/Projects/VC2022/lcms2_static/lcms2_static.vcxproj b/local/recipes/libs/lcms2/source/Projects/VC2022/lcms2_static/lcms2_static.vcxproj new file mode 100644 index 0000000000..ee46d605a5 --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/VC2022/lcms2_static/lcms2_static.vcxproj @@ -0,0 +1,287 @@ + + + + + Debug + ARM64 + + + Debug + Win32 + + + Debug + x64 + + + Release + ARM64 + + + Release + Win32 + + + Release + x64 + + + + {71DEDE59-3F1E-486B-A899-4283000F76B5} + lcms2_static + Win32Proj + 10.0 + + + + StaticLibrary + Unicode + true + v143 + + + StaticLibrary + Unicode + true + v143 + + + StaticLibrary + Unicode + true + v143 + + + StaticLibrary + Unicode + v143 + + + StaticLibrary + Unicode + v143 + + + StaticLibrary + Unicode + v143 + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.21006.1 + ..\..\..\Lib\MS\ + ..\..\..\Lib\MS\ + ..\..\..\Lib\MS\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + ..\..\..\Lib\MS\ + ..\..\..\Lib\MS\ + ..\..\..\Lib\MS\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + + + + Disabled + ../../../include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + true + EnableFastChecks + + + Level4 + EditAndContinue + + + true + MultiThreadedDebugDLL + + + + + Disabled + ../../../include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + true + EnableFastChecks + + + Level4 + EditAndContinue + + + true + MultiThreadedDebugDLL + + + + + Disabled + ../../../include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebug + + + Level4 + ProgramDatabase + + + true + Default + + + + + MaxSpeed + true + ../../../include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + MultiThreaded + true + + + Level4 + ProgramDatabase + Speed + true + false + OnlyExplicitInline + false + true + Precise + false + false + false + + + true + + + + + MaxSpeed + true + ../../../include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + MultiThreaded + true + + + Level4 + ProgramDatabase + Speed + true + false + OnlyExplicitInline + false + true + Precise + false + false + false + + + true + + + + + MaxSpeed + true + ../../../include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + MultiThreaded + true + + + Level4 + ProgramDatabase + Speed + true + true + OnlyExplicitInline + false + true + true + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/Projects/VC2022/lcms2_static/lcms2_static.vcxproj.filters b/local/recipes/libs/lcms2/source/Projects/VC2022/lcms2_static/lcms2_static.vcxproj.filters new file mode 100644 index 0000000000..58d3cb7ee7 --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/VC2022/lcms2_static/lcms2_static.vcxproj.filters @@ -0,0 +1,108 @@ + + + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + Source Files + + + \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/Projects/VC2022/linkicc/linkicc.vcxproj b/local/recipes/libs/lcms2/source/Projects/VC2022/linkicc/linkicc.vcxproj new file mode 100644 index 0000000000..0eec3f6fb5 --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/VC2022/linkicc/linkicc.vcxproj @@ -0,0 +1,273 @@ + + + + + Debug + ARM64 + + + Debug + Win32 + + + Debug + x64 + + + Release + ARM64 + + + Release + Win32 + + + Release + x64 + + + + {FBFBE1DC-DB84-4BA1-9552-B4780F457849} + linkicc + Win32Proj + 10.0 + + + + Application + Unicode + true + v143 + + + Application + Unicode + true + v143 + + + Application + Unicode + true + v143 + + + Application + Unicode + v143 + + + Application + Unicode + v143 + + + Application + Unicode + v143 + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.21006.1 + ..\..\..\bin\ + ..\..\..\bin\ + ..\..\..\bin\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + true + true + true + ..\..\..\bin\ + ..\..\..\bin\ + ..\..\..\bin\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + false + false + false + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + + + + Disabled + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDLL + + + Level4 + EditAndContinue + true + + + true + Console + MachineX86 + + + + + Disabled + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDLL + + + Level4 + EditAndContinue + true + + + true + Console + + + + + Disabled + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebug + + + Level4 + ProgramDatabase + true + + + true + Console + + + + + MaxSpeed + true + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Level4 + ProgramDatabase + true + false + MultiThreaded + + + true + Console + true + true + MachineX86 + + + true + + + + + MaxSpeed + true + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Level4 + ProgramDatabase + true + false + MultiThreaded + + + true + Console + true + true + + + true + + + + + MaxSpeed + true + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Level4 + ProgramDatabase + true + MultiThreaded + + + true + Console + true + true + + + + + + + + + + {71dede59-3f1e-486b-a899-4283000f76b5} + false + + + + + + \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/Projects/VC2022/linkicc/linkicc.vcxproj.filters b/local/recipes/libs/lcms2/source/Projects/VC2022/linkicc/linkicc.vcxproj.filters new file mode 100644 index 0000000000..95c77cdbe2 --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/VC2022/linkicc/linkicc.vcxproj.filters @@ -0,0 +1,28 @@ + + + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Source Files + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/Projects/VC2022/psicc/psicc.vcxproj b/local/recipes/libs/lcms2/source/Projects/VC2022/psicc/psicc.vcxproj new file mode 100644 index 0000000000..316f10d600 --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/VC2022/psicc/psicc.vcxproj @@ -0,0 +1,273 @@ + + + + + Debug + ARM64 + + + Debug + Win32 + + + Debug + x64 + + + Release + ARM64 + + + Release + Win32 + + + Release + x64 + + + + {EF6A8851-65FE-46F5-B9EF-14F0B671F693} + psicc + Win32Proj + 10.0 + + + + Application + Unicode + true + v143 + + + Application + Unicode + true + v143 + + + Application + Unicode + true + v143 + + + Application + Unicode + v143 + + + Application + Unicode + v143 + + + Application + Unicode + v143 + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.21006.1 + ..\..\..\bin\ + ..\..\..\bin\ + ..\..\..\bin\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + true + true + true + ..\..\..\bin\ + ..\..\..\bin\ + ..\..\..\bin\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + false + false + false + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + + + + Disabled + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + EditAndContinue + true + + + true + Console + MachineX86 + + + + + Disabled + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + EditAndContinue + true + + + true + Console + + + + + Disabled + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + ProgramDatabase + true + + + true + Console + + + + + MaxSpeed + true + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreaded + true + + + Level4 + ProgramDatabase + true + false + + + true + Console + true + true + MachineX86 + + + true + + + + + MaxSpeed + true + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreaded + true + + + Level4 + ProgramDatabase + true + false + + + true + Console + true + true + + + true + + + + + MaxSpeed + true + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreaded + true + + + Level4 + ProgramDatabase + true + + + true + Console + true + true + + + + + + + + + + {71dede59-3f1e-486b-a899-4283000f76b5} + false + + + + + + \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/Projects/VC2022/psicc/psicc.vcxproj.filters b/local/recipes/libs/lcms2/source/Projects/VC2022/psicc/psicc.vcxproj.filters new file mode 100644 index 0000000000..c42429d8be --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/VC2022/psicc/psicc.vcxproj.filters @@ -0,0 +1,28 @@ + + + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Source Files + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/Projects/VC2022/resource.h b/local/recipes/libs/lcms2/source/Projects/VC2022/resource.h new file mode 100644 index 0000000000..7655978dd4 --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/VC2022/resource.h @@ -0,0 +1,16 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by lcms2.rc +// + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NO_MFC 1 +#define _APS_NEXT_RESOURCE_VALUE 101 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1000 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/local/recipes/libs/lcms2/source/Projects/VC2022/testbed/testbed.vcxproj b/local/recipes/libs/lcms2/source/Projects/VC2022/testbed/testbed.vcxproj new file mode 100644 index 0000000000..1be1b361a0 --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/VC2022/testbed/testbed.vcxproj @@ -0,0 +1,298 @@ + + + + + Debug + ARM64 + + + Debug + Win32 + + + Debug + x64 + + + Release + ARM64 + + + Release + Win32 + + + Release + x64 + + + + {928A3A2B-46EF-4279-959C-513B3652FF0E} + testbed + Win32Proj + 10.0 + + + + Application + Unicode + true + v143 + + + Application + Unicode + true + v143 + + + Application + Unicode + true + v143 + + + Application + Unicode + v143 + true + + + Application + Unicode + v143 + + + Application + Unicode + v143 + false + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.21006.1 + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + true + true + true + ..\..\..\testbed\ + ..\..\..\testbed\ + ..\..\..\testbed\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + false + false + false + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + ..\..\..\testbed\ + ..\..\..\testbed\ + ..\..\..\testbed\ + + + + Disabled + ../../../include;../../../src;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + EditAndContinue + true + + + true + Console + MachineX86 + false + + + + + Disabled + ../../../include;../../../src;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + EditAndContinue + true + + + true + Console + false + + + + + Disabled + ../../../include;../../../src;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebug + + + Level3 + ProgramDatabase + true + + + true + Console + false + + + + + Full + true + Speed + true + false + ../../../include;../../../src;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + false + true + NotSet + + + Level3 + ProgramDatabase + Cdecl + true + false + + + true + Console + true + true + MachineX86 + false + + + true + + + + + Full + true + Speed + true + false + ../../../include;../../../src;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + false + true + NotSet + + + Level3 + ProgramDatabase + Cdecl + true + false + + + true + Console + true + true + false + + + true + + + + + Full + true + Speed + true + true + ../../../include;../../../src;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreaded + false + true + NotSet + + + Level3 + ProgramDatabase + Cdecl + true + + + true + Console + true + true + false + + + + + + + + + + {71dede59-3f1e-486b-a899-4283000f76b5} + + + + + + \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/Projects/VC2022/testbed/testbed.vcxproj.filters b/local/recipes/libs/lcms2/source/Projects/VC2022/testbed/testbed.vcxproj.filters new file mode 100644 index 0000000000..993ee15119 --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/VC2022/testbed/testbed.vcxproj.filters @@ -0,0 +1,28 @@ + + + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Source Files + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/Projects/VC2022/tiffdiff/tiffdiff.vcxproj b/local/recipes/libs/lcms2/source/Projects/VC2022/tiffdiff/tiffdiff.vcxproj new file mode 100644 index 0000000000..56316092c4 --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/VC2022/tiffdiff/tiffdiff.vcxproj @@ -0,0 +1,300 @@ + + + + + Debug + ARM64 + + + Debug + Win32 + + + Debug + x64 + + + Release + ARM64 + + + Release + Win32 + + + Release + x64 + + + + {75B91835-CCD7-48BE-A606-A9C997D5DBEE} + tiffdiff + Win32Proj + 10.0 + + + + Application + Unicode + true + v143 + + + Application + Unicode + true + v143 + + + Application + Unicode + true + v143 + + + Application + Unicode + v143 + + + Application + Unicode + v143 + + + Application + Unicode + v143 + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.21006.1 + ..\..\..\bin\ + ..\..\..\bin\ + ..\..\..\bin\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + true + true + true + ..\..\..\bin\ + ..\..\..\bin\ + ..\..\..\bin\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + false + false + false + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + C:\jpeg-8d;$(IncludePath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff + C:\jpeg-8d;$(IncludePath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff + C:\jpeg-8d;$(IncludePath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff + C:\jpeg-8d;$(LibraryPath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff + C:\jpeg-8d;$(LibraryPath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff + C:\jpeg-8d;$(LibraryPath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff + C:\jpeg-8d;$(IncludePath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff + C:\jpeg-8d;$(IncludePath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff + C:\jpeg-8d;$(IncludePath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff + C:\jpeg-8d;$(LibraryPath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff + C:\jpeg-8d;$(LibraryPath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff + C:\jpeg-8d;$(LibraryPath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff + + + + Disabled + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + EditAndContinue + true + + + libtiff.lib;%(AdditionalDependencies) + true + Console + MachineX86 + false + + + + + Disabled + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + EditAndContinue + true + + + libtiff.lib;%(AdditionalDependencies) + true + Console + false + + + + + Disabled + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebug + + + Level4 + ProgramDatabase + true + + + libtiff.lib;%(AdditionalDependencies) + true + Console + false + + + + + MaxSpeed + true + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level4 + ProgramDatabase + true + false + + + libtiff.lib;%(AdditionalDependencies) + true + Console + true + true + MachineX86 + $(OutDir)$(TargetName)$(TargetExt) + false + + + true + + + + + MaxSpeed + true + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level4 + ProgramDatabase + true + false + + + libtiff.lib;%(AdditionalDependencies) + true + Console + true + true + $(OutDir)$(TargetName)$(TargetExt) + false + + + true + + + + + MaxSpeed + true + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level4 + ProgramDatabase + true + + + libtiff.lib;%(AdditionalDependencies) + true + Console + true + true + $(OutDir)$(TargetName)$(TargetExt) + false + + + + + + + + + + {71dede59-3f1e-486b-a899-4283000f76b5} + false + + + + + + \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/Projects/VC2022/tiffdiff/tiffdiff.vcxproj.filters b/local/recipes/libs/lcms2/source/Projects/VC2022/tiffdiff/tiffdiff.vcxproj.filters new file mode 100644 index 0000000000..b7f9a80d10 --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/VC2022/tiffdiff/tiffdiff.vcxproj.filters @@ -0,0 +1,28 @@ + + + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Source Files + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/Projects/VC2022/tifficc/tifficc.vcxproj b/local/recipes/libs/lcms2/source/Projects/VC2022/tifficc/tifficc.vcxproj new file mode 100644 index 0000000000..f1dfa29e45 --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/VC2022/tifficc/tifficc.vcxproj @@ -0,0 +1,300 @@ + + + + + Debug + ARM64 + + + Debug + Win32 + + + Debug + x64 + + + Release + ARM64 + + + Release + Win32 + + + Release + x64 + + + + {2256DE16-ED92-4A6F-9C54-F65BB61E64A2} + tifficc + Win32Proj + 10.0 + + + + Application + Unicode + true + v143 + + + Application + Unicode + true + v143 + + + Application + Unicode + true + v143 + + + Application + Unicode + v143 + + + Application + Unicode + v143 + + + Application + Unicode + v143 + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.21006.1 + ..\..\..\bin\ + ..\..\..\bin\ + ..\..\..\bin\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + true + true + true + ..\..\..\bin\ + ..\..\..\bin\ + ..\..\..\bin\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + false + false + false + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + $(IncludePath);c:/liteCommons/3rdparty/components/Win_$(PlatformShortName)/include + $(IncludePath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff + $(IncludePath);c:/liteCommons/3rdparty/components/Win_$(PlatformShortName)/include + $(LibraryPath);c:/liteCommons/3rdparty/components/Win_$(PlatformShortName)/lib + $(LibraryPath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff + $(LibraryPath);c:/liteCommons/3rdparty/components/Win_$(PlatformShortName)/lib + $(IncludePath);c:/liteCommons/3rdparty/components/Win_$(PlatformShortName)/include + $(IncludePath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff + $(IncludePath);c:/liteCommons/3rdparty/components/Win_$(PlatformShortName)_Debug/include + $(LibraryPath);c:/liteCommons/3rdparty/components/Win_$(PlatformShortName)/lib + $(LibraryPath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff + $(LibraryPath);c:/liteCommons/3rdparty/components/Win_$(PlatformShortName)_Debug/lib + + + + Disabled + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + EditAndContinue + true + + + tiff.lib;jpeg-static.lib;zlibstatic.lib;webp.lib;webpdecoder.lib;webpdemux.lib;webpmux.lib;%(AdditionalDependencies) + true + Console + MachineX86 + false + + + + + Disabled + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + EditAndContinue + true + + + libtiff.lib;%(AdditionalDependencies) + true + Console + false + + + + + Disabled + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + ProgramDatabase + true + + + tiffd.lib;jpeg-static.lib;zlibstaticd.lib;libwebp.lib;libwebpdecoder.lib;libwebpdemux.lib;libwebpmux.lib;libsharpyuv.lib;%(AdditionalDependencies) + true + Console + false + + + + + MaxSpeed + true + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level4 + ProgramDatabase + true + false + + + tiff.lib;jpeg-static.lib;zlibstatic.lib;webp.lib;webpdecoder.lib;webpdemux.lib;webpmux.lib;%(AdditionalDependencies) + true + Console + true + true + MachineX86 + false + + + true + + + + + MaxSpeed + true + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level4 + ProgramDatabase + true + false + + + libtiff.lib;%(AdditionalDependencies) + true + Console + true + true + false + + + true + + + + + MaxSpeed + true + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level4 + ProgramDatabase + true + + + tiff.lib;jpeg-static.lib;zlibstatic.lib;webp.lib;webpdecoder.lib;webpdemux.lib;webpmux.lib;%(AdditionalDependencies) + true + Console + true + true + false + + + + + + + + + + + + + {71dede59-3f1e-486b-a899-4283000f76b5} + false + + + + + + \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/Projects/VC2022/tifficc/tifficc.vcxproj.filters b/local/recipes/libs/lcms2/source/Projects/VC2022/tifficc/tifficc.vcxproj.filters new file mode 100644 index 0000000000..2e0e44d1ea --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/VC2022/tifficc/tifficc.vcxproj.filters @@ -0,0 +1,33 @@ + + + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Source Files + + + Source Files + + + Source Files + + + + + Header Files + + + \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/Projects/VC2022/transicc/transicc.vcxproj b/local/recipes/libs/lcms2/source/Projects/VC2022/transicc/transicc.vcxproj new file mode 100644 index 0000000000..729e55dced --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/VC2022/transicc/transicc.vcxproj @@ -0,0 +1,278 @@ + + + + + Debug + ARM64 + + + Debug + Win32 + + + Debug + x64 + + + Release + ARM64 + + + Release + Win32 + + + Release + x64 + + + + {9EE22D66-C849-474C-9ED5-C3E141DAB160} + transicc + Win32Proj + 10.0 + + + + Application + Unicode + true + v143 + + + Application + Unicode + true + v143 + + + Application + Unicode + true + v143 + + + Application + Unicode + v143 + + + Application + Unicode + v143 + + + Application + Unicode + v143 + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.21006.1 + ..\..\..\bin\ + ..\..\..\bin\ + ..\..\..\bin\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + true + true + true + ..\..\..\bin\ + ..\..\..\bin\ + ..\..\..\bin\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + false + false + false + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + + + + Disabled + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + EditAndContinue + true + + + true + Console + MachineX86 + + + + + Disabled + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + EditAndContinue + true + + + true + Console + + + + + Disabled + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + ProgramDatabase + true + + + true + Console + + + + + MaxSpeed + true + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level4 + ProgramDatabase + true + false + + + true + Console + true + true + MachineX86 + + + true + + + + + MaxSpeed + true + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level4 + ProgramDatabase + true + false + + + true + Console + true + true + + + true + + + + + MaxSpeed + true + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreaded + true + + + Level4 + ProgramDatabase + true + + + true + Console + true + true + + + + + false + + + + + + + + + + {71dede59-3f1e-486b-a899-4283000f76b5} + false + + + + + + \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/Projects/VC2022/transicc/transicc.vcxproj.filters b/local/recipes/libs/lcms2/source/Projects/VC2022/transicc/transicc.vcxproj.filters new file mode 100644 index 0000000000..3d45443026 --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/VC2022/transicc/transicc.vcxproj.filters @@ -0,0 +1,33 @@ + + + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Source Files + + + Source Files + + + Source Files + + + + + Header Files + + + \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/Projects/VC2026/fuzzers/fuzzers.vcxproj b/local/recipes/libs/lcms2/source/Projects/VC2026/fuzzers/fuzzers.vcxproj new file mode 100644 index 0000000000..213497bc97 --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/VC2026/fuzzers/fuzzers.vcxproj @@ -0,0 +1,168 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 17.0 + Win32Proj + {32e8c094-1d6b-4959-90ad-9a443df4ae9a} + fuzzers + 10.0 + + + + Application + true + v145 + Unicode + true + true + + + Application + false + v145 + true + Unicode + true + true + + + Application + true + v145 + Unicode + true + true + + + Application + false + v145 + true + Unicode + true + true + + + + + + + + + + + + + + + + + + + + + ..\..\..\fuzzers\ + ../../../include;$(IncludePath) + $(Configuration)_$(Platform)\ + + + ..\..\..\fuzzers\ + ../../../include;$(IncludePath) + $(Configuration)_$(Platform)\ + + + ..\..\..\fuzzers\ + ../../../include;$(IncludePath) + $(Configuration)_$(Platform)\ + + + ..\..\..\fuzzers\ + ../../../include;$(IncludePath) + $(Configuration)_$(Platform)\ + + + + Level3 + true + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Level3 + true + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + Level3 + true + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Level3 + true + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + + + + {71dede59-3f1e-486b-a899-4283000f76b5} + + + + + + \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/Projects/VC2026/fuzzers/fuzzers.vcxproj.filters b/local/recipes/libs/lcms2/source/Projects/VC2026/fuzzers/fuzzers.vcxproj.filters new file mode 100644 index 0000000000..b0cec15f19 --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/VC2026/fuzzers/fuzzers.vcxproj.filters @@ -0,0 +1,22 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Source Files + + + \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/Projects/VC2026/jpegicc/jpegicc.vcxproj b/local/recipes/libs/lcms2/source/Projects/VC2026/jpegicc/jpegicc.vcxproj new file mode 100644 index 0000000000..d3e252dc12 --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/VC2026/jpegicc/jpegicc.vcxproj @@ -0,0 +1,315 @@ + + + + + Debug + ARM64 + + + Debug + Win32 + + + Debug + x64 + + + Release + ARM64 + + + Release + Win32 + + + Release + x64 + + + + {62812507-F926-4968-96A9-17678460AD90} + jpegicc + Win32Proj + 10.0 + + + + Application + Unicode + true + v145 + + + Application + Unicode + true + v145 + + + Application + Unicode + true + v145 + + + Application + Unicode + v145 + + + Application + Unicode + v145 + + + Application + Unicode + v145 + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.21006.1 + ..\..\..\bin\ + ..\..\..\bin\ + ..\..\..\bin\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + true + true + true + ..\..\..\bin\ + ..\..\..\bin\ + ..\..\..\bin\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + false + false + false + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + $(IncludePath);;C:\code\jpeg-9a + $(IncludePath);;C:\code\jpeg-9a + $(IncludePath);;C:\code\jpeg-9a + $(LibraryPath);;C:\code\jpeg-9a + $(LibraryPath);;C:\code\jpeg-9a + $(LibraryPath);;C:\code\jpeg-9a + $(IncludePath);;C:\code\jpeg-9a + $(IncludePath);;C:\code\jpeg-9a + $(IncludePath);;C:\code\jpeg-9a + $(LibraryPath);;C:\code\jpeg-9a + $(LibraryPath);;C:\code\jpeg-9a + $(LibraryPath);;C:\code\jpeg-9a + + + jpgicc + + + jpgicc + + + + Disabled + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + EditAndContinue + true + + + libjpeg.lib;%(AdditionalDependencies) + true + Console + MachineX86 + false + + + + + Disabled + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + EditAndContinue + true + + + libjpeg.lib;%(AdditionalDependencies) + true + Console + false + + + + + Disabled + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + ProgramDatabase + true + stdc11 + + + libjpeg.lib;%(AdditionalDependencies) + true + Console + false + + + + + Full + true + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level3 + ProgramDatabase + Speed + true + true + true + false + + + libjpeg.lib;%(AdditionalDependencies) + true + Console + true + true + MachineX86 + false + + + true + + + + + Full + true + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level3 + ProgramDatabase + Speed + true + true + true + false + + + libjpeg.lib;%(AdditionalDependencies) + true + Console + true + true + false + + + true + + + + + Full + true + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level3 + ProgramDatabase + Speed + true + true + true + stdc11 + + + libjpeg.lib;%(AdditionalDependencies) + true + Console + true + true + false + + + + + + + + + + + {71dede59-3f1e-486b-a899-4283000f76b5} + false + + + + + + \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/Projects/VC2026/jpegicc/jpegicc.vcxproj.filters b/local/recipes/libs/lcms2/source/Projects/VC2026/jpegicc/jpegicc.vcxproj.filters new file mode 100644 index 0000000000..a05c36d6d9 --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/VC2026/jpegicc/jpegicc.vcxproj.filters @@ -0,0 +1,31 @@ + + + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/Projects/VC2026/lcms2.rc b/local/recipes/libs/lcms2/source/Projects/VC2026/lcms2.rc new file mode 100644 index 0000000000..9bdd53dd6b --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/VC2026/lcms2.rc @@ -0,0 +1,104 @@ +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#define APSTUDIO_HIDDEN_SYMBOLS +#include "windows.h" +#undef APSTUDIO_HIDDEN_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// Spanish (Spain, International Sort) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ESN) +LANGUAGE LANG_SPANISH, SUBLANG_SPANISH_MODERN +#pragma code_page(1252) + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +1 VERSIONINFO + FILEVERSION 2,19,0,0 + PRODUCTVERSION 2,19,0,0 + FILEFLAGSMASK 0x0L +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904e4" + BEGIN + VALUE "CompanyName", "Marti Maria" + VALUE "FileDescription", "lcms color engine" + VALUE "FileVersion", "2.19.0.0" + VALUE "InternalName", "lcms2" + VALUE "LegalCopyright", "Copyright © Marti Maria 2026" + VALUE "OriginalFilename", "lcms2.dll" + VALUE "ProductName", "LittleCMS color engine" + VALUE "ProductVersion", "2.19.0.0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1252 + END +END + + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#define APSTUDIO_HIDDEN_SYMBOLS\r\n" + "#include ""windows.h""\r\n" + "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + +#endif // Spanish (Spain, International Sort) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/local/recipes/libs/lcms2/source/Projects/VC2026/lcms2.sln b/local/recipes/libs/lcms2/source/Projects/VC2026/lcms2.sln new file mode 100644 index 0000000000..4b6d1d19f7 --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/VC2026/lcms2.sln @@ -0,0 +1,247 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 18 +VisualStudioVersion = 18.4.11612.150 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testbed", "testbed\testbed.vcxproj", "{928A3A2B-46EF-4279-959C-513B3652FF0E}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tifficc", "tifficc\tifficc.vcxproj", "{2256DE16-ED92-4A6F-9C54-F65BB61E64A2}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lcms2_DLL", "lcms2_DLL\lcms2_DLL.vcxproj", "{8C51BE48-ADB8-4089-A9EC-F6BF993A0548}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "linkicc", "linkicc\linkicc.vcxproj", "{FBFBE1DC-DB84-4BA1-9552-B4780F457849}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "transicc", "transicc\transicc.vcxproj", "{9EE22D66-C849-474C-9ED5-C3E141DAB160}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "jpegicc", "jpegicc\jpegicc.vcxproj", "{62812507-F926-4968-96A9-17678460AD90}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tiffdiff", "tiffdiff\tiffdiff.vcxproj", "{75B91835-CCD7-48BE-A606-A9C997D5DBEE}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lcms2_static", "lcms2_static\lcms2_static.vcxproj", "{71DEDE59-3F1E-486B-A899-4283000F76B5}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "psicc", "psicc\psicc.vcxproj", "{EF6A8851-65FE-46F5-B9EF-14F0B671F693}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "plugins", "plugins", "{8349DD7F-F750-4910-A5A5-0628223BD3EB}" + ProjectSection(SolutionItems) = preProject + ..\..\plugins\README.1ST = ..\..\plugins\README.1ST + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "fast_float", "fast_float", "{1696CDC1-F411-4F84-BC94-C63FEB867D06}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lcms2_fast_float_plugin", "..\..\plugins\fast_float\Projects\VC2022\lcms2_fast_float_plugin.vcxproj", "{AD9FF79B-CF6E-4971-A7CF-DAA47D636676}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lcms2_fast_float_plugin_testbed", "..\..\plugins\fast_float\Projects\VC2022\lcms2_fast_float_plugin_testbed.vcxproj", "{7629D670-C419-402B-8A90-747952EE9FC0}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "threaded", "threaded", "{09D18587-D927-4047-977F-49918A174D5E}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fuzzers", "fuzzers\fuzzers.vcxproj", "{32E8C094-1D6B-4959-90AD-9A443DF4AE9A}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lcms2_threaded_plugin", "..\..\plugins\threaded\Projects\VC2026\lcms2_threaded_plugin.vcxproj", "{6A44744B-BED4-49EC-87BB-83978458CE19}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lcms2_threaded_plugin_testbed", "..\..\plugins\threaded\Projects\VC2026\lcms2_threaded_plugin_testbed.vcxproj", "{F56B9CBA-A34D-4C68-9003-A6919236399E}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "doc", "doc", "{4DD637AE-09B1-4994-8FC7-7F6EB19165EC}" + ProjectSection(SolutionItems) = preProject + ..\..\plugins\fast_float\doc\LittleCMS floating point extensions 1.7.pdf = ..\..\plugins\fast_float\doc\LittleCMS floating point extensions 1.7.pdf + ..\..\plugins\threaded\doc\LittleCMS threaded extensions 1.0.pdf = ..\..\plugins\threaded\doc\LittleCMS threaded extensions 1.0.pdf + ..\..\doc\LittleCMS2.18 API.pdf = ..\..\doc\LittleCMS2.18 API.pdf + ..\..\doc\LittleCMS2.18 Plugin API.pdf = ..\..\doc\LittleCMS2.18 Plugin API.pdf + ..\..\doc\LittleCMS2.18 tutorial.pdf = ..\..\doc\LittleCMS2.18 tutorial.pdf + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|ARM64 = Debug|ARM64 + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|ARM64 = Release|ARM64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {928A3A2B-46EF-4279-959C-513B3652FF0E}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {928A3A2B-46EF-4279-959C-513B3652FF0E}.Debug|ARM64.Build.0 = Debug|ARM64 + {928A3A2B-46EF-4279-959C-513B3652FF0E}.Debug|Win32.ActiveCfg = Debug|Win32 + {928A3A2B-46EF-4279-959C-513B3652FF0E}.Debug|Win32.Build.0 = Debug|Win32 + {928A3A2B-46EF-4279-959C-513B3652FF0E}.Debug|x64.ActiveCfg = Debug|x64 + {928A3A2B-46EF-4279-959C-513B3652FF0E}.Debug|x64.Build.0 = Debug|x64 + {928A3A2B-46EF-4279-959C-513B3652FF0E}.Release|ARM64.ActiveCfg = Release|ARM64 + {928A3A2B-46EF-4279-959C-513B3652FF0E}.Release|ARM64.Build.0 = Release|ARM64 + {928A3A2B-46EF-4279-959C-513B3652FF0E}.Release|Win32.ActiveCfg = Release|Win32 + {928A3A2B-46EF-4279-959C-513B3652FF0E}.Release|Win32.Build.0 = Release|Win32 + {928A3A2B-46EF-4279-959C-513B3652FF0E}.Release|x64.ActiveCfg = Release|x64 + {928A3A2B-46EF-4279-959C-513B3652FF0E}.Release|x64.Build.0 = Release|x64 + {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Debug|ARM64.Build.0 = Debug|ARM64 + {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Debug|Win32.ActiveCfg = Debug|Win32 + {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Debug|Win32.Build.0 = Debug|Win32 + {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Debug|x64.ActiveCfg = Debug|x64 + {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Debug|x64.Build.0 = Debug|x64 + {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Release|ARM64.ActiveCfg = Release|ARM64 + {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Release|ARM64.Build.0 = Release|ARM64 + {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Release|Win32.ActiveCfg = Release|Win32 + {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Release|Win32.Build.0 = Release|Win32 + {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Release|x64.ActiveCfg = Release|x64 + {2256DE16-ED92-4A6F-9C54-F65BB61E64A2}.Release|x64.Build.0 = Release|x64 + {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Debug|ARM64.Build.0 = Debug|ARM64 + {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Debug|Win32.ActiveCfg = Debug|Win32 + {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Debug|Win32.Build.0 = Debug|Win32 + {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Debug|x64.ActiveCfg = Debug|x64 + {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Debug|x64.Build.0 = Debug|x64 + {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Release|ARM64.ActiveCfg = Release|ARM64 + {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Release|ARM64.Build.0 = Release|ARM64 + {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Release|Win32.ActiveCfg = Release|Win32 + {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Release|Win32.Build.0 = Release|Win32 + {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Release|x64.ActiveCfg = Release|x64 + {8C51BE48-ADB8-4089-A9EC-F6BF993A0548}.Release|x64.Build.0 = Release|x64 + {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Debug|ARM64.Build.0 = Debug|ARM64 + {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Debug|Win32.ActiveCfg = Debug|Win32 + {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Debug|Win32.Build.0 = Debug|Win32 + {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Debug|x64.ActiveCfg = Debug|x64 + {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Debug|x64.Build.0 = Debug|x64 + {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Release|ARM64.ActiveCfg = Release|ARM64 + {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Release|ARM64.Build.0 = Release|ARM64 + {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Release|Win32.ActiveCfg = Release|Win32 + {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Release|Win32.Build.0 = Release|Win32 + {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Release|x64.ActiveCfg = Release|x64 + {FBFBE1DC-DB84-4BA1-9552-B4780F457849}.Release|x64.Build.0 = Release|x64 + {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Debug|ARM64.Build.0 = Debug|ARM64 + {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Debug|Win32.ActiveCfg = Debug|Win32 + {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Debug|Win32.Build.0 = Debug|Win32 + {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Debug|x64.ActiveCfg = Debug|x64 + {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Debug|x64.Build.0 = Debug|x64 + {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Release|ARM64.ActiveCfg = Release|ARM64 + {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Release|ARM64.Build.0 = Release|ARM64 + {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Release|Win32.ActiveCfg = Release|Win32 + {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Release|Win32.Build.0 = Release|Win32 + {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Release|x64.ActiveCfg = Release|x64 + {9EE22D66-C849-474C-9ED5-C3E141DAB160}.Release|x64.Build.0 = Release|x64 + {62812507-F926-4968-96A9-17678460AD90}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {62812507-F926-4968-96A9-17678460AD90}.Debug|ARM64.Build.0 = Debug|ARM64 + {62812507-F926-4968-96A9-17678460AD90}.Debug|Win32.ActiveCfg = Debug|Win32 + {62812507-F926-4968-96A9-17678460AD90}.Debug|Win32.Build.0 = Debug|Win32 + {62812507-F926-4968-96A9-17678460AD90}.Debug|x64.ActiveCfg = Debug|x64 + {62812507-F926-4968-96A9-17678460AD90}.Debug|x64.Build.0 = Debug|x64 + {62812507-F926-4968-96A9-17678460AD90}.Release|ARM64.ActiveCfg = Release|ARM64 + {62812507-F926-4968-96A9-17678460AD90}.Release|ARM64.Build.0 = Release|ARM64 + {62812507-F926-4968-96A9-17678460AD90}.Release|Win32.ActiveCfg = Release|Win32 + {62812507-F926-4968-96A9-17678460AD90}.Release|Win32.Build.0 = Release|Win32 + {62812507-F926-4968-96A9-17678460AD90}.Release|x64.ActiveCfg = Release|x64 + {62812507-F926-4968-96A9-17678460AD90}.Release|x64.Build.0 = Release|x64 + {62812507-F926-4968-96A9-17678460AD90}.Release|x64.Deploy.0 = Release|x64 + {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Debug|ARM64.Build.0 = Debug|ARM64 + {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Debug|Win32.ActiveCfg = Debug|Win32 + {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Debug|Win32.Build.0 = Debug|Win32 + {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Debug|x64.ActiveCfg = Debug|x64 + {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Debug|x64.Build.0 = Debug|x64 + {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Release|ARM64.ActiveCfg = Release|ARM64 + {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Release|ARM64.Build.0 = Release|ARM64 + {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Release|Win32.ActiveCfg = Release|Win32 + {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Release|Win32.Build.0 = Release|Win32 + {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Release|x64.ActiveCfg = Release|x64 + {75B91835-CCD7-48BE-A606-A9C997D5DBEE}.Release|x64.Build.0 = Release|x64 + {71DEDE59-3F1E-486B-A899-4283000F76B5}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {71DEDE59-3F1E-486B-A899-4283000F76B5}.Debug|ARM64.Build.0 = Debug|ARM64 + {71DEDE59-3F1E-486B-A899-4283000F76B5}.Debug|Win32.ActiveCfg = Debug|Win32 + {71DEDE59-3F1E-486B-A899-4283000F76B5}.Debug|Win32.Build.0 = Debug|Win32 + {71DEDE59-3F1E-486B-A899-4283000F76B5}.Debug|x64.ActiveCfg = Debug|x64 + {71DEDE59-3F1E-486B-A899-4283000F76B5}.Debug|x64.Build.0 = Debug|x64 + {71DEDE59-3F1E-486B-A899-4283000F76B5}.Release|ARM64.ActiveCfg = Release|ARM64 + {71DEDE59-3F1E-486B-A899-4283000F76B5}.Release|ARM64.Build.0 = Release|ARM64 + {71DEDE59-3F1E-486B-A899-4283000F76B5}.Release|Win32.ActiveCfg = Release|Win32 + {71DEDE59-3F1E-486B-A899-4283000F76B5}.Release|Win32.Build.0 = Release|Win32 + {71DEDE59-3F1E-486B-A899-4283000F76B5}.Release|x64.ActiveCfg = Release|x64 + {71DEDE59-3F1E-486B-A899-4283000F76B5}.Release|x64.Build.0 = Release|x64 + {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Debug|ARM64.Build.0 = Debug|ARM64 + {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Debug|Win32.ActiveCfg = Debug|Win32 + {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Debug|Win32.Build.0 = Debug|Win32 + {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Debug|x64.ActiveCfg = Debug|x64 + {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Debug|x64.Build.0 = Debug|x64 + {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Release|ARM64.ActiveCfg = Release|ARM64 + {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Release|ARM64.Build.0 = Release|ARM64 + {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Release|Win32.ActiveCfg = Release|Win32 + {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Release|Win32.Build.0 = Release|Win32 + {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Release|x64.ActiveCfg = Release|x64 + {EF6A8851-65FE-46F5-B9EF-14F0B671F693}.Release|x64.Build.0 = Release|x64 + {AD9FF79B-CF6E-4971-A7CF-DAA47D636676}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {AD9FF79B-CF6E-4971-A7CF-DAA47D636676}.Debug|ARM64.Build.0 = Debug|ARM64 + {AD9FF79B-CF6E-4971-A7CF-DAA47D636676}.Debug|Win32.ActiveCfg = Debug|Win32 + {AD9FF79B-CF6E-4971-A7CF-DAA47D636676}.Debug|Win32.Build.0 = Debug|Win32 + {AD9FF79B-CF6E-4971-A7CF-DAA47D636676}.Debug|x64.ActiveCfg = Debug|x64 + {AD9FF79B-CF6E-4971-A7CF-DAA47D636676}.Debug|x64.Build.0 = Debug|x64 + {AD9FF79B-CF6E-4971-A7CF-DAA47D636676}.Release|ARM64.ActiveCfg = Release|ARM64 + {AD9FF79B-CF6E-4971-A7CF-DAA47D636676}.Release|ARM64.Build.0 = Release|ARM64 + {AD9FF79B-CF6E-4971-A7CF-DAA47D636676}.Release|Win32.ActiveCfg = Release|Win32 + {AD9FF79B-CF6E-4971-A7CF-DAA47D636676}.Release|Win32.Build.0 = Release|Win32 + {AD9FF79B-CF6E-4971-A7CF-DAA47D636676}.Release|x64.ActiveCfg = Release|x64 + {AD9FF79B-CF6E-4971-A7CF-DAA47D636676}.Release|x64.Build.0 = Release|x64 + {7629D670-C419-402B-8A90-747952EE9FC0}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {7629D670-C419-402B-8A90-747952EE9FC0}.Debug|ARM64.Build.0 = Debug|ARM64 + {7629D670-C419-402B-8A90-747952EE9FC0}.Debug|Win32.ActiveCfg = Debug|Win32 + {7629D670-C419-402B-8A90-747952EE9FC0}.Debug|Win32.Build.0 = Debug|Win32 + {7629D670-C419-402B-8A90-747952EE9FC0}.Debug|x64.ActiveCfg = Debug|x64 + {7629D670-C419-402B-8A90-747952EE9FC0}.Debug|x64.Build.0 = Debug|x64 + {7629D670-C419-402B-8A90-747952EE9FC0}.Release|ARM64.ActiveCfg = Release|ARM64 + {7629D670-C419-402B-8A90-747952EE9FC0}.Release|ARM64.Build.0 = Release|ARM64 + {7629D670-C419-402B-8A90-747952EE9FC0}.Release|Win32.ActiveCfg = Release|Win32 + {7629D670-C419-402B-8A90-747952EE9FC0}.Release|Win32.Build.0 = Release|Win32 + {7629D670-C419-402B-8A90-747952EE9FC0}.Release|x64.ActiveCfg = Release|x64 + {7629D670-C419-402B-8A90-747952EE9FC0}.Release|x64.Build.0 = Release|x64 + {32E8C094-1D6B-4959-90AD-9A443DF4AE9A}.Debug|ARM64.ActiveCfg = Debug|x64 + {32E8C094-1D6B-4959-90AD-9A443DF4AE9A}.Debug|ARM64.Build.0 = Debug|x64 + {32E8C094-1D6B-4959-90AD-9A443DF4AE9A}.Debug|Win32.ActiveCfg = Debug|Win32 + {32E8C094-1D6B-4959-90AD-9A443DF4AE9A}.Debug|Win32.Build.0 = Debug|Win32 + {32E8C094-1D6B-4959-90AD-9A443DF4AE9A}.Debug|x64.ActiveCfg = Debug|x64 + {32E8C094-1D6B-4959-90AD-9A443DF4AE9A}.Debug|x64.Build.0 = Debug|x64 + {32E8C094-1D6B-4959-90AD-9A443DF4AE9A}.Release|ARM64.ActiveCfg = Release|x64 + {32E8C094-1D6B-4959-90AD-9A443DF4AE9A}.Release|ARM64.Build.0 = Release|x64 + {32E8C094-1D6B-4959-90AD-9A443DF4AE9A}.Release|Win32.ActiveCfg = Release|Win32 + {32E8C094-1D6B-4959-90AD-9A443DF4AE9A}.Release|Win32.Build.0 = Release|Win32 + {32E8C094-1D6B-4959-90AD-9A443DF4AE9A}.Release|x64.ActiveCfg = Release|x64 + {32E8C094-1D6B-4959-90AD-9A443DF4AE9A}.Release|x64.Build.0 = Release|x64 + {6A44744B-BED4-49EC-87BB-83978458CE19}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {6A44744B-BED4-49EC-87BB-83978458CE19}.Debug|ARM64.Build.0 = Debug|ARM64 + {6A44744B-BED4-49EC-87BB-83978458CE19}.Debug|Win32.ActiveCfg = Debug|Win32 + {6A44744B-BED4-49EC-87BB-83978458CE19}.Debug|Win32.Build.0 = Debug|Win32 + {6A44744B-BED4-49EC-87BB-83978458CE19}.Debug|x64.ActiveCfg = Debug|x64 + {6A44744B-BED4-49EC-87BB-83978458CE19}.Debug|x64.Build.0 = Debug|x64 + {6A44744B-BED4-49EC-87BB-83978458CE19}.Release|ARM64.ActiveCfg = Release|ARM64 + {6A44744B-BED4-49EC-87BB-83978458CE19}.Release|ARM64.Build.0 = Release|ARM64 + {6A44744B-BED4-49EC-87BB-83978458CE19}.Release|Win32.ActiveCfg = Release|Win32 + {6A44744B-BED4-49EC-87BB-83978458CE19}.Release|Win32.Build.0 = Release|Win32 + {6A44744B-BED4-49EC-87BB-83978458CE19}.Release|x64.ActiveCfg = Release|x64 + {6A44744B-BED4-49EC-87BB-83978458CE19}.Release|x64.Build.0 = Release|x64 + {F56B9CBA-A34D-4C68-9003-A6919236399E}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {F56B9CBA-A34D-4C68-9003-A6919236399E}.Debug|ARM64.Build.0 = Debug|ARM64 + {F56B9CBA-A34D-4C68-9003-A6919236399E}.Debug|Win32.ActiveCfg = Debug|Win32 + {F56B9CBA-A34D-4C68-9003-A6919236399E}.Debug|Win32.Build.0 = Debug|Win32 + {F56B9CBA-A34D-4C68-9003-A6919236399E}.Debug|x64.ActiveCfg = Debug|x64 + {F56B9CBA-A34D-4C68-9003-A6919236399E}.Debug|x64.Build.0 = Debug|x64 + {F56B9CBA-A34D-4C68-9003-A6919236399E}.Release|ARM64.ActiveCfg = Release|ARM64 + {F56B9CBA-A34D-4C68-9003-A6919236399E}.Release|ARM64.Build.0 = Release|ARM64 + {F56B9CBA-A34D-4C68-9003-A6919236399E}.Release|Win32.ActiveCfg = Release|Win32 + {F56B9CBA-A34D-4C68-9003-A6919236399E}.Release|Win32.Build.0 = Release|Win32 + {F56B9CBA-A34D-4C68-9003-A6919236399E}.Release|x64.ActiveCfg = Release|x64 + {F56B9CBA-A34D-4C68-9003-A6919236399E}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {1696CDC1-F411-4F84-BC94-C63FEB867D06} = {8349DD7F-F750-4910-A5A5-0628223BD3EB} + {AD9FF79B-CF6E-4971-A7CF-DAA47D636676} = {1696CDC1-F411-4F84-BC94-C63FEB867D06} + {7629D670-C419-402B-8A90-747952EE9FC0} = {1696CDC1-F411-4F84-BC94-C63FEB867D06} + {09D18587-D927-4047-977F-49918A174D5E} = {8349DD7F-F750-4910-A5A5-0628223BD3EB} + {6A44744B-BED4-49EC-87BB-83978458CE19} = {09D18587-D927-4047-977F-49918A174D5E} + {F56B9CBA-A34D-4C68-9003-A6919236399E} = {09D18587-D927-4047-977F-49918A174D5E} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {E95EA102-6884-4CAD-AF6D-9BF36C69A33D} + QtVersion = $(DefaultQtVersion) + EndGlobalSection +EndGlobal diff --git a/local/recipes/libs/lcms2/source/Projects/VC2026/lcms2_DLL/lcms2_DLL.vcxproj b/local/recipes/libs/lcms2/source/Projects/VC2026/lcms2_DLL/lcms2_DLL.vcxproj new file mode 100644 index 0000000000..2331be1332 --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/VC2026/lcms2_DLL/lcms2_DLL.vcxproj @@ -0,0 +1,349 @@ + + + + + Debug + ARM64 + + + Debug + Win32 + + + Debug + x64 + + + Release + ARM64 + + + Release + Win32 + + + Release + x64 + + + + {8C51BE48-ADB8-4089-A9EC-F6BF993A0548} + lcms2_DLL + Win32Proj + 10.0 + + + + DynamicLibrary + Unicode + true + v145 + + + DynamicLibrary + Unicode + true + v145 + + + DynamicLibrary + Unicode + true + v145 + + + DynamicLibrary + Unicode + v145 + + + DynamicLibrary + Unicode + v145 + + + DynamicLibrary + Unicode + v145 + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.21006.1 + ..\..\..\bin\ + ..\..\..\bin\ + ..\..\..\bin\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + true + true + true + ..\..\..\bin\ + ..\..\..\bin\ + ..\..\..\bin\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + false + false + false + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + + + lcms2 + + + lcms2 + + + lcms2 + + + lcms2 + + + lcms2 + + + lcms2 + + + + Disabled + ../../../include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_WINDOWS;_USRDLL;CMS_DLL_BUILD;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + true + false + + + ..\..\..\src\lcms2.def + true + Windows + MachineX86 + + + + + Disabled + ../../../include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_WINDOWS;_USRDLL;CMS_DLL_BUILD;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + true + false + + + ..\..\..\src\lcms2.def + true + Windows + + + + + Disabled + ../../../include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_WINDOWS;_USRDLL;CMS_DLL_BUILD;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + true + false + CompileAsC + stdc11 + + + + + true + Windows + $(OutDir)$(TargetName)$(TargetExt) + + + + + Full + true + Speed + true + true + true + ../../../include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_WINDOWS;_USRDLL;CMS_DLL_BUILD;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + MultiThreaded + true + + + Level4 + true + OnlyExplicitInline + true + + + ..\..\..\src\lcms2.def + true + Windows + true + true + MachineX86 + + + true + + + + + Full + true + Speed + true + true + true + ../../../include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_WINDOWS;_USRDLL;CMS_DLL_BUILD;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + MultiThreaded + true + + + Level4 + true + OnlyExplicitInline + true + + + ..\..\..\src\lcms2.def + true + Windows + true + true + + + true + + + + + Full + true + Speed + true + true + true + ../../../include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_WINDOWS;_USRDLL;CMS_DLL_BUILD;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + MultiThreaded + true + + + Level4 + true + OnlyExplicitInline + true + CompileAsC + stdc11 + + + + + true + Windows + true + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + true + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/Projects/VC2026/lcms2_DLL/lcms2_DLL.vcxproj.filters b/local/recipes/libs/lcms2/source/Projects/VC2026/lcms2_DLL/lcms2_DLL.vcxproj.filters new file mode 100644 index 0000000000..255a147077 --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/VC2026/lcms2_DLL/lcms2_DLL.vcxproj.filters @@ -0,0 +1,121 @@ + + + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + Source Files + + + Resource Files + + + + + Resource Files + + + + + Source Files + + + \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/Projects/VC2026/lcms2_static/lcms2_static.vcxproj b/local/recipes/libs/lcms2/source/Projects/VC2026/lcms2_static/lcms2_static.vcxproj new file mode 100644 index 0000000000..7dc794577e --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/VC2026/lcms2_static/lcms2_static.vcxproj @@ -0,0 +1,290 @@ + + + + + Debug + ARM64 + + + Debug + Win32 + + + Debug + x64 + + + Release + ARM64 + + + Release + Win32 + + + Release + x64 + + + + {71DEDE59-3F1E-486B-A899-4283000F76B5} + lcms2_static + Win32Proj + 10.0 + + + + StaticLibrary + Unicode + true + v145 + + + StaticLibrary + Unicode + true + v145 + + + StaticLibrary + Unicode + true + v145 + + + StaticLibrary + Unicode + v145 + + + StaticLibrary + Unicode + v145 + + + StaticLibrary + Unicode + v145 + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.21006.1 + ..\..\..\Lib\MS\ + ..\..\..\Lib\MS\ + ..\..\..\Lib\MS\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + ..\..\..\Lib\MS\ + ..\..\..\Lib\MS\ + ..\..\..\Lib\MS\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + + + + Disabled + ../../../include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + true + EnableFastChecks + + + Level4 + EditAndContinue + + + true + MultiThreadedDebugDLL + + + + + Disabled + ../../../include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + true + EnableFastChecks + + + Level4 + EditAndContinue + + + true + MultiThreadedDebugDLL + + + + + Disabled + ../../../include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebug + + + Level4 + ProgramDatabase + + + true + CompileAsC + stdc11 + + + + + MaxSpeed + true + ../../../include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + MultiThreaded + true + + + Level4 + ProgramDatabase + Speed + true + false + OnlyExplicitInline + false + true + Precise + false + false + false + + + true + + + + + MaxSpeed + true + ../../../include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + MultiThreaded + true + + + Level4 + ProgramDatabase + Speed + true + false + OnlyExplicitInline + false + true + Precise + false + false + false + + + true + + + + + MaxSpeed + true + ../../../include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + MultiThreaded + true + + + Level4 + ProgramDatabase + Speed + true + true + OnlyExplicitInline + false + true + true + true + CompileAsC + stdc11 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/Projects/VC2026/lcms2_static/lcms2_static.vcxproj.filters b/local/recipes/libs/lcms2/source/Projects/VC2026/lcms2_static/lcms2_static.vcxproj.filters new file mode 100644 index 0000000000..58d3cb7ee7 --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/VC2026/lcms2_static/lcms2_static.vcxproj.filters @@ -0,0 +1,108 @@ + + + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + Source Files + + + \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/Projects/VC2026/linkicc/linkicc.vcxproj b/local/recipes/libs/lcms2/source/Projects/VC2026/linkicc/linkicc.vcxproj new file mode 100644 index 0000000000..9a6b5950b2 --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/VC2026/linkicc/linkicc.vcxproj @@ -0,0 +1,275 @@ + + + + + Debug + ARM64 + + + Debug + Win32 + + + Debug + x64 + + + Release + ARM64 + + + Release + Win32 + + + Release + x64 + + + + {FBFBE1DC-DB84-4BA1-9552-B4780F457849} + linkicc + Win32Proj + 10.0 + + + + Application + Unicode + true + v145 + + + Application + Unicode + true + v145 + + + Application + Unicode + true + v145 + + + Application + Unicode + v145 + + + Application + Unicode + v145 + + + Application + Unicode + v145 + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.21006.1 + ..\..\..\bin\ + ..\..\..\bin\ + ..\..\..\bin\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + true + true + true + ..\..\..\bin\ + ..\..\..\bin\ + ..\..\..\bin\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + false + false + false + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + + + + Disabled + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDLL + + + Level4 + EditAndContinue + true + + + true + Console + MachineX86 + + + + + Disabled + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDLL + + + Level4 + EditAndContinue + true + + + true + Console + + + + + Disabled + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebug + + + Level4 + ProgramDatabase + true + CompileAsC + + + true + Console + + + + + MaxSpeed + true + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Level4 + ProgramDatabase + true + false + MultiThreaded + + + true + Console + true + true + MachineX86 + + + true + + + + + MaxSpeed + true + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Level4 + ProgramDatabase + true + false + MultiThreaded + + + true + Console + true + true + + + true + + + + + MaxSpeed + true + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Level4 + ProgramDatabase + true + MultiThreaded + CompileAsC + + + true + Console + true + true + + + + + + + + + + {71dede59-3f1e-486b-a899-4283000f76b5} + false + + + + + + \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/Projects/VC2026/linkicc/linkicc.vcxproj.filters b/local/recipes/libs/lcms2/source/Projects/VC2026/linkicc/linkicc.vcxproj.filters new file mode 100644 index 0000000000..95c77cdbe2 --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/VC2026/linkicc/linkicc.vcxproj.filters @@ -0,0 +1,28 @@ + + + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Source Files + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/Projects/VC2026/psicc/psicc.vcxproj b/local/recipes/libs/lcms2/source/Projects/VC2026/psicc/psicc.vcxproj new file mode 100644 index 0000000000..5b33232d20 --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/VC2026/psicc/psicc.vcxproj @@ -0,0 +1,275 @@ + + + + + Debug + ARM64 + + + Debug + Win32 + + + Debug + x64 + + + Release + ARM64 + + + Release + Win32 + + + Release + x64 + + + + {EF6A8851-65FE-46F5-B9EF-14F0B671F693} + psicc + Win32Proj + 10.0 + + + + Application + Unicode + true + v145 + + + Application + Unicode + true + v145 + + + Application + Unicode + true + v145 + + + Application + Unicode + v145 + + + Application + Unicode + v145 + + + Application + Unicode + v145 + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.21006.1 + ..\..\..\bin\ + ..\..\..\bin\ + ..\..\..\bin\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + true + true + true + ..\..\..\bin\ + ..\..\..\bin\ + ..\..\..\bin\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + false + false + false + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + + + + Disabled + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + EditAndContinue + true + + + true + Console + MachineX86 + + + + + Disabled + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + EditAndContinue + true + + + true + Console + + + + + Disabled + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + ProgramDatabase + true + CompileAsC + + + true + Console + + + + + MaxSpeed + true + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreaded + true + + + Level4 + ProgramDatabase + true + false + + + true + Console + true + true + MachineX86 + + + true + + + + + MaxSpeed + true + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreaded + true + + + Level4 + ProgramDatabase + true + false + + + true + Console + true + true + + + true + + + + + MaxSpeed + true + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreaded + true + + + Level4 + ProgramDatabase + true + CompileAsC + + + true + Console + true + true + + + + + + + + + + {71dede59-3f1e-486b-a899-4283000f76b5} + false + + + + + + \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/Projects/VC2026/psicc/psicc.vcxproj.filters b/local/recipes/libs/lcms2/source/Projects/VC2026/psicc/psicc.vcxproj.filters new file mode 100644 index 0000000000..c42429d8be --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/VC2026/psicc/psicc.vcxproj.filters @@ -0,0 +1,28 @@ + + + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Source Files + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/Projects/VC2026/resource.h b/local/recipes/libs/lcms2/source/Projects/VC2026/resource.h new file mode 100644 index 0000000000..7655978dd4 --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/VC2026/resource.h @@ -0,0 +1,16 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by lcms2.rc +// + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NO_MFC 1 +#define _APS_NEXT_RESOURCE_VALUE 101 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1000 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/local/recipes/libs/lcms2/source/Projects/VC2026/testbed/testbed.vcxproj b/local/recipes/libs/lcms2/source/Projects/VC2026/testbed/testbed.vcxproj new file mode 100644 index 0000000000..10ee0b9973 --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/VC2026/testbed/testbed.vcxproj @@ -0,0 +1,302 @@ + + + + + Debug + ARM64 + + + Debug + Win32 + + + Debug + x64 + + + Release + ARM64 + + + Release + Win32 + + + Release + x64 + + + + {928A3A2B-46EF-4279-959C-513B3652FF0E} + testbed + Win32Proj + 10.0 + + + + Application + Unicode + true + v145 + + + Application + Unicode + true + v145 + + + Application + Unicode + true + v145 + + + Application + Unicode + v145 + true + + + Application + Unicode + v145 + + + Application + Unicode + v145 + false + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.21006.1 + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + true + true + true + ..\..\..\testbed\ + ..\..\..\testbed\ + ..\..\..\testbed\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + false + false + false + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + ..\..\..\testbed\ + ..\..\..\testbed\ + ..\..\..\testbed\ + + + + Disabled + ../../../include;../../../src;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + EditAndContinue + true + + + true + Console + MachineX86 + false + + + + + Disabled + ../../../include;../../../src;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + EditAndContinue + true + + + true + Console + false + + + + + Disabled + ../../../include;../../../src;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebug + + + Level3 + ProgramDatabase + true + CompileAsC + stdc11 + + + true + Console + false + + + + + Full + true + Speed + true + false + ../../../include;../../../src;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + false + true + NotSet + + + Level3 + ProgramDatabase + Cdecl + true + false + + + true + Console + true + true + MachineX86 + false + + + true + + + + + Full + true + Speed + true + false + ../../../include;../../../src;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + false + true + NotSet + + + Level3 + ProgramDatabase + Cdecl + true + false + + + true + Console + true + true + false + + + true + + + + + Full + true + Speed + true + true + ../../../include;../../../src;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreaded + false + true + NotSet + + + Level3 + ProgramDatabase + Cdecl + true + CompileAsC + stdc11 + + + true + Console + true + true + false + + + + + + + + + + {71dede59-3f1e-486b-a899-4283000f76b5} + + + + + + \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/Projects/VC2026/testbed/testbed.vcxproj.filters b/local/recipes/libs/lcms2/source/Projects/VC2026/testbed/testbed.vcxproj.filters new file mode 100644 index 0000000000..993ee15119 --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/VC2026/testbed/testbed.vcxproj.filters @@ -0,0 +1,28 @@ + + + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Source Files + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/Projects/VC2026/tiffdiff/tiffdiff.vcxproj b/local/recipes/libs/lcms2/source/Projects/VC2026/tiffdiff/tiffdiff.vcxproj new file mode 100644 index 0000000000..e043006903 --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/VC2026/tiffdiff/tiffdiff.vcxproj @@ -0,0 +1,320 @@ + + + + + Debug + ARM64 + + + Debug + Win32 + + + Debug + x64 + + + Release + ARM64 + + + Release + Win32 + + + Release + x64 + + + + {75B91835-CCD7-48BE-A606-A9C997D5DBEE} + tiffdiff + Win32Proj + 10.0 + + + + Application + Unicode + true + v145 + + + Application + Unicode + true + v145 + + + Application + Unicode + true + v145 + + + Application + Unicode + v145 + + + Application + Unicode + v145 + + + Application + Unicode + v145 + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.21006.1 + ..\..\..\bin\ + ..\..\..\bin\ + ..\..\..\bin\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + true + true + true + ..\..\..\bin\ + ..\..\..\bin\ + ..\..\..\bin\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + false + false + false + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + C:\jpeg-8d;$(IncludePath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff + C:\jpeg-8d;$(IncludePath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff + C:\jpeg-8d;$(IncludePath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff + C:\jpeg-8d;$(LibraryPath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff + C:\jpeg-8d;$(LibraryPath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff + C:\jpeg-8d;$(LibraryPath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff + C:\jpeg-8d;$(IncludePath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff + C:\jpeg-8d;$(IncludePath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff + C:\jpeg-8d;$(IncludePath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff + C:\jpeg-8d;$(LibraryPath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff + C:\jpeg-8d;$(LibraryPath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff + C:\jpeg-8d;$(LibraryPath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff + + + tifdiff + + + tifdiff + + + tifdiff + + + tifdiff + + + tifdiff + + + tifdiff + + + + Disabled + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + EditAndContinue + true + + + libtiff.lib;%(AdditionalDependencies) + true + Console + MachineX86 + false + + + + + Disabled + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + EditAndContinue + true + + + libtiff.lib;%(AdditionalDependencies) + true + Console + false + + + + + Disabled + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebug + + + Level4 + ProgramDatabase + true + CompileAsC + + + libtiff.lib;%(AdditionalDependencies) + true + Console + false + + + + + MaxSpeed + true + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level4 + ProgramDatabase + true + false + + + libtiff.lib;%(AdditionalDependencies) + true + Console + true + true + MachineX86 + $(OutDir)$(TargetName)$(TargetExt) + false + + + true + + + + + MaxSpeed + true + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level4 + ProgramDatabase + true + false + + + libtiff.lib;%(AdditionalDependencies) + true + Console + true + true + $(OutDir)$(TargetName)$(TargetExt) + false + + + true + + + + + MaxSpeed + true + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level4 + ProgramDatabase + true + CompileAsC + + + libtiff.lib;%(AdditionalDependencies) + true + Console + true + true + $(OutDir)$(TargetName)$(TargetExt) + false + + + + + + + + + + {71dede59-3f1e-486b-a899-4283000f76b5} + false + + + + + + diff --git a/local/recipes/libs/lcms2/source/Projects/VC2026/tiffdiff/tiffdiff.vcxproj.filters b/local/recipes/libs/lcms2/source/Projects/VC2026/tiffdiff/tiffdiff.vcxproj.filters new file mode 100644 index 0000000000..b7f9a80d10 --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/VC2026/tiffdiff/tiffdiff.vcxproj.filters @@ -0,0 +1,28 @@ + + + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Source Files + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/Projects/VC2026/tifficc/tifficc.vcxproj b/local/recipes/libs/lcms2/source/Projects/VC2026/tifficc/tifficc.vcxproj new file mode 100644 index 0000000000..8a7e6fcf3c --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/VC2026/tifficc/tifficc.vcxproj @@ -0,0 +1,308 @@ + + + + + Debug + ARM64 + + + Debug + Win32 + + + Debug + x64 + + + Release + ARM64 + + + Release + Win32 + + + Release + x64 + + + + {2256DE16-ED92-4A6F-9C54-F65BB61E64A2} + tifficc + Win32Proj + 10.0 + + + + Application + Unicode + true + v145 + + + Application + Unicode + true + v145 + + + Application + Unicode + true + v145 + + + Application + Unicode + v145 + + + Application + Unicode + v145 + + + Application + Unicode + v145 + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.21006.1 + ..\..\..\bin\ + ..\..\..\bin\ + ..\..\..\bin\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + true + true + true + ..\..\..\bin\ + ..\..\..\bin\ + ..\..\..\bin\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + false + false + false + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + $(IncludePath);c:/liteCommons/3rdparty/components/Win_$(PlatformShortName)/include + $(IncludePath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff + $(IncludePath);c:/liteCommons/3rdparty/components/Win_$(PlatformShortName)/include + $(LibraryPath);c:/liteCommons/3rdparty/components/Win_$(PlatformShortName)/lib + $(LibraryPath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff + $(LibraryPath);c:/liteCommons/3rdparty/components/Win_$(PlatformShortName)/lib + $(IncludePath);c:/liteCommons/3rdparty/components/Win_$(PlatformShortName)/include + $(IncludePath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff + $(IncludePath);c:/liteCommons/3rdparty/components/Win_$(PlatformShortName)/include + $(LibraryPath);c:/liteCommons/3rdparty/components/Win_$(PlatformShortName)/lib + $(LibraryPath);E:\liteCommons\3rdparty\tiff-4.1.0\libtiff + $(LibraryPath);c:/liteCommons/3rdparty/components/Win_$(PlatformShortName)/lib + + + tificc + + + tificc + + + + Disabled + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + EditAndContinue + true + + + tiff.lib;jpeg-static.lib;zlibstatic.lib;webp.lib;webpdecoder.lib;webpdemux.lib;webpmux.lib;%(AdditionalDependencies) + true + Console + MachineX86 + false + + + + + Disabled + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + EditAndContinue + true + + + libtiff.lib;%(AdditionalDependencies) + true + Console + false + + + + + Disabled + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + ProgramDatabase + true + CompileAsC + + + tiff.lib;jpeg-static.lib;zlibstatic.lib;webp.lib;webpdecoder.lib;webpdemux.lib;webpmux.lib;%(AdditionalDependencies) + true + Console + false + + + + + MaxSpeed + true + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level4 + ProgramDatabase + true + false + + + tiff.lib;jpeg-static.lib;zlibstatic.lib;webp.lib;webpdecoder.lib;webpdemux.lib;webpmux.lib;%(AdditionalDependencies) + true + Console + true + true + MachineX86 + false + + + true + + + + + MaxSpeed + true + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level4 + ProgramDatabase + true + false + + + libtiff.lib;%(AdditionalDependencies) + true + Console + true + true + false + + + true + + + + + MaxSpeed + true + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level4 + ProgramDatabase + true + CompileAsC + + + tiff.lib;jpeg-static.lib;zlibstatic.lib;webp.lib;webpdecoder.lib;webpdemux.lib;webpmux.lib;%(AdditionalDependencies) + true + Console + true + true + false + + + + + + + + + + + + + {71dede59-3f1e-486b-a899-4283000f76b5} + false + + + + + + \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/Projects/VC2026/tifficc/tifficc.vcxproj.filters b/local/recipes/libs/lcms2/source/Projects/VC2026/tifficc/tifficc.vcxproj.filters new file mode 100644 index 0000000000..2e0e44d1ea --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/VC2026/tifficc/tifficc.vcxproj.filters @@ -0,0 +1,33 @@ + + + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Source Files + + + Source Files + + + Source Files + + + + + Header Files + + + \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/Projects/VC2026/transicc/transicc.vcxproj b/local/recipes/libs/lcms2/source/Projects/VC2026/transicc/transicc.vcxproj new file mode 100644 index 0000000000..b1ea41a758 --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/VC2026/transicc/transicc.vcxproj @@ -0,0 +1,280 @@ + + + + + Debug + ARM64 + + + Debug + Win32 + + + Debug + x64 + + + Release + ARM64 + + + Release + Win32 + + + Release + x64 + + + + {9EE22D66-C849-474C-9ED5-C3E141DAB160} + transicc + Win32Proj + 10.0 + + + + Application + Unicode + true + v145 + + + Application + Unicode + true + v145 + + + Application + Unicode + true + v145 + + + Application + Unicode + v145 + + + Application + Unicode + v145 + + + Application + Unicode + v145 + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.21006.1 + ..\..\..\bin\ + ..\..\..\bin\ + ..\..\..\bin\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + true + true + true + ..\..\..\bin\ + ..\..\..\bin\ + ..\..\..\bin\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + $(Configuration)_$(Platform)\ + false + false + false + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + + + + Disabled + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + EditAndContinue + true + + + true + Console + MachineX86 + + + + + Disabled + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + EditAndContinue + true + + + true + Console + + + + + Disabled + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + ProgramDatabase + true + CompileAsC + + + true + Console + + + + + MaxSpeed + true + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level4 + ProgramDatabase + true + false + + + true + Console + true + true + MachineX86 + + + true + + + + + MaxSpeed + true + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level4 + ProgramDatabase + true + false + + + true + Console + true + true + + + true + + + + + MaxSpeed + true + ../../../include;../../../utils/common;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreaded + true + + + Level4 + ProgramDatabase + true + CompileAsC + + + true + Console + true + true + + + + + false + + + + + + + + + + {71dede59-3f1e-486b-a899-4283000f76b5} + false + + + + + + \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/Projects/VC2026/transicc/transicc.vcxproj.filters b/local/recipes/libs/lcms2/source/Projects/VC2026/transicc/transicc.vcxproj.filters new file mode 100644 index 0000000000..3d45443026 --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/VC2026/transicc/transicc.vcxproj.filters @@ -0,0 +1,33 @@ + + + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Source Files + + + Source Files + + + Source Files + + + + + Header Files + + + \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/Projects/Xcode_12/lcms2/lcms2.xcodeproj/project.pbxproj b/local/recipes/libs/lcms2/source/Projects/Xcode_12/lcms2/lcms2.xcodeproj/project.pbxproj new file mode 100644 index 0000000000..9f61a88401 --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/Xcode_12/lcms2/lcms2.xcodeproj/project.pbxproj @@ -0,0 +1,1387 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXBuildFile section */ + 4123B46925518DB1005F0287 /* linkicc.c in Sources */ = {isa = PBXBuildFile; fileRef = 4123B46825518DB1005F0287 /* linkicc.c */; }; + 4123B4A425518FFB005F0287 /* xgetopt.c in Sources */ = {isa = PBXBuildFile; fileRef = 4123B4A325518FFB005F0287 /* xgetopt.c */; }; + 4123B4B82551903B005F0287 /* tificc.c in Sources */ = {isa = PBXBuildFile; fileRef = 4123B4B72551903B005F0287 /* tificc.c */; }; + 4123B5042551A1C8005F0287 /* libfast_float_plugin.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 418B0A8F24C5E35200DF2C21 /* libfast_float_plugin.a */; }; + 418B0A5224C5E1C900DF2C21 /* cmsgamma.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A3824C5E1C700DF2C21 /* cmsgamma.c */; }; + 418B0A5324C5E1C900DF2C21 /* cmsintrp.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A3924C5E1C700DF2C21 /* cmsintrp.c */; }; + 418B0A5424C5E1C900DF2C21 /* cmsgmt.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A3A24C5E1C700DF2C21 /* cmsgmt.c */; }; + 418B0A5524C5E1C900DF2C21 /* cmscnvrt.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A3B24C5E1C700DF2C21 /* cmscnvrt.c */; }; + 418B0A5624C5E1C900DF2C21 /* cmsmd5.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A3C24C5E1C700DF2C21 /* cmsmd5.c */; }; + 418B0A5724C5E1C900DF2C21 /* cmssm.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A3D24C5E1C700DF2C21 /* cmssm.c */; }; + 418B0A5824C5E1C900DF2C21 /* cmsopt.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A3E24C5E1C700DF2C21 /* cmsopt.c */; }; + 418B0A5924C5E1C900DF2C21 /* cmscgats.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A3F24C5E1C700DF2C21 /* cmscgats.c */; }; + 418B0A5A24C5E1C900DF2C21 /* cmsalpha.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4024C5E1C800DF2C21 /* cmsalpha.c */; }; + 418B0A5B24C5E1C900DF2C21 /* cmstypes.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4124C5E1C800DF2C21 /* cmstypes.c */; }; + 418B0A5C24C5E1C900DF2C21 /* cmsio1.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4224C5E1C800DF2C21 /* cmsio1.c */; }; + 418B0A5D24C5E1C900DF2C21 /* cmspack.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4324C5E1C800DF2C21 /* cmspack.c */; }; + 418B0A5E24C5E1C900DF2C21 /* cmsxform.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4424C5E1C800DF2C21 /* cmsxform.c */; }; + 418B0A5F24C5E1C900DF2C21 /* cmswtpnt.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4524C5E1C800DF2C21 /* cmswtpnt.c */; }; + 418B0A6024C5E1C900DF2C21 /* cmsmtrx.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4624C5E1C800DF2C21 /* cmsmtrx.c */; }; + 418B0A6124C5E1C900DF2C21 /* cmspcs.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4724C5E1C800DF2C21 /* cmspcs.c */; }; + 418B0A6224C5E1C900DF2C21 /* cmsps2.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4824C5E1C800DF2C21 /* cmsps2.c */; }; + 418B0A6324C5E1C900DF2C21 /* cmsnamed.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4924C5E1C800DF2C21 /* cmsnamed.c */; }; + 418B0A6424C5E1C900DF2C21 /* cmserr.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4A24C5E1C800DF2C21 /* cmserr.c */; }; + 418B0A6524C5E1C900DF2C21 /* cmslut.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4B24C5E1C800DF2C21 /* cmslut.c */; }; + 418B0A6624C5E1C900DF2C21 /* cmsvirt.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4C24C5E1C800DF2C21 /* cmsvirt.c */; }; + 418B0A6724C5E1C900DF2C21 /* cmsplugin.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4D24C5E1C800DF2C21 /* cmsplugin.c */; }; + 418B0A6824C5E1C900DF2C21 /* cmshalf.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4E24C5E1C800DF2C21 /* cmshalf.c */; }; + 418B0A6924C5E1C900DF2C21 /* cmsio0.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4F24C5E1C900DF2C21 /* cmsio0.c */; }; + 418B0A6A24C5E1C900DF2C21 /* cmscam02.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A5024C5E1C900DF2C21 /* cmscam02.c */; }; + 418B0A6B24C5E1C900DF2C21 /* cmssamp.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A5124C5E1C900DF2C21 /* cmssamp.c */; }; + 418B0A6F24C5E1E800DF2C21 /* lcms2.h in Headers */ = {isa = PBXBuildFile; fileRef = 418B0A6D24C5E1E800DF2C21 /* lcms2.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 418B0A7024C5E1E800DF2C21 /* lcms2_plugin.h in Headers */ = {isa = PBXBuildFile; fileRef = 418B0A6E24C5E1E800DF2C21 /* lcms2_plugin.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 418B0A7224C5E1F400DF2C21 /* lcms2_internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 418B0A7124C5E1F400DF2C21 /* lcms2_internal.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 418B0A8A24C5E30000DF2C21 /* liblcms2.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 418B0A3124C5E19500DF2C21 /* liblcms2.a */; }; + 418B0AA124C5E37800DF2C21 /* fast_float_curves.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9324C5E37600DF2C21 /* fast_float_curves.c */; }; + 418B0AA224C5E37800DF2C21 /* fast_float_15mats.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9424C5E37600DF2C21 /* fast_float_15mats.c */; }; + 418B0AA324C5E37800DF2C21 /* fast_float_tethra.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9524C5E37600DF2C21 /* fast_float_tethra.c */; }; + 418B0AA424C5E37800DF2C21 /* fast_float_cmyk.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9624C5E37700DF2C21 /* fast_float_cmyk.c */; }; + 418B0AA524C5E37800DF2C21 /* fast_16_tethra.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9724C5E37700DF2C21 /* fast_16_tethra.c */; }; + 418B0AA624C5E37800DF2C21 /* fast_float_internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 418B0A9824C5E37700DF2C21 /* fast_float_internal.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 418B0AA724C5E37800DF2C21 /* fast_8_matsh.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9924C5E37700DF2C21 /* fast_8_matsh.c */; }; + 418B0AA824C5E37800DF2C21 /* fast_float_separate.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9A24C5E37700DF2C21 /* fast_float_separate.c */; }; + 418B0AA924C5E37800DF2C21 /* fast_8_matsh_sse.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9B24C5E37700DF2C21 /* fast_8_matsh_sse.c */; }; + 418B0AAA24C5E37800DF2C21 /* fast_8_tethra.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9C24C5E37700DF2C21 /* fast_8_tethra.c */; }; + 418B0AAB24C5E37800DF2C21 /* fast_float_sup.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9D24C5E37700DF2C21 /* fast_float_sup.c */; }; + 418B0AAC24C5E37800DF2C21 /* fast_float_15bits.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9E24C5E37700DF2C21 /* fast_float_15bits.c */; }; + 418B0AAD24C5E37800DF2C21 /* fast_8_curves.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9F24C5E37700DF2C21 /* fast_8_curves.c */; }; + 418B0AAE24C5E37800DF2C21 /* fast_float_matsh.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0AA024C5E37800DF2C21 /* fast_float_matsh.c */; }; + 418B0AB024C5E38C00DF2C21 /* lcms2_fast_float.h in Headers */ = {isa = PBXBuildFile; fileRef = 418B0AAF24C5E38C00DF2C21 /* lcms2_fast_float.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 418B0AC224C5E47C00DF2C21 /* liblcms2.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 418B0A3124C5E19500DF2C21 /* liblcms2.a */; }; + 418B0ADA24C5E58A00DF2C21 /* liblcms2.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 418B0A3124C5E19500DF2C21 /* liblcms2.a */; }; + 418B0AEA24C5E5CF00DF2C21 /* liblcms2.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 418B0A3124C5E19500DF2C21 /* liblcms2.a */; }; + 418B0AF224C5E6B000DF2C21 /* fast_float_testbed.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0AF124C5E6B000DF2C21 /* fast_float_testbed.c */; }; + 418B0AF624C5E6C800DF2C21 /* xgetopt.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0AF324C5E6C700DF2C21 /* xgetopt.c */; }; + 418B0AF724C5E6C800DF2C21 /* vprf.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0AF424C5E6C700DF2C21 /* vprf.c */; }; + 418B0AF924C5E6D200DF2C21 /* transicc.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0AF824C5E6D200DF2C21 /* transicc.c */; }; + 418B0AFF24C5E73100DF2C21 /* xgetopt.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0AFD24C5E73100DF2C21 /* xgetopt.c */; }; + 418B0B0024C5E73100DF2C21 /* vprf.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0AFE24C5E73100DF2C21 /* vprf.c */; }; + 418B0B0F24C5E79200DF2C21 /* utils.h in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B0E24C5E79200DF2C21 /* utils.h */; }; + 418B0B1424C5E7BB00DF2C21 /* vprf.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B1224C5E7BB00DF2C21 /* vprf.c */; }; + 418B0B1524C5E7CF00DF2C21 /* liblcms2.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 418B0A3124C5E19500DF2C21 /* liblcms2.a */; }; + 418B0B2124C5E8FA00DF2C21 /* liblcms2.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 418B0A3124C5E19500DF2C21 /* liblcms2.a */; }; + 418B0B2524C5E92100DF2C21 /* tifdiff.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B2424C5E92100DF2C21 /* tifdiff.c */; }; + 418B0B2924C5E92B00DF2C21 /* vprf.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B2724C5E92B00DF2C21 /* vprf.c */; }; + 418B0B2A24C5E92B00DF2C21 /* xgetopt.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B2824C5E92B00DF2C21 /* xgetopt.c */; }; + 418B0B3824C5E98E00DF2C21 /* iccjpeg.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B3624C5E98E00DF2C21 /* iccjpeg.c */; }; + 418B0B3A24C5E99600DF2C21 /* jpgicc.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B3924C5E99600DF2C21 /* jpgicc.c */; }; + 418B0B3D24C5E9A200DF2C21 /* liblcms2.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 418B0A3124C5E19500DF2C21 /* liblcms2.a */; }; + 418B0B4124C5E9F700DF2C21 /* vprf.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B3E24C5E9F700DF2C21 /* vprf.c */; }; + 418B0B4224C5E9F700DF2C21 /* xgetopt.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B3F24C5E9F700DF2C21 /* xgetopt.c */; }; + 418B0B4624C5EC1D00DF2C21 /* testcms2.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B4324C5EC1D00DF2C21 /* testcms2.c */; }; + 418B0B4724C5EC1D00DF2C21 /* testplugin.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B4524C5EC1D00DF2C21 /* testplugin.c */; }; + 418B0B4924C5EC2A00DF2C21 /* zoo_icc.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B4824C5EC2A00DF2C21 /* zoo_icc.c */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 418B0A8524C5E29800DF2C21 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 418B0A2924C5E19500DF2C21 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 418B0A3024C5E19500DF2C21; + remoteInfo = lcms2; + }; + 418B0AB224C5E3D400DF2C21 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 418B0A2924C5E19500DF2C21 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 418B0A3024C5E19500DF2C21; + remoteInfo = lcms2; + }; + 418B0AC324C5E48100DF2C21 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 418B0A2924C5E19500DF2C21 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 418B0A8E24C5E35200DF2C21; + remoteInfo = fast_float_plugin; + }; + 418B0AC524C5E48600DF2C21 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 418B0A2924C5E19500DF2C21 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 418B0A3024C5E19500DF2C21; + remoteInfo = lcms2; + }; + 418B0ADB24C5E58F00DF2C21 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 418B0A2924C5E19500DF2C21 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 418B0A3024C5E19500DF2C21; + remoteInfo = lcms2; + }; + 418B0AE824C5E5CA00DF2C21 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 418B0A2924C5E19500DF2C21 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 418B0A3024C5E19500DF2C21; + remoteInfo = lcms2; + }; + 418B0B0C24C5E77500DF2C21 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 418B0A2924C5E19500DF2C21 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 418B0A3024C5E19500DF2C21; + remoteInfo = lcms2; + }; + 418B0B2224C5E8FA00DF2C21 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 418B0A2924C5E19500DF2C21 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 418B0A3024C5E19500DF2C21; + remoteInfo = lcms2; + }; + 418B0B3B24C5E99E00DF2C21 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 418B0A2924C5E19500DF2C21 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 418B0A3024C5E19500DF2C21; + remoteInfo = lcms2; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 418B0A7624C5E25200DF2C21 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; + 418B0AB624C5E42900DF2C21 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; + 418B0AC924C5E4EA00DF2C21 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; + 418B0ADF24C5E5C300DF2C21 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; + 418B0B0324C5E76100DF2C21 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; + 418B0B1824C5E85600DF2C21 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; + 418B0B2D24C5E95D00DF2C21 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 4123B46825518DB1005F0287 /* linkicc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = linkicc.c; sourceTree = ""; }; + 4123B4A325518FFB005F0287 /* xgetopt.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = xgetopt.c; path = ../common/xgetopt.c; sourceTree = ""; }; + 4123B4B72551903B005F0287 /* tificc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = tificc.c; sourceTree = ""; }; + 4123B4C2255190FE005F0287 /* tifdiff.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = tifdiff.c; sourceTree = ""; }; + 418B0A3124C5E19500DF2C21 /* liblcms2.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = liblcms2.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 418B0A3824C5E1C700DF2C21 /* cmsgamma.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsgamma.c; path = ../../../src/cmsgamma.c; sourceTree = ""; }; + 418B0A3924C5E1C700DF2C21 /* cmsintrp.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsintrp.c; path = ../../../src/cmsintrp.c; sourceTree = ""; }; + 418B0A3A24C5E1C700DF2C21 /* cmsgmt.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsgmt.c; path = ../../../src/cmsgmt.c; sourceTree = ""; }; + 418B0A3B24C5E1C700DF2C21 /* cmscnvrt.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmscnvrt.c; path = ../../../src/cmscnvrt.c; sourceTree = ""; }; + 418B0A3C24C5E1C700DF2C21 /* cmsmd5.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsmd5.c; path = ../../../src/cmsmd5.c; sourceTree = ""; }; + 418B0A3D24C5E1C700DF2C21 /* cmssm.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmssm.c; path = ../../../src/cmssm.c; sourceTree = ""; }; + 418B0A3E24C5E1C700DF2C21 /* cmsopt.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsopt.c; path = ../../../src/cmsopt.c; sourceTree = ""; }; + 418B0A3F24C5E1C700DF2C21 /* cmscgats.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmscgats.c; path = ../../../src/cmscgats.c; sourceTree = ""; }; + 418B0A4024C5E1C800DF2C21 /* cmsalpha.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsalpha.c; path = ../../../src/cmsalpha.c; sourceTree = ""; }; + 418B0A4124C5E1C800DF2C21 /* cmstypes.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmstypes.c; path = ../../../src/cmstypes.c; sourceTree = ""; }; + 418B0A4224C5E1C800DF2C21 /* cmsio1.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsio1.c; path = ../../../src/cmsio1.c; sourceTree = ""; }; + 418B0A4324C5E1C800DF2C21 /* cmspack.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmspack.c; path = ../../../src/cmspack.c; sourceTree = ""; }; + 418B0A4424C5E1C800DF2C21 /* cmsxform.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsxform.c; path = ../../../src/cmsxform.c; sourceTree = ""; }; + 418B0A4524C5E1C800DF2C21 /* cmswtpnt.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmswtpnt.c; path = ../../../src/cmswtpnt.c; sourceTree = ""; }; + 418B0A4624C5E1C800DF2C21 /* cmsmtrx.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsmtrx.c; path = ../../../src/cmsmtrx.c; sourceTree = ""; }; + 418B0A4724C5E1C800DF2C21 /* cmspcs.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmspcs.c; path = ../../../src/cmspcs.c; sourceTree = ""; }; + 418B0A4824C5E1C800DF2C21 /* cmsps2.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsps2.c; path = ../../../src/cmsps2.c; sourceTree = ""; }; + 418B0A4924C5E1C800DF2C21 /* cmsnamed.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsnamed.c; path = ../../../src/cmsnamed.c; sourceTree = ""; }; + 418B0A4A24C5E1C800DF2C21 /* cmserr.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmserr.c; path = ../../../src/cmserr.c; sourceTree = ""; }; + 418B0A4B24C5E1C800DF2C21 /* cmslut.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmslut.c; path = ../../../src/cmslut.c; sourceTree = ""; }; + 418B0A4C24C5E1C800DF2C21 /* cmsvirt.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsvirt.c; path = ../../../src/cmsvirt.c; sourceTree = ""; }; + 418B0A4D24C5E1C800DF2C21 /* cmsplugin.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsplugin.c; path = ../../../src/cmsplugin.c; sourceTree = ""; }; + 418B0A4E24C5E1C800DF2C21 /* cmshalf.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmshalf.c; path = ../../../src/cmshalf.c; sourceTree = ""; }; + 418B0A4F24C5E1C900DF2C21 /* cmsio0.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsio0.c; path = ../../../src/cmsio0.c; sourceTree = ""; }; + 418B0A5024C5E1C900DF2C21 /* cmscam02.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmscam02.c; path = ../../../src/cmscam02.c; sourceTree = ""; }; + 418B0A5124C5E1C900DF2C21 /* cmssamp.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmssamp.c; path = ../../../src/cmssamp.c; sourceTree = ""; }; + 418B0A6D24C5E1E800DF2C21 /* lcms2.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = lcms2.h; path = ../../../include/lcms2.h; sourceTree = ""; }; + 418B0A6E24C5E1E800DF2C21 /* lcms2_plugin.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = lcms2_plugin.h; path = ../../../include/lcms2_plugin.h; sourceTree = ""; }; + 418B0A7124C5E1F400DF2C21 /* lcms2_internal.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = lcms2_internal.h; path = ../../../src/lcms2_internal.h; sourceTree = ""; }; + 418B0A7824C5E25200DF2C21 /* testbed */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = testbed; sourceTree = BUILT_PRODUCTS_DIR; }; + 418B0A8F24C5E35200DF2C21 /* libfast_float_plugin.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libfast_float_plugin.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 418B0A9324C5E37600DF2C21 /* fast_float_curves.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_float_curves.c; path = ../../../plugins/fast_float/src/fast_float_curves.c; sourceTree = ""; }; + 418B0A9424C5E37600DF2C21 /* fast_float_15mats.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_float_15mats.c; path = ../../../plugins/fast_float/src/fast_float_15mats.c; sourceTree = ""; }; + 418B0A9524C5E37600DF2C21 /* fast_float_tethra.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_float_tethra.c; path = ../../../plugins/fast_float/src/fast_float_tethra.c; sourceTree = ""; }; + 418B0A9624C5E37700DF2C21 /* fast_float_cmyk.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_float_cmyk.c; path = ../../../plugins/fast_float/src/fast_float_cmyk.c; sourceTree = ""; }; + 418B0A9724C5E37700DF2C21 /* fast_16_tethra.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_16_tethra.c; path = ../../../plugins/fast_float/src/fast_16_tethra.c; sourceTree = ""; }; + 418B0A9824C5E37700DF2C21 /* fast_float_internal.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = fast_float_internal.h; path = ../../../plugins/fast_float/src/fast_float_internal.h; sourceTree = ""; }; + 418B0A9924C5E37700DF2C21 /* fast_8_matsh.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_8_matsh.c; path = ../../../plugins/fast_float/src/fast_8_matsh.c; sourceTree = ""; }; + 418B0A9A24C5E37700DF2C21 /* fast_float_separate.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_float_separate.c; path = ../../../plugins/fast_float/src/fast_float_separate.c; sourceTree = ""; }; + 418B0A9B24C5E37700DF2C21 /* fast_8_matsh_sse.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_8_matsh_sse.c; path = ../../../plugins/fast_float/src/fast_8_matsh_sse.c; sourceTree = ""; }; + 418B0A9C24C5E37700DF2C21 /* fast_8_tethra.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_8_tethra.c; path = ../../../plugins/fast_float/src/fast_8_tethra.c; sourceTree = ""; }; + 418B0A9D24C5E37700DF2C21 /* fast_float_sup.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_float_sup.c; path = ../../../plugins/fast_float/src/fast_float_sup.c; sourceTree = ""; }; + 418B0A9E24C5E37700DF2C21 /* fast_float_15bits.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_float_15bits.c; path = ../../../plugins/fast_float/src/fast_float_15bits.c; sourceTree = ""; }; + 418B0A9F24C5E37700DF2C21 /* fast_8_curves.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_8_curves.c; path = ../../../plugins/fast_float/src/fast_8_curves.c; sourceTree = ""; }; + 418B0AA024C5E37800DF2C21 /* fast_float_matsh.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_float_matsh.c; path = ../../../plugins/fast_float/src/fast_float_matsh.c; sourceTree = ""; }; + 418B0AAF24C5E38C00DF2C21 /* lcms2_fast_float.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = lcms2_fast_float.h; path = ../../../plugins/fast_float/include/lcms2_fast_float.h; sourceTree = ""; }; + 418B0AB824C5E42900DF2C21 /* testbed */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; name = testbed; path = fast_float_testbed; sourceTree = BUILT_PRODUCTS_DIR; }; + 418B0ACB24C5E4EA00DF2C21 /* transicc */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = transicc; sourceTree = BUILT_PRODUCTS_DIR; }; + 418B0AE124C5E5C300DF2C21 /* linkicc */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = linkicc; sourceTree = BUILT_PRODUCTS_DIR; }; + 418B0AF124C5E6B000DF2C21 /* fast_float_testbed.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = fast_float_testbed.c; path = ../../../plugins/fast_float/testbed/fast_float_testbed.c; sourceTree = SOURCE_ROOT; }; + 418B0AF324C5E6C700DF2C21 /* xgetopt.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = xgetopt.c; path = ../../../utils/common/xgetopt.c; sourceTree = SOURCE_ROOT; }; + 418B0AF424C5E6C700DF2C21 /* vprf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = vprf.c; path = ../../../utils/common/vprf.c; sourceTree = SOURCE_ROOT; }; + 418B0AF524C5E6C800DF2C21 /* utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = utils.h; path = ../../../utils/common/utils.h; sourceTree = SOURCE_ROOT; }; + 418B0AF824C5E6D200DF2C21 /* transicc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = transicc.c; path = ../../../utils/transicc/transicc.c; sourceTree = SOURCE_ROOT; }; + 418B0AFC24C5E73100DF2C21 /* utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = utils.h; path = ../../../utils/common/utils.h; sourceTree = SOURCE_ROOT; }; + 418B0AFD24C5E73100DF2C21 /* xgetopt.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = xgetopt.c; path = ../../../utils/common/xgetopt.c; sourceTree = SOURCE_ROOT; }; + 418B0AFE24C5E73100DF2C21 /* vprf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = vprf.c; path = ../../../utils/common/vprf.c; sourceTree = SOURCE_ROOT; }; + 418B0B0524C5E76100DF2C21 /* tificc */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = tificc; sourceTree = BUILT_PRODUCTS_DIR; }; + 418B0B0E24C5E79200DF2C21 /* utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = utils.h; path = ../../../utils/common/utils.h; sourceTree = SOURCE_ROOT; }; + 418B0B1224C5E7BB00DF2C21 /* vprf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = vprf.c; path = ../../../utils/common/vprf.c; sourceTree = SOURCE_ROOT; }; + 418B0B1A24C5E85600DF2C21 /* tifdiff */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = tifdiff; sourceTree = BUILT_PRODUCTS_DIR; }; + 418B0B2424C5E92100DF2C21 /* tifdiff.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = tifdiff.c; path = ../../../utils/tificc/tifdiff.c; sourceTree = SOURCE_ROOT; }; + 418B0B2724C5E92B00DF2C21 /* vprf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = vprf.c; path = ../common/vprf.c; sourceTree = ""; }; + 418B0B2824C5E92B00DF2C21 /* xgetopt.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = xgetopt.c; path = ../common/xgetopt.c; sourceTree = ""; }; + 418B0B2F24C5E95D00DF2C21 /* jpegicc */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jpegicc; sourceTree = BUILT_PRODUCTS_DIR; }; + 418B0B3624C5E98E00DF2C21 /* iccjpeg.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = iccjpeg.c; path = ../../../utils/jpgicc/iccjpeg.c; sourceTree = SOURCE_ROOT; }; + 418B0B3724C5E98E00DF2C21 /* iccjpeg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = iccjpeg.h; path = ../../../utils/jpgicc/iccjpeg.h; sourceTree = SOURCE_ROOT; }; + 418B0B3924C5E99600DF2C21 /* jpgicc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = jpgicc.c; sourceTree = ""; }; + 418B0B3E24C5E9F700DF2C21 /* vprf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = vprf.c; path = ../../../utils/common/vprf.c; sourceTree = SOURCE_ROOT; }; + 418B0B3F24C5E9F700DF2C21 /* xgetopt.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = xgetopt.c; path = ../../../utils/common/xgetopt.c; sourceTree = SOURCE_ROOT; }; + 418B0B4024C5E9F700DF2C21 /* utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = utils.h; path = ../../../utils/common/utils.h; sourceTree = SOURCE_ROOT; }; + 418B0B4324C5EC1D00DF2C21 /* testcms2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = testcms2.c; path = ../../../testbed/testcms2.c; sourceTree = SOURCE_ROOT; }; + 418B0B4424C5EC1D00DF2C21 /* testcms2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = testcms2.h; path = ../../../testbed/testcms2.h; sourceTree = SOURCE_ROOT; }; + 418B0B4524C5EC1D00DF2C21 /* testplugin.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = testplugin.c; path = ../../../testbed/testplugin.c; sourceTree = ""; }; + 418B0B4824C5EC2A00DF2C21 /* zoo_icc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zoo_icc.c; path = ../../../testbed/zoo_icc.c; sourceTree = SOURCE_ROOT; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 418B0A2F24C5E19500DF2C21 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 418B0A7524C5E25200DF2C21 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 418B0A8A24C5E30000DF2C21 /* liblcms2.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 418B0A8D24C5E35200DF2C21 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 418B0AB524C5E42900DF2C21 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 418B0AC224C5E47C00DF2C21 /* liblcms2.a in Frameworks */, + 4123B5042551A1C8005F0287 /* libfast_float_plugin.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 418B0AC824C5E4EA00DF2C21 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 418B0ADA24C5E58A00DF2C21 /* liblcms2.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 418B0ADE24C5E5C300DF2C21 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 418B0AEA24C5E5CF00DF2C21 /* liblcms2.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 418B0B0224C5E76100DF2C21 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 418B0B1524C5E7CF00DF2C21 /* liblcms2.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 418B0B1724C5E85600DF2C21 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 418B0B2124C5E8FA00DF2C21 /* liblcms2.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 418B0B2C24C5E95D00DF2C21 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 418B0B3D24C5E9A200DF2C21 /* liblcms2.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 418B0A2824C5E19500DF2C21 = { + isa = PBXGroup; + children = ( + 418B0AB124C5E39A00DF2C21 /* fast_float_plugin */, + 418B0A7324C5E1FE00DF2C21 /* include */, + 418B0A6C24C5E1CE00DF2C21 /* src */, + 418B0A7924C5E25200DF2C21 /* testbed */, + 418B0AB924C5E42900DF2C21 /* fast_float_testbed */, + 418B0ACC24C5E4EA00DF2C21 /* transicc */, + 418B0AE224C5E5C300DF2C21 /* linkicc */, + 418B0B0624C5E76100DF2C21 /* tificc */, + 418B0B1B24C5E85600DF2C21 /* tifdiff */, + 418B0B3024C5E95D00DF2C21 /* jpegicc */, + 418B0A3224C5E19500DF2C21 /* Products */, + 418B0A8924C5E30000DF2C21 /* Frameworks */, + ); + sourceTree = ""; + }; + 418B0A3224C5E19500DF2C21 /* Products */ = { + isa = PBXGroup; + children = ( + 418B0A3124C5E19500DF2C21 /* liblcms2.a */, + 418B0A7824C5E25200DF2C21 /* testbed */, + 418B0A8F24C5E35200DF2C21 /* libfast_float_plugin.a */, + 418B0AB824C5E42900DF2C21 /* testbed */, + 418B0ACB24C5E4EA00DF2C21 /* transicc */, + 418B0AE124C5E5C300DF2C21 /* linkicc */, + 418B0B0524C5E76100DF2C21 /* tificc */, + 418B0B1A24C5E85600DF2C21 /* tifdiff */, + 418B0B2F24C5E95D00DF2C21 /* jpegicc */, + ); + name = Products; + sourceTree = ""; + }; + 418B0A6C24C5E1CE00DF2C21 /* src */ = { + isa = PBXGroup; + children = ( + 418B0A7124C5E1F400DF2C21 /* lcms2_internal.h */, + 418B0A4024C5E1C800DF2C21 /* cmsalpha.c */, + 418B0A5024C5E1C900DF2C21 /* cmscam02.c */, + 418B0A3F24C5E1C700DF2C21 /* cmscgats.c */, + 418B0A3B24C5E1C700DF2C21 /* cmscnvrt.c */, + 418B0A4A24C5E1C800DF2C21 /* cmserr.c */, + 418B0A3824C5E1C700DF2C21 /* cmsgamma.c */, + 418B0A3A24C5E1C700DF2C21 /* cmsgmt.c */, + 418B0A4E24C5E1C800DF2C21 /* cmshalf.c */, + 418B0A3924C5E1C700DF2C21 /* cmsintrp.c */, + 418B0A4F24C5E1C900DF2C21 /* cmsio0.c */, + 418B0A4224C5E1C800DF2C21 /* cmsio1.c */, + 418B0A4B24C5E1C800DF2C21 /* cmslut.c */, + 418B0A3C24C5E1C700DF2C21 /* cmsmd5.c */, + 418B0A4624C5E1C800DF2C21 /* cmsmtrx.c */, + 418B0A4924C5E1C800DF2C21 /* cmsnamed.c */, + 418B0A3E24C5E1C700DF2C21 /* cmsopt.c */, + 418B0A4324C5E1C800DF2C21 /* cmspack.c */, + 418B0A4724C5E1C800DF2C21 /* cmspcs.c */, + 418B0A4D24C5E1C800DF2C21 /* cmsplugin.c */, + 418B0A4824C5E1C800DF2C21 /* cmsps2.c */, + 418B0A5124C5E1C900DF2C21 /* cmssamp.c */, + 418B0A3D24C5E1C700DF2C21 /* cmssm.c */, + 418B0A4124C5E1C800DF2C21 /* cmstypes.c */, + 418B0A4C24C5E1C800DF2C21 /* cmsvirt.c */, + 418B0A4524C5E1C800DF2C21 /* cmswtpnt.c */, + 418B0A4424C5E1C800DF2C21 /* cmsxform.c */, + ); + name = src; + sourceTree = ""; + }; + 418B0A7324C5E1FE00DF2C21 /* include */ = { + isa = PBXGroup; + children = ( + 418B0A6E24C5E1E800DF2C21 /* lcms2_plugin.h */, + 418B0A6D24C5E1E800DF2C21 /* lcms2.h */, + ); + name = include; + sourceTree = ""; + }; + 418B0A7924C5E25200DF2C21 /* testbed */ = { + isa = PBXGroup; + children = ( + 418B0B4824C5EC2A00DF2C21 /* zoo_icc.c */, + 418B0B4324C5EC1D00DF2C21 /* testcms2.c */, + 418B0B4424C5EC1D00DF2C21 /* testcms2.h */, + 418B0B4524C5EC1D00DF2C21 /* testplugin.c */, + ); + name = testbed; + sourceTree = SOURCE_ROOT; + }; + 418B0A8924C5E30000DF2C21 /* Frameworks */ = { + isa = PBXGroup; + children = ( + ); + name = Frameworks; + sourceTree = ""; + }; + 418B0AB124C5E39A00DF2C21 /* fast_float_plugin */ = { + isa = PBXGroup; + children = ( + 418B0AAF24C5E38C00DF2C21 /* lcms2_fast_float.h */, + 418B0A9F24C5E37700DF2C21 /* fast_8_curves.c */, + 418B0A9B24C5E37700DF2C21 /* fast_8_matsh_sse.c */, + 418B0A9924C5E37700DF2C21 /* fast_8_matsh.c */, + 418B0A9C24C5E37700DF2C21 /* fast_8_tethra.c */, + 418B0A9724C5E37700DF2C21 /* fast_16_tethra.c */, + 418B0A9E24C5E37700DF2C21 /* fast_float_15bits.c */, + 418B0A9424C5E37600DF2C21 /* fast_float_15mats.c */, + 418B0A9624C5E37700DF2C21 /* fast_float_cmyk.c */, + 418B0A9324C5E37600DF2C21 /* fast_float_curves.c */, + 418B0A9824C5E37700DF2C21 /* fast_float_internal.h */, + 418B0AA024C5E37800DF2C21 /* fast_float_matsh.c */, + 418B0A9A24C5E37700DF2C21 /* fast_float_separate.c */, + 418B0A9D24C5E37700DF2C21 /* fast_float_sup.c */, + 418B0A9524C5E37600DF2C21 /* fast_float_tethra.c */, + ); + name = fast_float_plugin; + sourceTree = ""; + }; + 418B0AB924C5E42900DF2C21 /* fast_float_testbed */ = { + isa = PBXGroup; + children = ( + 418B0AF124C5E6B000DF2C21 /* fast_float_testbed.c */, + ); + name = fast_float_testbed; + path = ../../../plugins/fast_float/testbed; + sourceTree = ""; + }; + 418B0ACC24C5E4EA00DF2C21 /* transicc */ = { + isa = PBXGroup; + children = ( + 418B0AF824C5E6D200DF2C21 /* transicc.c */, + 418B0AF524C5E6C800DF2C21 /* utils.h */, + 418B0AF424C5E6C700DF2C21 /* vprf.c */, + 418B0AF324C5E6C700DF2C21 /* xgetopt.c */, + ); + name = transicc; + sourceTree = SOURCE_ROOT; + }; + 418B0AE224C5E5C300DF2C21 /* linkicc */ = { + isa = PBXGroup; + children = ( + 4123B46825518DB1005F0287 /* linkicc.c */, + 418B0AFC24C5E73100DF2C21 /* utils.h */, + 418B0AFE24C5E73100DF2C21 /* vprf.c */, + 418B0AFD24C5E73100DF2C21 /* xgetopt.c */, + ); + name = linkicc; + path = ../../../utils/linkicc; + sourceTree = SOURCE_ROOT; + }; + 418B0B0624C5E76100DF2C21 /* tificc */ = { + isa = PBXGroup; + children = ( + 4123B4B72551903B005F0287 /* tificc.c */, + 4123B4A325518FFB005F0287 /* xgetopt.c */, + 418B0B1224C5E7BB00DF2C21 /* vprf.c */, + 418B0B0E24C5E79200DF2C21 /* utils.h */, + ); + name = tificc; + path = ../../../utils/tificc; + sourceTree = SOURCE_ROOT; + }; + 418B0B1B24C5E85600DF2C21 /* tifdiff */ = { + isa = PBXGroup; + children = ( + 4123B4C2255190FE005F0287 /* tifdiff.c */, + 418B0B2724C5E92B00DF2C21 /* vprf.c */, + 418B0B2824C5E92B00DF2C21 /* xgetopt.c */, + 418B0B2424C5E92100DF2C21 /* tifdiff.c */, + ); + name = tifdiff; + path = ../../../utils/tificc; + sourceTree = SOURCE_ROOT; + }; + 418B0B3024C5E95D00DF2C21 /* jpegicc */ = { + isa = PBXGroup; + children = ( + 418B0B4024C5E9F700DF2C21 /* utils.h */, + 418B0B3E24C5E9F700DF2C21 /* vprf.c */, + 418B0B3F24C5E9F700DF2C21 /* xgetopt.c */, + 418B0B3924C5E99600DF2C21 /* jpgicc.c */, + 418B0B3624C5E98E00DF2C21 /* iccjpeg.c */, + 418B0B3724C5E98E00DF2C21 /* iccjpeg.h */, + ); + name = jpegicc; + path = ../../../utils/jpgicc; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 418B0A2D24C5E19500DF2C21 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 418B0A6F24C5E1E800DF2C21 /* lcms2.h in Headers */, + 418B0A7024C5E1E800DF2C21 /* lcms2_plugin.h in Headers */, + 418B0A7224C5E1F400DF2C21 /* lcms2_internal.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 418B0A8B24C5E35200DF2C21 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 418B0AB024C5E38C00DF2C21 /* lcms2_fast_float.h in Headers */, + 418B0AA624C5E37800DF2C21 /* fast_float_internal.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 418B0A3024C5E19500DF2C21 /* lcms2 */ = { + isa = PBXNativeTarget; + buildConfigurationList = 418B0A3524C5E19500DF2C21 /* Build configuration list for PBXNativeTarget "lcms2" */; + buildPhases = ( + 418B0A2D24C5E19500DF2C21 /* Headers */, + 418B0A2E24C5E19500DF2C21 /* Sources */, + 418B0A2F24C5E19500DF2C21 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = lcms2; + productName = lcms2; + productReference = 418B0A3124C5E19500DF2C21 /* liblcms2.a */; + productType = "com.apple.product-type.library.static"; + }; + 418B0A7724C5E25200DF2C21 /* testbed */ = { + isa = PBXNativeTarget; + buildConfigurationList = 418B0A7C24C5E25200DF2C21 /* Build configuration list for PBXNativeTarget "testbed" */; + buildPhases = ( + 418B0A7424C5E25200DF2C21 /* Sources */, + 418B0A7524C5E25200DF2C21 /* Frameworks */, + 418B0A7624C5E25200DF2C21 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + 418B0A8624C5E29800DF2C21 /* PBXTargetDependency */, + ); + name = testbed; + productName = testbed; + productReference = 418B0A7824C5E25200DF2C21 /* testbed */; + productType = "com.apple.product-type.tool"; + }; + 418B0A8E24C5E35200DF2C21 /* fast_float_plugin */ = { + isa = PBXNativeTarget; + buildConfigurationList = 418B0A9024C5E35200DF2C21 /* Build configuration list for PBXNativeTarget "fast_float_plugin" */; + buildPhases = ( + 418B0A8B24C5E35200DF2C21 /* Headers */, + 418B0A8C24C5E35200DF2C21 /* Sources */, + 418B0A8D24C5E35200DF2C21 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 418B0AB324C5E3D400DF2C21 /* PBXTargetDependency */, + ); + name = fast_float_plugin; + productName = fast_float_plugin; + productReference = 418B0A8F24C5E35200DF2C21 /* libfast_float_plugin.a */; + productType = "com.apple.product-type.library.static"; + }; + 418B0AB724C5E42900DF2C21 /* fast_float_testbed */ = { + isa = PBXNativeTarget; + buildConfigurationList = 418B0ABC24C5E42900DF2C21 /* Build configuration list for PBXNativeTarget "fast_float_testbed" */; + buildPhases = ( + 418B0AB424C5E42900DF2C21 /* Sources */, + 418B0AB524C5E42900DF2C21 /* Frameworks */, + 418B0AB624C5E42900DF2C21 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + 418B0AC624C5E48600DF2C21 /* PBXTargetDependency */, + 418B0AC424C5E48100DF2C21 /* PBXTargetDependency */, + ); + name = fast_float_testbed; + productName = fast_float_testbed; + productReference = 418B0AB824C5E42900DF2C21 /* testbed */; + productType = "com.apple.product-type.tool"; + }; + 418B0ACA24C5E4EA00DF2C21 /* transicc */ = { + isa = PBXNativeTarget; + buildConfigurationList = 418B0ACF24C5E4EA00DF2C21 /* Build configuration list for PBXNativeTarget "transicc" */; + buildPhases = ( + 418B0AC724C5E4EA00DF2C21 /* Sources */, + 418B0AC824C5E4EA00DF2C21 /* Frameworks */, + 418B0AC924C5E4EA00DF2C21 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + 418B0ADC24C5E58F00DF2C21 /* PBXTargetDependency */, + ); + name = transicc; + productName = transicc; + productReference = 418B0ACB24C5E4EA00DF2C21 /* transicc */; + productType = "com.apple.product-type.tool"; + }; + 418B0AE024C5E5C300DF2C21 /* linkicc */ = { + isa = PBXNativeTarget; + buildConfigurationList = 418B0AE524C5E5C300DF2C21 /* Build configuration list for PBXNativeTarget "linkicc" */; + buildPhases = ( + 418B0ADD24C5E5C300DF2C21 /* Sources */, + 418B0ADE24C5E5C300DF2C21 /* Frameworks */, + 418B0ADF24C5E5C300DF2C21 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + 418B0AE924C5E5CA00DF2C21 /* PBXTargetDependency */, + ); + name = linkicc; + productName = linkicc; + productReference = 418B0AE124C5E5C300DF2C21 /* linkicc */; + productType = "com.apple.product-type.tool"; + }; + 418B0B0424C5E76100DF2C21 /* tificc */ = { + isa = PBXNativeTarget; + buildConfigurationList = 418B0B0924C5E76100DF2C21 /* Build configuration list for PBXNativeTarget "tificc" */; + buildPhases = ( + 418B0B0124C5E76100DF2C21 /* Sources */, + 418B0B0224C5E76100DF2C21 /* Frameworks */, + 418B0B0324C5E76100DF2C21 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + 418B0B0D24C5E77500DF2C21 /* PBXTargetDependency */, + ); + name = tificc; + productName = tificc; + productReference = 418B0B0524C5E76100DF2C21 /* tificc */; + productType = "com.apple.product-type.tool"; + }; + 418B0B1924C5E85600DF2C21 /* tifdiff */ = { + isa = PBXNativeTarget; + buildConfigurationList = 418B0B1E24C5E85600DF2C21 /* Build configuration list for PBXNativeTarget "tifdiff" */; + buildPhases = ( + 418B0B1624C5E85600DF2C21 /* Sources */, + 418B0B1724C5E85600DF2C21 /* Frameworks */, + 418B0B1824C5E85600DF2C21 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + 418B0B2324C5E8FA00DF2C21 /* PBXTargetDependency */, + ); + name = tifdiff; + productName = tifdiff; + productReference = 418B0B1A24C5E85600DF2C21 /* tifdiff */; + productType = "com.apple.product-type.tool"; + }; + 418B0B2E24C5E95D00DF2C21 /* jpegicc */ = { + isa = PBXNativeTarget; + buildConfigurationList = 418B0B3324C5E95D00DF2C21 /* Build configuration list for PBXNativeTarget "jpegicc" */; + buildPhases = ( + 418B0B2B24C5E95D00DF2C21 /* Sources */, + 418B0B2C24C5E95D00DF2C21 /* Frameworks */, + 418B0B2D24C5E95D00DF2C21 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + 418B0B3C24C5E99E00DF2C21 /* PBXTargetDependency */, + ); + name = jpegicc; + productName = jpegicc; + productReference = 418B0B2F24C5E95D00DF2C21 /* jpegicc */; + productType = "com.apple.product-type.tool"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 418B0A2924C5E19500DF2C21 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1210; + ORGANIZATIONNAME = littlecms; + TargetAttributes = { + 418B0A3024C5E19500DF2C21 = { + CreatedOnToolsVersion = 11.6; + }; + 418B0A7724C5E25200DF2C21 = { + CreatedOnToolsVersion = 11.6; + }; + 418B0A8E24C5E35200DF2C21 = { + CreatedOnToolsVersion = 11.6; + }; + 418B0AB724C5E42900DF2C21 = { + CreatedOnToolsVersion = 11.6; + }; + 418B0ACA24C5E4EA00DF2C21 = { + CreatedOnToolsVersion = 11.6; + }; + 418B0AE024C5E5C300DF2C21 = { + CreatedOnToolsVersion = 11.6; + }; + 418B0B0424C5E76100DF2C21 = { + CreatedOnToolsVersion = 11.6; + }; + 418B0B1924C5E85600DF2C21 = { + CreatedOnToolsVersion = 11.6; + }; + 418B0B2E24C5E95D00DF2C21 = { + CreatedOnToolsVersion = 11.6; + }; + }; + }; + buildConfigurationList = 418B0A2C24C5E19500DF2C21 /* Build configuration list for PBXProject "lcms2" */; + compatibilityVersion = "Xcode 12.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 418B0A2824C5E19500DF2C21; + productRefGroup = 418B0A3224C5E19500DF2C21 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 418B0A3024C5E19500DF2C21 /* lcms2 */, + 418B0A7724C5E25200DF2C21 /* testbed */, + 418B0A8E24C5E35200DF2C21 /* fast_float_plugin */, + 418B0AB724C5E42900DF2C21 /* fast_float_testbed */, + 418B0ACA24C5E4EA00DF2C21 /* transicc */, + 418B0AE024C5E5C300DF2C21 /* linkicc */, + 418B0B0424C5E76100DF2C21 /* tificc */, + 418B0B1924C5E85600DF2C21 /* tifdiff */, + 418B0B2E24C5E95D00DF2C21 /* jpegicc */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + 418B0A2E24C5E19500DF2C21 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 418B0A5224C5E1C900DF2C21 /* cmsgamma.c in Sources */, + 418B0A5324C5E1C900DF2C21 /* cmsintrp.c in Sources */, + 418B0A5424C5E1C900DF2C21 /* cmsgmt.c in Sources */, + 418B0A5524C5E1C900DF2C21 /* cmscnvrt.c in Sources */, + 418B0A5624C5E1C900DF2C21 /* cmsmd5.c in Sources */, + 418B0A5724C5E1C900DF2C21 /* cmssm.c in Sources */, + 418B0A5824C5E1C900DF2C21 /* cmsopt.c in Sources */, + 418B0A5924C5E1C900DF2C21 /* cmscgats.c in Sources */, + 418B0A5A24C5E1C900DF2C21 /* cmsalpha.c in Sources */, + 418B0A5B24C5E1C900DF2C21 /* cmstypes.c in Sources */, + 418B0A5C24C5E1C900DF2C21 /* cmsio1.c in Sources */, + 418B0A5D24C5E1C900DF2C21 /* cmspack.c in Sources */, + 418B0A5E24C5E1C900DF2C21 /* cmsxform.c in Sources */, + 418B0A5F24C5E1C900DF2C21 /* cmswtpnt.c in Sources */, + 418B0A6024C5E1C900DF2C21 /* cmsmtrx.c in Sources */, + 418B0A6124C5E1C900DF2C21 /* cmspcs.c in Sources */, + 418B0A6224C5E1C900DF2C21 /* cmsps2.c in Sources */, + 418B0A6324C5E1C900DF2C21 /* cmsnamed.c in Sources */, + 418B0A6424C5E1C900DF2C21 /* cmserr.c in Sources */, + 418B0A6524C5E1C900DF2C21 /* cmslut.c in Sources */, + 418B0A6624C5E1C900DF2C21 /* cmsvirt.c in Sources */, + 418B0A6724C5E1C900DF2C21 /* cmsplugin.c in Sources */, + 418B0A6824C5E1C900DF2C21 /* cmshalf.c in Sources */, + 418B0A6924C5E1C900DF2C21 /* cmsio0.c in Sources */, + 418B0A6A24C5E1C900DF2C21 /* cmscam02.c in Sources */, + 418B0A6B24C5E1C900DF2C21 /* cmssamp.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 418B0A7424C5E25200DF2C21 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 418B0B4724C5EC1D00DF2C21 /* testplugin.c in Sources */, + 418B0B4924C5EC2A00DF2C21 /* zoo_icc.c in Sources */, + 418B0B4624C5EC1D00DF2C21 /* testcms2.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 418B0A8C24C5E35200DF2C21 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 418B0AA124C5E37800DF2C21 /* fast_float_curves.c in Sources */, + 418B0AA224C5E37800DF2C21 /* fast_float_15mats.c in Sources */, + 418B0AA324C5E37800DF2C21 /* fast_float_tethra.c in Sources */, + 418B0AA424C5E37800DF2C21 /* fast_float_cmyk.c in Sources */, + 418B0AA524C5E37800DF2C21 /* fast_16_tethra.c in Sources */, + 418B0AA724C5E37800DF2C21 /* fast_8_matsh.c in Sources */, + 418B0AA824C5E37800DF2C21 /* fast_float_separate.c in Sources */, + 418B0AA924C5E37800DF2C21 /* fast_8_matsh_sse.c in Sources */, + 418B0AAA24C5E37800DF2C21 /* fast_8_tethra.c in Sources */, + 418B0AAB24C5E37800DF2C21 /* fast_float_sup.c in Sources */, + 418B0AAC24C5E37800DF2C21 /* fast_float_15bits.c in Sources */, + 418B0AAD24C5E37800DF2C21 /* fast_8_curves.c in Sources */, + 418B0AAE24C5E37800DF2C21 /* fast_float_matsh.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 418B0AB424C5E42900DF2C21 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 418B0AF224C5E6B000DF2C21 /* fast_float_testbed.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 418B0AC724C5E4EA00DF2C21 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 418B0AF724C5E6C800DF2C21 /* vprf.c in Sources */, + 418B0AF924C5E6D200DF2C21 /* transicc.c in Sources */, + 418B0AF624C5E6C800DF2C21 /* xgetopt.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 418B0ADD24C5E5C300DF2C21 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 418B0B0024C5E73100DF2C21 /* vprf.c in Sources */, + 418B0AFF24C5E73100DF2C21 /* xgetopt.c in Sources */, + 4123B46925518DB1005F0287 /* linkicc.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 418B0B0124C5E76100DF2C21 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 4123B4A425518FFB005F0287 /* xgetopt.c in Sources */, + 418B0B0F24C5E79200DF2C21 /* utils.h in Sources */, + 418B0B1424C5E7BB00DF2C21 /* vprf.c in Sources */, + 4123B4B82551903B005F0287 /* tificc.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 418B0B1624C5E85600DF2C21 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 418B0B2524C5E92100DF2C21 /* tifdiff.c in Sources */, + 418B0B2924C5E92B00DF2C21 /* vprf.c in Sources */, + 418B0B2A24C5E92B00DF2C21 /* xgetopt.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 418B0B2B24C5E95D00DF2C21 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 418B0B3824C5E98E00DF2C21 /* iccjpeg.c in Sources */, + 418B0B4224C5E9F700DF2C21 /* xgetopt.c in Sources */, + 418B0B4124C5E9F700DF2C21 /* vprf.c in Sources */, + 418B0B3A24C5E99600DF2C21 /* jpgicc.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 418B0A8624C5E29800DF2C21 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 418B0A3024C5E19500DF2C21 /* lcms2 */; + targetProxy = 418B0A8524C5E29800DF2C21 /* PBXContainerItemProxy */; + }; + 418B0AB324C5E3D400DF2C21 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 418B0A3024C5E19500DF2C21 /* lcms2 */; + targetProxy = 418B0AB224C5E3D400DF2C21 /* PBXContainerItemProxy */; + }; + 418B0AC424C5E48100DF2C21 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 418B0A8E24C5E35200DF2C21 /* fast_float_plugin */; + targetProxy = 418B0AC324C5E48100DF2C21 /* PBXContainerItemProxy */; + }; + 418B0AC624C5E48600DF2C21 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 418B0A3024C5E19500DF2C21 /* lcms2 */; + targetProxy = 418B0AC524C5E48600DF2C21 /* PBXContainerItemProxy */; + }; + 418B0ADC24C5E58F00DF2C21 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 418B0A3024C5E19500DF2C21 /* lcms2 */; + targetProxy = 418B0ADB24C5E58F00DF2C21 /* PBXContainerItemProxy */; + }; + 418B0AE924C5E5CA00DF2C21 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 418B0A3024C5E19500DF2C21 /* lcms2 */; + targetProxy = 418B0AE824C5E5CA00DF2C21 /* PBXContainerItemProxy */; + }; + 418B0B0D24C5E77500DF2C21 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 418B0A3024C5E19500DF2C21 /* lcms2 */; + targetProxy = 418B0B0C24C5E77500DF2C21 /* PBXContainerItemProxy */; + }; + 418B0B2324C5E8FA00DF2C21 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 418B0A3024C5E19500DF2C21 /* lcms2 */; + targetProxy = 418B0B2224C5E8FA00DF2C21 /* PBXContainerItemProxy */; + }; + 418B0B3C24C5E99E00DF2C21 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 418B0A3024C5E19500DF2C21 /* lcms2 */; + targetProxy = 418B0B3B24C5E99E00DF2C21 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 418B0A3324C5E19500DF2C21 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.15; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + }; + name = Debug; + }; + 418B0A3424C5E19500DF2C21 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.15; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + }; + name = Release; + }; + 418B0A3624C5E19500DF2C21 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + EXECUTABLE_PREFIX = lib; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + }; + name = Debug; + }; + 418B0A3724C5E19500DF2C21 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + EXECUTABLE_PREFIX = lib; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + }; + name = Release; + }; + 418B0A7D24C5E25200DF2C21 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 418B0A7E24C5E25200DF2C21 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 418B0A9124C5E35200DF2C21 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + EXECUTABLE_PREFIX = lib; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + }; + name = Debug; + }; + 418B0A9224C5E35200DF2C21 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + EXECUTABLE_PREFIX = lib; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + }; + name = Release; + }; + 418B0ABD24C5E42900DF2C21 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 418B0ABE24C5E42900DF2C21 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 418B0AD024C5E4EA00DF2C21 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 418B0AD124C5E4EA00DF2C21 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 418B0AE624C5E5C300DF2C21 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 418B0AE724C5E5C300DF2C21 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 418B0B0A24C5E76100DF2C21 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + HEADER_SEARCH_PATHS = /usr/local/include; + MACOSX_DEPLOYMENT_TARGET = 10.15; + OTHER_LDFLAGS = ( + "-L", + /usr/local/lib, + "-ltiff", + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 418B0B0B24C5E76100DF2C21 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + HEADER_SEARCH_PATHS = /usr/local/include; + MACOSX_DEPLOYMENT_TARGET = 10.15; + OTHER_LDFLAGS = ( + "-L", + /usr/local/lib, + "-ltiff", + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 418B0B1F24C5E85600DF2C21 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + HEADER_SEARCH_PATHS = /usr/local/include; + OTHER_LDFLAGS = ( + "-L", + /usr/local/lib, + "-ltiff", + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 418B0B2024C5E85600DF2C21 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + HEADER_SEARCH_PATHS = /usr/local/include; + OTHER_LDFLAGS = ( + "-L", + /usr/local/lib, + "-ltiff", + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 418B0B3424C5E95D00DF2C21 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + HEADER_SEARCH_PATHS = /usr/local/include; + OTHER_LDFLAGS = ( + "-L", + /usr/local/lib, + "-ljpeg", + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 418B0B3524C5E95D00DF2C21 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + HEADER_SEARCH_PATHS = /usr/local/include; + OTHER_LDFLAGS = ( + "-L", + /usr/local/lib, + "-ljpeg", + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 418B0A2C24C5E19500DF2C21 /* Build configuration list for PBXProject "lcms2" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 418B0A3324C5E19500DF2C21 /* Debug */, + 418B0A3424C5E19500DF2C21 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 418B0A3524C5E19500DF2C21 /* Build configuration list for PBXNativeTarget "lcms2" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 418B0A3624C5E19500DF2C21 /* Debug */, + 418B0A3724C5E19500DF2C21 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 418B0A7C24C5E25200DF2C21 /* Build configuration list for PBXNativeTarget "testbed" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 418B0A7D24C5E25200DF2C21 /* Debug */, + 418B0A7E24C5E25200DF2C21 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 418B0A9024C5E35200DF2C21 /* Build configuration list for PBXNativeTarget "fast_float_plugin" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 418B0A9124C5E35200DF2C21 /* Debug */, + 418B0A9224C5E35200DF2C21 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 418B0ABC24C5E42900DF2C21 /* Build configuration list for PBXNativeTarget "fast_float_testbed" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 418B0ABD24C5E42900DF2C21 /* Debug */, + 418B0ABE24C5E42900DF2C21 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 418B0ACF24C5E4EA00DF2C21 /* Build configuration list for PBXNativeTarget "transicc" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 418B0AD024C5E4EA00DF2C21 /* Debug */, + 418B0AD124C5E4EA00DF2C21 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 418B0AE524C5E5C300DF2C21 /* Build configuration list for PBXNativeTarget "linkicc" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 418B0AE624C5E5C300DF2C21 /* Debug */, + 418B0AE724C5E5C300DF2C21 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 418B0B0924C5E76100DF2C21 /* Build configuration list for PBXNativeTarget "tificc" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 418B0B0A24C5E76100DF2C21 /* Debug */, + 418B0B0B24C5E76100DF2C21 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 418B0B1E24C5E85600DF2C21 /* Build configuration list for PBXNativeTarget "tifdiff" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 418B0B1F24C5E85600DF2C21 /* Debug */, + 418B0B2024C5E85600DF2C21 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 418B0B3324C5E95D00DF2C21 /* Build configuration list for PBXNativeTarget "jpegicc" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 418B0B3424C5E95D00DF2C21 /* Debug */, + 418B0B3524C5E95D00DF2C21 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 418B0A2924C5E19500DF2C21 /* Project object */; +} diff --git a/local/recipes/libs/lcms2/source/Projects/Xcode_12/lcms2/lcms2.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/local/recipes/libs/lcms2/source/Projects/Xcode_12/lcms2/lcms2.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000000..ebae78459f --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/Xcode_12/lcms2/lcms2.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/local/recipes/libs/lcms2/source/Projects/Xcode_12/lcms2/lcms2.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/local/recipes/libs/lcms2/source/Projects/Xcode_12/lcms2/lcms2.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000000..18d981003d --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/Xcode_12/lcms2/lcms2.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/local/recipes/libs/lcms2/source/Projects/Xcode_12/lcms2/lcms2.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/local/recipes/libs/lcms2/source/Projects/Xcode_12/lcms2/lcms2.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000000..f9b0d7c5ea --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/Xcode_12/lcms2/lcms2.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/local/recipes/libs/lcms2/source/Projects/Xcode_14/lcms2/lcms2.xcodeproj/project.pbxproj b/local/recipes/libs/lcms2/source/Projects/Xcode_14/lcms2/lcms2.xcodeproj/project.pbxproj new file mode 100644 index 0000000000..d47ef0afb2 --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/Xcode_14/lcms2/lcms2.xcodeproj/project.pbxproj @@ -0,0 +1,1436 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 56; + objects = { + +/* Begin PBXBuildFile section */ + 4123B46925518DB1005F0287 /* linkicc.c in Sources */ = {isa = PBXBuildFile; fileRef = 4123B46825518DB1005F0287 /* linkicc.c */; }; + 4123B4A425518FFB005F0287 /* xgetopt.c in Sources */ = {isa = PBXBuildFile; fileRef = 4123B4A325518FFB005F0287 /* xgetopt.c */; }; + 4123B4B82551903B005F0287 /* tificc.c in Sources */ = {isa = PBXBuildFile; fileRef = 4123B4B72551903B005F0287 /* tificc.c */; }; + 4123B5042551A1C8005F0287 /* libfast_float_plugin.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 418B0A8F24C5E35200DF2C21 /* libfast_float_plugin.a */; }; + 418B0A5224C5E1C900DF2C21 /* cmsgamma.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A3824C5E1C700DF2C21 /* cmsgamma.c */; }; + 418B0A5324C5E1C900DF2C21 /* cmsintrp.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A3924C5E1C700DF2C21 /* cmsintrp.c */; }; + 418B0A5424C5E1C900DF2C21 /* cmsgmt.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A3A24C5E1C700DF2C21 /* cmsgmt.c */; }; + 418B0A5524C5E1C900DF2C21 /* cmscnvrt.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A3B24C5E1C700DF2C21 /* cmscnvrt.c */; }; + 418B0A5624C5E1C900DF2C21 /* cmsmd5.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A3C24C5E1C700DF2C21 /* cmsmd5.c */; }; + 418B0A5724C5E1C900DF2C21 /* cmssm.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A3D24C5E1C700DF2C21 /* cmssm.c */; }; + 418B0A5824C5E1C900DF2C21 /* cmsopt.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A3E24C5E1C700DF2C21 /* cmsopt.c */; }; + 418B0A5924C5E1C900DF2C21 /* cmscgats.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A3F24C5E1C700DF2C21 /* cmscgats.c */; }; + 418B0A5A24C5E1C900DF2C21 /* cmsalpha.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4024C5E1C800DF2C21 /* cmsalpha.c */; }; + 418B0A5B24C5E1C900DF2C21 /* cmstypes.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4124C5E1C800DF2C21 /* cmstypes.c */; }; + 418B0A5C24C5E1C900DF2C21 /* cmsio1.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4224C5E1C800DF2C21 /* cmsio1.c */; }; + 418B0A5D24C5E1C900DF2C21 /* cmspack.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4324C5E1C800DF2C21 /* cmspack.c */; }; + 418B0A5E24C5E1C900DF2C21 /* cmsxform.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4424C5E1C800DF2C21 /* cmsxform.c */; }; + 418B0A5F24C5E1C900DF2C21 /* cmswtpnt.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4524C5E1C800DF2C21 /* cmswtpnt.c */; }; + 418B0A6024C5E1C900DF2C21 /* cmsmtrx.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4624C5E1C800DF2C21 /* cmsmtrx.c */; }; + 418B0A6124C5E1C900DF2C21 /* cmspcs.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4724C5E1C800DF2C21 /* cmspcs.c */; }; + 418B0A6224C5E1C900DF2C21 /* cmsps2.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4824C5E1C800DF2C21 /* cmsps2.c */; }; + 418B0A6324C5E1C900DF2C21 /* cmsnamed.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4924C5E1C800DF2C21 /* cmsnamed.c */; }; + 418B0A6424C5E1C900DF2C21 /* cmserr.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4A24C5E1C800DF2C21 /* cmserr.c */; }; + 418B0A6524C5E1C900DF2C21 /* cmslut.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4B24C5E1C800DF2C21 /* cmslut.c */; }; + 418B0A6624C5E1C900DF2C21 /* cmsvirt.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4C24C5E1C800DF2C21 /* cmsvirt.c */; }; + 418B0A6724C5E1C900DF2C21 /* cmsplugin.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4D24C5E1C800DF2C21 /* cmsplugin.c */; }; + 418B0A6824C5E1C900DF2C21 /* cmshalf.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4E24C5E1C800DF2C21 /* cmshalf.c */; }; + 418B0A6924C5E1C900DF2C21 /* cmsio0.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4F24C5E1C900DF2C21 /* cmsio0.c */; }; + 418B0A6A24C5E1C900DF2C21 /* cmscam02.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A5024C5E1C900DF2C21 /* cmscam02.c */; }; + 418B0A6B24C5E1C900DF2C21 /* cmssamp.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A5124C5E1C900DF2C21 /* cmssamp.c */; }; + 418B0A6F24C5E1E800DF2C21 /* lcms2.h in Headers */ = {isa = PBXBuildFile; fileRef = 418B0A6D24C5E1E800DF2C21 /* lcms2.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 418B0A7024C5E1E800DF2C21 /* lcms2_plugin.h in Headers */ = {isa = PBXBuildFile; fileRef = 418B0A6E24C5E1E800DF2C21 /* lcms2_plugin.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 418B0A7224C5E1F400DF2C21 /* lcms2_internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 418B0A7124C5E1F400DF2C21 /* lcms2_internal.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 418B0A8A24C5E30000DF2C21 /* liblcms2.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 418B0A3124C5E19500DF2C21 /* liblcms2.a */; }; + 418B0AA124C5E37800DF2C21 /* fast_float_curves.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9324C5E37600DF2C21 /* fast_float_curves.c */; }; + 418B0AA224C5E37800DF2C21 /* fast_float_15mats.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9424C5E37600DF2C21 /* fast_float_15mats.c */; }; + 418B0AA324C5E37800DF2C21 /* fast_float_tethra.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9524C5E37600DF2C21 /* fast_float_tethra.c */; }; + 418B0AA424C5E37800DF2C21 /* fast_float_cmyk.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9624C5E37700DF2C21 /* fast_float_cmyk.c */; }; + 418B0AA524C5E37800DF2C21 /* fast_16_tethra.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9724C5E37700DF2C21 /* fast_16_tethra.c */; }; + 418B0AA624C5E37800DF2C21 /* fast_float_internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 418B0A9824C5E37700DF2C21 /* fast_float_internal.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 418B0AA724C5E37800DF2C21 /* fast_8_matsh.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9924C5E37700DF2C21 /* fast_8_matsh.c */; }; + 418B0AA824C5E37800DF2C21 /* fast_float_separate.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9A24C5E37700DF2C21 /* fast_float_separate.c */; }; + 418B0AA924C5E37800DF2C21 /* fast_8_matsh_sse.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9B24C5E37700DF2C21 /* fast_8_matsh_sse.c */; }; + 418B0AAA24C5E37800DF2C21 /* fast_8_tethra.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9C24C5E37700DF2C21 /* fast_8_tethra.c */; }; + 418B0AAB24C5E37800DF2C21 /* fast_float_sup.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9D24C5E37700DF2C21 /* fast_float_sup.c */; }; + 418B0AAC24C5E37800DF2C21 /* fast_float_15bits.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9E24C5E37700DF2C21 /* fast_float_15bits.c */; }; + 418B0AAD24C5E37800DF2C21 /* fast_8_curves.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9F24C5E37700DF2C21 /* fast_8_curves.c */; }; + 418B0AAE24C5E37800DF2C21 /* fast_float_matsh.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0AA024C5E37800DF2C21 /* fast_float_matsh.c */; }; + 418B0AB024C5E38C00DF2C21 /* lcms2_fast_float.h in Headers */ = {isa = PBXBuildFile; fileRef = 418B0AAF24C5E38C00DF2C21 /* lcms2_fast_float.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 418B0AC224C5E47C00DF2C21 /* liblcms2.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 418B0A3124C5E19500DF2C21 /* liblcms2.a */; }; + 418B0ADA24C5E58A00DF2C21 /* liblcms2.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 418B0A3124C5E19500DF2C21 /* liblcms2.a */; }; + 418B0AEA24C5E5CF00DF2C21 /* liblcms2.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 418B0A3124C5E19500DF2C21 /* liblcms2.a */; }; + 418B0AF224C5E6B000DF2C21 /* fast_float_testbed.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0AF124C5E6B000DF2C21 /* fast_float_testbed.c */; }; + 418B0AF624C5E6C800DF2C21 /* xgetopt.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0AF324C5E6C700DF2C21 /* xgetopt.c */; }; + 418B0AF724C5E6C800DF2C21 /* vprf.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0AF424C5E6C700DF2C21 /* vprf.c */; }; + 418B0AF924C5E6D200DF2C21 /* transicc.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0AF824C5E6D200DF2C21 /* transicc.c */; }; + 418B0AFF24C5E73100DF2C21 /* xgetopt.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0AFD24C5E73100DF2C21 /* xgetopt.c */; }; + 418B0B0024C5E73100DF2C21 /* vprf.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0AFE24C5E73100DF2C21 /* vprf.c */; }; + 418B0B0F24C5E79200DF2C21 /* utils.h in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B0E24C5E79200DF2C21 /* utils.h */; }; + 418B0B1424C5E7BB00DF2C21 /* vprf.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B1224C5E7BB00DF2C21 /* vprf.c */; }; + 418B0B1524C5E7CF00DF2C21 /* liblcms2.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 418B0A3124C5E19500DF2C21 /* liblcms2.a */; }; + 418B0B2124C5E8FA00DF2C21 /* liblcms2.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 418B0A3124C5E19500DF2C21 /* liblcms2.a */; }; + 418B0B2524C5E92100DF2C21 /* tifdiff.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B2424C5E92100DF2C21 /* tifdiff.c */; }; + 418B0B2924C5E92B00DF2C21 /* vprf.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B2724C5E92B00DF2C21 /* vprf.c */; }; + 418B0B2A24C5E92B00DF2C21 /* xgetopt.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B2824C5E92B00DF2C21 /* xgetopt.c */; }; + 418B0B3824C5E98E00DF2C21 /* iccjpeg.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B3624C5E98E00DF2C21 /* iccjpeg.c */; }; + 418B0B3A24C5E99600DF2C21 /* jpgicc.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B3924C5E99600DF2C21 /* jpgicc.c */; }; + 418B0B3D24C5E9A200DF2C21 /* liblcms2.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 418B0A3124C5E19500DF2C21 /* liblcms2.a */; }; + 418B0B4124C5E9F700DF2C21 /* vprf.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B3E24C5E9F700DF2C21 /* vprf.c */; }; + 418B0B4224C5E9F700DF2C21 /* xgetopt.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B3F24C5E9F700DF2C21 /* xgetopt.c */; }; + 418B0B4624C5EC1D00DF2C21 /* testcms2.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B4324C5EC1D00DF2C21 /* testcms2.c */; }; + 418B0B4724C5EC1D00DF2C21 /* testplugin.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B4524C5EC1D00DF2C21 /* testplugin.c */; }; + 418B0B4924C5EC2A00DF2C21 /* zoo_icc.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B4824C5EC2A00DF2C21 /* zoo_icc.c */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 418B0A8524C5E29800DF2C21 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 418B0A2924C5E19500DF2C21 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 418B0A3024C5E19500DF2C21; + remoteInfo = lcms2; + }; + 418B0AB224C5E3D400DF2C21 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 418B0A2924C5E19500DF2C21 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 418B0A3024C5E19500DF2C21; + remoteInfo = lcms2; + }; + 418B0AC324C5E48100DF2C21 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 418B0A2924C5E19500DF2C21 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 418B0A8E24C5E35200DF2C21; + remoteInfo = fast_float_plugin; + }; + 418B0AC524C5E48600DF2C21 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 418B0A2924C5E19500DF2C21 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 418B0A3024C5E19500DF2C21; + remoteInfo = lcms2; + }; + 418B0ADB24C5E58F00DF2C21 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 418B0A2924C5E19500DF2C21 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 418B0A3024C5E19500DF2C21; + remoteInfo = lcms2; + }; + 418B0AE824C5E5CA00DF2C21 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 418B0A2924C5E19500DF2C21 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 418B0A3024C5E19500DF2C21; + remoteInfo = lcms2; + }; + 418B0B0C24C5E77500DF2C21 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 418B0A2924C5E19500DF2C21 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 418B0A3024C5E19500DF2C21; + remoteInfo = lcms2; + }; + 418B0B2224C5E8FA00DF2C21 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 418B0A2924C5E19500DF2C21 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 418B0A3024C5E19500DF2C21; + remoteInfo = lcms2; + }; + 418B0B3B24C5E99E00DF2C21 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 418B0A2924C5E19500DF2C21 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 418B0A3024C5E19500DF2C21; + remoteInfo = lcms2; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 418B0A7624C5E25200DF2C21 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; + 418B0AB624C5E42900DF2C21 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; + 418B0AC924C5E4EA00DF2C21 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; + 418B0ADF24C5E5C300DF2C21 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; + 418B0B0324C5E76100DF2C21 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; + 418B0B1824C5E85600DF2C21 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; + 418B0B2D24C5E95D00DF2C21 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 4123B46825518DB1005F0287 /* linkicc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = linkicc.c; sourceTree = ""; }; + 4123B4A325518FFB005F0287 /* xgetopt.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = xgetopt.c; path = ../common/xgetopt.c; sourceTree = ""; }; + 4123B4B72551903B005F0287 /* tificc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = tificc.c; sourceTree = ""; }; + 4123B4C2255190FE005F0287 /* tifdiff.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = tifdiff.c; sourceTree = ""; }; + 418B0A3124C5E19500DF2C21 /* liblcms2.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = liblcms2.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 418B0A3824C5E1C700DF2C21 /* cmsgamma.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsgamma.c; path = ../../../src/cmsgamma.c; sourceTree = ""; }; + 418B0A3924C5E1C700DF2C21 /* cmsintrp.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsintrp.c; path = ../../../src/cmsintrp.c; sourceTree = ""; }; + 418B0A3A24C5E1C700DF2C21 /* cmsgmt.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsgmt.c; path = ../../../src/cmsgmt.c; sourceTree = ""; }; + 418B0A3B24C5E1C700DF2C21 /* cmscnvrt.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmscnvrt.c; path = ../../../src/cmscnvrt.c; sourceTree = ""; }; + 418B0A3C24C5E1C700DF2C21 /* cmsmd5.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsmd5.c; path = ../../../src/cmsmd5.c; sourceTree = ""; }; + 418B0A3D24C5E1C700DF2C21 /* cmssm.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmssm.c; path = ../../../src/cmssm.c; sourceTree = ""; }; + 418B0A3E24C5E1C700DF2C21 /* cmsopt.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsopt.c; path = ../../../src/cmsopt.c; sourceTree = ""; }; + 418B0A3F24C5E1C700DF2C21 /* cmscgats.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmscgats.c; path = ../../../src/cmscgats.c; sourceTree = ""; }; + 418B0A4024C5E1C800DF2C21 /* cmsalpha.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsalpha.c; path = ../../../src/cmsalpha.c; sourceTree = ""; }; + 418B0A4124C5E1C800DF2C21 /* cmstypes.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmstypes.c; path = ../../../src/cmstypes.c; sourceTree = ""; }; + 418B0A4224C5E1C800DF2C21 /* cmsio1.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsio1.c; path = ../../../src/cmsio1.c; sourceTree = ""; }; + 418B0A4324C5E1C800DF2C21 /* cmspack.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmspack.c; path = ../../../src/cmspack.c; sourceTree = ""; }; + 418B0A4424C5E1C800DF2C21 /* cmsxform.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsxform.c; path = ../../../src/cmsxform.c; sourceTree = ""; }; + 418B0A4524C5E1C800DF2C21 /* cmswtpnt.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmswtpnt.c; path = ../../../src/cmswtpnt.c; sourceTree = ""; }; + 418B0A4624C5E1C800DF2C21 /* cmsmtrx.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsmtrx.c; path = ../../../src/cmsmtrx.c; sourceTree = ""; }; + 418B0A4724C5E1C800DF2C21 /* cmspcs.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmspcs.c; path = ../../../src/cmspcs.c; sourceTree = ""; }; + 418B0A4824C5E1C800DF2C21 /* cmsps2.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsps2.c; path = ../../../src/cmsps2.c; sourceTree = ""; }; + 418B0A4924C5E1C800DF2C21 /* cmsnamed.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsnamed.c; path = ../../../src/cmsnamed.c; sourceTree = ""; }; + 418B0A4A24C5E1C800DF2C21 /* cmserr.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmserr.c; path = ../../../src/cmserr.c; sourceTree = ""; }; + 418B0A4B24C5E1C800DF2C21 /* cmslut.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmslut.c; path = ../../../src/cmslut.c; sourceTree = ""; }; + 418B0A4C24C5E1C800DF2C21 /* cmsvirt.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsvirt.c; path = ../../../src/cmsvirt.c; sourceTree = ""; }; + 418B0A4D24C5E1C800DF2C21 /* cmsplugin.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsplugin.c; path = ../../../src/cmsplugin.c; sourceTree = ""; }; + 418B0A4E24C5E1C800DF2C21 /* cmshalf.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmshalf.c; path = ../../../src/cmshalf.c; sourceTree = ""; }; + 418B0A4F24C5E1C900DF2C21 /* cmsio0.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsio0.c; path = ../../../src/cmsio0.c; sourceTree = ""; }; + 418B0A5024C5E1C900DF2C21 /* cmscam02.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmscam02.c; path = ../../../src/cmscam02.c; sourceTree = ""; }; + 418B0A5124C5E1C900DF2C21 /* cmssamp.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmssamp.c; path = ../../../src/cmssamp.c; sourceTree = ""; }; + 418B0A6D24C5E1E800DF2C21 /* lcms2.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = lcms2.h; path = ../../../include/lcms2.h; sourceTree = ""; }; + 418B0A6E24C5E1E800DF2C21 /* lcms2_plugin.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = lcms2_plugin.h; path = ../../../include/lcms2_plugin.h; sourceTree = ""; }; + 418B0A7124C5E1F400DF2C21 /* lcms2_internal.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = lcms2_internal.h; path = ../../../src/lcms2_internal.h; sourceTree = ""; }; + 418B0A7824C5E25200DF2C21 /* testbed */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = testbed; sourceTree = BUILT_PRODUCTS_DIR; }; + 418B0A8F24C5E35200DF2C21 /* libfast_float_plugin.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libfast_float_plugin.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 418B0A9324C5E37600DF2C21 /* fast_float_curves.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_float_curves.c; path = ../../../plugins/fast_float/src/fast_float_curves.c; sourceTree = ""; }; + 418B0A9424C5E37600DF2C21 /* fast_float_15mats.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_float_15mats.c; path = ../../../plugins/fast_float/src/fast_float_15mats.c; sourceTree = ""; }; + 418B0A9524C5E37600DF2C21 /* fast_float_tethra.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_float_tethra.c; path = ../../../plugins/fast_float/src/fast_float_tethra.c; sourceTree = ""; }; + 418B0A9624C5E37700DF2C21 /* fast_float_cmyk.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_float_cmyk.c; path = ../../../plugins/fast_float/src/fast_float_cmyk.c; sourceTree = ""; }; + 418B0A9724C5E37700DF2C21 /* fast_16_tethra.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_16_tethra.c; path = ../../../plugins/fast_float/src/fast_16_tethra.c; sourceTree = ""; }; + 418B0A9824C5E37700DF2C21 /* fast_float_internal.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = fast_float_internal.h; path = ../../../plugins/fast_float/src/fast_float_internal.h; sourceTree = ""; }; + 418B0A9924C5E37700DF2C21 /* fast_8_matsh.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_8_matsh.c; path = ../../../plugins/fast_float/src/fast_8_matsh.c; sourceTree = ""; }; + 418B0A9A24C5E37700DF2C21 /* fast_float_separate.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_float_separate.c; path = ../../../plugins/fast_float/src/fast_float_separate.c; sourceTree = ""; }; + 418B0A9B24C5E37700DF2C21 /* fast_8_matsh_sse.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_8_matsh_sse.c; path = ../../../plugins/fast_float/src/fast_8_matsh_sse.c; sourceTree = ""; }; + 418B0A9C24C5E37700DF2C21 /* fast_8_tethra.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_8_tethra.c; path = ../../../plugins/fast_float/src/fast_8_tethra.c; sourceTree = ""; }; + 418B0A9D24C5E37700DF2C21 /* fast_float_sup.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_float_sup.c; path = ../../../plugins/fast_float/src/fast_float_sup.c; sourceTree = ""; }; + 418B0A9E24C5E37700DF2C21 /* fast_float_15bits.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_float_15bits.c; path = ../../../plugins/fast_float/src/fast_float_15bits.c; sourceTree = ""; }; + 418B0A9F24C5E37700DF2C21 /* fast_8_curves.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_8_curves.c; path = ../../../plugins/fast_float/src/fast_8_curves.c; sourceTree = ""; }; + 418B0AA024C5E37800DF2C21 /* fast_float_matsh.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_float_matsh.c; path = ../../../plugins/fast_float/src/fast_float_matsh.c; sourceTree = ""; }; + 418B0AAF24C5E38C00DF2C21 /* lcms2_fast_float.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = lcms2_fast_float.h; path = ../../../plugins/fast_float/include/lcms2_fast_float.h; sourceTree = ""; }; + 418B0AB824C5E42900DF2C21 /* fast_float_testbed */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = fast_float_testbed; sourceTree = BUILT_PRODUCTS_DIR; }; + 418B0ACB24C5E4EA00DF2C21 /* transicc */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = transicc; sourceTree = BUILT_PRODUCTS_DIR; }; + 418B0AE124C5E5C300DF2C21 /* linkicc */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = linkicc; sourceTree = BUILT_PRODUCTS_DIR; }; + 418B0AF124C5E6B000DF2C21 /* fast_float_testbed.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = fast_float_testbed.c; path = ../../../plugins/fast_float/testbed/fast_float_testbed.c; sourceTree = SOURCE_ROOT; }; + 418B0AF324C5E6C700DF2C21 /* xgetopt.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = xgetopt.c; path = ../../../utils/common/xgetopt.c; sourceTree = SOURCE_ROOT; }; + 418B0AF424C5E6C700DF2C21 /* vprf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = vprf.c; path = ../../../utils/common/vprf.c; sourceTree = SOURCE_ROOT; }; + 418B0AF524C5E6C800DF2C21 /* utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = utils.h; path = ../../../utils/common/utils.h; sourceTree = SOURCE_ROOT; }; + 418B0AF824C5E6D200DF2C21 /* transicc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = transicc.c; path = ../../../utils/transicc/transicc.c; sourceTree = SOURCE_ROOT; }; + 418B0AFC24C5E73100DF2C21 /* utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = utils.h; path = ../../../utils/common/utils.h; sourceTree = SOURCE_ROOT; }; + 418B0AFD24C5E73100DF2C21 /* xgetopt.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = xgetopt.c; path = ../../../utils/common/xgetopt.c; sourceTree = SOURCE_ROOT; }; + 418B0AFE24C5E73100DF2C21 /* vprf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = vprf.c; path = ../../../utils/common/vprf.c; sourceTree = SOURCE_ROOT; }; + 418B0B0524C5E76100DF2C21 /* tificc */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = tificc; sourceTree = BUILT_PRODUCTS_DIR; }; + 418B0B0E24C5E79200DF2C21 /* utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = utils.h; path = ../../../utils/common/utils.h; sourceTree = SOURCE_ROOT; }; + 418B0B1224C5E7BB00DF2C21 /* vprf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = vprf.c; path = ../../../utils/common/vprf.c; sourceTree = SOURCE_ROOT; }; + 418B0B1A24C5E85600DF2C21 /* tifdiff */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = tifdiff; sourceTree = BUILT_PRODUCTS_DIR; }; + 418B0B2424C5E92100DF2C21 /* tifdiff.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = tifdiff.c; path = ../../../utils/tificc/tifdiff.c; sourceTree = SOURCE_ROOT; }; + 418B0B2724C5E92B00DF2C21 /* vprf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = vprf.c; path = ../common/vprf.c; sourceTree = ""; }; + 418B0B2824C5E92B00DF2C21 /* xgetopt.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = xgetopt.c; path = ../common/xgetopt.c; sourceTree = ""; }; + 418B0B2F24C5E95D00DF2C21 /* jpegicc */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jpegicc; sourceTree = BUILT_PRODUCTS_DIR; }; + 418B0B3624C5E98E00DF2C21 /* iccjpeg.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = iccjpeg.c; path = ../../../utils/jpgicc/iccjpeg.c; sourceTree = SOURCE_ROOT; }; + 418B0B3724C5E98E00DF2C21 /* iccjpeg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = iccjpeg.h; path = ../../../utils/jpgicc/iccjpeg.h; sourceTree = SOURCE_ROOT; }; + 418B0B3924C5E99600DF2C21 /* jpgicc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = jpgicc.c; sourceTree = ""; }; + 418B0B3E24C5E9F700DF2C21 /* vprf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = vprf.c; path = ../../../utils/common/vprf.c; sourceTree = SOURCE_ROOT; }; + 418B0B3F24C5E9F700DF2C21 /* xgetopt.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = xgetopt.c; path = ../../../utils/common/xgetopt.c; sourceTree = SOURCE_ROOT; }; + 418B0B4024C5E9F700DF2C21 /* utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = utils.h; path = ../../../utils/common/utils.h; sourceTree = SOURCE_ROOT; }; + 418B0B4324C5EC1D00DF2C21 /* testcms2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = testcms2.c; path = ../../../testbed/testcms2.c; sourceTree = SOURCE_ROOT; }; + 418B0B4424C5EC1D00DF2C21 /* testcms2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = testcms2.h; path = ../../../testbed/testcms2.h; sourceTree = SOURCE_ROOT; }; + 418B0B4524C5EC1D00DF2C21 /* testplugin.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = testplugin.c; path = ../../../testbed/testplugin.c; sourceTree = ""; }; + 418B0B4824C5EC2A00DF2C21 /* zoo_icc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zoo_icc.c; path = ../../../testbed/zoo_icc.c; sourceTree = SOURCE_ROOT; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 418B0A2F24C5E19500DF2C21 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 418B0A7524C5E25200DF2C21 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 418B0A8A24C5E30000DF2C21 /* liblcms2.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 418B0A8D24C5E35200DF2C21 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 418B0AB524C5E42900DF2C21 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 418B0AC224C5E47C00DF2C21 /* liblcms2.a in Frameworks */, + 4123B5042551A1C8005F0287 /* libfast_float_plugin.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 418B0AC824C5E4EA00DF2C21 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 418B0ADA24C5E58A00DF2C21 /* liblcms2.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 418B0ADE24C5E5C300DF2C21 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 418B0AEA24C5E5CF00DF2C21 /* liblcms2.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 418B0B0224C5E76100DF2C21 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 418B0B1524C5E7CF00DF2C21 /* liblcms2.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 418B0B1724C5E85600DF2C21 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 418B0B2124C5E8FA00DF2C21 /* liblcms2.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 418B0B2C24C5E95D00DF2C21 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 418B0B3D24C5E9A200DF2C21 /* liblcms2.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 4133B38429F8419B0064B31B /* threaded_plugin */ = { + isa = PBXGroup; + children = ( + ); + path = threaded_plugin; + sourceTree = ""; + }; + 4133B38529F842000064B31B /* threaded_plugin_testbed */ = { + isa = PBXGroup; + children = ( + ); + path = threaded_plugin_testbed; + sourceTree = ""; + }; + 418B0A2824C5E19500DF2C21 = { + isa = PBXGroup; + children = ( + 4133B38529F842000064B31B /* threaded_plugin_testbed */, + 4133B38429F8419B0064B31B /* threaded_plugin */, + 418B0AB124C5E39A00DF2C21 /* fast_float_plugin */, + 418B0A7324C5E1FE00DF2C21 /* include */, + 418B0A6C24C5E1CE00DF2C21 /* src */, + 418B0A7924C5E25200DF2C21 /* testbed */, + 418B0AB924C5E42900DF2C21 /* fast_float_testbed */, + 418B0ACC24C5E4EA00DF2C21 /* transicc */, + 418B0AE224C5E5C300DF2C21 /* linkicc */, + 418B0B0624C5E76100DF2C21 /* tificc */, + 418B0B1B24C5E85600DF2C21 /* tifdiff */, + 418B0B3024C5E95D00DF2C21 /* jpegicc */, + 418B0A3224C5E19500DF2C21 /* Products */, + 418B0A8924C5E30000DF2C21 /* Frameworks */, + ); + sourceTree = ""; + }; + 418B0A3224C5E19500DF2C21 /* Products */ = { + isa = PBXGroup; + children = ( + 418B0A3124C5E19500DF2C21 /* liblcms2.a */, + 418B0A7824C5E25200DF2C21 /* testbed */, + 418B0A8F24C5E35200DF2C21 /* libfast_float_plugin.a */, + 418B0AB824C5E42900DF2C21 /* fast_float_testbed */, + 418B0ACB24C5E4EA00DF2C21 /* transicc */, + 418B0AE124C5E5C300DF2C21 /* linkicc */, + 418B0B0524C5E76100DF2C21 /* tificc */, + 418B0B1A24C5E85600DF2C21 /* tifdiff */, + 418B0B2F24C5E95D00DF2C21 /* jpegicc */, + ); + name = Products; + sourceTree = ""; + }; + 418B0A6C24C5E1CE00DF2C21 /* src */ = { + isa = PBXGroup; + children = ( + 418B0A7124C5E1F400DF2C21 /* lcms2_internal.h */, + 418B0A4024C5E1C800DF2C21 /* cmsalpha.c */, + 418B0A5024C5E1C900DF2C21 /* cmscam02.c */, + 418B0A3F24C5E1C700DF2C21 /* cmscgats.c */, + 418B0A3B24C5E1C700DF2C21 /* cmscnvrt.c */, + 418B0A4A24C5E1C800DF2C21 /* cmserr.c */, + 418B0A3824C5E1C700DF2C21 /* cmsgamma.c */, + 418B0A3A24C5E1C700DF2C21 /* cmsgmt.c */, + 418B0A4E24C5E1C800DF2C21 /* cmshalf.c */, + 418B0A3924C5E1C700DF2C21 /* cmsintrp.c */, + 418B0A4F24C5E1C900DF2C21 /* cmsio0.c */, + 418B0A4224C5E1C800DF2C21 /* cmsio1.c */, + 418B0A4B24C5E1C800DF2C21 /* cmslut.c */, + 418B0A3C24C5E1C700DF2C21 /* cmsmd5.c */, + 418B0A4624C5E1C800DF2C21 /* cmsmtrx.c */, + 418B0A4924C5E1C800DF2C21 /* cmsnamed.c */, + 418B0A3E24C5E1C700DF2C21 /* cmsopt.c */, + 418B0A4324C5E1C800DF2C21 /* cmspack.c */, + 418B0A4724C5E1C800DF2C21 /* cmspcs.c */, + 418B0A4D24C5E1C800DF2C21 /* cmsplugin.c */, + 418B0A4824C5E1C800DF2C21 /* cmsps2.c */, + 418B0A5124C5E1C900DF2C21 /* cmssamp.c */, + 418B0A3D24C5E1C700DF2C21 /* cmssm.c */, + 418B0A4124C5E1C800DF2C21 /* cmstypes.c */, + 418B0A4C24C5E1C800DF2C21 /* cmsvirt.c */, + 418B0A4524C5E1C800DF2C21 /* cmswtpnt.c */, + 418B0A4424C5E1C800DF2C21 /* cmsxform.c */, + ); + name = src; + sourceTree = ""; + }; + 418B0A7324C5E1FE00DF2C21 /* include */ = { + isa = PBXGroup; + children = ( + 418B0A6E24C5E1E800DF2C21 /* lcms2_plugin.h */, + 418B0A6D24C5E1E800DF2C21 /* lcms2.h */, + ); + name = include; + sourceTree = ""; + }; + 418B0A7924C5E25200DF2C21 /* testbed */ = { + isa = PBXGroup; + children = ( + 418B0B4824C5EC2A00DF2C21 /* zoo_icc.c */, + 418B0B4324C5EC1D00DF2C21 /* testcms2.c */, + 418B0B4424C5EC1D00DF2C21 /* testcms2.h */, + 418B0B4524C5EC1D00DF2C21 /* testplugin.c */, + ); + name = testbed; + sourceTree = SOURCE_ROOT; + }; + 418B0A8924C5E30000DF2C21 /* Frameworks */ = { + isa = PBXGroup; + children = ( + ); + name = Frameworks; + sourceTree = ""; + }; + 418B0AB124C5E39A00DF2C21 /* fast_float_plugin */ = { + isa = PBXGroup; + children = ( + 418B0AAF24C5E38C00DF2C21 /* lcms2_fast_float.h */, + 418B0A9F24C5E37700DF2C21 /* fast_8_curves.c */, + 418B0A9B24C5E37700DF2C21 /* fast_8_matsh_sse.c */, + 418B0A9924C5E37700DF2C21 /* fast_8_matsh.c */, + 418B0A9C24C5E37700DF2C21 /* fast_8_tethra.c */, + 418B0A9724C5E37700DF2C21 /* fast_16_tethra.c */, + 418B0A9E24C5E37700DF2C21 /* fast_float_15bits.c */, + 418B0A9424C5E37600DF2C21 /* fast_float_15mats.c */, + 418B0A9624C5E37700DF2C21 /* fast_float_cmyk.c */, + 418B0A9324C5E37600DF2C21 /* fast_float_curves.c */, + 418B0A9824C5E37700DF2C21 /* fast_float_internal.h */, + 418B0AA024C5E37800DF2C21 /* fast_float_matsh.c */, + 418B0A9A24C5E37700DF2C21 /* fast_float_separate.c */, + 418B0A9D24C5E37700DF2C21 /* fast_float_sup.c */, + 418B0A9524C5E37600DF2C21 /* fast_float_tethra.c */, + ); + name = fast_float_plugin; + sourceTree = ""; + }; + 418B0AB924C5E42900DF2C21 /* fast_float_testbed */ = { + isa = PBXGroup; + children = ( + 418B0AF124C5E6B000DF2C21 /* fast_float_testbed.c */, + ); + name = fast_float_testbed; + path = ../../../plugins/fast_float/testbed; + sourceTree = ""; + }; + 418B0ACC24C5E4EA00DF2C21 /* transicc */ = { + isa = PBXGroup; + children = ( + 418B0AF824C5E6D200DF2C21 /* transicc.c */, + 418B0AF524C5E6C800DF2C21 /* utils.h */, + 418B0AF424C5E6C700DF2C21 /* vprf.c */, + 418B0AF324C5E6C700DF2C21 /* xgetopt.c */, + ); + name = transicc; + sourceTree = SOURCE_ROOT; + }; + 418B0AE224C5E5C300DF2C21 /* linkicc */ = { + isa = PBXGroup; + children = ( + 4123B46825518DB1005F0287 /* linkicc.c */, + 418B0AFC24C5E73100DF2C21 /* utils.h */, + 418B0AFE24C5E73100DF2C21 /* vprf.c */, + 418B0AFD24C5E73100DF2C21 /* xgetopt.c */, + ); + name = linkicc; + path = ../../../utils/linkicc; + sourceTree = SOURCE_ROOT; + }; + 418B0B0624C5E76100DF2C21 /* tificc */ = { + isa = PBXGroup; + children = ( + 4123B4B72551903B005F0287 /* tificc.c */, + 4123B4A325518FFB005F0287 /* xgetopt.c */, + 418B0B1224C5E7BB00DF2C21 /* vprf.c */, + 418B0B0E24C5E79200DF2C21 /* utils.h */, + ); + name = tificc; + path = ../../../utils/tificc; + sourceTree = SOURCE_ROOT; + }; + 418B0B1B24C5E85600DF2C21 /* tifdiff */ = { + isa = PBXGroup; + children = ( + 4123B4C2255190FE005F0287 /* tifdiff.c */, + 418B0B2724C5E92B00DF2C21 /* vprf.c */, + 418B0B2824C5E92B00DF2C21 /* xgetopt.c */, + 418B0B2424C5E92100DF2C21 /* tifdiff.c */, + ); + name = tifdiff; + path = ../../../utils/tificc; + sourceTree = SOURCE_ROOT; + }; + 418B0B3024C5E95D00DF2C21 /* jpegicc */ = { + isa = PBXGroup; + children = ( + 418B0B4024C5E9F700DF2C21 /* utils.h */, + 418B0B3E24C5E9F700DF2C21 /* vprf.c */, + 418B0B3F24C5E9F700DF2C21 /* xgetopt.c */, + 418B0B3924C5E99600DF2C21 /* jpgicc.c */, + 418B0B3624C5E98E00DF2C21 /* iccjpeg.c */, + 418B0B3724C5E98E00DF2C21 /* iccjpeg.h */, + ); + name = jpegicc; + path = ../../../utils/jpgicc; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 418B0A2D24C5E19500DF2C21 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 418B0A6F24C5E1E800DF2C21 /* lcms2.h in Headers */, + 418B0A7024C5E1E800DF2C21 /* lcms2_plugin.h in Headers */, + 418B0A7224C5E1F400DF2C21 /* lcms2_internal.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 418B0A8B24C5E35200DF2C21 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 418B0AB024C5E38C00DF2C21 /* lcms2_fast_float.h in Headers */, + 418B0AA624C5E37800DF2C21 /* fast_float_internal.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 418B0A3024C5E19500DF2C21 /* lcms2 */ = { + isa = PBXNativeTarget; + buildConfigurationList = 418B0A3524C5E19500DF2C21 /* Build configuration list for PBXNativeTarget "lcms2" */; + buildPhases = ( + 418B0A2D24C5E19500DF2C21 /* Headers */, + 418B0A2E24C5E19500DF2C21 /* Sources */, + 418B0A2F24C5E19500DF2C21 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = lcms2; + productName = lcms2; + productReference = 418B0A3124C5E19500DF2C21 /* liblcms2.a */; + productType = "com.apple.product-type.library.static"; + }; + 418B0A7724C5E25200DF2C21 /* testbed */ = { + isa = PBXNativeTarget; + buildConfigurationList = 418B0A7C24C5E25200DF2C21 /* Build configuration list for PBXNativeTarget "testbed" */; + buildPhases = ( + 418B0A7424C5E25200DF2C21 /* Sources */, + 418B0A7524C5E25200DF2C21 /* Frameworks */, + 418B0A7624C5E25200DF2C21 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + 418B0A8624C5E29800DF2C21 /* PBXTargetDependency */, + ); + name = testbed; + productName = testbed; + productReference = 418B0A7824C5E25200DF2C21 /* testbed */; + productType = "com.apple.product-type.tool"; + }; + 418B0A8E24C5E35200DF2C21 /* fast_float_plugin */ = { + isa = PBXNativeTarget; + buildConfigurationList = 418B0A9024C5E35200DF2C21 /* Build configuration list for PBXNativeTarget "fast_float_plugin" */; + buildPhases = ( + 418B0A8B24C5E35200DF2C21 /* Headers */, + 418B0A8C24C5E35200DF2C21 /* Sources */, + 418B0A8D24C5E35200DF2C21 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 418B0AB324C5E3D400DF2C21 /* PBXTargetDependency */, + ); + name = fast_float_plugin; + productName = fast_float_plugin; + productReference = 418B0A8F24C5E35200DF2C21 /* libfast_float_plugin.a */; + productType = "com.apple.product-type.library.static"; + }; + 418B0AB724C5E42900DF2C21 /* fast_float_testbed */ = { + isa = PBXNativeTarget; + buildConfigurationList = 418B0ABC24C5E42900DF2C21 /* Build configuration list for PBXNativeTarget "fast_float_testbed" */; + buildPhases = ( + 418B0AB424C5E42900DF2C21 /* Sources */, + 418B0AB524C5E42900DF2C21 /* Frameworks */, + 418B0AB624C5E42900DF2C21 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + 418B0AC624C5E48600DF2C21 /* PBXTargetDependency */, + 418B0AC424C5E48100DF2C21 /* PBXTargetDependency */, + ); + name = fast_float_testbed; + productName = fast_float_testbed; + productReference = 418B0AB824C5E42900DF2C21 /* fast_float_testbed */; + productType = "com.apple.product-type.tool"; + }; + 418B0ACA24C5E4EA00DF2C21 /* transicc */ = { + isa = PBXNativeTarget; + buildConfigurationList = 418B0ACF24C5E4EA00DF2C21 /* Build configuration list for PBXNativeTarget "transicc" */; + buildPhases = ( + 418B0AC724C5E4EA00DF2C21 /* Sources */, + 418B0AC824C5E4EA00DF2C21 /* Frameworks */, + 418B0AC924C5E4EA00DF2C21 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + 418B0ADC24C5E58F00DF2C21 /* PBXTargetDependency */, + ); + name = transicc; + productName = transicc; + productReference = 418B0ACB24C5E4EA00DF2C21 /* transicc */; + productType = "com.apple.product-type.tool"; + }; + 418B0AE024C5E5C300DF2C21 /* linkicc */ = { + isa = PBXNativeTarget; + buildConfigurationList = 418B0AE524C5E5C300DF2C21 /* Build configuration list for PBXNativeTarget "linkicc" */; + buildPhases = ( + 418B0ADD24C5E5C300DF2C21 /* Sources */, + 418B0ADE24C5E5C300DF2C21 /* Frameworks */, + 418B0ADF24C5E5C300DF2C21 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + 418B0AE924C5E5CA00DF2C21 /* PBXTargetDependency */, + ); + name = linkicc; + productName = linkicc; + productReference = 418B0AE124C5E5C300DF2C21 /* linkicc */; + productType = "com.apple.product-type.tool"; + }; + 418B0B0424C5E76100DF2C21 /* tificc */ = { + isa = PBXNativeTarget; + buildConfigurationList = 418B0B0924C5E76100DF2C21 /* Build configuration list for PBXNativeTarget "tificc" */; + buildPhases = ( + 418B0B0124C5E76100DF2C21 /* Sources */, + 418B0B0224C5E76100DF2C21 /* Frameworks */, + 418B0B0324C5E76100DF2C21 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + 418B0B0D24C5E77500DF2C21 /* PBXTargetDependency */, + ); + name = tificc; + productName = tificc; + productReference = 418B0B0524C5E76100DF2C21 /* tificc */; + productType = "com.apple.product-type.tool"; + }; + 418B0B1924C5E85600DF2C21 /* tifdiff */ = { + isa = PBXNativeTarget; + buildConfigurationList = 418B0B1E24C5E85600DF2C21 /* Build configuration list for PBXNativeTarget "tifdiff" */; + buildPhases = ( + 418B0B1624C5E85600DF2C21 /* Sources */, + 418B0B1724C5E85600DF2C21 /* Frameworks */, + 418B0B1824C5E85600DF2C21 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + 418B0B2324C5E8FA00DF2C21 /* PBXTargetDependency */, + ); + name = tifdiff; + productName = tifdiff; + productReference = 418B0B1A24C5E85600DF2C21 /* tifdiff */; + productType = "com.apple.product-type.tool"; + }; + 418B0B2E24C5E95D00DF2C21 /* jpegicc */ = { + isa = PBXNativeTarget; + buildConfigurationList = 418B0B3324C5E95D00DF2C21 /* Build configuration list for PBXNativeTarget "jpegicc" */; + buildPhases = ( + 418B0B2B24C5E95D00DF2C21 /* Sources */, + 418B0B2C24C5E95D00DF2C21 /* Frameworks */, + 418B0B2D24C5E95D00DF2C21 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + 418B0B3C24C5E99E00DF2C21 /* PBXTargetDependency */, + ); + name = jpegicc; + productName = jpegicc; + productReference = 418B0B2F24C5E95D00DF2C21 /* jpegicc */; + productType = "com.apple.product-type.tool"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 418B0A2924C5E19500DF2C21 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = YES; + LastUpgradeCheck = 1430; + ORGANIZATIONNAME = littlecms; + TargetAttributes = { + 418B0A3024C5E19500DF2C21 = { + CreatedOnToolsVersion = 11.6; + }; + 418B0A7724C5E25200DF2C21 = { + CreatedOnToolsVersion = 11.6; + }; + 418B0A8E24C5E35200DF2C21 = { + CreatedOnToolsVersion = 11.6; + }; + 418B0AB724C5E42900DF2C21 = { + CreatedOnToolsVersion = 11.6; + }; + 418B0ACA24C5E4EA00DF2C21 = { + CreatedOnToolsVersion = 11.6; + }; + 418B0AE024C5E5C300DF2C21 = { + CreatedOnToolsVersion = 11.6; + }; + 418B0B0424C5E76100DF2C21 = { + CreatedOnToolsVersion = 11.6; + }; + 418B0B1924C5E85600DF2C21 = { + CreatedOnToolsVersion = 11.6; + }; + 418B0B2E24C5E95D00DF2C21 = { + CreatedOnToolsVersion = 11.6; + }; + }; + }; + buildConfigurationList = 418B0A2C24C5E19500DF2C21 /* Build configuration list for PBXProject "lcms2" */; + compatibilityVersion = "Xcode 14.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 418B0A2824C5E19500DF2C21; + productRefGroup = 418B0A3224C5E19500DF2C21 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 418B0A3024C5E19500DF2C21 /* lcms2 */, + 418B0A7724C5E25200DF2C21 /* testbed */, + 418B0A8E24C5E35200DF2C21 /* fast_float_plugin */, + 418B0AB724C5E42900DF2C21 /* fast_float_testbed */, + 418B0ACA24C5E4EA00DF2C21 /* transicc */, + 418B0AE024C5E5C300DF2C21 /* linkicc */, + 418B0B0424C5E76100DF2C21 /* tificc */, + 418B0B1924C5E85600DF2C21 /* tifdiff */, + 418B0B2E24C5E95D00DF2C21 /* jpegicc */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + 418B0A2E24C5E19500DF2C21 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 418B0A5224C5E1C900DF2C21 /* cmsgamma.c in Sources */, + 418B0A5324C5E1C900DF2C21 /* cmsintrp.c in Sources */, + 418B0A5424C5E1C900DF2C21 /* cmsgmt.c in Sources */, + 418B0A5524C5E1C900DF2C21 /* cmscnvrt.c in Sources */, + 418B0A5624C5E1C900DF2C21 /* cmsmd5.c in Sources */, + 418B0A5724C5E1C900DF2C21 /* cmssm.c in Sources */, + 418B0A5824C5E1C900DF2C21 /* cmsopt.c in Sources */, + 418B0A5924C5E1C900DF2C21 /* cmscgats.c in Sources */, + 418B0A5A24C5E1C900DF2C21 /* cmsalpha.c in Sources */, + 418B0A5B24C5E1C900DF2C21 /* cmstypes.c in Sources */, + 418B0A5C24C5E1C900DF2C21 /* cmsio1.c in Sources */, + 418B0A5D24C5E1C900DF2C21 /* cmspack.c in Sources */, + 418B0A5E24C5E1C900DF2C21 /* cmsxform.c in Sources */, + 418B0A5F24C5E1C900DF2C21 /* cmswtpnt.c in Sources */, + 418B0A6024C5E1C900DF2C21 /* cmsmtrx.c in Sources */, + 418B0A6124C5E1C900DF2C21 /* cmspcs.c in Sources */, + 418B0A6224C5E1C900DF2C21 /* cmsps2.c in Sources */, + 418B0A6324C5E1C900DF2C21 /* cmsnamed.c in Sources */, + 418B0A6424C5E1C900DF2C21 /* cmserr.c in Sources */, + 418B0A6524C5E1C900DF2C21 /* cmslut.c in Sources */, + 418B0A6624C5E1C900DF2C21 /* cmsvirt.c in Sources */, + 418B0A6724C5E1C900DF2C21 /* cmsplugin.c in Sources */, + 418B0A6824C5E1C900DF2C21 /* cmshalf.c in Sources */, + 418B0A6924C5E1C900DF2C21 /* cmsio0.c in Sources */, + 418B0A6A24C5E1C900DF2C21 /* cmscam02.c in Sources */, + 418B0A6B24C5E1C900DF2C21 /* cmssamp.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 418B0A7424C5E25200DF2C21 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 418B0B4724C5EC1D00DF2C21 /* testplugin.c in Sources */, + 418B0B4924C5EC2A00DF2C21 /* zoo_icc.c in Sources */, + 418B0B4624C5EC1D00DF2C21 /* testcms2.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 418B0A8C24C5E35200DF2C21 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 418B0AA124C5E37800DF2C21 /* fast_float_curves.c in Sources */, + 418B0AA224C5E37800DF2C21 /* fast_float_15mats.c in Sources */, + 418B0AA324C5E37800DF2C21 /* fast_float_tethra.c in Sources */, + 418B0AA424C5E37800DF2C21 /* fast_float_cmyk.c in Sources */, + 418B0AA524C5E37800DF2C21 /* fast_16_tethra.c in Sources */, + 418B0AA724C5E37800DF2C21 /* fast_8_matsh.c in Sources */, + 418B0AA824C5E37800DF2C21 /* fast_float_separate.c in Sources */, + 418B0AA924C5E37800DF2C21 /* fast_8_matsh_sse.c in Sources */, + 418B0AAA24C5E37800DF2C21 /* fast_8_tethra.c in Sources */, + 418B0AAB24C5E37800DF2C21 /* fast_float_sup.c in Sources */, + 418B0AAC24C5E37800DF2C21 /* fast_float_15bits.c in Sources */, + 418B0AAD24C5E37800DF2C21 /* fast_8_curves.c in Sources */, + 418B0AAE24C5E37800DF2C21 /* fast_float_matsh.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 418B0AB424C5E42900DF2C21 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 418B0AF224C5E6B000DF2C21 /* fast_float_testbed.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 418B0AC724C5E4EA00DF2C21 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 418B0AF724C5E6C800DF2C21 /* vprf.c in Sources */, + 418B0AF924C5E6D200DF2C21 /* transicc.c in Sources */, + 418B0AF624C5E6C800DF2C21 /* xgetopt.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 418B0ADD24C5E5C300DF2C21 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 418B0B0024C5E73100DF2C21 /* vprf.c in Sources */, + 418B0AFF24C5E73100DF2C21 /* xgetopt.c in Sources */, + 4123B46925518DB1005F0287 /* linkicc.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 418B0B0124C5E76100DF2C21 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 4123B4A425518FFB005F0287 /* xgetopt.c in Sources */, + 418B0B0F24C5E79200DF2C21 /* utils.h in Sources */, + 418B0B1424C5E7BB00DF2C21 /* vprf.c in Sources */, + 4123B4B82551903B005F0287 /* tificc.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 418B0B1624C5E85600DF2C21 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 418B0B2524C5E92100DF2C21 /* tifdiff.c in Sources */, + 418B0B2924C5E92B00DF2C21 /* vprf.c in Sources */, + 418B0B2A24C5E92B00DF2C21 /* xgetopt.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 418B0B2B24C5E95D00DF2C21 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 418B0B3824C5E98E00DF2C21 /* iccjpeg.c in Sources */, + 418B0B4224C5E9F700DF2C21 /* xgetopt.c in Sources */, + 418B0B4124C5E9F700DF2C21 /* vprf.c in Sources */, + 418B0B3A24C5E99600DF2C21 /* jpgicc.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 418B0A8624C5E29800DF2C21 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 418B0A3024C5E19500DF2C21 /* lcms2 */; + targetProxy = 418B0A8524C5E29800DF2C21 /* PBXContainerItemProxy */; + }; + 418B0AB324C5E3D400DF2C21 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 418B0A3024C5E19500DF2C21 /* lcms2 */; + targetProxy = 418B0AB224C5E3D400DF2C21 /* PBXContainerItemProxy */; + }; + 418B0AC424C5E48100DF2C21 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 418B0A8E24C5E35200DF2C21 /* fast_float_plugin */; + targetProxy = 418B0AC324C5E48100DF2C21 /* PBXContainerItemProxy */; + }; + 418B0AC624C5E48600DF2C21 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 418B0A3024C5E19500DF2C21 /* lcms2 */; + targetProxy = 418B0AC524C5E48600DF2C21 /* PBXContainerItemProxy */; + }; + 418B0ADC24C5E58F00DF2C21 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 418B0A3024C5E19500DF2C21 /* lcms2 */; + targetProxy = 418B0ADB24C5E58F00DF2C21 /* PBXContainerItemProxy */; + }; + 418B0AE924C5E5CA00DF2C21 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 418B0A3024C5E19500DF2C21 /* lcms2 */; + targetProxy = 418B0AE824C5E5CA00DF2C21 /* PBXContainerItemProxy */; + }; + 418B0B0D24C5E77500DF2C21 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 418B0A3024C5E19500DF2C21 /* lcms2 */; + targetProxy = 418B0B0C24C5E77500DF2C21 /* PBXContainerItemProxy */; + }; + 418B0B2324C5E8FA00DF2C21 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 418B0A3024C5E19500DF2C21 /* lcms2 */; + targetProxy = 418B0B2224C5E8FA00DF2C21 /* PBXContainerItemProxy */; + }; + 418B0B3C24C5E99E00DF2C21 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 418B0A3024C5E19500DF2C21 /* lcms2 */; + targetProxy = 418B0B3B24C5E99E00DF2C21 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 418B0A3324C5E19500DF2C21 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + }; + name = Debug; + }; + 418B0A3424C5E19500DF2C21 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + }; + name = Release; + }; + 418B0A3624C5E19500DF2C21 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + DEAD_CODE_STRIPPING = YES; + EXECUTABLE_PREFIX = lib; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + }; + name = Debug; + }; + 418B0A3724C5E19500DF2C21 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + DEAD_CODE_STRIPPING = YES; + EXECUTABLE_PREFIX = lib; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + }; + name = Release; + }; + 418B0A7D24C5E25200DF2C21 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + DEAD_CODE_STRIPPING = YES; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 418B0A7E24C5E25200DF2C21 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + DEAD_CODE_STRIPPING = YES; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 418B0A9124C5E35200DF2C21 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + DEAD_CODE_STRIPPING = YES; + EXECUTABLE_PREFIX = lib; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + }; + name = Debug; + }; + 418B0A9224C5E35200DF2C21 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + DEAD_CODE_STRIPPING = YES; + EXECUTABLE_PREFIX = lib; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + }; + name = Release; + }; + 418B0ABD24C5E42900DF2C21 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + DEAD_CODE_STRIPPING = YES; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 418B0ABE24C5E42900DF2C21 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + DEAD_CODE_STRIPPING = YES; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 418B0AD024C5E4EA00DF2C21 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + DEAD_CODE_STRIPPING = YES; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 418B0AD124C5E4EA00DF2C21 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + DEAD_CODE_STRIPPING = YES; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 418B0AE624C5E5C300DF2C21 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + DEAD_CODE_STRIPPING = YES; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 418B0AE724C5E5C300DF2C21 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + DEAD_CODE_STRIPPING = YES; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 418B0B0A24C5E76100DF2C21 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + DEAD_CODE_STRIPPING = YES; + HEADER_SEARCH_PATHS = /usr/local/include; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + OTHER_LDFLAGS = ( + "-L", + /usr/local/lib, + "-ltiff", + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 418B0B0B24C5E76100DF2C21 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + DEAD_CODE_STRIPPING = YES; + HEADER_SEARCH_PATHS = /usr/local/include; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + OTHER_LDFLAGS = ( + "-L", + /usr/local/lib, + "-ltiff", + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 418B0B1F24C5E85600DF2C21 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + DEAD_CODE_STRIPPING = YES; + HEADER_SEARCH_PATHS = /usr/local/include; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + OTHER_LDFLAGS = ( + "-L", + /usr/local/lib, + "-ltiff", + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 418B0B2024C5E85600DF2C21 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + DEAD_CODE_STRIPPING = YES; + HEADER_SEARCH_PATHS = /usr/local/include; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + OTHER_LDFLAGS = ( + "-L", + /usr/local/lib, + "-ltiff", + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 418B0B3424C5E95D00DF2C21 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + DEAD_CODE_STRIPPING = YES; + HEADER_SEARCH_PATHS = /usr/local/include; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + OTHER_LDFLAGS = ( + "-L", + /usr/local/lib, + "-ljpeg", + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 418B0B3524C5E95D00DF2C21 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + DEAD_CODE_STRIPPING = YES; + HEADER_SEARCH_PATHS = /usr/local/include; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + OTHER_LDFLAGS = ( + "-L", + /usr/local/lib, + "-ljpeg", + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 418B0A2C24C5E19500DF2C21 /* Build configuration list for PBXProject "lcms2" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 418B0A3324C5E19500DF2C21 /* Debug */, + 418B0A3424C5E19500DF2C21 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 418B0A3524C5E19500DF2C21 /* Build configuration list for PBXNativeTarget "lcms2" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 418B0A3624C5E19500DF2C21 /* Debug */, + 418B0A3724C5E19500DF2C21 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 418B0A7C24C5E25200DF2C21 /* Build configuration list for PBXNativeTarget "testbed" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 418B0A7D24C5E25200DF2C21 /* Debug */, + 418B0A7E24C5E25200DF2C21 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 418B0A9024C5E35200DF2C21 /* Build configuration list for PBXNativeTarget "fast_float_plugin" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 418B0A9124C5E35200DF2C21 /* Debug */, + 418B0A9224C5E35200DF2C21 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 418B0ABC24C5E42900DF2C21 /* Build configuration list for PBXNativeTarget "fast_float_testbed" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 418B0ABD24C5E42900DF2C21 /* Debug */, + 418B0ABE24C5E42900DF2C21 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 418B0ACF24C5E4EA00DF2C21 /* Build configuration list for PBXNativeTarget "transicc" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 418B0AD024C5E4EA00DF2C21 /* Debug */, + 418B0AD124C5E4EA00DF2C21 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 418B0AE524C5E5C300DF2C21 /* Build configuration list for PBXNativeTarget "linkicc" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 418B0AE624C5E5C300DF2C21 /* Debug */, + 418B0AE724C5E5C300DF2C21 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 418B0B0924C5E76100DF2C21 /* Build configuration list for PBXNativeTarget "tificc" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 418B0B0A24C5E76100DF2C21 /* Debug */, + 418B0B0B24C5E76100DF2C21 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 418B0B1E24C5E85600DF2C21 /* Build configuration list for PBXNativeTarget "tifdiff" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 418B0B1F24C5E85600DF2C21 /* Debug */, + 418B0B2024C5E85600DF2C21 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 418B0B3324C5E95D00DF2C21 /* Build configuration list for PBXNativeTarget "jpegicc" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 418B0B3424C5E95D00DF2C21 /* Debug */, + 418B0B3524C5E95D00DF2C21 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 418B0A2924C5E19500DF2C21 /* Project object */; +} diff --git a/local/recipes/libs/lcms2/source/Projects/Xcode_14/lcms2/lcms2.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/local/recipes/libs/lcms2/source/Projects/Xcode_14/lcms2/lcms2.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000000..ebae78459f --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/Xcode_14/lcms2/lcms2.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/local/recipes/libs/lcms2/source/Projects/Xcode_14/lcms2/lcms2.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/local/recipes/libs/lcms2/source/Projects/Xcode_14/lcms2/lcms2.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000000..18d981003d --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/Xcode_14/lcms2/lcms2.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/local/recipes/libs/lcms2/source/Projects/Xcode_14/lcms2/lcms2.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/local/recipes/libs/lcms2/source/Projects/Xcode_14/lcms2/lcms2.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000000..f9b0d7c5ea --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/Xcode_14/lcms2/lcms2.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/local/recipes/libs/lcms2/source/Projects/Xcode_26/lcms2/lcms2.xcodeproj/project.pbxproj b/local/recipes/libs/lcms2/source/Projects/Xcode_26/lcms2/lcms2.xcodeproj/project.pbxproj new file mode 100644 index 0000000000..7fd1bcfbec --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/Xcode_26/lcms2/lcms2.xcodeproj/project.pbxproj @@ -0,0 +1,1685 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 56; + objects = { + +/* Begin PBXBuildFile section */ + 4123B46925518DB1005F0287 /* linkicc.c in Sources */ = {isa = PBXBuildFile; fileRef = 4123B46825518DB1005F0287 /* linkicc.c */; }; + 4123B4A425518FFB005F0287 /* xgetopt.c in Sources */ = {isa = PBXBuildFile; fileRef = 4123B4A325518FFB005F0287 /* xgetopt.c */; }; + 4123B4B82551903B005F0287 /* tificc.c in Sources */ = {isa = PBXBuildFile; fileRef = 4123B4B72551903B005F0287 /* tificc.c */; }; + 4123B5042551A1C8005F0287 /* libfast_float_plugin.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 418B0A8F24C5E35200DF2C21 /* libfast_float_plugin.a */; }; + 418B0A5224C5E1C900DF2C21 /* cmsgamma.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A3824C5E1C700DF2C21 /* cmsgamma.c */; }; + 418B0A5324C5E1C900DF2C21 /* cmsintrp.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A3924C5E1C700DF2C21 /* cmsintrp.c */; }; + 418B0A5424C5E1C900DF2C21 /* cmsgmt.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A3A24C5E1C700DF2C21 /* cmsgmt.c */; }; + 418B0A5524C5E1C900DF2C21 /* cmscnvrt.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A3B24C5E1C700DF2C21 /* cmscnvrt.c */; }; + 418B0A5624C5E1C900DF2C21 /* cmsmd5.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A3C24C5E1C700DF2C21 /* cmsmd5.c */; }; + 418B0A5724C5E1C900DF2C21 /* cmssm.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A3D24C5E1C700DF2C21 /* cmssm.c */; }; + 418B0A5824C5E1C900DF2C21 /* cmsopt.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A3E24C5E1C700DF2C21 /* cmsopt.c */; }; + 418B0A5924C5E1C900DF2C21 /* cmscgats.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A3F24C5E1C700DF2C21 /* cmscgats.c */; }; + 418B0A5A24C5E1C900DF2C21 /* cmsalpha.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4024C5E1C800DF2C21 /* cmsalpha.c */; }; + 418B0A5B24C5E1C900DF2C21 /* cmstypes.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4124C5E1C800DF2C21 /* cmstypes.c */; }; + 418B0A5C24C5E1C900DF2C21 /* cmsio1.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4224C5E1C800DF2C21 /* cmsio1.c */; }; + 418B0A5D24C5E1C900DF2C21 /* cmspack.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4324C5E1C800DF2C21 /* cmspack.c */; }; + 418B0A5E24C5E1C900DF2C21 /* cmsxform.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4424C5E1C800DF2C21 /* cmsxform.c */; }; + 418B0A5F24C5E1C900DF2C21 /* cmswtpnt.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4524C5E1C800DF2C21 /* cmswtpnt.c */; }; + 418B0A6024C5E1C900DF2C21 /* cmsmtrx.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4624C5E1C800DF2C21 /* cmsmtrx.c */; }; + 418B0A6124C5E1C900DF2C21 /* cmspcs.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4724C5E1C800DF2C21 /* cmspcs.c */; }; + 418B0A6224C5E1C900DF2C21 /* cmsps2.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4824C5E1C800DF2C21 /* cmsps2.c */; }; + 418B0A6324C5E1C900DF2C21 /* cmsnamed.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4924C5E1C800DF2C21 /* cmsnamed.c */; }; + 418B0A6424C5E1C900DF2C21 /* cmserr.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4A24C5E1C800DF2C21 /* cmserr.c */; }; + 418B0A6524C5E1C900DF2C21 /* cmslut.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4B24C5E1C800DF2C21 /* cmslut.c */; }; + 418B0A6624C5E1C900DF2C21 /* cmsvirt.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4C24C5E1C800DF2C21 /* cmsvirt.c */; }; + 418B0A6724C5E1C900DF2C21 /* cmsplugin.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4D24C5E1C800DF2C21 /* cmsplugin.c */; }; + 418B0A6824C5E1C900DF2C21 /* cmshalf.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4E24C5E1C800DF2C21 /* cmshalf.c */; }; + 418B0A6924C5E1C900DF2C21 /* cmsio0.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A4F24C5E1C900DF2C21 /* cmsio0.c */; }; + 418B0A6A24C5E1C900DF2C21 /* cmscam02.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A5024C5E1C900DF2C21 /* cmscam02.c */; }; + 418B0A6B24C5E1C900DF2C21 /* cmssamp.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A5124C5E1C900DF2C21 /* cmssamp.c */; }; + 418B0A6F24C5E1E800DF2C21 /* lcms2.h in Headers */ = {isa = PBXBuildFile; fileRef = 418B0A6D24C5E1E800DF2C21 /* lcms2.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 418B0A7024C5E1E800DF2C21 /* lcms2_plugin.h in Headers */ = {isa = PBXBuildFile; fileRef = 418B0A6E24C5E1E800DF2C21 /* lcms2_plugin.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 418B0A7224C5E1F400DF2C21 /* lcms2_internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 418B0A7124C5E1F400DF2C21 /* lcms2_internal.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 418B0A8A24C5E30000DF2C21 /* liblcms2.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 418B0A3124C5E19500DF2C21 /* liblcms2.a */; }; + 418B0AA124C5E37800DF2C21 /* fast_float_curves.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9324C5E37600DF2C21 /* fast_float_curves.c */; }; + 418B0AA224C5E37800DF2C21 /* fast_float_15mats.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9424C5E37600DF2C21 /* fast_float_15mats.c */; }; + 418B0AA324C5E37800DF2C21 /* fast_float_tethra.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9524C5E37600DF2C21 /* fast_float_tethra.c */; }; + 418B0AA424C5E37800DF2C21 /* fast_float_cmyk.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9624C5E37700DF2C21 /* fast_float_cmyk.c */; }; + 418B0AA524C5E37800DF2C21 /* fast_16_tethra.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9724C5E37700DF2C21 /* fast_16_tethra.c */; }; + 418B0AA624C5E37800DF2C21 /* fast_float_internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 418B0A9824C5E37700DF2C21 /* fast_float_internal.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 418B0AA724C5E37800DF2C21 /* fast_8_matsh.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9924C5E37700DF2C21 /* fast_8_matsh.c */; }; + 418B0AA824C5E37800DF2C21 /* fast_float_separate.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9A24C5E37700DF2C21 /* fast_float_separate.c */; }; + 418B0AA924C5E37800DF2C21 /* fast_8_matsh_sse.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9B24C5E37700DF2C21 /* fast_8_matsh_sse.c */; }; + 418B0AAA24C5E37800DF2C21 /* fast_8_tethra.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9C24C5E37700DF2C21 /* fast_8_tethra.c */; }; + 418B0AAB24C5E37800DF2C21 /* fast_float_sup.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9D24C5E37700DF2C21 /* fast_float_sup.c */; }; + 418B0AAC24C5E37800DF2C21 /* fast_float_15bits.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9E24C5E37700DF2C21 /* fast_float_15bits.c */; }; + 418B0AAD24C5E37800DF2C21 /* fast_8_curves.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0A9F24C5E37700DF2C21 /* fast_8_curves.c */; }; + 418B0AAE24C5E37800DF2C21 /* fast_float_matsh.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0AA024C5E37800DF2C21 /* fast_float_matsh.c */; }; + 418B0AB024C5E38C00DF2C21 /* lcms2_fast_float.h in Headers */ = {isa = PBXBuildFile; fileRef = 418B0AAF24C5E38C00DF2C21 /* lcms2_fast_float.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 418B0AC224C5E47C00DF2C21 /* liblcms2.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 418B0A3124C5E19500DF2C21 /* liblcms2.a */; }; + 418B0ADA24C5E58A00DF2C21 /* liblcms2.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 418B0A3124C5E19500DF2C21 /* liblcms2.a */; }; + 418B0AEA24C5E5CF00DF2C21 /* liblcms2.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 418B0A3124C5E19500DF2C21 /* liblcms2.a */; }; + 418B0AF224C5E6B000DF2C21 /* fast_float_testbed.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0AF124C5E6B000DF2C21 /* fast_float_testbed.c */; }; + 418B0AF624C5E6C800DF2C21 /* xgetopt.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0AF324C5E6C700DF2C21 /* xgetopt.c */; }; + 418B0AF724C5E6C800DF2C21 /* vprf.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0AF424C5E6C700DF2C21 /* vprf.c */; }; + 418B0AF924C5E6D200DF2C21 /* transicc.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0AF824C5E6D200DF2C21 /* transicc.c */; }; + 418B0AFF24C5E73100DF2C21 /* xgetopt.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0AFD24C5E73100DF2C21 /* xgetopt.c */; }; + 418B0B0024C5E73100DF2C21 /* vprf.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0AFE24C5E73100DF2C21 /* vprf.c */; }; + 418B0B0F24C5E79200DF2C21 /* utils.h in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B0E24C5E79200DF2C21 /* utils.h */; }; + 418B0B1424C5E7BB00DF2C21 /* vprf.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B1224C5E7BB00DF2C21 /* vprf.c */; }; + 418B0B1524C5E7CF00DF2C21 /* liblcms2.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 418B0A3124C5E19500DF2C21 /* liblcms2.a */; }; + 418B0B2124C5E8FA00DF2C21 /* liblcms2.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 418B0A3124C5E19500DF2C21 /* liblcms2.a */; }; + 418B0B2524C5E92100DF2C21 /* tifdiff.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B2424C5E92100DF2C21 /* tifdiff.c */; }; + 418B0B2924C5E92B00DF2C21 /* vprf.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B2724C5E92B00DF2C21 /* vprf.c */; }; + 418B0B2A24C5E92B00DF2C21 /* xgetopt.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B2824C5E92B00DF2C21 /* xgetopt.c */; }; + 418B0B3824C5E98E00DF2C21 /* iccjpeg.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B3624C5E98E00DF2C21 /* iccjpeg.c */; }; + 418B0B3A24C5E99600DF2C21 /* jpgicc.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B3924C5E99600DF2C21 /* jpgicc.c */; }; + 418B0B3D24C5E9A200DF2C21 /* liblcms2.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 418B0A3124C5E19500DF2C21 /* liblcms2.a */; }; + 418B0B4124C5E9F700DF2C21 /* vprf.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B3E24C5E9F700DF2C21 /* vprf.c */; }; + 418B0B4224C5E9F700DF2C21 /* xgetopt.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B3F24C5E9F700DF2C21 /* xgetopt.c */; }; + 418B0B4624C5EC1D00DF2C21 /* testcms2.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B4324C5EC1D00DF2C21 /* testcms2.c */; }; + 418B0B4724C5EC1D00DF2C21 /* testplugin.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B4524C5EC1D00DF2C21 /* testplugin.c */; }; + 418B0B4924C5EC2A00DF2C21 /* zoo_icc.c in Sources */ = {isa = PBXBuildFile; fileRef = 418B0B4824C5EC2A00DF2C21 /* zoo_icc.c */; }; + 4198300D2EDC66D700E88CD7 /* liblcms2.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 418B0A3124C5E19500DF2C21 /* liblcms2.a */; }; + 419830262EDC887300E88CD7 /* fast_float_lab.c in Sources */ = {isa = PBXBuildFile; fileRef = 419830252EDC887300E88CD7 /* fast_float_lab.c */; }; + 419830352EDC8AC800E88CD7 /* threaded_testbed.c in Sources */ = {isa = PBXBuildFile; fileRef = 419830342EDC8AC800E88CD7 /* threaded_testbed.c */; }; + 419830412EDC8CF800E88CD7 /* libthreaded_plugin.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4198303A2EDC8B1A00E88CD7 /* libthreaded_plugin.a */; }; + 419830492EDC8DC900E88CD7 /* threaded_core.c in Sources */ = {isa = PBXBuildFile; fileRef = 419830442EDC8DC900E88CD7 /* threaded_core.c */; }; + 4198304A2EDC8DC900E88CD7 /* threaded_scheduler.c in Sources */ = {isa = PBXBuildFile; fileRef = 419830472EDC8DC900E88CD7 /* threaded_scheduler.c */; }; + 4198304B2EDC8DC900E88CD7 /* threaded_main.c in Sources */ = {isa = PBXBuildFile; fileRef = 419830462EDC8DC900E88CD7 /* threaded_main.c */; }; + 4198304C2EDC8DC900E88CD7 /* threaded_split.c in Sources */ = {isa = PBXBuildFile; fileRef = 419830482EDC8DC900E88CD7 /* threaded_split.c */; }; + 4198304D2EDC8DC900E88CD7 /* threaded_internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 419830452EDC8DC900E88CD7 /* threaded_internal.h */; }; + 419830782EDC8ECC00E88CD7 /* lcms2_threaded.h in Headers */ = {isa = PBXBuildFile; fileRef = 419830772EDC8ECC00E88CD7 /* lcms2_threaded.h */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 418B0A8524C5E29800DF2C21 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 418B0A2924C5E19500DF2C21 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 418B0A3024C5E19500DF2C21; + remoteInfo = lcms2; + }; + 418B0AB224C5E3D400DF2C21 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 418B0A2924C5E19500DF2C21 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 418B0A3024C5E19500DF2C21; + remoteInfo = lcms2; + }; + 418B0AC324C5E48100DF2C21 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 418B0A2924C5E19500DF2C21 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 418B0A8E24C5E35200DF2C21; + remoteInfo = fast_float_plugin; + }; + 418B0AC524C5E48600DF2C21 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 418B0A2924C5E19500DF2C21 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 418B0A3024C5E19500DF2C21; + remoteInfo = lcms2; + }; + 418B0ADB24C5E58F00DF2C21 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 418B0A2924C5E19500DF2C21 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 418B0A3024C5E19500DF2C21; + remoteInfo = lcms2; + }; + 418B0AE824C5E5CA00DF2C21 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 418B0A2924C5E19500DF2C21 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 418B0A3024C5E19500DF2C21; + remoteInfo = lcms2; + }; + 418B0B0C24C5E77500DF2C21 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 418B0A2924C5E19500DF2C21 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 418B0A3024C5E19500DF2C21; + remoteInfo = lcms2; + }; + 418B0B2224C5E8FA00DF2C21 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 418B0A2924C5E19500DF2C21 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 418B0A3024C5E19500DF2C21; + remoteInfo = lcms2; + }; + 418B0B3B24C5E99E00DF2C21 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 418B0A2924C5E19500DF2C21 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 418B0A3024C5E19500DF2C21; + remoteInfo = lcms2; + }; + 4198300E2EDC66D700E88CD7 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 418B0A2924C5E19500DF2C21 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 418B0A3024C5E19500DF2C21; + remoteInfo = lcms2; + }; + 419830422EDC8CF800E88CD7 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 418B0A2924C5E19500DF2C21 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 419830392EDC8B1A00E88CD7; + remoteInfo = threaded_plugin; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 418B0A7624C5E25200DF2C21 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; + 418B0AB624C5E42900DF2C21 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; + 418B0AC924C5E4EA00DF2C21 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; + 418B0ADF24C5E5C300DF2C21 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; + 418B0B0324C5E76100DF2C21 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; + 418B0B1824C5E85600DF2C21 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; + 418B0B2D24C5E95D00DF2C21 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; + 41982FF42EDC65BC00E88CD7 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 4123B46825518DB1005F0287 /* linkicc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = linkicc.c; sourceTree = ""; }; + 4123B4A325518FFB005F0287 /* xgetopt.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = xgetopt.c; path = ../common/xgetopt.c; sourceTree = ""; }; + 4123B4B72551903B005F0287 /* tificc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = tificc.c; sourceTree = ""; }; + 4123B4C2255190FE005F0287 /* tifdiff.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = tifdiff.c; sourceTree = ""; }; + 418B0A3124C5E19500DF2C21 /* liblcms2.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = liblcms2.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 418B0A3824C5E1C700DF2C21 /* cmsgamma.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsgamma.c; path = ../../../src/cmsgamma.c; sourceTree = ""; }; + 418B0A3924C5E1C700DF2C21 /* cmsintrp.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsintrp.c; path = ../../../src/cmsintrp.c; sourceTree = ""; }; + 418B0A3A24C5E1C700DF2C21 /* cmsgmt.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsgmt.c; path = ../../../src/cmsgmt.c; sourceTree = ""; }; + 418B0A3B24C5E1C700DF2C21 /* cmscnvrt.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmscnvrt.c; path = ../../../src/cmscnvrt.c; sourceTree = ""; }; + 418B0A3C24C5E1C700DF2C21 /* cmsmd5.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsmd5.c; path = ../../../src/cmsmd5.c; sourceTree = ""; }; + 418B0A3D24C5E1C700DF2C21 /* cmssm.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmssm.c; path = ../../../src/cmssm.c; sourceTree = ""; }; + 418B0A3E24C5E1C700DF2C21 /* cmsopt.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsopt.c; path = ../../../src/cmsopt.c; sourceTree = ""; }; + 418B0A3F24C5E1C700DF2C21 /* cmscgats.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmscgats.c; path = ../../../src/cmscgats.c; sourceTree = ""; }; + 418B0A4024C5E1C800DF2C21 /* cmsalpha.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsalpha.c; path = ../../../src/cmsalpha.c; sourceTree = ""; }; + 418B0A4124C5E1C800DF2C21 /* cmstypes.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmstypes.c; path = ../../../src/cmstypes.c; sourceTree = ""; }; + 418B0A4224C5E1C800DF2C21 /* cmsio1.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsio1.c; path = ../../../src/cmsio1.c; sourceTree = ""; }; + 418B0A4324C5E1C800DF2C21 /* cmspack.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmspack.c; path = ../../../src/cmspack.c; sourceTree = ""; }; + 418B0A4424C5E1C800DF2C21 /* cmsxform.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsxform.c; path = ../../../src/cmsxform.c; sourceTree = ""; }; + 418B0A4524C5E1C800DF2C21 /* cmswtpnt.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmswtpnt.c; path = ../../../src/cmswtpnt.c; sourceTree = ""; }; + 418B0A4624C5E1C800DF2C21 /* cmsmtrx.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsmtrx.c; path = ../../../src/cmsmtrx.c; sourceTree = ""; }; + 418B0A4724C5E1C800DF2C21 /* cmspcs.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmspcs.c; path = ../../../src/cmspcs.c; sourceTree = ""; }; + 418B0A4824C5E1C800DF2C21 /* cmsps2.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsps2.c; path = ../../../src/cmsps2.c; sourceTree = ""; }; + 418B0A4924C5E1C800DF2C21 /* cmsnamed.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsnamed.c; path = ../../../src/cmsnamed.c; sourceTree = ""; }; + 418B0A4A24C5E1C800DF2C21 /* cmserr.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmserr.c; path = ../../../src/cmserr.c; sourceTree = ""; }; + 418B0A4B24C5E1C800DF2C21 /* cmslut.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmslut.c; path = ../../../src/cmslut.c; sourceTree = ""; }; + 418B0A4C24C5E1C800DF2C21 /* cmsvirt.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsvirt.c; path = ../../../src/cmsvirt.c; sourceTree = ""; }; + 418B0A4D24C5E1C800DF2C21 /* cmsplugin.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsplugin.c; path = ../../../src/cmsplugin.c; sourceTree = ""; }; + 418B0A4E24C5E1C800DF2C21 /* cmshalf.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmshalf.c; path = ../../../src/cmshalf.c; sourceTree = ""; }; + 418B0A4F24C5E1C900DF2C21 /* cmsio0.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmsio0.c; path = ../../../src/cmsio0.c; sourceTree = ""; }; + 418B0A5024C5E1C900DF2C21 /* cmscam02.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmscam02.c; path = ../../../src/cmscam02.c; sourceTree = ""; }; + 418B0A5124C5E1C900DF2C21 /* cmssamp.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cmssamp.c; path = ../../../src/cmssamp.c; sourceTree = ""; }; + 418B0A6D24C5E1E800DF2C21 /* lcms2.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = lcms2.h; path = ../../../include/lcms2.h; sourceTree = ""; }; + 418B0A6E24C5E1E800DF2C21 /* lcms2_plugin.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = lcms2_plugin.h; path = ../../../include/lcms2_plugin.h; sourceTree = ""; }; + 418B0A7124C5E1F400DF2C21 /* lcms2_internal.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = lcms2_internal.h; path = ../../../src/lcms2_internal.h; sourceTree = ""; }; + 418B0A7824C5E25200DF2C21 /* testbed */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = testbed; sourceTree = BUILT_PRODUCTS_DIR; }; + 418B0A8F24C5E35200DF2C21 /* libfast_float_plugin.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libfast_float_plugin.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 418B0A9324C5E37600DF2C21 /* fast_float_curves.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_float_curves.c; path = ../../../plugins/fast_float/src/fast_float_curves.c; sourceTree = ""; }; + 418B0A9424C5E37600DF2C21 /* fast_float_15mats.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_float_15mats.c; path = ../../../plugins/fast_float/src/fast_float_15mats.c; sourceTree = ""; }; + 418B0A9524C5E37600DF2C21 /* fast_float_tethra.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_float_tethra.c; path = ../../../plugins/fast_float/src/fast_float_tethra.c; sourceTree = ""; }; + 418B0A9624C5E37700DF2C21 /* fast_float_cmyk.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_float_cmyk.c; path = ../../../plugins/fast_float/src/fast_float_cmyk.c; sourceTree = ""; }; + 418B0A9724C5E37700DF2C21 /* fast_16_tethra.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_16_tethra.c; path = ../../../plugins/fast_float/src/fast_16_tethra.c; sourceTree = ""; }; + 418B0A9824C5E37700DF2C21 /* fast_float_internal.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = fast_float_internal.h; path = ../../../plugins/fast_float/src/fast_float_internal.h; sourceTree = ""; }; + 418B0A9924C5E37700DF2C21 /* fast_8_matsh.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_8_matsh.c; path = ../../../plugins/fast_float/src/fast_8_matsh.c; sourceTree = ""; }; + 418B0A9A24C5E37700DF2C21 /* fast_float_separate.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_float_separate.c; path = ../../../plugins/fast_float/src/fast_float_separate.c; sourceTree = ""; }; + 418B0A9B24C5E37700DF2C21 /* fast_8_matsh_sse.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_8_matsh_sse.c; path = ../../../plugins/fast_float/src/fast_8_matsh_sse.c; sourceTree = ""; }; + 418B0A9C24C5E37700DF2C21 /* fast_8_tethra.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_8_tethra.c; path = ../../../plugins/fast_float/src/fast_8_tethra.c; sourceTree = ""; }; + 418B0A9D24C5E37700DF2C21 /* fast_float_sup.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_float_sup.c; path = ../../../plugins/fast_float/src/fast_float_sup.c; sourceTree = ""; }; + 418B0A9E24C5E37700DF2C21 /* fast_float_15bits.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_float_15bits.c; path = ../../../plugins/fast_float/src/fast_float_15bits.c; sourceTree = ""; }; + 418B0A9F24C5E37700DF2C21 /* fast_8_curves.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_8_curves.c; path = ../../../plugins/fast_float/src/fast_8_curves.c; sourceTree = ""; }; + 418B0AA024C5E37800DF2C21 /* fast_float_matsh.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_float_matsh.c; path = ../../../plugins/fast_float/src/fast_float_matsh.c; sourceTree = ""; }; + 418B0AAF24C5E38C00DF2C21 /* lcms2_fast_float.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = lcms2_fast_float.h; path = ../../../plugins/fast_float/include/lcms2_fast_float.h; sourceTree = ""; }; + 418B0AB824C5E42900DF2C21 /* fast_float_testbed */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = fast_float_testbed; sourceTree = BUILT_PRODUCTS_DIR; }; + 418B0ACB24C5E4EA00DF2C21 /* transicc */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = transicc; sourceTree = BUILT_PRODUCTS_DIR; }; + 418B0AE124C5E5C300DF2C21 /* linkicc */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = linkicc; sourceTree = BUILT_PRODUCTS_DIR; }; + 418B0AF124C5E6B000DF2C21 /* fast_float_testbed.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = fast_float_testbed.c; path = ../../../plugins/fast_float/testbed/fast_float_testbed.c; sourceTree = SOURCE_ROOT; }; + 418B0AF324C5E6C700DF2C21 /* xgetopt.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = xgetopt.c; path = ../../../utils/common/xgetopt.c; sourceTree = SOURCE_ROOT; }; + 418B0AF424C5E6C700DF2C21 /* vprf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = vprf.c; path = ../../../utils/common/vprf.c; sourceTree = SOURCE_ROOT; }; + 418B0AF524C5E6C800DF2C21 /* utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = utils.h; path = ../../../utils/common/utils.h; sourceTree = SOURCE_ROOT; }; + 418B0AF824C5E6D200DF2C21 /* transicc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = transicc.c; path = ../../../utils/transicc/transicc.c; sourceTree = SOURCE_ROOT; }; + 418B0AFC24C5E73100DF2C21 /* utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = utils.h; path = ../../../utils/common/utils.h; sourceTree = SOURCE_ROOT; }; + 418B0AFD24C5E73100DF2C21 /* xgetopt.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = xgetopt.c; path = ../../../utils/common/xgetopt.c; sourceTree = SOURCE_ROOT; }; + 418B0AFE24C5E73100DF2C21 /* vprf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = vprf.c; path = ../../../utils/common/vprf.c; sourceTree = SOURCE_ROOT; }; + 418B0B0524C5E76100DF2C21 /* tificc */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = tificc; sourceTree = BUILT_PRODUCTS_DIR; }; + 418B0B0E24C5E79200DF2C21 /* utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = utils.h; path = ../../../utils/common/utils.h; sourceTree = SOURCE_ROOT; }; + 418B0B1224C5E7BB00DF2C21 /* vprf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = vprf.c; path = ../../../utils/common/vprf.c; sourceTree = SOURCE_ROOT; }; + 418B0B1A24C5E85600DF2C21 /* tifdiff */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = tifdiff; sourceTree = BUILT_PRODUCTS_DIR; }; + 418B0B2424C5E92100DF2C21 /* tifdiff.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = tifdiff.c; path = ../../../utils/tificc/tifdiff.c; sourceTree = SOURCE_ROOT; }; + 418B0B2724C5E92B00DF2C21 /* vprf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = vprf.c; path = ../common/vprf.c; sourceTree = ""; }; + 418B0B2824C5E92B00DF2C21 /* xgetopt.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = xgetopt.c; path = ../common/xgetopt.c; sourceTree = ""; }; + 418B0B2F24C5E95D00DF2C21 /* jpegicc */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jpegicc; sourceTree = BUILT_PRODUCTS_DIR; }; + 418B0B3624C5E98E00DF2C21 /* iccjpeg.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = iccjpeg.c; path = ../../../utils/jpgicc/iccjpeg.c; sourceTree = SOURCE_ROOT; }; + 418B0B3724C5E98E00DF2C21 /* iccjpeg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = iccjpeg.h; path = ../../../utils/jpgicc/iccjpeg.h; sourceTree = SOURCE_ROOT; }; + 418B0B3924C5E99600DF2C21 /* jpgicc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = jpgicc.c; sourceTree = ""; }; + 418B0B3E24C5E9F700DF2C21 /* vprf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = vprf.c; path = ../../../utils/common/vprf.c; sourceTree = SOURCE_ROOT; }; + 418B0B3F24C5E9F700DF2C21 /* xgetopt.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = xgetopt.c; path = ../../../utils/common/xgetopt.c; sourceTree = SOURCE_ROOT; }; + 418B0B4024C5E9F700DF2C21 /* utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = utils.h; path = ../../../utils/common/utils.h; sourceTree = SOURCE_ROOT; }; + 418B0B4324C5EC1D00DF2C21 /* testcms2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = testcms2.c; path = ../../../testbed/testcms2.c; sourceTree = SOURCE_ROOT; }; + 418B0B4424C5EC1D00DF2C21 /* testcms2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = testcms2.h; path = ../../../testbed/testcms2.h; sourceTree = SOURCE_ROOT; }; + 418B0B4524C5EC1D00DF2C21 /* testplugin.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = testplugin.c; path = ../../../testbed/testplugin.c; sourceTree = ""; }; + 418B0B4824C5EC2A00DF2C21 /* zoo_icc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zoo_icc.c; path = ../../../testbed/zoo_icc.c; sourceTree = SOURCE_ROOT; }; + 41982FF62EDC65BC00E88CD7 /* threaded_plugin_testbed */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = threaded_plugin_testbed; sourceTree = BUILT_PRODUCTS_DIR; }; + 419830252EDC887300E88CD7 /* fast_float_lab.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = fast_float_lab.c; path = "/Users/marti/Documents/GitHub/Little-CMS/plugins/fast_float/src/fast_float_lab.c"; sourceTree = ""; }; + 419830342EDC8AC800E88CD7 /* threaded_testbed.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = threaded_testbed.c; path = "/Users/marti/Documents/GitHub/Little-CMS/plugins/threaded/testbed/threaded_testbed.c"; sourceTree = ""; }; + 4198303A2EDC8B1A00E88CD7 /* libthreaded_plugin.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libthreaded_plugin.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 419830442EDC8DC900E88CD7 /* threaded_core.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = threaded_core.c; path = "/Users/marti/Documents/GitHub/Little-CMS/plugins/threaded/src/threaded_core.c"; sourceTree = ""; }; + 419830452EDC8DC900E88CD7 /* threaded_internal.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = threaded_internal.h; path = "/Users/marti/Documents/GitHub/Little-CMS/plugins/threaded/src/threaded_internal.h"; sourceTree = ""; }; + 419830462EDC8DC900E88CD7 /* threaded_main.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = threaded_main.c; path = "/Users/marti/Documents/GitHub/Little-CMS/plugins/threaded/src/threaded_main.c"; sourceTree = ""; }; + 419830472EDC8DC900E88CD7 /* threaded_scheduler.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = threaded_scheduler.c; path = "/Users/marti/Documents/GitHub/Little-CMS/plugins/threaded/src/threaded_scheduler.c"; sourceTree = ""; }; + 419830482EDC8DC900E88CD7 /* threaded_split.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = threaded_split.c; path = "/Users/marti/Documents/GitHub/Little-CMS/plugins/threaded/src/threaded_split.c"; sourceTree = ""; }; + 419830772EDC8ECC00E88CD7 /* lcms2_threaded.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = lcms2_threaded.h; path = "/Users/marti/Documents/GitHub/Little-CMS/plugins/threaded/include/lcms2_threaded.h"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 418B0A2F24C5E19500DF2C21 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 418B0A7524C5E25200DF2C21 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 418B0A8A24C5E30000DF2C21 /* liblcms2.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 418B0A8D24C5E35200DF2C21 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 418B0AB524C5E42900DF2C21 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 418B0AC224C5E47C00DF2C21 /* liblcms2.a in Frameworks */, + 4123B5042551A1C8005F0287 /* libfast_float_plugin.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 418B0AC824C5E4EA00DF2C21 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 418B0ADA24C5E58A00DF2C21 /* liblcms2.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 418B0ADE24C5E5C300DF2C21 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 418B0AEA24C5E5CF00DF2C21 /* liblcms2.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 418B0B0224C5E76100DF2C21 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 418B0B1524C5E7CF00DF2C21 /* liblcms2.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 418B0B1724C5E85600DF2C21 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 418B0B2124C5E8FA00DF2C21 /* liblcms2.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 418B0B2C24C5E95D00DF2C21 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 418B0B3D24C5E9A200DF2C21 /* liblcms2.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 41982FF32EDC65BC00E88CD7 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 4198300D2EDC66D700E88CD7 /* liblcms2.a in Frameworks */, + 419830412EDC8CF800E88CD7 /* libthreaded_plugin.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 419830382EDC8B1A00E88CD7 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 418B0A2824C5E19500DF2C21 = { + isa = PBXGroup; + children = ( + 419830762EDC8E3400E88CD7 /* threaded_plugin */, + 419830332EDC8A9C00E88CD7 /* threaded_plugin_testbed */, + 418B0AB124C5E39A00DF2C21 /* fast_float_plugin */, + 418B0A7324C5E1FE00DF2C21 /* include */, + 418B0A6C24C5E1CE00DF2C21 /* src */, + 418B0A7924C5E25200DF2C21 /* testbed */, + 418B0AB924C5E42900DF2C21 /* fast_float_testbed */, + 418B0ACC24C5E4EA00DF2C21 /* transicc */, + 418B0AE224C5E5C300DF2C21 /* linkicc */, + 418B0B0624C5E76100DF2C21 /* tificc */, + 418B0B1B24C5E85600DF2C21 /* tifdiff */, + 418B0B3024C5E95D00DF2C21 /* jpegicc */, + 418B0A3224C5E19500DF2C21 /* Products */, + 418B0A8924C5E30000DF2C21 /* Frameworks */, + ); + sourceTree = ""; + }; + 418B0A3224C5E19500DF2C21 /* Products */ = { + isa = PBXGroup; + children = ( + 418B0A3124C5E19500DF2C21 /* liblcms2.a */, + 418B0A7824C5E25200DF2C21 /* testbed */, + 418B0A8F24C5E35200DF2C21 /* libfast_float_plugin.a */, + 418B0AB824C5E42900DF2C21 /* fast_float_testbed */, + 418B0ACB24C5E4EA00DF2C21 /* transicc */, + 418B0AE124C5E5C300DF2C21 /* linkicc */, + 418B0B0524C5E76100DF2C21 /* tificc */, + 418B0B1A24C5E85600DF2C21 /* tifdiff */, + 418B0B2F24C5E95D00DF2C21 /* jpegicc */, + 41982FF62EDC65BC00E88CD7 /* threaded_plugin_testbed */, + 4198303A2EDC8B1A00E88CD7 /* libthreaded_plugin.a */, + ); + name = Products; + sourceTree = ""; + }; + 418B0A6C24C5E1CE00DF2C21 /* src */ = { + isa = PBXGroup; + children = ( + 418B0A7124C5E1F400DF2C21 /* lcms2_internal.h */, + 418B0A4024C5E1C800DF2C21 /* cmsalpha.c */, + 418B0A5024C5E1C900DF2C21 /* cmscam02.c */, + 418B0A3F24C5E1C700DF2C21 /* cmscgats.c */, + 418B0A3B24C5E1C700DF2C21 /* cmscnvrt.c */, + 418B0A4A24C5E1C800DF2C21 /* cmserr.c */, + 418B0A3824C5E1C700DF2C21 /* cmsgamma.c */, + 418B0A3A24C5E1C700DF2C21 /* cmsgmt.c */, + 418B0A4E24C5E1C800DF2C21 /* cmshalf.c */, + 418B0A3924C5E1C700DF2C21 /* cmsintrp.c */, + 418B0A4F24C5E1C900DF2C21 /* cmsio0.c */, + 418B0A4224C5E1C800DF2C21 /* cmsio1.c */, + 418B0A4B24C5E1C800DF2C21 /* cmslut.c */, + 418B0A3C24C5E1C700DF2C21 /* cmsmd5.c */, + 418B0A4624C5E1C800DF2C21 /* cmsmtrx.c */, + 418B0A4924C5E1C800DF2C21 /* cmsnamed.c */, + 418B0A3E24C5E1C700DF2C21 /* cmsopt.c */, + 418B0A4324C5E1C800DF2C21 /* cmspack.c */, + 418B0A4724C5E1C800DF2C21 /* cmspcs.c */, + 418B0A4D24C5E1C800DF2C21 /* cmsplugin.c */, + 418B0A4824C5E1C800DF2C21 /* cmsps2.c */, + 418B0A5124C5E1C900DF2C21 /* cmssamp.c */, + 418B0A3D24C5E1C700DF2C21 /* cmssm.c */, + 418B0A4124C5E1C800DF2C21 /* cmstypes.c */, + 418B0A4C24C5E1C800DF2C21 /* cmsvirt.c */, + 418B0A4524C5E1C800DF2C21 /* cmswtpnt.c */, + 418B0A4424C5E1C800DF2C21 /* cmsxform.c */, + ); + name = src; + sourceTree = ""; + }; + 418B0A7324C5E1FE00DF2C21 /* include */ = { + isa = PBXGroup; + children = ( + 418B0A6E24C5E1E800DF2C21 /* lcms2_plugin.h */, + 418B0A6D24C5E1E800DF2C21 /* lcms2.h */, + ); + name = include; + sourceTree = ""; + }; + 418B0A7924C5E25200DF2C21 /* testbed */ = { + isa = PBXGroup; + children = ( + 418B0B4824C5EC2A00DF2C21 /* zoo_icc.c */, + 418B0B4324C5EC1D00DF2C21 /* testcms2.c */, + 418B0B4424C5EC1D00DF2C21 /* testcms2.h */, + 418B0B4524C5EC1D00DF2C21 /* testplugin.c */, + ); + name = testbed; + sourceTree = SOURCE_ROOT; + }; + 418B0A8924C5E30000DF2C21 /* Frameworks */ = { + isa = PBXGroup; + children = ( + ); + name = Frameworks; + sourceTree = ""; + }; + 418B0AB124C5E39A00DF2C21 /* fast_float_plugin */ = { + isa = PBXGroup; + children = ( + 419830252EDC887300E88CD7 /* fast_float_lab.c */, + 418B0AAF24C5E38C00DF2C21 /* lcms2_fast_float.h */, + 418B0A9F24C5E37700DF2C21 /* fast_8_curves.c */, + 418B0A9B24C5E37700DF2C21 /* fast_8_matsh_sse.c */, + 418B0A9924C5E37700DF2C21 /* fast_8_matsh.c */, + 418B0A9C24C5E37700DF2C21 /* fast_8_tethra.c */, + 418B0A9724C5E37700DF2C21 /* fast_16_tethra.c */, + 418B0A9E24C5E37700DF2C21 /* fast_float_15bits.c */, + 418B0A9424C5E37600DF2C21 /* fast_float_15mats.c */, + 418B0A9624C5E37700DF2C21 /* fast_float_cmyk.c */, + 418B0A9324C5E37600DF2C21 /* fast_float_curves.c */, + 418B0A9824C5E37700DF2C21 /* fast_float_internal.h */, + 418B0AA024C5E37800DF2C21 /* fast_float_matsh.c */, + 418B0A9A24C5E37700DF2C21 /* fast_float_separate.c */, + 418B0A9D24C5E37700DF2C21 /* fast_float_sup.c */, + 418B0A9524C5E37600DF2C21 /* fast_float_tethra.c */, + ); + name = fast_float_plugin; + sourceTree = ""; + }; + 418B0AB924C5E42900DF2C21 /* fast_float_testbed */ = { + isa = PBXGroup; + children = ( + 418B0AF124C5E6B000DF2C21 /* fast_float_testbed.c */, + ); + name = fast_float_testbed; + path = ../../../plugins/fast_float/testbed; + sourceTree = ""; + }; + 418B0ACC24C5E4EA00DF2C21 /* transicc */ = { + isa = PBXGroup; + children = ( + 418B0AF824C5E6D200DF2C21 /* transicc.c */, + 418B0AF524C5E6C800DF2C21 /* utils.h */, + 418B0AF424C5E6C700DF2C21 /* vprf.c */, + 418B0AF324C5E6C700DF2C21 /* xgetopt.c */, + ); + name = transicc; + sourceTree = SOURCE_ROOT; + }; + 418B0AE224C5E5C300DF2C21 /* linkicc */ = { + isa = PBXGroup; + children = ( + 4123B46825518DB1005F0287 /* linkicc.c */, + 418B0AFC24C5E73100DF2C21 /* utils.h */, + 418B0AFE24C5E73100DF2C21 /* vprf.c */, + 418B0AFD24C5E73100DF2C21 /* xgetopt.c */, + ); + name = linkicc; + path = ../../../utils/linkicc; + sourceTree = SOURCE_ROOT; + }; + 418B0B0624C5E76100DF2C21 /* tificc */ = { + isa = PBXGroup; + children = ( + 4123B4B72551903B005F0287 /* tificc.c */, + 4123B4A325518FFB005F0287 /* xgetopt.c */, + 418B0B1224C5E7BB00DF2C21 /* vprf.c */, + 418B0B0E24C5E79200DF2C21 /* utils.h */, + ); + name = tificc; + path = ../../../utils/tificc; + sourceTree = SOURCE_ROOT; + }; + 418B0B1B24C5E85600DF2C21 /* tifdiff */ = { + isa = PBXGroup; + children = ( + 4123B4C2255190FE005F0287 /* tifdiff.c */, + 418B0B2724C5E92B00DF2C21 /* vprf.c */, + 418B0B2824C5E92B00DF2C21 /* xgetopt.c */, + 418B0B2424C5E92100DF2C21 /* tifdiff.c */, + ); + name = tifdiff; + path = ../../../utils/tificc; + sourceTree = SOURCE_ROOT; + }; + 418B0B3024C5E95D00DF2C21 /* jpegicc */ = { + isa = PBXGroup; + children = ( + 418B0B4024C5E9F700DF2C21 /* utils.h */, + 418B0B3E24C5E9F700DF2C21 /* vprf.c */, + 418B0B3F24C5E9F700DF2C21 /* xgetopt.c */, + 418B0B3924C5E99600DF2C21 /* jpgicc.c */, + 418B0B3624C5E98E00DF2C21 /* iccjpeg.c */, + 418B0B3724C5E98E00DF2C21 /* iccjpeg.h */, + ); + name = jpegicc; + path = ../../../utils/jpgicc; + sourceTree = ""; + }; + 419830332EDC8A9C00E88CD7 /* threaded_plugin_testbed */ = { + isa = PBXGroup; + children = ( + 419830342EDC8AC800E88CD7 /* threaded_testbed.c */, + ); + path = threaded_plugin_testbed; + sourceTree = ""; + }; + 419830762EDC8E3400E88CD7 /* threaded_plugin */ = { + isa = PBXGroup; + children = ( + 419830772EDC8ECC00E88CD7 /* lcms2_threaded.h */, + 419830442EDC8DC900E88CD7 /* threaded_core.c */, + 419830452EDC8DC900E88CD7 /* threaded_internal.h */, + 419830462EDC8DC900E88CD7 /* threaded_main.c */, + 419830472EDC8DC900E88CD7 /* threaded_scheduler.c */, + 419830482EDC8DC900E88CD7 /* threaded_split.c */, + ); + path = threaded_plugin; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 418B0A2D24C5E19500DF2C21 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 418B0A6F24C5E1E800DF2C21 /* lcms2.h in Headers */, + 418B0A7024C5E1E800DF2C21 /* lcms2_plugin.h in Headers */, + 418B0A7224C5E1F400DF2C21 /* lcms2_internal.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 418B0A8B24C5E35200DF2C21 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 418B0AB024C5E38C00DF2C21 /* lcms2_fast_float.h in Headers */, + 418B0AA624C5E37800DF2C21 /* fast_float_internal.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 419830362EDC8B1A00E88CD7 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 4198304D2EDC8DC900E88CD7 /* threaded_internal.h in Headers */, + 419830782EDC8ECC00E88CD7 /* lcms2_threaded.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 418B0A3024C5E19500DF2C21 /* lcms2 */ = { + isa = PBXNativeTarget; + buildConfigurationList = 418B0A3524C5E19500DF2C21 /* Build configuration list for PBXNativeTarget "lcms2" */; + buildPhases = ( + 418B0A2D24C5E19500DF2C21 /* Headers */, + 418B0A2E24C5E19500DF2C21 /* Sources */, + 418B0A2F24C5E19500DF2C21 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = lcms2; + productName = lcms2; + productReference = 418B0A3124C5E19500DF2C21 /* liblcms2.a */; + productType = "com.apple.product-type.library.static"; + }; + 418B0A7724C5E25200DF2C21 /* testbed */ = { + isa = PBXNativeTarget; + buildConfigurationList = 418B0A7C24C5E25200DF2C21 /* Build configuration list for PBXNativeTarget "testbed" */; + buildPhases = ( + 418B0A7424C5E25200DF2C21 /* Sources */, + 418B0A7524C5E25200DF2C21 /* Frameworks */, + 418B0A7624C5E25200DF2C21 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + 418B0A8624C5E29800DF2C21 /* PBXTargetDependency */, + ); + name = testbed; + productName = testbed; + productReference = 418B0A7824C5E25200DF2C21 /* testbed */; + productType = "com.apple.product-type.tool"; + }; + 418B0A8E24C5E35200DF2C21 /* fast_float_plugin */ = { + isa = PBXNativeTarget; + buildConfigurationList = 418B0A9024C5E35200DF2C21 /* Build configuration list for PBXNativeTarget "fast_float_plugin" */; + buildPhases = ( + 418B0A8B24C5E35200DF2C21 /* Headers */, + 418B0A8C24C5E35200DF2C21 /* Sources */, + 418B0A8D24C5E35200DF2C21 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 418B0AB324C5E3D400DF2C21 /* PBXTargetDependency */, + ); + name = fast_float_plugin; + productName = fast_float_plugin; + productReference = 418B0A8F24C5E35200DF2C21 /* libfast_float_plugin.a */; + productType = "com.apple.product-type.library.static"; + }; + 418B0AB724C5E42900DF2C21 /* fast_float_testbed */ = { + isa = PBXNativeTarget; + buildConfigurationList = 418B0ABC24C5E42900DF2C21 /* Build configuration list for PBXNativeTarget "fast_float_testbed" */; + buildPhases = ( + 418B0AB424C5E42900DF2C21 /* Sources */, + 418B0AB524C5E42900DF2C21 /* Frameworks */, + 418B0AB624C5E42900DF2C21 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + 418B0AC624C5E48600DF2C21 /* PBXTargetDependency */, + 418B0AC424C5E48100DF2C21 /* PBXTargetDependency */, + ); + name = fast_float_testbed; + productName = fast_float_testbed; + productReference = 418B0AB824C5E42900DF2C21 /* fast_float_testbed */; + productType = "com.apple.product-type.tool"; + }; + 418B0ACA24C5E4EA00DF2C21 /* transicc */ = { + isa = PBXNativeTarget; + buildConfigurationList = 418B0ACF24C5E4EA00DF2C21 /* Build configuration list for PBXNativeTarget "transicc" */; + buildPhases = ( + 418B0AC724C5E4EA00DF2C21 /* Sources */, + 418B0AC824C5E4EA00DF2C21 /* Frameworks */, + 418B0AC924C5E4EA00DF2C21 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + 418B0ADC24C5E58F00DF2C21 /* PBXTargetDependency */, + ); + name = transicc; + productName = transicc; + productReference = 418B0ACB24C5E4EA00DF2C21 /* transicc */; + productType = "com.apple.product-type.tool"; + }; + 418B0AE024C5E5C300DF2C21 /* linkicc */ = { + isa = PBXNativeTarget; + buildConfigurationList = 418B0AE524C5E5C300DF2C21 /* Build configuration list for PBXNativeTarget "linkicc" */; + buildPhases = ( + 418B0ADD24C5E5C300DF2C21 /* Sources */, + 418B0ADE24C5E5C300DF2C21 /* Frameworks */, + 418B0ADF24C5E5C300DF2C21 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + 418B0AE924C5E5CA00DF2C21 /* PBXTargetDependency */, + ); + name = linkicc; + productName = linkicc; + productReference = 418B0AE124C5E5C300DF2C21 /* linkicc */; + productType = "com.apple.product-type.tool"; + }; + 418B0B0424C5E76100DF2C21 /* tificc */ = { + isa = PBXNativeTarget; + buildConfigurationList = 418B0B0924C5E76100DF2C21 /* Build configuration list for PBXNativeTarget "tificc" */; + buildPhases = ( + 418B0B0124C5E76100DF2C21 /* Sources */, + 418B0B0224C5E76100DF2C21 /* Frameworks */, + 418B0B0324C5E76100DF2C21 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + 418B0B0D24C5E77500DF2C21 /* PBXTargetDependency */, + ); + name = tificc; + productName = tificc; + productReference = 418B0B0524C5E76100DF2C21 /* tificc */; + productType = "com.apple.product-type.tool"; + }; + 418B0B1924C5E85600DF2C21 /* tifdiff */ = { + isa = PBXNativeTarget; + buildConfigurationList = 418B0B1E24C5E85600DF2C21 /* Build configuration list for PBXNativeTarget "tifdiff" */; + buildPhases = ( + 418B0B1624C5E85600DF2C21 /* Sources */, + 418B0B1724C5E85600DF2C21 /* Frameworks */, + 418B0B1824C5E85600DF2C21 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + 418B0B2324C5E8FA00DF2C21 /* PBXTargetDependency */, + ); + name = tifdiff; + productName = tifdiff; + productReference = 418B0B1A24C5E85600DF2C21 /* tifdiff */; + productType = "com.apple.product-type.tool"; + }; + 418B0B2E24C5E95D00DF2C21 /* jpegicc */ = { + isa = PBXNativeTarget; + buildConfigurationList = 418B0B3324C5E95D00DF2C21 /* Build configuration list for PBXNativeTarget "jpegicc" */; + buildPhases = ( + 418B0B2B24C5E95D00DF2C21 /* Sources */, + 418B0B2C24C5E95D00DF2C21 /* Frameworks */, + 418B0B2D24C5E95D00DF2C21 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + 418B0B3C24C5E99E00DF2C21 /* PBXTargetDependency */, + ); + name = jpegicc; + productName = jpegicc; + productReference = 418B0B2F24C5E95D00DF2C21 /* jpegicc */; + productType = "com.apple.product-type.tool"; + }; + 41982FF52EDC65BC00E88CD7 /* threaded_plugin_testbed */ = { + isa = PBXNativeTarget; + buildConfigurationList = 41982FFA2EDC65BC00E88CD7 /* Build configuration list for PBXNativeTarget "threaded_plugin_testbed" */; + buildPhases = ( + 41982FF22EDC65BC00E88CD7 /* Sources */, + 41982FF32EDC65BC00E88CD7 /* Frameworks */, + 41982FF42EDC65BC00E88CD7 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + 4198300F2EDC66D700E88CD7 /* PBXTargetDependency */, + 419830432EDC8CF800E88CD7 /* PBXTargetDependency */, + ); + name = threaded_plugin_testbed; + packageProductDependencies = ( + ); + productName = threaded_plugin_testbed; + productReference = 41982FF62EDC65BC00E88CD7 /* threaded_plugin_testbed */; + productType = "com.apple.product-type.tool"; + }; + 419830392EDC8B1A00E88CD7 /* threaded_plugin */ = { + isa = PBXNativeTarget; + buildConfigurationList = 4198303B2EDC8B1A00E88CD7 /* Build configuration list for PBXNativeTarget "threaded_plugin" */; + buildPhases = ( + 419830362EDC8B1A00E88CD7 /* Headers */, + 419830372EDC8B1A00E88CD7 /* Sources */, + 419830382EDC8B1A00E88CD7 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = threaded_plugin; + packageProductDependencies = ( + ); + productName = threaded_plugin; + productReference = 4198303A2EDC8B1A00E88CD7 /* libthreaded_plugin.a */; + productType = "com.apple.product-type.library.static"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 418B0A2924C5E19500DF2C21 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = YES; + LastUpgradeCheck = 1430; + ORGANIZATIONNAME = littlecms; + TargetAttributes = { + 418B0A3024C5E19500DF2C21 = { + CreatedOnToolsVersion = 11.6; + }; + 418B0A7724C5E25200DF2C21 = { + CreatedOnToolsVersion = 11.6; + }; + 418B0A8E24C5E35200DF2C21 = { + CreatedOnToolsVersion = 11.6; + }; + 418B0AB724C5E42900DF2C21 = { + CreatedOnToolsVersion = 11.6; + }; + 418B0ACA24C5E4EA00DF2C21 = { + CreatedOnToolsVersion = 11.6; + }; + 418B0AE024C5E5C300DF2C21 = { + CreatedOnToolsVersion = 11.6; + }; + 418B0B0424C5E76100DF2C21 = { + CreatedOnToolsVersion = 11.6; + }; + 418B0B1924C5E85600DF2C21 = { + CreatedOnToolsVersion = 11.6; + }; + 418B0B2E24C5E95D00DF2C21 = { + CreatedOnToolsVersion = 11.6; + }; + 41982FF52EDC65BC00E88CD7 = { + CreatedOnToolsVersion = 26.1.1; + }; + 419830392EDC8B1A00E88CD7 = { + CreatedOnToolsVersion = 26.1.1; + }; + }; + }; + buildConfigurationList = 418B0A2C24C5E19500DF2C21 /* Build configuration list for PBXProject "lcms2" */; + compatibilityVersion = "Xcode 14.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 418B0A2824C5E19500DF2C21; + productRefGroup = 418B0A3224C5E19500DF2C21 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 418B0A3024C5E19500DF2C21 /* lcms2 */, + 418B0A7724C5E25200DF2C21 /* testbed */, + 418B0A8E24C5E35200DF2C21 /* fast_float_plugin */, + 418B0AB724C5E42900DF2C21 /* fast_float_testbed */, + 418B0ACA24C5E4EA00DF2C21 /* transicc */, + 418B0AE024C5E5C300DF2C21 /* linkicc */, + 418B0B0424C5E76100DF2C21 /* tificc */, + 418B0B1924C5E85600DF2C21 /* tifdiff */, + 418B0B2E24C5E95D00DF2C21 /* jpegicc */, + 41982FF52EDC65BC00E88CD7 /* threaded_plugin_testbed */, + 419830392EDC8B1A00E88CD7 /* threaded_plugin */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + 418B0A2E24C5E19500DF2C21 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 418B0A5224C5E1C900DF2C21 /* cmsgamma.c in Sources */, + 418B0A5324C5E1C900DF2C21 /* cmsintrp.c in Sources */, + 418B0A5424C5E1C900DF2C21 /* cmsgmt.c in Sources */, + 418B0A5524C5E1C900DF2C21 /* cmscnvrt.c in Sources */, + 418B0A5624C5E1C900DF2C21 /* cmsmd5.c in Sources */, + 418B0A5724C5E1C900DF2C21 /* cmssm.c in Sources */, + 418B0A5824C5E1C900DF2C21 /* cmsopt.c in Sources */, + 418B0A5924C5E1C900DF2C21 /* cmscgats.c in Sources */, + 418B0A5A24C5E1C900DF2C21 /* cmsalpha.c in Sources */, + 418B0A5B24C5E1C900DF2C21 /* cmstypes.c in Sources */, + 418B0A5C24C5E1C900DF2C21 /* cmsio1.c in Sources */, + 418B0A5D24C5E1C900DF2C21 /* cmspack.c in Sources */, + 418B0A5E24C5E1C900DF2C21 /* cmsxform.c in Sources */, + 418B0A5F24C5E1C900DF2C21 /* cmswtpnt.c in Sources */, + 418B0A6024C5E1C900DF2C21 /* cmsmtrx.c in Sources */, + 418B0A6124C5E1C900DF2C21 /* cmspcs.c in Sources */, + 418B0A6224C5E1C900DF2C21 /* cmsps2.c in Sources */, + 418B0A6324C5E1C900DF2C21 /* cmsnamed.c in Sources */, + 418B0A6424C5E1C900DF2C21 /* cmserr.c in Sources */, + 418B0A6524C5E1C900DF2C21 /* cmslut.c in Sources */, + 418B0A6624C5E1C900DF2C21 /* cmsvirt.c in Sources */, + 418B0A6724C5E1C900DF2C21 /* cmsplugin.c in Sources */, + 418B0A6824C5E1C900DF2C21 /* cmshalf.c in Sources */, + 418B0A6924C5E1C900DF2C21 /* cmsio0.c in Sources */, + 418B0A6A24C5E1C900DF2C21 /* cmscam02.c in Sources */, + 418B0A6B24C5E1C900DF2C21 /* cmssamp.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 418B0A7424C5E25200DF2C21 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 418B0B4724C5EC1D00DF2C21 /* testplugin.c in Sources */, + 418B0B4924C5EC2A00DF2C21 /* zoo_icc.c in Sources */, + 418B0B4624C5EC1D00DF2C21 /* testcms2.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 418B0A8C24C5E35200DF2C21 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 418B0AA124C5E37800DF2C21 /* fast_float_curves.c in Sources */, + 418B0AA224C5E37800DF2C21 /* fast_float_15mats.c in Sources */, + 419830262EDC887300E88CD7 /* fast_float_lab.c in Sources */, + 418B0AA324C5E37800DF2C21 /* fast_float_tethra.c in Sources */, + 418B0AA424C5E37800DF2C21 /* fast_float_cmyk.c in Sources */, + 418B0AA524C5E37800DF2C21 /* fast_16_tethra.c in Sources */, + 418B0AA724C5E37800DF2C21 /* fast_8_matsh.c in Sources */, + 418B0AA824C5E37800DF2C21 /* fast_float_separate.c in Sources */, + 418B0AA924C5E37800DF2C21 /* fast_8_matsh_sse.c in Sources */, + 418B0AAA24C5E37800DF2C21 /* fast_8_tethra.c in Sources */, + 418B0AAB24C5E37800DF2C21 /* fast_float_sup.c in Sources */, + 418B0AAC24C5E37800DF2C21 /* fast_float_15bits.c in Sources */, + 418B0AAD24C5E37800DF2C21 /* fast_8_curves.c in Sources */, + 418B0AAE24C5E37800DF2C21 /* fast_float_matsh.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 418B0AB424C5E42900DF2C21 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 418B0AF224C5E6B000DF2C21 /* fast_float_testbed.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 418B0AC724C5E4EA00DF2C21 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 418B0AF724C5E6C800DF2C21 /* vprf.c in Sources */, + 418B0AF924C5E6D200DF2C21 /* transicc.c in Sources */, + 418B0AF624C5E6C800DF2C21 /* xgetopt.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 418B0ADD24C5E5C300DF2C21 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 418B0B0024C5E73100DF2C21 /* vprf.c in Sources */, + 418B0AFF24C5E73100DF2C21 /* xgetopt.c in Sources */, + 4123B46925518DB1005F0287 /* linkicc.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 418B0B0124C5E76100DF2C21 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 4123B4A425518FFB005F0287 /* xgetopt.c in Sources */, + 418B0B0F24C5E79200DF2C21 /* utils.h in Sources */, + 418B0B1424C5E7BB00DF2C21 /* vprf.c in Sources */, + 4123B4B82551903B005F0287 /* tificc.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 418B0B1624C5E85600DF2C21 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 418B0B2524C5E92100DF2C21 /* tifdiff.c in Sources */, + 418B0B2924C5E92B00DF2C21 /* vprf.c in Sources */, + 418B0B2A24C5E92B00DF2C21 /* xgetopt.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 418B0B2B24C5E95D00DF2C21 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 418B0B3824C5E98E00DF2C21 /* iccjpeg.c in Sources */, + 418B0B4224C5E9F700DF2C21 /* xgetopt.c in Sources */, + 418B0B4124C5E9F700DF2C21 /* vprf.c in Sources */, + 418B0B3A24C5E99600DF2C21 /* jpgicc.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 41982FF22EDC65BC00E88CD7 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 419830352EDC8AC800E88CD7 /* threaded_testbed.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 419830372EDC8B1A00E88CD7 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 419830492EDC8DC900E88CD7 /* threaded_core.c in Sources */, + 4198304A2EDC8DC900E88CD7 /* threaded_scheduler.c in Sources */, + 4198304B2EDC8DC900E88CD7 /* threaded_main.c in Sources */, + 4198304C2EDC8DC900E88CD7 /* threaded_split.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 418B0A8624C5E29800DF2C21 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 418B0A3024C5E19500DF2C21 /* lcms2 */; + targetProxy = 418B0A8524C5E29800DF2C21 /* PBXContainerItemProxy */; + }; + 418B0AB324C5E3D400DF2C21 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 418B0A3024C5E19500DF2C21 /* lcms2 */; + targetProxy = 418B0AB224C5E3D400DF2C21 /* PBXContainerItemProxy */; + }; + 418B0AC424C5E48100DF2C21 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 418B0A8E24C5E35200DF2C21 /* fast_float_plugin */; + targetProxy = 418B0AC324C5E48100DF2C21 /* PBXContainerItemProxy */; + }; + 418B0AC624C5E48600DF2C21 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 418B0A3024C5E19500DF2C21 /* lcms2 */; + targetProxy = 418B0AC524C5E48600DF2C21 /* PBXContainerItemProxy */; + }; + 418B0ADC24C5E58F00DF2C21 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 418B0A3024C5E19500DF2C21 /* lcms2 */; + targetProxy = 418B0ADB24C5E58F00DF2C21 /* PBXContainerItemProxy */; + }; + 418B0AE924C5E5CA00DF2C21 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 418B0A3024C5E19500DF2C21 /* lcms2 */; + targetProxy = 418B0AE824C5E5CA00DF2C21 /* PBXContainerItemProxy */; + }; + 418B0B0D24C5E77500DF2C21 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 418B0A3024C5E19500DF2C21 /* lcms2 */; + targetProxy = 418B0B0C24C5E77500DF2C21 /* PBXContainerItemProxy */; + }; + 418B0B2324C5E8FA00DF2C21 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 418B0A3024C5E19500DF2C21 /* lcms2 */; + targetProxy = 418B0B2224C5E8FA00DF2C21 /* PBXContainerItemProxy */; + }; + 418B0B3C24C5E99E00DF2C21 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 418B0A3024C5E19500DF2C21 /* lcms2 */; + targetProxy = 418B0B3B24C5E99E00DF2C21 /* PBXContainerItemProxy */; + }; + 4198300F2EDC66D700E88CD7 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 418B0A3024C5E19500DF2C21 /* lcms2 */; + targetProxy = 4198300E2EDC66D700E88CD7 /* PBXContainerItemProxy */; + }; + 419830432EDC8CF800E88CD7 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 419830392EDC8B1A00E88CD7 /* threaded_plugin */; + targetProxy = 419830422EDC8CF800E88CD7 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 418B0A3324C5E19500DF2C21 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = c99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + }; + name = Debug; + }; + 418B0A3424C5E19500DF2C21 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = c99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + }; + name = Release; + }; + 418B0A3624C5E19500DF2C21 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + DEAD_CODE_STRIPPING = YES; + EXECUTABLE_PREFIX = lib; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + }; + name = Debug; + }; + 418B0A3724C5E19500DF2C21 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + DEAD_CODE_STRIPPING = YES; + EXECUTABLE_PREFIX = lib; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + }; + name = Release; + }; + 418B0A7D24C5E25200DF2C21 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + DEAD_CODE_STRIPPING = YES; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 418B0A7E24C5E25200DF2C21 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + DEAD_CODE_STRIPPING = YES; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 418B0A9124C5E35200DF2C21 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + DEAD_CODE_STRIPPING = YES; + EXECUTABLE_PREFIX = lib; + "GCC_PREPROCESSOR_DEFINITIONS[arch=*]" = ( + "DEBUG=1", + "$(inherited)", + ); + "GCC_PREPROCESSOR_DEFINITIONS[arch=arm64]" = ( + "CMS_DONT_USE_SSE2=1", + "$(inherited)", + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + }; + name = Debug; + }; + 418B0A9224C5E35200DF2C21 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + DEAD_CODE_STRIPPING = YES; + EXECUTABLE_PREFIX = lib; + "GCC_PREPROCESSOR_DEFINITIONS[arch=arm64]" = "CMS_DONT_USE_SSE2=1"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + }; + name = Release; + }; + 418B0ABD24C5E42900DF2C21 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + DEAD_CODE_STRIPPING = YES; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 418B0ABE24C5E42900DF2C21 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + DEAD_CODE_STRIPPING = YES; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 418B0AD024C5E4EA00DF2C21 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + DEAD_CODE_STRIPPING = YES; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 418B0AD124C5E4EA00DF2C21 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + DEAD_CODE_STRIPPING = YES; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 418B0AE624C5E5C300DF2C21 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + DEAD_CODE_STRIPPING = YES; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 418B0AE724C5E5C300DF2C21 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + DEAD_CODE_STRIPPING = YES; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 418B0B0A24C5E76100DF2C21 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + DEAD_CODE_STRIPPING = YES; + HEADER_SEARCH_PATHS = /usr/local/include; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + OTHER_LDFLAGS = ( + "-L", + /usr/local/lib, + "-ltiff", + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 418B0B0B24C5E76100DF2C21 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + DEAD_CODE_STRIPPING = YES; + HEADER_SEARCH_PATHS = /usr/local/include; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + OTHER_LDFLAGS = ( + "-L", + /usr/local/lib, + "-ltiff", + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 418B0B1F24C5E85600DF2C21 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + DEAD_CODE_STRIPPING = YES; + HEADER_SEARCH_PATHS = /usr/local/include; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + OTHER_LDFLAGS = ( + "-L", + /usr/local/lib, + "-ltiff", + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 418B0B2024C5E85600DF2C21 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + DEAD_CODE_STRIPPING = YES; + HEADER_SEARCH_PATHS = /usr/local/include; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + OTHER_LDFLAGS = ( + "-L", + /usr/local/lib, + "-ltiff", + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 418B0B3424C5E95D00DF2C21 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + DEAD_CODE_STRIPPING = YES; + HEADER_SEARCH_PATHS = /usr/local/include; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + OTHER_LDFLAGS = ( + "-L", + /usr/local/lib, + "-ljpeg", + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 418B0B3524C5E95D00DF2C21 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + DEAD_CODE_STRIPPING = YES; + HEADER_SEARCH_PATHS = /usr/local/include; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + OTHER_LDFLAGS = ( + "-L", + /usr/local/lib, + "-ljpeg", + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 41982FFB2EDC65BC00E88CD7 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = ""; + ENABLE_HARDENED_RUNTIME = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = c99; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 41982FFC2EDC65BC00E88CD7 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = ""; + ENABLE_HARDENED_RUNTIME = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = c99; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 4198303C2EDC8B1A00E88CD7 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 2B6XNJ4DBN; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + EXECUTABLE_PREFIX = lib; + GCC_C_LANGUAGE_STANDARD = gnu17; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + }; + name = Debug; + }; + 4198303D2EDC8B1A00E88CD7 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 2B6XNJ4DBN; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + EXECUTABLE_PREFIX = lib; + GCC_C_LANGUAGE_STANDARD = gnu17; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 418B0A2C24C5E19500DF2C21 /* Build configuration list for PBXProject "lcms2" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 418B0A3324C5E19500DF2C21 /* Debug */, + 418B0A3424C5E19500DF2C21 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 418B0A3524C5E19500DF2C21 /* Build configuration list for PBXNativeTarget "lcms2" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 418B0A3624C5E19500DF2C21 /* Debug */, + 418B0A3724C5E19500DF2C21 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 418B0A7C24C5E25200DF2C21 /* Build configuration list for PBXNativeTarget "testbed" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 418B0A7D24C5E25200DF2C21 /* Debug */, + 418B0A7E24C5E25200DF2C21 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 418B0A9024C5E35200DF2C21 /* Build configuration list for PBXNativeTarget "fast_float_plugin" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 418B0A9124C5E35200DF2C21 /* Debug */, + 418B0A9224C5E35200DF2C21 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 418B0ABC24C5E42900DF2C21 /* Build configuration list for PBXNativeTarget "fast_float_testbed" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 418B0ABD24C5E42900DF2C21 /* Debug */, + 418B0ABE24C5E42900DF2C21 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 418B0ACF24C5E4EA00DF2C21 /* Build configuration list for PBXNativeTarget "transicc" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 418B0AD024C5E4EA00DF2C21 /* Debug */, + 418B0AD124C5E4EA00DF2C21 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 418B0AE524C5E5C300DF2C21 /* Build configuration list for PBXNativeTarget "linkicc" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 418B0AE624C5E5C300DF2C21 /* Debug */, + 418B0AE724C5E5C300DF2C21 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 418B0B0924C5E76100DF2C21 /* Build configuration list for PBXNativeTarget "tificc" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 418B0B0A24C5E76100DF2C21 /* Debug */, + 418B0B0B24C5E76100DF2C21 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 418B0B1E24C5E85600DF2C21 /* Build configuration list for PBXNativeTarget "tifdiff" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 418B0B1F24C5E85600DF2C21 /* Debug */, + 418B0B2024C5E85600DF2C21 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 418B0B3324C5E95D00DF2C21 /* Build configuration list for PBXNativeTarget "jpegicc" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 418B0B3424C5E95D00DF2C21 /* Debug */, + 418B0B3524C5E95D00DF2C21 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 41982FFA2EDC65BC00E88CD7 /* Build configuration list for PBXNativeTarget "threaded_plugin_testbed" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 41982FFB2EDC65BC00E88CD7 /* Debug */, + 41982FFC2EDC65BC00E88CD7 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 4198303B2EDC8B1A00E88CD7 /* Build configuration list for PBXNativeTarget "threaded_plugin" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4198303C2EDC8B1A00E88CD7 /* Debug */, + 4198303D2EDC8B1A00E88CD7 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 418B0A2924C5E19500DF2C21 /* Project object */; +} diff --git a/local/recipes/libs/lcms2/source/Projects/Xcode_26/lcms2/lcms2.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/local/recipes/libs/lcms2/source/Projects/Xcode_26/lcms2/lcms2.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000000..ebae78459f --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/Xcode_26/lcms2/lcms2.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/local/recipes/libs/lcms2/source/Projects/Xcode_26/lcms2/lcms2.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/local/recipes/libs/lcms2/source/Projects/Xcode_26/lcms2/lcms2.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000000..18d981003d --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/Xcode_26/lcms2/lcms2.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/local/recipes/libs/lcms2/source/Projects/Xcode_26/lcms2/lcms2.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/local/recipes/libs/lcms2/source/Projects/Xcode_26/lcms2/lcms2.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000000..f9b0d7c5ea --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/Xcode_26/lcms2/lcms2.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/local/recipes/libs/lcms2/source/Projects/cppcheck/lcms2.cppcheck b/local/recipes/libs/lcms2/source/Projects/cppcheck/lcms2.cppcheck new file mode 100755 index 0000000000..751884ff45 --- /dev/null +++ b/local/recipes/libs/lcms2/source/Projects/cppcheck/lcms2.cppcheck @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/local/recipes/libs/lcms2/source/README.md b/local/recipes/libs/lcms2/source/README.md new file mode 100644 index 0000000000..8655d0dfa2 --- /dev/null +++ b/local/recipes/libs/lcms2/source/README.md @@ -0,0 +1,18 @@ + +![Little CMS](doc/logo-small.png) + +# About Little CMS +[www.littlecms.com](https://www.littlecms.com) + +Little CMS intends to be an **OPEN SOURCE** small-footprint color management engine, with special focus on accuracy and performance. It uses the International Color Consortium standard (ICC), which is the modern standard when regarding to color management. The ICC specification is widely used and is referred to in many International and other de-facto standards. It was approved as an International Standard, ISO 15076-1, in 2005. + + + +# Conformance +Little CMS is a **FULL IMPLEMENTATION** of ICC specification 4.4, it fully supports all kind of V2 and V4 profiles, including abstract, devicelink and named color profiles. Check the tutorial for a exhaustive list of features. + + +# A bit of story +Since the initial release, back in 1998, Little CMS has grown to become one of the most popular open-source color management libraries, and has been used in a large number of production projects, in areas as printer firmware, monitors, digital cameras, RIPs, publishing, scientific, and many others. You can find Little CMS in most Linux distributions, and it's released under an open source license. + +### Please see the complete documentation in doc folder diff --git a/local/recipes/libs/lcms2/source/SECURITY.md b/local/recipes/libs/lcms2/source/SECURITY.md new file mode 100644 index 0000000000..efd0b9e5e3 --- /dev/null +++ b/local/recipes/libs/lcms2/source/SECURITY.md @@ -0,0 +1,27 @@ +# Security Policy + +## Supported Versions + +Security updates are applied only to the latest release. + +## Reporting a Vulnerability + +LittleCMS is located deep in the Linux dependency tree. So, security issues are real and should be addressed. The proposed process is quite simple, if you detect a potential security issue and you are able to create a patch, please send us the patch to analyse. We have an extensive test bed of apps and utilities using lcms, so we can check if all those goes fine. If you don’t want to create a patch and only want to report the vulnerability, that's ok too. And we will be very grateful. Just contact us. + +**Please avoid public advisories if possible, as doing that, hints how to use the flaw for malicious use**. + +Please don’t make noise to gain popularity, this can result in bad karma to you. Any CVE without reliable proof will be promptly disputed. + +Please don’t use untrusted patches from 3rd parties. We had an incident years ago with so called “security experts” trying to add a back door by using a crafted patch. + +Credits to vulnerability busters will be given on each release + +After the patch proves to be harmless, I will send to the mailing list a signed mail with the patch attached. +That is, you got a patch from upstream that upstream claims to be reasonably tested. I will apply the same checks that I do before a normal release. +Please understand that this is a lot of work, and obviously it can fail as well, so the “no guarantee” clause of MIT license applies. If you choose to +redistribute such patches, please make sure to include the mail, or at least the MIT license. By including the MIT license you prevent to get in legal trouble. + +## Using GitHub security advisory + +Please disclose it at our [security advisory](https://github.com/mm2/Little-CMS/security/advisories/new). + diff --git a/local/recipes/libs/lcms2/source/aclocal.m4 b/local/recipes/libs/lcms2/source/aclocal.m4 new file mode 100644 index 0000000000..1d2225ea07 --- /dev/null +++ b/local/recipes/libs/lcms2/source/aclocal.m4 @@ -0,0 +1,1364 @@ +# generated automatically by aclocal 1.18.1 -*- Autoconf -*- + +# Copyright (C) 1996-2025 Free Software Foundation, Inc. + +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.72],, +[m4_warning([this file was generated for autoconf 2.72. +You have another version of autoconf. It may work, but is not guaranteed to. +If you have problems, you may need to regenerate the build system entirely. +To do so, use the procedure documented by the package, typically 'autoreconf'.])]) + +# Copyright (C) 2002-2025 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_AUTOMAKE_VERSION(VERSION) +# ---------------------------- +# Automake X.Y traces this macro to ensure aclocal.m4 has been +# generated from the m4 files accompanying Automake X.Y. +# (This private macro should not be called outside this file.) +AC_DEFUN([AM_AUTOMAKE_VERSION], +[am__api_version='1.18' +dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to +dnl require some minimum version. Point them to the right macro. +m4_if([$1], [1.18.1], [], + [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl +]) + +# _AM_AUTOCONF_VERSION(VERSION) +# ----------------------------- +# aclocal traces this macro to find the Autoconf version. +# This is a private macro too. Using m4_define simplifies +# the logic in aclocal, which can simply ignore this definition. +m4_define([_AM_AUTOCONF_VERSION], []) + +# AM_SET_CURRENT_AUTOMAKE_VERSION +# ------------------------------- +# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. +# This function is AC_REQUIREd by AM_INIT_AUTOMAKE. +AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], +[AM_AUTOMAKE_VERSION([1.18.1])dnl +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) + +# AM_AUX_DIR_EXPAND -*- Autoconf -*- + +# Copyright (C) 2001-2025 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets +# $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to +# '$srcdir', '$srcdir/..', or '$srcdir/../..'. +# +# Of course, Automake must honor this variable whenever it calls a +# tool from the auxiliary directory. The problem is that $srcdir (and +# therefore $ac_aux_dir as well) can be either absolute or relative, +# depending on how configure is run. This is pretty annoying, since +# it makes $ac_aux_dir quite unusable in subdirectories: in the top +# source directory, any form will work fine, but in subdirectories a +# relative path needs to be adjusted first. +# +# $ac_aux_dir/missing +# fails when called from a subdirectory if $ac_aux_dir is relative +# $top_srcdir/$ac_aux_dir/missing +# fails if $ac_aux_dir is absolute, +# fails when called from a subdirectory in a VPATH build with +# a relative $ac_aux_dir +# +# The reason of the latter failure is that $top_srcdir and $ac_aux_dir +# are both prefixed by $srcdir. In an in-source build this is usually +# harmless because $srcdir is '.', but things will broke when you +# start a VPATH build or use an absolute $srcdir. +# +# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, +# iff we strip the leading $srcdir from $ac_aux_dir. That would be: +# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` +# and then we would define $MISSING as +# MISSING="\${SHELL} $am_aux_dir/missing" +# This will work as long as MISSING is not called from configure, because +# unfortunately $(top_srcdir) has no meaning in configure. +# However there are other variables, like CC, which are often used in +# configure, and could therefore not use this "fixed" $ac_aux_dir. +# +# Another solution, used here, is to always expand $ac_aux_dir to an +# absolute PATH. The drawback is that using absolute paths prevent a +# configured tree to be moved without reconfiguration. + +AC_DEFUN([AM_AUX_DIR_EXPAND], +[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` +]) + +# AM_CONDITIONAL -*- Autoconf -*- + +# Copyright (C) 1997-2025 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_CONDITIONAL(NAME, SHELL-CONDITION) +# ------------------------------------- +# Define a conditional. +AC_DEFUN([AM_CONDITIONAL], +[AC_PREREQ([2.52])dnl + m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +AC_SUBST([$1_TRUE])dnl +AC_SUBST([$1_FALSE])dnl +_AM_SUBST_NOTMAKE([$1_TRUE])dnl +_AM_SUBST_NOTMAKE([$1_FALSE])dnl +m4_define([_AM_COND_VALUE_$1], [$2])dnl +if $2; then + $1_TRUE= + $1_FALSE='#' +else + $1_TRUE='#' + $1_FALSE= +fi +AC_CONFIG_COMMANDS_PRE( +[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then + AC_MSG_ERROR([[conditional "$1" was never defined. +Usually this means the macro was only invoked conditionally.]]) +fi])]) + +# Copyright (C) 1999-2025 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + + +# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be +# written in clear, in which case automake, when reading aclocal.m4, +# will think it sees a *use*, and therefore will trigger all it's +# C support machinery. Also note that it means that autoscan, seeing +# CC etc. in the Makefile, will ask for an AC_PROG_CC use... + + +# _AM_DEPENDENCIES(NAME) +# ---------------------- +# See how the compiler implements dependency checking. +# NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". +# We try a few techniques and use that to set a single cache variable. +# +# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was +# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular +# dependency, and given that the user is not expected to run this macro, +# just rely on AC_PROG_CC. +AC_DEFUN([_AM_DEPENDENCIES], +[AC_REQUIRE([AM_SET_DEPDIR])dnl +AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl +AC_REQUIRE([AM_MAKE_INCLUDE])dnl +AC_REQUIRE([AM_DEP_TRACK])dnl + +m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], + [$1], [CXX], [depcc="$CXX" am_compiler_list=], + [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], + [$1], [UPC], [depcc="$UPC" am_compiler_list=], + [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) + +AC_CACHE_CHECK([dependency style of $depcc], + [am_cv_$1_dependencies_compiler_type], +[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_$1_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` + fi + am__universal=false + m4_case([$1], [CC], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac], + [CXX], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac]) + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thus: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_$1_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_$1_dependencies_compiler_type=none +fi +]) +AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) +AM_CONDITIONAL([am__fastdep$1], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) +]) + + +# AM_SET_DEPDIR +# ------------- +# Choose a directory name for dependency files. +# This macro is AC_REQUIREd in _AM_DEPENDENCIES. +AC_DEFUN([AM_SET_DEPDIR], +[AC_REQUIRE([AM_SET_LEADING_DOT])dnl +AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl +]) + + +# AM_DEP_TRACK +# ------------ +AC_DEFUN([AM_DEP_TRACK], +[AC_ARG_ENABLE([dependency-tracking], [dnl +AS_HELP_STRING( + [--enable-dependency-tracking], + [do not reject slow dependency extractors]) +AS_HELP_STRING( + [--disable-dependency-tracking], + [speeds up one-time build])]) +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi +AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +AC_SUBST([AMDEPBACKSLASH])dnl +_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl +AC_SUBST([am__nodep])dnl +_AM_SUBST_NOTMAKE([am__nodep])dnl +]) + +# Generate code to set up dependency tracking. -*- Autoconf -*- + +# Copyright (C) 1999-2025 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_OUTPUT_DEPENDENCY_COMMANDS +# ------------------------------ +AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], +[{ + # Older Autoconf quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + # TODO: see whether this extra hack can be removed once we start + # requiring Autoconf 2.70 or later. + AS_CASE([$CONFIG_FILES], + [*\'*], [eval set x "$CONFIG_FILES"], + [*], [set x $CONFIG_FILES]) + shift + # Used to flag and report bootstrapping failures. + am_rc=0 + for am_mf + do + # Strip MF so we end up with the name of the file. + am_mf=`AS_ECHO(["$am_mf"]) | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile which includes + # dependency-tracking related rules and includes. + # Grep'ing the whole file directly is not great: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \ + || continue + am_dirpart=`AS_DIRNAME(["$am_mf"])` + am_filepart=`AS_BASENAME(["$am_mf"])` + AM_RUN_LOG([cd "$am_dirpart" \ + && sed -e '/# am--include-marker/d' "$am_filepart" \ + | $MAKE -f - am--depfiles]) || am_rc=$? + done + if test $am_rc -ne 0; then + AC_MSG_FAILURE([Something went wrong bootstrapping makefile fragments + for automatic dependency tracking. If GNU make was not used, consider + re-running the configure script with MAKE="gmake" (or whatever is + necessary). You can also try re-running configure with the + '--disable-dependency-tracking' option to at least be able to build + the package (albeit without support for automatic dependency tracking).]) + fi + AS_UNSET([am_dirpart]) + AS_UNSET([am_filepart]) + AS_UNSET([am_mf]) + AS_UNSET([am_rc]) + rm -f conftest-deps.mk +} +])# _AM_OUTPUT_DEPENDENCY_COMMANDS + + +# AM_OUTPUT_DEPENDENCY_COMMANDS +# ----------------------------- +# This macro should only be invoked once -- use via AC_REQUIRE. +# +# This code is only required when automatic dependency tracking is enabled. +# This creates each '.Po' and '.Plo' makefile fragment that we'll need in +# order to bootstrap the dependency handling code. +AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], +[AC_CONFIG_COMMANDS([depfiles], + [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], + [AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}"])]) + +# Do all the work for Automake. -*- Autoconf -*- + +# Copyright (C) 1996-2025 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This macro actually does too much. Some checks are only needed if +# your package does certain things. But this isn't really a big deal. + +dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. +m4_define([AC_PROG_CC], +m4_defn([AC_PROG_CC]) +[_AM_PROG_CC_C_O +]) + +# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) +# AM_INIT_AUTOMAKE([OPTIONS]) +# ----------------------------------------------- +# The call with PACKAGE and VERSION arguments is the old style +# call (pre autoconf-2.50), which is being phased out. PACKAGE +# and VERSION should now be passed to AC_INIT and removed from +# the call to AM_INIT_AUTOMAKE. +# We support both call styles for the transition. After +# the next Automake release, Autoconf can make the AC_INIT +# arguments mandatory, and then we can depend on a new Autoconf +# release and drop the old call support. +AC_DEFUN([AM_INIT_AUTOMAKE], +[AC_PREREQ([2.65])dnl +m4_ifdef([_$0_ALREADY_INIT], + [m4_fatal([$0 expanded multiple times +]m4_defn([_$0_ALREADY_INIT]))], + [m4_define([_$0_ALREADY_INIT], m4_expansion_stack)])dnl +dnl Autoconf wants to disallow AM_ names. We explicitly allow +dnl the ones we care about. +m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl +AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl +AC_REQUIRE([AC_PROG_INSTALL])dnl +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi +AC_SUBST([CYGPATH_W]) + +# Define the identity of the package. +dnl Distinguish between old-style and new-style calls. +m4_ifval([$2], +[AC_DIAGNOSE([obsolete], + [$0: two- and three-arguments forms are deprecated.]) +m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl + AC_SUBST([PACKAGE], [$1])dnl + AC_SUBST([VERSION], [$2])], +[_AM_SET_OPTIONS([$1])dnl +dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. +m4_if( + m4_ifset([AC_PACKAGE_NAME], [ok]):m4_ifset([AC_PACKAGE_VERSION], [ok]), + [ok:ok],, + [m4_fatal([AC_INIT should be called with package and version arguments])])dnl + AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl + AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl + +_AM_IF_OPTION([no-define],, +[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) + AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl + +# Some tools Automake needs. +AC_REQUIRE([AM_SANITY_CHECK])dnl +AC_REQUIRE([AC_ARG_PROGRAM])dnl +AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) +AM_MISSING_PROG([AUTOCONF], [autoconf]) +AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) +AM_MISSING_PROG([AUTOHEADER], [autoheader]) +AM_MISSING_PROG([MAKEINFO], [makeinfo]) +AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl +AC_REQUIRE([AC_PROG_MKDIR_P])dnl +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# +# +AC_SUBST([mkdir_p], ['$(MKDIR_P)']) +# We need awk for the "check" target (and possibly the TAP driver). The +# system "awk" is bad on some platforms. +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([AC_PROG_MAKE_SET])dnl +AC_REQUIRE([AM_SET_LEADING_DOT])dnl +_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], + [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], + [_AM_IF_OPTION([tar-v7], [_AM_PROG_TAR([v7])], + [_AM_PROG_TAR([ustar])])])]) +_AM_IF_OPTION([no-dependencies],, +[AC_PROVIDE_IFELSE([AC_PROG_CC], + [_AM_DEPENDENCIES([CC])], + [m4_define([AC_PROG_CC], + m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_CXX], + [_AM_DEPENDENCIES([CXX])], + [m4_define([AC_PROG_CXX], + m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJC], + [_AM_DEPENDENCIES([OBJC])], + [m4_define([AC_PROG_OBJC], + m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], + [_AM_DEPENDENCIES([OBJCXX])], + [m4_define([AC_PROG_OBJCXX], + m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl +]) +# Variables for tags utilities; see am/tags.am +if test -z "$CTAGS"; then + CTAGS=ctags +fi +AC_SUBST([CTAGS]) +if test -z "$ETAGS"; then + ETAGS=etags +fi +AC_SUBST([ETAGS]) +if test -z "$CSCOPE"; then + CSCOPE=cscope +fi +AC_SUBST([CSCOPE]) + +AC_REQUIRE([_AM_SILENT_RULES])dnl +dnl The testsuite driver may need to know about EXEEXT, so add the +dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This +dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. +AC_CONFIG_COMMANDS_PRE(dnl +[m4_provide_if([_AM_COMPILER_EXEEXT], + [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl + +AC_REQUIRE([_AM_PROG_RM_F]) +AC_REQUIRE([_AM_PROG_XARGS_N]) + +dnl The trailing newline in this macro's definition is deliberate, for +dnl backward compatibility and to allow trailing 'dnl'-style comments +dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. +]) + +dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not +dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further +dnl mangled by Autoconf and run in a shell conditional statement. +m4_define([_AC_COMPILER_EXEEXT], +m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) + +# When config.status generates a header, we must update the stamp-h file. +# This file resides in the same directory as the config header +# that is generated. The stamp files are numbered to have different names. + +# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the +# loop where config.status creates the headers, so we can generate +# our stamp files there. +AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], +[# Compute $1's index in $config_headers. +_am_arg=$1 +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) + +# Copyright (C) 2001-2025 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_SH +# ------------------ +# Define $install_sh. +AC_DEFUN([AM_PROG_INSTALL_SH], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +if test x"${install_sh+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi +AC_SUBST([install_sh])]) + +# Copyright (C) 2003-2025 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# Check whether the underlying file-system supports filenames +# with a leading dot. For instance MS-DOS doesn't. +AC_DEFUN([AM_SET_LEADING_DOT], +[rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null +AC_SUBST([am__leading_dot])]) + +# Add --enable-maintainer-mode option to configure. -*- Autoconf -*- +# From Jim Meyering + +# Copyright (C) 1996-2025 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_MAINTAINER_MODE([DEFAULT-MODE]) +# ---------------------------------- +# Control maintainer-specific portions of Makefiles. +# Default is to disable them, unless 'enable' is passed literally. +# For symmetry, 'disable' may be passed as well. Anyway, the user +# can override the default with the --enable/--disable switch. +AC_DEFUN([AM_MAINTAINER_MODE], +[m4_case(m4_default([$1], [disable]), + [enable], [m4_define([am_maintainer_other], [disable])], + [disable], [m4_define([am_maintainer_other], [enable])], + [m4_define([am_maintainer_other], [enable]) + m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])]) +AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) + dnl maintainer-mode's default is 'disable' unless 'enable' is passed + AC_ARG_ENABLE([maintainer-mode], + [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode], + am_maintainer_other[ make rules and dependencies not useful + (and sometimes confusing) to the casual installer])], + [USE_MAINTAINER_MODE=$enableval], + [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) + AC_MSG_RESULT([$USE_MAINTAINER_MODE]) + AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) + MAINT=$MAINTAINER_MODE_TRUE + AC_SUBST([MAINT])dnl +] +) + +# Check to see how 'make' treats includes. -*- Autoconf -*- + +# Copyright (C) 2001-2025 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_MAKE_INCLUDE() +# ----------------- +# Check whether make has an 'include' directive that can support all +# the idioms we need for our automatic dependency tracking code. +AC_DEFUN([AM_MAKE_INCLUDE], +[AC_MSG_CHECKING([whether ${MAKE-make} supports the include directive]) +cat > confinc.mk << 'END' +am__doit: + @echo this is the am__doit target >confinc.out +.PHONY: am__doit +END +am__include="#" +am__quote= +# BSD make does it like this. +echo '.include "confinc.mk" # ignored' > confmf.BSD +# Other make implementations (GNU, Solaris 10, AIX) do it like this. +echo 'include confinc.mk # ignored' > confmf.GNU +_am_result=no +for s in GNU BSD; do + AM_RUN_LOG([${MAKE-make} -f confmf.$s && cat confinc.out]) + AS_CASE([$?:`cat confinc.out 2>/dev/null`], + ['0:this is the am__doit target'], + [AS_CASE([$s], + [BSD], [am__include='.include' am__quote='"'], + [am__include='include' am__quote=''])]) + if test "$am__include" != "#"; then + _am_result="yes ($s style)" + break + fi +done +rm -f confinc.* confmf.* +AC_MSG_RESULT([${_am_result}]) +AC_SUBST([am__include])]) +AC_SUBST([am__quote])]) + +# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- + +# Copyright (C) 1997-2025 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_MISSING_PROG(NAME, PROGRAM) +# ------------------------------ +AC_DEFUN([AM_MISSING_PROG], +[AC_REQUIRE([AM_MISSING_HAS_RUN]) +$1=${$1-"${am_missing_run}$2"} +AC_SUBST($1)]) + +# AM_MISSING_HAS_RUN +# ------------------ +# Define MISSING if not defined so far and test if it is modern enough. +# If it is, set am_missing_run to use it, otherwise, to nothing. +AC_DEFUN([AM_MISSING_HAS_RUN], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([missing])dnl +if test x"${MISSING+set}" != xset; then + MISSING="\${SHELL} '$am_aux_dir/missing'" +fi +# Use eval to expand $SHELL +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " +else + am_missing_run= + AC_MSG_WARN(['missing' script is too old or missing]) +fi +]) + +# Helper functions for option handling. -*- Autoconf -*- + +# Copyright (C) 2001-2025 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_MANGLE_OPTION(NAME) +# ----------------------- +AC_DEFUN([_AM_MANGLE_OPTION], +[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) + +# _AM_SET_OPTION(NAME) +# -------------------- +# Set option NAME. Presently that only means defining a flag for this option. +AC_DEFUN([_AM_SET_OPTION], +[m4_define(_AM_MANGLE_OPTION([$1]), [1])]) + +# _AM_SET_OPTIONS(OPTIONS) +# ------------------------ +# OPTIONS is a space-separated list of Automake options. +AC_DEFUN([_AM_SET_OPTIONS], +[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) + +# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) +# ------------------------------------------- +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +AC_DEFUN([_AM_IF_OPTION], +[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) + +# Copyright (C) 1999-2025 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_PROG_CC_C_O +# --------------- +# Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC +# to automatically call this. +AC_DEFUN([_AM_PROG_CC_C_O], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([compile])dnl +AC_LANG_PUSH([C])dnl +AC_CACHE_CHECK( + [whether $CC understands -c and -o together], + [am_cv_prog_cc_c_o], + [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + # aligned with autoconf, so not including core; see bug#72225. + rm -f -r a.out a.exe b.out conftest.$ac_ext conftest.$ac_objext \ + conftest.dSYM conftest1.$ac_ext conftest1.$ac_objext conftest1.dSYM \ + conftest2.$ac_ext conftest2.$ac_objext conftest2.dSYM + unset am_i]) +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +AC_LANG_POP([C])]) + +# For backward compatibility. +AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) + +# Copyright (C) 2022-2025 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_PROG_RM_F +# --------------- +# Check whether 'rm -f' without any arguments works. +# https://bugs.gnu.org/10828 +AC_DEFUN([_AM_PROG_RM_F], +[am__rm_f_notfound= +AS_IF([(rm -f && rm -fr && rm -rf) 2>/dev/null], [], [am__rm_f_notfound='""']) +AC_SUBST(am__rm_f_notfound) +]) + +# Copyright (C) 2001-2025 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_RUN_LOG(COMMAND) +# ------------------- +# Run COMMAND, save the exit status in ac_status, and log it. +# (This has been adapted from Autoconf's _AC_RUN_LOG macro.) +AC_DEFUN([AM_RUN_LOG], +[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD + ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + (exit $ac_status); }]) + +# Check to make sure that the build environment is sane. -*- Autoconf -*- + +# Copyright (C) 1996-2025 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_SLEEP_FRACTIONAL_SECONDS +# ---------------------------- +AC_DEFUN([_AM_SLEEP_FRACTIONAL_SECONDS], [dnl +AC_CACHE_CHECK([whether sleep supports fractional seconds], + am_cv_sleep_fractional_seconds, [dnl +AS_IF([sleep 0.001 2>/dev/null], [am_cv_sleep_fractional_seconds=yes], + [am_cv_sleep_fractional_seconds=no]) +])]) + +# _AM_FILESYSTEM_TIMESTAMP_RESOLUTION +# ----------------------------------- +# Determine the filesystem's resolution for file modification +# timestamps. The coarsest we know of is FAT, with a resolution +# of only two seconds, even with the most recent "exFAT" extensions. +# The finest (e.g. ext4 with large inodes, XFS, ZFS) is one +# nanosecond, matching clock_gettime. However, it is probably not +# possible to delay execution of a shell script for less than one +# millisecond, due to process creation overhead and scheduling +# granularity, so we don't check for anything finer than that. (See below.) +AC_DEFUN([_AM_FILESYSTEM_TIMESTAMP_RESOLUTION], [dnl +AC_REQUIRE([_AM_SLEEP_FRACTIONAL_SECONDS]) +AC_CACHE_CHECK([filesystem timestamp resolution], + am_cv_filesystem_timestamp_resolution, [dnl +# Default to the worst case. +am_cv_filesystem_timestamp_resolution=2 + +# Only try to go finer than 1 sec if sleep can do it. +# Don't try 1 sec, because if 0.01 sec and 0.1 sec don't work, +# - 1 sec is not much of a win compared to 2 sec, and +# - it takes 2 seconds to perform the test whether 1 sec works. +# +# Instead, just use the default 2s on platforms that have 1s resolution, +# accept the extra 1s delay when using $sleep in the Automake tests, in +# exchange for not incurring the 2s delay for running the test for all +# packages. +# +am_try_resolutions= +if test "$am_cv_sleep_fractional_seconds" = yes; then + # Even a millisecond often causes a bunch of false positives, + # so just try a hundredth of a second. The time saved between .001 and + # .01 is not terribly consequential. + am_try_resolutions="0.01 0.1 $am_try_resolutions" +fi + +# In order to catch current-generation FAT out, we must *modify* files +# that already exist; the *creation* timestamp is finer. Use names +# that make ls -t sort them differently when they have equal +# timestamps than when they have distinct timestamps, keeping +# in mind that ls -t prints the *newest* file first. +rm -f conftest.ts? +: > conftest.ts1 +: > conftest.ts2 +: > conftest.ts3 + +# Make sure ls -t actually works. Do 'set' in a subshell so we don't +# clobber the current shell's arguments. (Outer-level square brackets +# are removed by m4; they're present so that m4 does not expand +# ; be careful, easy to get confused.) +if ( + set X `[ls -t conftest.ts[12]]` && + { + test "$[]*" != "X conftest.ts1 conftest.ts2" || + test "$[]*" != "X conftest.ts2 conftest.ts1"; + } +); then :; else + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + _AS_ECHO_UNQUOTED( + ["Bad output from ls -t: \"`[ls -t conftest.ts[12]]`\""], + [AS_MESSAGE_LOG_FD]) + AC_MSG_FAILURE([ls -t produces unexpected output. +Make sure there is not a broken ls alias in your environment.]) +fi + +for am_try_res in $am_try_resolutions; do + # Any one fine-grained sleep might happen to cross the boundary + # between two values of a coarser actual resolution, but if we do + # two fine-grained sleeps in a row, at least one of them will fall + # entirely within a coarse interval. + echo alpha > conftest.ts1 + sleep $am_try_res + echo beta > conftest.ts2 + sleep $am_try_res + echo gamma > conftest.ts3 + + # We assume that 'ls -t' will make use of high-resolution + # timestamps if the operating system supports them at all. + if (set X `ls -t conftest.ts?` && + test "$[]2" = conftest.ts3 && + test "$[]3" = conftest.ts2 && + test "$[]4" = conftest.ts1); then + # + # Ok, ls -t worked. If we're at a resolution of 1 second, we're done, + # because we don't need to test make. + make_ok=true + if test $am_try_res != 1; then + # But if we've succeeded so far with a subsecond resolution, we + # have one more thing to check: make. It can happen that + # everything else supports the subsecond mtimes, but make doesn't; + # notably on macOS, which ships make 3.81 from 2006 (the last one + # released under GPLv2). https://bugs.gnu.org/68808 + # + # We test $MAKE if it is defined in the environment, else "make". + # It might get overridden later, but our hope is that in practice + # it does not matter: it is the system "make" which is (by far) + # the most likely to be broken, whereas if the user overrides it, + # probably they did so with a better, or at least not worse, make. + # https://lists.gnu.org/archive/html/automake/2024-06/msg00051.html + # + # Create a Makefile (real tab character here): + rm -f conftest.mk + echo 'conftest.ts1: conftest.ts2' >conftest.mk + echo ' touch conftest.ts2' >>conftest.mk + # + # Now, running + # touch conftest.ts1; touch conftest.ts2; make + # should touch ts1 because ts2 is newer. This could happen by luck, + # but most often, it will fail if make's support is insufficient. So + # test for several consecutive successes. + # + # (We reuse conftest.ts[12] because we still want to modify existing + # files, not create new ones, per above.) + n=0 + make=${MAKE-make} + until test $n -eq 3; do + echo one > conftest.ts1 + sleep $am_try_res + echo two > conftest.ts2 # ts2 should now be newer than ts1 + if $make -f conftest.mk | grep 'up to date' >/dev/null; then + make_ok=false + break # out of $n loop + fi + n=`expr $n + 1` + done + fi + # + if $make_ok; then + # Everything we know to check worked out, so call this resolution good. + am_cv_filesystem_timestamp_resolution=$am_try_res + break # out of $am_try_res loop + fi + # Otherwise, we'll go on to check the next resolution. + fi +done +rm -f conftest.ts? +# (end _am_filesystem_timestamp_resolution) +])]) + +# AM_SANITY_CHECK +# --------------- +AC_DEFUN([AM_SANITY_CHECK], +[AC_REQUIRE([_AM_FILESYSTEM_TIMESTAMP_RESOLUTION]) +# This check should not be cached, as it may vary across builds of +# different projects. +AC_MSG_CHECKING([whether build environment is sane]) +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[[\\\"\#\$\&\'\`$am_lf]]*) + AC_MSG_RESULT([no]) + AC_MSG_ERROR([unsafe absolute working directory name]);; +esac +case $srcdir in + *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) + AC_MSG_RESULT([no]) + AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; +esac + +# Do 'set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +am_build_env_is_sane=no +am_has_slept=no +rm -f conftest.file +for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + if ( + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$[]*" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + test "$[]2" = conftest.file + ); then + am_build_env_is_sane=yes + break + fi + # Just in case. + sleep "$am_cv_filesystem_timestamp_resolution" + am_has_slept=yes +done + +AC_MSG_RESULT([$am_build_env_is_sane]) +if test "$am_build_env_is_sane" = no; then + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi + +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +AS_IF([test -e conftest.file || grep 'slept: no' conftest.file >/dev/null 2>&1],, [dnl + ( sleep "$am_cv_filesystem_timestamp_resolution" ) & + am_sleep_pid=$! +]) +AC_CONFIG_COMMANDS_PRE( + [AC_MSG_CHECKING([that generated files are newer than configure]) + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + AC_MSG_RESULT([done])]) +rm -f conftest.file +]) + +# Copyright (C) 2009-2025 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_SILENT_RULES +# ---------------- +# Enable less verbose build rules support. +AC_DEFUN([_AM_SILENT_RULES], +[AM_DEFAULT_VERBOSITY=1 +AC_ARG_ENABLE([silent-rules], [dnl +AS_HELP_STRING( + [--enable-silent-rules], + [less verbose build output (undo: "make V=1")]) +AS_HELP_STRING( + [--disable-silent-rules], + [verbose build output (undo: "make V=0")])dnl +]) +dnl +dnl A few 'make' implementations (e.g., NonStop OS and NextStep) +dnl do not support nested variable expansions. +dnl See automake bug#9928 and bug#10237. +am_make=${MAKE-make} +AC_CACHE_CHECK([whether $am_make supports nested variables], + [am_cv_make_support_nested_variables], + [if AS_ECHO([['TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi]) +AC_SUBST([AM_V])dnl +AM_SUBST_NOTMAKE([AM_V])dnl +AC_SUBST([AM_DEFAULT_V])dnl +AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl +AC_SUBST([AM_DEFAULT_VERBOSITY])dnl +AM_BACKSLASH='\' +AC_SUBST([AM_BACKSLASH])dnl +_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl +dnl Delay evaluation of AM_DEFAULT_VERBOSITY to the end to allow multiple calls +dnl to AM_SILENT_RULES to change the default value. +AC_CONFIG_COMMANDS_PRE([dnl +case $enable_silent_rules in @%:@ ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; +esac +if test $am_cv_make_support_nested_variables = yes; then + dnl Using '$V' instead of '$(V)' breaks IRIX make. + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +])dnl +]) + +# AM_SILENT_RULES([DEFAULT]) +# -------------------------- +# Set the default verbosity level to DEFAULT ("yes" being less verbose, "no" or +# empty being verbose). +AC_DEFUN([AM_SILENT_RULES], +[AC_REQUIRE([_AM_SILENT_RULES]) +AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1])m4_newline +dnl We intentionally force a newline after the assignment, since a) nothing +dnl good can come of more text following, and b) that was the behavior +dnl before 1.17. See https://bugs.gnu.org/72267. +]) + +# Copyright (C) 2001-2025 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_STRIP +# --------------------- +# One issue with vendor 'install' (even GNU) is that you can't +# specify the program used to strip binaries. This is especially +# annoying in cross-compiling environments, where the build's strip +# is unlikely to handle the host's binaries. +# Fortunately install-sh will honor a STRIPPROG variable, so we +# always use install-sh in "make install-strip", and initialize +# STRIPPROG with the value of the STRIP variable (set by the user). +AC_DEFUN([AM_PROG_INSTALL_STRIP], +[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the 'STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. +if test "$cross_compiling" != no; then + AC_CHECK_TOOL([STRIP], [strip], :) +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" +AC_SUBST([INSTALL_STRIP_PROGRAM])]) + +# Copyright (C) 2006-2025 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_SUBST_NOTMAKE(VARIABLE) +# --------------------------- +# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. +# This macro is traced by Automake. +AC_DEFUN([_AM_SUBST_NOTMAKE]) + +# AM_SUBST_NOTMAKE(VARIABLE) +# -------------------------- +# Public sister of _AM_SUBST_NOTMAKE. +AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) + +# Check how to create a tarball. -*- Autoconf -*- + +# Copyright (C) 2004-2025 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_PROG_TAR(FORMAT) +# -------------------- +# Check how to create a tarball in format FORMAT. +# FORMAT should be one of 'v7', 'ustar', or 'pax'. +# +# Substitute a variable $(am__tar) that is a command +# writing to stdout a FORMAT-tarball containing the directory +# $tardir. +# tardir=directory && $(am__tar) > result.tar +# +# Substitute a variable $(am__untar) that extract such +# a tarball read from stdin. +# $(am__untar) < result.tar +# +AC_DEFUN([_AM_PROG_TAR], +[# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AC_SUBST([AMTAR], ['$${TAR-tar}']) + +# We'll loop over all known methods to create a tar archive until one works. +_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' + +m4_if([$1], [v7], + [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], + + [m4_case([$1], + [ustar], + [# The POSIX 1988 'ustar' format is defined with fixed-size fields. + # There is notably a 21 bits limit for the UID and the GID. In fact, + # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 + # and bug#13588). + am_max_uid=2097151 # 2^21 - 1 + am_max_gid=$am_max_uid + # The $UID and $GID variables are not portable, so we need to resort + # to the POSIX-mandated id(1) utility. Errors in the 'id' calls + # below are definitely unexpected, so allow the users to see them + # (that is, avoid stderr redirection). + am_uid=`id -u || echo unknown` + am_gid=`id -g || echo unknown` + AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) + if test x$am_uid = xunknown; then + AC_MSG_WARN([ancient id detected; assuming current UID is ok, but dist-ustar might not work]) + elif test $am_uid -le $am_max_uid; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + _am_tools=none + fi + AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) + if test x$gm_gid = xunknown; then + AC_MSG_WARN([ancient id detected; assuming current GID is ok, but dist-ustar might not work]) + elif test $am_gid -le $am_max_gid; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + _am_tools=none + fi], + + [pax], + [], + + [m4_fatal([Unknown tar format])]) + + AC_MSG_CHECKING([how to create a $1 tar archive]) + + # Go ahead even if we have the value already cached. We do so because we + # need to set the values for the 'am__tar' and 'am__untar' variables. + _am_tools=${am_cv_prog_tar_$1-$_am_tools} + + for _am_tool in $_am_tools; do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; do + AM_RUN_LOG([$_am_tar --version]) && break + done + am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x $1 -w "$$tardir"' + am__tar_='pax -L -x $1 -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H $1 -L' + am__tar_='find "$tardir" -print | cpio -o -H $1 -L' + am__untar='cpio -i -H $1 -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac + + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_$1}" && break + + # tar/untar a dummy directory, and stop if the command works. + rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) + rm -rf conftest.dir + if test -s conftest.tar; then + AM_RUN_LOG([$am__untar /dev/null 2>&1 && break + fi + done + rm -rf conftest.dir + + AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) + AC_MSG_RESULT([$am_cv_prog_tar_$1])]) + +AC_SUBST([am__tar]) +AC_SUBST([am__untar]) +]) # _AM_PROG_TAR + +# Copyright (C) 2022-2025 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_PROG_XARGS_N +# ---------------- +# Check whether 'xargs -n' works. It should work everywhere, so the fallback +# is not optimized at all as we never expect to use it. +AC_DEFUN([_AM_PROG_XARGS_N], +[AC_CACHE_CHECK([xargs -n works], am_cv_xargs_n_works, [dnl +AS_IF([test "`echo 1 2 3 | xargs -n2 echo`" = "1 2 +3"], [am_cv_xargs_n_works=yes], [am_cv_xargs_n_works=no])]) +AS_IF([test "$am_cv_xargs_n_works" = yes], [am__xargs_n='xargs -n'], [dnl + am__xargs_n='am__xargs_n () { shift; sed "s/ /\\n/g" | while read am__xargs_n_arg; do "$@" "$am__xargs_n_arg"; done; }' +])dnl +AC_SUBST(am__xargs_n) +]) + +m4_include([m4/ax_append_compile_flags.m4]) +m4_include([m4/ax_append_flag.m4]) +m4_include([m4/ax_check_compile_flag.m4]) +m4_include([m4/ax_gcc_func_attribute.m4]) +m4_include([m4/ax_pthread.m4]) +m4_include([m4/ax_require_defined.m4]) +m4_include([m4/libtool.m4]) +m4_include([m4/ltoptions.m4]) +m4_include([m4/ltsugar.m4]) +m4_include([m4/ltversion.m4]) +m4_include([m4/lt~obsolete.m4]) diff --git a/local/recipes/libs/lcms2/source/autogen.sh b/local/recipes/libs/lcms2/source/autogen.sh new file mode 100755 index 0000000000..f05ffee763 --- /dev/null +++ b/local/recipes/libs/lcms2/source/autogen.sh @@ -0,0 +1,103 @@ +#!/bin/sh +# Run this to generate all the initial makefiles, etc. + +srcdir=`dirname $0` +test -z "$srcdir" && srcdir=. + +DIE=0 +ACLOCAL_FLAGS="-I m4" + +if [ "$1" = "--distclean" ]; +then + make distclean + rm configure config.guess config.sub depcomp install-sh missing + rm aclocal.m4 compile ltmain.sh m4/libtool.m4 m4/ltoptions.m4 + rm m4/ltsugar.m4 m4/lt~obsolete.m4 m4/ltversion.m4 + echo done cleaning! + exit 0 +fi + +(test -f $srcdir/configure.ac) || { + echo -n "**Error**: Directory $srcdir does not look like the" + echo " top-level package directory" + exit 1 +} + +(autoconf --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "**Error**: You must have autoconf installed." + echo "Download the appropriate package for your distribution," + echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" + DIE=1 +} + +(grep "^LT_INIT" $srcdir/configure.ac >/dev/null) && { + (libtoolize --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "**Error**: You must have libtool installed." + echo "You can get it from: ftp://ftp.gnu.org/pub/gnu/" + DIE=1 + } +} + +(automake --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "**Error**: You must have automake installed." + echo "You can get it from: ftp://ftp.gnu.org/pub/gnu/" + DIE=1 + NO_AUTOMAKE=yes +} + +# if no automake, don't bother testing for aclocal +test -n "$NO_AUTOMAKE" || (aclocal --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "**Error**: Missing aclocal. The version of automake" + echo "installed doesn't appear recent enough." + echo "You can get automake from ftp://ftp.gnu.org/pub/gnu/" + DIE=1 +} + +if test "$DIE" -eq 1; then + exit 1 +fi + +if test -z "$*"; then + echo "**Warning**: I am going to run configure with no arguments." + echo "If you wish to pass any to it, please specify them on the" + echo $0 " command line." + echo +fi + +case $CC in +xlc ) + am_opt=--include-deps;; +esac + + aclocalinclude="$ACLOCAL_FLAGS" + + if grep "^LT_INIT" configure.ac >/dev/null; then + if test -z "$NO_LIBTOOLIZE" ; then + echo "Running libtoolize..." + libtoolize --force --copy + fi + fi + echo "Running aclocal $aclocalinclude ..." + aclocal $aclocalinclude + if grep "^AC_CONFIG_HEADERS" configure.ac >/dev/null; then + echo "Running autoheader..." + autoheader + fi + echo "Running automake --add-missing -copy --gnu -Wno-portability $am_opt ..." + automake --add-missing --copy --gnu -Wno-portability $am_opt + echo "Running autoconf ..." + autoconf + +conf_flags="--enable-maintainer-mode" + +if test x$NOCONFIGURE = x; then + echo "Running $srcdir/configure $conf_flags $@ ..." + $srcdir/configure $conf_flags "$@" \ + && echo "Now type make to compile." || exit 1 +else + echo "Skipping configure process." +fi diff --git a/local/recipes/libs/lcms2/source/cmake/Lcms2Features.cmake b/local/recipes/libs/lcms2/source/cmake/Lcms2Features.cmake new file mode 100644 index 0000000000..54c06f4df7 --- /dev/null +++ b/local/recipes/libs/lcms2/source/cmake/Lcms2Features.cmake @@ -0,0 +1,72 @@ +include(CheckCCompilerFlag) +include(CheckCSourceCompiles) +include(CheckFunctionExists) +include(TestBigEndian) + +function(lcms2_detect_features) + # Endianness + test_big_endian(LCMS2_WORDS_BIGENDIAN) + if(LCMS2_WORDS_BIGENDIAN) + set(LCMS2_DEFINE_WORDS_BIGENDIAN 1 PARENT_SCOPE) + else() + set(LCMS2_DEFINE_WORDS_BIGENDIAN 0 PARENT_SCOPE) + endif() + + # gmtime_r / gmtime_s + set(CMAKE_REQUIRED_DEFINITIONS "") + set(CMAKE_REQUIRED_LIBRARIES "") + + check_function_exists(gmtime_r LCMS2_HAVE_GMTIME_R) + + set(_gmtime_s_src " + #include + int main(void) { + time_t t = (time_t)0; + struct tm m; + (void)gmtime_s(&m, &t); + return 0; + } + ") + check_c_source_compiles("${_gmtime_s_src}" LCMS2_HAVE_GMTIME_S) + + set(LCMS2_DEFINE_HAVE_GMTIME_R ${LCMS2_HAVE_GMTIME_R} PARENT_SCOPE) + set(LCMS2_DEFINE_HAVE_GMTIME_S ${LCMS2_HAVE_GMTIME_S} PARENT_SCOPE) + + # Visibility attribute support (GCC/Clang). + set(_vis_src " + __attribute__((visibility(\"default\"))) int foo(void) { return 0; } + int main(void) { return foo(); } + ") + check_c_source_compiles("${_vis_src}" LCMS2_HAVE_FUNC_ATTRIBUTE_VISIBILITY) + set(LCMS2_DEFINE_HAVE_FUNC_ATTRIBUTE_VISIBILITY ${LCMS2_HAVE_FUNC_ATTRIBUTE_VISIBILITY} PARENT_SCOPE) + + # -fvisibility=hidden support (non-Windows, GCC/Clang). + check_c_compiler_flag("-fvisibility=hidden" LCMS2_HAVE_FLAG_FVISIBILITY_HIDDEN) + set(LCMS2_USE_FLAG_FVISIBILITY_HIDDEN ${LCMS2_HAVE_FLAG_FVISIBILITY_HIDDEN} PARENT_SCOPE) + + # SSE2 intrinsics + set(_sse2_src " + #include + int main(void) { + __m128i n = _mm_set1_epi8(42); + (void)n; + return 0; + } + ") + check_c_source_compiles("${_sse2_src}" LCMS2_COMPILER_SUPPORTS_SSE2) + if(LCMS2_COMPILER_SUPPORTS_SSE2) + set(LCMS2_DEFINE_CMS_DONT_USE_SSE2 0 PARENT_SCOPE) + else() + set(LCMS2_DEFINE_CMS_DONT_USE_SSE2 1 PARENT_SCOPE) + endif() + + # libm detection (for Linux and similar platforms). + find_library(LCMS2_MATH_LIB m) + if(LCMS2_MATH_LIB) + set(LCMS2_LINK_LIBM 1 PARENT_SCOPE) + else() + set(LCMS2_LINK_LIBM 0 PARENT_SCOPE) + endif() +endfunction() + + diff --git a/local/recipes/libs/lcms2/source/cmake/Lcms2Library.cmake b/local/recipes/libs/lcms2/source/cmake/Lcms2Library.cmake new file mode 100644 index 0000000000..dcde0ba14e --- /dev/null +++ b/local/recipes/libs/lcms2/source/cmake/Lcms2Library.cmake @@ -0,0 +1,168 @@ +include(GNUInstallDirs) + +function(_lcms2_collect_sources out_var) + set(_src + "${PROJECT_SOURCE_DIR}/src/cmsalpha.c" + "${PROJECT_SOURCE_DIR}/src/cmscam02.c" + "${PROJECT_SOURCE_DIR}/src/cmscgats.c" + "${PROJECT_SOURCE_DIR}/src/cmscnvrt.c" + "${PROJECT_SOURCE_DIR}/src/cmserr.c" + "${PROJECT_SOURCE_DIR}/src/cmsgamma.c" + "${PROJECT_SOURCE_DIR}/src/cmsgmt.c" + "${PROJECT_SOURCE_DIR}/src/cmsintrp.c" + "${PROJECT_SOURCE_DIR}/src/cmsio0.c" + "${PROJECT_SOURCE_DIR}/src/cmsio1.c" + "${PROJECT_SOURCE_DIR}/src/cmslut.c" + "${PROJECT_SOURCE_DIR}/src/cmsplugin.c" + "${PROJECT_SOURCE_DIR}/src/cmssm.c" + "${PROJECT_SOURCE_DIR}/src/cmsmd5.c" + "${PROJECT_SOURCE_DIR}/src/cmsmtrx.c" + "${PROJECT_SOURCE_DIR}/src/cmspack.c" + "${PROJECT_SOURCE_DIR}/src/cmspcs.c" + "${PROJECT_SOURCE_DIR}/src/cmswtpnt.c" + "${PROJECT_SOURCE_DIR}/src/cmsxform.c" + "${PROJECT_SOURCE_DIR}/src/cmssamp.c" + "${PROJECT_SOURCE_DIR}/src/cmsnamed.c" + "${PROJECT_SOURCE_DIR}/src/cmsvirt.c" + "${PROJECT_SOURCE_DIR}/src/cmstypes.c" + "${PROJECT_SOURCE_DIR}/src/cmsps2.c" + "${PROJECT_SOURCE_DIR}/src/cmsopt.c" + "${PROJECT_SOURCE_DIR}/src/cmshalf.c" + "${PROJECT_SOURCE_DIR}/src/lcms2_internal.h" + ) + set(${out_var} "${_src}" PARENT_SCOPE) +endfunction() + +function(_lcms2_apply_common_settings tgt) + target_include_directories(${tgt} + PUBLIC + $ + $ + ) + + # Feature defines derived from configure.ac parity. + if(LCMS2_DEFINE_HAVE_GMTIME_R) + target_compile_definitions(${tgt} PRIVATE HAVE_GMTIME_R=1) + endif() + if(LCMS2_DEFINE_HAVE_GMTIME_S) + target_compile_definitions(${tgt} PRIVATE HAVE_GMTIME_S=1) + endif() + + if(LCMS2_DEFINE_WORDS_BIGENDIAN) + target_compile_definitions(${tgt} PRIVATE WORDS_BIGENDIAN=1) + endif() + + if(LCMS2_DEFINE_CMS_DONT_USE_SSE2) + target_compile_definitions(${tgt} PRIVATE CMS_DONT_USE_SSE2=1) + endif() + + if(LCMS2_DEFINE_HAVE_FUNC_ATTRIBUTE_VISIBILITY) + target_compile_definitions(${tgt} PRIVATE HAVE_FUNC_ATTRIBUTE_VISIBILITY=1) + endif() + + if(LCMS2_USE_FLAG_FVISIBILITY_HIDDEN AND NOT WIN32) + target_compile_options(${tgt} PRIVATE "-fvisibility=hidden") + endif() + + # Per-target debug postfix for MSVC builds (avoids modifying CMAKE_DEBUG_POSTFIX globally). + if(MSVC) + set_target_properties(${tgt} PROPERTIES DEBUG_POSTFIX "d") + endif() + + # libm (primarily needed on Linux). Make it PUBLIC so dependents (tools) + # also link it, matching autotools *_DEPLIBS behavior. + # Reuse the library path already detected by lcms2_detect_features(). + if(LCMS2_MATH_LIB) + target_link_libraries(${tgt} PUBLIC "${LCMS2_MATH_LIB}") + endif() +endfunction() + +function(_lcms2_apply_thread_settings tgt) + # Autotools defines HasTHREADS (0/1) on non-Windows only. On Windows, upstream + # VC projects do not define HasTHREADS, leaving Win32 critical-section path. + if(WIN32) + return() + endif() + + if(NOT LCMS2_WITH_THREADS) + target_compile_definitions(${tgt} PRIVATE HasTHREADS=0) + return() + endif() + + find_package(Threads) + if(Threads_FOUND) + target_compile_definitions(${tgt} PRIVATE HasTHREADS=1) + if(TARGET Threads::Threads) + # PUBLIC so dependents also pick up pthread flags/libs when needed. + target_link_libraries(${tgt} PUBLIC Threads::Threads) + elseif(CMAKE_THREAD_LIBS_INIT) + target_link_libraries(${tgt} PUBLIC "${CMAKE_THREAD_LIBS_INIT}") + endif() + else() + target_compile_definitions(${tgt} PRIVATE HasTHREADS=0) + endif() +endfunction() + +function(lcms2_add_library) + _lcms2_collect_sources(_lcms2_sources) + + set(_lcms2_shared_target "") + set(_lcms2_static_target "") + + if(LCMS2_BUILD_SHARED) + add_library(lcms2 SHARED ${_lcms2_sources}) + set(_lcms2_shared_target lcms2) + + if(WIN32) + target_compile_definitions(lcms2 PRIVATE CMS_DLL_BUILD) + target_compile_definitions(lcms2 INTERFACE CMS_DLL) + endif() + + set_target_properties(lcms2 PROPERTIES + VERSION "${PROJECT_VERSION}.0" + SOVERSION "2" + ) + + _lcms2_apply_common_settings(lcms2) + _lcms2_apply_thread_settings(lcms2) + endif() + + if(LCMS2_BUILD_STATIC) + if(LCMS2_BUILD_SHARED AND WIN32) + add_library(lcms2_static STATIC ${_lcms2_sources}) + set(_lcms2_static_target lcms2_static) + set_target_properties(lcms2_static PROPERTIES OUTPUT_NAME "lcms2_static") + else() + if(LCMS2_BUILD_SHARED) + add_library(lcms2_static STATIC ${_lcms2_sources}) + set(_lcms2_static_target lcms2_static) + set_target_properties(lcms2_static PROPERTIES OUTPUT_NAME "lcms2") + else() + add_library(lcms2 STATIC ${_lcms2_sources}) + set(_lcms2_static_target lcms2) + endif() + endif() + + set(_static_tgt "${_lcms2_static_target}") + set_target_properties(${_static_tgt} PROPERTIES + VERSION "${PROJECT_VERSION}.0" + SOVERSION "2" + ) + + _lcms2_apply_common_settings(${_static_tgt}) + _lcms2_apply_thread_settings(${_static_tgt}) + endif() + + # Expose target names for other modules. + if(_lcms2_shared_target) + set(LCMS2_LIBRARY_TARGET "${_lcms2_shared_target}" PARENT_SCOPE) + else() + set(LCMS2_LIBRARY_TARGET "${_lcms2_static_target}" PARENT_SCOPE) + endif() + + if(_lcms2_static_target) + set(LCMS2_STATIC_LIBRARY_TARGET "${_lcms2_static_target}" PARENT_SCOPE) + endif() +endfunction() + + diff --git a/local/recipes/libs/lcms2/source/cmake/Lcms2Options.cmake b/local/recipes/libs/lcms2/source/cmake/Lcms2Options.cmake new file mode 100644 index 0000000000..db079717b6 --- /dev/null +++ b/local/recipes/libs/lcms2/source/cmake/Lcms2Options.cmake @@ -0,0 +1,31 @@ +function(lcms2_setup_options) + # Core build toggles (explicitly support building both shared and static). + option(LCMS2_BUILD_SHARED "Build shared library" ON) + option(LCMS2_BUILD_STATIC "Build static library" ON) + + option(LCMS2_BUILD_TOOLS "Build command-line tools" ON) + option(LCMS2_BUILD_TESTS "Build tests (testbed)" ON) + + # Tool-specific toggles (only meaningful when LCMS2_BUILD_TOOLS=ON). + option(LCMS2_BUILD_JPGICC "Build jpgicc tool (requires JPEG)" ON) + option(LCMS2_BUILD_TIFICC "Build tificc tool (requires TIFF, optionally ZLIB)" ON) + option(LCMS2_BUILD_TIFDIFF "Build tifdiff tool (requires TIFF)" ON) + + # Dependency toggles (only consulted when the dependent tool is enabled). + option(LCMS2_WITH_JPEG "Enable JPEG support for tools (find_package only when needed)" ON) + option(LCMS2_WITH_TIFF "Enable TIFF support for tools (find_package only when needed)" ON) + option(LCMS2_WITH_ZLIB "Enable ZLIB support for tools (find_package only when needed)" ON) + + # Threads (POSIX pthreads on non-Windows). + option(LCMS2_WITH_THREADS "Enable thread support where applicable" ON) + + # Plugins (GPL). + option(LCMS2_WITH_FASTFLOAT "Build and install fast_float plugin (GPL-3.0)" OFF) + option(LCMS2_WITH_THREADED_PLUGIN "Build and install threaded plugin (GPL-3.0)" OFF) + + if(NOT LCMS2_BUILD_SHARED AND NOT LCMS2_BUILD_STATIC) + message(FATAL_ERROR "At least one of LCMS2_BUILD_SHARED or LCMS2_BUILD_STATIC must be ON") + endif() +endfunction() + + diff --git a/local/recipes/libs/lcms2/source/cmake/Lcms2Packaging.cmake b/local/recipes/libs/lcms2/source/cmake/Lcms2Packaging.cmake new file mode 100644 index 0000000000..ee92619933 --- /dev/null +++ b/local/recipes/libs/lcms2/source/cmake/Lcms2Packaging.cmake @@ -0,0 +1,148 @@ +function(lcms2_setup_packaging) + include(GNUInstallDirs) + include(CMakePackageConfigHelpers) + + # Headers + install( + FILES + "${PROJECT_SOURCE_DIR}/include/lcms2.h" + "${PROJECT_SOURCE_DIR}/include/lcms2_plugin.h" + DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" + ) + + # Collect installable targets. + set(_install_targets "") + + foreach(_t IN ITEMS lcms2 lcms2_static) + if(TARGET ${_t}) + list(APPEND _install_targets ${_t}) + endif() + endforeach() + + if(DEFINED LCMS2_TOOL_TARGETS) + foreach(_t IN LISTS LCMS2_TOOL_TARGETS) + if(TARGET ${_t}) + list(APPEND _install_targets ${_t}) + endif() + endforeach() + endif() + + if(DEFINED LCMS2_PLUGIN_TARGETS) + foreach(_t IN LISTS LCMS2_PLUGIN_TARGETS) + if(TARGET ${_t}) + list(APPEND _install_targets ${_t}) + endif() + endforeach() + endif() + + if(_install_targets) + install( + TARGETS ${_install_targets} + EXPORT lcms2-targets + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" + LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" + ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" + INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" + ) + endif() + + # Manpages (installed regardless of whether the corresponding tool is built). + if(DEFINED LCMS2_TOOL_MANPAGES) + install( + FILES ${LCMS2_TOOL_MANPAGES} + DESTINATION "${CMAKE_INSTALL_MANDIR}/man1" + ) + endif() + + # CMake package config. + set(_lcms2_cmake_config_dir "${CMAKE_INSTALL_LIBDIR}/cmake/lcms2") + + install( + EXPORT lcms2-targets + NAMESPACE lcms2:: + DESTINATION "${_lcms2_cmake_config_dir}" + ) + + configure_package_config_file( + "${PROJECT_SOURCE_DIR}/cmake/lcms2-config.cmake.in" + "${PROJECT_BINARY_DIR}/lcms2-config.cmake" + INSTALL_DESTINATION "${_lcms2_cmake_config_dir}" + ) + + write_basic_package_version_file( + "${PROJECT_BINARY_DIR}/lcms2-config-version.cmake" + VERSION "${PROJECT_VERSION}" + COMPATIBILITY SameMajorVersion + ) + + install( + FILES + "${PROJECT_BINARY_DIR}/lcms2-config.cmake" + "${PROJECT_BINARY_DIR}/lcms2-config-version.cmake" + DESTINATION "${_lcms2_cmake_config_dir}" + ) + + # Build-tree export for local consumption. + export( + EXPORT lcms2-targets + NAMESPACE lcms2:: + FILE "${PROJECT_BINARY_DIR}/lcms2-targets.cmake" + ) + + # pkg-config generation (mirrors lcms2.pc.in semantics). + set(LIB_PLUGINS "") + if(DEFINED LCMS2_PLUGIN_TARGETS) + foreach(_t IN LISTS LCMS2_PLUGIN_TARGETS) + if(TARGET ${_t}) + get_target_property(_out_name ${_t} OUTPUT_NAME) + if(NOT _out_name) + set(_out_name "${_t}") + endif() + set(LIB_PLUGINS "${LIB_PLUGINS} -l${_out_name}") + endif() + endforeach() + string(STRIP "${LIB_PLUGINS}" LIB_PLUGINS) + endif() + + set(LIB_MATH "") + set(LIB_THREAD "") + if(NOT WIN32) + find_library(_lcms2_math_lib m) + if(_lcms2_math_lib) + set(LIB_MATH "-lm") + endif() + + if(LCMS2_WITH_THREADS) + find_package(Threads) + if(CMAKE_THREAD_LIBS_INIT) + set(LIB_THREAD "${CMAKE_THREAD_LIBS_INIT}") + endif() + endif() + endif() + + set(prefix "${CMAKE_INSTALL_PREFIX}") + set(exec_prefix "\${prefix}") + if(IS_ABSOLUTE "${CMAKE_INSTALL_LIBDIR}") + set(libdir "${CMAKE_INSTALL_LIBDIR}") + else() + set(libdir "\${exec_prefix}/${CMAKE_INSTALL_LIBDIR}") + endif() + if(IS_ABSOLUTE "${CMAKE_INSTALL_INCLUDEDIR}") + set(includedir "${CMAKE_INSTALL_INCLUDEDIR}") + else() + set(includedir "\${prefix}/${CMAKE_INSTALL_INCLUDEDIR}") + endif() + set(PACKAGE "${PROJECT_NAME}") + set(VERSION "${PROJECT_VERSION}") + configure_file( + "${PROJECT_SOURCE_DIR}/lcms2.pc.in" + "${PROJECT_BINARY_DIR}/lcms2.pc" + @ONLY + ) + install( + FILES "${PROJECT_BINARY_DIR}/lcms2.pc" + DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig" + ) +endfunction() + + diff --git a/local/recipes/libs/lcms2/source/cmake/Lcms2Plugins.cmake b/local/recipes/libs/lcms2/source/cmake/Lcms2Plugins.cmake new file mode 100644 index 0000000000..b3054bc0bc --- /dev/null +++ b/local/recipes/libs/lcms2/source/cmake/Lcms2Plugins.cmake @@ -0,0 +1,91 @@ +include(GNUInstallDirs) + +function(_lcms2_add_plugin lib_name) + set(options) + set(oneValueArgs) + set(multiValueArgs SOURCES INCLUDE_DIRS) + cmake_parse_arguments(PLUG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + + if(LCMS2_BUILD_SHARED) + add_library(${lib_name} SHARED ${PLUG_SOURCES}) + else() + add_library(${lib_name} STATIC ${PLUG_SOURCES}) + endif() + + target_include_directories(${lib_name} + PRIVATE + "${PROJECT_SOURCE_DIR}/include" + ${PLUG_INCLUDE_DIRS} + ) + + if(DEFINED LCMS2_LIBRARY_TARGET) + target_link_libraries(${lib_name} PRIVATE "${LCMS2_LIBRARY_TARGET}") + endif() + + if(WIN32) + # Ensure plugin entrypoints using CMSEXPORT are exported from the DLL. + target_compile_definitions(${lib_name} PRIVATE CMS_DLL_BUILD) + endif() + + set_target_properties(${lib_name} PROPERTIES + VERSION "${PROJECT_VERSION}.0" + SOVERSION "2" + ) + + set(_lcms2_plugin_targets "${LCMS2_PLUGIN_TARGETS}") + list(APPEND _lcms2_plugin_targets "${lib_name}") + set(LCMS2_PLUGIN_TARGETS "${_lcms2_plugin_targets}" PARENT_SCOPE) +endfunction() + +function(lcms2_add_plugins) + include(CMakeParseArguments) + + # Populated by _lcms2_add_plugin() via PARENT_SCOPE into this function scope. + set(LCMS2_PLUGIN_TARGETS "") + + if(LCMS2_WITH_FASTFLOAT) + _lcms2_add_plugin(lcms2_fast_float + SOURCES + "${PROJECT_SOURCE_DIR}/plugins/fast_float/src/fast_8_curves.c" + "${PROJECT_SOURCE_DIR}/plugins/fast_float/src/fast_8_matsh_sse.c" + "${PROJECT_SOURCE_DIR}/plugins/fast_float/src/fast_8_matsh.c" + "${PROJECT_SOURCE_DIR}/plugins/fast_float/src/fast_8_tethra.c" + "${PROJECT_SOURCE_DIR}/plugins/fast_float/src/fast_16_tethra.c" + "${PROJECT_SOURCE_DIR}/plugins/fast_float/src/fast_float_15bits.c" + "${PROJECT_SOURCE_DIR}/plugins/fast_float/src/fast_float_15mats.c" + "${PROJECT_SOURCE_DIR}/plugins/fast_float/src/fast_float_cmyk.c" + "${PROJECT_SOURCE_DIR}/plugins/fast_float/src/fast_float_curves.c" + "${PROJECT_SOURCE_DIR}/plugins/fast_float/src/fast_float_matsh.c" + "${PROJECT_SOURCE_DIR}/plugins/fast_float/src/fast_float_separate.c" + "${PROJECT_SOURCE_DIR}/plugins/fast_float/src/fast_float_sup.c" + "${PROJECT_SOURCE_DIR}/plugins/fast_float/src/fast_float_tethra.c" + "${PROJECT_SOURCE_DIR}/plugins/fast_float/src/fast_float_lab.c" + "${PROJECT_SOURCE_DIR}/plugins/fast_float/src/fast_float_internal.h" + INCLUDE_DIRS + "${PROJECT_SOURCE_DIR}/plugins/fast_float/include" + "${PROJECT_SOURCE_DIR}/plugins/fast_float/src/../include" + ) + if(LCMS2_DEFINE_CMS_DONT_USE_SSE2) + target_compile_definitions(lcms2_fast_float PRIVATE CMS_DONT_USE_SSE2=1) + endif() + endif() + + if(LCMS2_WITH_THREADED_PLUGIN) + _lcms2_add_plugin(lcms2_threaded + SOURCES + "${PROJECT_SOURCE_DIR}/plugins/threaded/src/threaded_split.c" + "${PROJECT_SOURCE_DIR}/plugins/threaded/src/threaded_core.c" + "${PROJECT_SOURCE_DIR}/plugins/threaded/src/threaded_main.c" + "${PROJECT_SOURCE_DIR}/plugins/threaded/src/threaded_scheduler.c" + "${PROJECT_SOURCE_DIR}/plugins/threaded/src/threaded_internal.h" + INCLUDE_DIRS + "${PROJECT_SOURCE_DIR}/plugins/threaded/include" + "${PROJECT_SOURCE_DIR}/plugins/threaded/src/../include" + ) + endif() + + # Propagate plugin target list to the root scope so packaging (install + pc) can see it. + set(LCMS2_PLUGIN_TARGETS "${LCMS2_PLUGIN_TARGETS}" PARENT_SCOPE) +endfunction() + + diff --git a/local/recipes/libs/lcms2/source/cmake/Lcms2Tests.cmake b/local/recipes/libs/lcms2/source/cmake/Lcms2Tests.cmake new file mode 100644 index 0000000000..aa782ec38e --- /dev/null +++ b/local/recipes/libs/lcms2/source/cmake/Lcms2Tests.cmake @@ -0,0 +1,90 @@ +function(lcms2_add_tests) + if(NOT LCMS2_BUILD_TESTS) + return() + endif() + + set(_testbed_bin_dir "${PROJECT_BINARY_DIR}/testbed") + + if(DEFINED LCMS2_STATIC_LIBRARY_TARGET) + set(_lcms2_test_lib "${LCMS2_STATIC_LIBRARY_TARGET}") + else() + # Ensure tests can link statically even if the user disabled the installed static target. + if(COMMAND _lcms2_collect_sources) + _lcms2_collect_sources(_lcms2_sources_for_tests) + add_library(lcms2_test_static STATIC ${_lcms2_sources_for_tests}) + if(COMMAND _lcms2_apply_common_settings) + _lcms2_apply_common_settings(lcms2_test_static) + endif() + if(COMMAND _lcms2_apply_thread_settings) + _lcms2_apply_thread_settings(lcms2_test_static) + endif() + set(_lcms2_test_lib lcms2_test_static) + else() + set(_lcms2_test_lib "${LCMS2_LIBRARY_TARGET}") + endif() + endif() + + add_executable(testcms + "${PROJECT_SOURCE_DIR}/testbed/testcms2.c" + "${PROJECT_SOURCE_DIR}/testbed/testplugin.c" + "${PROJECT_SOURCE_DIR}/testbed/zoo_icc.c" + "${PROJECT_SOURCE_DIR}/testbed/testcms2.h" + ) + + target_include_directories(testcms + PRIVATE + "${PROJECT_SOURCE_DIR}/include" + "${PROJECT_SOURCE_DIR}/src" + "${PROJECT_SOURCE_DIR}/testbed" + ) + + if(_lcms2_test_lib) + target_link_libraries(testcms PRIVATE "${_lcms2_test_lib}") + endif() + + set_target_properties(testcms PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${_testbed_bin_dir}" + ) + + # Per-target debug postfix for MSVC builds (avoids modifying CMAKE_DEBUG_POSTFIX globally). + if(MSVC) + set_target_properties(testcms PROPERTIES DEBUG_POSTFIX "d") + endif() + + # Copy ICC fixtures into the build testbed dir (mirrors autotools make check behavior). + set(_icc_files + "${PROJECT_SOURCE_DIR}/testbed/test1.icc" + "${PROJECT_SOURCE_DIR}/testbed/test2.icc" + "${PROJECT_SOURCE_DIR}/testbed/test3.icc" + "${PROJECT_SOURCE_DIR}/testbed/test4.icc" + "${PROJECT_SOURCE_DIR}/testbed/test5.icc" + "${PROJECT_SOURCE_DIR}/testbed/ibm-t61.icc" + "${PROJECT_SOURCE_DIR}/testbed/crayons.icc" + "${PROJECT_SOURCE_DIR}/testbed/bad.icc" + "${PROJECT_SOURCE_DIR}/testbed/bad_mpe.icc" + "${PROJECT_SOURCE_DIR}/testbed/toosmall.icc" + ) + + set(_icc_outputs "") + foreach(_f IN LISTS _icc_files) + get_filename_component(_name "${_f}" NAME) + set(_out "${_testbed_bin_dir}/${_name}") + list(APPEND _icc_outputs "${_out}") + + add_custom_command( + OUTPUT "${_out}" + COMMAND "${CMAKE_COMMAND}" -E make_directory "${_testbed_bin_dir}" + COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${_f}" "${_out}" + DEPENDS "${_f}" + VERBATIM + ) + endforeach() + + add_custom_target(lcms2_test_fixtures ALL DEPENDS ${_icc_outputs}) + add_dependencies(testcms lcms2_test_fixtures) + + add_test(NAME lcms2.testcms COMMAND "${_testbed_bin_dir}/testcms") + set_tests_properties(lcms2.testcms PROPERTIES WORKING_DIRECTORY "${_testbed_bin_dir}") +endfunction() + + diff --git a/local/recipes/libs/lcms2/source/cmake/Lcms2Tools.cmake b/local/recipes/libs/lcms2/source/cmake/Lcms2Tools.cmake new file mode 100644 index 0000000000..41ee54a0fe --- /dev/null +++ b/local/recipes/libs/lcms2/source/cmake/Lcms2Tools.cmake @@ -0,0 +1,182 @@ +include(GNUInstallDirs) +include(CMakeParseArguments) + +function(_lcms2_add_tool exe_name) + set(options) + set(oneValueArgs) + set(multiValueArgs SOURCES) + cmake_parse_arguments(TOOL "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + + add_executable(${exe_name} ${TOOL_SOURCES}) + + target_include_directories(${exe_name} + PRIVATE + "${PROJECT_SOURCE_DIR}/include" + "${PROJECT_SOURCE_DIR}/utils/common" + ) + + if(DEFINED LCMS2_LIBRARY_TARGET) + target_link_libraries(${exe_name} PRIVATE "${LCMS2_LIBRARY_TARGET}") + endif() + + # Per-target debug postfix for MSVC builds (avoids modifying CMAKE_DEBUG_POSTFIX globally). + if(MSVC) + set_target_properties(${exe_name} PROPERTIES DEBUG_POSTFIX "d") + endif() + + set(_lcms2_tool_targets "${LCMS2_TOOL_TARGETS}") + list(APPEND _lcms2_tool_targets "${exe_name}") + set(LCMS2_TOOL_TARGETS "${_lcms2_tool_targets}" PARENT_SCOPE) +endfunction() + +function(lcms2_add_tools) + if(NOT LCMS2_BUILD_TOOLS) + return() + endif() + + # Populated by _lcms2_add_tool() via PARENT_SCOPE into this function scope. + set(LCMS2_TOOL_TARGETS "") + + set(_common_sources + "${PROJECT_SOURCE_DIR}/utils/common/xgetopt.c" + "${PROJECT_SOURCE_DIR}/utils/common/vprf.c" + "${PROJECT_SOURCE_DIR}/utils/common/utils.h" + ) + + # Always-built tools (per autotools). + _lcms2_add_tool(transicc + SOURCES + "${PROJECT_SOURCE_DIR}/utils/transicc/transicc.c" + ${_common_sources} + ) + set_property(TARGET transicc PROPERTY OUTPUT_NAME "transicc") + + _lcms2_add_tool(linkicc + SOURCES + "${PROJECT_SOURCE_DIR}/utils/linkicc/linkicc.c" + ${_common_sources} + ) + set_property(TARGET linkicc PROPERTY OUTPUT_NAME "linkicc") + + _lcms2_add_tool(psicc + SOURCES + "${PROJECT_SOURCE_DIR}/utils/psicc/psicc.c" + ${_common_sources} + ) + set_property(TARGET psicc PROPERTY OUTPUT_NAME "psicc") + + # Optional jpgicc (requires JPEG). + if(LCMS2_BUILD_JPGICC) + if(LCMS2_WITH_JPEG) + find_package(JPEG) + endif() + + if(JPEG_FOUND) + _lcms2_add_tool(jpgicc + SOURCES + "${PROJECT_SOURCE_DIR}/utils/jpgicc/jpgicc.c" + "${PROJECT_SOURCE_DIR}/utils/jpgicc/iccjpeg.c" + ${_common_sources} + ) + if(TARGET JPEG::JPEG) + target_link_libraries(jpgicc PRIVATE JPEG::JPEG) + else() + # Do not quote list variables: they may contain debug/optimized keywords + # on multi-config generators (e.g. Ninja Multi-Config). + target_include_directories(jpgicc PRIVATE ${JPEG_INCLUDE_DIRS}) + target_link_libraries(jpgicc PRIVATE ${JPEG_LIBRARIES}) + endif() + else() + message(STATUS "JPEG not found or disabled; skipping jpgicc") + endif() + endif() + + # Optional tificc (requires TIFF; may also use ZLIB/JPEG if present). + if(LCMS2_BUILD_TIFICC) + if(LCMS2_WITH_TIFF) + find_package(TIFF) + endif() + + if(TIFF_FOUND) + _lcms2_add_tool(tificc + SOURCES + "${PROJECT_SOURCE_DIR}/utils/tificc/tificc.c" + ${_common_sources} + ) + if(TARGET TIFF::TIFF) + target_link_libraries(tificc PRIVATE TIFF::TIFF) + else() + # Do not quote list variables: they may contain debug/optimized keywords. + target_include_directories(tificc PRIVATE ${TIFF_INCLUDE_DIR}) + target_link_libraries(tificc PRIVATE ${TIFF_LIBRARIES}) + endif() + + if(LCMS2_WITH_ZLIB) + find_package(ZLIB) + if(ZLIB_FOUND) + if(TARGET ZLIB::ZLIB) + target_link_libraries(tificc PRIVATE ZLIB::ZLIB) + else() + target_include_directories(tificc PRIVATE ${ZLIB_INCLUDE_DIRS}) + target_link_libraries(tificc PRIVATE ${ZLIB_LIBRARIES}) + endif() + else() + message(STATUS "ZLIB not found or disabled; building tificc without ZLIB") + endif() + endif() + + if(LCMS2_WITH_JPEG) + find_package(JPEG) + if(JPEG_FOUND) + if(TARGET JPEG::JPEG) + target_link_libraries(tificc PRIVATE JPEG::JPEG) + else() + target_include_directories(tificc PRIVATE ${JPEG_INCLUDE_DIRS}) + target_link_libraries(tificc PRIVATE ${JPEG_LIBRARIES}) + endif() + endif() + endif() + else() + message(STATUS "TIFF not found or disabled; skipping tificc") + endif() + endif() + + # Optional tifdiff (requires TIFF). + if(LCMS2_BUILD_TIFDIFF) + if(LCMS2_WITH_TIFF) + find_package(TIFF) + endif() + + if(TIFF_FOUND) + _lcms2_add_tool(tifdiff + SOURCES + "${PROJECT_SOURCE_DIR}/utils/tificc/tifdiff.c" + ${_common_sources} + ) + if(TARGET TIFF::TIFF) + target_link_libraries(tifdiff PRIVATE TIFF::TIFF) + else() + # Do not quote list variables: they may contain debug/optimized keywords. + target_include_directories(tifdiff PRIVATE ${TIFF_INCLUDE_DIR}) + target_link_libraries(tifdiff PRIVATE ${TIFF_LIBRARIES}) + endif() + else() + message(STATUS "TIFF not found or disabled; skipping tifdiff") + endif() + endif() + + # Manpages (install handled by packaging module). + set(_manpages + "${PROJECT_SOURCE_DIR}/utils/jpgicc/jpgicc.1" + "${PROJECT_SOURCE_DIR}/utils/linkicc/linkicc.1" + "${PROJECT_SOURCE_DIR}/utils/psicc/psicc.1" + "${PROJECT_SOURCE_DIR}/utils/tificc/tificc.1" + "${PROJECT_SOURCE_DIR}/utils/transicc/transicc.1" + ) + set(LCMS2_TOOL_MANPAGES "${_manpages}" PARENT_SCOPE) + + # Propagate tool target list to the root scope so packaging can install them. + set(LCMS2_TOOL_TARGETS "${LCMS2_TOOL_TARGETS}" PARENT_SCOPE) +endfunction() + + diff --git a/local/recipes/libs/lcms2/source/cmake/lcms2-config.cmake.in b/local/recipes/libs/lcms2/source/cmake/lcms2-config.cmake.in new file mode 100644 index 0000000000..ab96268481 --- /dev/null +++ b/local/recipes/libs/lcms2/source/cmake/lcms2-config.cmake.in @@ -0,0 +1,3 @@ +@PACKAGE_INIT@ + +include("${CMAKE_CURRENT_LIST_DIR}/lcms2-targets.cmake") diff --git a/local/recipes/libs/lcms2/source/compile b/local/recipes/libs/lcms2/source/compile new file mode 100755 index 0000000000..02ff093c33 --- /dev/null +++ b/local/recipes/libs/lcms2/source/compile @@ -0,0 +1,364 @@ +#! /bin/sh +# Wrapper for compilers which do not understand '-c -o'. + +scriptversion=2025-06-18.21; # UTC + +# Copyright (C) 1999-2025 Free Software Foundation, Inc. +# Written by Tom Tromey . +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +nl=' +' + +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent tools from complaining about whitespace usage. +IFS=" "" $nl" + +file_conv= + +# func_file_conv build_file unneeded_conversions +# Convert a $build file to $host form and store it in $file +# Currently only supports Windows hosts. If the determined conversion +# type is listed in (the comma separated) UNNEEDED_CONVERSIONS, no +# conversion will take place. +func_file_conv () +{ + file=$1 + case $file in + / | /[!/]*) # absolute file, and not a UNC file + if test -z "$file_conv"; then + # lazily determine how to convert abs files + case `uname -s` in + MINGW*) + if test -n "$MSYSTEM" && (cygpath --version) >/dev/null 2>&1; then + # MSYS2 environment. + file_conv=cygwin + else + # Original MinGW environment. + file_conv=mingw + fi + ;; + MSYS*) + # Old MSYS environment, or MSYS2 with 32-bit MSYS2 shell. + file_conv=cygwin + ;; + CYGWIN*) + # Cygwin environment. + file_conv=cygwin + ;; + *) + file_conv=wine + ;; + esac + fi + case $file_conv/,$2, in + *,$file_conv,*) + # This is the optimization mentioned above: + # If UNNEEDED_CONVERSIONS contains $file_conv, don't convert. + ;; + mingw/*) + file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` + ;; + cygwin/*) + file=`cygpath -w "$file" || echo "$file"` + ;; + wine/*) + file=`winepath -w "$file" || echo "$file"` + ;; + esac + ;; + esac +} + +# func_cl_dashL linkdir +# Make cl look for libraries in LINKDIR +func_cl_dashL () +{ + func_file_conv "$1" + if test -z "$lib_path"; then + lib_path=$file + else + lib_path="$lib_path;$file" + fi + linker_opts="$linker_opts -LIBPATH:$file" +} + +# func_cl_dashl library +# Do a library search-path lookup for cl +func_cl_dashl () +{ + lib=$1 + found=no + save_IFS=$IFS + IFS=';' + for dir in $lib_path $LIB + do + IFS=$save_IFS + if $shared && test -f "$dir/$lib.dll.lib"; then + found=yes + lib=$dir/$lib.dll.lib + break + fi + if test -f "$dir/$lib.lib"; then + found=yes + lib=$dir/$lib.lib + break + fi + if test -f "$dir/lib$lib.a"; then + found=yes + lib=$dir/lib$lib.a + break + fi + done + IFS=$save_IFS + + if test "$found" != yes; then + lib=$lib.lib + fi +} + +# func_cl_wrapper cl arg... +# Adjust compile command to suit cl +func_cl_wrapper () +{ + # Assume a capable shell + lib_path= + shared=: + linker_opts= + for arg + do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + eat=1 + case $2 in + *.o | *.lo | *.[oO][bB][jJ]) + func_file_conv "$2" + set x "$@" -Fo"$file" + shift + ;; + *) + func_file_conv "$2" + set x "$@" -Fe"$file" + shift + ;; + esac + ;; + -I) + eat=1 + func_file_conv "$2" mingw + set x "$@" -I"$file" + shift + ;; + -I*) + func_file_conv "${1#-I}" mingw + set x "$@" -I"$file" + shift + ;; + -l) + eat=1 + func_cl_dashl "$2" + set x "$@" "$lib" + shift + ;; + -l*) + func_cl_dashl "${1#-l}" + set x "$@" "$lib" + shift + ;; + -L) + eat=1 + func_cl_dashL "$2" + ;; + -L*) + func_cl_dashL "${1#-L}" + ;; + -static) + shared=false + ;; + -Wl,*) + arg=${1#-Wl,} + save_ifs="$IFS"; IFS=',' + for flag in $arg; do + IFS="$save_ifs" + linker_opts="$linker_opts $flag" + done + IFS="$save_ifs" + ;; + -Xlinker) + eat=1 + linker_opts="$linker_opts $2" + ;; + -*) + set x "$@" "$1" + shift + ;; + *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) + func_file_conv "$1" + set x "$@" -Tp"$file" + shift + ;; + *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) + func_file_conv "$1" mingw + set x "$@" "$file" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift + done + if test -n "$linker_opts"; then + linker_opts="-link$linker_opts" + fi + exec "$@" $linker_opts + exit 1 +} + +eat= + +case $1 in + '') + echo "$0: No command. Try '$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: compile [--help] [--version] PROGRAM [ARGS] + +Wrapper for compilers which do not understand '-c -o'. +Remove '-o dest.o' from ARGS, run PROGRAM with the remaining +arguments, and rename the output as expected. + +If you are trying to build a whole package this is not the +right script to run: please start by reading the file 'INSTALL'. + +Report bugs to . +GNU Automake home page: . +General help using GNU software: . +EOF + exit $? + ;; + -v | --v*) + echo "compile (GNU Automake) $scriptversion" + exit $? + ;; + cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ + clang-cl | *[/\\]clang-cl | clang-cl.exe | *[/\\]clang-cl.exe | \ + icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) + func_cl_wrapper "$@" # Doesn't return... + ;; +esac + +ofile= +cfile= + +for arg +do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + # So we strip '-o arg' only if arg is an object. + eat=1 + case $2 in + *.o | *.obj) + ofile=$2 + ;; + *) + set x "$@" -o "$2" + shift + ;; + esac + ;; + *.c) + cfile=$1 + set x "$@" "$1" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift +done + +if test -z "$ofile" || test -z "$cfile"; then + # If no '-o' option was seen then we might have been invoked from a + # pattern rule where we don't need one. That is ok -- this is a + # normal compilation that the losing compiler can handle. If no + # '.c' file was seen then we are probably linking. That is also + # ok. + exec "$@" +fi + +# Name of file we expect compiler to create. +cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` + +# Create the lock directory. +# Note: use '[/\\:.-]' here to ensure that we don't use the same name +# that we are using for the .o file. Also, base the name on the expected +# object file name, since that is what matters with a parallel build. +lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d +while true; do + if mkdir "$lockdir" >/dev/null 2>&1; then + break + fi + sleep 1 +done +# FIXME: race condition here if user kills between mkdir and trap. +trap "rmdir '$lockdir'; exit 1" 1 2 15 + +# Run the compile. +"$@" +ret=$? + +if test -f "$cofile"; then + test "$cofile" = "$ofile" || mv "$cofile" "$ofile" +elif test -f "${cofile}bj"; then + test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" +fi + +rmdir "$lockdir" +exit $ret + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp nil t) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%Y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/local/recipes/libs/lcms2/source/config.guess b/local/recipes/libs/lcms2/source/config.guess new file mode 100755 index 0000000000..f50dcdb6de --- /dev/null +++ b/local/recipes/libs/lcms2/source/config.guess @@ -0,0 +1,1480 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright 1992-2018 Free Software Foundation, Inc. + +timestamp='2018-02-24' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). +# +# Originally written by Per Bothner; maintained since 2000 by Ben Elliston. +# +# You can get the latest version of this script from: +# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess +# +# Please send patches to . + + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Options: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright 1992-2018 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + +trap 'exit 1' 1 2 15 + +# CC_FOR_BUILD -- compiler used by this script. Note that the use of a +# compiler to aid in system detection is discouraged as it requires +# temporary files to be created and, as you can see below, it is a +# headache to deal with in a portable fashion. + +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +# Portable tmp directory creation inspired by the Autoconf team. + +set_cc_for_build=' +trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; +trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; +: ${TMPDIR=/tmp} ; + { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; +dummy=$tmp/dummy ; +tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; +case $CC_FOR_BUILD,$HOST_CC,$CC in + ,,) echo "int x;" > "$dummy.c" ; + for c in cc gcc c89 c99 ; do + if ($c -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then + CC_FOR_BUILD="$c"; break ; + fi ; + done ; + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found ; + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; +esac ; set_cc_for_build= ;' + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +case "$UNAME_SYSTEM" in +Linux|GNU|GNU/*) + # If the system lacks a compiler, then just pick glibc. + # We could probably try harder. + LIBC=gnu + + eval "$set_cc_for_build" + cat <<-EOF > "$dummy.c" + #include + #if defined(__UCLIBC__) + LIBC=uclibc + #elif defined(__dietlibc__) + LIBC=dietlibc + #else + LIBC=gnu + #endif + EOF + eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`" + + # If ldd exists, use it to detect musl libc. + if command -v ldd >/dev/null && \ + ldd --version 2>&1 | grep -q ^musl + then + LIBC=musl + fi + ;; +esac + +# Note: order is significant - the case branches are not exclusive. + +case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ + "/sbin/$sysctl" 2>/dev/null || \ + "/usr/sbin/$sysctl" 2>/dev/null || \ + echo unknown)` + case "$UNAME_MACHINE_ARCH" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + sh5el) machine=sh5le-unknown ;; + earmv*) + arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'` + endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'` + machine="${arch}${endian}"-unknown + ;; + *) machine="$UNAME_MACHINE_ARCH"-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently (or will in the future) and ABI. + case "$UNAME_MACHINE_ARCH" in + earm*) + os=netbsdelf + ;; + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + eval "$set_cc_for_build" + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ELF__ + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # Determine ABI tags. + case "$UNAME_MACHINE_ARCH" in + earm*) + expr='s/^earmv[0-9]/-eabi/;s/eb$//' + abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"` + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "$UNAME_VERSION" in + Debian*) + release='-gnu' + ;; + *) + release=`echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "$machine-${os}${release}${abi}" + exit ;; + *:Bitrig:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` + echo "$UNAME_MACHINE_ARCH"-unknown-bitrig"$UNAME_RELEASE" + exit ;; + *:OpenBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` + echo "$UNAME_MACHINE_ARCH"-unknown-openbsd"$UNAME_RELEASE" + exit ;; + *:LibertyBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` + echo "$UNAME_MACHINE_ARCH"-unknown-libertybsd"$UNAME_RELEASE" + exit ;; + *:MidnightBSD:*:*) + echo "$UNAME_MACHINE"-unknown-midnightbsd"$UNAME_RELEASE" + exit ;; + *:ekkoBSD:*:*) + echo "$UNAME_MACHINE"-unknown-ekkobsd"$UNAME_RELEASE" + exit ;; + *:SolidBSD:*:*) + echo "$UNAME_MACHINE"-unknown-solidbsd"$UNAME_RELEASE" + exit ;; + macppc:MirBSD:*:*) + echo powerpc-unknown-mirbsd"$UNAME_RELEASE" + exit ;; + *:MirBSD:*:*) + echo "$UNAME_MACHINE"-unknown-mirbsd"$UNAME_RELEASE" + exit ;; + *:Sortix:*:*) + echo "$UNAME_MACHINE"-unknown-sortix + exit ;; + *:Redox:*:*) + echo "$UNAME_MACHINE"-unknown-redox + exit ;; + mips:OSF1:*.*) + echo mips-dec-osf1 + exit ;; + alpha:OSF1:*:*) + case $UNAME_RELEASE in + *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + ;; + *5.*) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case "$ALPHA_CPU_TYPE" in + "EV4 (21064)") + UNAME_MACHINE=alpha ;; + "EV4.5 (21064)") + UNAME_MACHINE=alpha ;; + "LCA4 (21066/21068)") + UNAME_MACHINE=alpha ;; + "EV5 (21164)") + UNAME_MACHINE=alphaev5 ;; + "EV5.6 (21164A)") + UNAME_MACHINE=alphaev56 ;; + "EV5.6 (21164PC)") + UNAME_MACHINE=alphapca56 ;; + "EV5.7 (21164PC)") + UNAME_MACHINE=alphapca57 ;; + "EV6 (21264)") + UNAME_MACHINE=alphaev6 ;; + "EV6.7 (21264A)") + UNAME_MACHINE=alphaev67 ;; + "EV6.8CB (21264C)") + UNAME_MACHINE=alphaev68 ;; + "EV6.8AL (21264B)") + UNAME_MACHINE=alphaev68 ;; + "EV6.8CX (21264D)") + UNAME_MACHINE=alphaev68 ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE=alphaev69 ;; + "EV7 (21364)") + UNAME_MACHINE=alphaev7 ;; + "EV7.9 (21364A)") + UNAME_MACHINE=alphaev79 ;; + esac + # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo "$UNAME_MACHINE"-dec-osf"`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`" + # Reset EXIT trap before exiting to avoid spurious non-zero exit code. + exitcode=$? + trap '' 0 + exit $exitcode ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo "$UNAME_MACHINE"-unknown-amigaos + exit ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo "$UNAME_MACHINE"-unknown-morphos + exit ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit ;; + *:z/VM:*:*) + echo s390-ibm-zvmoe + exit ;; + *:OS400:*:*) + echo powerpc-ibm-os400 + exit ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix"$UNAME_RELEASE" + exit ;; + arm*:riscos:*:*|arm*:RISCOS:*:*) + echo arm-unknown-riscos + exit ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit ;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 + exit ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7; exit ;; + esac ;; + s390x:SunOS:*:*) + echo "$UNAME_MACHINE"-ibm-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" + exit ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" + exit ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" + exit ;; + i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) + echo i386-pc-auroraux"$UNAME_RELEASE" + exit ;; + i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) + eval "$set_cc_for_build" + SUN_ARCH=i386 + # If there is a compiler, see if it is configured for 64-bit objects. + # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. + # This test works for both compilers. + if [ "$CC_FOR_BUILD" != no_compiler_found ]; then + if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + SUN_ARCH=x86_64 + fi + fi + echo "$SUN_ARCH"-pc-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" + exit ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" + exit ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos"`echo "$UNAME_RELEASE"|sed -e 's/-/_/'`" + exit ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos"$UNAME_RELEASE" + exit ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos"$UNAME_RELEASE" + ;; + sun4) + echo sparc-sun-sunos"$UNAME_RELEASE" + ;; + esac + exit ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos"$UNAME_RELEASE" + exit ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint"$UNAME_RELEASE" + exit ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint"$UNAME_RELEASE" + exit ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint"$UNAME_RELEASE" + exit ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint"$UNAME_RELEASE" + exit ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint"$UNAME_RELEASE" + exit ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint"$UNAME_RELEASE" + exit ;; + m68k:machten:*:*) + echo m68k-apple-machten"$UNAME_RELEASE" + exit ;; + powerpc:machten:*:*) + echo powerpc-apple-machten"$UNAME_RELEASE" + exit ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix"$UNAME_RELEASE" + exit ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix"$UNAME_RELEASE" + exit ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix"$UNAME_RELEASE" + exit ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + eval "$set_cc_for_build" + sed 's/^ //' << EOF > "$dummy.c" +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD -o "$dummy" "$dummy.c" && + dummyarg=`echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p'` && + SYSTEM_NAME=`"$dummy" "$dummyarg"` && + { echo "$SYSTEM_NAME"; exit; } + echo mips-mips-riscos"$UNAME_RELEASE" + exit ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ "$UNAME_PROCESSOR" = mc88100 ] || [ "$UNAME_PROCESSOR" = mc88110 ] + then + if [ "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx ] || \ + [ "$TARGET_BINARY_INTERFACE"x = x ] + then + echo m88k-dg-dgux"$UNAME_RELEASE" + else + echo m88k-dg-dguxbcs"$UNAME_RELEASE" + fi + else + echo i586-dg-dgux"$UNAME_RELEASE" + fi + exit ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit ;; + *:IRIX*:*:*) + echo mips-sgi-irix"`echo "$UNAME_RELEASE"|sed -e 's/-/_/g'`" + exit ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit ;; + ia64:AIX:*:*) + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" + fi + echo "$UNAME_MACHINE"-ibm-aix"$IBM_REV" + exit ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + eval "$set_cc_for_build" + sed 's/^ //' << EOF > "$dummy.c" + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` + then + echo "$SYSTEM_NAME" + else + echo rs6000-ibm-aix3.2.5 + fi + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit ;; + *:AIX:*:[4567]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/lslpp ] ; then + IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | + awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` + else + IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" + fi + echo "$IBM_ARCH"-ibm-aix"$IBM_REV" + exit ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit ;; + ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*) + echo romp-ibm-bsd4.4 + exit ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd"$UNAME_RELEASE" # 4.3 with uname added to + exit ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` + case "$UNAME_MACHINE" in + 9000/31?) HP_ARCH=m68000 ;; + 9000/[34]??) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "$sc_cpu_version" in + 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0 + 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "$sc_kernel_bits" in + 32) HP_ARCH=hppa2.0n ;; + 64) HP_ARCH=hppa2.0w ;; + '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20 + esac ;; + esac + fi + if [ "$HP_ARCH" = "" ]; then + eval "$set_cc_for_build" + sed 's/^ //' << EOF > "$dummy.c" + + #define _HPUX_SOURCE + #include + #include + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=`"$dummy"` + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; + esac + if [ "$HP_ARCH" = hppa2.0w ] + then + eval "$set_cc_for_build" + + # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating + # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler + # generating 64-bit code. GNU and HP use different nomenclature: + # + # $ CC_FOR_BUILD=cc ./config.guess + # => hppa2.0w-hp-hpux11.23 + # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess + # => hppa64-hp-hpux11.23 + + if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | + grep -q __LP64__ + then + HP_ARCH=hppa2.0w + else + HP_ARCH=hppa64 + fi + fi + echo "$HP_ARCH"-hp-hpux"$HPUX_REV" + exit ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux"$HPUX_REV" + exit ;; + 3050*:HI-UX:*:*) + eval "$set_cc_for_build" + sed 's/^ //' << EOF > "$dummy.c" + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` && + { echo "$SYSTEM_NAME"; exit; } + echo unknown-hitachi-hiuxwe2 + exit ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*) + echo hppa1.1-hp-bsd + exit ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*) + echo hppa1.1-hp-osf + exit ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo "$UNAME_MACHINE"-unknown-osf1mk + else + echo "$UNAME_MACHINE"-unknown-osf1 + fi + exit ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*[A-Z]90:*:*:*) + echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + *:UNICOS/mp:*:*) + echo craynv-cray-unicosmp"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` + FUJITSU_REL=`echo "$UNAME_RELEASE" | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` + FUJITSU_REL=`echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo "$UNAME_MACHINE"-pc-bsdi"$UNAME_RELEASE" + exit ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi"$UNAME_RELEASE" + exit ;; + *:BSD/OS:*:*) + echo "$UNAME_MACHINE"-unknown-bsdi"$UNAME_RELEASE" + exit ;; + *:FreeBSD:*:*) + UNAME_PROCESSOR=`/usr/bin/uname -p` + case "$UNAME_PROCESSOR" in + amd64) + UNAME_PROCESSOR=x86_64 ;; + i386) + UNAME_PROCESSOR=i586 ;; + esac + echo "$UNAME_PROCESSOR"-unknown-freebsd"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" + exit ;; + i*:CYGWIN*:*) + echo "$UNAME_MACHINE"-pc-cygwin + exit ;; + *:MINGW64*:*) + echo "$UNAME_MACHINE"-pc-mingw64 + exit ;; + *:MINGW*:*) + echo "$UNAME_MACHINE"-pc-mingw32 + exit ;; + *:MSYS*:*) + echo "$UNAME_MACHINE"-pc-msys + exit ;; + i*:PW*:*) + echo "$UNAME_MACHINE"-pc-pw32 + exit ;; + *:Interix*:*) + case "$UNAME_MACHINE" in + x86) + echo i586-pc-interix"$UNAME_RELEASE" + exit ;; + authenticamd | genuineintel | EM64T) + echo x86_64-unknown-interix"$UNAME_RELEASE" + exit ;; + IA64) + echo ia64-unknown-interix"$UNAME_RELEASE" + exit ;; + esac ;; + i*:UWIN*:*) + echo "$UNAME_MACHINE"-pc-uwin + exit ;; + amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) + echo x86_64-unknown-cygwin + exit ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" + exit ;; + *:GNU:*:*) + # the GNU system + echo "`echo "$UNAME_MACHINE"|sed -e 's,[-/].*$,,'`-unknown-$LIBC`echo "$UNAME_RELEASE"|sed -e 's,/.*$,,'`" + exit ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo "$UNAME_MACHINE-unknown-`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`-$LIBC" + exit ;; + i*86:Minix:*:*) + echo "$UNAME_MACHINE"-pc-minix + exit ;; + aarch64:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + aarch64_be:Linux:*:*) + UNAME_MACHINE=aarch64_be + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep -q ld.so.1 + if test "$?" = 0 ; then LIBC=gnulibc1 ; fi + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + arc:Linux:*:* | arceb:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + arm*:Linux:*:*) + eval "$set_cc_for_build" + if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_EABI__ + then + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + else + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabi + else + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabihf + fi + fi + exit ;; + avr32*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + cris:Linux:*:*) + echo "$UNAME_MACHINE"-axis-linux-"$LIBC" + exit ;; + crisv32:Linux:*:*) + echo "$UNAME_MACHINE"-axis-linux-"$LIBC" + exit ;; + e2k:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + frv:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + hexagon:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + i*86:Linux:*:*) + echo "$UNAME_MACHINE"-pc-linux-"$LIBC" + exit ;; + ia64:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + k1om:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + m32r*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + m68*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + mips:Linux:*:* | mips64:Linux:*:*) + eval "$set_cc_for_build" + sed 's/^ //' << EOF > "$dummy.c" + #undef CPU + #undef ${UNAME_MACHINE} + #undef ${UNAME_MACHINE}el + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=${UNAME_MACHINE}el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=${UNAME_MACHINE} + #else + CPU= + #endif + #endif +EOF + eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU'`" + test "x$CPU" != x && { echo "$CPU-unknown-linux-$LIBC"; exit; } + ;; + mips64el:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + openrisc*:Linux:*:*) + echo or1k-unknown-linux-"$LIBC" + exit ;; + or32:Linux:*:* | or1k*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + padre:Linux:*:*) + echo sparc-unknown-linux-"$LIBC" + exit ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-"$LIBC" + exit ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-"$LIBC" ;; + PA8*) echo hppa2.0-unknown-linux-"$LIBC" ;; + *) echo hppa-unknown-linux-"$LIBC" ;; + esac + exit ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-"$LIBC" + exit ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-"$LIBC" + exit ;; + ppc64le:Linux:*:*) + echo powerpc64le-unknown-linux-"$LIBC" + exit ;; + ppcle:Linux:*:*) + echo powerpcle-unknown-linux-"$LIBC" + exit ;; + riscv32:Linux:*:* | riscv64:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo "$UNAME_MACHINE"-ibm-linux-"$LIBC" + exit ;; + sh64*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + sh*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + tile*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + vax:Linux:*:*) + echo "$UNAME_MACHINE"-dec-linux-"$LIBC" + exit ;; + x86_64:Linux:*:*) + if objdump -f /bin/sh | grep -q elf32-x86-64; then + echo "$UNAME_MACHINE"-pc-linux-"$LIBC"x32 + else + echo "$UNAME_MACHINE"-pc-linux-"$LIBC" + fi + exit ;; + xtensa*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo "$UNAME_MACHINE"-pc-sysv4.2uw"$UNAME_VERSION" + exit ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo "$UNAME_MACHINE"-pc-os2-emx + exit ;; + i*86:XTS-300:*:STOP) + echo "$UNAME_MACHINE"-unknown-stop + exit ;; + i*86:atheos:*:*) + echo "$UNAME_MACHINE"-unknown-atheos + exit ;; + i*86:syllable:*:*) + echo "$UNAME_MACHINE"-pc-syllable + exit ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) + echo i386-unknown-lynxos"$UNAME_RELEASE" + exit ;; + i*86:*DOS:*:*) + echo "$UNAME_MACHINE"-pc-msdosdjgpp + exit ;; + i*86:*:4.*:*) + UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo "$UNAME_MACHINE"-univel-sysv"$UNAME_REL" + else + echo "$UNAME_MACHINE"-pc-sysv"$UNAME_REL" + fi + exit ;; + i*86:*:5:[678]*) + # UnixWare 7.x, OpenUNIX and OpenServer 6. + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo "$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}{$UNAME_VERSION}" + exit ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo "$UNAME_MACHINE"-pc-sco"$UNAME_REL" + else + echo "$UNAME_MACHINE"-pc-sysv32 + fi + exit ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i586. + # Note: whatever this is, it MUST be the same as what config.sub + # prints for the "djgpp" host, or else GDB configure will decide that + # this is a cross-build. + echo i586-pc-msdosdjgpp + exit ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv"$UNAME_RELEASE" # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv"$UNAME_RELEASE" # Unknown i860-SVR4 + fi + exit ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4; exit; } ;; + NCR*:*:4.2:* | MPRAS*:*:4.2:*) + OS_REL='.3' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } + /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos"$UNAME_RELEASE" + exit ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos"$UNAME_RELEASE" + exit ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos"$UNAME_RELEASE" + exit ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) + echo powerpc-unknown-lynxos"$UNAME_RELEASE" + exit ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv"$UNAME_RELEASE" + exit ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo "$UNAME_MACHINE"-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit ;; + i*86:VOS:*:*) + # From Paul.Green@stratus.com. + echo "$UNAME_MACHINE"-stratus-vos + exit ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux"$UNAME_RELEASE" + exit ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv"$UNAME_RELEASE" + else + echo mips-unknown-sysv"$UNAME_RELEASE" + fi + exit ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit ;; + BePC:Haiku:*:*) # Haiku running on Intel PC compatible. + echo i586-pc-haiku + exit ;; + x86_64:Haiku:*:*) + echo x86_64-unknown-haiku + exit ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux"$UNAME_RELEASE" + exit ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux"$UNAME_RELEASE" + exit ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux"$UNAME_RELEASE" + exit ;; + SX-7:SUPER-UX:*:*) + echo sx7-nec-superux"$UNAME_RELEASE" + exit ;; + SX-8:SUPER-UX:*:*) + echo sx8-nec-superux"$UNAME_RELEASE" + exit ;; + SX-8R:SUPER-UX:*:*) + echo sx8r-nec-superux"$UNAME_RELEASE" + exit ;; + SX-ACE:SUPER-UX:*:*) + echo sxace-nec-superux"$UNAME_RELEASE" + exit ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody"$UNAME_RELEASE" + exit ;; + *:Rhapsody:*:*) + echo "$UNAME_MACHINE"-apple-rhapsody"$UNAME_RELEASE" + exit ;; + *:Darwin:*:*) + UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown + eval "$set_cc_for_build" + if test "$UNAME_PROCESSOR" = unknown ; then + UNAME_PROCESSOR=powerpc + fi + if test "`echo "$UNAME_RELEASE" | sed -e 's/\..*//'`" -le 10 ; then + if [ "$CC_FOR_BUILD" != no_compiler_found ]; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + case $UNAME_PROCESSOR in + i386) UNAME_PROCESSOR=x86_64 ;; + powerpc) UNAME_PROCESSOR=powerpc64 ;; + esac + fi + # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc + if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_PPC >/dev/null + then + UNAME_PROCESSOR=powerpc + fi + fi + elif test "$UNAME_PROCESSOR" = i386 ; then + # Avoid executing cc on OS X 10.9, as it ships with a stub + # that puts up a graphical alert prompting to install + # developer tools. Any system running Mac OS X 10.7 or + # later (Darwin 11 and later) is required to have a 64-bit + # processor. This is not true of the ARM version of Darwin + # that Apple uses in portable devices. + UNAME_PROCESSOR=x86_64 + fi + echo "$UNAME_PROCESSOR"-apple-darwin"$UNAME_RELEASE" + exit ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = x86; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo "$UNAME_PROCESSOR"-"$UNAME_MACHINE"-nto-qnx"$UNAME_RELEASE" + exit ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit ;; + NEO-*:NONSTOP_KERNEL:*:*) + echo neo-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSE-*:NONSTOP_KERNEL:*:*) + echo nse-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSR-*:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSV-*:NONSTOP_KERNEL:*:*) + echo nsv-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSX-*:NONSTOP_KERNEL:*:*) + echo nsx-tandem-nsk"$UNAME_RELEASE" + exit ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit ;; + DS/*:UNIX_System_V:*:*) + echo "$UNAME_MACHINE"-"$UNAME_SYSTEM"-"$UNAME_RELEASE" + exit ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + if test "$cputype" = 386; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo "$UNAME_MACHINE"-unknown-plan9 + exit ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux"$UNAME_RELEASE" + exit ;; + *:DragonFly:*:*) + echo "$UNAME_MACHINE"-unknown-dragonfly"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" + exit ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case "$UNAME_MACHINE" in + A*) echo alpha-dec-vms ; exit ;; + I*) echo ia64-dec-vms ; exit ;; + V*) echo vax-dec-vms ; exit ;; + esac ;; + *:XENIX:*:SysV) + echo i386-pc-xenix + exit ;; + i*86:skyos:*:*) + echo "$UNAME_MACHINE"-pc-skyos"`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'`" + exit ;; + i*86:rdos:*:*) + echo "$UNAME_MACHINE"-pc-rdos + exit ;; + i*86:AROS:*:*) + echo "$UNAME_MACHINE"-pc-aros + exit ;; + x86_64:VMkernel:*:*) + echo "$UNAME_MACHINE"-unknown-esx + exit ;; + amd64:Isilon\ OneFS:*:*) + echo x86_64-unknown-onefs + exit ;; +esac + +echo "$0: unable to guess system type" >&2 + +case "$UNAME_MACHINE:$UNAME_SYSTEM" in + mips:Linux | mips64:Linux) + # If we got here on MIPS GNU/Linux, output extra information. + cat >&2 <&2 </dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = "$UNAME_MACHINE" +UNAME_RELEASE = "$UNAME_RELEASE" +UNAME_SYSTEM = "$UNAME_SYSTEM" +UNAME_VERSION = "$UNAME_VERSION" +EOF + +exit 1 + +# Local variables: +# eval: (add-hook 'write-file-functions 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/local/recipes/libs/lcms2/source/config.sub b/local/recipes/libs/lcms2/source/config.sub new file mode 100755 index 0000000000..2c6a07ab3c --- /dev/null +++ b/local/recipes/libs/lcms2/source/config.sub @@ -0,0 +1,1971 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright 1992-2024 Free Software Foundation, Inc. + +# shellcheck disable=SC2006,SC2268 # see below for rationale + +timestamp='2024-01-01' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). + + +# Please send patches to . +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# You can get the latest version of this script from: +# https://git.savannah.gnu.org/cgit/config.git/plain/config.sub + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +# The "shellcheck disable" line above the timestamp inhibits complaints +# about features and limitations of the classic Bourne shell that were +# superseded or lifted in POSIX. However, this script identifies a wide +# variety of pre-POSIX systems that do not have POSIX shells at all, and +# even some reasonably current systems (Solaris 10 as case-in-point) still +# have a pre-POSIX /bin/sh. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS + +Canonicalize a configuration name. + +Options: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.sub ($timestamp) + +Copyright 1992-2024 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try '$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo "$1" + exit ;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Split fields of configuration type +# shellcheck disable=SC2162 +saved_IFS=$IFS +IFS="-" read field1 field2 field3 field4 <&2 + exit 1 + ;; + *-*-*-*) + basic_machine=$field1-$field2 + basic_os=$field3-$field4 + ;; + *-*-*) + # Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two + # parts + maybe_os=$field2-$field3 + case $maybe_os in + nto-qnx* | linux-* | uclinux-uclibc* \ + | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \ + | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \ + | storm-chaos* | os2-emx* | rtmk-nova* | managarm-* \ + | windows-* ) + basic_machine=$field1 + basic_os=$maybe_os + ;; + android-linux) + basic_machine=$field1-unknown + basic_os=linux-android + ;; + *) + basic_machine=$field1-$field2 + basic_os=$field3 + ;; + esac + ;; + *-*) + # A lone config we happen to match not fitting any pattern + case $field1-$field2 in + decstation-3100) + basic_machine=mips-dec + basic_os= + ;; + *-*) + # Second component is usually, but not always the OS + case $field2 in + # Prevent following clause from handling this valid os + sun*os*) + basic_machine=$field1 + basic_os=$field2 + ;; + zephyr*) + basic_machine=$field1-unknown + basic_os=$field2 + ;; + # Manufacturers + dec* | mips* | sequent* | encore* | pc533* | sgi* | sony* \ + | att* | 7300* | 3300* | delta* | motorola* | sun[234]* \ + | unicom* | ibm* | next | hp | isi* | apollo | altos* \ + | convergent* | ncr* | news | 32* | 3600* | 3100* \ + | hitachi* | c[123]* | convex* | sun | crds | omron* | dg \ + | ultra | tti* | harris | dolphin | highlevel | gould \ + | cbm | ns | masscomp | apple | axis | knuth | cray \ + | microblaze* | sim | cisco \ + | oki | wec | wrs | winbond) + basic_machine=$field1-$field2 + basic_os= + ;; + *) + basic_machine=$field1 + basic_os=$field2 + ;; + esac + ;; + esac + ;; + *) + # Convert single-component short-hands not valid as part of + # multi-component configurations. + case $field1 in + 386bsd) + basic_machine=i386-pc + basic_os=bsd + ;; + a29khif) + basic_machine=a29k-amd + basic_os=udi + ;; + adobe68k) + basic_machine=m68010-adobe + basic_os=scout + ;; + alliant) + basic_machine=fx80-alliant + basic_os= + ;; + altos | altos3068) + basic_machine=m68k-altos + basic_os= + ;; + am29k) + basic_machine=a29k-none + basic_os=bsd + ;; + amdahl) + basic_machine=580-amdahl + basic_os=sysv + ;; + amiga) + basic_machine=m68k-unknown + basic_os= + ;; + amigaos | amigados) + basic_machine=m68k-unknown + basic_os=amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + basic_os=sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + basic_os=sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + basic_os=bsd + ;; + aros) + basic_machine=i386-pc + basic_os=aros + ;; + aux) + basic_machine=m68k-apple + basic_os=aux + ;; + balance) + basic_machine=ns32k-sequent + basic_os=dynix + ;; + blackfin) + basic_machine=bfin-unknown + basic_os=linux + ;; + cegcc) + basic_machine=arm-unknown + basic_os=cegcc + ;; + convex-c1) + basic_machine=c1-convex + basic_os=bsd + ;; + convex-c2) + basic_machine=c2-convex + basic_os=bsd + ;; + convex-c32) + basic_machine=c32-convex + basic_os=bsd + ;; + convex-c34) + basic_machine=c34-convex + basic_os=bsd + ;; + convex-c38) + basic_machine=c38-convex + basic_os=bsd + ;; + cray) + basic_machine=j90-cray + basic_os=unicos + ;; + crds | unos) + basic_machine=m68k-crds + basic_os= + ;; + da30) + basic_machine=m68k-da30 + basic_os= + ;; + decstation | pmax | pmin | dec3100 | decstatn) + basic_machine=mips-dec + basic_os= + ;; + delta88) + basic_machine=m88k-motorola + basic_os=sysv3 + ;; + dicos) + basic_machine=i686-pc + basic_os=dicos + ;; + djgpp) + basic_machine=i586-pc + basic_os=msdosdjgpp + ;; + ebmon29k) + basic_machine=a29k-amd + basic_os=ebmon + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + basic_os=ose + ;; + gmicro) + basic_machine=tron-gmicro + basic_os=sysv + ;; + go32) + basic_machine=i386-pc + basic_os=go32 + ;; + h8300hms) + basic_machine=h8300-hitachi + basic_os=hms + ;; + h8300xray) + basic_machine=h8300-hitachi + basic_os=xray + ;; + h8500hms) + basic_machine=h8500-hitachi + basic_os=hms + ;; + harris) + basic_machine=m88k-harris + basic_os=sysv3 + ;; + hp300 | hp300hpux) + basic_machine=m68k-hp + basic_os=hpux + ;; + hp300bsd) + basic_machine=m68k-hp + basic_os=bsd + ;; + hppaosf) + basic_machine=hppa1.1-hp + basic_os=osf + ;; + hppro) + basic_machine=hppa1.1-hp + basic_os=proelf + ;; + i386mach) + basic_machine=i386-mach + basic_os=mach + ;; + isi68 | isi) + basic_machine=m68k-isi + basic_os=sysv + ;; + m68knommu) + basic_machine=m68k-unknown + basic_os=linux + ;; + magnum | m3230) + basic_machine=mips-mips + basic_os=sysv + ;; + merlin) + basic_machine=ns32k-utek + basic_os=sysv + ;; + mingw64) + basic_machine=x86_64-pc + basic_os=mingw64 + ;; + mingw32) + basic_machine=i686-pc + basic_os=mingw32 + ;; + mingw32ce) + basic_machine=arm-unknown + basic_os=mingw32ce + ;; + monitor) + basic_machine=m68k-rom68k + basic_os=coff + ;; + morphos) + basic_machine=powerpc-unknown + basic_os=morphos + ;; + moxiebox) + basic_machine=moxie-unknown + basic_os=moxiebox + ;; + msdos) + basic_machine=i386-pc + basic_os=msdos + ;; + msys) + basic_machine=i686-pc + basic_os=msys + ;; + mvs) + basic_machine=i370-ibm + basic_os=mvs + ;; + nacl) + basic_machine=le32-unknown + basic_os=nacl + ;; + ncr3000) + basic_machine=i486-ncr + basic_os=sysv4 + ;; + netbsd386) + basic_machine=i386-pc + basic_os=netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + basic_os=linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + basic_os=newsos + ;; + news1000) + basic_machine=m68030-sony + basic_os=newsos + ;; + necv70) + basic_machine=v70-nec + basic_os=sysv + ;; + nh3000) + basic_machine=m68k-harris + basic_os=cxux + ;; + nh[45]000) + basic_machine=m88k-harris + basic_os=cxux + ;; + nindy960) + basic_machine=i960-intel + basic_os=nindy + ;; + mon960) + basic_machine=i960-intel + basic_os=mon960 + ;; + nonstopux) + basic_machine=mips-compaq + basic_os=nonstopux + ;; + os400) + basic_machine=powerpc-ibm + basic_os=os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + basic_os=ose + ;; + os68k) + basic_machine=m68k-none + basic_os=os68k + ;; + paragon) + basic_machine=i860-intel + basic_os=osf + ;; + parisc) + basic_machine=hppa-unknown + basic_os=linux + ;; + psp) + basic_machine=mipsallegrexel-sony + basic_os=psp + ;; + pw32) + basic_machine=i586-unknown + basic_os=pw32 + ;; + rdos | rdos64) + basic_machine=x86_64-pc + basic_os=rdos + ;; + rdos32) + basic_machine=i386-pc + basic_os=rdos + ;; + rom68k) + basic_machine=m68k-rom68k + basic_os=coff + ;; + sa29200) + basic_machine=a29k-amd + basic_os=udi + ;; + sei) + basic_machine=mips-sei + basic_os=seiux + ;; + sequent) + basic_machine=i386-sequent + basic_os= + ;; + sps7) + basic_machine=m68k-bull + basic_os=sysv2 + ;; + st2000) + basic_machine=m68k-tandem + basic_os= + ;; + stratus) + basic_machine=i860-stratus + basic_os=sysv4 + ;; + sun2) + basic_machine=m68000-sun + basic_os= + ;; + sun2os3) + basic_machine=m68000-sun + basic_os=sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + basic_os=sunos4 + ;; + sun3) + basic_machine=m68k-sun + basic_os= + ;; + sun3os3) + basic_machine=m68k-sun + basic_os=sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + basic_os=sunos4 + ;; + sun4) + basic_machine=sparc-sun + basic_os= + ;; + sun4os3) + basic_machine=sparc-sun + basic_os=sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + basic_os=sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + basic_os=solaris2 + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + basic_os= + ;; + sv1) + basic_machine=sv1-cray + basic_os=unicos + ;; + symmetry) + basic_machine=i386-sequent + basic_os=dynix + ;; + t3e) + basic_machine=alphaev5-cray + basic_os=unicos + ;; + t90) + basic_machine=t90-cray + basic_os=unicos + ;; + toad1) + basic_machine=pdp10-xkl + basic_os=tops20 + ;; + tpf) + basic_machine=s390x-ibm + basic_os=tpf + ;; + udi29k) + basic_machine=a29k-amd + basic_os=udi + ;; + ultra3) + basic_machine=a29k-nyu + basic_os=sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + basic_os=none + ;; + vaxv) + basic_machine=vax-dec + basic_os=sysv + ;; + vms) + basic_machine=vax-dec + basic_os=vms + ;; + vsta) + basic_machine=i386-pc + basic_os=vsta + ;; + vxworks960) + basic_machine=i960-wrs + basic_os=vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + basic_os=vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + basic_os=vxworks + ;; + xbox) + basic_machine=i686-pc + basic_os=mingw32 + ;; + ymp) + basic_machine=ymp-cray + basic_os=unicos + ;; + *) + basic_machine=$1 + basic_os= + ;; + esac + ;; +esac + +# Decode 1-component or ad-hoc basic machines +case $basic_machine in + # Here we handle the default manufacturer of certain CPU types. It is in + # some cases the only manufacturer, in others, it is the most popular. + w89k) + cpu=hppa1.1 + vendor=winbond + ;; + op50n) + cpu=hppa1.1 + vendor=oki + ;; + op60c) + cpu=hppa1.1 + vendor=oki + ;; + ibm*) + cpu=i370 + vendor=ibm + ;; + orion105) + cpu=clipper + vendor=highlevel + ;; + mac | mpw | mac-mpw) + cpu=m68k + vendor=apple + ;; + pmac | pmac-mpw) + cpu=powerpc + vendor=apple + ;; + + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + cpu=m68000 + vendor=att + ;; + 3b*) + cpu=we32k + vendor=att + ;; + bluegene*) + cpu=powerpc + vendor=ibm + basic_os=cnk + ;; + decsystem10* | dec10*) + cpu=pdp10 + vendor=dec + basic_os=tops10 + ;; + decsystem20* | dec20*) + cpu=pdp10 + vendor=dec + basic_os=tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + cpu=m68k + vendor=motorola + ;; + dpx2*) + cpu=m68k + vendor=bull + basic_os=sysv3 + ;; + encore | umax | mmax) + cpu=ns32k + vendor=encore + ;; + elxsi) + cpu=elxsi + vendor=elxsi + basic_os=${basic_os:-bsd} + ;; + fx2800) + cpu=i860 + vendor=alliant + ;; + genix) + cpu=ns32k + vendor=ns + ;; + h3050r* | hiux*) + cpu=hppa1.1 + vendor=hitachi + basic_os=hiuxwe2 + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + cpu=hppa1.0 + vendor=hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + cpu=m68000 + vendor=hp + ;; + hp9k3[2-9][0-9]) + cpu=m68k + vendor=hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + cpu=hppa1.0 + vendor=hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + cpu=hppa1.1 + vendor=hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + cpu=hppa1.1 + vendor=hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + cpu=hppa1.1 + vendor=hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + cpu=hppa1.1 + vendor=hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + cpu=hppa1.0 + vendor=hp + ;; + i*86v32) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + basic_os=sysv32 + ;; + i*86v4*) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + basic_os=sysv4 + ;; + i*86v) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + basic_os=sysv + ;; + i*86sol2) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + basic_os=solaris2 + ;; + j90 | j90-cray) + cpu=j90 + vendor=cray + basic_os=${basic_os:-unicos} + ;; + iris | iris4d) + cpu=mips + vendor=sgi + case $basic_os in + irix*) + ;; + *) + basic_os=irix4 + ;; + esac + ;; + miniframe) + cpu=m68000 + vendor=convergent + ;; + *mint | mint[0-9]* | *MiNT | *MiNT[0-9]*) + cpu=m68k + vendor=atari + basic_os=mint + ;; + news-3600 | risc-news) + cpu=mips + vendor=sony + basic_os=newsos + ;; + next | m*-next) + cpu=m68k + vendor=next + case $basic_os in + openstep*) + ;; + nextstep*) + ;; + ns2*) + basic_os=nextstep2 + ;; + *) + basic_os=nextstep3 + ;; + esac + ;; + np1) + cpu=np1 + vendor=gould + ;; + op50n-* | op60c-*) + cpu=hppa1.1 + vendor=oki + basic_os=proelf + ;; + pa-hitachi) + cpu=hppa1.1 + vendor=hitachi + basic_os=hiuxwe2 + ;; + pbd) + cpu=sparc + vendor=tti + ;; + pbb) + cpu=m68k + vendor=tti + ;; + pc532) + cpu=ns32k + vendor=pc532 + ;; + pn) + cpu=pn + vendor=gould + ;; + power) + cpu=power + vendor=ibm + ;; + ps2) + cpu=i386 + vendor=ibm + ;; + rm[46]00) + cpu=mips + vendor=siemens + ;; + rtpc | rtpc-*) + cpu=romp + vendor=ibm + ;; + sde) + cpu=mipsisa32 + vendor=sde + basic_os=${basic_os:-elf} + ;; + simso-wrs) + cpu=sparclite + vendor=wrs + basic_os=vxworks + ;; + tower | tower-32) + cpu=m68k + vendor=ncr + ;; + vpp*|vx|vx-*) + cpu=f301 + vendor=fujitsu + ;; + w65) + cpu=w65 + vendor=wdc + ;; + w89k-*) + cpu=hppa1.1 + vendor=winbond + basic_os=proelf + ;; + none) + cpu=none + vendor=none + ;; + leon|leon[3-9]) + cpu=sparc + vendor=$basic_machine + ;; + leon-*|leon[3-9]-*) + cpu=sparc + vendor=`echo "$basic_machine" | sed 's/-.*//'` + ;; + + *-*) + # shellcheck disable=SC2162 + saved_IFS=$IFS + IFS="-" read cpu vendor <&2 + exit 1 + ;; + esac + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $vendor in + digital*) + vendor=dec + ;; + commodore*) + vendor=cbm + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if test x"$basic_os" != x +then + +# First recognize some ad-hoc cases, or perhaps split kernel-os, or else just +# set os. +obj= +case $basic_os in + gnu/linux*) + kernel=linux + os=`echo "$basic_os" | sed -e 's|gnu/linux|gnu|'` + ;; + os2-emx) + kernel=os2 + os=`echo "$basic_os" | sed -e 's|os2-emx|emx|'` + ;; + nto-qnx*) + kernel=nto + os=`echo "$basic_os" | sed -e 's|nto-qnx|qnx|'` + ;; + *-*) + # shellcheck disable=SC2162 + saved_IFS=$IFS + IFS="-" read kernel os <&2 + fi + ;; + *) + echo "Invalid configuration '$1': OS '$os' not recognized" 1>&2 + exit 1 + ;; +esac + +case $obj in + aout* | coff* | elf* | pe*) + ;; + '') + # empty is fine + ;; + *) + echo "Invalid configuration '$1': Machine code format '$obj' not recognized" 1>&2 + exit 1 + ;; +esac + +# Here we handle the constraint that a (synthetic) cpu and os are +# valid only in combination with each other and nowhere else. +case $cpu-$os in + # The "javascript-unknown-ghcjs" triple is used by GHC; we + # accept it here in order to tolerate that, but reject any + # variations. + javascript-ghcjs) + ;; + javascript-* | *-ghcjs) + echo "Invalid configuration '$1': cpu '$cpu' is not valid with os '$os$obj'" 1>&2 + exit 1 + ;; +esac + +# As a final step for OS-related things, validate the OS-kernel combination +# (given a valid OS), if there is a kernel. +case $kernel-$os-$obj in + linux-gnu*- | linux-android*- | linux-dietlibc*- | linux-llvm*- \ + | linux-mlibc*- | linux-musl*- | linux-newlib*- \ + | linux-relibc*- | linux-uclibc*- ) + ;; + uclinux-uclibc*- ) + ;; + managarm-mlibc*- | managarm-kernel*- ) + ;; + windows*-msvc*-) + ;; + -dietlibc*- | -llvm*- | -mlibc*- | -musl*- | -newlib*- | -relibc*- \ + | -uclibc*- ) + # These are just libc implementations, not actual OSes, and thus + # require a kernel. + echo "Invalid configuration '$1': libc '$os' needs explicit kernel." 1>&2 + exit 1 + ;; + -kernel*- ) + echo "Invalid configuration '$1': '$os' needs explicit kernel." 1>&2 + exit 1 + ;; + *-kernel*- ) + echo "Invalid configuration '$1': '$kernel' does not support '$os'." 1>&2 + exit 1 + ;; + *-msvc*- ) + echo "Invalid configuration '$1': '$os' needs 'windows'." 1>&2 + exit 1 + ;; + kfreebsd*-gnu*- | kopensolaris*-gnu*-) + ;; + vxworks-simlinux- | vxworks-simwindows- | vxworks-spe-) + ;; + nto-qnx*-) + ;; + os2-emx-) + ;; + *-eabi*- | *-gnueabi*-) + ;; + none--*) + # None (no kernel, i.e. freestanding / bare metal), + # can be paired with an machine code file format + ;; + -*-) + # Blank kernel with real OS is always fine. + ;; + --*) + # Blank kernel and OS with real machine code file format is always fine. + ;; + *-*-*) + echo "Invalid configuration '$1': Kernel '$kernel' not known to work with OS '$os'." 1>&2 + exit 1 + ;; +esac + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +case $vendor in + unknown) + case $cpu-$os in + *-riscix*) + vendor=acorn + ;; + *-sunos*) + vendor=sun + ;; + *-cnk* | *-aix*) + vendor=ibm + ;; + *-beos*) + vendor=be + ;; + *-hpux*) + vendor=hp + ;; + *-mpeix*) + vendor=hp + ;; + *-hiux*) + vendor=hitachi + ;; + *-unos*) + vendor=crds + ;; + *-dgux*) + vendor=dg + ;; + *-luna*) + vendor=omron + ;; + *-genix*) + vendor=ns + ;; + *-clix*) + vendor=intergraph + ;; + *-mvs* | *-opened*) + vendor=ibm + ;; + *-os400*) + vendor=ibm + ;; + s390-* | s390x-*) + vendor=ibm + ;; + *-ptx*) + vendor=sequent + ;; + *-tpf*) + vendor=ibm + ;; + *-vxsim* | *-vxworks* | *-windiss*) + vendor=wrs + ;; + *-aux*) + vendor=apple + ;; + *-hms*) + vendor=hitachi + ;; + *-mpw* | *-macos*) + vendor=apple + ;; + *-*mint | *-mint[0-9]* | *-*MiNT | *-MiNT[0-9]*) + vendor=atari + ;; + *-vos*) + vendor=stratus + ;; + esac + ;; +esac + +echo "$cpu-$vendor${kernel:+-$kernel}${os:+-$os}${obj:+-$obj}" +exit + +# Local variables: +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/local/recipes/libs/lcms2/source/configure b/local/recipes/libs/lcms2/source/configure new file mode 100755 index 0000000000..d35d77abc7 --- /dev/null +++ b/local/recipes/libs/lcms2/source/configure @@ -0,0 +1,24176 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.72 for lcms2 2.19. +# +# +# Copyright (C) 1992-1996, 1998-2017, 2020-2023 Free Software Foundation, +# Inc. +# +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 +then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else case e in #( + e) case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac ;; +esac +fi + + + +# Reset variables that may have inherited troublesome values from +# the environment. + +# IFS needs to be set, to space, tab, and newline, in precisely that order. +# (If _AS_PATH_WALK were called with IFS unset, it would have the +# side effect of setting IFS to empty, thus disabling word splitting.) +# Quoting is to prevent editors from complaining about space-tab. +as_nl=' +' +export as_nl +IFS=" "" $as_nl" + +PS1='$ ' +PS2='> ' +PS4='+ ' + +# Ensure predictable behavior from utilities with locale-dependent output. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# We cannot yet rely on "unset" to work, but we need these variables +# to be unset--not just set to an empty or harmless value--now, to +# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct +# also avoids known problems related to "unset" and subshell syntax +# in other old shells (e.g. bash 2.01 and pdksh 5.2.14). +for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH +do eval test \${$as_var+y} \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done + +# Ensure that fds 0, 1, and 2 are open. +if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi +if (exec 3>&2) ; then :; else exec 2>/dev/null; fi + +# The user is always right. +if ${PATH_SEPARATOR+false} :; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + test -r "$as_dir$0" && as_myself=$as_dir$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as 'sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + + +# Use a proper internal environment variable to ensure we don't fall + # into an infinite loop, continuously re-executing ourselves. + if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then + _as_can_reexec=no; export _as_can_reexec; + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed 'exec'. +printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 + fi + # We don't want this to propagate to other subprocesses. + { _as_can_reexec=; unset _as_can_reexec;} +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 +then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else case e in #( + e) case \`(set -o) 2>/dev/null\` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ) +then : + +else case e in #( + e) exitcode=1; echo positional parameters were not saved. ;; +esac +fi +test x\$exitcode = x0 || exit 1 +blah=\$(echo \$(echo blah)) +test x\"\$blah\" = xblah || exit 1 +test -x / || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 + + test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( + ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' + ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO + ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO + PATH=/empty FPATH=/empty; export PATH FPATH + test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ + || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1" + if (eval "$as_required") 2>/dev/null +then : + as_have_required=yes +else case e in #( + e) as_have_required=no ;; +esac +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null +then : + +else case e in #( + e) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + as_found=: + case $as_dir in #( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + as_run=a "$as_shell" -c "$as_bourne_compatible""$as_required" 2>/dev/null +then : + CONFIG_SHELL=$as_shell as_have_required=yes + if as_run=a "$as_shell" -c "$as_bourne_compatible""$as_suggested" 2>/dev/null +then : + break 2 +fi +fi + done;; + esac + as_found=false +done +IFS=$as_save_IFS +if $as_found +then : + +else case e in #( + e) if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null +then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi ;; +esac +fi + + + if test "x$CONFIG_SHELL" != x +then : + export CONFIG_SHELL + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed 'exec'. +printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 +fi + + if test x$as_have_required = xno +then : + printf "%s\n" "$0: This script requires a shell more modern than all" + printf "%s\n" "$0: the shells that I found on your system." + if test ${ZSH_VERSION+y} ; then + printf "%s\n" "$0: In particular, zsh $ZSH_VERSION has bugs and should" + printf "%s\n" "$0: be upgraded to zsh 4.3.4 or later." + else + printf "%s\n" "$0: Please tell bug-autoconf@gnu.org about your system, +$0: including any error possibly output before this +$0: message. Then install a modern shell, or manually run +$0: the script under such a shell if you do have one." + fi + exit 1 +fi ;; +esac +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +printf "%s\n" X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null +then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else case e in #( + e) as_fn_append () + { + eval $1=\$$1\$2 + } ;; +esac +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null +then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else case e in #( + e) as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } ;; +esac +fi # as_fn_arith + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + printf "%s\n" "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +printf "%s\n" X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + t clear + :clear + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { printf "%s\n" "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # If we had to re-execute with $CONFIG_SHELL, we're ensured to have + # already done that, so ensure we don't try to do so again and fall + # in an infinite loop. This has already happened in practice. + _as_can_reexec=no; export _as_can_reexec + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + + +# Determine whether it's possible to make 'echo' print without a newline. +# These variables are no longer used directly by Autoconf, but are AC_SUBSTed +# for compatibility with existing Makefiles. +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +# For backward compatibility with old third-party macros, we provide +# the shell variables $as_echo and $as_echo_n. New code should use +# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. +as_echo='printf %s\n' +as_echo_n='printf %s' + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both 'ln -s file dir' and 'ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; 'ln -s' creates a wrapper executable. + # In both cases, we have to default to 'cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_sed_cpp="y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" +as_tr_cpp="eval sed '$as_sed_cpp'" # deprecated + +# Sed expression to map a string onto a valid variable name. +as_sed_sh="y%*+%pp%;s%[^_$as_cr_alnum]%_%g" +as_tr_sh="eval sed '$as_sed_sh'" # deprecated + +SHELL=${CONFIG_SHELL-/bin/sh} + + +test -n "$DJDIR" || exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIBOBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= + +# Identity of this package. +PACKAGE_NAME='lcms2' +PACKAGE_TARNAME='lcms2' +PACKAGE_VERSION='2.19' +PACKAGE_STRING='lcms2 2.19' +PACKAGE_BUGREPORT='' +PACKAGE_URL='' + +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_STDIO_H +# include +#endif +#ifdef HAVE_STDLIB_H +# include +#endif +#ifdef HAVE_STRING_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif" + +ac_header_c_list= +ac_subst_vars='am__EXEEXT_FALSE +am__EXEEXT_TRUE +LTLIBOBJS +LIBOBJS +COND_THREADED_FALSE +COND_THREADED_TRUE +COND_FASTFLOAT_FALSE +COND_FASTFLOAT_TRUE +TIFFICC_DEPLIBS +JPEGICC_DEPLIBS +LIB_PLUGINS +LCMS_LIB_DEPLIBS +LIB_TIFF +HasTIFF_FALSE +HasTIFF_TRUE +LIB_ZLIB +HasZLIB_FALSE +HasZLIB_TRUE +LIB_JPEG +HasJPEG_FALSE +HasJPEG_TRUE +LIB_THREAD +LIB_MATH +PTHREAD_CFLAGS +PTHREAD_LIBS +PTHREAD_CXX +PTHREAD_CC +ax_pthread_config +inline +MAINT +MAINTAINER_MODE_FALSE +MAINTAINER_MODE_TRUE +LIBTOOL_DEPS +AS +CXXCPP +LT_SYS_LIBRARY_PATH +OTOOL64 +OTOOL +LIPO +NMEDIT +DSYMUTIL +MANIFEST_TOOL +RANLIB +ac_ct_AR +AR +DLLTOOL +OBJDUMP +FILECMD +LN_S +NM +ac_ct_DUMPBIN +DUMPBIN +LD +FGREP +EGREP +GREP +SED +LIBTOOL +am__fastdepCXX_FALSE +am__fastdepCXX_TRUE +CXXDEPMODE +ac_ct_CXX +CXXFLAGS +CXX +CPP +am__fastdepCC_FALSE +am__fastdepCC_TRUE +CCDEPMODE +am__nodep +AMDEPBACKSLASH +AMDEP_FALSE +AMDEP_TRUE +am__include +DEPDIR +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +am__xargs_n +am__rm_f_notfound +AM_BACKSLASH +AM_DEFAULT_VERBOSITY +AM_DEFAULT_V +AM_V +CSCOPE +ETAGS +CTAGS +am__untar +am__tar +AMTAR +am__leading_dot +SET_MAKE +AWK +mkdir_p +MKDIR_P +INSTALL_STRIP_PROGRAM +STRIP +install_sh +MAKEINFO +AUTOHEADER +AUTOMAKE +AUTOCONF +ACLOCAL +VERSION +PACKAGE +CYGPATH_W +am__isrc +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +host_os +host_vendor +host_cpu +host +build_os +build_vendor +build_cpu +build +LIBRARY_AGE +LIBRARY_REVISION +LIBRARY_CURRENT +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +runstatedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL +am__quote' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +enable_silent_rules +enable_dependency_tracking +enable_shared +enable_static +enable_pic +with_pic +enable_fast_install +enable_aix_soname +with_aix_soname +with_gnu_ld +with_sysroot +enable_libtool_lock +enable_maintainer_mode +with_jpeg +with_tiff +with_zlib +with_fastfloat +with_threaded +with_threads +' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +CPP +CXX +CXXFLAGS +CCC +LT_SYS_LIBRARY_PATH +CXXCPP' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +runstatedir='${localstatedir}/run' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in + *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *=) ac_optarg= ;; + *) ac_optarg=yes ;; + esac + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: '$ac_useropt'" + ac_useropt_orig=$ac_useropt + ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: '$ac_useropt'" + ac_useropt_orig=$ac_useropt + ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -runstatedir | --runstatedir | --runstatedi | --runstated \ + | --runstate | --runstat | --runsta | --runst | --runs \ + | --run | --ru | --r) + ac_prev=runstatedir ;; + -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ + | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ + | --run=* | --ru=* | --r=*) + runstatedir=$ac_optarg ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: '$ac_useropt'" + ac_useropt_orig=$ac_useropt + ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; + + -without-* | --without-*) + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: '$ac_useropt'" + ac_useropt_orig=$ac_useropt + ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=no ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) as_fn_error $? "unrecognized option: '$ac_option' +Try '$0 --help' for more information" + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error $? "invalid variable name: '$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + printf "%s\n" "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + printf "%s\n" "$as_me: WARNING: invalid host type: $ac_option" >&2 + : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + as_fn_error $? "missing argument to $ac_option" +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; + *) printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac +fi + +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir runstatedir +do + eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" +done + +# There might be people who depend on the old broken behavior: '$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + as_fn_error $? "working directory cannot be determined" +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + as_fn_error $? "pwd does not report name of working directory" + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +printf "%s\n" X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" +fi +ac_msg="sources are in $srcdir, but 'cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +'configure' configures lcms2 2.19 to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print 'checking ...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for '--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or '..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, 'make install' will install all the files in +'$ac_default_prefix/bin', '$ac_default_prefix/lib' etc. You can specify +an installation prefix other than '$ac_default_prefix' using '--prefix', +for instance '--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root [DATAROOTDIR/doc/lcms2] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF + +Program names: + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM run sed PROGRAM on installed program names + +System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST cross-compile to build programs to run on HOST [BUILD] +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of lcms2 2.19:";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-silent-rules less verbose build output (undo: "make V=1") + --disable-silent-rules verbose build output (undo: "make V=0") + --enable-dependency-tracking + do not reject slow dependency extractors + --disable-dependency-tracking + speeds up one-time build + --enable-shared[=PKGS] build shared libraries [default=yes] + --enable-static[=PKGS] build static libraries [default=yes] + --enable-pic[=PKGS] try to use only PIC/non-PIC objects [default=use + both] + --enable-fast-install[=PKGS] + optimize for fast installation [default=yes] + --enable-aix-soname=aix|svr4|both + shared library versioning (aka "SONAME") variant to + provide on AIX, [default=aix]. + --disable-libtool-lock avoid locking (might break parallel builds) + --enable-maintainer-mode + enable make rules and dependencies not useful (and + sometimes confusing) to the casual installer + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-gnu-ld assume the C compiler uses GNU ld [default=no] + --with-sysroot[=DIR] Search for dependent libraries within DIR (or the + compiler's sysroot if not specified). + --with-jpeg=DIR use jpeg installed in DIR + --with-tiff=DIR use tiff installed in DIR + --without-zlib disable ZLIB support + --with-fastfloat build and install fast_float plugin, use only if GPL + 3.0 is acceptable + --with-threaded build and install multi threaded plugin, use only if + GPL 3.0 is acceptable + --without-pthreads disable POSIX pthreads API support + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + CPP C preprocessor + CXX C++ compiler command + CXXFLAGS C++ compiler flags + LT_SYS_LIBRARY_PATH + User-defined run-time library search path. + CXXCPP C++ preprocessor + +Use these variables to override the choices made by 'configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to the package provider. +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for configure.gnu first; this name is used for a wrapper for + # Metaconfig's "Configure" on case-insensitive file systems. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + printf "%s\n" "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +lcms2 configure 2.19 +generated by GNU Autoconf 2.72 + +Copyright (C) 2023 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +# ac_fn_c_try_compile LINENO +# -------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest.beam + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext +then : + ac_retval=0 +else case e in #( + e) printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 ;; +esac +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_compile + +# ac_fn_c_try_cpp LINENO +# ---------------------- +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + } +then : + ac_retval=0 +else case e in #( + e) printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 ;; +esac +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_cpp + +# ac_fn_cxx_try_compile LINENO +# ---------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest.beam + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext +then : + ac_retval=0 +else case e in #( + e) printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 ;; +esac +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_compile + +# ac_fn_c_try_link LINENO +# ----------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + } +then : + ac_retval=0 +else case e in #( + e) printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 ;; +esac +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_link + +# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists and can be compiled using the include files in +# INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +printf %s "checking for $2... " >&6; } +if eval test \${$3+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + eval "$3=yes" +else case e in #( + e) eval "$3=no" ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac +fi +eval ac_res=\$$3 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_compile + +# ac_fn_c_check_func LINENO FUNC VAR +# ---------------------------------- +# Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +printf %s "checking for $2... " >&6; } +if eval test \${$3+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (void); below. */ + +#include +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (void); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main (void) +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + eval "$3=yes" +else case e in #( + e) eval "$3=no" ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext ;; +esac +fi +eval ac_res=\$$3 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_func + +# ac_fn_cxx_try_cpp LINENO +# ------------------------ +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + } +then : + ac_retval=0 +else case e in #( + e) printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 ;; +esac +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_cpp + +# ac_fn_cxx_try_link LINENO +# ------------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + } +then : + ac_retval=0 +else case e in #( + e) printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 ;; +esac +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_link + +# ac_fn_c_try_run LINENO +# ---------------------- +# Try to run conftest.$ac_ext, and return whether this succeeded. Assumes that +# executables *can* be run. +ac_fn_c_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; } +then : + ac_retval=0 +else case e in #( + e) printf "%s\n" "$as_me: program exited with status $ac_status" >&5 + printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status ;; +esac +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_run +ac_configure_args_raw= +for ac_arg +do + case $ac_arg in + *\'*) + ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append ac_configure_args_raw " '$ac_arg'" +done + +case $ac_configure_args_raw in + *$as_nl*) + ac_safe_unquote= ;; + *) + ac_unsafe_z='|&;<>()$`\\"*?[ '' ' # This string ends in space, tab. + ac_unsafe_a="$ac_unsafe_z#~" + ac_safe_unquote="s/ '\\([^$ac_unsafe_a][^$ac_unsafe_z]*\\)'/ \\1/g" + ac_configure_args_raw=` printf "%s\n" "$ac_configure_args_raw" | sed "$ac_safe_unquote"`;; +esac + +cat >config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by lcms2 $as_me 2.19, which was +generated by GNU Autoconf 2.72. Invocation command line was + + $ $0$ac_configure_args_raw + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + printf "%s\n" "PATH: $as_dir" + done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 2) + as_fn_append ac_configure_args1 " '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + as_fn_append ac_configure_args " '$ac_arg'" + ;; + esac + done +done +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Sanitize IFS. + IFS=" "" $as_nl" + # Save into config.log some information that might help in debugging. + { + echo + + printf "%s\n" "## ---------------- ## +## Cache variables. ## +## ---------------- ##" + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + printf "%s\n" "## ----------------- ## +## Output variables. ## +## ----------------- ##" + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + printf "%s\n" "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + printf "%s\n" "## ------------------- ## +## File substitutions. ## +## ------------------- ##" + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + printf "%s\n" "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + printf "%s\n" "## ----------- ## +## confdefs.h. ## +## ----------- ##" + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + printf "%s\n" "$as_me: caught signal $ac_signal" + printf "%s\n" "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +printf "%s\n" "/* confdefs.h */" > confdefs.h + +# Predefined preprocessor variables. + +printf "%s\n" "#define PACKAGE_NAME \"$PACKAGE_NAME\"" >>confdefs.h + +printf "%s\n" "#define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"" >>confdefs.h + +printf "%s\n" "#define PACKAGE_VERSION \"$PACKAGE_VERSION\"" >>confdefs.h + +printf "%s\n" "#define PACKAGE_STRING \"$PACKAGE_STRING\"" >>confdefs.h + +printf "%s\n" "#define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"" >>confdefs.h + +printf "%s\n" "#define PACKAGE_URL \"$PACKAGE_URL\"" >>confdefs.h + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +if test -n "$CONFIG_SITE"; then + ac_site_files="$CONFIG_SITE" +elif test "x$prefix" != xNONE; then + ac_site_files="$prefix/share/config.site $prefix/etc/config.site" +else + ac_site_files="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" +fi + +for ac_site_file in $ac_site_files +do + case $ac_site_file in #( + */*) : + ;; #( + *) : + ac_site_file=./$ac_site_file ;; +esac + if test -f "$ac_site_file" && test -r "$ac_site_file"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" \ + || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} +as_fn_error $? "failed to load site script $ac_site_file +See 'config.log' for more details" "$LINENO" 5; } + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +printf "%s\n" "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +printf "%s\n" "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Test code for whether the C compiler supports C89 (global declarations) +ac_c_conftest_c89_globals=' +/* Does the compiler advertise C89 conformance? + Do not test the value of __STDC__, because some compilers set it to 0 + while being otherwise adequately conformant. */ +#if !defined __STDC__ +# error "Compiler does not advertise C89 conformance" +#endif + +#include +#include +struct stat; +/* Most of the following tests are stolen from RCS 5.7 src/conf.sh. */ +struct buf { int x; }; +struct buf * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (char **p, int i) +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* C89 style stringification. */ +#define noexpand_stringify(a) #a +const char *stringified = noexpand_stringify(arbitrary+token=sequence); + +/* C89 style token pasting. Exercises some of the corner cases that + e.g. old MSVC gets wrong, but not very hard. */ +#define noexpand_concat(a,b) a##b +#define expand_concat(a,b) noexpand_concat(a,b) +extern int vA; +extern int vbee; +#define aye A +#define bee B +int *pvA = &expand_concat(v,aye); +int *pvbee = &noexpand_concat(v,bee); + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not \xHH hex character constants. + These do not provoke an error unfortunately, instead are silently treated + as an "x". The following induces an error, until -std is added to get + proper ANSI mode. Curiously \x00 != x always comes out true, for an + array size at least. It is necessary to write \x00 == 0 to get something + that is true only with -std. */ +int osf4_cc_array ['\''\x00'\'' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) '\''x'\'' +int xlc6_cc_array[FOO(a) == '\''x'\'' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, int *(*)(struct buf *, struct stat *, int), + int, int);' + +# Test code for whether the C compiler supports C89 (body of main). +ac_c_conftest_c89_main=' +ok |= (argc == 0 || f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]); +' + +# Test code for whether the C compiler supports C99 (global declarations) +ac_c_conftest_c99_globals=' +/* Does the compiler advertise C99 conformance? */ +#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L +# error "Compiler does not advertise C99 conformance" +#endif + +// See if C++-style comments work. + +#include +extern int puts (const char *); +extern int printf (const char *, ...); +extern int dprintf (int, const char *, ...); +extern void *malloc (size_t); +extern void free (void *); + +// Check varargs macros. These examples are taken from C99 6.10.3.5. +// dprintf is used instead of fprintf to avoid needing to declare +// FILE and stderr. +#define debug(...) dprintf (2, __VA_ARGS__) +#define showlist(...) puts (#__VA_ARGS__) +#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) +static void +test_varargs_macros (void) +{ + int x = 1234; + int y = 5678; + debug ("Flag"); + debug ("X = %d\n", x); + showlist (The first, second, and third items.); + report (x>y, "x is %d but y is %d", x, y); +} + +// Check long long types. +#define BIG64 18446744073709551615ull +#define BIG32 4294967295ul +#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0) +#if !BIG_OK + #error "your preprocessor is broken" +#endif +#if BIG_OK +#else + #error "your preprocessor is broken" +#endif +static long long int bignum = -9223372036854775807LL; +static unsigned long long int ubignum = BIG64; + +struct incomplete_array +{ + int datasize; + double data[]; +}; + +struct named_init { + int number; + const wchar_t *name; + double average; +}; + +typedef const char *ccp; + +static inline int +test_restrict (ccp restrict text) +{ + // Iterate through items via the restricted pointer. + // Also check for declarations in for loops. + for (unsigned int i = 0; *(text+i) != '\''\0'\''; ++i) + continue; + return 0; +} + +// Check varargs and va_copy. +static bool +test_varargs (const char *format, ...) +{ + va_list args; + va_start (args, format); + va_list args_copy; + va_copy (args_copy, args); + + const char *str = ""; + int number = 0; + float fnumber = 0; + + while (*format) + { + switch (*format++) + { + case '\''s'\'': // string + str = va_arg (args_copy, const char *); + break; + case '\''d'\'': // int + number = va_arg (args_copy, int); + break; + case '\''f'\'': // float + fnumber = va_arg (args_copy, double); + break; + default: + break; + } + } + va_end (args_copy); + va_end (args); + + return *str && number && fnumber; +} +' + +# Test code for whether the C compiler supports C99 (body of main). +ac_c_conftest_c99_main=' + // Check bool. + _Bool success = false; + success |= (argc != 0); + + // Check restrict. + if (test_restrict ("String literal") == 0) + success = true; + char *restrict newvar = "Another string"; + + // Check varargs. + success &= test_varargs ("s, d'\'' f .", "string", 65, 34.234); + test_varargs_macros (); + + // Check flexible array members. + struct incomplete_array *ia = + malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10)); + ia->datasize = 10; + for (int i = 0; i < ia->datasize; ++i) + ia->data[i] = i * 1.234; + // Work around memory leak warnings. + free (ia); + + // Check named initializers. + struct named_init ni = { + .number = 34, + .name = L"Test wide string", + .average = 543.34343, + }; + + ni.number = 58; + + int dynamic_array[ni.number]; + dynamic_array[0] = argv[0][0]; + dynamic_array[ni.number - 1] = 543; + + // work around unused variable warnings + ok |= (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == '\''x'\'' + || dynamic_array[ni.number - 1] != 543); +' + +# Test code for whether the C compiler supports C11 (global declarations) +ac_c_conftest_c11_globals=' +/* Does the compiler advertise C11 conformance? */ +#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112L +# error "Compiler does not advertise C11 conformance" +#endif + +// Check _Alignas. +char _Alignas (double) aligned_as_double; +char _Alignas (0) no_special_alignment; +extern char aligned_as_int; +char _Alignas (0) _Alignas (int) aligned_as_int; + +// Check _Alignof. +enum +{ + int_alignment = _Alignof (int), + int_array_alignment = _Alignof (int[100]), + char_alignment = _Alignof (char) +}; +_Static_assert (0 < -_Alignof (int), "_Alignof is signed"); + +// Check _Noreturn. +int _Noreturn does_not_return (void) { for (;;) continue; } + +// Check _Static_assert. +struct test_static_assert +{ + int x; + _Static_assert (sizeof (int) <= sizeof (long int), + "_Static_assert does not work in struct"); + long int y; +}; + +// Check UTF-8 literals. +#define u8 syntax error! +char const utf8_literal[] = u8"happens to be ASCII" "another string"; + +// Check duplicate typedefs. +typedef long *long_ptr; +typedef long int *long_ptr; +typedef long_ptr long_ptr; + +// Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1. +struct anonymous +{ + union { + struct { int i; int j; }; + struct { int k; long int l; } w; + }; + int m; +} v1; +' + +# Test code for whether the C compiler supports C11 (body of main). +ac_c_conftest_c11_main=' + _Static_assert ((offsetof (struct anonymous, i) + == offsetof (struct anonymous, w.k)), + "Anonymous union alignment botch"); + v1.i = 2; + v1.w.k = 5; + ok |= v1.i != 5; +' + +# Test code for whether the C compiler supports C11 (complete). +ac_c_conftest_c11_program="${ac_c_conftest_c89_globals} +${ac_c_conftest_c99_globals} +${ac_c_conftest_c11_globals} + +int +main (int argc, char **argv) +{ + int ok = 0; + ${ac_c_conftest_c89_main} + ${ac_c_conftest_c99_main} + ${ac_c_conftest_c11_main} + return ok; +} +" + +# Test code for whether the C compiler supports C99 (complete). +ac_c_conftest_c99_program="${ac_c_conftest_c89_globals} +${ac_c_conftest_c99_globals} + +int +main (int argc, char **argv) +{ + int ok = 0; + ${ac_c_conftest_c89_main} + ${ac_c_conftest_c99_main} + return ok; +} +" + +# Test code for whether the C compiler supports C89 (complete). +ac_c_conftest_c89_program="${ac_c_conftest_c89_globals} + +int +main (int argc, char **argv) +{ + int ok = 0; + ${ac_c_conftest_c89_main} + return ok; +} +" + +# Test code for whether the C++ compiler supports C++98 (global declarations) +ac_cxx_conftest_cxx98_globals=' +// Does the compiler advertise C++98 conformance? +#if !defined __cplusplus || __cplusplus < 199711L +# error "Compiler does not advertise C++98 conformance" +#endif + +// These inclusions are to reject old compilers that +// lack the unsuffixed header files. +#include +#include + +// and are *not* freestanding headers in C++98. +extern void assert (int); +namespace std { + extern int strcmp (const char *, const char *); +} + +// Namespaces, exceptions, and templates were all added after "C++ 2.0". +using std::exception; +using std::strcmp; + +namespace { + +void test_exception_syntax() +{ + try { + throw "test"; + } catch (const char *s) { + // Extra parentheses suppress a warning when building autoconf itself, + // due to lint rules shared with more typical C programs. + assert (!(strcmp) (s, "test")); + } +} + +template struct test_template +{ + T const val; + explicit test_template(T t) : val(t) {} + template T add(U u) { return static_cast(u) + val; } +}; + +} // anonymous namespace +' + +# Test code for whether the C++ compiler supports C++98 (body of main) +ac_cxx_conftest_cxx98_main=' + assert (argc); + assert (! argv[0]); +{ + test_exception_syntax (); + test_template tt (2.0); + assert (tt.add (4) == 6.0); + assert (true && !false); +} +' + +# Test code for whether the C++ compiler supports C++11 (global declarations) +ac_cxx_conftest_cxx11_globals=' +// Does the compiler advertise C++ 2011 conformance? +#if !defined __cplusplus || __cplusplus < 201103L +# error "Compiler does not advertise C++11 conformance" +#endif + +namespace cxx11test +{ + constexpr int get_val() { return 20; } + + struct testinit + { + int i; + double d; + }; + + class delegate + { + public: + delegate(int n) : n(n) {} + delegate(): delegate(2354) {} + + virtual int getval() { return this->n; }; + protected: + int n; + }; + + class overridden : public delegate + { + public: + overridden(int n): delegate(n) {} + virtual int getval() override final { return this->n * 2; } + }; + + class nocopy + { + public: + nocopy(int i): i(i) {} + nocopy() = default; + nocopy(const nocopy&) = delete; + nocopy & operator=(const nocopy&) = delete; + private: + int i; + }; + + // for testing lambda expressions + template Ret eval(Fn f, Ret v) + { + return f(v); + } + + // for testing variadic templates and trailing return types + template auto sum(V first) -> V + { + return first; + } + template auto sum(V first, Args... rest) -> V + { + return first + sum(rest...); + } +} +' + +# Test code for whether the C++ compiler supports C++11 (body of main) +ac_cxx_conftest_cxx11_main=' +{ + // Test auto and decltype + auto a1 = 6538; + auto a2 = 48573953.4; + auto a3 = "String literal"; + + int total = 0; + for (auto i = a3; *i; ++i) { total += *i; } + + decltype(a2) a4 = 34895.034; +} +{ + // Test constexpr + short sa[cxx11test::get_val()] = { 0 }; +} +{ + // Test initializer lists + cxx11test::testinit il = { 4323, 435234.23544 }; +} +{ + // Test range-based for + int array[] = {9, 7, 13, 15, 4, 18, 12, 10, 5, 3, + 14, 19, 17, 8, 6, 20, 16, 2, 11, 1}; + for (auto &x : array) { x += 23; } +} +{ + // Test lambda expressions + using cxx11test::eval; + assert (eval ([](int x) { return x*2; }, 21) == 42); + double d = 2.0; + assert (eval ([&](double x) { return d += x; }, 3.0) == 5.0); + assert (d == 5.0); + assert (eval ([=](double x) mutable { return d += x; }, 4.0) == 9.0); + assert (d == 5.0); +} +{ + // Test use of variadic templates + using cxx11test::sum; + auto a = sum(1); + auto b = sum(1, 2); + auto c = sum(1.0, 2.0, 3.0); +} +{ + // Test constructor delegation + cxx11test::delegate d1; + cxx11test::delegate d2(); + cxx11test::delegate d3(45); +} +{ + // Test override and final + cxx11test::overridden o1(55464); +} +{ + // Test nullptr + char *c = nullptr; +} +{ + // Test template brackets + test_template<::test_template> v(test_template(12)); +} +{ + // Unicode literals + char const *utf8 = u8"UTF-8 string \u2500"; + char16_t const *utf16 = u"UTF-8 string \u2500"; + char32_t const *utf32 = U"UTF-32 string \u2500"; +} +' + +# Test code for whether the C compiler supports C++11 (complete). +ac_cxx_conftest_cxx11_program="${ac_cxx_conftest_cxx98_globals} +${ac_cxx_conftest_cxx11_globals} + +int +main (int argc, char **argv) +{ + int ok = 0; + ${ac_cxx_conftest_cxx98_main} + ${ac_cxx_conftest_cxx11_main} + return ok; +} +" + +# Test code for whether the C compiler supports C++98 (complete). +ac_cxx_conftest_cxx98_program="${ac_cxx_conftest_cxx98_globals} +int +main (int argc, char **argv) +{ + int ok = 0; + ${ac_cxx_conftest_cxx98_main} + return ok; +} +" + +as_fn_append ac_header_c_list " stdio.h stdio_h HAVE_STDIO_H" +as_fn_append ac_header_c_list " stdlib.h stdlib_h HAVE_STDLIB_H" +as_fn_append ac_header_c_list " string.h string_h HAVE_STRING_H" +as_fn_append ac_header_c_list " inttypes.h inttypes_h HAVE_INTTYPES_H" +as_fn_append ac_header_c_list " stdint.h stdint_h HAVE_STDINT_H" +as_fn_append ac_header_c_list " strings.h strings_h HAVE_STRINGS_H" +as_fn_append ac_header_c_list " sys/stat.h sys_stat_h HAVE_SYS_STAT_H" +as_fn_append ac_header_c_list " sys/types.h sys_types_h HAVE_SYS_TYPES_H" +as_fn_append ac_header_c_list " unistd.h unistd_h HAVE_UNISTD_H" + +# Auxiliary files required by this configure script. +ac_aux_files="ltmain.sh compile missing install-sh config.guess config.sub" + +# Locations in which to look for auxiliary files. +ac_aux_dir_candidates="${srcdir}${PATH_SEPARATOR}${srcdir}/..${PATH_SEPARATOR}${srcdir}/../.." + +# Search for a directory containing all of the required auxiliary files, +# $ac_aux_files, from the $PATH-style list $ac_aux_dir_candidates. +# If we don't find one directory that contains all the files we need, +# we report the set of missing files from the *first* directory in +# $ac_aux_dir_candidates and give up. +ac_missing_aux_files="" +ac_first_candidate=: +printf "%s\n" "$as_me:${as_lineno-$LINENO}: looking for aux files: $ac_aux_files" >&5 +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in $ac_aux_dir_candidates +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + as_found=: + + printf "%s\n" "$as_me:${as_lineno-$LINENO}: trying $as_dir" >&5 + ac_aux_dir_found=yes + ac_install_sh= + for ac_aux in $ac_aux_files + do + # As a special case, if "install-sh" is required, that requirement + # can be satisfied by any of "install-sh", "install.sh", or "shtool", + # and $ac_install_sh is set appropriately for whichever one is found. + if test x"$ac_aux" = x"install-sh" + then + if test -f "${as_dir}install-sh"; then + printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install-sh found" >&5 + ac_install_sh="${as_dir}install-sh -c" + elif test -f "${as_dir}install.sh"; then + printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install.sh found" >&5 + ac_install_sh="${as_dir}install.sh -c" + elif test -f "${as_dir}shtool"; then + printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}shtool found" >&5 + ac_install_sh="${as_dir}shtool install -c" + else + ac_aux_dir_found=no + if $ac_first_candidate; then + ac_missing_aux_files="${ac_missing_aux_files} install-sh" + else + break + fi + fi + else + if test -f "${as_dir}${ac_aux}"; then + printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}${ac_aux} found" >&5 + else + ac_aux_dir_found=no + if $ac_first_candidate; then + ac_missing_aux_files="${ac_missing_aux_files} ${ac_aux}" + else + break + fi + fi + fi + done + if test "$ac_aux_dir_found" = yes; then + ac_aux_dir="$as_dir" + break + fi + ac_first_candidate=false + + as_found=false +done +IFS=$as_save_IFS +if $as_found +then : + +else case e in #( + e) as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5 ;; +esac +fi + + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +if test -f "${ac_aux_dir}config.guess"; then + ac_config_guess="$SHELL ${ac_aux_dir}config.guess" +fi +if test -f "${ac_aux_dir}config.sub"; then + ac_config_sub="$SHELL ${ac_aux_dir}config.sub" +fi +if test -f "$ac_aux_dir/configure"; then + ac_configure="$SHELL ${ac_aux_dir}configure" +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' was set to '$ac_old_val' in the previous run" >&5 +printf "%s\n" "$as_me: error: '$ac_var' was set to '$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' was not set in the previous run" >&5 +printf "%s\n" "$as_me: error: '$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' has changed since the previous run:" >&5 +printf "%s\n" "$as_me: error: '$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in '$ac_var' since the previous run:" >&5 +printf "%s\n" "$as_me: warning: ignoring whitespace changes in '$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: '$ac_old_val'" >&5 +printf "%s\n" "$as_me: former value: '$ac_old_val'" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: '$ac_new_val'" >&5 +printf "%s\n" "$as_me: current value: '$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`printf "%s\n" "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run '${MAKE-make} distclean' and/or 'rm $cache_file' + and start over" "$LINENO" 5 +fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + +# Specify directory where m4 macros may be found. + + +# +# Libtool library revision control info +# +LIBRARY_CURRENT=2 +LIBRARY_REVISION=18 +LIBRARY_AGE=0 + + +# Obtain system type by running config.guess + + + + # Make sure we can run config.sub. +$SHELL "${ac_aux_dir}config.sub" sun4 >/dev/null 2>&1 || + as_fn_error $? "cannot run $SHELL ${ac_aux_dir}config.sub" "$LINENO" 5 + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 +printf %s "checking build system type... " >&6; } +if test ${ac_cv_build+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) ac_build_alias=$build_alias +test "x$ac_build_alias" = x && + ac_build_alias=`$SHELL "${ac_aux_dir}config.guess"` +test "x$ac_build_alias" = x && + as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 +ac_cv_build=`$SHELL "${ac_aux_dir}config.sub" $ac_build_alias` || + as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $ac_build_alias failed" "$LINENO" 5 + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 +printf "%s\n" "$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; +esac +build=$ac_cv_build +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_build +shift +build_cpu=$1 +build_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +build_os=$* +IFS=$ac_save_IFS +case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 +printf %s "checking host system type... " >&6; } +if test ${ac_cv_host+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build +else + ac_cv_host=`$SHELL "${ac_aux_dir}config.sub" $host_alias` || + as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $host_alias failed" "$LINENO" 5 +fi + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 +printf "%s\n" "$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; +esac +host=$ac_cv_host +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_host +shift +host_cpu=$1 +host_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +host_os=$* +IFS=$ac_save_IFS +case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac + + + +am__api_version='1.18' + + + # Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +printf %s "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if test ${ac_cv_path_install+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + # Account for fact that we put trailing slashes in our PATH walk. +case $as_dir in #(( + ./ | /[cC]/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && + grep dspmsg "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir/" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + fi + done + done + ;; +esac + + done +IFS=$as_save_IFS + +rm -rf conftest.one conftest.two conftest.dir + ;; +esac +fi + if test ${ac_cv_path_install+y}; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +printf "%s\n" "$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether sleep supports fractional seconds" >&5 +printf %s "checking whether sleep supports fractional seconds... " >&6; } +if test ${am_cv_sleep_fractional_seconds+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if sleep 0.001 2>/dev/null +then : + am_cv_sleep_fractional_seconds=yes +else case e in #( + e) am_cv_sleep_fractional_seconds=no ;; +esac +fi + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_sleep_fractional_seconds" >&5 +printf "%s\n" "$am_cv_sleep_fractional_seconds" >&6; } + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking filesystem timestamp resolution" >&5 +printf %s "checking filesystem timestamp resolution... " >&6; } +if test ${am_cv_filesystem_timestamp_resolution+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) # Default to the worst case. +am_cv_filesystem_timestamp_resolution=2 + +# Only try to go finer than 1 sec if sleep can do it. +# Don't try 1 sec, because if 0.01 sec and 0.1 sec don't work, +# - 1 sec is not much of a win compared to 2 sec, and +# - it takes 2 seconds to perform the test whether 1 sec works. +# +# Instead, just use the default 2s on platforms that have 1s resolution, +# accept the extra 1s delay when using $sleep in the Automake tests, in +# exchange for not incurring the 2s delay for running the test for all +# packages. +# +am_try_resolutions= +if test "$am_cv_sleep_fractional_seconds" = yes; then + # Even a millisecond often causes a bunch of false positives, + # so just try a hundredth of a second. The time saved between .001 and + # .01 is not terribly consequential. + am_try_resolutions="0.01 0.1 $am_try_resolutions" +fi + +# In order to catch current-generation FAT out, we must *modify* files +# that already exist; the *creation* timestamp is finer. Use names +# that make ls -t sort them differently when they have equal +# timestamps than when they have distinct timestamps, keeping +# in mind that ls -t prints the *newest* file first. +rm -f conftest.ts? +: > conftest.ts1 +: > conftest.ts2 +: > conftest.ts3 + +# Make sure ls -t actually works. Do 'set' in a subshell so we don't +# clobber the current shell's arguments. (Outer-level square brackets +# are removed by m4; they're present so that m4 does not expand +# ; be careful, easy to get confused.) +if ( + set X `ls -t conftest.ts[12]` && + { + test "$*" != "X conftest.ts1 conftest.ts2" || + test "$*" != "X conftest.ts2 conftest.ts1"; + } +); then :; else + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + printf "%s\n" ""Bad output from ls -t: \"`ls -t conftest.ts[12]`\""" >&5 + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} +as_fn_error $? "ls -t produces unexpected output. +Make sure there is not a broken ls alias in your environment. +See 'config.log' for more details" "$LINENO" 5; } +fi + +for am_try_res in $am_try_resolutions; do + # Any one fine-grained sleep might happen to cross the boundary + # between two values of a coarser actual resolution, but if we do + # two fine-grained sleeps in a row, at least one of them will fall + # entirely within a coarse interval. + echo alpha > conftest.ts1 + sleep $am_try_res + echo beta > conftest.ts2 + sleep $am_try_res + echo gamma > conftest.ts3 + + # We assume that 'ls -t' will make use of high-resolution + # timestamps if the operating system supports them at all. + if (set X `ls -t conftest.ts?` && + test "$2" = conftest.ts3 && + test "$3" = conftest.ts2 && + test "$4" = conftest.ts1); then + # + # Ok, ls -t worked. If we're at a resolution of 1 second, we're done, + # because we don't need to test make. + make_ok=true + if test $am_try_res != 1; then + # But if we've succeeded so far with a subsecond resolution, we + # have one more thing to check: make. It can happen that + # everything else supports the subsecond mtimes, but make doesn't; + # notably on macOS, which ships make 3.81 from 2006 (the last one + # released under GPLv2). https://bugs.gnu.org/68808 + # + # We test $MAKE if it is defined in the environment, else "make". + # It might get overridden later, but our hope is that in practice + # it does not matter: it is the system "make" which is (by far) + # the most likely to be broken, whereas if the user overrides it, + # probably they did so with a better, or at least not worse, make. + # https://lists.gnu.org/archive/html/automake/2024-06/msg00051.html + # + # Create a Makefile (real tab character here): + rm -f conftest.mk + echo 'conftest.ts1: conftest.ts2' >conftest.mk + echo ' touch conftest.ts2' >>conftest.mk + # + # Now, running + # touch conftest.ts1; touch conftest.ts2; make + # should touch ts1 because ts2 is newer. This could happen by luck, + # but most often, it will fail if make's support is insufficient. So + # test for several consecutive successes. + # + # (We reuse conftest.ts[12] because we still want to modify existing + # files, not create new ones, per above.) + n=0 + make=${MAKE-make} + until test $n -eq 3; do + echo one > conftest.ts1 + sleep $am_try_res + echo two > conftest.ts2 # ts2 should now be newer than ts1 + if $make -f conftest.mk | grep 'up to date' >/dev/null; then + make_ok=false + break # out of $n loop + fi + n=`expr $n + 1` + done + fi + # + if $make_ok; then + # Everything we know to check worked out, so call this resolution good. + am_cv_filesystem_timestamp_resolution=$am_try_res + break # out of $am_try_res loop + fi + # Otherwise, we'll go on to check the next resolution. + fi +done +rm -f conftest.ts? +# (end _am_filesystem_timestamp_resolution) + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_filesystem_timestamp_resolution" >&5 +printf "%s\n" "$am_cv_filesystem_timestamp_resolution" >&6; } + +# This check should not be cached, as it may vary across builds of +# different projects. +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 +printf %s "checking whether build environment is sane... " >&6; } +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[\\\"\#\$\&\'\`$am_lf]*) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; +esac +case $srcdir in + *[\\\"\#\$\&\'\`$am_lf\ \ ]*) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; +esac + +# Do 'set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +am_build_env_is_sane=no +am_has_slept=no +rm -f conftest.file +for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + if ( + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + test "$2" = conftest.file + ); then + am_build_env_is_sane=yes + break + fi + # Just in case. + sleep "$am_cv_filesystem_timestamp_resolution" + am_has_slept=yes +done + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_build_env_is_sane" >&5 +printf "%s\n" "$am_build_env_is_sane" >&6; } +if test "$am_build_env_is_sane" = no; then + as_fn_error $? "newly created file is older than distributed files! +Check your system clock" "$LINENO" 5 +fi + +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if test -e conftest.file || grep 'slept: no' conftest.file >/dev/null 2>&1 +then : + +else case e in #( + e) ( sleep "$am_cv_filesystem_timestamp_resolution" ) & + am_sleep_pid=$! + ;; +esac +fi + +rm -f conftest.file + +test "$program_prefix" != NONE && + program_transform_name="s&^&$program_prefix&;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s&\$&$program_suffix&;$program_transform_name" +# Double any \ or $. +# By default was 's,x,x', remove it if useless. +ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' +program_transform_name=`printf "%s\n" "$program_transform_name" | sed "$ac_script"` + + +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` + + + if test x"${MISSING+set}" != xset; then + MISSING="\${SHELL} '$am_aux_dir/missing'" +fi +# Use eval to expand $SHELL +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " +else + am_missing_run= + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 +printf "%s\n" "$as_me: WARNING: 'missing' script is too old or missing" >&2;} +fi + +if test x"${install_sh+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi + +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the 'STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_STRIP+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi ;; +esac +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +printf "%s\n" "$STRIP" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_STRIP+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi ;; +esac +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +printf "%s\n" "$ac_ct_STRIP" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a race-free mkdir -p" >&5 +printf %s "checking for a race-free mkdir -p... " >&6; } +if test -z "$MKDIR_P"; then + if test ${ac_cv_path_mkdir+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in mkdir gmkdir; do + for ac_exec_ext in '' $ac_executable_extensions; do + as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext" || continue + case `"$as_dir$ac_prog$ac_exec_ext" --version 2>&1` in #( + 'mkdir ('*'coreutils) '* | \ + *'BusyBox '* | \ + 'mkdir (fileutils) '4.1*) + ac_cv_path_mkdir=$as_dir$ac_prog$ac_exec_ext + break 3;; + esac + done + done + done +IFS=$as_save_IFS + ;; +esac +fi + + test -d ./--version && rmdir ./--version + if test ${ac_cv_path_mkdir+y}; then + MKDIR_P="$ac_cv_path_mkdir -p" + else + # As a last resort, use plain mkdir -p, + # in the hope it doesn't have the bugs of ancient mkdir. + MKDIR_P='mkdir -p' + fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 +printf "%s\n" "$MKDIR_P" >&6; } + +for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_AWK+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_AWK="$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi ;; +esac +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +printf "%s\n" "$AWK" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$AWK" && break +done + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +printf %s "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`printf "%s\n" "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if eval test \${ac_cv_prog_make_${ac_make}_set+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make ;; +esac +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + SET_MAKE= +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + +rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null + +AM_DEFAULT_VERBOSITY=1 +# Check whether --enable-silent-rules was given. +if test ${enable_silent_rules+y} +then : + enableval=$enable_silent_rules; +fi + +am_make=${MAKE-make} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 +printf %s "checking whether $am_make supports nested variables... " >&6; } +if test ${am_cv_make_support_nested_variables+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if printf "%s\n" 'TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 +printf "%s\n" "$am_cv_make_support_nested_variables" >&6; } +AM_BACKSLASH='\' + +am__rm_f_notfound= +if (rm -f && rm -fr && rm -rf) 2>/dev/null +then : + +else case e in #( + e) am__rm_f_notfound='""' ;; +esac +fi + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking xargs -n works" >&5 +printf %s "checking xargs -n works... " >&6; } +if test ${am_cv_xargs_n_works+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test "`echo 1 2 3 | xargs -n2 echo`" = "1 2 +3" +then : + am_cv_xargs_n_works=yes +else case e in #( + e) am_cv_xargs_n_works=no ;; +esac +fi ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_xargs_n_works" >&5 +printf "%s\n" "$am_cv_xargs_n_works" >&6; } +if test "$am_cv_xargs_n_works" = yes +then : + am__xargs_n='xargs -n' +else case e in #( + e) am__xargs_n='am__xargs_n () { shift; sed "s/ /\\n/g" | while read am__xargs_n_arg; do "" "$am__xargs_n_arg"; done; }' + ;; +esac +fi + +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + am__isrc=' -I$(srcdir)' + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi + + +# Define the identity of the package. + PACKAGE='lcms2' + VERSION='2.19' + + +# Some tools Automake needs. + +ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} + + +AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} + + +AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} + + +AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} + + +MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} + +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# +# +mkdir_p='$(MKDIR_P)' + +# We need awk for the "check" target (and possibly the TAP driver). The +# system "awk" is bad on some platforms. +# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AMTAR='$${TAR-tar}' + + +# We'll loop over all known methods to create a tar archive until one works. +_am_tools='gnutar plaintar pax cpio none' + +# The POSIX 1988 'ustar' format is defined with fixed-size fields. + # There is notably a 21 bits limit for the UID and the GID. In fact, + # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 + # and bug#13588). + am_max_uid=2097151 # 2^21 - 1 + am_max_gid=$am_max_uid + # The $UID and $GID variables are not portable, so we need to resort + # to the POSIX-mandated id(1) utility. Errors in the 'id' calls + # below are definitely unexpected, so allow the users to see them + # (that is, avoid stderr redirection). + am_uid=`id -u || echo unknown` + am_gid=`id -g || echo unknown` + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether UID '$am_uid' is supported by ustar format" >&5 +printf %s "checking whether UID '$am_uid' is supported by ustar format... " >&6; } + if test x$am_uid = xunknown; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: ancient id detected; assuming current UID is ok, but dist-ustar might not work" >&5 +printf "%s\n" "$as_me: WARNING: ancient id detected; assuming current UID is ok, but dist-ustar might not work" >&2;} + elif test $am_uid -le $am_max_uid; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + _am_tools=none + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether GID '$am_gid' is supported by ustar format" >&5 +printf %s "checking whether GID '$am_gid' is supported by ustar format... " >&6; } + if test x$gm_gid = xunknown; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: ancient id detected; assuming current GID is ok, but dist-ustar might not work" >&5 +printf "%s\n" "$as_me: WARNING: ancient id detected; assuming current GID is ok, but dist-ustar might not work" >&2;} + elif test $am_gid -le $am_max_gid; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + _am_tools=none + fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to create a ustar tar archive" >&5 +printf %s "checking how to create a ustar tar archive... " >&6; } + + # Go ahead even if we have the value already cached. We do so because we + # need to set the values for the 'am__tar' and 'am__untar' variables. + _am_tools=${am_cv_prog_tar_ustar-$_am_tools} + + for _am_tool in $_am_tools; do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; do + { echo "$as_me:$LINENO: $_am_tar --version" >&5 + ($_am_tar --version) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && break + done + am__tar="$_am_tar --format=ustar -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=ustar -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x ustar -w "$$tardir"' + am__tar_='pax -L -x ustar -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H ustar -L' + am__tar_='find "$tardir" -print | cpio -o -H ustar -L' + am__untar='cpio -i -H ustar -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac + + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_ustar}" && break + + # tar/untar a dummy directory, and stop if the command works. + rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + { echo "$as_me:$LINENO: tardir=conftest.dir && eval $am__tar_ >conftest.tar" >&5 + (tardir=conftest.dir && eval $am__tar_ >conftest.tar) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + rm -rf conftest.dir + if test -s conftest.tar; then + { echo "$as_me:$LINENO: $am__untar &5 + ($am__untar &5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + { echo "$as_me:$LINENO: cat conftest.dir/file" >&5 + (cat conftest.dir/file) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + grep GrepMe conftest.dir/file >/dev/null 2>&1 && break + fi + done + rm -rf conftest.dir + + if test ${am_cv_prog_tar_ustar+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) am_cv_prog_tar_ustar=$_am_tool ;; +esac +fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_tar_ustar" >&5 +printf "%s\n" "$am_cv_prog_tar_ustar" >&6; } + + + + + +# Variables for tags utilities; see am/tags.am +if test -z "$CTAGS"; then + CTAGS=ctags +fi + +if test -z "$ETAGS"; then + ETAGS=etags +fi + +if test -z "$CSCOPE"; then + CSCOPE=cscope +fi + + + + + + + + + +# Check for programs + + + + + + + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi ;; +esac +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CC+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi ;; +esac +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +printf "%s\n" "$ac_ct_CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi ;; +esac +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@" + fi +fi +fi ;; +esac +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi ;; +esac +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CC+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi ;; +esac +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +printf "%s\n" "$ac_ct_CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args. +set dummy ${ac_tool_prefix}clang; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}clang" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi ;; +esac +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "clang", so it can be a program name with args. +set dummy clang; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CC+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="clang" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi ;; +esac +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +printf "%s\n" "$ac_ct_CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +fi + + +test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See 'config.log' for more details" "$LINENO" 5; } + +# Provide some information about the compiler. +printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion -version; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +printf %s "checking whether the C compiler works... " >&6; } +ac_link_default=`printf "%s\n" "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { { ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +then : + # Autoconf-2.13 could set the ac_cv_exeext variable to 'no'. +# So ignore a value of 'no', otherwise this would lead to 'EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test ${ac_cv_exeext+y} && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an '-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else case e in #( + e) ac_file='' ;; +esac +fi +if test -z "$ac_file" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} +as_fn_error 77 "C compiler cannot create executables +See 'config.log' for more details" "$LINENO" 5; } +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +printf %s "checking for C compiler default output file name... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +printf "%s\n" "$ac_file" >&6; } +ac_exeext=$ac_cv_exeext + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +printf %s "checking for suffix of executables... " >&6; } +if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +then : + # If both 'conftest.exe' and 'conftest' are 'present' (well, observable) +# catch 'conftest.exe'. For instance with Cygwin, 'ls conftest' will +# work properly (i.e., refer to 'conftest.exe'), while it won't with +# 'rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else case e in #( + e) { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of executables: cannot compile and link +See 'config.log' for more details" "$LINENO" 5; } ;; +esac +fi +rm -f conftest conftest$ac_cv_exeext +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +printf "%s\n" "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main (void) +{ +FILE *f = fopen ("conftest.out", "w"); + if (!f) + return 1; + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +printf %s "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} +as_fn_error 77 "cannot run C compiled programs. +If you meant to cross compile, use '--host'. +See 'config.log' for more details" "$LINENO" 5; } + fi + fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +printf "%s\n" "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext \ + conftest.o conftest.obj conftest.out +ac_clean_files=$ac_clean_files_save +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +printf %s "checking for suffix of object files... " >&6; } +if test ${ac_cv_objext+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +then : + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else case e in #( + e) printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of object files: cannot compile +See 'config.log' for more details" "$LINENO" 5; } ;; +esac +fi +rm -f conftest.$ac_cv_objext conftest.$ac_ext ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +printf "%s\n" "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5 +printf %s "checking whether the compiler supports GNU C... " >&6; } +if test ${ac_cv_c_compiler_gnu+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_compiler_gnu=yes +else case e in #( + e) ac_compiler_gnu=no ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; } +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+y} +ac_save_CFLAGS=$CFLAGS +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +printf %s "checking whether $CC accepts -g... " >&6; } +if test ${ac_cv_prog_cc_g+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_g=yes +else case e in #( + e) CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + +else case e in #( + e) ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +printf "%s\n" "$ac_cv_prog_cc_g" >&6; } +if test $ac_test_CFLAGS; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +ac_prog_cc_stdc=no +if test x$ac_prog_cc_stdc = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5 +printf %s "checking for $CC option to enable C11 features... " >&6; } +if test ${ac_cv_prog_cc_c11+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) ac_cv_prog_cc_c11=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_c_conftest_c11_program +_ACEOF +for ac_arg in '' -std=gnu11 +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_c11=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cc_c11" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC ;; +esac +fi + +if test "x$ac_cv_prog_cc_c11" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else case e in #( + e) if test "x$ac_cv_prog_cc_c11" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 +printf "%s\n" "$ac_cv_prog_cc_c11" >&6; } + CC="$CC $ac_cv_prog_cc_c11" ;; +esac +fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 + ac_prog_cc_stdc=c11 ;; +esac +fi +fi +if test x$ac_prog_cc_stdc = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5 +printf %s "checking for $CC option to enable C99 features... " >&6; } +if test ${ac_cv_prog_cc_c99+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) ac_cv_prog_cc_c99=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_c_conftest_c99_program +_ACEOF +for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99= +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_c99=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cc_c99" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC ;; +esac +fi + +if test "x$ac_cv_prog_cc_c99" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else case e in #( + e) if test "x$ac_cv_prog_cc_c99" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 +printf "%s\n" "$ac_cv_prog_cc_c99" >&6; } + CC="$CC $ac_cv_prog_cc_c99" ;; +esac +fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 + ac_prog_cc_stdc=c99 ;; +esac +fi +fi +if test x$ac_prog_cc_stdc = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5 +printf %s "checking for $CC option to enable C89 features... " >&6; } +if test ${ac_cv_prog_cc_c89+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_c_conftest_c89_program +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC ;; +esac +fi + +if test "x$ac_cv_prog_cc_c89" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else case e in #( + e) if test "x$ac_cv_prog_cc_c89" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +printf "%s\n" "$ac_cv_prog_cc_c89" >&6; } + CC="$CC $ac_cv_prog_cc_c89" ;; +esac +fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 + ac_prog_cc_stdc=c89 ;; +esac +fi +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 +printf %s "checking whether $CC understands -c and -o together... " >&6; } +if test ${am_cv_prog_cc_c_o+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 + ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + # aligned with autoconf, so not including core; see bug#72225. + rm -f -r a.out a.exe b.out conftest.$ac_ext conftest.$ac_objext \ + conftest.dSYM conftest1.$ac_ext conftest1.$ac_objext conftest1.dSYM \ + conftest2.$ac_ext conftest2.$ac_objext conftest2.dSYM + unset am_i ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 +printf "%s\n" "$am_cv_prog_cc_c_o" >&6; } +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +DEPDIR="${am__leading_dot}deps" + +ac_config_commands="$ac_config_commands depfiles" + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5 +printf %s "checking whether ${MAKE-make} supports the include directive... " >&6; } +cat > confinc.mk << 'END' +am__doit: + @echo this is the am__doit target >confinc.out +.PHONY: am__doit +END +am__include="#" +am__quote= +# BSD make does it like this. +echo '.include "confinc.mk" # ignored' > confmf.BSD +# Other make implementations (GNU, Solaris 10, AIX) do it like this. +echo 'include confinc.mk # ignored' > confmf.GNU +_am_result=no +for s in GNU BSD; do + { echo "$as_me:$LINENO: ${MAKE-make} -f confmf.$s && cat confinc.out" >&5 + (${MAKE-make} -f confmf.$s && cat confinc.out) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + case $?:`cat confinc.out 2>/dev/null` in #( + '0:this is the am__doit target') : + case $s in #( + BSD) : + am__include='.include' am__quote='"' ;; #( + *) : + am__include='include' am__quote='' ;; +esac ;; #( + *) : + ;; +esac + if test "$am__include" != "#"; then + _am_result="yes ($s style)" + break + fi +done +rm -f confinc.* confmf.* +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5 +printf "%s\n" "${_am_result}" >&6; } + +# Check whether --enable-dependency-tracking was given. +if test ${enable_dependency_tracking+y} +then : + enableval=$enable_dependency_tracking; +fi + +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi + if test "x$enable_dependency_tracking" != xno; then + AMDEP_TRUE= + AMDEP_FALSE='#' +else + AMDEP_TRUE='#' + AMDEP_FALSE= +fi + + + +depcc="$CC" am_compiler_list= + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +printf %s "checking dependency style of $depcc... " >&6; } +if test ${am_cv_CC_dependencies_compiler_type+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thus: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +printf "%s\n" "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +printf %s "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if test ${ac_cv_prog_CPP+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) # Double quotes because $CC needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" cpp /lib/cpp + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO" +then : + +else case e in #( + e) # Broken: fails on valid input. +continue ;; +esac +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO" +then : + # Broken: success on invalid input. +continue +else case e in #( + e) # Passes both tests. +ac_preproc_ok=: +break ;; +esac +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of 'break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok +then : + break +fi + + done + ac_cv_prog_CPP=$CPP + ;; +esac +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +printf "%s\n" "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO" +then : + +else case e in #( + e) # Broken: fails on valid input. +continue ;; +esac +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO" +then : + # Broken: success on invalid input. +continue +else case e in #( + e) # Passes both tests. +ac_preproc_ok=: +break ;; +esac +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of 'break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok +then : + +else case e in #( + e) { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See 'config.log' for more details" "$LINENO" 5; } ;; +esac +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + + + + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +if test -z "$CXX"; then + if test -n "$CCC"; then + CXX=$CCC + else + if test -n "$ac_tool_prefix"; then + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC clang++ + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CXX+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -n "$CXX"; then + ac_cv_prog_CXX="$CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi ;; +esac +fi +CXX=$ac_cv_prog_CXX +if test -n "$CXX"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 +printf "%s\n" "$CXX" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$CXX" && break + done +fi +if test -z "$CXX"; then + ac_ct_CXX=$CXX + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC clang++ +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CXX+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -n "$ac_ct_CXX"; then + ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CXX="$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi ;; +esac +fi +ac_ct_CXX=$ac_cv_prog_ac_ct_CXX +if test -n "$ac_ct_CXX"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 +printf "%s\n" "$ac_ct_CXX" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$ac_ct_CXX" && break +done + + if test "x$ac_ct_CXX" = x; then + CXX="g++" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CXX=$ac_ct_CXX + fi +fi + + fi +fi +# Provide some information about the compiler. +printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C++" >&5 +printf %s "checking whether the compiler supports GNU C++... " >&6; } +if test ${ac_cv_cxx_compiler_gnu+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO" +then : + ac_compiler_gnu=yes +else case e in #( + e) ac_compiler_gnu=no ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +ac_cv_cxx_compiler_gnu=$ac_compiler_gnu + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 +printf "%s\n" "$ac_cv_cxx_compiler_gnu" >&6; } +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + +if test $ac_compiler_gnu = yes; then + GXX=yes +else + GXX= +fi +ac_test_CXXFLAGS=${CXXFLAGS+y} +ac_save_CXXFLAGS=$CXXFLAGS +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 +printf %s "checking whether $CXX accepts -g... " >&6; } +if test ${ac_cv_prog_cxx_g+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) ac_save_cxx_werror_flag=$ac_cxx_werror_flag + ac_cxx_werror_flag=yes + ac_cv_prog_cxx_g=no + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO" +then : + ac_cv_prog_cxx_g=yes +else case e in #( + e) CXXFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO" +then : + +else case e in #( + e) ac_cxx_werror_flag=$ac_save_cxx_werror_flag + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO" +then : + ac_cv_prog_cxx_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + ac_cxx_werror_flag=$ac_save_cxx_werror_flag ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 +printf "%s\n" "$ac_cv_prog_cxx_g" >&6; } +if test $ac_test_CXXFLAGS; then + CXXFLAGS=$ac_save_CXXFLAGS +elif test $ac_cv_prog_cxx_g = yes; then + if test "$GXX" = yes; then + CXXFLAGS="-g -O2" + else + CXXFLAGS="-g" + fi +else + if test "$GXX" = yes; then + CXXFLAGS="-O2" + else + CXXFLAGS= + fi +fi +ac_prog_cxx_stdcxx=no +if test x$ac_prog_cxx_stdcxx = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++11 features" >&5 +printf %s "checking for $CXX option to enable C++11 features... " >&6; } +if test ${ac_cv_prog_cxx_cxx11+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) ac_cv_prog_cxx_cxx11=no +ac_save_CXX=$CXX +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_cxx_conftest_cxx11_program +_ACEOF +for ac_arg in '' -std=gnu++11 -std=gnu++0x -std=c++11 -std=c++0x -qlanglvl=extended0x -AA +do + CXX="$ac_save_CXX $ac_arg" + if ac_fn_cxx_try_compile "$LINENO" +then : + ac_cv_prog_cxx_cxx11=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cxx_cxx11" != "xno" && break +done +rm -f conftest.$ac_ext +CXX=$ac_save_CXX ;; +esac +fi + +if test "x$ac_cv_prog_cxx_cxx11" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else case e in #( + e) if test "x$ac_cv_prog_cxx_cxx11" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx11" >&5 +printf "%s\n" "$ac_cv_prog_cxx_cxx11" >&6; } + CXX="$CXX $ac_cv_prog_cxx_cxx11" ;; +esac +fi + ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx11 + ac_prog_cxx_stdcxx=cxx11 ;; +esac +fi +fi +if test x$ac_prog_cxx_stdcxx = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++98 features" >&5 +printf %s "checking for $CXX option to enable C++98 features... " >&6; } +if test ${ac_cv_prog_cxx_cxx98+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) ac_cv_prog_cxx_cxx98=no +ac_save_CXX=$CXX +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_cxx_conftest_cxx98_program +_ACEOF +for ac_arg in '' -std=gnu++98 -std=c++98 -qlanglvl=extended -AA +do + CXX="$ac_save_CXX $ac_arg" + if ac_fn_cxx_try_compile "$LINENO" +then : + ac_cv_prog_cxx_cxx98=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cxx_cxx98" != "xno" && break +done +rm -f conftest.$ac_ext +CXX=$ac_save_CXX ;; +esac +fi + +if test "x$ac_cv_prog_cxx_cxx98" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else case e in #( + e) if test "x$ac_cv_prog_cxx_cxx98" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx98" >&5 +printf "%s\n" "$ac_cv_prog_cxx_cxx98" >&6; } + CXX="$CXX $ac_cv_prog_cxx_cxx98" ;; +esac +fi + ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx98 + ac_prog_cxx_stdcxx=cxx98 ;; +esac +fi +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +depcc="$CXX" am_compiler_list= + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +printf %s "checking dependency style of $depcc... " >&6; } +if test ${am_cv_CXX_dependencies_compiler_type+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CXX_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thus: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CXX_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CXX_dependencies_compiler_type=none +fi + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 +printf "%s\n" "$am_cv_CXX_dependencies_compiler_type" >&6; } +CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then + am__fastdepCXX_TRUE= + am__fastdepCXX_FALSE='#' +else + am__fastdepCXX_TRUE='#' + am__fastdepCXX_FALSE= +fi + + +case `pwd` in + *\ * | *\ *) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 +printf "%s\n" "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; +esac + + + +macro_version='2.5.4' +macro_revision='2.5.4' + + + + + + + + + + + + + + +ltmain=$ac_aux_dir/ltmain.sh + +# Backslashify metacharacters that are still active within +# double-quoted strings. +sed_quote_subst='s/\(["`$\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 +printf %s "checking how to print strings... " >&6; } +# Test print first, because it will be a builtin if present. +if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ + test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='print -r --' +elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='printf %s\n' +else + # Use this function as a fallback that always works. + func_fallback_echo () + { + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' + } + ECHO='func_fallback_echo' +fi + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "" +} + +case $ECHO in + printf*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: printf" >&5 +printf "%s\n" "printf" >&6; } ;; + print*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 +printf "%s\n" "print -r" >&6; } ;; + *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: cat" >&5 +printf "%s\n" "cat" >&6; } ;; +esac + + + + + + + + + + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 +printf %s "checking for a sed that does not truncate output... " >&6; } +if test ${ac_cv_path_SED+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for ac_i in 1 2 3 4 5 6 7; do + ac_script="$ac_script$as_nl$ac_script" + done + echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed + { ac_script=; unset ac_script;} + if test -z "$SED"; then + ac_path_SED_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in sed gsed + do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_SED="$as_dir$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_SED" || continue +# Check for GNU ac_path_SED and select it if it is found. + # Check for GNU $ac_path_SED +case `"$ac_path_SED" --version 2>&1` in #( +*GNU*) + ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; +#( +*) + ac_count=0 + printf %s 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + printf "%s\n" '' >> "conftest.nl" + "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_SED_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_SED="$ac_path_SED" + ac_path_SED_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_SED_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_SED"; then + as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 + fi +else + ac_cv_path_SED=$SED +fi + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 +printf "%s\n" "$ac_cv_path_SED" >&6; } + SED="$ac_cv_path_SED" + rm -f conftest.sed + +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" + + + + + + + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +printf %s "checking for grep that handles long lines and -e... " >&6; } +if test ${ac_cv_path_GREP+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in grep ggrep + do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_GREP" || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in #( +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +#( +*) + ac_count=0 + printf %s 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + printf "%s\n" 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_GREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_GREP=$GREP +fi + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +printf "%s\n" "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +printf %s "checking for egrep... " >&6; } +if test ${ac_cv_path_EGREP+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in egrep + do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_EGREP" || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in #( +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +#( +*) + ac_count=0 + printf %s 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + printf "%s\n" 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +printf "%s\n" "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + EGREP_TRADITIONAL=$EGREP + ac_cv_path_EGREP_TRADITIONAL=$EGREP + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 +printf %s "checking for fgrep... " >&6; } +if test ${ac_cv_path_FGREP+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 + then ac_cv_path_FGREP="$GREP -F" + else + if test -z "$FGREP"; then + ac_path_FGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in fgrep + do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_FGREP="$as_dir$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_FGREP" || continue +# Check for GNU ac_path_FGREP and select it if it is found. + # Check for GNU $ac_path_FGREP +case `"$ac_path_FGREP" --version 2>&1` in #( +*GNU*) + ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; +#( +*) + ac_count=0 + printf %s 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + printf "%s\n" 'FGREP' >> "conftest.nl" + "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_FGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_FGREP="$ac_path_FGREP" + ac_path_FGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_FGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_FGREP"; then + as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_FGREP=$FGREP +fi + + fi ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 +printf "%s\n" "$ac_cv_path_FGREP" >&6; } + FGREP="$ac_cv_path_FGREP" + + +test -z "$GREP" && GREP=grep + + + + + + + + + + + + + + + + + + + +# Check whether --with-gnu-ld was given. +if test ${with_gnu_ld+y} +then : + withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes +else case e in #( + e) with_gnu_ld=no ;; +esac +fi + +ac_prog=ld +if test yes = "$GCC"; then + # Check if gcc -print-prog-name=ld gives a path. + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +printf %s "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw* | *-*-windows*) + # gcc leaves a trailing carriage return, which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD=$ac_prog + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test yes = "$with_gnu_ld"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +printf %s "checking for GNU ld... " >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +printf %s "checking for non-GNU ld... " >&6; } +fi +if test ${lt_cv_path_LD+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -z "$LD"; then + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD=$ac_dir/$ac_prog + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &5 +printf "%s\n" "$LD" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +printf %s "checking if the linker ($LD) is GNU ld... " >&6; } +if test ${lt_cv_prog_gnu_ld+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 &5 +printf "%s\n" "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 +printf %s "checking for BSD- or MS-compatible name lister (nm)... " >&6; } +if test ${lt_cv_path_NM+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM=$NM +else + lt_nm_to_check=${ac_tool_prefix}nm + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + tmp_nm=$ac_dir/$lt_tmp_nm + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the 'sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty + case $build_os in + mingw* | windows*) lt_bad_file=conftest.nm/nofile ;; + *) lt_bad_file=/dev/null ;; + esac + case `"$tmp_nm" -B $lt_bad_file 2>&1 | $SED '1q'` in + *$lt_bad_file* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break 2 + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | $SED '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break 2 + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS=$lt_save_ifs + done + : ${lt_cv_path_NM=no} +fi ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 +printf "%s\n" "$lt_cv_path_NM" >&6; } +if test no != "$lt_cv_path_NM"; then + NM=$lt_cv_path_NM +else + # Didn't find any BSD compatible name lister, look for dumpbin. + if test -n "$DUMPBIN"; then : + # Let the user override the test. + else + if test -n "$ac_tool_prefix"; then + for ac_prog in dumpbin "link -dump" + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_DUMPBIN+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -n "$DUMPBIN"; then + ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi ;; +esac +fi +DUMPBIN=$ac_cv_prog_DUMPBIN +if test -n "$DUMPBIN"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 +printf "%s\n" "$DUMPBIN" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$DUMPBIN" && break + done +fi +if test -z "$DUMPBIN"; then + ac_ct_DUMPBIN=$DUMPBIN + for ac_prog in dumpbin "link -dump" +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_DUMPBIN+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -n "$ac_ct_DUMPBIN"; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi ;; +esac +fi +ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN +if test -n "$ac_ct_DUMPBIN"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 +printf "%s\n" "$ac_ct_DUMPBIN" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$ac_ct_DUMPBIN" && break +done + + if test "x$ac_ct_DUMPBIN" = x; then + DUMPBIN=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DUMPBIN=$ac_ct_DUMPBIN + fi +fi + + case `$DUMPBIN -symbols -headers /dev/null 2>&1 | $SED '1q'` in + *COFF*) + DUMPBIN="$DUMPBIN -symbols -headers" + ;; + *) + DUMPBIN=: + ;; + esac + fi + + if test : != "$DUMPBIN"; then + NM=$DUMPBIN + fi +fi +test -z "$NM" && NM=nm + + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 +printf %s "checking the name lister ($NM) interface... " >&6; } +if test ${lt_cv_nm_interface+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&5 + (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&5 + (eval echo "\"\$as_me:$LINENO: output\"" >&5) + cat conftest.out >&5 + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest* ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 +printf "%s\n" "$lt_cv_nm_interface" >&6; } + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 +printf %s "checking whether ln -s works... " >&6; } +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 +printf "%s\n" "no, using $LN_S" >&6; } +fi + +# find the maximum length of command line arguments +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 +printf %s "checking the maximum length of command line arguments... " >&6; } +if test ${lt_cv_sys_max_cmd_len+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) i=0 + teststring=ABCD + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu* | ironclad*) + # Under GNU Hurd and Ironclad, this test is not required because there + # is no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw* | windows* | cegcc*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + mint*) + # On MiNT this can take a long time and run out of memory. + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + darwin* | dragonfly* | freebsd* | midnightbsd* | netbsd* | openbsd*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + os2*) + # The test takes a long time on OS/2. + lt_cv_sys_max_cmd_len=8192 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | $SED 's/.*[ ]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len" && \ + test undefined != "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while { test X`env echo "$teststring$teststring" 2>/dev/null` \ + = "X$teststring$teststring"; } >/dev/null 2>&1 && + test 17 != "$i" # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= + # Add a significant safety factor because C++ compilers can tack on + # massive amounts of additional arguments before passing them to the + # linker. It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac + ;; +esac +fi + +if test -n "$lt_cv_sys_max_cmd_len"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 +printf "%s\n" "$lt_cv_sys_max_cmd_len" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none" >&5 +printf "%s\n" "none" >&6; } +fi +max_cmd_len=$lt_cv_sys_max_cmd_len + + + + + + +: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} + +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + lt_unset=unset +else + lt_unset=false +fi + + + + + +# test EBCDIC or ASCII +case `echo X|tr X '\101'` in + A) # ASCII based system + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr + lt_SP2NL='tr \040 \012' + lt_NL2SP='tr \015\012 \040\040' + ;; + *) # EBCDIC based system + lt_SP2NL='tr \100 \n' + lt_NL2SP='tr \r\n \100\100' + ;; +esac + + + + + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 +printf %s "checking how to convert $build file names to $host format... " >&6; } +if test ${lt_cv_to_host_file_cmd+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) case $host in + *-*-mingw* ) + case $build in + *-*-mingw* | *-*-windows* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 + ;; + esac + ;; + *-*-cygwin* ) + case $build in + *-*-mingw* | *-*-windows* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin + ;; + esac + ;; + * ) # unhandled hosts (and "normal" native builds) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; +esac + ;; +esac +fi + +to_host_file_cmd=$lt_cv_to_host_file_cmd +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 +printf "%s\n" "$lt_cv_to_host_file_cmd" >&6; } + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 +printf %s "checking how to convert $build file names to toolchain format... " >&6; } +if test ${lt_cv_to_tool_file_cmd+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) #assume ordinary cross tools, or native build. +lt_cv_to_tool_file_cmd=func_convert_file_noop +case $host in + *-*-mingw* | *-*-windows* ) + case $build in + *-*-mingw* | *-*-windows* ) # actually msys + lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 + ;; + esac + ;; +esac + ;; +esac +fi + +to_tool_file_cmd=$lt_cv_to_tool_file_cmd +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 +printf "%s\n" "$lt_cv_to_tool_file_cmd" >&6; } + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 +printf %s "checking for $LD option to reload object files... " >&6; } +if test ${lt_cv_ld_reload_flag+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) lt_cv_ld_reload_flag='-r' ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 +printf "%s\n" "$lt_cv_ld_reload_flag" >&6; } +reload_flag=$lt_cv_ld_reload_flag +case $reload_flag in +"" | " "*) ;; +*) reload_flag=" $reload_flag" ;; +esac +reload_cmds='$LD$reload_flag -o $output$reload_objs' +case $host_os in + cygwin* | mingw* | windows* | pw32* | cegcc*) + if test yes != "$GCC"; then + reload_cmds=false + fi + ;; + darwin*) + if test yes = "$GCC"; then + reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs' + else + reload_cmds='$LD$reload_flag -o $output$reload_objs' + fi + ;; +esac + + + + + + + + + +# Extract the first word of "file", so it can be a program name with args. +set dummy file; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_FILECMD+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -n "$FILECMD"; then + ac_cv_prog_FILECMD="$FILECMD" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_FILECMD="file" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_prog_FILECMD" && ac_cv_prog_FILECMD=":" +fi ;; +esac +fi +FILECMD=$ac_cv_prog_FILECMD +if test -n "$FILECMD"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $FILECMD" >&5 +printf "%s\n" "$FILECMD" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. +set dummy ${ac_tool_prefix}objdump; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_OBJDUMP+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -n "$OBJDUMP"; then + ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi ;; +esac +fi +OBJDUMP=$ac_cv_prog_OBJDUMP +if test -n "$OBJDUMP"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 +printf "%s\n" "$OBJDUMP" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OBJDUMP"; then + ac_ct_OBJDUMP=$OBJDUMP + # Extract the first word of "objdump", so it can be a program name with args. +set dummy objdump; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_OBJDUMP+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -n "$ac_ct_OBJDUMP"; then + ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OBJDUMP="objdump" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi ;; +esac +fi +ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP +if test -n "$ac_ct_OBJDUMP"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 +printf "%s\n" "$ac_ct_OBJDUMP" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_OBJDUMP" = x; then + OBJDUMP="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OBJDUMP=$ac_ct_OBJDUMP + fi +else + OBJDUMP="$ac_cv_prog_OBJDUMP" +fi + +test -z "$OBJDUMP" && OBJDUMP=objdump + + + + + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 +printf %s "checking how to recognize dependent libraries... " >&6; } +if test ${lt_cv_deplibs_check_method+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# 'unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'file_magic [[regex]]' -- check by looking for files in library path +# that responds to the $file_magic_cmd with a given extended regex. +# If you have 'file' or equivalent on your system and you're not sure +# whether 'pass_all' will *always* work, you probably want this one. + +case $host_os in +aix[4-9]*) + lt_cv_deplibs_check_method=pass_all + ;; + +beos*) + lt_cv_deplibs_check_method=pass_all + ;; + +bsdi[45]*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' + lt_cv_file_magic_cmd='$FILECMD -L' + lt_cv_file_magic_test_file=/shlib/libc.so + ;; + +cygwin*) + # func_win32_libid is a shell function defined in ltmain.sh + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + ;; + +mingw* | windows* | pw32*) + # Base MSYS/MinGW do not provide the 'file' command needed by + # func_win32_libid shell function, so use a weaker test based on 'objdump', + # unless we find 'file', for example because we are cross-compiling. + if ( file / ) >/dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + # Keep this pattern in sync with the one in func_win32_libid. + lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64|pe-aarch64)' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +cegcc*) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly* | midnightbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=$FILECMD + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +haiku*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=$FILECMD + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix[3-9]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +*-mlibc) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=$FILECMD + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +*nto* | *qnx*) + lt_cv_deplibs_check_method=pass_all + ;; + +openbsd*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +serenity*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +tpf*) + lt_cv_deplibs_check_method=pass_all + ;; +os2*) + lt_cv_deplibs_check_method=pass_all + ;; +esac + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 +printf "%s\n" "$lt_cv_deplibs_check_method" >&6; } + +file_magic_glob= +want_nocaseglob=no +if test "$build" = "$host"; then + case $host_os in + mingw* | windows* | pw32*) + if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then + want_nocaseglob=yes + else + file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` + fi + ;; + esac +fi + +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + + + + + + + + + + + + + + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. +set dummy ${ac_tool_prefix}dlltool; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_DLLTOOL+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -n "$DLLTOOL"; then + ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi ;; +esac +fi +DLLTOOL=$ac_cv_prog_DLLTOOL +if test -n "$DLLTOOL"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 +printf "%s\n" "$DLLTOOL" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DLLTOOL"; then + ac_ct_DLLTOOL=$DLLTOOL + # Extract the first word of "dlltool", so it can be a program name with args. +set dummy dlltool; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_DLLTOOL+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -n "$ac_ct_DLLTOOL"; then + ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DLLTOOL="dlltool" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi ;; +esac +fi +ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL +if test -n "$ac_ct_DLLTOOL"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 +printf "%s\n" "$ac_ct_DLLTOOL" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_DLLTOOL" = x; then + DLLTOOL="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DLLTOOL=$ac_ct_DLLTOOL + fi +else + DLLTOOL="$ac_cv_prog_DLLTOOL" +fi + +test -z "$DLLTOOL" && DLLTOOL=dlltool + + + + + + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 +printf %s "checking how to associate runtime and link libraries... " >&6; } +if test ${lt_cv_sharedlib_from_linklib_cmd+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) lt_cv_sharedlib_from_linklib_cmd='unknown' + +case $host_os in +cygwin* | mingw* | windows* | pw32* | cegcc*) + # two different shell functions defined in ltmain.sh; + # decide which one to use based on capabilities of $DLLTOOL + case `$DLLTOOL --help 2>&1` in + *--identify-strict*) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib + ;; + *) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback + ;; + esac + ;; +*) + # fallback: assume linklib IS sharedlib + lt_cv_sharedlib_from_linklib_cmd=$ECHO + ;; +esac + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 +printf "%s\n" "$lt_cv_sharedlib_from_linklib_cmd" >&6; } +sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd +test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_RANLIB+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi ;; +esac +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +printf "%s\n" "$RANLIB" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_RANLIB+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi ;; +esac +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +printf "%s\n" "$ac_ct_RANLIB" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi +else + RANLIB="$ac_cv_prog_RANLIB" +fi + +if test -n "$ac_tool_prefix"; then + for ac_prog in ar + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_AR+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_AR="$ac_tool_prefix$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi ;; +esac +fi +AR=$ac_cv_prog_AR +if test -n "$AR"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +printf "%s\n" "$AR" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$AR" && break + done +fi +if test -z "$AR"; then + ac_ct_AR=$AR + for ac_prog in ar +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_AR+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AR="$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi ;; +esac +fi +ac_ct_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 +printf "%s\n" "$ac_ct_AR" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$ac_ct_AR" && break +done + + if test "x$ac_ct_AR" = x; then + AR="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AR=$ac_ct_AR + fi +fi + +: ${AR=ar} + + + + + + +# Use ARFLAGS variable as AR's operation code to sync the variable naming with +# Automake. If both AR_FLAGS and ARFLAGS are specified, AR_FLAGS should have +# higher priority because that's what people were doing historically (setting +# ARFLAGS for automake and AR_FLAGS for libtool). FIXME: Make the AR_FLAGS +# variable obsoleted/removed. + +test ${AR_FLAGS+y} || AR_FLAGS=${ARFLAGS-cr} +lt_ar_flags=$AR_FLAGS + + + + + + +# Make AR_FLAGS overridable by 'make ARFLAGS='. Don't try to run-time override +# by AR_FLAGS because that was never working and AR_FLAGS is about to die. + + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 +printf %s "checking for archiver @FILE support... " >&6; } +if test ${lt_cv_ar_at_file+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) lt_cv_ar_at_file=no + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + echo conftest.$ac_objext > conftest.lst + lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 + (eval $lt_ar_try) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test 0 -eq "$ac_status"; then + # Ensure the archiver fails upon bogus file names. + rm -f conftest.$ac_objext libconftest.a + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 + (eval $lt_ar_try) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test 0 -ne "$ac_status"; then + lt_cv_ar_at_file=@ + fi + fi + rm -f conftest.* libconftest.a + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 +printf "%s\n" "$lt_cv_ar_at_file" >&6; } + +if test no = "$lt_cv_ar_at_file"; then + archiver_list_spec= +else + archiver_list_spec=$lt_cv_ar_at_file +fi + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_STRIP+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi ;; +esac +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +printf "%s\n" "$STRIP" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_STRIP+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi ;; +esac +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +printf "%s\n" "$ac_ct_STRIP" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +test -z "$STRIP" && STRIP=: + + + + + + + +test -z "$RANLIB" && RANLIB=: + + + + + + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" +fi + +case $host_os in + darwin*) + lock_old_archive_extraction=yes ;; + *) + lock_old_archive_extraction=no ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# Check for command to grab the raw symbol name followed by C symbol from nm. +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 +printf %s "checking command to parse $NM output from $compiler object... " >&6; } +if test ${lt_cv_sys_global_symbol_pipe+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[BCDEGRST]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([_A-Za-z][_A-Za-z0-9]*\)' + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[BCDT]' + ;; +cygwin* | mingw* | windows* | pw32* | cegcc*) + symcode='[ABCDGISTW]' + ;; +hpux*) + if test ia64 = "$host_cpu"; then + symcode='[ABCDEGRST]' + fi + ;; +irix* | nonstopux*) + symcode='[BCDEGRST]' + ;; +osf*) + symcode='[BCDEGQRST]' + ;; +solaris*) + symcode='[BCDRT]' + ;; +sco3.2v5*) + symcode='[DT]' + ;; +sysv4.2uw2*) + symcode='[DT]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[ABDT]' + ;; +sysv4) + symcode='[DFNSTU]' + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[ABCDGIRSTW]' ;; +esac + +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Gets list of data symbols to import. + lt_cv_sys_global_symbol_to_import="$SED -n -e 's/^I .* \(.*\)$/\1/p'" + # Adjust the below global symbol transforms to fixup imported variables. + lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" + lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" + lt_c_name_lib_hook="\ + -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ + -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" +else + # Disable hooks by default. + lt_cv_sys_global_symbol_to_import= + lt_cdecl_hook= + lt_c_name_hook= + lt_c_name_lib_hook= +fi + +# Transform an extracted symbol line into a proper C declaration. +# Some systems (esp. on ia64) link data and code symbols differently, +# so use this general approach. +lt_cv_sys_global_symbol_to_cdecl="$SED -n"\ +$lt_cdecl_hook\ +" -e 's/^T .* \(.*\)$/extern int \1();/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="$SED -n"\ +$lt_c_name_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" + +# Transform an extracted symbol line into symbol name with lib prefix and +# symbol address. +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="$SED -n"\ +$lt_c_name_lib_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'" + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw* | windows*) + opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# Try without a prefix underscore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function, + # D for any global variable and I for any imported variable. + # Also find C++ and __fastcall symbols from MSVC++ or ICC, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK '"\ +" {last_section=section; section=\$ 3};"\ +" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ +" /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ +" /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ +" {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ +" s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\ +" ' prfx=^$ac_symprfx" + else + lt_cv_sys_global_symbol_pipe="$SED -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi + lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | $SED '/ __gnu_lto/d'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(void); +void nm_test_func(void){} +#ifdef __cplusplus +} +#endif +int main(void){nm_test_var='a';nm_test_func();return(0);} +_LT_EOF + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + # Now try to grab the symbols. + nlist=conftest.nm + $ECHO "$as_me:$LINENO: $NM conftest.$ac_objext | $lt_cv_sys_global_symbol_pipe > $nlist" >&5 + if eval "$NM" conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist 2>&5 && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE +/* DATA imports from DLLs on WIN32 can't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT_DLSYM_CONST +#elif defined __osf__ +/* This system does not cope well with relocations in const data. */ +# define LT_DLSYM_CONST +#else +# define LT_DLSYM_CONST const +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +_LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + + cat <<_LT_EOF >> conftest.$ac_ext + +/* The mapping between symbol names and symbols. */ +LT_DLSYM_CONST struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + cat <<\_LT_EOF >> conftest.$ac_ext + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt__PROGRAM__LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif +_LT_EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_globsym_save_LIBS=$LIBS + lt_globsym_save_CFLAGS=$CFLAGS + LIBS=conftstm.$ac_objext + CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest$ac_exeext; then + pipe_works=yes + fi + LIBS=$lt_globsym_save_LIBS + CFLAGS=$lt_globsym_save_CFLAGS + else + echo "cannot find nm_test_func in $nlist" >&5 + fi + else + echo "cannot find nm_test_var in $nlist" >&5 + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 + fi + else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + fi + rm -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test yes = "$pipe_works"; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done + ;; +esac +fi + +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: failed" >&5 +printf "%s\n" "failed" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ok" >&5 +printf "%s\n" "ok" >&6; } +fi + +# Response file support. +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + nm_file_list_spec='@' +elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then + nm_file_list_spec='@' +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 +printf %s "checking for sysroot... " >&6; } + +# Check whether --with-sysroot was given. +if test ${with_sysroot+y} +then : + withval=$with_sysroot; +else case e in #( + e) with_sysroot=no ;; +esac +fi + + +lt_sysroot= +case $with_sysroot in #( + yes) + if test yes = "$GCC"; then + # Trim trailing / since we'll always append absolute paths and we want + # to avoid //, if only for less confusing output for the user. + lt_sysroot=`$CC --print-sysroot 2>/dev/null | $SED 's:/\+$::'` + fi + ;; #( + /*) + lt_sysroot=`echo "$with_sysroot" | $SED -e "$sed_quote_subst"` + ;; #( + no|'') + ;; #( + *) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5 +printf "%s\n" "$with_sysroot" >&6; } + as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 + ;; +esac + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 +printf "%s\n" "${lt_sysroot:-no}" >&6; } + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5 +printf %s "checking for a working dd... " >&6; } +if test ${ac_cv_path_lt_DD+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) printf 0123456789abcdef0123456789abcdef >conftest.i +cat conftest.i conftest.i >conftest2.i +: ${lt_DD:=$DD} +if test -z "$lt_DD"; then + ac_path_lt_DD_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in dd + do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_lt_DD="$as_dir$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_lt_DD" || continue +if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: +fi + $ac_path_lt_DD_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_lt_DD"; then + : + fi +else + ac_cv_path_lt_DD=$lt_DD +fi + +rm -f conftest.i conftest2.i conftest.out ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5 +printf "%s\n" "$ac_cv_path_lt_DD" >&6; } + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5 +printf %s "checking how to truncate binary pipes... " >&6; } +if test ${lt_cv_truncate_bin+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) printf 0123456789abcdef0123456789abcdef >conftest.i +cat conftest.i conftest.i >conftest2.i +lt_cv_truncate_bin= +if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" +fi +rm -f conftest.i conftest2.i conftest.out +test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q" ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5 +printf "%s\n" "$lt_cv_truncate_bin" >&6; } + + + + + + + +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in $*""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} + +# Check whether --enable-libtool-lock was given. +if test ${enable_libtool_lock+y} +then : + enableval=$enable_libtool_lock; +fi + +test no = "$enable_libtool_lock" || enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out what ABI is being produced by ac_compile, and set mode + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `$FILECMD conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE=32 + ;; + *ELF-64*) + HPUX_IA64_MODE=64 + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '#line '$LINENO' "configure"' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + if test yes = "$lt_cv_prog_gnu_ld"; then + case `$FILECMD conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `$FILECMD conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +mips64*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '#line '$LINENO' "configure"' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + emul=elf + case `$FILECMD conftest.$ac_objext` in + *32-bit*) + emul="${emul}32" + ;; + *64-bit*) + emul="${emul}64" + ;; + esac + case `$FILECMD conftest.$ac_objext` in + *MSB*) + emul="${emul}btsmip" + ;; + *LSB*) + emul="${emul}ltsmip" + ;; + esac + case `$FILECMD conftest.$ac_objext` in + *N32*) + emul="${emul}n32" + ;; + esac + LD="${LD-ld} -m $emul" + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*|x86_64-gnu*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. Note that the listed cases only cover the + # situations where additional linker options are needed (such as when + # doing 32-bit compilation for a host where ld defaults to 64-bit, or + # vice versa); the common cases where no linker options are needed do + # not appear in the list. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `$FILECMD conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*|x86_64-gnu*) + case `$FILECMD conftest.o` in + *x86-64*) + LD="${LD-ld} -m elf32_x86_64" + ;; + *) + LD="${LD-ld} -m elf_i386" + ;; + esac + ;; + powerpc64le-*linux*) + LD="${LD-ld} -m elf32lppclinux" + ;; + powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*|x86_64-gnu*) + LD="${LD-ld} -m elf_x86_64" + ;; + powerpcle-*linux*) + LD="${LD-ld} -m elf64lppc" + ;; + powerpc-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*|s390*-*tpf*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS=$CFLAGS + CFLAGS="$CFLAGS -belf" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 +printf %s "checking whether the C compiler needs -belf... " >&6; } +if test ${lt_cv_cc_needs_belf+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + lt_cv_cc_needs_belf=yes +else case e in #( + e) lt_cv_cc_needs_belf=no ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 +printf "%s\n" "$lt_cv_cc_needs_belf" >&6; } + if test yes != "$lt_cv_cc_needs_belf"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS=$SAVE_CFLAGS + fi + ;; +*-*solaris*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `$FILECMD conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) + case $host in + i?86-*-solaris*|x86_64-*-solaris*) + LD="${LD-ld} -m elf_x86_64" + ;; + sparc*-*-solaris*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + # GNU ld 2.21 introduced _sol2 emulations. Use them if available. + if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then + LD=${LD-ld}_sol2 + fi + ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; +esac + +need_locks=$enable_libtool_lock + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. +set dummy ${ac_tool_prefix}mt; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_MANIFEST_TOOL+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -n "$MANIFEST_TOOL"; then + ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi ;; +esac +fi +MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL +if test -n "$MANIFEST_TOOL"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 +printf "%s\n" "$MANIFEST_TOOL" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_MANIFEST_TOOL"; then + ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL + # Extract the first word of "mt", so it can be a program name with args. +set dummy mt; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_MANIFEST_TOOL+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -n "$ac_ct_MANIFEST_TOOL"; then + ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi ;; +esac +fi +ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL +if test -n "$ac_ct_MANIFEST_TOOL"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 +printf "%s\n" "$ac_ct_MANIFEST_TOOL" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_MANIFEST_TOOL" = x; then + MANIFEST_TOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL + fi +else + MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" +fi + +test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 +printf %s "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } +if test ${lt_cv_path_manifest_tool+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) lt_cv_path_manifest_tool=no + echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 + $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out + cat conftest.err >&5 + if $GREP 'Manifest Tool' conftest.out > /dev/null; then + lt_cv_path_manifest_tool=yes + fi + rm -f conftest* ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_manifest_tool" >&5 +printf "%s\n" "$lt_cv_path_manifest_tool" >&6; } +if test yes != "$lt_cv_path_manifest_tool"; then + MANIFEST_TOOL=: +fi + + + + + + + case $host_os in + rhapsody* | darwin*) + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. +set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_DSYMUTIL+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -n "$DSYMUTIL"; then + ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi ;; +esac +fi +DSYMUTIL=$ac_cv_prog_DSYMUTIL +if test -n "$DSYMUTIL"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 +printf "%s\n" "$DSYMUTIL" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DSYMUTIL"; then + ac_ct_DSYMUTIL=$DSYMUTIL + # Extract the first word of "dsymutil", so it can be a program name with args. +set dummy dsymutil; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_DSYMUTIL+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -n "$ac_ct_DSYMUTIL"; then + ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi ;; +esac +fi +ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL +if test -n "$ac_ct_DSYMUTIL"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 +printf "%s\n" "$ac_ct_DSYMUTIL" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_DSYMUTIL" = x; then + DSYMUTIL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DSYMUTIL=$ac_ct_DSYMUTIL + fi +else + DSYMUTIL="$ac_cv_prog_DSYMUTIL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. +set dummy ${ac_tool_prefix}nmedit; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_NMEDIT+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -n "$NMEDIT"; then + ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi ;; +esac +fi +NMEDIT=$ac_cv_prog_NMEDIT +if test -n "$NMEDIT"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 +printf "%s\n" "$NMEDIT" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_NMEDIT"; then + ac_ct_NMEDIT=$NMEDIT + # Extract the first word of "nmedit", so it can be a program name with args. +set dummy nmedit; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_NMEDIT+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -n "$ac_ct_NMEDIT"; then + ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_NMEDIT="nmedit" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi ;; +esac +fi +ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT +if test -n "$ac_ct_NMEDIT"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 +printf "%s\n" "$ac_ct_NMEDIT" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_NMEDIT" = x; then + NMEDIT=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + NMEDIT=$ac_ct_NMEDIT + fi +else + NMEDIT="$ac_cv_prog_NMEDIT" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. +set dummy ${ac_tool_prefix}lipo; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_LIPO+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -n "$LIPO"; then + ac_cv_prog_LIPO="$LIPO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_LIPO="${ac_tool_prefix}lipo" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi ;; +esac +fi +LIPO=$ac_cv_prog_LIPO +if test -n "$LIPO"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 +printf "%s\n" "$LIPO" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_LIPO"; then + ac_ct_LIPO=$LIPO + # Extract the first word of "lipo", so it can be a program name with args. +set dummy lipo; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_LIPO+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -n "$ac_ct_LIPO"; then + ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_LIPO="lipo" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi ;; +esac +fi +ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO +if test -n "$ac_ct_LIPO"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 +printf "%s\n" "$ac_ct_LIPO" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_LIPO" = x; then + LIPO=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + LIPO=$ac_ct_LIPO + fi +else + LIPO="$ac_cv_prog_LIPO" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_OTOOL+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -n "$OTOOL"; then + ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_OTOOL="${ac_tool_prefix}otool" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi ;; +esac +fi +OTOOL=$ac_cv_prog_OTOOL +if test -n "$OTOOL"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 +printf "%s\n" "$OTOOL" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OTOOL"; then + ac_ct_OTOOL=$OTOOL + # Extract the first word of "otool", so it can be a program name with args. +set dummy otool; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_OTOOL+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -n "$ac_ct_OTOOL"; then + ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OTOOL="otool" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi ;; +esac +fi +ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL +if test -n "$ac_ct_OTOOL"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 +printf "%s\n" "$ac_ct_OTOOL" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_OTOOL" = x; then + OTOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL=$ac_ct_OTOOL + fi +else + OTOOL="$ac_cv_prog_OTOOL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool64; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_OTOOL64+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -n "$OTOOL64"; then + ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi ;; +esac +fi +OTOOL64=$ac_cv_prog_OTOOL64 +if test -n "$OTOOL64"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 +printf "%s\n" "$OTOOL64" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OTOOL64"; then + ac_ct_OTOOL64=$OTOOL64 + # Extract the first word of "otool64", so it can be a program name with args. +set dummy otool64; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_OTOOL64+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -n "$ac_ct_OTOOL64"; then + ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OTOOL64="otool64" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi ;; +esac +fi +ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 +if test -n "$ac_ct_OTOOL64"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 +printf "%s\n" "$ac_ct_OTOOL64" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_OTOOL64" = x; then + OTOOL64=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL64=$ac_ct_OTOOL64 + fi +else + OTOOL64="$ac_cv_prog_OTOOL64" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 +printf %s "checking for -single_module linker flag... " >&6; } +if test ${lt_cv_apple_cc_single_mod+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) lt_cv_apple_cc_single_mod=no + if test -z "$LT_MULTI_MODULE"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +-dynamiclib -Wl,-single_module conftest.c" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + # If there is a non-empty error log, and "single_module" + # appears in it, assume the flag caused a linker warning + if test -s conftest.err && $GREP single_module conftest.err; then + cat conftest.err >&5 + # Otherwise, if the output was created with a 0 exit code from + # the compiler, it worked. + elif test -f libconftest.dylib && test 0 = "$_lt_result"; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&5 + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 +printf "%s\n" "$lt_cv_apple_cc_single_mod" >&6; } + + # Feature test to disable chained fixups since it is not + # compatible with '-undefined dynamic_lookup' + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -no_fixup_chains linker flag" >&5 +printf %s "checking for -no_fixup_chains linker flag... " >&6; } +if test ${lt_cv_support_no_fixup_chains+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -Wl,-no_fixup_chains" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + lt_cv_support_no_fixup_chains=yes +else case e in #( + e) lt_cv_support_no_fixup_chains=no + ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_support_no_fixup_chains" >&5 +printf "%s\n" "$lt_cv_support_no_fixup_chains" >&6; } + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 +printf %s "checking for -exported_symbols_list linker flag... " >&6; } +if test ${lt_cv_ld_exported_symbols_list+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + lt_cv_ld_exported_symbols_list=yes +else case e in #( + e) lt_cv_ld_exported_symbols_list=no ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 +printf "%s\n" "$lt_cv_ld_exported_symbols_list" >&6; } + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 +printf %s "checking for -force_load linker flag... " >&6; } +if test ${lt_cv_ld_force_load+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) lt_cv_ld_force_load=no + cat > conftest.c << _LT_EOF +int forced_loaded() { return 2;} +_LT_EOF + echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 + $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 + echo "$AR $AR_FLAGS libconftest.a conftest.o" >&5 + $AR $AR_FLAGS libconftest.a conftest.o 2>&5 + echo "$RANLIB libconftest.a" >&5 + $RANLIB libconftest.a 2>&5 + cat > conftest.c << _LT_EOF +int main(void) { return 0;} +_LT_EOF + echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err + _lt_result=$? + if test -s conftest.err && $GREP force_load conftest.err; then + cat conftest.err >&5 + elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then + lt_cv_ld_force_load=yes + else + cat conftest.err >&5 + fi + rm -f conftest.err libconftest.a conftest conftest.c + rm -rf conftest.dSYM + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 +printf "%s\n" "$lt_cv_ld_force_load" >&6; } + case $host_os in + rhapsody* | darwin1.[012]) + _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + darwin*) + case $MACOSX_DEPLOYMENT_TARGET,$host in + 10.[012],*|,*powerpc*-darwin[5-8]*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + *) + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' + if test yes = "$lt_cv_support_no_fixup_chains"; then + as_fn_append _lt_dar_allow_undefined ' $wl-no_fixup_chains' + fi + ;; + esac + ;; + esac + if test yes = "$lt_cv_apple_cc_single_mod"; then + _lt_dar_single_mod='$single_module' + fi + _lt_dar_needs_single_mod=no + case $host_os in + rhapsody* | darwin1.*) + _lt_dar_needs_single_mod=yes ;; + darwin*) + # When targeting Mac OS X 10.4 (darwin 8) or later, + # -single_module is the default and -multi_module is unsupported. + # The toolchain on macOS 10.14 (darwin 18) and later cannot + # target any OS version that needs -single_module. + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*-darwin[567].*|10.[0-3],*-darwin[5-9].*|10.[0-3],*-darwin1[0-7].*) + _lt_dar_needs_single_mod=yes ;; + esac + ;; + esac + if test yes = "$lt_cv_ld_exported_symbols_list"; then + _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' + fi + if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac + +# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x$2 in + x) + ;; + *:) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" + ;; + x:*) + eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" + ;; + *) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" + ;; + esac +} + +ac_header= ac_cache= +for ac_item in $ac_header_c_list +do + if test $ac_cache; then + ac_fn_c_check_header_compile "$LINENO" $ac_header ac_cv_header_$ac_cache "$ac_includes_default" + if eval test \"x\$ac_cv_header_$ac_cache\" = xyes; then + printf "%s\n" "#define $ac_item 1" >> confdefs.h + fi + ac_header= ac_cache= + elif test $ac_header; then + ac_cache=$ac_item + else + ac_header=$ac_item + fi +done + + + + + + + + +if test $ac_cv_header_stdlib_h = yes && test $ac_cv_header_string_h = yes +then : + +printf "%s\n" "#define STDC_HEADERS 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default +" +if test "x$ac_cv_header_dlfcn_h" = xyes +then : + printf "%s\n" "#define HAVE_DLFCN_H 1" >>confdefs.h + +fi + + + + +func_stripname_cnf () +{ + case $2 in + .*) func_stripname_result=`$ECHO "$3" | $SED "s%^$1%%; s%\\\\$2\$%%"`;; + *) func_stripname_result=`$ECHO "$3" | $SED "s%^$1%%; s%$2\$%%"`;; + esac +} # func_stripname_cnf + + + + + +# Set options + + + + enable_dlopen=no + + + enable_win32_dll=no + + + # Check whether --enable-shared was given. +if test ${enable_shared+y} +then : + enableval=$enable_shared; p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else case e in #( + e) enable_shared=yes ;; +esac +fi + + + + + + + + + + # Check whether --enable-static was given. +if test ${enable_static+y} +then : + enableval=$enable_static; p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else case e in #( + e) enable_static=yes ;; +esac +fi + + + + + + + + + + # Check whether --enable-pic was given. +if test ${enable_pic+y} +then : + enableval=$enable_pic; lt_p=${PACKAGE-default} + case $enableval in + yes|no) pic_mode=$enableval ;; + *) + pic_mode=default + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for lt_pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$lt_pkg" = "X$lt_p"; then + pic_mode=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else case e in #( + e) # Check whether --with-pic was given. +if test ${with_pic+y} +then : + withval=$with_pic; lt_p=${PACKAGE-default} + case $withval in + yes|no) pic_mode=$withval ;; + *) + pic_mode=default + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for lt_pkg in $withval; do + IFS=$lt_save_ifs + if test "X$lt_pkg" = "X$lt_p"; then + pic_mode=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else case e in #( + e) pic_mode=default ;; +esac +fi + + ;; +esac +fi + + + + + + + + + # Check whether --enable-fast-install was given. +if test ${enable_fast_install+y} +then : + enableval=$enable_fast_install; p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else case e in #( + e) enable_fast_install=yes ;; +esac +fi + + + + + + + + + shared_archive_member_spec= +case $host,$enable_shared in +power*-*-aix[5-9]*,yes) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5 +printf %s "checking which variant of shared library versioning to provide... " >&6; } + # Check whether --enable-aix-soname was given. +if test ${enable_aix_soname+y} +then : + enableval=$enable_aix_soname; case $enableval in + aix|svr4|both) + ;; + *) + as_fn_error $? "Unknown argument to --enable-aix-soname" "$LINENO" 5 + ;; + esac + lt_cv_with_aix_soname=$enable_aix_soname +else case e in #( + e) # Check whether --with-aix-soname was given. +if test ${with_aix_soname+y} +then : + withval=$with_aix_soname; case $withval in + aix|svr4|both) + ;; + *) + as_fn_error $? "Unknown argument to --with-aix-soname" "$LINENO" 5 + ;; + esac + lt_cv_with_aix_soname=$with_aix_soname +else case e in #( + e) if test ${lt_cv_with_aix_soname+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) lt_cv_with_aix_soname=aix ;; +esac +fi + ;; +esac +fi + + enable_aix_soname=$lt_cv_with_aix_soname ;; +esac +fi + + with_aix_soname=$enable_aix_soname + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5 +printf "%s\n" "$with_aix_soname" >&6; } + if test aix != "$with_aix_soname"; then + # For the AIX way of multilib, we name the shared archive member + # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', + # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. + # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, + # the AIX toolchain works better with OBJECT_MODE set (default 32). + if test 64 = "${OBJECT_MODE-32}"; then + shared_archive_member_spec=shr_64 + else + shared_archive_member_spec=shr + fi + fi + ;; +*) + with_aix_soname=aix + ;; +esac + + + + + + + + + + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS=$ltmain + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +test -z "$LN_S" && LN_S="ln -s" + + + + + + + + + + + + + + +if test -n "${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 +printf %s "checking for objdir... " >&6; } +if test ${lt_cv_objdir+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 +printf "%s\n" "$lt_cv_objdir" >&6; } +objdir=$lt_cv_objdir + + + + + +printf "%s\n" "#define LT_OBJDIR \"$lt_cv_objdir/\"" >>confdefs.h + + + + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test set != "${COLLECT_NAMES+set}"; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Global variables: +ofile=libtool +can_build_shared=yes + +# All known linkers require a '.a' archive for static linking (except MSVC and +# ICC, which need '.lib'). +libext=a + +with_gnu_ld=$lt_cv_prog_gnu_ld + +old_CC=$CC +old_CFLAGS=$CFLAGS + +# Set sane defaults for various variables +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$LD" && LD=ld +test -z "$ac_objext" && ac_objext=o + +func_cc_basename $compiler +cc_basename=$func_cc_basename_result + + +# Only perform the check for file, if the check method requires it +test -z "$MAGIC_CMD" && MAGIC_CMD=file +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 +printf %s "checking for ${ac_tool_prefix}file... " >&6; } +if test ${lt_cv_path_MAGIC_CMD+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD=$MAGIC_CMD + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/${ac_tool_prefix}file"; then + lt_cv_path_MAGIC_CMD=$ac_dir/"${ac_tool_prefix}file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD=$lt_cv_path_MAGIC_CMD + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS=$lt_save_ifs + MAGIC_CMD=$lt_save_MAGIC_CMD + ;; +esac ;; +esac +fi + +MAGIC_CMD=$lt_cv_path_MAGIC_CMD +if test -n "$MAGIC_CMD"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +printf "%s\n" "$MAGIC_CMD" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + + + +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for file" >&5 +printf %s "checking for file... " >&6; } +if test ${lt_cv_path_MAGIC_CMD+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD=$MAGIC_CMD + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/file"; then + lt_cv_path_MAGIC_CMD=$ac_dir/"file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD=$lt_cv_path_MAGIC_CMD + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS=$lt_save_ifs + MAGIC_CMD=$lt_save_MAGIC_CMD + ;; +esac ;; +esac +fi + +MAGIC_CMD=$lt_cv_path_MAGIC_CMD +if test -n "$MAGIC_CMD"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +printf "%s\n" "$MAGIC_CMD" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + else + MAGIC_CMD=: + fi +fi + + fi + ;; +esac + +# Use C for the default configuration in the libtool script + +lt_save_CC=$CC +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +objext=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(void){return(0);}' + + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + +# Save the default compiler, since it gets overwritten when the other +# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +compiler_DEFAULT=$CC + +# save warnings/boilerplate of simple test code +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* + +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* + + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + +lt_prog_compiler_no_builtin_flag= + +if test yes = "$GCC"; then + case $cc_basename in + nvcc*) + lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; + *) + lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; + esac + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +printf %s "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } +if test ${lt_cv_prog_compiler_rtti_exceptions+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) lt_cv_prog_compiler_rtti_exceptions=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="-fno-rtti -fno-exceptions" ## exclude from sc_useless_quotes_in_assignment + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_rtti_exceptions=yes + fi + fi + $RM conftest* + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +printf "%s\n" "$lt_cv_prog_compiler_rtti_exceptions" >&6; } + +if test yes = "$lt_cv_prog_compiler_rtti_exceptions"; then + lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" +else + : +fi + +fi + + + + + + + lt_prog_compiler_wl= +lt_prog_compiler_pic= +lt_prog_compiler_static= + + + if test yes = "$GCC"; then + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_static='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + fi + lt_prog_compiler_pic='-fPIC' + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + lt_prog_compiler_pic='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the '-m68020' flag to GCC prevents building anything better, + # like '-m68040'. + lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | windows* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic='-DDLL_EXPORT' + case $host_os in + os2*) + lt_prog_compiler_static='$wl-static' + ;; + esac + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + ;; + + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + lt_prog_compiler_static= + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + ;; + + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic=-Kconform_pic + fi + ;; + + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + + case $cc_basename in + nvcc*) # Cuda Compiler Driver 2.2 + lt_prog_compiler_wl='-Xlinker ' + if test -n "$lt_prog_compiler_pic"; then + lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" + fi + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl='-Wl,' + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + else + lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + case $cc_basename in + nagfor*) + # NAG Fortran compiler + lt_prog_compiler_wl='-Wl,-Wl,,' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + esac + ;; + + mingw* | windows* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic='-DDLL_EXPORT' + case $host_os in + os2*) + lt_prog_compiler_static='$wl-static' + ;; + esac + ;; + + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static='$wl-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static='-non_shared' + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + # old Intel for x86_64, which still supported -KPIC. + ecc*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-static' + ;; + *flang* | ftn | f18* | f95*) + # Flang compiler. + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='--shared' + lt_prog_compiler_static='--static' + ;; + nagfor*) + # NAG Fortran compiler + lt_prog_compiler_wl='-Wl,-Wl,,' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + ccc*) + lt_prog_compiler_wl='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + xl* | bgxl* | bgf* | mpixl*) + # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-qpic' + lt_prog_compiler_static='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | $SED 5q` in + *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='' + ;; + *Sun\ F* | *Sun*Fortran*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Qoption ld ' + ;; + *Sun\ C*) + # Sun C 5.9 + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Wl,' + ;; + *Intel*\ [CF]*Compiler*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + *Portland\ Group*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + esac + ;; + esac + ;; + + newsos6) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + *-mlibc) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + + rdos*) + lt_prog_compiler_static='-non_shared' + ;; + + serenity*) + ;; + + solaris*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + case $cc_basename in + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) + lt_prog_compiler_wl='-Qoption ld ';; + *) + lt_prog_compiler_wl='-Wl,';; + esac + ;; + + sunos4*) + lt_prog_compiler_wl='-Qoption ld ' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic='-Kconform_pic' + lt_prog_compiler_static='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + unicos*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_can_build_shared=no + ;; + + uts4*) + lt_prog_compiler_pic='-pic' + lt_prog_compiler_static='-Bstatic' + ;; + + *) + lt_prog_compiler_can_build_shared=no + ;; + esac + fi + +case $host_os in + # For platforms that do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic= + ;; + *) + lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" + ;; +esac + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +printf %s "checking for $compiler option to produce PIC... " >&6; } +if test ${lt_cv_prog_compiler_pic+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) lt_cv_prog_compiler_pic=$lt_prog_compiler_pic ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 +printf "%s\n" "$lt_cv_prog_compiler_pic" >&6; } +lt_prog_compiler_pic=$lt_cv_prog_compiler_pic + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 +printf %s "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } +if test ${lt_cv_prog_compiler_pic_works+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) lt_cv_prog_compiler_pic_works=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic -DPIC" ## exclude from sc_useless_quotes_in_assignment + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works=yes + fi + fi + $RM conftest* + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 +printf "%s\n" "$lt_cv_prog_compiler_pic_works" >&6; } + +if test yes = "$lt_cv_prog_compiler_pic_works"; then + case $lt_prog_compiler_pic in + "" | " "*) ;; + *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; + esac +else + lt_prog_compiler_pic= + lt_prog_compiler_can_build_shared=no +fi + +fi + + + + + + + + + + + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +printf %s "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if test ${lt_cv_prog_compiler_static_works+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) lt_cv_prog_compiler_static_works=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works=yes + fi + else + lt_cv_prog_compiler_static_works=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 +printf "%s\n" "$lt_cv_prog_compiler_static_works" >&6; } + +if test yes = "$lt_cv_prog_compiler_static_works"; then + : +else + lt_prog_compiler_static= +fi + + + + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if test ${lt_cv_prog_compiler_c_o+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +printf "%s\n" "$lt_cv_prog_compiler_c_o" >&6; } + + + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if test ${lt_cv_prog_compiler_c_o+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +printf "%s\n" "$lt_cv_prog_compiler_c_o" >&6; } + + + + +hard_links=nottested +if test no = "$lt_cv_prog_compiler_c_o" && test no != "$need_locks"; then + # do not overwrite the value of need_locks provided by the user + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +printf %s "checking if we can lock with hard links... " >&6; } + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +printf "%s\n" "$hard_links" >&6; } + if test no = "$hard_links"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 +printf "%s\n" "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + + + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +printf %s "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + runpath_var= + allow_undefined_flag= + always_export_symbols=no + archive_cmds= + archive_expsym_cmds= + compiler_needs_object=no + enable_shared_with_static_runtimes=no + export_dynamic_flag_spec= + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + hardcode_automatic=no + hardcode_direct=no + hardcode_direct_absolute=no + hardcode_libdir_flag_spec= + hardcode_libdir_separator= + hardcode_minus_L=no + hardcode_shlibpath_var=unsupported + inherit_rpath=no + link_all_deplibs=unknown + module_cmds= + module_expsym_cmds= + old_archive_from_new_cmds= + old_archive_from_expsyms_cmds= + thread_safe_flag_spec= + whole_archive_flag_spec= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ' (' and ')$', so one must not match beginning or + # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc', + # as well as any symbol that contains 'd'. + exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | windows* | pw32* | cegcc*) + # FIXME: the MSVC++ and ICC port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++ or Intel C++ Compiler. + if test yes != "$GCC"; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++ or ICC) + with_gnu_ld=yes + ;; + esac + + ld_shlibs=yes + + # On some targets, GNU ld is compatible enough with the native linker + # that we're better off using the native interface for both. + lt_use_gnu_ld_interface=no + if test yes = "$with_gnu_ld"; then + case $host_os in + aix*) + # The AIX port of GNU ld has always aspired to compatibility + # with the native linker. However, as the warning in the GNU ld + # block says, versions before 2.19.5* couldn't really create working + # shared libraries, regardless of the interface used. + case `$LD -v 2>&1` in + *\ \(GNU\ Binutils\)\ 2.19.5*) ;; + *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; + *\ \(GNU\ Binutils\)\ [3-9]*) ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + fi + + if test yes = "$lt_use_gnu_ld_interface"; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='$wl' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + export_dynamic_flag_spec='$wl--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + else + whole_archive_flag_spec= + fi + supports_anon_versioning=no + case `$LD -v | $SED -e 's/([^)]\+)\s\+//' 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[3-9]*) + # On AIX/PPC, the GNU linker is very broken + if test ia64 != "$host_cpu"; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.19, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to install binutils +*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. +*** You will then need to restart the configuration process. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + else + ld_shlibs=no + fi + ;; + + cygwin* | mingw* | windows* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + export_dynamic_flag_spec='$wl--export-all-symbols' + allow_undefined_flag=unsupported + always_export_symbols=no + enable_shared_with_static_runtimes=yes + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' + file_list_spec='@' + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file, use it as + # is; otherwise, prepend EXPORTS... + archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs=no + fi + ;; + + haiku*) + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + link_all_deplibs=no + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + shrext_cmds=.dll + archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + old_archive_from_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + enable_shared_with_static_runtimes=yes + file_list_spec='@' + ;; + + interix[3-9]*) + hardcode_direct=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='$wl-rpath,$libdir' + export_dynamic_flag_spec='$wl-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds='$SED "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + tmp_diet=no + if test linux-dietlibc = "$host_os"; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test no = "$tmp_diet" + then + tmp_addflag=' $pic_flag' + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group f77 and f90 compilers + whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + whole_archive_flag_spec= + tmp_sharedflag='--shared' ;; + nagfor*) # NAGFOR 5.3 + tmp_sharedflag='-Wl,-shared' ;; + xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + nvcc*) # Cuda Compiler Driver 2.2 + whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + compiler_needs_object=yes + ;; + esac + case `$CC -V 2>&1 | $SED 5q` in + *Sun\ C*) # Sun C 5.9 + whole_archive_flag_spec='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + compiler_needs_object=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + + if test yes = "$supports_anon_versioning"; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + tcc*) + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + export_dynamic_flag_spec='-rdynamic' + ;; + xlf* | bgf* | bgxlf* | mpixlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' + if test yes = "$supports_anon_versioning"; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + ld_shlibs=no + fi + ;; + + *-mlibc) + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + ;; + + sunos4*) + archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + + if test no = "$ld_shlibs"; then + runpath_var= + hardcode_libdir_flag_spec= + export_dynamic_flag_spec= + whole_archive_flag_spec= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag=unsupported + always_export_symbols=yes + archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + + aix[4-9]*) + if test ia64 = "$host_cpu"; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag= + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "L") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then + aix_use_runtimelinking=yes + break + fi + done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds='' + hardcode_direct=yes + hardcode_direct_absolute=yes + hardcode_libdir_separator=':' + link_all_deplibs=yes + file_list_spec='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # traditional, no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + hardcode_direct=no + hardcode_direct_absolute=no + ;; + esac + + if test yes = "$GCC"; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`$CC -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + ;; + esac + shared_flag='-shared' + if test yes = "$aix_use_runtimelinking"; then + shared_flag="$shared_flag "'$wl-G' + fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' + else + # not using gcc + if test ia64 = "$host_cpu"; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' + else + shared_flag='$wl-bM:SRE' + fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' + fi + fi + + export_dynamic_flag_spec='$wl-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols=yes + if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if test ${lt_cv_aix_libpath_+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=/usr/lib:/lib + fi + ;; +esac +fi + + aix_libpath=$lt_cv_aix_libpath_ +fi + + hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag + else + if test ia64 = "$host_cpu"; then + hardcode_libdir_flag_spec='$wl-R $libdir:/usr/lib:/lib' + allow_undefined_flag="-z nodefs" + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if test ${lt_cv_aix_libpath_+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=/usr/lib:/lib + fi + ;; +esac +fi + + aix_libpath=$lt_cv_aix_libpath_ +fi + + hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag=' $wl-bernotok' + allow_undefined_flag=' $wl-berok' + if test yes = "$with_gnu_ld"; then + # We only use this code for GNU lds that support --whole-archive. + whole_archive_flag_spec='$wl--whole-archive$convenience $wl--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec='$convenience' + fi + archive_cmds_need_lc=yes + archive_expsym_cmds='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + archive_expsym_cmds="$archive_expsym_cmds"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + archive_expsym_cmds="$archive_expsym_cmds"'~$RM -r $output_objdir/$realname.d' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + + bsdi[45]*) + export_dynamic_flag_spec=-rdynamic + ;; + + cygwin* | mingw* | windows* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++ or Intel C++ Compiler. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + case $cc_basename in + cl* | icl*) + # Native MSVC or ICC + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + always_export_symbols=yes + file_list_spec='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -Fe$output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -Fe$tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, )='true' + enable_shared_with_static_runtimes=yes + exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' + # Don't use ranlib + old_postinstall_cmds='chmod 644 $oldlib' + postlink_cmds='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # Assume MSVC and ICC wrapper + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_from_new_cmds='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' + enable_shared_with_static_runtimes=yes + ;; + esac + ;; + + darwin* | rhapsody*) + + + archive_cmds_need_lc=no + hardcode_direct=no + hardcode_automatic=yes + hardcode_shlibpath_var=unsupported + if test yes = "$lt_cv_ld_force_load"; then + whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + + else + whole_archive_flag_spec='' + fi + link_all_deplibs=yes + allow_undefined_flag=$_lt_dar_allow_undefined + case $cc_basename in + ifort*|nagfor*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test yes = "$_lt_dar_can_shared"; then + output_verbose_link_cmd=func_echo_all + archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" + module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" + archive_expsym_cmds="$SED 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" + module_expsym_cmds="$SED -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" + + else + ld_shlibs=no + fi + + ;; + + dgux*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2.*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly* | midnightbsd*) + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + hpux9*) + if test yes = "$GCC"; then + archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + else + archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec='$wl+b $wl$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + export_dynamic_flag_spec='$wl-E' + ;; + + hpux10*) + if test yes,no = "$GCC,$with_gnu_ld"; then + archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test no = "$with_gnu_ld"; then + hardcode_libdir_flag_spec='$wl+b $wl$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='$wl-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + fi + ;; + + hpux11*) + if test yes,no = "$GCC,$with_gnu_ld"; then + case $host_cpu in + hppa*64*) + archive_cmds='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + archive_cmds='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + + # Older versions of the 11.00 compiler do not understand -b yet + # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 +printf %s "checking if $CC understands -b... " >&6; } +if test ${lt_cv_prog_compiler__b+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) lt_cv_prog_compiler__b=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -b" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler__b=yes + fi + else + lt_cv_prog_compiler__b=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 +printf "%s\n" "$lt_cv_prog_compiler__b" >&6; } + +if test yes = "$lt_cv_prog_compiler__b"; then + archive_cmds='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' +else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' +fi + + ;; + esac + fi + if test no = "$with_gnu_ld"; then + hardcode_libdir_flag_spec='$wl+b $wl$libdir' + hardcode_libdir_separator=: + + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct=no + hardcode_shlibpath_var=no + ;; + *) + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='$wl-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test yes = "$GCC"; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + # This should be the same for all languages, so no per-tag cache variable. + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 +printf %s "checking whether the $host_os linker accepts -exported_symbol... " >&6; } +if test ${lt_cv_irix_exported_symbol+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int foo (void) { return 0; } +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + lt_cv_irix_exported_symbol=yes +else case e in #( + e) lt_cv_irix_exported_symbol=no ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 +printf "%s\n" "$lt_cv_irix_exported_symbol" >&6; } + if test yes = "$lt_cv_irix_exported_symbol"; then + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' + fi + else + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + hardcode_libdir_separator=: + inherit_rpath=yes + link_all_deplibs=yes + ;; + + linux*) + case $cc_basename in + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + ld_shlibs=yes + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + ;; + esac + ;; + + *-mlibc) + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + newsos6) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + hardcode_libdir_separator=: + hardcode_shlibpath_var=no + ;; + + *nto* | *qnx*) + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + hardcode_direct=yes + hardcode_shlibpath_var=no + hardcode_direct_absolute=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' + hardcode_libdir_flag_spec='$wl-rpath,$libdir' + export_dynamic_flag_spec='$wl-E' + else + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='$wl-rpath,$libdir' + fi + else + ld_shlibs=no + fi + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + shrext_cmds=.dll + archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + old_archive_from_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + enable_shared_with_static_runtimes=yes + file_list_spec='@' + ;; + + osf3*) + if test yes = "$GCC"; then + allow_undefined_flag=' $wl-expect_unresolved $wl\*' + archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + hardcode_libdir_separator=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test yes = "$GCC"; then + allow_undefined_flag=' $wl-expect_unresolved $wl\*' + archive_cmds='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + archive_cmds_need_lc='no' + hardcode_libdir_separator=: + ;; + + serenity*) + ;; + + solaris*) + no_undefined_flag=' -z defs' + if test yes = "$GCC"; then + wlarc='$wl' + archive_cmds='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + archive_cmds='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; + *) + wlarc='$wl' + archive_cmds='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_shlibpath_var=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands '-z linker_flag'. GCC discards it without '$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test yes = "$GCC"; then + whole_archive_flag_spec='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' + else + whole_archive_flag_spec='-z allextract$convenience -z defaultextract' + fi + ;; + esac + link_all_deplibs=yes + ;; + + sunos4*) + if test sequent = "$host_vendor"; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds='$CC -r -o $output$reload_objs' + hardcode_direct=no + ;; + motorola) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; + + sysv4.3*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + export_dynamic_flag_spec='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag='$wl-z,text' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; then + archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We CANNOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag='$wl-z,text' + allow_undefined_flag='$wl-z,nodefs' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='$wl-R,$libdir' + hardcode_libdir_separator=':' + link_all_deplibs=yes + export_dynamic_flag_spec='$wl-Bexport' + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; then + archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + *) + ld_shlibs=no + ;; + esac + + if test sni = "$host_vendor"; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + export_dynamic_flag_spec='$wl-Blargedynsym' + ;; + esac + fi + fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 +printf "%s\n" "$ld_shlibs" >&6; } +test no = "$ld_shlibs" && can_build_shared=no + +with_gnu_ld=$with_gnu_ld + + + + + + + + + + + + + + + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc=yes + + if test yes,yes = "$GCC,$enable_shared"; then + case $archive_cmds in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +printf %s "checking whether -lc should be explicitly linked in... " >&6; } +if test ${lt_cv_archive_cmds_need_lc+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl + pic_flag=$lt_prog_compiler_pic + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag + allow_undefined_flag= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + lt_cv_archive_cmds_need_lc=no + else + lt_cv_archive_cmds_need_lc=yes + fi + allow_undefined_flag=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 +printf "%s\n" "$lt_cv_archive_cmds_need_lc" >&6; } + archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc + ;; + esac + fi + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +printf %s "checking dynamic linker characteristics... " >&6; } + +if test yes = "$GCC"; then + case $host_os in + darwin*) lt_awk_arg='/^libraries:/,/LR/' ;; + *) lt_awk_arg='/^libraries:/' ;; + esac + case $host_os in + mingw* | windows* | cegcc*) lt_sed_strip_eq='s|=\([A-Za-z]:\)|\1|g' ;; + *) lt_sed_strip_eq='s|=/|/|g' ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` + case $lt_search_path_spec in + *\;*) + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` + ;; + *) + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` + ;; + esac + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary... + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + # ...but if some path component already ends with the multilib dir we assume + # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). + case "$lt_multi_os_dir; $lt_search_path_spec " in + "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) + lt_multi_os_dir= + ;; + esac + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir" + elif test -n "$lt_multi_os_dir"; then + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' +BEGIN {RS = " "; FS = "/|\n";} { + lt_foo = ""; + lt_count = 0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo = "/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[lt_foo]++; } + if (lt_freq[lt_foo] == 1) { print lt_foo; } +}'` + # AWK program above erroneously prepends '/' to C:/dos/paths + # for these hosts. + case $host_os in + mingw* | windows* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ + $SED 's|/\([A-Za-z]:\)|\1|g'` ;; + esac + sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=.so +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + + + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='$libname$release$shared_ext$major' + ;; + +aix[4-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test ia64 = "$host_cpu"; then + # AIX 5 supports IA64 + library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line '#! .'. This would cause the generated library to + # depend on '.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # Using Import Files as archive members, it is possible to support + # filename-based versioning of shared library archives on AIX. While + # this would work for both with and without runtime linking, it will + # prevent static linking of such archives. So we do filename-based + # shared library versioning with .so extension only, which is used + # when both runtime linking and shared linking is enabled. + # Unfortunately, runtime linking may impact performance, so we do + # not want this to be the default eventually. Also, we use the + # versioned .so libs for executables only if there is the -brtl + # linker flag in LDFLAGS as well, or --enable-aix-soname=svr4 only. + # To allow for filename-based versioning support, we need to create + # libNAME.so.V as an archive file, containing: + # *) an Import File, referring to the versioned filename of the + # archive as well as the shared archive member, telling the + # bitwidth (32 or 64) of that shared object, and providing the + # list of exported symbols of that shared object, eventually + # decorated with the 'weak' keyword + # *) the shared object with the F_LOADONLY flag set, to really avoid + # it being seen by the linker. + # At run time we better use the real file rather than another symlink, + # but for link time we create the symlink libNAME.so -> libNAME.so.V + + case $with_aix_soname,$aix_use_runtimelinking in + # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + aix,yes) # traditional libtool + dynamic_linker='AIX unversionable lib.so' + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + aix,no) # traditional AIX only + dynamic_linker='AIX lib.a(lib.so.V)' + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + ;; + svr4,*) # full svr4 only + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,yes) # both, prefer svr4 + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # unpreferred sharedlib libNAME.a needs extra handling + postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' + postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,no) # both, prefer aix + dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling + postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' + postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' + ;; + esac + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='$libname$shared_ext' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | windows* | pw32* | cegcc*) + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + # If user builds GCC with multilib enabled, + # it should just install on $(libdir) + # not on $(libdir)/../bin or 32 bits dlls would override 64 bit ones. + if test xyes = x"$multilib"; then + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + $install_prog $dir/$dlname $destdir/$dlname~ + chmod a+x $destdir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib $destdir/$dlname'\'' || exit \$?; + fi' + else + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + fi + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo $libname | $SED -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" + ;; + mingw* | windows* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo $libname | $SED -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl* | *,icl*) + # Native MSVC or ICC + libname_spec='$name' + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + library_names_spec='$libname.dll.lib' + + case $build_os in + mingw* | windows*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec=$LIB + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC and ICC wrapper + library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' + soname_spec='$libname$release$major$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly* | midnightbsd*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[23].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + need_version=yes + ;; + esac + case $host_cpu in + powerpc64) + # On FreeBSD bi-arch platforms, a different variable is used for 32-bit + # binaries. See . + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int test_pointer_size[sizeof (void *) - 5]; + +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + shlibpath_var=LD_LIBRARY_PATH +else case e in #( + e) shlibpath_var=LD_32_LIBRARY_PATH ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + ;; + *) + shlibpath_var=LD_LIBRARY_PATH + ;; + esac + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/boot/system/non-packaged/develop/lib /boot/system/develop/lib' + sys_lib_dlsearch_path_spec='/boot/home/config/non-packaged/lib /boot/home/config/lib /boot/system/non-packaged/lib /boot/system/lib' + hardcode_into_libs=no + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + if test 32 = "$HPUX_IA64_MODE"; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + sys_lib_dlsearch_path_spec=/usr/lib/hpux32 + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + sys_lib_dlsearch_path_spec=/usr/lib/hpux64 + fi + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[3-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test yes = "$lt_cv_prog_gnu_ld"; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" + sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +linux*android*) + version_type=none # Android doesn't support versioned libraries. + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext $libname$shared_ext' + soname_spec='$libname$release$shared_ext' + finish_cmds= + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + dynamic_linker='Android linker' + # -rpath works at least for libraries that are not overridden by + # libraries installed in system locations. + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + if test ${lt_cv_shlibpath_overrides_runpath+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null +then : + lt_cv_shlibpath_overrides_runpath=yes +fi +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + ;; +esac +fi + + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Add ABI-specific directories to the system library path. + sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib" + + # Ideally, we could use ldconfig to report *all* directories which are + # searched for libraries, however this is still not possible. Aside from not + # being certain /sbin/ldconfig is available, command + # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, + # even though it is searched at run-time. Try to do the best guess by + # appending ld.so.conf contents (and includes) to the search path. + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsdelf*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='NetBSD ld.elf_so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +*-mlibc) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='mlibc ld.so' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec=/usr/lib + need_lib_prefix=no + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + need_version=no + else + need_version=yes + fi + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +os2*) + libname_spec='$name' + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + # OS/2 can only load a DLL with a base name of 8 characters or less. + soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; + v=$($ECHO $release$versuffix | tr -d .-); + n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); + $ECHO $n$v`$shared_ext' + library_names_spec='${libname}_dll.$libext' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=BEGINLIBPATH + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + +rdos*) + dynamic_linker=no + ;; + +serenity*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + dynamic_linker='SerenityOS LibELF' + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test yes = "$with_gnu_ld"; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec; then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' + soname_spec='$libname$shared_ext.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=sco + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test yes = "$with_gnu_ld"; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +emscripten*) + version_type=none + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext' + soname_spec='$libname$release$shared_ext' + finish_cmds= + dynamic_linker="Emscripten linker" + lt_prog_compiler_wl= +lt_prog_compiler_pic= +lt_prog_compiler_static= + + + if test yes = "$GCC"; then + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_static='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + fi + lt_prog_compiler_pic='-fPIC' + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + lt_prog_compiler_pic='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the '-m68020' flag to GCC prevents building anything better, + # like '-m68040'. + lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | windows* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic='-DDLL_EXPORT' + case $host_os in + os2*) + lt_prog_compiler_static='$wl-static' + ;; + esac + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + ;; + + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + lt_prog_compiler_static= + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + ;; + + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic=-Kconform_pic + fi + ;; + + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + + case $cc_basename in + nvcc*) # Cuda Compiler Driver 2.2 + lt_prog_compiler_wl='-Xlinker ' + if test -n "$lt_prog_compiler_pic"; then + lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" + fi + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl='-Wl,' + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + else + lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + case $cc_basename in + nagfor*) + # NAG Fortran compiler + lt_prog_compiler_wl='-Wl,-Wl,,' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + esac + ;; + + mingw* | windows* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic='-DDLL_EXPORT' + case $host_os in + os2*) + lt_prog_compiler_static='$wl-static' + ;; + esac + ;; + + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static='$wl-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static='-non_shared' + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + # old Intel for x86_64, which still supported -KPIC. + ecc*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-static' + ;; + *flang* | ftn | f18* | f95*) + # Flang compiler. + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='--shared' + lt_prog_compiler_static='--static' + ;; + nagfor*) + # NAG Fortran compiler + lt_prog_compiler_wl='-Wl,-Wl,,' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + ccc*) + lt_prog_compiler_wl='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + xl* | bgxl* | bgf* | mpixl*) + # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-qpic' + lt_prog_compiler_static='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | $SED 5q` in + *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='' + ;; + *Sun\ F* | *Sun*Fortran*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Qoption ld ' + ;; + *Sun\ C*) + # Sun C 5.9 + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Wl,' + ;; + *Intel*\ [CF]*Compiler*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + *Portland\ Group*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + esac + ;; + esac + ;; + + newsos6) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + *-mlibc) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + + rdos*) + lt_prog_compiler_static='-non_shared' + ;; + + serenity*) + ;; + + solaris*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + case $cc_basename in + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) + lt_prog_compiler_wl='-Qoption ld ';; + *) + lt_prog_compiler_wl='-Wl,';; + esac + ;; + + sunos4*) + lt_prog_compiler_wl='-Qoption ld ' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic='-Kconform_pic' + lt_prog_compiler_static='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + unicos*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_can_build_shared=no + ;; + + uts4*) + lt_prog_compiler_pic='-pic' + lt_prog_compiler_static='-Bstatic' + ;; + + *) + lt_prog_compiler_can_build_shared=no + ;; + esac + fi + +case $host_os in + # For platforms that do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic= + ;; + *) + lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" + ;; +esac + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +printf %s "checking for $compiler option to produce PIC... " >&6; } +if test ${lt_cv_prog_compiler_pic+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) lt_cv_prog_compiler_pic=$lt_prog_compiler_pic ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 +printf "%s\n" "$lt_cv_prog_compiler_pic" >&6; } +lt_prog_compiler_pic=$lt_cv_prog_compiler_pic + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 +printf %s "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } +if test ${lt_cv_prog_compiler_pic_works+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) lt_cv_prog_compiler_pic_works=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic -DPIC" ## exclude from sc_useless_quotes_in_assignment + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works=yes + fi + fi + $RM conftest* + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 +printf "%s\n" "$lt_cv_prog_compiler_pic_works" >&6; } + +if test yes = "$lt_cv_prog_compiler_pic_works"; then + case $lt_prog_compiler_pic in + "" | " "*) ;; + *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; + esac +else + lt_prog_compiler_pic= + lt_prog_compiler_can_build_shared=no +fi + +fi + + + + + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +printf %s "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if test ${lt_cv_prog_compiler_static_works+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) lt_cv_prog_compiler_static_works=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works=yes + fi + else + lt_cv_prog_compiler_static_works=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 +printf "%s\n" "$lt_cv_prog_compiler_static_works" >&6; } + +if test yes = "$lt_cv_prog_compiler_static_works"; then + : +else + lt_prog_compiler_static= +fi + + + +='-fPIC' + archive_cmds='$CC -sSIDE_MODULE=2 -shared $libobjs $deplibs $compiler_flags -o $lib' + archive_expsym_cmds='$SED "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -sSIDE_MODULE=2 -shared $libobjs $deplibs $compiler_flags -o $lib -s EXPORTED_FUNCTIONS=@$output_objdir/$soname.expsym' + archive_cmds_need_lc=no + no_undefined_flag= + ;; + +*) + dynamic_linker=no + ;; +esac +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +printf "%s\n" "$dynamic_linker" >&6; } +test no = "$dynamic_linker" && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test yes = "$GCC"; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then + sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec +fi + +if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then + sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec +fi + +# remember unaugmented sys_lib_dlsearch_path content for libtool script decls... +configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec + +# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code +func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" + +# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool +configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +printf %s "checking how to hardcode library paths into programs... " >&6; } +hardcode_action= +if test -n "$hardcode_libdir_flag_spec" || + test -n "$runpath_var" || + test yes = "$hardcode_automatic"; then + + # We can hardcode non-existent directories. + if test no != "$hardcode_direct" && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, )" && + test no != "$hardcode_minus_L"; then + # Linking always hardcodes the temporary library directory. + hardcode_action=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action=unsupported +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 +printf "%s\n" "$hardcode_action" >&6; } + +if test relink = "$hardcode_action" || + test yes = "$inherit_rpath"; then + # Fast installation is not supported + enable_fast_install=no +elif test yes = "$shlibpath_overrides_runpath" || + test no = "$enable_shared"; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + + + + + + if test yes != "$enable_dlopen"; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen=load_add_on + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | windows* | pw32* | cegcc*) + lt_cv_dlopen=LoadLibrary + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +printf %s "checking for dlopen in -ldl... " >&6; } +if test ${ac_cv_lib_dl_dlopen+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (void); +int +main (void) +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_dl_dlopen=yes +else case e in #( + e) ac_cv_lib_dl_dlopen=no ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes +then : + lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl +else case e in #( + e) + lt_cv_dlopen=dyld + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; +esac +fi + + ;; + + tpf*) + # Don't try to run any link tests for TPF. We know it's impossible + # because TPF is a cross-compiler, and we know how we open DSOs. + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + lt_cv_dlopen_self=no + ;; + + *) + ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" +if test "x$ac_cv_func_shl_load" = xyes +then : + lt_cv_dlopen=shl_load +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 +printf %s "checking for shl_load in -ldld... " >&6; } +if test ${ac_cv_lib_dld_shl_load+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char shl_load (void); +int +main (void) +{ +return shl_load (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_dld_shl_load=yes +else case e in #( + e) ac_cv_lib_dld_shl_load=no ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 +printf "%s\n" "$ac_cv_lib_dld_shl_load" >&6; } +if test "x$ac_cv_lib_dld_shl_load" = xyes +then : + lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld +else case e in #( + e) ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" +if test "x$ac_cv_func_dlopen" = xyes +then : + lt_cv_dlopen=dlopen +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +printf %s "checking for dlopen in -ldl... " >&6; } +if test ${ac_cv_lib_dl_dlopen+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (void); +int +main (void) +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_dl_dlopen=yes +else case e in #( + e) ac_cv_lib_dl_dlopen=no ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes +then : + lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 +printf %s "checking for dlopen in -lsvld... " >&6; } +if test ${ac_cv_lib_svld_dlopen+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) ac_check_lib_save_LIBS=$LIBS +LIBS="-lsvld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (void); +int +main (void) +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_svld_dlopen=yes +else case e in #( + e) ac_cv_lib_svld_dlopen=no ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 +printf "%s\n" "$ac_cv_lib_svld_dlopen" >&6; } +if test "x$ac_cv_lib_svld_dlopen" = xyes +then : + lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 +printf %s "checking for dld_link in -ldld... " >&6; } +if test ${ac_cv_lib_dld_dld_link+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char dld_link (void); +int +main (void) +{ +return dld_link (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_dld_dld_link=yes +else case e in #( + e) ac_cv_lib_dld_dld_link=no ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 +printf "%s\n" "$ac_cv_lib_dld_dld_link" >&6; } +if test "x$ac_cv_lib_dld_dld_link" = xyes +then : + lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld +fi + + ;; +esac +fi + + ;; +esac +fi + + ;; +esac +fi + + ;; +esac +fi + + ;; +esac +fi + + ;; + esac + + if test no = "$lt_cv_dlopen"; then + enable_dlopen=no + else + enable_dlopen=yes + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS=$CPPFLAGS + test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS=$LDFLAGS + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS=$LIBS + LIBS="$lt_cv_dlopen_libs $LIBS" + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 +printf %s "checking whether a program can dlopen itself... " >&6; } +if test ${lt_cv_dlopen_self+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test yes = "$cross_compiling"; then : + lt_cv_dlopen_self=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisibility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord (void) __attribute__((visibility("default"))); +#endif + +int fnord (void) { return 42; } +int main (void) +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self=no + fi +fi +rm -fr conftest* + + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 +printf "%s\n" "$lt_cv_dlopen_self" >&6; } + + if test yes = "$lt_cv_dlopen_self"; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 +printf %s "checking whether a statically linked program can dlopen itself... " >&6; } +if test ${lt_cv_dlopen_self_static+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test yes = "$cross_compiling"; then : + lt_cv_dlopen_self_static=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisibility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord (void) __attribute__((visibility("default"))); +#endif + +int fnord (void) { return 42; } +int main (void) +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self_static=no + fi +fi +rm -fr conftest* + + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 +printf "%s\n" "$lt_cv_dlopen_self_static" >&6; } + fi + + CPPFLAGS=$save_CPPFLAGS + LDFLAGS=$save_LDFLAGS + LIBS=$save_LIBS + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi + + + + + + + + + + + + + + + + + +striplib= +old_striplib= +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 +printf %s "checking whether stripping libraries is possible... " >&6; } +if test -z "$STRIP"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +else + if $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + old_striplib="$STRIP --strip-debug" + striplib="$STRIP --strip-unneeded" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + else + case $host_os in + darwin*) + # FIXME - insert some real tests, host_os isn't really good enough + striplib="$STRIP -x" + old_striplib="$STRIP -S" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + ;; + freebsd*) + if $STRIP -V 2>&1 | $GREP "elftoolchain" >/dev/null; then + old_striplib="$STRIP --strip-debug" + striplib="$STRIP --strip-unneeded" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + fi + ;; + *) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + ;; + esac + fi +fi + + + + + + + + + + + + + # Report what library types will actually be built + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 +printf %s "checking if libtool supports shared libraries... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 +printf "%s\n" "$can_build_shared" >&6; } + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 +printf %s "checking whether to build shared libraries... " >&6; } + test no = "$can_build_shared" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[4-9]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + fi + ;; + esac + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 +printf "%s\n" "$enable_shared" >&6; } + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 +printf %s "checking whether to build static libraries... " >&6; } + # Make sure either enable_shared or enable_static is yes. + test yes = "$enable_shared" || enable_static=yes + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 +printf "%s\n" "$enable_static" >&6; } + + + + +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC=$lt_save_CC + + if test -n "$CXX" && ( test no != "$CXX" && + ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) || + (test g++ != "$CXX"))); then + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 +printf %s "checking how to run the C++ preprocessor... " >&6; } +if test -z "$CXXCPP"; then + if test ${ac_cv_prog_CXXCPP+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) # Double quotes because $CXX needs to be expanded + for CXXCPP in "$CXX -E" cpp /lib/cpp + do + ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + Syntax error +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO" +then : + +else case e in #( + e) # Broken: fails on valid input. +continue ;; +esac +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO" +then : + # Broken: success on invalid input. +continue +else case e in #( + e) # Passes both tests. +ac_preproc_ok=: +break ;; +esac +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of 'break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok +then : + break +fi + + done + ac_cv_prog_CXXCPP=$CXXCPP + ;; +esac +fi + CXXCPP=$ac_cv_prog_CXXCPP +else + ac_cv_prog_CXXCPP=$CXXCPP +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 +printf "%s\n" "$CXXCPP" >&6; } +ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + Syntax error +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO" +then : + +else case e in #( + e) # Broken: fails on valid input. +continue ;; +esac +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO" +then : + # Broken: success on invalid input. +continue +else case e in #( + e) # Passes both tests. +ac_preproc_ok=: +break ;; +esac +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of 'break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok +then : + +else case e in #( + e) { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} +as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check +See 'config.log' for more details" "$LINENO" 5; } ;; +esac +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +else + _lt_caught_CXX_error=yes +fi + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + +archive_cmds_need_lc_CXX=no +allow_undefined_flag_CXX= +always_export_symbols_CXX=no +archive_expsym_cmds_CXX= +compiler_needs_object_CXX=no +export_dynamic_flag_spec_CXX= +hardcode_direct_CXX=no +hardcode_direct_absolute_CXX=no +hardcode_libdir_flag_spec_CXX= +hardcode_libdir_separator_CXX= +hardcode_minus_L_CXX=no +hardcode_shlibpath_var_CXX=unsupported +hardcode_automatic_CXX=no +inherit_rpath_CXX=no +module_cmds_CXX= +module_expsym_cmds_CXX= +link_all_deplibs_CXX=unknown +old_archive_cmds_CXX=$old_archive_cmds +reload_flag_CXX=$reload_flag +reload_cmds_CXX=$reload_cmds +no_undefined_flag_CXX= +whole_archive_flag_spec_CXX= +enable_shared_with_static_runtimes_CXX=no + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +objext_CXX=$objext + +# No sense in running all these tests if we already determined that +# the CXX compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test yes != "$_lt_caught_CXX_error"; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="int some_variable = 0;" + + # Code to be used in simple link tests + lt_simple_link_test_code='int main(int, char *[]) { return(0); }' + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + + # save warnings/boilerplate of simple test code + ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* + + ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* + + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_CFLAGS=$CFLAGS + lt_save_LD=$LD + lt_save_GCC=$GCC + GCC=$GXX + lt_save_with_gnu_ld=$with_gnu_ld + lt_save_path_LD=$lt_cv_path_LD + if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx + else + $as_unset lt_cv_prog_gnu_ld + fi + if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX + else + $as_unset lt_cv_path_LD + fi + test -z "${LDCXX+set}" || LD=$LDCXX + CC=${CXX-"c++"} + CFLAGS=$CXXFLAGS + compiler=$CC + compiler_CXX=$CC + func_cc_basename $compiler +cc_basename=$func_cc_basename_result + + + if test -n "$compiler"; then + # We don't want -fno-exception when compiling C++ code, so set the + # no_builtin_flag separately + if test yes = "$GXX"; then + lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' + else + lt_prog_compiler_no_builtin_flag_CXX= + fi + + if test yes = "$GXX"; then + # Set up default GNU C++ configuration + + + +# Check whether --with-gnu-ld was given. +if test ${with_gnu_ld+y} +then : + withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes +else case e in #( + e) with_gnu_ld=no ;; +esac +fi + +ac_prog=ld +if test yes = "$GCC"; then + # Check if gcc -print-prog-name=ld gives a path. + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +printf %s "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw* | *-*-windows*) + # gcc leaves a trailing carriage return, which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD=$ac_prog + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test yes = "$with_gnu_ld"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +printf %s "checking for GNU ld... " >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +printf %s "checking for non-GNU ld... " >&6; } +fi +if test ${lt_cv_path_LD+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -z "$LD"; then + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD=$ac_dir/$ac_prog + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &5 +printf "%s\n" "$LD" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +printf %s "checking if the linker ($LD) is GNU ld... " >&6; } +if test ${lt_cv_prog_gnu_ld+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 &5 +printf "%s\n" "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + + + + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test yes = "$with_gnu_ld"; then + archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + + hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' + export_dynamic_flag_spec_CXX='$wl--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='$wl' + + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + else + whole_archive_flag_spec_CXX= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " [-]L"' + + else + GXX=no + with_gnu_ld=no + wlarc= + fi + + # PORTME: fill in a description of your system's C++ link characteristics + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +printf %s "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + ld_shlibs_CXX=yes + case $host_os in + aix3*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aix[4-9]*) + if test ia64 = "$host_cpu"; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag= + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds_CXX='' + hardcode_direct_CXX=yes + hardcode_direct_absolute_CXX=yes + hardcode_libdir_separator_CXX=':' + link_all_deplibs_CXX=yes + file_list_spec_CXX='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + hardcode_direct_CXX=no + hardcode_direct_absolute_CXX=no + ;; + esac + + if test yes = "$GXX"; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`$CC -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct_CXX=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L_CXX=yes + hardcode_libdir_flag_spec_CXX='-L$libdir' + hardcode_libdir_separator_CXX= + fi + esac + shared_flag='-shared' + if test yes = "$aix_use_runtimelinking"; then + shared_flag=$shared_flag' $wl-G' + fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' + else + # not using gcc + if test ia64 = "$host_cpu"; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' + else + shared_flag='$wl-bM:SRE' + fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' + fi + fi + + export_dynamic_flag_spec_CXX='$wl-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to + # export. + always_export_symbols_CXX=yes + if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + # The "-G" linker flag allows undefined symbols. + no_undefined_flag_CXX='-bernotok' + # Determine the default libpath from the value encoded in an empty + # executable. + if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if test ${lt_cv_aix_libpath__CXX+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO" +then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX=/usr/lib:/lib + fi + ;; +esac +fi + + aix_libpath=$lt_cv_aix_libpath__CXX +fi + + hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath" + + archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag + else + if test ia64 = "$host_cpu"; then + hardcode_libdir_flag_spec_CXX='$wl-R $libdir:/usr/lib:/lib' + allow_undefined_flag_CXX="-z nodefs" + archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if test ${lt_cv_aix_libpath__CXX+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO" +then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX=/usr/lib:/lib + fi + ;; +esac +fi + + aix_libpath=$lt_cv_aix_libpath__CXX +fi + + hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag_CXX=' $wl-bernotok' + allow_undefined_flag_CXX=' $wl-berok' + if test yes = "$with_gnu_ld"; then + # We only use this code for GNU lds that support --whole-archive. + whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec_CXX='$convenience' + fi + archive_cmds_need_lc_CXX=yes + archive_expsym_cmds_CXX='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared + # libraries. Need -bnortl late, we may have -brtl in LDFLAGS. + archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$RM -r $output_objdir/$realname.d' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag_CXX=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + else + ld_shlibs_CXX=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + cygwin* | mingw* | windows* | pw32* | cegcc*) + case $GXX,$cc_basename in + ,cl* | no,cl* | ,icl* | no,icl*) + # Native MSVC or ICC + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec_CXX=' ' + allow_undefined_flag_CXX=unsupported + always_export_symbols_CXX=yes + file_list_spec_CXX='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + archive_expsym_cmds_CXX='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true' + enable_shared_with_static_runtimes_CXX=yes + # Don't use ranlib + old_postinstall_cmds_CXX='chmod 644 $oldlib' + postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + func_to_tool_file "$lt_outputfile"~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # g++ + # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec_CXX='-L$libdir' + export_dynamic_flag_spec_CXX='$wl--export-all-symbols' + allow_undefined_flag_CXX=unsupported + always_export_symbols_CXX=no + enable_shared_with_static_runtimes_CXX=yes + file_list_spec_CXX='@' + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file, use it as + # is; otherwise, prepend EXPORTS... + archive_expsym_cmds_CXX='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs_CXX=no + fi + ;; + esac + ;; + darwin* | rhapsody*) + + + archive_cmds_need_lc_CXX=no + hardcode_direct_CXX=no + hardcode_automatic_CXX=yes + hardcode_shlibpath_var_CXX=unsupported + if test yes = "$lt_cv_ld_force_load"; then + whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + + else + whole_archive_flag_spec_CXX='' + fi + link_all_deplibs_CXX=yes + allow_undefined_flag_CXX=$_lt_dar_allow_undefined + case $cc_basename in + ifort*|nagfor*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test yes = "$_lt_dar_can_shared"; then + output_verbose_link_cmd=func_echo_all + archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" + module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" + archive_expsym_cmds_CXX="$SED 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" + module_expsym_cmds_CXX="$SED -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" + if test yes = "$_lt_dar_needs_single_mod" -a yes != "$lt_cv_apple_cc_single_mod"; then + archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil" + archive_expsym_cmds_CXX="$SED 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil" + fi + + else + ld_shlibs_CXX=no + fi + + ;; + + os2*) + hardcode_libdir_flag_spec_CXX='-L$libdir' + hardcode_minus_L_CXX=yes + allow_undefined_flag_CXX=unsupported + shrext_cmds=.dll + archive_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + archive_expsym_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + old_archive_from_new_cmds_CXX='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + enable_shared_with_static_runtimes_CXX=yes + file_list_spec_CXX='@' + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + freebsd2.*) + # C++ shared libraries reported to be fairly broken before + # switch to ELF + ld_shlibs_CXX=no + ;; + + freebsd-elf*) + archive_cmds_need_lc_CXX=no + ;; + + freebsd* | dragonfly* | midnightbsd*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + ld_shlibs_CXX=yes + ;; + + haiku*) + archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + link_all_deplibs_CXX=no + ;; + + hpux9*) + hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir' + hardcode_libdir_separator_CXX=: + export_dynamic_flag_spec_CXX='$wl-E' + hardcode_direct_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC*) + archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "[-]L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes = "$GXX"; then + archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + hpux10*|hpux11*) + if test no = "$with_gnu_ld"; then + hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir' + hardcode_libdir_separator_CXX=: + + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + export_dynamic_flag_spec_CXX='$wl-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + ;; + *) + hardcode_direct_CXX=yes + hardcode_direct_absolute_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + archive_cmds_CXX='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP " [-]L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes = "$GXX"; then + if test no = "$with_gnu_ld"; then + case $host_cpu in + hppa*64*) + archive_cmds_CXX='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + interix[3-9]*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' + export_dynamic_flag_spec_CXX='$wl-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds_CXX='$SED "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test yes = "$GXX"; then + if test no = "$with_gnu_ld"; then + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + else + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib' + fi + fi + link_all_deplibs_CXX=yes + ;; + esac + hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' + hardcode_libdir_separator_CXX=: + inherit_rpath_CXX=yes + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + + hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' + export_dynamic_flag_spec_CXX='$wl--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc* | ecpc* ) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + archive_cmds_need_lc_CXX=no + hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' + export_dynamic_flag_spec_CXX='$wl--export-dynamic' + whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + case `$CC -V` in + *pgCC\ [1-5].* | *pgcpp\ [1-5].*) + prelink_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ + compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' + old_archive_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ + $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ + $RANLIB $oldlib' + archive_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 6 and above use weak symbols + archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + + hardcode_libdir_flag_spec_CXX='$wl--rpath $wl$libdir' + export_dynamic_flag_spec_CXX='$wl--export-dynamic' + whole_archive_flag_spec_CXX='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + ;; + cxx*) + # Compaq C++ + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib $wl-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' + ;; + xl* | mpixl* | bgxl*) + # IBM XL 8.0 on PPC, with GNU ld + hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' + export_dynamic_flag_spec_CXX='$wl--export-dynamic' + archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + if test yes = "$supports_anon_versioning"; then + archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' + fi + ;; + *) + case `$CC -V 2>&1 | $SED 5q` in + *Sun\ C*) + # Sun C++ 5.9 + no_undefined_flag_CXX=' -zdefs' + archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + archive_expsym_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols' + hardcode_libdir_flag_spec_CXX='-R$libdir' + whole_archive_flag_spec_CXX='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + compiler_needs_object_CXX=yes + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' + ;; + esac + ;; + esac + ;; + + lynxos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + m88k*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + *-mlibc) + ld_shlibs_CXX=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_direct_CXX=yes + hardcode_shlibpath_var_CXX=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + + *nto* | *qnx*) + ld_shlibs_CXX=yes + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + hardcode_direct_CXX=yes + hardcode_shlibpath_var_CXX=no + hardcode_direct_absolute_CXX=yes + archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then + archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib' + export_dynamic_flag_spec_CXX='$wl-E' + whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + fi + output_verbose_link_cmd=func_echo_all + else + ld_shlibs_CXX=no + fi + ;; + + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' + hardcode_libdir_separator_CXX=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + case $host in + osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; + *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; + esac + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + cxx*) + case $host in + osf3*) + allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*' + archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' + ;; + *) + allow_undefined_flag_CXX=' -expect_unresolved \*' + archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~ + $RM $lib.exp' + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + ;; + esac + + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes,no = "$GXX,$with_gnu_ld"; then + allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*' + case $host in + osf3*) + archive_cmds_CXX='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + ;; + *) + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + ;; + esac + + hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " [-]L"' + + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + psos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + serenity*) + ;; + + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + archive_cmds_need_lc_CXX=yes + no_undefined_flag_CXX=' -zdefs' + archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_shlibpath_var_CXX=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands '-z linker_flag'. + # Supported since Solaris 2.6 (maybe 2.5.1?) + whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' + ;; + esac + link_all_deplibs_CXX=yes + + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test yes,no = "$GXX,$with_gnu_ld"; then + no_undefined_flag_CXX=' $wl-z ${wl}defs' + if $CC --version | $GREP -v '^2\.7' > /dev/null; then + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " [-]L"' + else + # g++ 2.7 appears to require '-G' NOT '-shared' on this + # platform. + archive_cmds_CXX='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " [-]L"' + fi + + hardcode_libdir_flag_spec_CXX='$wl-R $wl$libdir' + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + whole_archive_flag_spec_CXX='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' + ;; + esac + fi + ;; + esac + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag_CXX='$wl-z,text' + archive_cmds_need_lc_CXX=no + hardcode_shlibpath_var_CXX=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We CANNOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag_CXX='$wl-z,text' + allow_undefined_flag_CXX='$wl-z,nodefs' + archive_cmds_need_lc_CXX=no + hardcode_shlibpath_var_CXX=no + hardcode_libdir_flag_spec_CXX='$wl-R,$libdir' + hardcode_libdir_separator_CXX=':' + link_all_deplibs_CXX=yes + export_dynamic_flag_spec_CXX='$wl-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~ + '"$old_archive_cmds_CXX" + reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~ + '"$reload_cmds_CXX" + ;; + *) + archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + vxworks*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 +printf "%s\n" "$ld_shlibs_CXX" >&6; } + test no = "$ld_shlibs_CXX" && can_build_shared=no + + GCC_CXX=$GXX + LD_CXX=$LD + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + # Dependencies to place before and after the object being linked: +predep_objects_CXX= +postdep_objects_CXX= +predeps_CXX= +postdeps_CXX= +compiler_lib_search_path_CXX= + +cat > conftest.$ac_ext <<_LT_EOF +class Foo +{ +public: + Foo (void) { a = 0; } +private: + int a; +}; +_LT_EOF + + +_lt_libdeps_save_CFLAGS=$CFLAGS +case "$CC $CFLAGS " in #( +*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; +*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; +*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; +esac + +if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + for p in `eval "$output_verbose_link_cmd"`; do + case $prev$p in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R,l}" and the path. + # Remove the space. + if test x-L = x"$p" || + test x-R = x"$p" || + test x-l = x"$p"; then + prev=$p + continue + fi + + # Expand the sysroot to ease extracting the directories later. + if test -z "$prev"; then + case $p in + -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; + -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; + -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; + esac + fi + case $p in + =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; + esac + if test no = "$pre_test_object_deps_done"; then + case $prev in + -L | -R) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$compiler_lib_search_path_CXX"; then + compiler_lib_search_path_CXX=$prev$p + else + compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} $prev$p" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$postdeps_CXX"; then + postdeps_CXX=$prev$p + else + postdeps_CXX="${postdeps_CXX} $prev$p" + fi + fi + prev= + ;; + + *.lto.$objext) ;; # Ignore GCC LTO objects + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test no = "$pre_test_object_deps_done"; then + if test -z "$predep_objects_CXX"; then + predep_objects_CXX=$p + else + predep_objects_CXX="$predep_objects_CXX $p" + fi + else + if test -z "$postdep_objects_CXX"; then + postdep_objects_CXX=$p + else + postdep_objects_CXX="$postdep_objects_CXX $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling CXX test program" +fi + +$RM -f confest.$objext +CFLAGS=$_lt_libdeps_save_CFLAGS + +# PORTME: override above test on systems where it is broken +case $host_os in +interix[3-9]*) + # Interix 3.5 installs completely hosed .la files for C++, so rather than + # hack all around it, let's just trust "g++" to DTRT. + predep_objects_CXX= + postdep_objects_CXX= + postdeps_CXX= + ;; +esac + + +case " $postdeps_CXX " in +*" -lc "*) archive_cmds_need_lc_CXX=no ;; +esac + compiler_lib_search_dirs_CXX= +if test -n "${compiler_lib_search_path_CXX}"; then + compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | $SED -e 's! -L! !g' -e 's!^ !!'` +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + lt_prog_compiler_wl_CXX= +lt_prog_compiler_pic_CXX= +lt_prog_compiler_static_CXX= + + + # C++ specific cases for pic, static, wl, etc. + if test yes = "$GXX"; then + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + fi + lt_prog_compiler_pic_CXX='-fPIC' + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + lt_prog_compiler_pic_CXX='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the '-m68020' flag to GCC prevents building anything better, + # like '-m68040'. + lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | windows* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic_CXX='-DDLL_EXPORT' + case $host_os in + os2*) + lt_prog_compiler_static_CXX='$wl-static' + ;; + esac + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic_CXX='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + lt_prog_compiler_pic_CXX= + ;; + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + lt_prog_compiler_static_CXX= + ;; + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic_CXX=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic_CXX='-fPIC -shared' + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + else + case $host_os in + aix[4-9]*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + else + lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + mingw* | windows* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic_CXX='-DDLL_EXPORT' + ;; + dgux*) + case $cc_basename in + ec++*) + lt_prog_compiler_pic_CXX='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | dragonfly* | midnightbsd*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='$wl-a ${wl}archive' + if test ia64 != "$host_cpu"; then + lt_prog_compiler_pic_CXX='+Z' + fi + ;; + aCC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='$wl-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_CXX='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + KCC*) + # KAI C++ Compiler + lt_prog_compiler_wl_CXX='--backend -Wl,' + lt_prog_compiler_pic_CXX='-fPIC' + ;; + ecpc* ) + # old Intel C++ for x86_64, which still supported -KPIC. + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-static' + ;; + icpc* ) + # Intel C++, used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-fPIC' + lt_prog_compiler_static_CXX='-static' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-fpic' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + xlc* | xlC* | bgxl[cC]* | mpixl[cC]*) + # IBM XL 8.0, 9.0 on PPC and BlueGene + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-qpic' + lt_prog_compiler_static_CXX='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | $SED 5q` in + *Sun\ C*) + # Sun C++ 5.9 + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + lt_prog_compiler_wl_CXX='-Qoption ld ' + ;; + esac + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + lt_prog_compiler_pic_CXX='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd* | netbsdelf*-gnu) + ;; + *-mlibc) + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic_CXX='-fPIC -shared' + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + lt_prog_compiler_wl_CXX='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + lt_prog_compiler_pic_CXX='-pic' + ;; + cxx*) + # Digital/Compaq C++ + lt_prog_compiler_wl_CXX='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + serenity*) + ;; + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + lt_prog_compiler_wl_CXX='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + lt_prog_compiler_pic_CXX='-pic' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + lcc*) + # Lucid + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + lt_prog_compiler_pic_CXX='-KPIC' + ;; + *) + ;; + esac + ;; + vxworks*) + ;; + *) + lt_prog_compiler_can_build_shared_CXX=no + ;; + esac + fi + +case $host_os in + # For platforms that do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic_CXX= + ;; + *) + lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" + ;; +esac + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +printf %s "checking for $compiler option to produce PIC... " >&6; } +if test ${lt_cv_prog_compiler_pic_CXX+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5 +printf "%s\n" "$lt_cv_prog_compiler_pic_CXX" >&6; } +lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic_CXX"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 +printf %s "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } +if test ${lt_cv_prog_compiler_pic_works_CXX+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) lt_cv_prog_compiler_pic_works_CXX=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" ## exclude from sc_useless_quotes_in_assignment + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works_CXX=yes + fi + fi + $RM conftest* + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 +printf "%s\n" "$lt_cv_prog_compiler_pic_works_CXX" >&6; } + +if test yes = "$lt_cv_prog_compiler_pic_works_CXX"; then + case $lt_prog_compiler_pic_CXX in + "" | " "*) ;; + *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; + esac +else + lt_prog_compiler_pic_CXX= + lt_prog_compiler_can_build_shared_CXX=no +fi + +fi + + + + + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +printf %s "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if test ${lt_cv_prog_compiler_static_works_CXX+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) lt_cv_prog_compiler_static_works_CXX=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works_CXX=yes + fi + else + lt_cv_prog_compiler_static_works_CXX=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 +printf "%s\n" "$lt_cv_prog_compiler_static_works_CXX" >&6; } + +if test yes = "$lt_cv_prog_compiler_static_works_CXX"; then + : +else + lt_prog_compiler_static_CXX= +fi + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if test ${lt_cv_prog_compiler_c_o_CXX+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) lt_cv_prog_compiler_c_o_CXX=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_CXX=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +printf "%s\n" "$lt_cv_prog_compiler_c_o_CXX" >&6; } + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if test ${lt_cv_prog_compiler_c_o_CXX+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) lt_cv_prog_compiler_c_o_CXX=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_CXX=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +printf "%s\n" "$lt_cv_prog_compiler_c_o_CXX" >&6; } + + + + +hard_links=nottested +if test no = "$lt_cv_prog_compiler_c_o_CXX" && test no != "$need_locks"; then + # do not overwrite the value of need_locks provided by the user + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +printf %s "checking if we can lock with hard links... " >&6; } + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +printf "%s\n" "$hard_links" >&6; } + if test no = "$hard_links"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 +printf "%s\n" "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +printf %s "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + case $host_os in + aix[4-9]*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds_CXX='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "L") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + export_symbols_cmds_CXX=$ltdll_cmds + ;; + cygwin* | mingw* | windows* | cegcc*) + case $cc_basename in + cl* | icl*) + exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + ;; + *) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' + ;; + esac + ;; + *) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 +printf "%s\n" "$ld_shlibs_CXX" >&6; } +test no = "$ld_shlibs_CXX" && can_build_shared=no + +with_gnu_ld_CXX=$with_gnu_ld + + + + + + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc_CXX" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc_CXX=yes + + if test yes,yes = "$GCC,$enable_shared"; then + case $archive_cmds_CXX in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +printf %s "checking whether -lc should be explicitly linked in... " >&6; } +if test ${lt_cv_archive_cmds_need_lc_CXX+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl_CXX + pic_flag=$lt_prog_compiler_pic_CXX + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag_CXX + allow_undefined_flag_CXX= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + lt_cv_archive_cmds_need_lc_CXX=no + else + lt_cv_archive_cmds_need_lc_CXX=yes + fi + allow_undefined_flag_CXX=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5 +printf "%s\n" "$lt_cv_archive_cmds_need_lc_CXX" >&6; } + archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX + ;; + esac + fi + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +printf %s "checking dynamic linker characteristics... " >&6; } + +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=.so +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + + + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='$libname$release$shared_ext$major' + ;; + +aix[4-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test ia64 = "$host_cpu"; then + # AIX 5 supports IA64 + library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line '#! .'. This would cause the generated library to + # depend on '.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # Using Import Files as archive members, it is possible to support + # filename-based versioning of shared library archives on AIX. While + # this would work for both with and without runtime linking, it will + # prevent static linking of such archives. So we do filename-based + # shared library versioning with .so extension only, which is used + # when both runtime linking and shared linking is enabled. + # Unfortunately, runtime linking may impact performance, so we do + # not want this to be the default eventually. Also, we use the + # versioned .so libs for executables only if there is the -brtl + # linker flag in LDFLAGS as well, or --enable-aix-soname=svr4 only. + # To allow for filename-based versioning support, we need to create + # libNAME.so.V as an archive file, containing: + # *) an Import File, referring to the versioned filename of the + # archive as well as the shared archive member, telling the + # bitwidth (32 or 64) of that shared object, and providing the + # list of exported symbols of that shared object, eventually + # decorated with the 'weak' keyword + # *) the shared object with the F_LOADONLY flag set, to really avoid + # it being seen by the linker. + # At run time we better use the real file rather than another symlink, + # but for link time we create the symlink libNAME.so -> libNAME.so.V + + case $with_aix_soname,$aix_use_runtimelinking in + # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + aix,yes) # traditional libtool + dynamic_linker='AIX unversionable lib.so' + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + aix,no) # traditional AIX only + dynamic_linker='AIX lib.a(lib.so.V)' + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + ;; + svr4,*) # full svr4 only + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,yes) # both, prefer svr4 + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # unpreferred sharedlib libNAME.a needs extra handling + postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' + postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,no) # both, prefer aix + dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling + postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' + postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' + ;; + esac + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='$libname$shared_ext' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | windows* | pw32* | cegcc*) + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + # If user builds GCC with multilib enabled, + # it should just install on $(libdir) + # not on $(libdir)/../bin or 32 bits dlls would override 64 bit ones. + if test xyes = x"$multilib"; then + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + $install_prog $dir/$dlname $destdir/$dlname~ + chmod a+x $destdir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib $destdir/$dlname'\'' || exit \$?; + fi' + else + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + fi + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo $libname | $SED -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + + ;; + mingw* | windows* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo $libname | $SED -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl* | *,icl*) + # Native MSVC or ICC + libname_spec='$name' + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + library_names_spec='$libname.dll.lib' + + case $build_os in + mingw* | windows*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec=$LIB + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC and ICC wrapper + library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' + soname_spec='$libname$release$major$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly* | midnightbsd*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[23].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + need_version=yes + ;; + esac + case $host_cpu in + powerpc64) + # On FreeBSD bi-arch platforms, a different variable is used for 32-bit + # binaries. See . + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int test_pointer_size[sizeof (void *) - 5]; + +_ACEOF +if ac_fn_cxx_try_compile "$LINENO" +then : + shlibpath_var=LD_LIBRARY_PATH +else case e in #( + e) shlibpath_var=LD_32_LIBRARY_PATH ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + ;; + *) + shlibpath_var=LD_LIBRARY_PATH + ;; + esac + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/boot/system/non-packaged/develop/lib /boot/system/develop/lib' + sys_lib_dlsearch_path_spec='/boot/home/config/non-packaged/lib /boot/home/config/lib /boot/system/non-packaged/lib /boot/system/lib' + hardcode_into_libs=no + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + if test 32 = "$HPUX_IA64_MODE"; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + sys_lib_dlsearch_path_spec=/usr/lib/hpux32 + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + sys_lib_dlsearch_path_spec=/usr/lib/hpux64 + fi + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[3-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test yes = "$lt_cv_prog_gnu_ld"; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" + sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +linux*android*) + version_type=none # Android doesn't support versioned libraries. + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext $libname$shared_ext' + soname_spec='$libname$release$shared_ext' + finish_cmds= + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + dynamic_linker='Android linker' + # -rpath works at least for libraries that are not overridden by + # libraries installed in system locations. + hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + if test ${lt_cv_shlibpath_overrides_runpath+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO" +then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null +then : + lt_cv_shlibpath_overrides_runpath=yes +fi +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + ;; +esac +fi + + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Add ABI-specific directories to the system library path. + sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib" + + # Ideally, we could use ldconfig to report *all* directories which are + # searched for libraries, however this is still not possible. Aside from not + # being certain /sbin/ldconfig is available, command + # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, + # even though it is searched at run-time. Try to do the best guess by + # appending ld.so.conf contents (and includes) to the search path. + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsdelf*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='NetBSD ld.elf_so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +*-mlibc) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='mlibc ld.so' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec=/usr/lib + need_lib_prefix=no + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + need_version=no + else + need_version=yes + fi + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +os2*) + libname_spec='$name' + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + # OS/2 can only load a DLL with a base name of 8 characters or less. + soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; + v=$($ECHO $release$versuffix | tr -d .-); + n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); + $ECHO $n$v`$shared_ext' + library_names_spec='${libname}_dll.$libext' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=BEGINLIBPATH + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + +rdos*) + dynamic_linker=no + ;; + +serenity*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + dynamic_linker='SerenityOS LibELF' + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test yes = "$with_gnu_ld"; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec; then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' + soname_spec='$libname$shared_ext.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=sco + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test yes = "$with_gnu_ld"; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +emscripten*) + version_type=none + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext' + soname_spec='$libname$release$shared_ext' + finish_cmds= + dynamic_linker="Emscripten linker" + lt_prog_compiler_wl_CXX= +lt_prog_compiler_pic_CXX= +lt_prog_compiler_static_CXX= + + + # C++ specific cases for pic, static, wl, etc. + if test yes = "$GXX"; then + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + fi + lt_prog_compiler_pic_CXX='-fPIC' + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + lt_prog_compiler_pic_CXX='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the '-m68020' flag to GCC prevents building anything better, + # like '-m68040'. + lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | windows* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic_CXX='-DDLL_EXPORT' + case $host_os in + os2*) + lt_prog_compiler_static_CXX='$wl-static' + ;; + esac + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic_CXX='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + lt_prog_compiler_pic_CXX= + ;; + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + lt_prog_compiler_static_CXX= + ;; + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic_CXX=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic_CXX='-fPIC -shared' + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + else + case $host_os in + aix[4-9]*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + else + lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + mingw* | windows* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic_CXX='-DDLL_EXPORT' + ;; + dgux*) + case $cc_basename in + ec++*) + lt_prog_compiler_pic_CXX='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | dragonfly* | midnightbsd*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='$wl-a ${wl}archive' + if test ia64 != "$host_cpu"; then + lt_prog_compiler_pic_CXX='+Z' + fi + ;; + aCC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='$wl-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_CXX='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + KCC*) + # KAI C++ Compiler + lt_prog_compiler_wl_CXX='--backend -Wl,' + lt_prog_compiler_pic_CXX='-fPIC' + ;; + ecpc* ) + # old Intel C++ for x86_64, which still supported -KPIC. + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-static' + ;; + icpc* ) + # Intel C++, used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-fPIC' + lt_prog_compiler_static_CXX='-static' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-fpic' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + xlc* | xlC* | bgxl[cC]* | mpixl[cC]*) + # IBM XL 8.0, 9.0 on PPC and BlueGene + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-qpic' + lt_prog_compiler_static_CXX='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | $SED 5q` in + *Sun\ C*) + # Sun C++ 5.9 + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + lt_prog_compiler_wl_CXX='-Qoption ld ' + ;; + esac + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + lt_prog_compiler_pic_CXX='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd* | netbsdelf*-gnu) + ;; + *-mlibc) + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic_CXX='-fPIC -shared' + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + lt_prog_compiler_wl_CXX='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + lt_prog_compiler_pic_CXX='-pic' + ;; + cxx*) + # Digital/Compaq C++ + lt_prog_compiler_wl_CXX='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + serenity*) + ;; + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + lt_prog_compiler_wl_CXX='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + lt_prog_compiler_pic_CXX='-pic' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + lcc*) + # Lucid + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + lt_prog_compiler_pic_CXX='-KPIC' + ;; + *) + ;; + esac + ;; + vxworks*) + ;; + *) + lt_prog_compiler_can_build_shared_CXX=no + ;; + esac + fi + +case $host_os in + # For platforms that do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic_CXX= + ;; + *) + lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" + ;; +esac + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +printf %s "checking for $compiler option to produce PIC... " >&6; } +if test ${lt_cv_prog_compiler_pic_CXX+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5 +printf "%s\n" "$lt_cv_prog_compiler_pic_CXX" >&6; } +lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic_CXX"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 +printf %s "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } +if test ${lt_cv_prog_compiler_pic_works_CXX+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) lt_cv_prog_compiler_pic_works_CXX=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" ## exclude from sc_useless_quotes_in_assignment + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works_CXX=yes + fi + fi + $RM conftest* + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 +printf "%s\n" "$lt_cv_prog_compiler_pic_works_CXX" >&6; } + +if test yes = "$lt_cv_prog_compiler_pic_works_CXX"; then + case $lt_prog_compiler_pic_CXX in + "" | " "*) ;; + *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; + esac +else + lt_prog_compiler_pic_CXX= + lt_prog_compiler_can_build_shared_CXX=no +fi + +fi + + + + + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +printf %s "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if test ${lt_cv_prog_compiler_static_works_CXX+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) lt_cv_prog_compiler_static_works_CXX=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works_CXX=yes + fi + else + lt_cv_prog_compiler_static_works_CXX=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 +printf "%s\n" "$lt_cv_prog_compiler_static_works_CXX" >&6; } + +if test yes = "$lt_cv_prog_compiler_static_works_CXX"; then + : +else + lt_prog_compiler_static_CXX= +fi + + + +='-fPIC' + archive_cmds_CXX='$CC -sSIDE_MODULE=2 -shared $libobjs $deplibs $compiler_flags -o $lib' + archive_expsym_cmds_CXX='$SED "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -sSIDE_MODULE=2 -shared $libobjs $deplibs $compiler_flags -o $lib -s EXPORTED_FUNCTIONS=@$output_objdir/$soname.expsym' + archive_cmds_need_lc_CXX=no + no_undefined_flag_CXX= + ;; + +*) + dynamic_linker=no + ;; +esac +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +printf "%s\n" "$dynamic_linker" >&6; } +test no = "$dynamic_linker" && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test yes = "$GCC"; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then + sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec +fi + +if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then + sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec +fi + +# remember unaugmented sys_lib_dlsearch_path content for libtool script decls... +configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec + +# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code +func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" + +# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool +configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +printf %s "checking how to hardcode library paths into programs... " >&6; } +hardcode_action_CXX= +if test -n "$hardcode_libdir_flag_spec_CXX" || + test -n "$runpath_var_CXX" || + test yes = "$hardcode_automatic_CXX"; then + + # We can hardcode non-existent directories. + if test no != "$hardcode_direct_CXX" && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" && + test no != "$hardcode_minus_L_CXX"; then + # Linking always hardcodes the temporary library directory. + hardcode_action_CXX=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action_CXX=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action_CXX=unsupported +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 +printf "%s\n" "$hardcode_action_CXX" >&6; } + +if test relink = "$hardcode_action_CXX" || + test yes = "$inherit_rpath_CXX"; then + # Fast installation is not supported + enable_fast_install=no +elif test yes = "$shlibpath_overrides_runpath" || + test no = "$enable_shared"; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + + + + + + + fi # test -n "$compiler" + + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS + LDCXX=$LD + LD=$lt_save_LD + GCC=$lt_save_GCC + with_gnu_ld=$lt_save_with_gnu_ld + lt_cv_path_LDCXX=$lt_cv_path_LD + lt_cv_path_LD=$lt_save_path_LD + lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld + lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +fi # test yes != "$_lt_caught_CXX_error" + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + + + + + + + + + + + + + ac_config_commands="$ac_config_commands libtool" + + + + +# Only expand once: + + + +#AM_PROG_LD +#AC_SUBST(LD) +#AC_PROG_INSTALL +#AC_PROG_MAKE_SET +#AC_PROG_LN_S + +# +# Tests for Windows +# + + + +# Configure libtool +# Check whether --enable-shared was given. +if test ${enable_shared+y} +then : + enableval=$enable_shared; p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else case e in #( + e) enable_shared=yes ;; +esac +fi + + + + + + +# Check whether --enable-static was given. +if test ${enable_static+y} +then : + enableval=$enable_static; p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else case e in #( + e) enable_static=yes ;; +esac +fi + + + + + + +enable_win32_dll=yes + +case $host in +*-*-cygwin* | *-*-mingw* | *-*-windows* | *-*-pw32* | *-*-cegcc*) + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args. +set dummy ${ac_tool_prefix}as; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_AS+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -n "$AS"; then + ac_cv_prog_AS="$AS" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_AS="${ac_tool_prefix}as" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi ;; +esac +fi +AS=$ac_cv_prog_AS +if test -n "$AS"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AS" >&5 +printf "%s\n" "$AS" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_AS"; then + ac_ct_AS=$AS + # Extract the first word of "as", so it can be a program name with args. +set dummy as; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_AS+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -n "$ac_ct_AS"; then + ac_cv_prog_ac_ct_AS="$ac_ct_AS" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AS="as" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi ;; +esac +fi +ac_ct_AS=$ac_cv_prog_ac_ct_AS +if test -n "$ac_ct_AS"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AS" >&5 +printf "%s\n" "$ac_ct_AS" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_AS" = x; then + AS="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AS=$ac_ct_AS + fi +else + AS="$ac_cv_prog_AS" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. +set dummy ${ac_tool_prefix}dlltool; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_DLLTOOL+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -n "$DLLTOOL"; then + ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi ;; +esac +fi +DLLTOOL=$ac_cv_prog_DLLTOOL +if test -n "$DLLTOOL"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 +printf "%s\n" "$DLLTOOL" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DLLTOOL"; then + ac_ct_DLLTOOL=$DLLTOOL + # Extract the first word of "dlltool", so it can be a program name with args. +set dummy dlltool; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_DLLTOOL+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -n "$ac_ct_DLLTOOL"; then + ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DLLTOOL="dlltool" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi ;; +esac +fi +ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL +if test -n "$ac_ct_DLLTOOL"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 +printf "%s\n" "$ac_ct_DLLTOOL" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_DLLTOOL" = x; then + DLLTOOL="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DLLTOOL=$ac_ct_DLLTOOL + fi +else + DLLTOOL="$ac_cv_prog_DLLTOOL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. +set dummy ${ac_tool_prefix}objdump; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_OBJDUMP+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -n "$OBJDUMP"; then + ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi ;; +esac +fi +OBJDUMP=$ac_cv_prog_OBJDUMP +if test -n "$OBJDUMP"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 +printf "%s\n" "$OBJDUMP" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OBJDUMP"; then + ac_ct_OBJDUMP=$OBJDUMP + # Extract the first word of "objdump", so it can be a program name with args. +set dummy objdump; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_OBJDUMP+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -n "$ac_ct_OBJDUMP"; then + ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OBJDUMP="objdump" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi ;; +esac +fi +ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP +if test -n "$ac_ct_OBJDUMP"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 +printf "%s\n" "$ac_ct_OBJDUMP" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_OBJDUMP" = x; then + OBJDUMP="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OBJDUMP=$ac_ct_OBJDUMP + fi +else + OBJDUMP="$ac_cv_prog_OBJDUMP" +fi + + ;; +esac + +test -z "$AS" && AS=as + + + + + +test -z "$DLLTOOL" && DLLTOOL=dlltool + + +test -z "$OBJDUMP" && OBJDUMP=objdump + + + + + + + + +LIB_PLUGINS='' + +# Add configure option --enable-maintainer-mode which enables dependency +# checking and generation useful to package maintainers. This is made an +# option to avoid confusing end users. + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 +printf %s "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } + # Check whether --enable-maintainer-mode was given. +if test ${enable_maintainer_mode+y} +then : + enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval +else case e in #( + e) USE_MAINTAINER_MODE=no ;; +esac +fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 +printf "%s\n" "$USE_MAINTAINER_MODE" >&6; } + if test $USE_MAINTAINER_MODE = yes; then + MAINTAINER_MODE_TRUE= + MAINTAINER_MODE_FALSE='#' +else + MAINTAINER_MODE_TRUE='#' + MAINTAINER_MODE_FALSE= +fi + + MAINT=$MAINTAINER_MODE_TRUE + + + +# If the C compiler supports the keyword inline, do nothing. Otherwise +# define inline to __inline__ or __inline if it accepts one of those, +# otherwise define inline to be empty. +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 +printf %s "checking for inline... " >&6; } +if test ${ac_cv_c_inline+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) ac_cv_c_inline=no +for ac_kw in inline __inline__ __inline; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifndef __cplusplus +typedef int foo_t; +static $ac_kw foo_t static_foo (void) {return 0; } +$ac_kw foo_t foo (void) {return 0; } +#endif + +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_c_inline=$ac_kw +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + test "$ac_cv_c_inline" != no && break +done + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 +printf "%s\n" "$ac_cv_c_inline" >&6; } + +case $ac_cv_c_inline in + inline | yes) ;; + *) + case $ac_cv_c_inline in + no) ac_val=;; + *) ac_val=$ac_cv_c_inline;; + esac + cat >>confdefs.h <<_ACEOF +#ifndef __cplusplus +#define inline $ac_val +#endif +_ACEOF + ;; +esac + + + +# Check if the C compiler supports the "visibility" function attribute +# If supported, defines HAVE_FUNC_ATTRIBUTE_VISIBILITY + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for __attribute__((visibility))" >&5 +printf %s "checking for __attribute__((visibility))... " >&6; } +if test ${ax_cv_have_func_attribute_visibility+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + + int foo_def( void ) __attribute__((visibility("default"))); + int foo_hid( void ) __attribute__((visibility("hidden"))); + int foo_int( void ) __attribute__((visibility("internal"))); + int foo_pro( void ) __attribute__((visibility("protected"))); + +int +main (void) +{ + + ; + return 0; +} + +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + if grep -- -Wattributes conftest.err +then : + ax_cv_have_func_attribute_visibility=no +else case e in #( + e) ax_cv_have_func_attribute_visibility=yes ;; +esac +fi +else case e in #( + e) ax_cv_have_func_attribute_visibility=no ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_have_func_attribute_visibility" >&5 +printf "%s\n" "$ax_cv_have_func_attribute_visibility" >&6; } + + if test yes = $ax_cv_have_func_attribute_visibility +then : + +printf "%s\n" "#define HAVE_FUNC_ATTRIBUTE_VISIBILITY 1" >>confdefs.h + +fi + + + + +# Check if the compiler supports "-fvisibility=hidden" and if yes, add it to CFLAGS +# This means that symbols that are not marked explicitly for export (CMSAPI) +# will not be reachable in the shared library. + + + + +for flag in "-fvisibility=hidden"; do + as_CACHEVAR=`printf "%s\n" "ax_cv_check_cflags__$flag" | sed "$as_sed_sh"` +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $flag" >&5 +printf %s "checking whether C compiler accepts $flag... " >&6; } +if eval test \${$as_CACHEVAR+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) + ax_check_save_flags=$CFLAGS + CFLAGS="$CFLAGS $flag" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + eval "$as_CACHEVAR=yes" +else case e in #( + e) eval "$as_CACHEVAR=no" ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + CFLAGS=$ax_check_save_flags ;; +esac +fi +eval ac_res=\$$as_CACHEVAR + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } +if eval test \"x\$"$as_CACHEVAR"\" = x"yes" +then : + +if test ${CFLAGS+y} +then : + + case " $CFLAGS " in #( + *" $flag "*) : + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : CFLAGS already contains \$flag"; } >&5 + (: CFLAGS already contains $flag) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append CFLAGS " $flag" + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS\""; } >&5 + (: CFLAGS="$CFLAGS") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else case e in #( + e) + CFLAGS=$flag + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS\""; } >&5 + (: CFLAGS="$CFLAGS") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac +fi + +else case e in #( + e) : ;; +esac +fi + +done + + +# If words are stored with the most significant byte first (like +# Motorola and SPARC CPUs), define `WORDS_BIGENDIAN'. + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 +printf %s "checking whether byte ordering is bigendian... " >&6; } +if test ${ac_cv_c_bigendian+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) ac_cv_c_bigendian=unknown + # See if we're dealing with a universal compiler. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifndef __APPLE_CC__ + not a universal capable compiler + #endif + typedef int dummy; + +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + + # Check for potential -arch flags. It is not universal unless + # there are at least two -arch flags with different values. + ac_arch= + ac_prev= + for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do + if test -n "$ac_prev"; then + case $ac_word in + i?86 | x86_64 | ppc | ppc64) + if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then + ac_arch=$ac_word + else + ac_cv_c_bigendian=universal + break + fi + ;; + esac + ac_prev= + elif test "x$ac_word" = "x-arch"; then + ac_prev=arch + fi + done +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + if test $ac_cv_c_bigendian = unknown; then + # See if sys/param.h defines the BYTE_ORDER macro. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + #include + +int +main (void) +{ +#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \\ + && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \\ + && LITTLE_ENDIAN) + bogus endian macros + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + # It does; now see whether it defined to BIG_ENDIAN or not. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + #include + +int +main (void) +{ +#if BYTE_ORDER != BIG_ENDIAN + not big endian + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_c_bigendian=yes +else case e in #( + e) ac_cv_c_bigendian=no ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + fi + if test $ac_cv_c_bigendian = unknown; then + # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +int +main (void) +{ +#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) + bogus endian macros + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + # It does; now see whether it defined to _BIG_ENDIAN or not. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +int +main (void) +{ +#ifndef _BIG_ENDIAN + not big endian + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_c_bigendian=yes +else case e in #( + e) ac_cv_c_bigendian=no ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + fi + if test $ac_cv_c_bigendian = unknown; then + # Compile a test program. + if test "$cross_compiling" = yes +then : + # Try to guess by grepping values from an object file. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +unsigned short int ascii_mm[] = + { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; + unsigned short int ascii_ii[] = + { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; + int use_ascii (int i) { + return ascii_mm[i] + ascii_ii[i]; + } + unsigned short int ebcdic_ii[] = + { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; + unsigned short int ebcdic_mm[] = + { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; + int use_ebcdic (int i) { + return ebcdic_mm[i] + ebcdic_ii[i]; + } + int + main (int argc, char **argv) + { + /* Intimidate the compiler so that it does not + optimize the arrays away. */ + char *p = argv[0]; + ascii_mm[1] = *p++; ebcdic_mm[1] = *p++; + ascii_ii[1] = *p++; ebcdic_ii[1] = *p++; + return use_ascii (argc) == use_ebcdic (*p); + } +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + if grep BIGenDianSyS conftest$ac_exeext >/dev/null; then + ac_cv_c_bigendian=yes + fi + if grep LiTTleEnDian conftest$ac_exeext >/dev/null ; then + if test "$ac_cv_c_bigendian" = unknown; then + ac_cv_c_bigendian=no + else + # finding both strings is unlikely to happen, but who knows? + ac_cv_c_bigendian=unknown + fi + fi +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +int +main (void) +{ + + /* Are we little or big endian? From Harbison&Steele. */ + union + { + long int l; + char c[sizeof (long int)]; + } u; + u.l = 1; + return u.c[sizeof (long int) - 1] == 1; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + ac_cv_c_bigendian=no +else case e in #( + e) ac_cv_c_bigendian=yes ;; +esac +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac +fi + + fi ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 +printf "%s\n" "$ac_cv_c_bigendian" >&6; } + case $ac_cv_c_bigendian in #( + yes) + printf "%s\n" "#define WORDS_BIGENDIAN 1" >>confdefs.h +;; #( + no) + ;; #( + universal) + +printf "%s\n" "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h + + ;; #( + *) + as_fn_error $? "unknown endianness + presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; + esac + + +# Check for threadsafe variants of gmtime +# Note: check for gmtime_s is a bit more complex as it is implemented as a macro + + for ac_func in gmtime_r +do : + ac_fn_c_check_func "$LINENO" "gmtime_r" "ac_cv_func_gmtime_r" +if test "x$ac_cv_func_gmtime_r" = xyes +then : + printf "%s\n" "#define HAVE_GMTIME_R 1" >>confdefs.h + +else case e in #( + e) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gmtime_s" >&5 +printf %s "checking for gmtime_s... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #include +int +main (void) +{ + + time_t t; + struct tm m; + gmtime_s(&m, &t); + return 0; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + +printf "%s\n" "#define HAVE_GMTIME_S 1" >>confdefs.h + +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext ;; +esac +fi + +done + +# Point to JPEG installed in DIR or disable JPEG with --without-jpeg. + +# Check whether --with-jpeg was given. +if test ${with_jpeg+y} +then : + withval=$with_jpeg; + if test "x$withval" = "xno" ; then + with_jpeg='no' + else + if test "x$withval" != "xyes" ; then + with_jpeg=$withval + JPEG_DIR=$withval + CPPFLAGS="$CPPFLAGS -I$JPEG_DIR/include" + LDFLAGS="$LDFLAGS -L$JPEG_DIR/lib" + fi + with_jpeg='yes' + fi + +else case e in #( + e) with_jpeg='yes' ;; +esac +fi + + +# Point to TIFF installed in DIR or disable TIFF with --without-tiff. + +# Check whether --with-tiff was given. +if test ${with_tiff+y} +then : + withval=$with_tiff; + if test "x$withval" = "xno" ; then + with_tiff='no' + else + if test "x$withval" != "xyes" ; then + with_tiff=$withval + TIFF_DIR=$withval + CPPFLAGS="$CPPFLAGS -I$TIFF_DIR/include" + LDFLAGS="$LDFLAGS -L$TIFF_DIR/lib" + fi + with_tiff='yes' + fi + +else case e in #( + e) with_tiff='yes' ;; +esac +fi + + +# Disable ZLIB + +# Check whether --with-zlib was given. +if test ${with_zlib+y} +then : + withval=$with_zlib; with_zlib=$withval +else case e in #( + e) with_zlib='yes' ;; +esac +fi + + +#fast_float plugin: + +# Check whether --with-fastfloat was given. +if test ${with_fastfloat+y} +then : + withval=$with_fastfloat; + with_fastfloat=$withval + +else case e in #( + e) + with_fastfloat='no' + ;; +esac +fi + +if test "x$with_fastfloat" = "xyes" +then + LIB_PLUGINS="$LIB_PLUGINS -llcms2_fast_float" +fi + +#multi threaded plugin: + +# Check whether --with-threaded was given. +if test ${with_threaded+y} +then : + withval=$with_threaded; + with_threaded=$withval + +else case e in #( + e) + with_threaded='no' + ;; +esac +fi + +if test "x$with_threaded" = "xyes" +then + LIB_PLUGINS="$LIB_PLUGINS -llcms2_threaded" +fi + +# +# Determine POSIX threads settings +# +# Enable support for POSIX thread APIs + +# Check whether --with-threads was given. +if test ${with_threads+y} +then : + withval=$with_threads; with_threads=$withval +else case e in #( + e) with_threads='yes' ;; +esac +fi + + +have_threads=no +if test "$with_threads" != 'no' +then + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for egrep -e" >&5 +printf %s "checking for egrep -e... " >&6; } +if test ${ac_cv_path_EGREP_TRADITIONAL+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -z "$EGREP_TRADITIONAL"; then + ac_path_EGREP_TRADITIONAL_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in grep ggrep + do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP_TRADITIONAL="$as_dir$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_EGREP_TRADITIONAL" || continue +# Check for GNU ac_path_EGREP_TRADITIONAL and select it if it is found. + # Check for GNU $ac_path_EGREP_TRADITIONAL +case `"$ac_path_EGREP_TRADITIONAL" --version 2>&1` in #( +*GNU*) + ac_cv_path_EGREP_TRADITIONAL="$ac_path_EGREP_TRADITIONAL" ac_path_EGREP_TRADITIONAL_found=:;; +#( +*) + ac_count=0 + printf %s 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + printf "%s\n" 'EGREP_TRADITIONAL' >> "conftest.nl" + "$ac_path_EGREP_TRADITIONAL" -E 'EGR(EP|AC)_TRADITIONAL$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_TRADITIONAL_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP_TRADITIONAL="$ac_path_EGREP_TRADITIONAL" + ac_path_EGREP_TRADITIONAL_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_TRADITIONAL_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP_TRADITIONAL"; then + : + fi +else + ac_cv_path_EGREP_TRADITIONAL=$EGREP_TRADITIONAL +fi + + if test "$ac_cv_path_EGREP_TRADITIONAL" +then : + ac_cv_path_EGREP_TRADITIONAL="$ac_cv_path_EGREP_TRADITIONAL -E" +else case e in #( + e) if test -z "$EGREP_TRADITIONAL"; then + ac_path_EGREP_TRADITIONAL_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in egrep + do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP_TRADITIONAL="$as_dir$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_EGREP_TRADITIONAL" || continue +# Check for GNU ac_path_EGREP_TRADITIONAL and select it if it is found. + # Check for GNU $ac_path_EGREP_TRADITIONAL +case `"$ac_path_EGREP_TRADITIONAL" --version 2>&1` in #( +*GNU*) + ac_cv_path_EGREP_TRADITIONAL="$ac_path_EGREP_TRADITIONAL" ac_path_EGREP_TRADITIONAL_found=:;; +#( +*) + ac_count=0 + printf %s 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + printf "%s\n" 'EGREP_TRADITIONAL' >> "conftest.nl" + "$ac_path_EGREP_TRADITIONAL" 'EGR(EP|AC)_TRADITIONAL$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_TRADITIONAL_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP_TRADITIONAL="$ac_path_EGREP_TRADITIONAL" + ac_path_EGREP_TRADITIONAL_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_TRADITIONAL_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP_TRADITIONAL"; then + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP_TRADITIONAL=$EGREP_TRADITIONAL +fi + ;; +esac +fi ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP_TRADITIONAL" >&5 +printf "%s\n" "$ac_cv_path_EGREP_TRADITIONAL" >&6; } + EGREP_TRADITIONAL=$ac_cv_path_EGREP_TRADITIONAL + + + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +ax_pthread_ok=no + +# We used to check for pthread.h first, but this fails if pthread.h +# requires special compiler flags (e.g. on Tru64 or Sequent). +# It gets checked for in the link test anyway. + +# First of all, check if the user has set any of the PTHREAD_LIBS, +# etcetera environment variables, and if threads linking works using +# them: +if test "x$PTHREAD_CFLAGS$PTHREAD_LIBS" != "x"; then + ax_pthread_save_CC="$CC" + ax_pthread_save_CFLAGS="$CFLAGS" + ax_pthread_save_LIBS="$LIBS" + if test "x$PTHREAD_CC" != "x" +then : + CC="$PTHREAD_CC" +fi + if test "x$PTHREAD_CXX" != "x" +then : + CXX="$PTHREAD_CXX" +fi + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS" >&5 +printf %s "checking for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char pthread_join (void); +int +main (void) +{ +return pthread_join (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ax_pthread_ok=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5 +printf "%s\n" "$ax_pthread_ok" >&6; } + if test "x$ax_pthread_ok" = "xno"; then + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" + fi + CC="$ax_pthread_save_CC" + CFLAGS="$ax_pthread_save_CFLAGS" + LIBS="$ax_pthread_save_LIBS" +fi + +# We must check for the threads library under a number of different +# names; the ordering is very important because some systems +# (e.g. DEC) have both -lpthread and -lpthreads, where one of the +# libraries is broken (non-POSIX). + +# Create a list of thread flags to try. Items with a "," contain both +# C compiler flags (before ",") and linker flags (after ","). Other items +# starting with a "-" are C compiler flags, and remaining items are +# library names, except for "none" which indicates that we try without +# any flags at all, and "pthread-config" which is a program returning +# the flags for the Pth emulation library. + +ax_pthread_flags="pthreads none -Kthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" + +# The ordering *is* (sometimes) important. Some notes on the +# individual items follow: + +# pthreads: AIX (must check this before -lpthread) +# none: in case threads are in libc; should be tried before -Kthread and +# other compiler flags to prevent continual compiler warnings +# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) +# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads), Tru64 +# (Note: HP C rejects this with "bad form for `-t' option") +# -pthreads: Solaris/gcc (Note: HP C also rejects) +# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it +# doesn't hurt to check since this sometimes defines pthreads and +# -D_REENTRANT too), HP C (must be checked before -lpthread, which +# is present but should not be used directly; and before -mthreads, +# because the compiler interprets this as "-mt" + "-hreads") +# -mthreads: Mingw32/gcc, Lynx/gcc +# pthread: Linux, etcetera +# --thread-safe: KAI C++ +# pthread-config: use pthread-config program (for GNU Pth library) + +case $host_os in + + freebsd*) + + # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) + # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) + + ax_pthread_flags="-kthread lthread $ax_pthread_flags" + ;; + + hpux*) + + # From the cc(1) man page: "[-mt] Sets various -D flags to enable + # multi-threading and also sets -lpthread." + + ax_pthread_flags="-mt -pthread pthread $ax_pthread_flags" + ;; + + openedition*) + + # IBM z/OS requires a feature-test macro to be defined in order to + # enable POSIX threads at all, so give the user a hint if this is + # not set. (We don't define these ourselves, as they can affect + # other portions of the system API in unpredictable ways.) + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +# if !defined(_OPEN_THREADS) && !defined(_UNIX03_THREADS) + AX_PTHREAD_ZOS_MISSING +# endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP_TRADITIONAL "AX_PTHREAD_ZOS_MISSING" >/dev/null 2>&1 +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support." >&5 +printf "%s\n" "$as_me: WARNING: IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support." >&2;} +fi +rm -rf conftest* + + ;; + + solaris*) + + # On Solaris (at least, for some versions), libc contains stubbed + # (non-functional) versions of the pthreads routines, so link-based + # tests will erroneously succeed. (N.B.: The stubs are missing + # pthread_cleanup_push, or rather a function called by this macro, + # so we could check for that, but who knows whether they'll stub + # that too in a future libc.) So we'll check first for the + # standard Solaris way of linking pthreads (-mt -lpthread). + + ax_pthread_flags="-mt,-lpthread pthread $ax_pthread_flags" + ;; +esac + +# Are we compiling with Clang? + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC is Clang" >&5 +printf %s "checking whether $CC is Clang... " >&6; } +if test ${ax_cv_PTHREAD_CLANG+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) ax_cv_PTHREAD_CLANG=no + # Note that Autoconf sets GCC=yes for Clang as well as GCC + if test "x$GCC" = "xyes"; then + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Note: Clang 2.7 lacks __clang_[a-z]+__ */ +# if defined(__clang__) && defined(__llvm__) + AX_PTHREAD_CC_IS_CLANG +# endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP_TRADITIONAL "AX_PTHREAD_CC_IS_CLANG" >/dev/null 2>&1 +then : + ax_cv_PTHREAD_CLANG=yes +fi +rm -rf conftest* + + fi + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_CLANG" >&5 +printf "%s\n" "$ax_cv_PTHREAD_CLANG" >&6; } +ax_pthread_clang="$ax_cv_PTHREAD_CLANG" + + +# GCC generally uses -pthread, or -pthreads on some platforms (e.g. SPARC) + +# Note that for GCC and Clang -pthread generally implies -lpthread, +# except when -nostdlib is passed. +# This is problematic using libtool to build C++ shared libraries with pthread: +# [1] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=25460 +# [2] https://bugzilla.redhat.com/show_bug.cgi?id=661333 +# [3] https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=468555 +# To solve this, first try -pthread together with -lpthread for GCC + +if test "x$GCC" = "xyes" +then : + ax_pthread_flags="-pthread,-lpthread -pthread -pthreads $ax_pthread_flags" +fi + +# Clang takes -pthread (never supported any other flag), but we'll try with -lpthread first + +if test "x$ax_pthread_clang" = "xyes" +then : + ax_pthread_flags="-pthread,-lpthread -pthread" +fi + + +# The presence of a feature test macro requesting re-entrant function +# definitions is, on some systems, a strong hint that pthreads support is +# correctly enabled + +case $host_os in + darwin* | hpux* | linux* | osf* | solaris*) + ax_pthread_check_macro="_REENTRANT" + ;; + + aix*) + ax_pthread_check_macro="_THREAD_SAFE" + ;; + + *) + ax_pthread_check_macro="--" + ;; +esac +if test "x$ax_pthread_check_macro" = "x--" +then : + ax_pthread_check_cond=0 +else case e in #( + e) ax_pthread_check_cond="!defined($ax_pthread_check_macro)" ;; +esac +fi + + +if test "x$ax_pthread_ok" = "xno"; then +for ax_pthread_try_flag in $ax_pthread_flags; do + + case $ax_pthread_try_flag in + none) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether pthreads work without any flags" >&5 +printf %s "checking whether pthreads work without any flags... " >&6; } + ;; + + *,*) + PTHREAD_CFLAGS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\1/"` + PTHREAD_LIBS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\2/"` + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with \"$PTHREAD_CFLAGS\" and \"$PTHREAD_LIBS\"" >&5 +printf %s "checking whether pthreads work with \"$PTHREAD_CFLAGS\" and \"$PTHREAD_LIBS\"... " >&6; } + ;; + + -*) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with $ax_pthread_try_flag" >&5 +printf %s "checking whether pthreads work with $ax_pthread_try_flag... " >&6; } + PTHREAD_CFLAGS="$ax_pthread_try_flag" + ;; + + pthread-config) + # Extract the first word of "pthread-config", so it can be a program name with args. +set dummy pthread-config; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ax_pthread_config+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -n "$ax_pthread_config"; then + ac_cv_prog_ax_pthread_config="$ax_pthread_config" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ax_pthread_config="yes" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_prog_ax_pthread_config" && ac_cv_prog_ax_pthread_config="no" +fi ;; +esac +fi +ax_pthread_config=$ac_cv_prog_ax_pthread_config +if test -n "$ax_pthread_config"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_config" >&5 +printf "%s\n" "$ax_pthread_config" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + if test "x$ax_pthread_config" = "xno" +then : + continue +fi + PTHREAD_CFLAGS="`pthread-config --cflags`" + PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" + ;; + + *) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for the pthreads library -l$ax_pthread_try_flag" >&5 +printf %s "checking for the pthreads library -l$ax_pthread_try_flag... " >&6; } + PTHREAD_LIBS="-l$ax_pthread_try_flag" + ;; + esac + + ax_pthread_save_CFLAGS="$CFLAGS" + ax_pthread_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + + # Check for various functions. We must include pthread.h, + # since some functions may be macros. (On the Sequent, we + # need a special flag -Kthread to make this header compile.) + # We check for pthread_join because it is in -lpthread on IRIX + # while pthread_create is in libc. We check for pthread_attr_init + # due to DEC craziness with -lpthreads. We check for + # pthread_cleanup_push because it is one of the few pthread + # functions on Solaris that doesn't have a non-functional libc stub. + # We try pthread_create on general principles. + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +# if $ax_pthread_check_cond +# error "$ax_pthread_check_macro must be defined" +# endif + static void *some_global = NULL; + static void routine(void *a) + { + /* To avoid any unused-parameter or + unused-but-set-parameter warning. */ + some_global = a; + } + static void *start_routine(void *a) { return a; } +int +main (void) +{ +pthread_t th; pthread_attr_t attr; + pthread_create(&th, 0, start_routine, 0); + pthread_join(th, 0); + pthread_attr_init(&attr); + pthread_cleanup_push(routine, 0); + pthread_cleanup_pop(0) /* ; */ + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ax_pthread_ok=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + + CFLAGS="$ax_pthread_save_CFLAGS" + LIBS="$ax_pthread_save_LIBS" + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5 +printf "%s\n" "$ax_pthread_ok" >&6; } + if test "x$ax_pthread_ok" = "xyes" +then : + break +fi + + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" +done +fi + + +# Clang needs special handling, because older versions handle the -pthread +# option in a rather... idiosyncratic way + +if test "x$ax_pthread_clang" = "xyes"; then + + # Clang takes -pthread; it has never supported any other flag + + # (Note 1: This will need to be revisited if a system that Clang + # supports has POSIX threads in a separate library. This tends not + # to be the way of modern systems, but it's conceivable.) + + # (Note 2: On some systems, notably Darwin, -pthread is not needed + # to get POSIX threads support; the API is always present and + # active. We could reasonably leave PTHREAD_CFLAGS empty. But + # -pthread does define _REENTRANT, and while the Darwin headers + # ignore this macro, third-party headers might not.) + + # However, older versions of Clang make a point of warning the user + # that, in an invocation where only linking and no compilation is + # taking place, the -pthread option has no effect ("argument unused + # during compilation"). They expect -pthread to be passed in only + # when source code is being compiled. + # + # Problem is, this is at odds with the way Automake and most other + # C build frameworks function, which is that the same flags used in + # compilation (CFLAGS) are also used in linking. Many systems + # supported by AX_PTHREAD require exactly this for POSIX threads + # support, and in fact it is often not straightforward to specify a + # flag that is used only in the compilation phase and not in + # linking. Such a scenario is extremely rare in practice. + # + # Even though use of the -pthread flag in linking would only print + # a warning, this can be a nuisance for well-run software projects + # that build with -Werror. So if the active version of Clang has + # this misfeature, we search for an option to squash it. + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether Clang needs flag to prevent \"argument unused\" warning when linking with -pthread" >&5 +printf %s "checking whether Clang needs flag to prevent \"argument unused\" warning when linking with -pthread... " >&6; } +if test ${ax_cv_PTHREAD_CLANG_NO_WARN_FLAG+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) ax_cv_PTHREAD_CLANG_NO_WARN_FLAG=unknown + # Create an alternate version of $ac_link that compiles and + # links in two steps (.c -> .o, .o -> exe) instead of one + # (.c -> exe), because the warning occurs only in the second + # step + ax_pthread_save_ac_link="$ac_link" + ax_pthread_sed='s/conftest\.\$ac_ext/conftest.$ac_objext/g' + ax_pthread_link_step=`printf "%s\n" "$ac_link" | sed "$ax_pthread_sed"` + ax_pthread_2step_ac_link="($ac_compile) && (echo ==== >&5) && ($ax_pthread_link_step)" + ax_pthread_save_CFLAGS="$CFLAGS" + for ax_pthread_try in '' -Qunused-arguments -Wno-unused-command-line-argument unknown; do + if test "x$ax_pthread_try" = "xunknown" +then : + break +fi + CFLAGS="-Werror -Wunknown-warning-option $ax_pthread_try -pthread $ax_pthread_save_CFLAGS" + ac_link="$ax_pthread_save_ac_link" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int main(void){return 0;} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_link="$ax_pthread_2step_ac_link" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int main(void){return 0;} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + break +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + done + ac_link="$ax_pthread_save_ac_link" + CFLAGS="$ax_pthread_save_CFLAGS" + if test "x$ax_pthread_try" = "x" +then : + ax_pthread_try=no +fi + ax_cv_PTHREAD_CLANG_NO_WARN_FLAG="$ax_pthread_try" + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" >&5 +printf "%s\n" "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" >&6; } + + case "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" in + no | unknown) ;; + *) PTHREAD_CFLAGS="$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG $PTHREAD_CFLAGS" ;; + esac + +fi # $ax_pthread_clang = yes + + + +# Various other checks: +if test "x$ax_pthread_ok" = "xyes"; then + ax_pthread_save_CFLAGS="$CFLAGS" + ax_pthread_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + + # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for joinable pthread attribute" >&5 +printf %s "checking for joinable pthread attribute... " >&6; } +if test ${ax_cv_PTHREAD_JOINABLE_ATTR+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) ax_cv_PTHREAD_JOINABLE_ATTR=unknown + for ax_pthread_attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main (void) +{ +int attr = $ax_pthread_attr; return attr /* ; */ + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ax_cv_PTHREAD_JOINABLE_ATTR=$ax_pthread_attr; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + done + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_JOINABLE_ATTR" >&5 +printf "%s\n" "$ax_cv_PTHREAD_JOINABLE_ATTR" >&6; } + if test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xunknown" && \ + test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xPTHREAD_CREATE_JOINABLE" && \ + test "x$ax_pthread_joinable_attr_defined" != "xyes" +then : + +printf "%s\n" "#define PTHREAD_CREATE_JOINABLE $ax_cv_PTHREAD_JOINABLE_ATTR" >>confdefs.h + + ax_pthread_joinable_attr_defined=yes + +fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether more special flags are required for pthreads" >&5 +printf %s "checking whether more special flags are required for pthreads... " >&6; } +if test ${ax_cv_PTHREAD_SPECIAL_FLAGS+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) ax_cv_PTHREAD_SPECIAL_FLAGS=no + case $host_os in + solaris*) + ax_cv_PTHREAD_SPECIAL_FLAGS="-D_POSIX_PTHREAD_SEMANTICS" + ;; + esac + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_SPECIAL_FLAGS" >&5 +printf "%s\n" "$ax_cv_PTHREAD_SPECIAL_FLAGS" >&6; } + if test "x$ax_cv_PTHREAD_SPECIAL_FLAGS" != "xno" && \ + test "x$ax_pthread_special_flags_added" != "xyes" +then : + PTHREAD_CFLAGS="$ax_cv_PTHREAD_SPECIAL_FLAGS $PTHREAD_CFLAGS" + ax_pthread_special_flags_added=yes +fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for PTHREAD_PRIO_INHERIT" >&5 +printf %s "checking for PTHREAD_PRIO_INHERIT... " >&6; } +if test ${ax_cv_PTHREAD_PRIO_INHERIT+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main (void) +{ +int i = PTHREAD_PRIO_INHERIT; + return i; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ax_cv_PTHREAD_PRIO_INHERIT=yes +else case e in #( + e) ax_cv_PTHREAD_PRIO_INHERIT=no ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_PRIO_INHERIT" >&5 +printf "%s\n" "$ax_cv_PTHREAD_PRIO_INHERIT" >&6; } + if test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes" && \ + test "x$ax_pthread_prio_inherit_defined" != "xyes" +then : + +printf "%s\n" "#define HAVE_PTHREAD_PRIO_INHERIT 1" >>confdefs.h + + ax_pthread_prio_inherit_defined=yes + +fi + + CFLAGS="$ax_pthread_save_CFLAGS" + LIBS="$ax_pthread_save_LIBS" + + # More AIX lossage: compile with *_r variant + if test "x$GCC" != "xyes"; then + case $host_os in + aix*) + case "x/$CC" in #( + x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6) : + #handle absolute path differently from PATH based program lookup + case "x$CC" in #( + x/*) : + + if as_fn_executable_p ${CC}_r +then : + PTHREAD_CC="${CC}_r" +fi + if test "x${CXX}" != "x" +then : + if as_fn_executable_p ${CXX}_r +then : + PTHREAD_CXX="${CXX}_r" +fi +fi + ;; #( + *) : + + for ac_prog in ${CC}_r +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_PTHREAD_CC+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -n "$PTHREAD_CC"; then + ac_cv_prog_PTHREAD_CC="$PTHREAD_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_PTHREAD_CC="$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi ;; +esac +fi +PTHREAD_CC=$ac_cv_prog_PTHREAD_CC +if test -n "$PTHREAD_CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PTHREAD_CC" >&5 +printf "%s\n" "$PTHREAD_CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$PTHREAD_CC" && break +done +test -n "$PTHREAD_CC" || PTHREAD_CC="$CC" + + if test "x${CXX}" != "x" +then : + for ac_prog in ${CXX}_r +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_PTHREAD_CXX+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -n "$PTHREAD_CXX"; then + ac_cv_prog_PTHREAD_CXX="$PTHREAD_CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_PTHREAD_CXX="$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi ;; +esac +fi +PTHREAD_CXX=$ac_cv_prog_PTHREAD_CXX +if test -n "$PTHREAD_CXX"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PTHREAD_CXX" >&5 +printf "%s\n" "$PTHREAD_CXX" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$PTHREAD_CXX" && break +done +test -n "$PTHREAD_CXX" || PTHREAD_CXX="$CXX" + +fi + + ;; +esac + ;; #( + *) : + ;; +esac + ;; + esac + fi +fi + +test -n "$PTHREAD_CC" || PTHREAD_CC="$CC" +test -n "$PTHREAD_CXX" || PTHREAD_CXX="$CXX" + + + + + + +# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: +if test "x$ax_pthread_ok" = "xyes"; then + +printf "%s\n" "#define HAVE_PTHREAD 1" >>confdefs.h + + : +else + ax_pthread_ok=no + +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + if test "$ax_pthread_ok" = yes + then + have_threads=yes + + DEF_THREAD="$PTHREAD_CFLAGS" + CFLAGS="$CFLAGS $DEF_THREAD" + CXXFLAGS="$CXXFLAGS $DEF_THREAD" + + if test "$CC" != "$PTHREAD_CC" + then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Replacing compiler $CC with compiler $PTHREAD_CC to support pthreads." >&5 +printf "%s\n" "$as_me: WARNING: Replacing compiler $CC with compiler $PTHREAD_CC to support pthreads." >&2;} + CC="$PTHREAD_CC" + fi + if test "$CXX" != "$PTHREAD_CXX" + then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Replacing compiler $CXX with compiler $PTHREAD_CXX to support pthreads." >&5 +printf "%s\n" "$as_me: WARNING: Replacing compiler $CXX with compiler $PTHREAD_CXX to support pthreads." >&2;} + CXX="$PTHREAD_CXX" + fi + fi +fi + +# check if compiler supports SSE2 intrinsics +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether compiler supports SSE2" >&5 +printf %s "checking whether compiler supports SSE2... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #include + int main() { __m128i n = _mm_set1_epi8(42); } +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_compiler_supports_sse2=yes +else case e in #( + e) ac_compiler_supports_sse2=no ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_compiler_supports_sse2" >&5 +printf "%s\n" "$ac_compiler_supports_sse2" >&6; } +if test "x$ac_compiler_supports_sse2" != "xyes" +then : + +printf "%s\n" "#define CMS_DONT_USE_SSE2 1" >>confdefs.h + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +# +# Find math library +# +LIB_MATH='' +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sqrt in -lm" >&5 +printf %s "checking for sqrt in -lm... " >&6; } +if test ${ac_cv_lib_m_sqrt+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) ac_check_lib_save_LIBS=$LIBS +LIBS="-lm $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char sqrt (void); +int +main (void) +{ +return sqrt (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_m_sqrt=yes +else case e in #( + e) ac_cv_lib_m_sqrt=no ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_sqrt" >&5 +printf "%s\n" "$ac_cv_lib_m_sqrt" >&6; } +if test "x$ac_cv_lib_m_sqrt" = xyes +then : + LIB_MATH="-lm" +fi + +LIBS="$LIB_MATH $LIBS" + + +# +# Find Posix threads library +# +LIB_THREAD='' +if test "$with_threads" != 'no' && test "$have_threads" = 'yes' +then + for lib in pthread pthreads + do + if test "x$PTHREAD_LIBS" = "x" ; then + as_ac_Lib=`printf "%s\n" "ac_cv_lib_$lib""_pthread_mutex_lock" | sed "$as_sed_sh"` +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_mutex_lock in -l$lib" >&5 +printf %s "checking for pthread_mutex_lock in -l$lib... " >&6; } +if eval test \${$as_ac_Lib+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) ac_check_lib_save_LIBS=$LIBS +LIBS="-l$lib $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char pthread_mutex_lock (void); +int +main (void) +{ +return pthread_mutex_lock (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + eval "$as_ac_Lib=yes" +else case e in #( + e) eval "$as_ac_Lib=no" ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS ;; +esac +fi +eval ac_res=\$$as_ac_Lib + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } +if eval test \"x\$"$as_ac_Lib"\" = x"yes" +then : + PTHREAD_LIBS=-l$lib +fi + + fi + done + + LIB_THREAD="$PTHREAD_LIBS" + LIBS="$LIBS $LIB_THREAD" + +printf "%s\n" "#define HasTHREADS 1" >>confdefs.h + +else + +printf "%s\n" "#define HasTHREADS 0" >>confdefs.h + +fi + + +# +# Check for JPEG +# +have_jpeg='no' +LIB_JPEG='' +if test ! "$with_jpeg" = 'no' +then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for JPEG support" >&5 +printf %s "checking for JPEG support... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: " >&5 +printf "%s\n" "" >&6; } + failed=0; + passed=0; + ac_fn_c_check_header_compile "$LINENO" "jconfig.h" "ac_cv_header_jconfig_h" "$ac_includes_default" +if test "x$ac_cv_header_jconfig_h" = xyes +then : + passed=`expr $passed + 1` +else case e in #( + e) failed=`expr $failed + 1` ;; +esac +fi + + ac_fn_c_check_header_compile "$LINENO" "jerror.h" "ac_cv_header_jerror_h" "$ac_includes_default" +if test "x$ac_cv_header_jerror_h" = xyes +then : + passed=`expr $passed + 1` +else case e in #( + e) failed=`expr $failed + 1` ;; +esac +fi + + ac_fn_c_check_header_compile "$LINENO" "jmorecfg.h" "ac_cv_header_jmorecfg_h" "#include +" +if test "x$ac_cv_header_jmorecfg_h" = xyes +then : + passed=`expr $passed + 1` +else case e in #( + e) failed=`expr $failed + 1` ;; +esac +fi + + ac_fn_c_check_header_compile "$LINENO" "jpeglib.h" "ac_cv_header_jpeglib_h" "$ac_includes_default" +if test "x$ac_cv_header_jpeglib_h" = xyes +then : + passed=`expr $passed + 1` +else case e in #( + e) failed=`expr $failed + 1` ;; +esac +fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for jpeg_read_header in -ljpeg" >&5 +printf %s "checking for jpeg_read_header in -ljpeg... " >&6; } +if test ${ac_cv_lib_jpeg_jpeg_read_header+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) ac_check_lib_save_LIBS=$LIBS +LIBS="-ljpeg $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char jpeg_read_header (void); +int +main (void) +{ +return jpeg_read_header (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_jpeg_jpeg_read_header=yes +else case e in #( + e) ac_cv_lib_jpeg_jpeg_read_header=no ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_jpeg_jpeg_read_header" >&5 +printf "%s\n" "$ac_cv_lib_jpeg_jpeg_read_header" >&6; } +if test "x$ac_cv_lib_jpeg_jpeg_read_header" = xyes +then : + passed=`expr $passed + 1` +else case e in #( + e) failed=`expr $failed + 1` ;; +esac +fi + + +# Test for compatible JPEG library +if test ! "$ac_cv_jpeg_version_ok" = 'yes' ; then +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for JPEG library is version 6b or later" >&5 +printf %s "checking for JPEG library is version 6b or later... " >&6; } +if test ${ac_cv_jpeg_version_ok+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include + +int +main (void) +{ + +#if JPEG_LIB_VERSION < 62 +#error IJG JPEG library must be version 6b or newer! +#endif +return 0; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_jpeg_version_ok='yes' +else case e in #( + e) ac_cv_jpeg_version_ok='no' ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_jpeg_version_ok" >&5 +printf "%s\n" "$ac_cv_jpeg_version_ok" >&6; } +if test "$ac_cv_jpeg_version_ok" = 'yes' ; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + passed=`expr $passed + 1` +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + failed=`expr $failed + 1` +fi +fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if JPEG package is complete" >&5 +printf %s "checking if JPEG package is complete... " >&6; } + if test $passed -gt 0 + then + if test $failed -gt 0 + then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no -- some components failed test" >&5 +printf "%s\n" "no -- some components failed test" >&6; } + have_jpeg='no (failed tests)' + else + LIB_JPEG='-ljpeg' + LIBS="$LIB_JPEG $LIBS" + +printf "%s\n" "#define HasJPEG 1" >>confdefs.h + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + have_jpeg='yes' + fi + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + fi +fi + if test "$have_jpeg" = 'yes'; then + HasJPEG_TRUE= + HasJPEG_FALSE='#' +else + HasJPEG_TRUE='#' + HasJPEG_FALSE= +fi + + + +# +# Check for ZLIB +# +have_zlib='no' +if test ! "$with_zlib" = 'no' || test ! "$with_tiff" = 'no' +then + LIB_ZLIB='' + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ZLIB support " >&5 +printf %s "checking for ZLIB support ... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: " >&5 +printf "%s\n" "" >&6; } + failed=0; + passed=0; + ac_fn_c_check_header_compile "$LINENO" "zconf.h" "ac_cv_header_zconf_h" "$ac_includes_default" +if test "x$ac_cv_header_zconf_h" = xyes +then : + passed=`expr $passed + 1` +else case e in #( + e) failed=`expr $failed + 1` ;; +esac +fi + + ac_fn_c_check_header_compile "$LINENO" "zlib.h" "ac_cv_header_zlib_h" "$ac_includes_default" +if test "x$ac_cv_header_zlib_h" = xyes +then : + passed=`expr $passed + 1` +else case e in #( + e) failed=`expr $failed + 1` ;; +esac +fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for compress in -lz" >&5 +printf %s "checking for compress in -lz... " >&6; } +if test ${ac_cv_lib_z_compress+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) ac_check_lib_save_LIBS=$LIBS +LIBS="-lz $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char compress (void); +int +main (void) +{ +return compress (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_z_compress=yes +else case e in #( + e) ac_cv_lib_z_compress=no ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_compress" >&5 +printf "%s\n" "$ac_cv_lib_z_compress" >&6; } +if test "x$ac_cv_lib_z_compress" = xyes +then : + passed=`expr $passed + 1` +else case e in #( + e) failed=`expr $failed + 1` ;; +esac +fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for uncompress in -lz" >&5 +printf %s "checking for uncompress in -lz... " >&6; } +if test ${ac_cv_lib_z_uncompress+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) ac_check_lib_save_LIBS=$LIBS +LIBS="-lz $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char uncompress (void); +int +main (void) +{ +return uncompress (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_z_uncompress=yes +else case e in #( + e) ac_cv_lib_z_uncompress=no ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_uncompress" >&5 +printf "%s\n" "$ac_cv_lib_z_uncompress" >&6; } +if test "x$ac_cv_lib_z_uncompress" = xyes +then : + passed=`expr $passed + 1` +else case e in #( + e) failed=`expr $failed + 1` ;; +esac +fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for deflate in -lz" >&5 +printf %s "checking for deflate in -lz... " >&6; } +if test ${ac_cv_lib_z_deflate+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) ac_check_lib_save_LIBS=$LIBS +LIBS="-lz $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char deflate (void); +int +main (void) +{ +return deflate (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_z_deflate=yes +else case e in #( + e) ac_cv_lib_z_deflate=no ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_deflate" >&5 +printf "%s\n" "$ac_cv_lib_z_deflate" >&6; } +if test "x$ac_cv_lib_z_deflate" = xyes +then : + passed=`expr $passed + 1` +else case e in #( + e) failed=`expr $failed + 1` ;; +esac +fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for inflate in -lz" >&5 +printf %s "checking for inflate in -lz... " >&6; } +if test ${ac_cv_lib_z_inflate+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) ac_check_lib_save_LIBS=$LIBS +LIBS="-lz $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char inflate (void); +int +main (void) +{ +return inflate (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_z_inflate=yes +else case e in #( + e) ac_cv_lib_z_inflate=no ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_inflate" >&5 +printf "%s\n" "$ac_cv_lib_z_inflate" >&6; } +if test "x$ac_cv_lib_z_inflate" = xyes +then : + passed=`expr $passed + 1` +else case e in #( + e) failed=`expr $failed + 1` ;; +esac +fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gzseek in -lz" >&5 +printf %s "checking for gzseek in -lz... " >&6; } +if test ${ac_cv_lib_z_gzseek+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) ac_check_lib_save_LIBS=$LIBS +LIBS="-lz $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char gzseek (void); +int +main (void) +{ +return gzseek (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_z_gzseek=yes +else case e in #( + e) ac_cv_lib_z_gzseek=no ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_gzseek" >&5 +printf "%s\n" "$ac_cv_lib_z_gzseek" >&6; } +if test "x$ac_cv_lib_z_gzseek" = xyes +then : + passed=`expr $passed + 1` +else case e in #( + e) failed=`expr $failed + 1` ;; +esac +fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gztell in -lz" >&5 +printf %s "checking for gztell in -lz... " >&6; } +if test ${ac_cv_lib_z_gztell+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) ac_check_lib_save_LIBS=$LIBS +LIBS="-lz $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char gztell (void); +int +main (void) +{ +return gztell (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_z_gztell=yes +else case e in #( + e) ac_cv_lib_z_gztell=no ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_gztell" >&5 +printf "%s\n" "$ac_cv_lib_z_gztell" >&6; } +if test "x$ac_cv_lib_z_gztell" = xyes +then : + passed=`expr $passed + 1` +else case e in #( + e) failed=`expr $failed + 1` ;; +esac +fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if ZLIB package is complete" >&5 +printf %s "checking if ZLIB package is complete... " >&6; } + if test $passed -gt 0 + then + if test $failed -gt 0 + then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no -- some components failed test" >&5 +printf "%s\n" "no -- some components failed test" >&6; } + have_zlib='no (failed tests)' + else + LIB_ZLIB='-lz' + LIBS="$LIB_ZLIB $LIBS" + +printf "%s\n" "#define HasZLIB 1" >>confdefs.h + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + have_zlib='yes' + fi + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + fi +fi + if test "$have_zlib" = 'yes'; then + HasZLIB_TRUE= + HasZLIB_FALSE='#' +else + HasZLIB_TRUE='#' + HasZLIB_FALSE= +fi + + + +# +# Check for TIFF +# +have_tiff='no' +LIB_TIFF='' +if test ! "$with_tiff" = 'no' +then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for TIFF support" >&5 +printf %s "checking for TIFF support... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: " >&5 +printf "%s\n" "" >&6; } + failed=0; + passed=0; + ac_fn_c_check_header_compile "$LINENO" "tiff.h" "ac_cv_header_tiff_h" "$ac_includes_default" +if test "x$ac_cv_header_tiff_h" = xyes +then : + passed=`expr $passed + 1` +else case e in #( + e) failed=`expr $failed + 1` ;; +esac +fi + + ac_fn_c_check_header_compile "$LINENO" "tiffio.h" "ac_cv_header_tiffio_h" "$ac_includes_default" +if test "x$ac_cv_header_tiffio_h" = xyes +then : + passed=`expr $passed + 1` +else case e in #( + e) failed=`expr $failed + 1` ;; +esac +fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for TIFFOpen in -ltiff" >&5 +printf %s "checking for TIFFOpen in -ltiff... " >&6; } +if test ${ac_cv_lib_tiff_TIFFOpen+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) ac_check_lib_save_LIBS=$LIBS +LIBS="-ltiff $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char TIFFOpen (void); +int +main (void) +{ +return TIFFOpen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_tiff_TIFFOpen=yes +else case e in #( + e) ac_cv_lib_tiff_TIFFOpen=no ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_tiff_TIFFOpen" >&5 +printf "%s\n" "$ac_cv_lib_tiff_TIFFOpen" >&6; } +if test "x$ac_cv_lib_tiff_TIFFOpen" = xyes +then : + passed=`expr $passed + 1` +else case e in #( + e) failed=`expr $failed + 1` ;; +esac +fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for TIFFClientOpen in -ltiff" >&5 +printf %s "checking for TIFFClientOpen in -ltiff... " >&6; } +if test ${ac_cv_lib_tiff_TIFFClientOpen+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) ac_check_lib_save_LIBS=$LIBS +LIBS="-ltiff $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char TIFFClientOpen (void); +int +main (void) +{ +return TIFFClientOpen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_tiff_TIFFClientOpen=yes +else case e in #( + e) ac_cv_lib_tiff_TIFFClientOpen=no ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_tiff_TIFFClientOpen" >&5 +printf "%s\n" "$ac_cv_lib_tiff_TIFFClientOpen" >&6; } +if test "x$ac_cv_lib_tiff_TIFFClientOpen" = xyes +then : + passed=`expr $passed + 1` +else case e in #( + e) failed=`expr $failed + 1` ;; +esac +fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for TIFFIsByteSwapped in -ltiff" >&5 +printf %s "checking for TIFFIsByteSwapped in -ltiff... " >&6; } +if test ${ac_cv_lib_tiff_TIFFIsByteSwapped+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) ac_check_lib_save_LIBS=$LIBS +LIBS="-ltiff $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. + The 'extern "C"' is for builds by C++ compilers; + although this is not generally supported in C code supporting it here + has little cost and some practical benefit (sr 110532). */ +#ifdef __cplusplus +extern "C" +#endif +char TIFFIsByteSwapped (void); +int +main (void) +{ +return TIFFIsByteSwapped (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_tiff_TIFFIsByteSwapped=yes +else case e in #( + e) ac_cv_lib_tiff_TIFFIsByteSwapped=no ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS ;; +esac +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_tiff_TIFFIsByteSwapped" >&5 +printf "%s\n" "$ac_cv_lib_tiff_TIFFIsByteSwapped" >&6; } +if test "x$ac_cv_lib_tiff_TIFFIsByteSwapped" = xyes +then : + passed=`expr $passed + 1` +else case e in #( + e) failed=`expr $failed + 1` ;; +esac +fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if TIFF package is complete" >&5 +printf %s "checking if TIFF package is complete... " >&6; } + if test $passed -gt 0 + then + if test $failed -gt 0 + then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no -- some components failed test" >&5 +printf "%s\n" "no -- some components failed test" >&6; } + have_tiff='no (failed tests)' + else + LIB_TIFF='-ltiff' + LIBS="$LIB_TIFF $LIBS" + +printf "%s\n" "#define HasTIFF 1" >>confdefs.h + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + have_tiff='yes' + ac_fn_c_check_header_compile "$LINENO" "tiffconf.h" "ac_cv_header_tiffconf_h" "$ac_includes_default" +if test "x$ac_cv_header_tiffconf_h" = xyes +then : + printf "%s\n" "#define HAVE_TIFFCONF_H 1" >>confdefs.h + +fi + + fi + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + fi +fi + if test "$have_tiff" = 'yes'; then + HasTIFF_TRUE= + HasTIFF_FALSE='#' +else + HasTIFF_TRUE='#' + HasTIFF_FALSE= +fi + + + + +# Libraries that the LCMS library depends on +LCMS_LIB_DEPLIBS="$LIB_MATH $LIB_THREAD" +LCMS_LIB_DEPLIBS=`echo $LCMS_LIB_DEPLIBS | sed -e 's/ */ /g'` + + + + +# Libraries that the jpegicc program depends on +JPEGICC_DEPLIBS="$LIB_JPEG $LIB_MATH $LIB_THREAD" +JPEGICC_DEPLIBS=`echo $JPEGICC_DEPLIBS | sed -e 's/ */ /g'` + + +# Libraries that the tifficc program depends on +TIFFICC_DEPLIBS="$LIB_TIFF $LIB_JPEG $LIB_ZLIB $LIB_MATH $LIB_THREAD" +TIFFICC_DEPLIBS=`echo $TIFFICC_DEPLIBS | sed -e 's/ */ /g'` + + +LIBS='' + +# +# Perform substitutions +# +ac_config_files="$ac_config_files Makefile" + +ac_config_files="$ac_config_files lcms2.pc" + +ac_config_files="$ac_config_files include/Makefile" + +ac_config_files="$ac_config_files src/Makefile" + +ac_config_files="$ac_config_files utils/tificc/Makefile" + +ac_config_files="$ac_config_files utils/transicc/Makefile" + +ac_config_files="$ac_config_files utils/linkicc/Makefile" + +ac_config_files="$ac_config_files utils/jpgicc/Makefile" + +ac_config_files="$ac_config_files utils/psicc/Makefile" + +ac_config_files="$ac_config_files testbed/Makefile" + + if test "x$with_fastfloat" = "xyes" ; then + COND_FASTFLOAT_TRUE= + COND_FASTFLOAT_FALSE='#' +else + COND_FASTFLOAT_TRUE='#' + COND_FASTFLOAT_FALSE= +fi + + if test "x$with_threaded" = "xyes" ; then + COND_THREADED_TRUE= + COND_THREADED_FALSE='#' +else + COND_THREADED_TRUE='#' + COND_THREADED_FALSE= +fi + +ac_config_files="$ac_config_files plugins/Makefile" + +ac_config_files="$ac_config_files plugins/fast_float/Makefile" + +ac_config_files="$ac_config_files plugins/fast_float/src/Makefile" + +ac_config_files="$ac_config_files plugins/fast_float/include/Makefile" + +ac_config_files="$ac_config_files plugins/fast_float/testbed/Makefile" + +ac_config_files="$ac_config_files plugins/threaded/Makefile" + +ac_config_files="$ac_config_files plugins/threaded/src/Makefile" + +ac_config_files="$ac_config_files plugins/threaded/include/Makefile" + +ac_config_files="$ac_config_files plugins/threaded/testbed/Makefile" + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# 'ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* 'ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # 'set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # 'set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test ${\1+y} || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + if test "x$cache_file" != "x/dev/null"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +printf "%s\n" "$as_me: updating cache $cache_file" >&6;} + if test ! -f "$cache_file" || test -h "$cache_file"; then + cat confcache >"$cache_file" + else + case $cache_file in #( + */* | ?:*) + mv -f confcache "$cache_file"$$ && + mv -f "$cache_file"$$ "$cache_file" ;; #( + *) + mv -f confcache "$cache_file" ;; + esac + fi + fi + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +printf "%s\n" "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +# Transform confdefs.h into DEFS. +# Protect against shell expansion while executing Makefile rules. +# Protect against Makefile macro expansion. +# +# If the first sed substitution is executed (which looks for macros that +# take arguments), then branch to the quote section. Otherwise, +# look for a macro that doesn't take arguments. +ac_script=' +:mline +/\\$/{ + N + s,\\\n,, + b mline +} +t clear +:clear +s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g +t quote +s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g +t quote +b any +:quote +s/[][ `~#$^&*(){}\\|;'\''"<>?]/\\&/g +s/\$/$$/g +H +:any +${ + g + s/^\n// + s/\n/ /g + p +} +' +DEFS=`sed -n "$ac_script" confdefs.h` + + +ac_libobjs= +ac_ltlibobjs= +U= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`printf "%s\n" "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 +printf %s "checking that generated files are newer than configure... " >&6; } + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: done" >&5 +printf "%s\n" "done" >&6; } +case $enable_silent_rules in # ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; +esac +if test $am_cv_make_support_nested_variables = yes; then + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi + + if test -n "$EXEEXT"; then + am__EXEEXT_TRUE= + am__EXEEXT_FALSE='#' +else + am__EXEEXT_TRUE='#' + am__EXEEXT_FALSE= +fi + +if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then + as_fn_error $? "conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then + as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi + +if test -z "${HasJPEG_TRUE}" && test -z "${HasJPEG_FALSE}"; then + as_fn_error $? "conditional \"HasJPEG\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HasZLIB_TRUE}" && test -z "${HasZLIB_FALSE}"; then + as_fn_error $? "conditional \"HasZLIB\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HasTIFF_TRUE}" && test -z "${HasTIFF_FALSE}"; then + as_fn_error $? "conditional \"HasTIFF\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${COND_FASTFLOAT_TRUE}" && test -z "${COND_FASTFLOAT_FALSE}"; then + as_fn_error $? "conditional \"COND_FASTFLOAT\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${COND_THREADED_TRUE}" && test -z "${COND_THREADED_FALSE}"; then + as_fn_error $? "conditional \"COND_THREADED\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi + +: "${CONFIG_STATUS=./config.status}" +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +printf "%s\n" "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 +then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else case e in #( + e) case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac ;; +esac +fi + + + +# Reset variables that may have inherited troublesome values from +# the environment. + +# IFS needs to be set, to space, tab, and newline, in precisely that order. +# (If _AS_PATH_WALK were called with IFS unset, it would have the +# side effect of setting IFS to empty, thus disabling word splitting.) +# Quoting is to prevent editors from complaining about space-tab. +as_nl=' +' +export as_nl +IFS=" "" $as_nl" + +PS1='$ ' +PS2='> ' +PS4='+ ' + +# Ensure predictable behavior from utilities with locale-dependent output. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# We cannot yet rely on "unset" to work, but we need these variables +# to be unset--not just set to an empty or harmless value--now, to +# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct +# also avoids known problems related to "unset" and subshell syntax +# in other old shells (e.g. bash 2.01 and pdksh 5.2.14). +for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH +do eval test \${$as_var+y} \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done + +# Ensure that fds 0, 1, and 2 are open. +if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi +if (exec 3>&2) ; then :; else exec 2>/dev/null; fi + +# The user is always right. +if ${PATH_SEPARATOR+false} :; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + test -r "$as_dir$0" && as_myself=$as_dir$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as 'sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + printf "%s\n" "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null +then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else case e in #( + e) as_fn_append () + { + eval $1=\$$1\$2 + } ;; +esac +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null +then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else case e in #( + e) as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } ;; +esac +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +printf "%s\n" X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + +# Determine whether it's possible to make 'echo' print without a newline. +# These variables are no longer used directly by Autoconf, but are AC_SUBSTed +# for compatibility with existing Makefiles. +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +# For backward compatibility with old third-party macros, we provide +# the shell variables $as_echo and $as_echo_n. New code should use +# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. +as_echo='printf %s\n' +as_echo_n='printf %s' + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both 'ln -s file dir' and 'ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; 'ln -s' creates a wrapper executable. + # In both cases, we have to default to 'cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +printf "%s\n" X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_sed_cpp="y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" +as_tr_cpp="eval sed '$as_sed_cpp'" # deprecated + +# Sed expression to map a string onto a valid variable name. +as_sed_sh="y%*+%pp%;s%[^_$as_cr_alnum]%_%g" +as_tr_sh="eval sed '$as_sed_sh'" # deprecated + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by lcms2 $as_me 2.19, which was +generated by GNU Autoconf 2.72. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" +config_commands="$ac_config_commands" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +'$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + +Configuration files: +$config_files + +Configuration commands: +$config_commands + +Report bugs to the package provider." + +_ACEOF +ac_cs_config=`printf "%s\n" "$ac_configure_args" | sed "$ac_safe_unquote"` +ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\''/g"` +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config='$ac_cs_config_escaped' +ac_cs_version="\\ +lcms2 config.status 2.19 +configured by $0, generated by GNU Autoconf 2.72, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2023 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' +MKDIR_P='$MKDIR_P' +AWK='$AWK' +test -n "\$AWK" || AWK=awk +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=?*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + printf "%s\n" "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + printf "%s\n" "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h | --help | --hel | -h ) + printf "%s\n" "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error $? "unrecognized option: '$1' +Try '$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \printf "%s\n" "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + printf "%s\n" "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# +# INIT-COMMANDS +# +AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}" + + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +sed_quote_subst='$sed_quote_subst' +double_quote_subst='$double_quote_subst' +delay_variable_subst='$delay_variable_subst' +macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' +macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' +enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' +enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' +pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' +enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' +shared_archive_member_spec='`$ECHO "$shared_archive_member_spec" | $SED "$delay_single_quote_subst"`' +SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' +ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' +PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' +host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' +host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' +host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' +build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' +build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' +build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' +SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' +Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' +GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' +EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' +FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' +LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' +NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' +LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' +max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' +ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' +exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' +lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' +lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' +lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' +lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' +lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' +reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' +reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' +FILECMD='`$ECHO "$FILECMD" | $SED "$delay_single_quote_subst"`' +OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' +deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' +file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' +file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' +want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' +DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' +sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' +AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' +lt_ar_flags='`$ECHO "$lt_ar_flags" | $SED "$delay_single_quote_subst"`' +AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' +archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' +STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' +RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' +old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' +old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' +old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' +lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' +CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' +CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' +compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' +GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_import='`$ECHO "$lt_cv_sys_global_symbol_to_import" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' +lt_cv_nm_interface='`$ECHO "$lt_cv_nm_interface" | $SED "$delay_single_quote_subst"`' +nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' +lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' +lt_cv_truncate_bin='`$ECHO "$lt_cv_truncate_bin" | $SED "$delay_single_quote_subst"`' +objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' +MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' +need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' +MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' +DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' +NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' +LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' +OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' +OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' +libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' +shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' +extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' +archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' +export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' +whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' +compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' +old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' +archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' +archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' +module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' +module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' +with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' +allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' +no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' +hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' +hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' +hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' +hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' +hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' +inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' +link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' +always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' +export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' +exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' +include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' +prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' +postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' +file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' +variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' +need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' +need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' +version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' +runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' +shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' +shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' +libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' +library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' +soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' +install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' +postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' +postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' +finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' +finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' +hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' +sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' +configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`' +configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $SED "$delay_single_quote_subst"`' +hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' +enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' +enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' +enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' +old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' +striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`' +predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`' +postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`' +predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`' +postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`' +AS='`$ECHO "$AS" | $SED "$delay_single_quote_subst"`' +LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`' +reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`' +reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`' +old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' +compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`' +GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`' +archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`' +export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' +whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' +compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`' +old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`' +archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' +archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' +module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`' +module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' +with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`' +allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' +no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`' +inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`' +link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`' +always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`' +export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`' +exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`' +include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`' +prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`' +postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`' +file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`' +predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`' +postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`' +predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`' +postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`' + +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$1 +_LTECHO_EOF' +} + +# Quote evaled strings. +for var in SHELL \ +ECHO \ +PATH_SEPARATOR \ +SED \ +GREP \ +EGREP \ +FGREP \ +LD \ +NM \ +LN_S \ +lt_SP2NL \ +lt_NL2SP \ +reload_flag \ +FILECMD \ +OBJDUMP \ +deplibs_check_method \ +file_magic_cmd \ +file_magic_glob \ +want_nocaseglob \ +DLLTOOL \ +sharedlib_from_linklib_cmd \ +AR \ +archiver_list_spec \ +STRIP \ +RANLIB \ +CC \ +CFLAGS \ +compiler \ +lt_cv_sys_global_symbol_pipe \ +lt_cv_sys_global_symbol_to_cdecl \ +lt_cv_sys_global_symbol_to_import \ +lt_cv_sys_global_symbol_to_c_name_address \ +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ +lt_cv_nm_interface \ +nm_file_list_spec \ +lt_cv_truncate_bin \ +lt_prog_compiler_no_builtin_flag \ +lt_prog_compiler_pic \ +lt_prog_compiler_wl \ +lt_prog_compiler_static \ +lt_cv_prog_compiler_c_o \ +need_locks \ +MANIFEST_TOOL \ +DSYMUTIL \ +NMEDIT \ +LIPO \ +OTOOL \ +OTOOL64 \ +shrext_cmds \ +export_dynamic_flag_spec \ +whole_archive_flag_spec \ +compiler_needs_object \ +with_gnu_ld \ +allow_undefined_flag \ +no_undefined_flag \ +hardcode_libdir_flag_spec \ +hardcode_libdir_separator \ +exclude_expsyms \ +include_expsyms \ +file_list_spec \ +variables_saved_for_relink \ +libname_spec \ +library_names_spec \ +soname_spec \ +install_override_mode \ +finish_eval \ +old_striplib \ +striplib \ +compiler_lib_search_dirs \ +predep_objects \ +postdep_objects \ +predeps \ +postdeps \ +compiler_lib_search_path \ +AS \ +LD_CXX \ +reload_flag_CXX \ +compiler_CXX \ +lt_prog_compiler_no_builtin_flag_CXX \ +lt_prog_compiler_pic_CXX \ +lt_prog_compiler_wl_CXX \ +lt_prog_compiler_static_CXX \ +lt_cv_prog_compiler_c_o_CXX \ +export_dynamic_flag_spec_CXX \ +whole_archive_flag_spec_CXX \ +compiler_needs_object_CXX \ +with_gnu_ld_CXX \ +allow_undefined_flag_CXX \ +no_undefined_flag_CXX \ +hardcode_libdir_flag_spec_CXX \ +hardcode_libdir_separator_CXX \ +exclude_expsyms_CXX \ +include_expsyms_CXX \ +file_list_spec_CXX \ +compiler_lib_search_dirs_CXX \ +predep_objects_CXX \ +postdep_objects_CXX \ +predeps_CXX \ +postdeps_CXX \ +compiler_lib_search_path_CXX; do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in reload_cmds \ +old_postinstall_cmds \ +old_postuninstall_cmds \ +old_archive_cmds \ +extract_expsyms_cmds \ +old_archive_from_new_cmds \ +old_archive_from_expsyms_cmds \ +archive_cmds \ +archive_expsym_cmds \ +module_cmds \ +module_expsym_cmds \ +export_symbols_cmds \ +prelink_cmds \ +postlink_cmds \ +postinstall_cmds \ +postuninstall_cmds \ +finish_cmds \ +sys_lib_search_path_spec \ +configure_time_dlsearch_path \ +configure_time_lt_sys_library_path \ +reload_cmds_CXX \ +old_archive_cmds_CXX \ +old_archive_from_new_cmds_CXX \ +old_archive_from_expsyms_cmds_CXX \ +archive_cmds_CXX \ +archive_expsym_cmds_CXX \ +module_cmds_CXX \ +module_expsym_cmds_CXX \ +export_symbols_cmds_CXX \ +prelink_cmds_CXX \ +postlink_cmds_CXX; do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +ac_aux_dir='$ac_aux_dir' + +# See if we are running on zsh, and set the options that allow our +# commands through without removal of \ escapes INIT. +if test -n "\${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST +fi + + + PACKAGE='$PACKAGE' + VERSION='$VERSION' + RM='$RM' + ofile='$ofile' + + + + + + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "lcms2.pc") CONFIG_FILES="$CONFIG_FILES lcms2.pc" ;; + "include/Makefile") CONFIG_FILES="$CONFIG_FILES include/Makefile" ;; + "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; + "utils/tificc/Makefile") CONFIG_FILES="$CONFIG_FILES utils/tificc/Makefile" ;; + "utils/transicc/Makefile") CONFIG_FILES="$CONFIG_FILES utils/transicc/Makefile" ;; + "utils/linkicc/Makefile") CONFIG_FILES="$CONFIG_FILES utils/linkicc/Makefile" ;; + "utils/jpgicc/Makefile") CONFIG_FILES="$CONFIG_FILES utils/jpgicc/Makefile" ;; + "utils/psicc/Makefile") CONFIG_FILES="$CONFIG_FILES utils/psicc/Makefile" ;; + "testbed/Makefile") CONFIG_FILES="$CONFIG_FILES testbed/Makefile" ;; + "plugins/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/Makefile" ;; + "plugins/fast_float/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/fast_float/Makefile" ;; + "plugins/fast_float/src/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/fast_float/src/Makefile" ;; + "plugins/fast_float/include/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/fast_float/include/Makefile" ;; + "plugins/fast_float/testbed/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/fast_float/testbed/Makefile" ;; + "plugins/threaded/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/threaded/Makefile" ;; + "plugins/threaded/src/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/threaded/src/Makefile" ;; + "plugins/threaded/include/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/threaded/include/Makefile" ;; + "plugins/threaded/testbed/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/threaded/testbed/Makefile" ;; + + *) as_fn_error $? "invalid argument: '$ac_config_target'" "$LINENO" 5;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test ${CONFIG_FILES+y} || CONFIG_FILES=$config_files + test ${CONFIG_COMMANDS+y} || CONFIG_COMMANDS=$config_commands +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to '$tmp'. +$debug || +{ + tmp= ac_tmp= + trap 'exit_status=$? + : "${ac_tmp:=$tmp}" + { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +ac_tmp=$tmp + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with './config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$ac_tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\)..*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\)..*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 +_ACEOF + +# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// +s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + + +eval set X " :F $CONFIG_FILES :C $CONFIG_COMMANDS" +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error $? "invalid tag '$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$ac_tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain ':'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error 1 "cannot find input file: '$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`printf "%s\n" "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is 'configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + printf "%s\n" "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +printf "%s\n" "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`printf "%s\n" "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$ac_tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +printf "%s\n" X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac + ac_MKDIR_P=$MKDIR_P + case $MKDIR_P in + [\\/$]* | ?:[\\/]* ) ;; + */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; + esac +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +printf "%s\n" "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when '$srcdir' = '.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +s&@MKDIR_P@&$ac_MKDIR_P&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ + >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ + "$ac_tmp/out"`; test -z "$ac_out"; } && + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable 'datarootdir' +which seems to be undefined. Please make sure it is defined" >&5 +printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable 'datarootdir' +which seems to be undefined. Please make sure it is defined" >&2;} + + rm -f "$ac_tmp/stdin" + case $ac_file in + -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; + *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; + esac \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + ;; + + + :C) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +printf "%s\n" "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "depfiles":C) test x"$AMDEP_TRUE" != x"" || { + # Older Autoconf quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + # TODO: see whether this extra hack can be removed once we start + # requiring Autoconf 2.70 or later. + case $CONFIG_FILES in #( + *\'*) : + eval set x "$CONFIG_FILES" ;; #( + *) : + set x $CONFIG_FILES ;; #( + *) : + ;; +esac + shift + # Used to flag and report bootstrapping failures. + am_rc=0 + for am_mf + do + # Strip MF so we end up with the name of the file. + am_mf=`printf "%s\n" "$am_mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile which includes + # dependency-tracking related rules and includes. + # Grep'ing the whole file directly is not great: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \ + || continue + am_dirpart=`$as_dirname -- "$am_mf" || +$as_expr X"$am_mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$am_mf" : 'X\(//\)[^/]' \| \ + X"$am_mf" : 'X\(//\)$' \| \ + X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || +printf "%s\n" X"$am_mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + am_filepart=`$as_basename -- "$am_mf" || +$as_expr X/"$am_mf" : '.*/\([^/][^/]*\)/*$' \| \ + X"$am_mf" : 'X\(//\)$' \| \ + X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || +printf "%s\n" X/"$am_mf" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + { echo "$as_me:$LINENO: cd "$am_dirpart" \ + && sed -e '/# am--include-marker/d' "$am_filepart" \ + | $MAKE -f - am--depfiles" >&5 + (cd "$am_dirpart" \ + && sed -e '/# am--include-marker/d' "$am_filepart" \ + | $MAKE -f - am--depfiles) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } || am_rc=$? + done + if test $am_rc -ne 0; then + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} +as_fn_error $? "Something went wrong bootstrapping makefile fragments + for automatic dependency tracking. If GNU make was not used, consider + re-running the configure script with MAKE=\"gmake\" (or whatever is + necessary). You can also try re-running configure with the + '--disable-dependency-tracking' option to at least be able to build + the package (albeit without support for automatic dependency tracking). +See 'config.log' for more details" "$LINENO" 5; } + fi + { am_dirpart=; unset am_dirpart;} + { am_filepart=; unset am_filepart;} + { am_mf=; unset am_mf;} + { am_rc=; unset am_rc;} + rm -f conftest-deps.mk +} + ;; + "libtool":C) + + # See if we are running on zsh, and set the options that allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST + fi + + cfgfile=${ofile}T + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL +# Generated automatically by $as_me ($PACKAGE) $VERSION +# NOTE: Changes made to this file will be lost: look at ltmain.sh. + +# Provide generalized library-building support services. +# Written by Gordon Matzigkeit, 1996 + +# Copyright (C) 2024 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program or library that is built +# using GNU Libtool, you may include this file under the same +# distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + + +# The names of the tagged configurations supported by this script. +available_tags='CXX ' + +# Configured defaults for sys_lib_dlsearch_path munging. +: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} + +# ### BEGIN LIBTOOL CONFIG + +# Which release of libtool.m4 was used? +macro_version=$macro_version +macro_revision=$macro_revision + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# What type of objects to build. +pic_mode=$pic_mode + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# Shared archive member basename,for filename based shared library versioning on AIX. +shared_archive_member_spec=$shared_archive_member_spec + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# An echo program that protects backslashes. +ECHO=$lt_ECHO + +# The PATH separator for the build system. +PATH_SEPARATOR=$lt_PATH_SEPARATOR + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# A sed program that does not truncate output. +SED=$lt_SED + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="\$SED -e 1s/^X//" + +# A grep program that handles long lines. +GREP=$lt_GREP + +# An ERE matcher. +EGREP=$lt_EGREP + +# A literal string matcher. +FGREP=$lt_FGREP + +# A BSD- or MS-compatible name lister. +NM=$lt_NM + +# Whether we need soft or hard links. +LN_S=$lt_LN_S + +# What is the maximum length of a command? +max_cmd_len=$max_cmd_len + +# Object file suffix (normally "o"). +objext=$ac_objext + +# Executable file suffix (normally ""). +exeext=$exeext + +# whether the shell understands "unset". +lt_unset=$lt_unset + +# turn spaces into newlines. +SP2NL=$lt_lt_SP2NL + +# turn newlines into spaces. +NL2SP=$lt_lt_NL2SP + +# convert \$build file names to \$host format. +to_host_file_cmd=$lt_cv_to_host_file_cmd + +# convert \$build files to toolchain format. +to_tool_file_cmd=$lt_cv_to_tool_file_cmd + +# A file(cmd) program that detects file types. +FILECMD=$lt_FILECMD + +# An object symbol dumper. +OBJDUMP=$lt_OBJDUMP + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method = "file_magic". +file_magic_cmd=$lt_file_magic_cmd + +# How to find potential files when deplibs_check_method = "file_magic". +file_magic_glob=$lt_file_magic_glob + +# Find potential files using nocaseglob when deplibs_check_method = "file_magic". +want_nocaseglob=$lt_want_nocaseglob + +# DLL creation program. +DLLTOOL=$lt_DLLTOOL + +# Command to associate shared and link libraries. +sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd + +# The archiver. +AR=$lt_AR + +# Flags to create an archive (by configure). +lt_ar_flags=$lt_ar_flags + +# Flags to create an archive. +AR_FLAGS=\${ARFLAGS-"\$lt_ar_flags"} + +# How to feed a file listing to the archiver. +archiver_list_spec=$lt_archiver_list_spec + +# A symbol stripping program. +STRIP=$lt_STRIP + +# Commands used to install an old-style archive. +RANLIB=$lt_RANLIB +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Whether to use a lock for old archive extraction. +lock_old_archive_extraction=$lock_old_archive_extraction + +# A C compiler. +LTCC=$lt_CC + +# LTCC compiler flags. +LTCFLAGS=$lt_CFLAGS + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration. +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm into a list of symbols to manually relocate. +global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import + +# Transform the output of nm in a C name address pair. +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# Transform the output of nm in a C name address pair when lib prefix is needed. +global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix + +# The name lister interface. +nm_interface=$lt_lt_cv_nm_interface + +# Specify filename containing input files for \$NM. +nm_file_list_spec=$lt_nm_file_list_spec + +# The root where to search for dependent libraries,and where our libraries should be installed. +lt_sysroot=$lt_sysroot + +# Command to truncate a binary pipe. +lt_truncate_bin=$lt_lt_cv_truncate_bin + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# Used to examine libraries when file_magic_cmd begins with "file". +MAGIC_CMD=$MAGIC_CMD + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Manifest tool. +MANIFEST_TOOL=$lt_MANIFEST_TOOL + +# Tool to manipulate archived DWARF debug symbol files on Mac OS X. +DSYMUTIL=$lt_DSYMUTIL + +# Tool to change global to local symbols on Mac OS X. +NMEDIT=$lt_NMEDIT + +# Tool to manipulate fat objects and archives on Mac OS X. +LIPO=$lt_LIPO + +# ldd/readelf like tool for Mach-O binaries on Mac OS X. +OTOOL=$lt_OTOOL + +# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. +OTOOL64=$lt_OTOOL64 + +# Old archive suffix (normally "a"). +libext=$libext + +# Shared library suffix (normally ".so"). +shrext_cmds=$lt_shrext_cmds + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at link time. +variables_saved_for_relink=$lt_variables_saved_for_relink + +# Do we need the "lib" prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Library versioning type. +version_type=$version_type + +# Shared library runtime path variable. +runpath_var=$runpath_var + +# Shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Permission mode override for installation of shared libraries. +install_override_mode=$lt_install_override_mode + +# Command to use after installation of a shared archive. +postinstall_cmds=$lt_postinstall_cmds + +# Command to use after uninstallation of a shared archive. +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# As "finish_cmds", except a single script fragment to be evaled but +# not shown. +finish_eval=$lt_finish_eval + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Compile-time system search path for libraries. +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Detected run-time system search path for libraries. +sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path + +# Explicit LT_SYS_LIBRARY_PATH set during ./configure time. +configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Assembler program. +AS=$lt_AS + + +# The linker used to build libraries. +LD=$lt_LD + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds + +# A language specific compiler. +CC=$lt_compiler + +# Is the compiler the GNU compiler? +with_gcc=$GCC + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds + +# Commands used to build a shared archive. +archive_cmds=$lt_archive_cmds +archive_expsym_cmds=$lt_archive_expsym_cmds + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds +module_expsym_cmds=$lt_module_expsym_cmds + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator + +# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct + +# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e. impossible to change by setting \$shlibpath_var if the +# library is relocated. +hardcode_direct_absolute=$hardcode_direct_absolute + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=$hardcode_minus_L + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=$hardcode_automatic + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds + +# Commands necessary for finishing linking programs. +postlink_cmds=$lt_postlink_cmds + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action + +# The directories searched by this compiler when creating a shared library. +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs + +# Dependencies to place before and after the objects being linked to +# create a shared library. +predep_objects=$lt_predep_objects +postdep_objects=$lt_postdep_objects +predeps=$lt_predeps +postdeps=$lt_postdeps + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path + +# ### END LIBTOOL CONFIG + +_LT_EOF + + cat <<'_LT_EOF' >> "$cfgfile" + +# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE + +# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x$2 in + x) + ;; + *:) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" + ;; + x:*) + eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" + ;; + *) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" + ;; + esac +} + + +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in $*""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} + + +# ### END FUNCTIONS SHARED WITH CONFIGURE + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_EOF >> "$cfgfile" +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test set != "${COLLECT_NAMES+set}"; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +_LT_EOF + ;; + esac + + + +ltmain=$ac_aux_dir/ltmain.sh + + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + $SED '$q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" + + + cat <<_LT_EOF >> "$ofile" + +# ### BEGIN LIBTOOL TAG CONFIG: CXX + +# The linker used to build libraries. +LD=$lt_LD_CXX + +# How to create reloadable object files. +reload_flag=$lt_reload_flag_CXX +reload_cmds=$lt_reload_cmds_CXX + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds_CXX + +# A language specific compiler. +CC=$lt_compiler_CXX + +# Is the compiler the GNU compiler? +with_gcc=$GCC_CXX + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_CXX + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_CXX + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_CXX + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_CXX + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object_CXX + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX + +# Commands used to build a shared archive. +archive_cmds=$lt_archive_cmds_CXX +archive_expsym_cmds=$lt_archive_expsym_cmds_CXX + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds_CXX +module_expsym_cmds=$lt_module_expsym_cmds_CXX + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld_CXX + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_CXX + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_CXX + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX + +# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct_CXX + +# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e. impossible to change by setting \$shlibpath_var if the +# library is relocated. +hardcode_direct_absolute=$hardcode_direct_absolute_CXX + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=$hardcode_minus_L_CXX + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=$hardcode_automatic_CXX + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath_CXX + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_CXX + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols_CXX + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_CXX + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_CXX + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_CXX + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds_CXX + +# Commands necessary for finishing linking programs. +postlink_cmds=$lt_postlink_cmds_CXX + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec_CXX + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_CXX + +# The directories searched by this compiler when creating a shared library. +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX + +# Dependencies to place before and after the objects being linked to +# create a shared library. +predep_objects=$lt_predep_objects_CXX +postdep_objects=$lt_postdep_objects_CXX +predeps=$lt_predeps_CXX +postdeps=$lt_postdeps_CXX + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_CXX + +# ### END LIBTOOL TAG CONFIG: CXX +_LT_EOF + + ;; + + esac +done # for ac_tag + + +as_fn_exit 0 +_ACEOF +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || as_fn_exit 1 +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + + diff --git a/local/recipes/libs/lcms2/source/configure.ac b/local/recipes/libs/lcms2/source/configure.ac new file mode 100644 index 0000000000..18ed792a03 --- /dev/null +++ b/local/recipes/libs/lcms2/source/configure.ac @@ -0,0 +1,439 @@ +# +# LittleCMS 2 configure script +# + +AC_PREREQ(2.60) + +# +# Set the package name and version +# +AC_INIT(lcms2,2.19) + +# Specify directory where m4 macros may be found. +AC_CONFIG_MACRO_DIR([m4]) + +# +# Libtool library revision control info +# +LIBRARY_CURRENT=2 +LIBRARY_REVISION=18 +LIBRARY_AGE=0 + +AC_SUBST(LIBRARY_CURRENT)dnl +AC_SUBST(LIBRARY_REVISION)dnl +AC_SUBST(LIBRARY_AGE)dnl + +# Obtain system type by running config.guess +AC_CANONICAL_HOST + +AM_INIT_AUTOMAKE([foreign 1.9 tar-ustar no-define dist-zip subdir-objects]) + + +# Check for programs +AC_PROG_CC +AC_PROG_CPP +AC_PROG_CXX +LT_INIT + +#AM_PROG_LD +#AC_SUBST(LD) +#AC_PROG_INSTALL +#AC_PROG_MAKE_SET +#AC_PROG_LN_S + +# +# Tests for Windows +# +AC_EXEEXT +AC_OBJEXT + +# Configure libtool +AC_ENABLE_SHARED +AC_ENABLE_STATIC +AC_LIBTOOL_WIN32_DLL +AC_LIBTOOL_SETUP +AC_PROG_LIBTOOL +AC_SUBST(LIBTOOL_DEPS) + +LIB_PLUGINS='' + +# Add configure option --enable-maintainer-mode which enables dependency +# checking and generation useful to package maintainers. This is made an +# option to avoid confusing end users. +AM_MAINTAINER_MODE + +# If the C compiler supports the keyword inline, do nothing. Otherwise +# define inline to __inline__ or __inline if it accepts one of those, +# otherwise define inline to be empty. +AC_C_INLINE +AC_SUBST(inline) + +# Check if the C compiler supports the "visibility" function attribute +# If supported, defines HAVE_FUNC_ATTRIBUTE_VISIBILITY +AX_GCC_FUNC_ATTRIBUTE(visibility) + +# Check if the compiler supports "-fvisibility=hidden" and if yes, add it to CFLAGS +# This means that symbols that are not marked explicitly for export (CMSAPI) +# will not be reachable in the shared library. +AX_APPEND_COMPILE_FLAGS(["-fvisibility=hidden"]) + +# If words are stored with the most significant byte first (like +# Motorola and SPARC CPUs), define `WORDS_BIGENDIAN'. +AC_C_BIGENDIAN + +# Check for threadsafe variants of gmtime +# Note: check for gmtime_s is a bit more complex as it is implemented as a macro +AC_CHECK_FUNCS(gmtime_r, [], [ + AC_MSG_CHECKING([for gmtime_s]) + AC_LINK_IFELSE([ + AC_LANG_PROGRAM([[#include ]], [[ + time_t t; + struct tm m; + gmtime_s(&m, &t); + return 0; + ]])], + [AC_MSG_RESULT([yes]) + AC_DEFINE([HAVE_GMTIME_S], [1], [gmtime_s can be used])], + [AC_MSG_RESULT([no])] + )]) + +# Point to JPEG installed in DIR or disable JPEG with --without-jpeg. +AC_ARG_WITH(jpeg, + AS_HELP_STRING([--with-jpeg=DIR],[use jpeg installed in DIR]), + [ + if [ test "x$withval" = "xno" ]; then + [with_jpeg='no'] + else + if [ test "x$withval" != "xyes" ]; then + with_jpeg=$withval + JPEG_DIR=$withval + CPPFLAGS="$CPPFLAGS -I$JPEG_DIR/include" + LDFLAGS="$LDFLAGS -L$JPEG_DIR/lib" + fi + [with_jpeg='yes'] + fi + ], + [with_jpeg='yes']) + +# Point to TIFF installed in DIR or disable TIFF with --without-tiff. +AC_ARG_WITH(tiff, + AS_HELP_STRING([--with-tiff=DIR], [use tiff installed in DIR]), + [ + if [ test "x$withval" = "xno" ]; then + [with_tiff='no'] + else + if [ test "x$withval" != "xyes" ]; then + with_tiff=$withval + TIFF_DIR=$withval + CPPFLAGS="$CPPFLAGS -I$TIFF_DIR/include" + LDFLAGS="$LDFLAGS -L$TIFF_DIR/lib" + fi + [with_tiff='yes'] + fi + ], + [with_tiff='yes']) + +# Disable ZLIB +AC_ARG_WITH(zlib, + [ --without-zlib disable ZLIB support], + [with_zlib=$withval], + [with_zlib='yes']) + +#fast_float plugin: +AC_ARG_WITH(fastfloat, + AS_HELP_STRING([--with-fastfloat], + [build and install fast_float plugin, use only if GPL 3.0 is acceptable]), + [ + with_fastfloat=$withval + ], + [ + with_fastfloat='no' + ]) +if test "x$with_fastfloat" = "xyes" +then + LIB_PLUGINS="$LIB_PLUGINS -llcms2_fast_float" +fi + +#multi threaded plugin: +AC_ARG_WITH(threaded, + AS_HELP_STRING([--with-threaded], + [build and install multi threaded plugin, use only if GPL 3.0 is acceptable]), + [ + with_threaded=$withval + ], + [ + with_threaded='no' + ]) +if test "x$with_threaded" = "xyes" +then + LIB_PLUGINS="$LIB_PLUGINS -llcms2_threaded" +fi + +# +# Determine POSIX threads settings +# +# Enable support for POSIX thread APIs +AC_ARG_WITH(threads, + AS_HELP_STRING([--without-pthreads], + [disable POSIX pthreads API support]), + [with_threads=$withval], + [with_threads='yes']) + +have_threads=no +if test "$with_threads" != 'no' +then + + AX_PTHREAD() + + if test "$ax_pthread_ok" = yes + then + have_threads=yes + + DEF_THREAD="$PTHREAD_CFLAGS" + CFLAGS="$CFLAGS $DEF_THREAD" + CXXFLAGS="$CXXFLAGS $DEF_THREAD" + + if test "$CC" != "$PTHREAD_CC" + then + AC_MSG_WARN([Replacing compiler $CC with compiler $PTHREAD_CC to support pthreads.]) + CC="$PTHREAD_CC" + fi + if test "$CXX" != "$PTHREAD_CXX" + then + AC_MSG_WARN([Replacing compiler $CXX with compiler $PTHREAD_CXX to support pthreads.]) + CXX="$PTHREAD_CXX" + fi + fi +fi + +# check if compiler supports SSE2 intrinsics +AC_LANG_PUSH([C]) + +AC_MSG_CHECKING([whether compiler supports SSE2]) +AC_COMPILE_IFELSE([AC_LANG_SOURCE([[ + #include + int main() { __m128i n = _mm_set1_epi8(42); }]])], + [ac_compiler_supports_sse2=yes], [ac_compiler_supports_sse2=no]) +AC_MSG_RESULT([$ac_compiler_supports_sse2]) +AS_IF([test "x$ac_compiler_supports_sse2" != "xyes"], + [AC_DEFINE([CMS_DONT_USE_SSE2], [1], [Define if compiler does not support SSE2 intrinsics])]) + +AC_LANG_POP([C]) + +# +# Find math library +# +LIB_MATH='' +AC_CHECK_LIB(m,sqrt,LIB_MATH="-lm",,) +LIBS="$LIB_MATH $LIBS" +AC_SUBST(LIB_MATH) + +# +# Find Posix threads library +# +LIB_THREAD='' +if test "$with_threads" != 'no' && test "$have_threads" = 'yes' +then + for lib in pthread pthreads + do + if test "x$PTHREAD_LIBS" = "x" ; then + AC_CHECK_LIB([$lib],pthread_mutex_lock,[PTHREAD_LIBS=-l$lib],,) + fi + done + + LIB_THREAD="$PTHREAD_LIBS" + LIBS="$LIBS $LIB_THREAD" + AC_DEFINE(HasTHREADS,1,[Define if you have pthreads library]) +else + AC_DEFINE(HasTHREADS,0,[Define if you don't have pthreads library]) +fi +AC_SUBST(LIB_THREAD) + +# +# Check for JPEG +# +have_jpeg='no' +LIB_JPEG='' +if test ! "$with_jpeg" = 'no' +then + AC_MSG_CHECKING([for JPEG support]) + AC_MSG_RESULT() + failed=0; + passed=0; + AC_CHECK_HEADER(jconfig.h,passed=`expr $passed + 1`,failed=`expr $failed + 1`) + AC_CHECK_HEADER(jerror.h,passed=`expr $passed + 1`,failed=`expr $failed + 1`) + AC_CHECK_HEADER(jmorecfg.h,passed=`expr $passed + 1`,failed=`expr $failed + 1`,[#include ]) + AC_CHECK_HEADER(jpeglib.h,passed=`expr $passed + 1`,failed=`expr $failed + 1`) + AC_CHECK_LIB(jpeg,jpeg_read_header,passed=`expr $passed + 1`,failed=`expr $failed + 1`,) + +# Test for compatible JPEG library +if test ! "$ac_cv_jpeg_version_ok" = 'yes' ; then +AC_CACHE_CHECK(for JPEG library is version 6b or later, ac_cv_jpeg_version_ok, +[AC_TRY_COMPILE( +#include +#include +#include +, +changequote(<<, >>)dnl +<< +#if JPEG_LIB_VERSION < 62 +#error IJG JPEG library must be version 6b or newer! +#endif +return 0; +>>, +changequote([, ])dnl +ac_cv_jpeg_version_ok='yes', +ac_cv_jpeg_version_ok='no')]) +if test "$ac_cv_jpeg_version_ok" = 'yes' ; then + AC_MSG_RESULT(yes) + passed=`expr $passed + 1` +else + AC_MSG_RESULT(no) + failed=`expr $failed + 1` +fi +fi + AC_MSG_CHECKING(if JPEG package is complete) + if test $passed -gt 0 + then + if test $failed -gt 0 + then + AC_MSG_RESULT(no -- some components failed test) + have_jpeg='no (failed tests)' + else + LIB_JPEG='-ljpeg' + LIBS="$LIB_JPEG $LIBS" + AC_DEFINE(HasJPEG,1,Define if you have JPEG library) + AC_MSG_RESULT(yes) + have_jpeg='yes' + fi + else + AC_MSG_RESULT(no) + fi +fi +AM_CONDITIONAL(HasJPEG, test "$have_jpeg" = 'yes') +AC_SUBST(LIB_JPEG) + +# +# Check for ZLIB +# +have_zlib='no' +dnl TIFF may require zlib so enable zlib check if TIFF is requested +if test ! "$with_zlib" = 'no' || test ! "$with_tiff" = 'no' +then + LIB_ZLIB='' + AC_MSG_CHECKING(for ZLIB support ) + AC_MSG_RESULT() + failed=0; + passed=0; + AC_CHECK_HEADER(zconf.h,passed=`expr $passed + 1`,failed=`expr $failed + 1`) + AC_CHECK_HEADER(zlib.h,passed=`expr $passed + 1`,failed=`expr $failed + 1`) + AC_CHECK_LIB(z,compress,passed=`expr $passed + 1`,failed=`expr $failed + 1`,) + AC_CHECK_LIB(z,uncompress,passed=`expr $passed + 1`,failed=`expr $failed + 1`,) + AC_CHECK_LIB(z,deflate,passed=`expr $passed + 1`,failed=`expr $failed + 1`,) + AC_CHECK_LIB(z,inflate,passed=`expr $passed + 1`,failed=`expr $failed + 1`,) + AC_CHECK_LIB(z,gzseek,passed=`expr $passed + 1`,failed=`expr $failed + 1`,) + AC_CHECK_LIB(z,gztell,passed=`expr $passed + 1`,failed=`expr $failed + 1`,) + AC_MSG_CHECKING(if ZLIB package is complete) + if test $passed -gt 0 + then + if test $failed -gt 0 + then + AC_MSG_RESULT(no -- some components failed test) + have_zlib='no (failed tests)' + else + LIB_ZLIB='-lz' + LIBS="$LIB_ZLIB $LIBS" + AC_DEFINE(HasZLIB,1,Define if you have zlib compression library) + AC_MSG_RESULT(yes) + have_zlib='yes' + fi + else + AC_MSG_RESULT(no) + fi +fi +AM_CONDITIONAL(HasZLIB, test "$have_zlib" = 'yes') +AC_SUBST(LIB_ZLIB) + +# +# Check for TIFF +# +have_tiff='no' +LIB_TIFF='' +if test ! "$with_tiff" = 'no' +then + AC_MSG_CHECKING([for TIFF support]) + AC_MSG_RESULT() + failed=0; + passed=0; + AC_CHECK_HEADER(tiff.h,passed=`expr $passed + 1`,failed=`expr $failed + 1`) + AC_CHECK_HEADER(tiffio.h,passed=`expr $passed + 1`,failed=`expr $failed + 1`) + AC_CHECK_LIB(tiff,TIFFOpen,passed=`expr $passed + 1`,failed=`expr $failed + 1`,) + AC_CHECK_LIB(tiff,TIFFClientOpen,passed=`expr $passed + 1`,failed=`expr $failed + 1`,) + AC_CHECK_LIB(tiff,TIFFIsByteSwapped,passed=`expr $passed + 1`,failed=`expr $failed + 1`,) + AC_MSG_CHECKING(if TIFF package is complete) + if test $passed -gt 0 + then + if test $failed -gt 0 + then + AC_MSG_RESULT(no -- some components failed test) + have_tiff='no (failed tests)' + else + LIB_TIFF='-ltiff' + LIBS="$LIB_TIFF $LIBS" + AC_DEFINE(HasTIFF,1,Define if you have TIFF library) + AC_MSG_RESULT(yes) + have_tiff='yes' + AC_CHECK_HEADERS(tiffconf.h) + fi + else + AC_MSG_RESULT(no) + fi +fi +AM_CONDITIONAL(HasTIFF, test "$have_tiff" = 'yes') +AC_SUBST(LIB_TIFF) + + +# Libraries that the LCMS library depends on +LCMS_LIB_DEPLIBS="$LIB_MATH $LIB_THREAD" +LCMS_LIB_DEPLIBS=`echo $LCMS_LIB_DEPLIBS | sed -e 's/ */ /g'` +AC_SUBST(LCMS_LIB_DEPLIBS) + +AC_SUBST(LIB_PLUGINS) + +# Libraries that the jpegicc program depends on +JPEGICC_DEPLIBS="$LIB_JPEG $LIB_MATH $LIB_THREAD" +JPEGICC_DEPLIBS=`echo $JPEGICC_DEPLIBS | sed -e 's/ */ /g'` +AC_SUBST(JPEGICC_DEPLIBS) + +# Libraries that the tifficc program depends on +TIFFICC_DEPLIBS="$LIB_TIFF $LIB_JPEG $LIB_ZLIB $LIB_MATH $LIB_THREAD" +TIFFICC_DEPLIBS=`echo $TIFFICC_DEPLIBS | sed -e 's/ */ /g'` +AC_SUBST(TIFFICC_DEPLIBS) + +LIBS='' + +# +# Perform substitutions +# +AC_CONFIG_FILES([Makefile]) +AC_CONFIG_FILES([lcms2.pc]) +AC_CONFIG_FILES([include/Makefile]) +AC_CONFIG_FILES([src/Makefile]) +AC_CONFIG_FILES([utils/tificc/Makefile]) +AC_CONFIG_FILES([utils/transicc/Makefile]) +AC_CONFIG_FILES([utils/linkicc/Makefile]) +AC_CONFIG_FILES([utils/jpgicc/Makefile]) +AC_CONFIG_FILES([utils/psicc/Makefile]) +AC_CONFIG_FILES([testbed/Makefile]) +AM_CONDITIONAL([COND_FASTFLOAT], [test "x$with_fastfloat" = "xyes" ]) +AM_CONDITIONAL([COND_THREADED], [test "x$with_threaded" = "xyes" ]) +AC_CONFIG_FILES([plugins/Makefile]) +AC_CONFIG_FILES([plugins/fast_float/Makefile]) +AC_CONFIG_FILES([plugins/fast_float/src/Makefile]) +AC_CONFIG_FILES([plugins/fast_float/include/Makefile]) +AC_CONFIG_FILES([plugins/fast_float/testbed/Makefile]) +AC_CONFIG_FILES([plugins/threaded/Makefile]) +AC_CONFIG_FILES([plugins/threaded/src/Makefile]) +AC_CONFIG_FILES([plugins/threaded/include/Makefile]) +AC_CONFIG_FILES([plugins/threaded/testbed/Makefile]) +AC_OUTPUT diff --git a/local/recipes/libs/lcms2/source/depcomp b/local/recipes/libs/lcms2/source/depcomp new file mode 100755 index 0000000000..9f6725b9e0 --- /dev/null +++ b/local/recipes/libs/lcms2/source/depcomp @@ -0,0 +1,792 @@ +#! /bin/sh +# depcomp - compile a program generating dependencies as side-effects + +scriptversion=2025-06-18.21; # UTC + +# Copyright (C) 1999-2025 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Originally written by Alexandre Oliva . + +case $1 in + '') + echo "$0: No command. Try '$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: depcomp [--help] [--version] PROGRAM [ARGS] + +Run PROGRAMS ARGS to compile a file, generating dependencies +as side-effects. + +Environment variables: + depmode Dependency tracking mode. + source Source file read by 'PROGRAMS ARGS'. + object Object file output by 'PROGRAMS ARGS'. + DEPDIR directory where to store dependencies. + depfile Dependency file to output. + tmpdepfile Temporary file to use when outputting dependencies. + libtool Whether libtool is used (yes/no). + +Report bugs to . +GNU Automake home page: . +General help using GNU software: . +EOF + exit $? + ;; + -v | --v*) + echo "depcomp (GNU Automake) $scriptversion" + exit $? + ;; +esac + +# Get the directory component of the given path, and save it in the +# global variables '$dir'. Note that this directory component will +# be either empty or ending with a '/' character. This is deliberate. +set_dir_from () +{ + case $1 in + */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; + *) dir=;; + esac +} + +# Get the suffix-stripped basename of the given path, and save it the +# global variable '$base'. +set_base_from () +{ + base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` +} + +# If no dependency file was actually created by the compiler invocation, +# we still have to create a dummy depfile, to avoid errors with the +# Makefile "include basename.Plo" scheme. +make_dummy_depfile () +{ + echo "#dummy" > "$depfile" +} + +# Factor out some common post-processing of the generated depfile. +# Requires the auxiliary global variable '$tmpdepfile' to be set. +aix_post_process_depfile () +{ + # If the compiler actually managed to produce a dependency file, + # post-process it. + if test -f "$tmpdepfile"; then + # Each line is of the form 'foo.o: dependency.h'. + # Do two passes, one to just change these to + # $object: dependency.h + # and one to simply output + # dependency.h: + # which is needed to avoid the deleted-header problem. + { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" + sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" + } > "$depfile" + rm -f "$tmpdepfile" + else + make_dummy_depfile + fi +} + +# A tabulation character. +tab=' ' +# A newline character. +nl=' +' +# Character ranges might be problematic outside the C locale. +# These definitions help. +upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ +lower=abcdefghijklmnopqrstuvwxyz +alpha=${upper}${lower} + +if test -z "$depmode" || test -z "$source" || test -z "$object"; then + echo "depcomp: Variables source, object and depmode must be set" 1>&2 + exit 1 +fi + +# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. +depfile=${depfile-`echo "$object" | + sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} +tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} + +rm -f "$tmpdepfile" + +# Avoid interference from the environment. +gccflag= dashmflag= + +# Some modes work just like other modes, but use different flags. We +# parameterize here, but still list the modes in the big case below, +# to make depend.m4 easier to write. Note that we *cannot* use a case +# here, because this file can only contain one case statement. +if test "$depmode" = hp; then + # HP compiler uses -M and no extra arg. + gccflag=-M + depmode=gcc +fi + +if test "$depmode" = dashXmstdout; then + # This is just like dashmstdout with a different argument. + dashmflag=-xM + depmode=dashmstdout +fi + +cygpath_u="cygpath -u -f -" +if test "$depmode" = msvcmsys; then + # This is just like msvisualcpp but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u='sed s,\\\\,/,g' + depmode=msvisualcpp +fi + +if test "$depmode" = msvc7msys; then + # This is just like msvc7 but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u='sed s,\\\\,/,g' + depmode=msvc7 +fi + +if test "$depmode" = xlc; then + # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. + gccflag=-qmakedep=gcc,-MF + depmode=gcc +fi + +case "$depmode" in +gcc3) +## gcc 3 implements dependency tracking that does exactly what +## we want. Yay! Note: for some reason libtool 1.4 doesn't like +## it if -MD -MP comes after the -MF stuff. Hmm. +## Unfortunately, FreeBSD c89 acceptance of flags depends upon +## the command line argument order; so add the flags where they +## appear in depend2.am. Note that the slowdown incurred here +## affects only configure: in makefiles, %FASTDEP% shortcuts this. + for arg + do + case $arg in + -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; + *) set fnord "$@" "$arg" ;; + esac + shift # fnord + shift # $arg + done + "$@" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + mv "$tmpdepfile" "$depfile" + ;; + +gcc) +## Note that this doesn't just cater to obsolete pre-3.x GCC compilers. +## but also to in-use compilers like IBM xlc/xlC and the HP C compiler. +## (see the conditional assignment to $gccflag above). +## There are various ways to get dependency output from gcc. Here's +## why we pick this rather obscure method: +## - Don't want to use -MD because we'd like the dependencies to end +## up in a subdir. Having to rename by hand is ugly. +## (We might end up doing this anyway to support other compilers.) +## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like +## -MM, not -M (despite what the docs say). Also, it might not be +## supported by the other compilers which use the 'gcc' depmode. +## - Using -M directly means running the compiler twice (even worse +## than renaming). + if test -z "$gccflag"; then + gccflag=-MD, + fi + "$@" -Wp,"$gccflag$tmpdepfile" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + # The second -e expression handles DOS-style file names with drive + # letters. + sed -e 's/^[^:]*: / /' \ + -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" +## This next piece of magic avoids the "deleted header file" problem. +## The problem is that when a header file which appears in a .P file +## is deleted, the dependency causes make to die (because there is +## typically no way to rebuild the header). We avoid this by adding +## dummy dependencies for each header file. Too bad gcc doesn't do +## this for us directly. +## Some versions of gcc put a space before the ':'. On the theory +## that the space means something, we add a space to the output as +## well. hp depmode also adds that space, but also prefixes the VPATH +## to the object. Take care to not repeat it in the output. +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +sgi) + if test "$libtool" = yes; then + "$@" "-Wp,-MDupdate,$tmpdepfile" + else + "$@" -MDupdate "$tmpdepfile" + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + + if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files + echo "$object : \\" > "$depfile" + # Clip off the initial element (the dependent). Don't try to be + # clever and replace this with sed code, as IRIX sed won't handle + # lines with more than a fixed number of characters (4096 in + # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; + # the IRIX cc adds comments like '#:fec' to the end of the + # dependency line. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ + | tr "$nl" ' ' >> "$depfile" + echo >> "$depfile" + # The second pass generates a dummy entry for each header file. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ + >> "$depfile" + else + make_dummy_depfile + fi + rm -f "$tmpdepfile" + ;; + +xlc) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +aix) + # The C for AIX Compiler uses -M and outputs the dependencies + # in a .u file. In older versions, this file always lives in the + # current directory. Also, the AIX compiler puts '$object:' at the + # start of each line; $object doesn't have directory information. + # Version 6 uses the directory in both cases. + set_dir_from "$object" + set_base_from "$object" + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.u + tmpdepfile2=$base.u + tmpdepfile3=$dir.libs/$base.u + "$@" -Wc,-M + else + tmpdepfile1=$dir$base.u + tmpdepfile2=$dir$base.u + tmpdepfile3=$dir$base.u + "$@" -M + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + aix_post_process_depfile + ;; + +tcc) + # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 + # FIXME: That version still under development at the moment of writing. + # Make that this statement remains true also for stable, released + # versions. + # It will wrap lines (doesn't matter whether long or short) with a + # trailing '\', as in: + # + # foo.o : \ + # foo.c \ + # foo.h \ + # + # It will put a trailing '\' even on the last line, and will use leading + # spaces rather than leading tabs (at least since its commit 0394caf7 + # "Emit spaces for -MD"). + "$@" -MD -MF "$tmpdepfile" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. + # We have to change lines of the first kind to '$object: \'. + sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" + # And for each line of the second kind, we have to emit a 'dep.h:' + # dummy dependency, to avoid the deleted-header problem. + sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" + rm -f "$tmpdepfile" + ;; + +## The order of this option in the case statement is important, since the +## shell code in configure will try each of these formats in the order +## listed in this file. A plain '-MD' option would be understood by many +## compilers, so we must ensure this comes after the gcc and icc options. +pgcc) + # Portland's C compiler understands '-MD'. + # Will always output deps to 'file.d' where file is the root name of the + # source file under compilation, even if file resides in a subdirectory. + # The object file name does not affect the name of the '.d' file. + # pgcc 10.2 will output + # foo.o: sub/foo.c sub/foo.h + # and will wrap long lines using '\' : + # foo.o: sub/foo.c ... \ + # sub/foo.h ... \ + # ... + set_dir_from "$object" + # Use the source, not the object, to determine the base name, since + # that's sadly what pgcc will do too. + set_base_from "$source" + tmpdepfile=$base.d + + # For projects that build the same source file twice into different object + # files, the pgcc approach of using the *source* file root name can cause + # problems in parallel builds. Use a locking strategy to avoid stomping on + # the same $tmpdepfile. + lockdir=$base.d-lock + trap " + echo '$0: caught signal, cleaning up...' >&2 + rmdir '$lockdir' + exit 1 + " 1 2 13 15 + numtries=100 + i=$numtries + while test $i -gt 0; do + # mkdir is a portable test-and-set. + if mkdir "$lockdir" 2>/dev/null; then + # This process acquired the lock. + "$@" -MD + stat=$? + # Release the lock. + rmdir "$lockdir" + break + else + # If the lock is being held by a different process, wait + # until the winning process is done or we timeout. + while test -d "$lockdir" && test $i -gt 0; do + sleep 1 + i=`expr $i - 1` + done + fi + i=`expr $i - 1` + done + trap - 1 2 13 15 + if test $i -le 0; then + echo "$0: failed to acquire lock after $numtries attempts" >&2 + echo "$0: check lockdir '$lockdir'" >&2 + exit 1 + fi + + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each line is of the form `foo.o: dependent.h', + # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp2) + # The "hp" stanza above does not work with aCC (C++) and HP's ia64 + # compilers, which have integrated preprocessors. The correct option + # to use with these is +Maked; it writes dependencies to a file named + # 'foo.d', which lands next to the object file, wherever that + # happens to be. + # Much of this is similar to the tru64 case; see comments there. + set_dir_from "$object" + set_base_from "$object" + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir.libs/$base.d + "$@" -Wc,+Maked + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + "$@" +Maked + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" + # Add 'dependent.h:' lines. + sed -ne '2,${ + s/^ *// + s/ \\*$// + s/$/:/ + p + }' "$tmpdepfile" >> "$depfile" + else + make_dummy_depfile + fi + rm -f "$tmpdepfile" "$tmpdepfile2" + ;; + +tru64) + # The Tru64 compiler uses -MD to generate dependencies as a side + # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. + # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put + # dependencies in 'foo.d' instead, so we check for that too. + # Subdirectories are respected. + set_dir_from "$object" + set_base_from "$object" + + if test "$libtool" = yes; then + # Libtool generates 2 separate objects for the 2 libraries. These + # two compilations output dependencies in $dir.libs/$base.o.d and + # in $dir$base.o.d. We have to check for both files, because + # one of the two compilations can be disabled. We should prefer + # $dir$base.o.d over $dir.libs/$base.o.d because the latter is + # automatically cleaned when .libs/ is deleted, while ignoring + # the former would cause a distcleancheck panic. + tmpdepfile1=$dir$base.o.d # libtool 1.5 + tmpdepfile2=$dir.libs/$base.o.d # Likewise. + tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 + "$@" -Wc,-MD + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + tmpdepfile3=$dir$base.d + "$@" -MD + fi + + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + # Same post-processing that is required for AIX mode. + aix_post_process_depfile + ;; + +msvc7) + if test "$libtool" = yes; then + showIncludes=-Wc,-showIncludes + else + showIncludes=-showIncludes + fi + "$@" $showIncludes > "$tmpdepfile" + stat=$? + grep -v '^Note: including file: ' "$tmpdepfile" + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + # The first sed program below extracts the file names and escapes + # backslashes for cygpath. The second sed program outputs the file + # name when reading, but also accumulates all include files in the + # hold buffer in order to output them again at the end. This only + # works with sed implementations that can handle large buffers. + sed < "$tmpdepfile" -n ' +/^Note: including file: *\(.*\)/ { + s//\1/ + s/\\/\\\\/g + p +}' | $cygpath_u | sort -u | sed -n ' +s/ /\\ /g +s/\(.*\)/'"$tab"'\1 \\/p +s/.\(.*\) \\/\1:/ +H +$ { + s/.*/'"$tab"'/ + G + p +}' >> "$depfile" + echo >> "$depfile" # make sure the fragment doesn't end with a backslash + rm -f "$tmpdepfile" + ;; + +msvc7msys) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +#nosideeffect) + # This comment above is used by automake to tell side-effect + # dependency tracking mechanisms from slower ones. + +dashmstdout) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout, regardless of -o. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove '-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + test -z "$dashmflag" && dashmflag=-M + # Require at least two characters before searching for ':' + # in the target name. This is to cope with DOS-style filenames: + # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. + "$@" $dashmflag | + sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this sed invocation + # correctly. Breaking it into two sed invocations is a workaround. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +dashXmstdout) + # This case only exists to satisfy depend.m4. It is never actually + # run, as this mode is specially recognized in the preamble. + exit 1 + ;; + +makedepend) + "$@" || exit $? + # Remove any Libtool call + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + # X makedepend + shift + cleared=no eat=no + for arg + do + case $cleared in + no) + set ""; shift + cleared=yes ;; + esac + if test $eat = yes; then + eat=no + continue + fi + case "$arg" in + -D*|-I*) + set fnord "$@" "$arg"; shift ;; + # Strip any option that makedepend may not understand. Remove + # the object too, otherwise makedepend will parse it as a source file. + -arch) + eat=yes ;; + -*|$object) + ;; + *) + set fnord "$@" "$arg"; shift ;; + esac + done + obj_suffix=`echo "$object" | sed 's/^.*\././'` + touch "$tmpdepfile" + ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" + rm -f "$depfile" + # makedepend may prepend the VPATH from the source file name to the object. + # No need to regex-escape $object, excess matching of '.' is harmless. + sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process the last invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed '1,2d' "$tmpdepfile" \ + | tr ' ' "$nl" \ + | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" "$tmpdepfile".bak + ;; + +cpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove '-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + "$@" -E \ + | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + | sed '$ s: \\$::' > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + cat < "$tmpdepfile" >> "$depfile" + sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvisualcpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + IFS=" " + for arg + do + case "$arg" in + -o) + shift + ;; + $object) + shift + ;; + "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") + set fnord "$@" + shift + shift + ;; + *) + set fnord "$@" "$arg" + shift + shift + ;; + esac + done + "$@" -E 2>/dev/null | + sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" + echo "$tab" >> "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvcmsys) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +none) + exec "$@" + ;; + +*) + echo "Unknown depmode $depmode" 1>&2 + exit 1 + ;; +esac + +exit 0 + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp nil t) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%Y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/local/recipes/libs/lcms2/source/doc/LittleCMS2.19 API.pdf b/local/recipes/libs/lcms2/source/doc/LittleCMS2.19 API.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3d112a214903bf5d711811c2ad276ac6e9ad4428 GIT binary patch literal 1210924 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%0Dbxz~!p???+-&wG9)4bR}1(0Z#_HBq)M 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

iKoiW_{$5f=f*8C@Es1}g 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≪e#YC29ZA1>w9`rj^L3S)XiikEI1CR_hqa%! zzb35mg_hbb>KT;esOVVBoF{_l?9yOXpS6|zA-|0Np@52LP6(9)^qg7sVqes#?=BFo zeoSO9L|LPH`o7!?A&^mfQU{%>R~*8R$;Y|5NBzqHE_a55?*-gg!)>W!<&^lv&~7)Q z-iQtIGi^V3n=T1Eq&ELd=$T_wTA$~WK9RmQ>dQ(6)kB?{cwrPql7Wt>5d#F|s}9@G za@&{(mz{_)>IS_>{n(b|yLw3-0{tZ5dMShqoQDk2(~vPFopCN`O}m=K76;!6(2>kN z!(l7O&3MCUCi*-o3DB2(bZd%QYAEoP5)LHLakB@t-%y3ee9j^JM;fcTrxy?X`7q{w-R)DJMKwPj><|T4aZC%(HEc|v4yPP1Y2aINvKgq{G82^FjK4WrQEcXpxZIAAR5%WCSKXG2b!ew|%R=p86Y`ip}G6v~&mGuS)Vq&V`k`cofqrk2sl8*fRxYECX1TV$Z*N zF2d*Wd0QSG+N9+Uj6Jjjh>UxbDNO2wg}50HfAm9+VcXnavGBd9Gw>h%_Y z6|BTzzy52NYpE#4_R@S@y+TZ*4`|A2{vgh-_Ju%{-xsn*0y!?hrHFZ|rXh^6HCy>&w%T9c^&jI-V!9o8!<>mk8EC16$XQAf+ zy5|4op|f!UJ?H-yU-|EZIsYeLndRRr&$Kig_gj#CT$4V4VGt@@VuXO61M_7^E5#`j z(;=*&_AZJ8^?q(yZ<;*H1N*9oAvztB3Aews7F%HT5{Np0Y zrZ{|3G<6!zUiae_Rt{eGZ$Qd+y{)iF$K;BOy_cs@Fum;C3AD)m3Pp73jEg;jr!8OR z)k(aU37eCQU)x)Rgl}I*fi&O&1%Hx zN-J16ly#V5EcOku!377R#+dthP>LM1zgT-E>+5uE`e|gf?W#~qfFyyZ8lQ@@sErf6mLpoAfJjl~xDe*n4wezZ_e+l|y!K!^7sL1VZ>|Men?sx_xU1Ax^2j zynng6lSeFf@6VM}>fA}zKv(KCpUc#+Q=fu^FoXUinU@ATB%^u+0X7Xg+EWt$96PkK z!7E~cK3MFNXBvpyT$S^*6o!>#sQ*?$n4sufbiV9|rACpPrM-l{iq6Ox+stCN4 zuu5=Ki`Wsnv3)Vd51Y37x&rPGpiXZu%>1km=H|HT?e0l@n&>MfZ-bh2di8sO6QPK3 zObo-C57b+rUYI1Tk`Q1`U0JNRFaYpLRPlt5g*aGg4F--l9Dk@$q%c>`dc(=8>um+G zx$EgEz#iKFAxT;&W~?QKv3S$CA)Lgsz={z~k&#UGQp$3&*})CJ<20>lg?d1ED-AuU*>wW_5J|wYnPZ+>IaCMKjj_r`#Y-rKK|a& z_RZ;U>ucwVJoIG{rVPzXj^Ay{aV=gCssNq?uboI&(VK`H9vp{5`4*2rb=Z+gsQoiM zBy1*+pE<6dMoS(|rQEtI{e+uDzvjCn*@P+@d~rrvN|t2Sy;nPI7L?RsWjQ1%9zvV1 zd=(U|2ixc7`Mn87e zyN^?)minNs#->4sva#^8&$hq2ctMI~Q>&&VuxJ=EL>PBuC$6-ZJJGzB2*vr<>Pws! z(qpoN*@j!EA2M6&*nm2rCKa0N%^w} z#SujW^zK~Qn+x~R7sV0B{T#B~D?DdQZdAru`B$bAZ~-7>5l2Hw4upM=AyoNa^VkJn z@!|-P{ExjD^Shq~y6h?aucv&2k71t-Cw6df7iO-~#O`i(K6DK*1lphMzk52R(75gO z!yO!7^2!k25b3jPg6|y+;ltz-+;6gc3Efns!8vlj{xSO)8`Q%+{^?5o-if`zKTMRr zhy;q1>EN+2Ld#6eU~5mWg^xYS>EPfUrHzhJoYh>;B2WU3nhYLw0yz%-M_i^ib0NW-v7v+9 z)|9EjQ}8`iU7r3Cp?gq~^x)iQuow48g6aZG9?gxs5DI7x-f|G6=#yBxT5W|fG~|KV z5Y}FY2fOdLo>}q@#8{RonLcdPk&yQ54t%}$SzG&aMEXvw%KQ}etqtofer`k#`{e-R4816<5AqRP%zc_bF>(!LfRmbnMCHm|n zd7=o|F>AI?w|S!3Y3RG?BSfGLfV)RDm(oq;h%LgKSQa+nKu56Hoz+;}MUMVL$@gIX zoDadqtezOAt&=wm%A!ZxWg0TbtbO=JbTMF1$rwK z-i72?bruf&PN_3Fo8As0-Nf~=B?j4mu;5j;pS=+f*NmQ9tz#>}1g>1J2v z=K1947=_;?aiI6xm;?-T#SGKwE33%x&r+E2aPYMYZTPiAFHCX}`~}%+uQiln0bWNh zhk{K4!jc&cZ=J2S)ok5&+>dBXY-d(MGw0PFhse(8isz0gB%eYmXzupAJHOis?SgWH zjZM%6J=7`DK{kS4#m=I?b44YhN}8*aL8G|@3L?<3*dW?hZFEMl8Xvn;L zU1qQN_f@aH=7L!cwjsB3lH&ThJFL0}Z~bS%Ia4vsvZb!Ixz0S}XCvN$qdAH-FVG>o zye%EFTllj|cj&x67F(nB_NXLMfm^F;GJdSN-#~%`%b?Yl&%RrNdQ|-ERzjWe48`Q{ z2|hOx^1j&`CkT2hD#n@EDkrT{m;t%^Ije+TVC}4_{+9L>t1UQ`cPPjyA)zi3@m}sG zwW#z{j>oxx?Gj#I7KPdZT$PzGXR;}FDNww@OK#onjXw z`^?lG5i8Z$w^{JHk^ULs&*LpTa4P!Lc%js8^sbcUBMw?gE&{M3u1*B*<+gq6#KUjRxB5F;*`Q?<(hd_H+z33^PA4tfRzN+fn-Ki>B=Cau56q- z*IMP9^rroIT|dNZKos-Sn#p6&%5KW0F#2 zX(s6V6vy-}X2$SY3m|(+woj(#uuk@u4r--(?)ekHP?nB2D*xD2>4u5_Ysm&%xhteb zX_~qY$x-_!At|jd7;AgH_f5>}TJKTb7w55jfZbtOvu-LCWV&(e3zSW7(8IwaoGv3BdeC*Hi4&{lF z)c8?bNr+;QNpYXxwlLMv*Q$(AxQCr{@-H4GdYYexBEUuB%oF2g1RWuHls1KhUtkwy zKI{67%eB7NKwdh$>v65tI=0<`xrd9wVMg~DgBY=$)5f?M(9~S+;KGQL? zurhozuoDNEo0|ROmY|F2U)BLBF4-Am4BY;4!OYCg^4H92|LDoe$jG4nU!$1W7#WnD z0M@F&A%FD|60&vEBBEnsC;IbzB4%bFVJ2`^AjtT$Pe6hPooHCPHLl3X}BMDaEar-(@0V+qg zHdHY_^yK&1Qz)n|$}D9?))_;G!C>NK&1?R-`H$``uE?!#{+%x# zA#Vt>FE8IqgS|z>{emG?x*c|!X}Z0n=M8F~Kl>L{;7qx*prx_2WUP_^A$1Hu05G8{ zztH{iOo9p8kO?r;BGjP#IZz$93z6E>h$;VOx~v zQrx0F?E4q%!hTRh83t?J< zw6mE}DQG;8(`tKh09h>KvNruOsHNn+oY7XYM7X7*KULpK;!gQ+j1XhSZtw@571_EU zkj4MV-4~T7hhHtrAM7LRG3(~{n{oo{UF3Bz?z=;62LJIZ?oRj7)aPCO14;iM5#l{< zpwl3k;%oz=I+o&8K(gqTvD{o|FK!!kgqswaT-Ci6Xt}fV%$M*Ci*}M1qFK`U+5pNj3uT+U9oN8Dx znOsi^LY2ZU^sg&$+O&eK%U)X}jLhQA!;QnP^`)qAT7W-kiW?9HVt)>|bmF9LEY)&aZ5!ygRU<)CS$hr?wxa_ zZuZzLTif?ri_Tg;)=bF|#4@KB^={j8>pRFoAlEk;?=a(lF-fK;2iDvX!puDP$Z zeQHY^YFD&UZoAN0lqYoFoHDLqBFIhkr19ooy1B+{at?N;>X;*Cx_%D6a^g=8i{uxA z^Spt-J4Qh#2)6c=oPNo5jE5P|?XTh>B5Nb7hEi|{ZVy^x7mC^%db*q@#&2c6a?q=@ z@RU05&P)S9yO<^eS6UI&*`nA^Qz;JtPACx213g(jCJ{d)tJ5E2_`M(RS5i7qFbYT1 zJ5gK9B(}USUj-NHR}zVNS>qYQLgGPkQu>yChdSF*($7RE$(EAB{eE|K`wS7B!Z}Mm z=$g6dNw&>h7iwo)WPH@R+mNy_%zZKs!LC7@N@_j{kaQc*DBb4egO6o>V>=a(@lB2NkP1>aC&Dv0RRof(r5VpX^?Q_}; zWx zU$(sbciy2_s(x1+iO>E+je(9*LX?qyo?Oibsg~`)3zHzl$5sNwjhmdntYeRjYukY1 zyW?`lEG>urh)3*E#qB5Amc<%~_Gibg?oV4^n@QD!C5);%lEa8a&+g5TRtJb-tlSux z7q>vyA<;+(BKFF1pjB~))t=YEjw}!_!oawL9CUm&r?Xn?++%2@o162E@6zMB^hY&sfGq{=*mnFVG=1mzzUxY zujZR6<2D=>i7!ztntK$!68=oP}1j;Si3d7`cSiT)zpnya%zbx$-1q47 z#j?lDR@Q(k6){b<5X}-VI&4b51+z$f_IO>j$I7|AjeE5DiJTXgVQX`Wh*?{#d9qxq z>i7wYhVZTq#Ci!Lo$ZsN)#Hy7yJv2`suY(SuQ~J8evRbA$BMdz=GsNaLIdVBlGP^G zP?3o8V9kmfh-MuK?jD;0&;<2^7iR@2CM)f!2$Fq3tG&CD_8WDL@1eJnTN^9hnBTrNE&HXJh)Vti*mEGwU^0Lej|9i?@~A{-@BFt1qF1Nvh*V+nPyG(uOImfkg5MR*{9;-i42bk=7;< zoA#&ZdF}N;h+aiBdORU+Kif8-AUgN~8C<+R-K(}@cVbHFb=0S56s*O{jZv9)Lo-?qeoxoLB^f!l9A7g@Z2Y^QQRjl#h@QpgBavkv55;8 z>+F&S!#aAs&8VXZ>RPbwV2B*eBA3m&H+@qzFssi=NZL$A+Zj0PQ!5_grpL_z?cCkE znZf+U>3cbGYm3Q2Yu$Z~zEofIHrh#Ujnr338@urhJxlTDsVNzpXb9ls9{G zLzPOFd#@AnD@J{=I$rxww|GA854x+*FYBNdVOPy<1m*+{5u7%^MkBUepCD=6Nb(I* zOFvGX>uQN1;2omDs&~4ZJVO!K`?kM1N#D0z5q}MZ^Fa^nORgS{|2Te)M(FDI ztPqa9fA@8EZuSUfy2MBrGzmMrI|aq(~18VOfxnBf+iqv0zx{Vy~8}mPz zNI)3%7t;J62=cE^e<4UM;D|p7REj!8f9=>mq|yFr`X|EtJLvu24g2Rtev=UXW5u5p zGXD#hG60*EZN(&nWen^X{%Jacuo_U+4G0l|H5tA%%8j}#lKMCzW^<; z`5$U-YQWX}d4vBG6#g~lpVrDb7y}%D+eZ1%nW%_>B66nYj!q8ll!8F%Hvq6f$=S}% z3Sj*Q>jG8d{=V?P2gv^WP5sM~zYO~)wEo{W&;2)8{Rcz;+YbI;M(EhM{#{NP zn9YXUjQn1W{TA{%GOtd#c zDW9gZm7UGFQ-D2Q`3260SrOT~ejKsq@vxb_U8^^BHS1M1$W|{q`#0n0&ky624^Ccp zc#ym|Z6;^(#YiP(IZmi?Dg&jMf1a?OTXxS;A3lSZE~Tm}DCq znm4nP5{NLDqh-vDSroqx4c&NK0coX{Q&8f?JFsnHW%b||2jsc2tK&7Yb#y-%k(&z2 zHp!FIQ{UaWRd45$ihs>ZjEeVqEZm|swW#OI4*+=~r>p~-y%NTO3KN*XKrjMfGvXbO zw&`r%t#CT9R z(J*HOiypx&OGVf#v(hj6ZpHSPOo9PY1-8+)agxGY$qbQJv%Bnr`=!`IIqkScO8%yb z1Q|3<$GwYy57sLik*Ia*ToZVp9$w^=0<}rz)e_-|Zav*sHQ`nN*WnX`cm1zom;)|X zF>~XuWXLXNzbQA@mlO8SBewX3d{GU9sCqO2#dN=u(!gCq;9+SLJa7r407yD^PQ=ID zL8qWbEw2kpwux6Yw$0;|gn_=jZJZ%*QV__D`3>&{+Vh;)jeDblRCJJJoN*mp+i2gt z>BVA+OSj_I!iR~&AvfV?0sb10?p}V>@YWk9^ziUGS`Y=Lc?LMxaF;%=L(Xbjxyyu% z?7&>MIK2H2t*2MH$P+z%;SZP^dR<%m=C6uO@V(u1i!7URuR;3^bE5#xtEs9(P`dQd zGZpbzmWe2OsVVv$3l9iFpbpuJsrbSLog!17Axu_hPN5bI)VR_w@O}oy&YGoDlVFlB z$cC8vFfgx^dOzN-`Z=O<3I1&CN zlnR06Ry?Z+vz?kmln*BBkYI2~m7J% z)b9N|_y+Ed(tzZTIGg7TlFA|V6nGb|cG42(H|lZ+^H@v%&IDQpa}I)L={f>Jj@wP~ zA+ue-Dq}RdlOkz2tJw3lW%=g|SYL!X1H7F|=uT(`vBv-#E(LEnliX!_%7&EP{AHTQ8@h#V#Gs~w_y_=6g5w2Xv zIuQuS*6nvlyzqQeprV&(PQPGeB6-u*0YVAPKmvlr#V3OsW%93m9lz*5LJ3cPI(CSk zK583rMojqNb*tGm)ae+!$A^Hp#~|=^L(3o1g27{7=kWPVeM^NWuE%GxXJ{xeX=(wM z+IQ-j+T?P1G#csg>h6~=*Ds!lczV_zy{k`*S7(_?0Q{gwP^TBFt>QfN{Z44qX!#ggghH8v2=M>TcD9vVGeZ zJKgHa#?#Zge@A|S)GsF@u=~-BBWsTpho2YPkC9Au_67d8Lwzl_f&JPoZIooyC|Y=i zM`n4j2cH^M0*6?`O8M!np=E4|N>4$J`7DUS{93kxm5R3smW5LJH1xMk&1!t61*sVx zO_0VM6ghOHV^+_2RPbA!_{aQ@bQImiYWMcQP1JD1Tj3v#lo^`kj|j3CJ!PvBRQR-dzxrdNZ@YZXZjnE` zK63kQbpFWdOH&zCZfdm7=OcnAh$d97wj$cK9M=rL5QGt(gbvsC_7N6rERD_N^rB zyllI}#36*37+?v5P$rKj7PQf1N#IHVQ&x=wVQwsP zqEU-RNnhg2URBqpHZ5NwF)i=gfBa^&snf8?GF)?DjY18@%yk~SIe2-`zKWgTR!M&v z_9=f@8bedwHChW9h668;hBt&Hp_S#%27n-dsMQQ(m+y+TNTzjgFkX7kfho6?8}8 zye81V+9&dLJSB14;)Y|KPUAnadKNCFJ?DnWVu}t68sS!B$LQkA+ExRHk<7AufzvIcyD{K|J*675R8Bh=a5o z=Vh3D@7l)bv+n7fHvIfzjdUsk49LM%x4C@29=Y9sRxx_Pu%>M+KP$=EGje&0CLO5I zZAvR@ONLz4;F>fl8g_tfccZ>%?adRg#iLE?BAxoQ?j)nIJku1peN* z4!xs;6#~=n)GMPms7qmCV@`z9p*&dw9fPSZT|Y^@T%Tm5Zq>E#jqh9uxETh((s@Us z3s&Y=`-zE$Q>EwY6?0VXC`u{=uo5Tf&){dLAF<=?-Yi#fKPY7G`NJ<|pZ<3g1`PW! z68+O*|IZ0wtV|s2|1*j+iNETwF$9d_{D$JW`uc^3gE6{*S}H8DFmoXJR1%LSDPKa; zWb6x|`e6The$#O$vlj)HwhD^grG#m7-j%~7mr#!2NBk}@7pxZs%$J5HyuBhp?BjQ7 z3zz%-{l&rT@U%#;`>3-0!^;6O6sPJ<{t{V84t0@~5~iu`r>j9V=UWpfM-1CP*6=O{?&g1~_PaH@$87Uu_Fwb&Ft9$@j2E>(KK%NHs8!#(29M=| zb(+3DSB`f2ExB$kphsOJAwV@Zw=lgD(z!B~Uhrlk7u{aNBS~~KlRZv6|77miv|3^J z1t@DKJ$hvsMWvjZCS7P(WJRE?6IGDc&Q>v^>^BL?m~0mLM8Rm{k-2mof^W*bFOJsL{5SLsC+NmRYHeZz=y+7 z&7Z`>mk~iSf+$Bil^u-|A(Zu%xr75eosYXCABxrJ)zTC9_@vR2O_W+ZQdF9IV72ZA z^D2D>(F|7%J9-~md+9>ThMe}mIb$X$sjae4H~b8$UdK2k2qCCuJRvx9}N4BMh^?K17<*U`5kuJH3rPvDrNXW7^H6J{2OJ7o8l<+%MC_HjCqfDk4x z+g@9)ZKBO)j<_SeEe7!@;!Zw+9oTr#Ji#f7qG>W#q&8BTXOeJx*uIZ92Q->qDf5_- zj_mq}u2J{CXw#qBjM3Z-93X;nsez{+LL^L}H5fnPiVqNbglqkf%tiZUOg4T%XwREX zSbpjOFDo^BgOeGlU(@7{O@QhXWWnLW6-wx3gF;D>Qj`^2=FASO=1OI_Hg}O%O;zxo zWiA%?EL?`7ECwyYO=i^-^y2jO6q&v93Yi+xVJDzm(pFF1+~VD$hWfb~LZ^l>v>9*< zDb={1vkU5PyA_mw)#2s>yUcMtoAV=^zn@5|dqeboTW2=QxqkTK9>N*6C(8Y0;s3|Z4Rv{ zm>MYTIXFBEx40*A|1b*EXZKioMz+33gLFlXwik&6^cOVbRaZ~=ZGqP7z8GF-J_h}0 zL~iA?c6U5{tssz(0V_lF5~)2VK-S*UA^O^ur8Zd_PxWnG3kakTkZ_jhc6Vcq>G!9PT)OR@!FWhIICgr}6~dw1 z#xhAh(xZB$x~^d}2gg&ba5V_KQj3h!sF<(DS0_-}gH!vPbdc4h$5-#`*Y6=YnAfoB zCy+A!J+6fGc1sZzn^*So@7-W0%UabOIlcq|tCun@7WtL1mbd2t?D;MJ%H)HEg9YiT z4v3Q@Z1Qa7>W!jcDnt-jA`RFsuh(w(0*FDY9q{nD~1pDLzV zReobo6&P8-eEM~&$`(UU#pjyfPnJ>9hcj_OfxbgQ%|nlAr5iAe=0VSJs^JPCV$uV&{;&Gl{o3vCX)93^d(8taHv*QUV)9&?}fPK^SR=rBZuL)X@5CC z&MT1N1i_*~p+%qI<+M@QNg3AJACdAh;|`=eY)&CJtOA_yi+lcur$kGUC4uS~CS_Yi z<@#$7G+_-xIHgy?R1J5lEeVD8YlB?Q1mP>d!acm@tWC0#y86x_(~6E|<&912s+vpP zFJ6(*R~%t_#&xJ#}k+L*yf?PpS1Uv>4h}eA6&>7V>N^5-&Wl2ML@7c88Of!dEl1&j1`~Y0(sJIPS{KL zW#r>6e*Z%JiS_gP%r1vcQ zq;Sic-$af4jEgDj<93uTR)*?%d+-z-f+)}1pu^J?5t7g^X2Dq;lD)cg5vt77ggJC#zioHy^$5gbxB8>Ja z#jq*Jt9v?(Czb@7yNMZvj;=B8SUT}e0b%fIZN^KOP5;QBvQd;xW_(tk2I=6*?c@vM zKqQx9mPTc*mwBRUk_rj{71dojBDiX?pAyNAqvm0Gt8(0!=jEHf=h*8M(omJ~-5e-L z%j)#?lli8#yax1;aR;he4GCP!$EN|x!AzxuI+;Adp<`mG%!MBu1pU&dPvD&@@*7=Bf^-#oPrGX{Y3^J17;`_IA zzlciL(-Hl6v~Yw;{OS6@wTXkHrxU+x5?v>%sHA(Jb@iC3q(~2Yi4%7Z*LCq|yP>2Z zWXoT`^7?G;;8cV*A19*B|5~KS06BJzrH*JlC>h-o-6OvR*GMeN@$TfDOHa^@Cc(dg z;l#?K2f(b4t5+HJd8?{gxxF6>{1$?dPL65RCN5*j5GX+uj1z2b>4Pbv!o(GO zvzkjLTCI(Q@$!1st#E4d`c=;6g6lYj0P)1zK+x=j=(RIVmo3}^k75O(9uj5W>?%{ z3_bspf)YD;VxSQpczX!Hppv@mf%T+%%XMd5ckO53WB^wS=Nm zf<&=nlJ|J*LC=)3lUz=nmAda{t-zq{9W$^YcW%=U*EG5gB-d||8>3)$D5hMrj9bfK z2HHS!%Gqzd@1t(7CE2OQPGDP6Znw_*W40IEa6YXi!AIP8QlGc%*6&MnNTtg{1jz0f zd$11KTtD7QLo+g-`?}g7ri3jEDlX|WZJ71FbhR2sNDWg1ALhfSj0cQ;C;#-?u4YE7 z;O0~b9Xrfd2fA|LaSoZ*0avX4VJ9e^nY~B)4g_>x4ULN1pt&e)jX=H8th&f)nFJ^} z5Ax0yue>^(^6T?}K3Z`G7H6!LVQd;;O<5x<@}i=5zOZcS+YxG@z47Qk&+Zrn!_ zG)8#=V5fmY-~}%0`MCk@mQ6gcfb@iX?LCBZ2+wgLHq+gqCLV$|C>gBam{AAM8FGP8 zC6I7C9Ta6`(w4SSmqNP};j{6DOXFXBu%foVe*@o?rT86Fb|s?{(f-s2Yy8 zwPII}(1_Q=fpTw2ogADO<7rp0Tv?9Ulbc2M#KyQGBt@F~_ZX({K@+5p)PbAhm@M9h zSl@1bCsvkVfr1*PYj_z)^0*;fJX@^}wzE_Z>vlAeZA;;<+*Ln)_sPe=@P#OEB?lWK z%o?vt*Z#;~Kd9<0QAnWVFS@gUtN9%DYsmKpMadnmUhpXvzM1J zzq-yi+<|3t!Z8odDhQj270lXuqF9Z)NGb_sZY1VpIhKDWEoICVdG&@3w8BOcx37~9 zl)g$m7OAvjk{}4rs&OhkUQ8kV_Ff^8R(jZ_b+M|si}rG_rRo;$xj(g9c^*9XhYtp7 zY~E!$Mo)fIgzf0A_`$8T+CKCPFKHc-=y$4R(lL@$8xdPaZLdq-`Cmhc;VqMP%m+sT zZ7y0;+T)r`n9XmgAI!7*4)=XGmhq!BMLtf^Fq zgisJ5{YjQ9bXkHLK8N1z&O?cCt&?tF4@?Z&inW-ur!N5yF{w~_@k$!<9v^4uxE9RPitulJBOpBfMj{Z|#*1~I zuaR3#n1t569L}j&GfFGw$-FVJ>(nyp=d?On&{Bgv zTF&*MVH8M?Ryi4A^}>NuO0v*)l%I784KYV5RbV`b4pe}xyVm679`SsLhrWQ$Ff`~- zo#CM{WlLwmQwd^Iwy|S3*#Y#s`92LKK-6>>g~HLMxS4&!P_iRg(}J6#6#ED6ti5(v z(SWnP#=SRmnmaQIbirv5Dg3NGg=$g-Z$C(e3F7m;J?MupNkd9py{Wdm?i`;8(Rf z)zYhNoyGTqn&JF(gJqKDLncH)JYc!}kGnZuHc+Ls-`tNItW|1P&aQLZdEmJZxQ~!3 zo}^sOt;~pM7;=3wT{a8|CEHCYVD=vOz6T432mj%4;_teh|BP(@Ekw)&B&+~t;IgoC z(lY@wS6NxbQT>t+NvEV;5bOnu^%x!HLlo(VLCI0+VnmIYyePv((*wDM0 zTbkPefLX-!whpEYf3AQ5OCx$c4n{62B0k{X-{X`2clobCLcxE}f7Oz5#N|Ngs*wCJ zh-Rt&jNJjXrL;%7CDYmwMxur=sv2HQIr>9psPMq*-Mj76L<9>+88W4XWfd6VJiJo@ z?#VF4&Hkx`gye6QL;#?8M+G;z3Mkvg&p(=6LZO$FlkN44KTb(jG&02?Cr5dcggr?u zLCG^GgrWjCCiJ_0mQ!(Q^yjLld7XT+otBgH8Li*rUwwWoq1f(=Cb+Mrrv%HpCI zk)mgLO;gRBLw=99n~54x?5)6H)e6LjHy2`|ljVwnL?*ke9j9nSIxrlov;S_T z`FVUL%_p)7$L{;(pX^tteh`C8ky&Z9s)Su?^TE2iXNFcvsN}XB{k%|u6z-dFRJHb{ zFw_8)Z(_19tgM2h&FQJLyPgoP7ef zZA@=~)z&{6_+iF2R~8S~AHR=bX7~$Um$VfIV<9VgFBEzbu%xO*Wi!izHj8O5bU8Sw z%R)n9I}gFpmj7H0fl$vpjM$s-i*oOBPnU+EPHj9Zg+VPC)@_?X##9m|wkehDpIu!# z90fAR8Mpc!@~1VuD1<4-#X|^_yEZ5q4vf`gy4v1CbhZy5Qt3>f4gIj+6?6DeNb>Lw zgJ%^u$`+h__&tUp0`8*V4qX&WDx1z)Sn;|0W}QXfeJLo9tv2bI%xB2#aHwYMcl7mL z#)NDGZ7F6$Yu0|{-Jr>xh(fC=ga0pQLBRW-2>z4m_{)4gv?Kizo1R1)FIDLmAtJjLepy24Au$ zVdfYJChaxyykVcUBO`tk0Lp$4$ZH4eGE3I(^`xvZwx7DZWna*)7XUMQ(XqQDt`0qy zHNH|T>U+iN#ta+Mvirtf{XQSr{RJ_6o%?YDOKh!QFC;*VE)4dG3O^i0Jycn#$*fdT zwHE8D{QqO^Eu-7$vTg0eF*7qWvt?#xW@ct~%*@ObGc(&UGc!ZX5JSuix$5_H_j&tt z_vt(C_x+NFRI1ul(kSh<_MG!MNK`PblWVT6a5^@5x?5_>dz!On&_FjP#FRn{0jn?D zlW&Xb}AEpKp094|$=X))n~ZXUy>%e!q2!n4vodws^_J*V$GHtnVhGC=rY;hJ-H z7KLMHg=g!Aqq=Tv)1769%f`sv`iX(sD@g&TTB7)}5em5ige^a#CbAV3RrZGpy8_Lc z@-19Po&VHToXa}&XiOk~-fl}^Ym^E-rQ3dTR0P}-Sf?#GWCT*IugIYLf~4;gqp3m_ z$1)vWCH1Q3UTYSw{sg7iz#5a@Ngj`uOLL6OE0ZEb#rs!u?GS%I^AiP@Fy zksoMk)bdkoO|`en;y4N=R12}Ryr=LMI673_I-hDVr?C;SXXH$_Q$TrOWZ$5$)qgSD zeVylLWU~X%IhkSAYKNbrL#nTojSY4?vO1*Jk(i8{jP=2eaqix<)u{@E?fYXRXXYXe z*sox99XvPD-Fi=jJ!p4@*wT!; zu;P8Qh3V=dv8iwUAXQ`Ez73M3e8$=OT!ETcIDzm<6?!z(2=XfdXa($O2Z0JzGWmRP zekbHs&300df}Y14eMj1*E=C~rz?~P*04jb4zl8gT>%rAa;J*88Yo1ge8vrM)pBk){ z_hrD{T1ctiWg%v5*{ITItUt>MCYUBVX-7U96IkQ*w>|hgVkY3vhvoreU&daqA zl&Ry3zEwh#ItHRZo3G6$Gxf?5Py@MT8c2g~P+oluzPOgv;-0a1YDPx(?k%pLZiuKQ*0XlS`t0^nH%(@(o zJdQ&^sh!4S7>c@Z9BB=ve8q-*0j;An#i=(5cdD=i>cB%^h-GK=^6*bMGqjAE(+{cd z4`aT5tqvk9sIFebaMfytnHF+88ML>zXZ`oOS()Zlc#SMvbeq4!uJ$&(GML{4XJ~|h z(!cyHddPK6G}Ppq9$5u-)+@MeLR}be5JzY|J z*fzg5+C*bPumOAo|5Y0t}Vc0-#aqmk1n~= zTg0nybi6;{nVMyVU^B5}+iV1;4$8370Nw;>LGULIxNVWb(kw<#L3+8cqcWE^Wj0T9 zHS*v^1Y=WVL$i-qDbc!lu$VvL>qvuqlL$akOtcJ6JP=iw3D11XNGq>?s3SJPBwd{1 zu|ckZiC+?aU7NNf;$fDk5g$-fs9y_mIo1$|uchPgh46uiH9`D}#jSxcW+ECpC&Fxc zwJcv1vDs%7v#+sdVZtq6Rld;&{H=5%*_>*5wUtNR+#!OJzqnJ~7qy|fbj1(y04N&@ z7mbC8ODour!g)5QBqN)r@N-uNz9vy!%Is~C_#&87bTUJIq$IIn^=Pl_5fnVElX?IS zyCf~bsC+o~ZN=^8x&UiXl6)YM)!GT#xR}6Y+4rZBbB50dsjp87^m2P0BCn19b0R3_ zj?3j&tz-cQD@^$cj-X5Oi{c7lmX$|Vh>LTq>nC`!Esiy@aM9tU8=?4;Eljy8kkkYE z2Bfd=7B(Y7wo+kaAII8>yV{ALlVl%cEf5q)vbG8Fka6?TM!I*)Bs74x0|8Q%1*U=D zwOhddTatI%N&mbNR~(i+la~cj*F^n~QbjRJ=4cfJ(66yD{PPJ%kgML{yvBLQZ87Bd z@l2feCA9gN+(o!mvy|KN)7$6-J*59;g7{|*;lE$KVqs$WC%6qT)%g#Q?q5=!S;e40 zKqEHUSTI^GosZ8Bf-EFv|G0)~Fs zV@#0o;}Hze4)aeXQO2U;vgC+N>^+^lCt0|8-|f9UoxG+=4su4Bx_s;c6Ag56uPNoR z!lW}~GR6yUwewz|b@6pmX3brIE$sWVsgO8_PCZ1YRgd8=| zR0-Lz@Rh!yQ}i%RotiYsgJqLYQV(}%P>~C1I`LT2h40;m)Kgjs!I&0pqT{(mZK$qM z+Im%TEaM1ouMH-{PeZ7bc7Mt-VO?eY#*0>b;yMBoEzOw2yDcN8^47weSp1v)FjbRz zA=-zQ{LYJbn~-f36UNbx=di3eV>asXQ~?6OU9xpavHgi{!m!Lh;1DeZ*pz^vB-=jj zB2$zyILr*177|94lI7ym7WrOix=n2DDW`bI2EJZkqT#hq_1p+FD~p_Wr#Aqhg8uv3 z?3QJALb-oBnuCc&v`1aw+LqjHZDx!K`+8DxvFFVD_jQ_&rFq5g2A*fW_TRhonG+s? z+0H;;XwounOxj6ORbiLKW5HxOg%AmMOm%Fg>{x2{ z(E08cw{-Dmm7f@sG?Kl(#(ki7l+Mm|&g)yzN=#EJ3IIr@1jdZTM{}*?$KtYKg^1it z09c&vi5R!*9QkMZE>`fob0Kq+Nw@r64#?8KskG)ta1HMV@SWZ z`+xfp74(RR_=T98^TQ2SFPF7}Ty5hn@h-;cw1CtG&~taRQa`{+=U*e>qC+v^q?8^I z%=s0ZlUMEyQR#?{b$=P_{-%>$>1anuzOZ!0BoEL%A}DlVK}LM0?Ed;ZS30Bi`B`Wu z$z*^G%Rw<@QRZYHY<`VAbuQ5A~jiFFgx6qYg`I1SWx(8-VM>wr5i zubXbh!L?2xT)v;PG0I8w5RP#*^vUc`{~8Ya`G8ns3*sB-i4lX(R+KE`mK^gm^PEnq z9R%xT@Y6$clw8meUR$;spe$8DrK;Ah?9 zpeRS=?J679of-sg3{wXYeS8{keiTvgVa*C30+VyrXF^q{Ronh_HuqW0SQkDKR^F*E z@s8*P(SgzcXYDFK8{?DsQ?l_jJUV3Mr;_|e86gweBZ%Z>04SEi)v$EU8Uf>dyv?5c zB-S>;$6!Aixc9&}@nHTKS5C?g*p;xICl(hf2ob^MYJi-|GOOa^0)}H#t~pPKjWc*`QcXyXey3`1%a){^w^`DbxSiHNn3}v4 z4BZ{E={H3tL*(J0?Vg!>i}=eSM-I_zltp$N-_A@sO-<1&Kj&q>UVy8Bz~5R>q$fsrQr%?K`=Ib*;y6gSj;Q z<1v<{tP&QaM0<&FbTJOZug2KksWDI%e_JB$z7(Z&8K{?`-7+{R@xgS-&mph$ zlH}8g?LaHvIkh{2F_R%^JR_I)L4|j58kIXw{(Rb>>H_P;wzj-v^lwx)@Qqm)U<ez1x{@zV!=% z_p2oU0AQvt`Jt>Ox`+Ny+5fZVv&ZgT^0~e(;b|q--ig?)`{Ma*GDN8I(4Na9X<&c( z@Z+>w18^=^z%gklr^XIiMRW_zq!HL1b;AQoNWJxVh;V9V|B)AGvM|Y9w5GqB2zCBQ zv%Uu0@5Olsg-yGg;Y3RqJbtTxCF*x`q{Z22+e@S8x3v2t2XnE3OZH$f^z)U`y;y0@8wmn zuslyb-PV`a&pxb=((Hn(M-%LlLs-WM+p^ontQBV$B;iDYM7^OdG|%@d9Md<)yLv8> z&f|J+H_%W*Ji9+QV@gy*PeodkR3Og|*|>Jue(f<7MiKXi#WdwG$fD@Z2griKXeJ~ULWQMx#Gyk?C-cRlyWXq^p}XF$ zO$XW8-C4-i9xZPrmjMW}hZUvnmy1*ep7Tjdg9RTQggdl%;;jitVx6OmvlzA8QJLQl zRvq}A`@Tj&%8;>KEMko%!keZ*!fJ4eG7N>N*5W7aLhlz3q{~p$@}|qM6QsSCx@J$? zGa2KtH&&+&spe#pNqbp+u^nfb0yH#k<(INh}(j@&K>FlT|`4+F7pY`e&p1pXGvPS z#awOSn(V1SN1cGSi9c;y0-z6 zs!RkY{w!C(L+~22C#YVX&%h)i4rxi*O`l%vA#PnCA*6XGxY5B>^-G(;GZtZnl z5h9$NQ0Q|+zdW&5n_mtiK_%|b#Hq{Z;OQ9+PDpl#JvRMu zS!@mZP9j}>L-xZ#7R`U5fL7NHY}?@#?ptAQj%KM&+9H}=p>Ao>32olz z9W_k1L42Z+73tjFI&rc0I`*2vD}@~4=&I7wEjJwnV-srGvL}@5Xvtn z1?C0%W1vQF9#%Nx$IIa86MMH}E)ZdK-frM?4nb;BW4pQ^5!yXYu2Jp5V&?R`D(Jt! z9fniTs8nEmj8Cy0D%6Z zzvox5v$FnYlMR6Jk8S=MU%|x8Oh^aZKOq2^OAXxfKl*Gq{c-nu?s{UU}M*zqF zY~Sl{{k3%b4Z$asgDH;qN$|*yCn>JvLiQy=rHilWk#OQ}ge?_!Oe*X5hZ_c=L?q~; zLi~A_vl+4CV4wyqIzO!&#@)z%VfxS$!?7f)IF>X{_ku-{V>?WLo zR#oLVgYRgtiDW>R8fwtM(KpNVgaNKN{YYqx}LRm&S|YT@CNNOa^aledn} z%*X>5_P5cw(zE(NC*F<${WGe~-=Eye&fO+M%D=a@eK5+24^@!OZfU6Vn77~6|3J5# zbi%AlH!aG;Mom^>nHIovt-^%mk#|IQ?5hH@QSH7F#|{;Zee-b&g>D`Dqi{@{7SmVG z%W&MYo?t%~TrzcMQPCdCEP)Q^3_-_|6MLfsYwXH?v5$%|!8wdDqCP9{sord{4~rcK zo6x%NIyChe6Ip)rwr|JMS3bY|*7}ip6I zsG|0k=T!-MA_$EajSVa=Zq)klE*t>WG%s!ZsRGwRHmM!g;t3a2>_A)Vr|AF9?HBx174jMM9VoK6ZQ&l5V>HVhY*x3!ysZ^5C_BwBuN|L$m9dP_ZTC7`hWs6XNb*v z@>1<{pLnk?0B3r8dewL~Z!kAi^e9qV!xG1YmsEB~F)#9!1<3k%gYv+~yHXjLw}p%0 zB*2O~nSx-vLZ9xHK1`pOLtwmLW;Y*VF3K;-P~)bQ;gEBYarPsmV3>m^hQZiu#o*l5)OK1J3D2tg=VH>n`;Uk#5(;{s_li7C6Jn9_aS{d zadFOoTB>VqHh1)z=f*&*l0xlGzFIZa8xABrRn0wX%C=4+IgL@wJi%eR1UP)0T6hVr z55zLO3wsD&XHWBv57eTJ0%Ct}6wKQs+yj_IKm2G2dX&lUk5`OW{$pL~ySkp4P?$9d zfjNF*I~!w>n#I*K+7Bq>GbQ7w6E{bpLh>XY!(Jg)ytB6pOHrg~w9`IY98hZt;x@ac7WaxjpVD<)0{z&$0xxepg>J9h|m zzs&S;v6BI_UA@*u5W{qj>Mofl5(Z>h)Zx^VNK8p9I^tA&=2HK%?zS#U9e6Tvm9Ig* zhZlxUB=Z91$fnJ)sb_Fm>e*)}N91$rR#DQiwT9l1P~3Xa48@7@@>gDq?K@|e(1~2e z7q6dhO&Y(IkreWvK7D&|1)FAHFgS?rbj_P^G$@ z_hJM=fC7~&_~k{4q_b_NhB`bh%5L!BWr-`hpk+UWXQsx^>PMreTgPW_;4% z3NBXBD7SCC0$vlb7iV2h9D^1%g3&S*W}9eGdLaFP)^3L8toGBKMjVyS6i7=BHP`6! z))NbRmp@z$Ey1!QvO_bo4dRzRXZLx}f-Q{0Xh z`$T(&g)%ph_QU)8t%PTo-PCcn;F}qk=eAatJ(_KI49Ag`bL#|ec9K)&?mjksFlMPI zINveYGv5~6&FJiAvhcU!gb;TONY-0;dCayv)v!M6wF^H@fXR`!=Cj;mnE&p(%*fCs zA4?cjKf~g4RjX2)8P~-x;d~1eczdw5{7eU24Lnq0=EHq-u7fFMGe8CeD7~6AF&X%X zzln}Jjy^gJ>K7#z+g4gLh`;gLUbqeFTZF&_JVJWQbKY;Ge~s&XJ+r52z1YaV#k+n? zOS|vmLid?@OwGDx8~XV0JhP|rTjAMbARWt(v?*Fc#JlH=1*2tuBZ9YvN?|Fl=mk4D zEGhMafs!1FUkt=>B|bZ=&D{@#)|XSgF$pb<<}1qTORVUOrYWi>6lahnsUi#Rom*2j zibI6{`Zg-}zS8a`Q~CjMYby6HpSr(EJ3*u6h4GYikTolIgo54L2!f$<1M!A*$K#hx zylO+>khEPkl`j8d08I;*e{}`9^ZEMyk!YW>E(ha#w7Y;BYi=gN1ftUU=w_8s7QLm-KvtBm@g1miw|Rgtkiw(32P@cgCG5ZOB#OAsMd_YQFe z8X`V&A4dMPV-_NQ3u>qT&@XGHIXLS~$=>PFK%#svN8=gelWDz6pI{NrvG)TJA_Km9(6$NuB`q4|aB_8u9B>Abm1gWDNqG{($b7C68dLs5| znU0l3VHdWlnmo(J-Mme{6La3~V|R8v^M!Wk5KQYJGt%k&t3gwaaJgXENRD>ZiVb0@NmIyTsq9L_!fyUR2w@@KVxg>J|hYEAJB1c(FEe8tiZKb)|L*#}>dd z2xUa&i6>Ro?;5L`k(|V0(BgbpWVA35t<0(l*0YZ6Xe!p5C1TA0gAb;ZEsO6`I%oKd zvB?~tv8FPHw$RA56#TBhBaC7WS<=3q+;9_1)#q!dI%?01)Oot+7^m3|&uM_FqZ*Dt zD5_*Y;~+R)s2W96PC?X~Nt~|Nmrv;ojHZ3Zw{h#HcMgbNOdA#+yyqK)OGTd1+N)u) zZ)eMQna9DBv_(pmsiASp0czo@Q|i z5){>#fj24$l8|F=#5xT39qcBKW4Kx5RQYpSJ%{YB^x;vB(iMNmnfg^uwiNB2$62!W zDM}|rF;U7IRovO5eh#%Z8M=hiX&EOQg}y@ZOCv|JQ(13*e^lC4wLIs@>t^cNfK7RR*sTi|hu25s^1Zu&pW9>=k;RU9-a}g*kUoCDv}g z!YDXKccX~Dw>A61VO4bTi$B=pcl1qWbKTI*XT_5|_R!Pv%KM>?lrFmB+|X~c8-ckZR)$xs4^0aW z)qJHq_zg%ft;=c?9G0u5iZfNUYd6V#TH1|$Zi11j&RgFWkm~2dnM(O|kbNcKloE$t z9Ol8|_b#@2Idi{Oa#~clD5NE^X>(Nmj8;O!@$8$n($Se+&Ca+R_WxOkj6%(O4#7*G zY}k=dnm>Lg3RVy#L}OkpUpe@wTI{02=M2F&JqcB4O;Ve;YsUD&V@4(*EQG8;v=R`v#KBI__U|)O*#F2JVbIXjBIE#W%n6L$&;@GU z{-ksR0AKpQ@CY(-GX9T9iYYB^dlXJo-`eEgJ0n;kQ%`n}aL_IcOCZIN)dnH+tYo@` zR2j(=J=@Ob*Q7tAlM=D(C17)}>u0WyouALIJnPiwpnr1=ONz4c#O#~!;h%SPi%l%?j;aPDRZ<4Yi&0n5alV5(i8Ii7>JMZebon_?ZOj>5$_kGA zjs7GE>Y`xWkLvqzTwM_~>l;5`g&g?=Xbh~!e~yH%i>Z(rSdb7qG6>lVWj0a~Z6{Mx z62~mndN#y(EI>})TaSW@F%pwvXk+&ImVO~oe61v;6cJ?Tf9Jsz96`hdsy;?bQCi3z zf{Iu4t3<=f>gC?ejjSw68)s2+tjw6#VN;COHq{{#yTvNaJ!@DyH?1K(?X>{&TiR7y zTXw2!R`P4ZlanU(3HuPpc1_sTJBjzTk2)EO;raRAjd6LDGk-!(JU?oq4Zs{s-k!tVxrXupkD%Zg!A^2H4Eqpvr*_NpJMZ3yrKg(G9eVMTygg% z1GTo8Vt-roQZ#EoZUiHbkNc>e=u{9+Q|Hd7j2j@fHR#6>R8#l3W53}YnV~Af@Daal zynY$a=Re=p;#XH$gWGStXMYLu3-;CUGxu)j!Lr9?a~pX3`BB$B`%O>Z=`HmGLw0z; z7m~i3=z%N&u`}M+fK2KV8LHf?tT}%N?uR?&0z6HkpA}Aj{p-C+>&sL7HG>Amad>SA ztG=S;07;GI*H-Z%clNw0D9S!Z!3&T5?03Zo3t|5s?$ux7l-p8#`9;-1n{5)Iegf#B z&@RGjP_^2s_WcfU7zyEkqTb-GspcTBgS4gc(&*|-%spH`ty1Cx?8^&25G}mO6UFv|um`w=g*ybf^=|-tTeC zRlN|-RT5Rx^EPSUOeAfxyQzY3mLWNT-s5BO>UKK8(;V}{#qs%SyNu)(yd+~k6UmO1 z+@i@iJRQz}FZI9f3GC+LvhIMIZ(;i+qpa3*RsIUIOtmfL%>?BkBX+MR|rfh4or`Fv5_h{D(*3|W;Si_m#R5SyCXI(Jt1%25qc zBL0r#XH*-=Q+Wyj#}R4BG?=sRJppK*vpxEKi0zeK1tWTzP~$4&KNg&}(fxvoB}TvX zZoAJ&X}>|;{dyu=e}UAx#2+ZAbIe8%Ri(-VW!kqZA2<9ZL5U4l>MrnAIZrh@GPa}9 zv9s!XO}(ewr!%&Z)IJ#UG=Gm6+6lj?ni%{kjyBdQ>DB}=AX0_JhU3w2q0*dA&BT%I zn<4tm=uS2H598Re70or!*)THJRbDc4N}?gd>LHhpEko(jatqzZ-aBa zxGsI#<+VdfJQ`yockqhPJ`2+`tQ@Xc@0sDtJ42Xp=!aNK@&K93av!~z*VZ6qi)4)A zFH(7$5Ek<)_jiX{exp`oTO@1(IjSYd?L~THaIo+*4U8#_<|Y_jjzp^*#SOjzUm6di z6;s9gL1bn>Sjn*QQN}SC^KE*MhzT})3^DWmN;(PN5po*wP(vmqCKZMhbbw>--ut}A zI-AE!hvo1djjQDMxwBv%>x9)Aig=Qv(RB{3?9Fma=t(XcJ=swL6#SSh)!y_M{pFIN z_HENn2hM2zW1S|!!?Yv$y#c@yQtydx5NN?zs>68v7e~MD*Ol6I^o293!MF^ErYzV=kFnTJ~0nR!qDDMGgrnd z6cfUA^|K5*9`tq%wsO7`ieF_v!WM-Q2rmf|^Vr_LJ!y}6tRcp$m9X>e2ha|tfZoKD zjJA@oT7s%>-Dd--aWM#!M#?q^GNwBFelrplzuC%VP9r;Nm=Gq0_sKO@OO9n-&p=z_ zzD`CpLl_m}xUY4#~R4>m)RWXdOv8qFLtu=)jNj%i7-eqRa0Uq1nzT z?BC27{+uWEFJ=r(jBNC*EQD-8)jV(}z|09GL9zj(q1ow~|HYKyf7j4E14Z;k_AV~= z&d&CB^yZc>7OqD0mi7z|_RcQO4EEMGhDHqkB%=rXUj`7cvM~Q;QUc5lGc~k@gZ9W? z!nFqGU0r`SzayymCS^u@a>cb-TyAE=DYsR>QR0||V9BqrC~0Jzz$!VW%JqJ^rON~V zScE?^J;;*m*$bj^4imM->&xer(17|IO^4Jnu}@z)+(a3_>*>1E#Pe?NexwkC!d|qW zQ(E=r`sM@-qK$P|vIZ-RypVO`=3pPL*XL0BW|#*|}rwL+O|^9hCyc0Xc{3dJ*#MvYXb zPG+HQqV|m#l8hN72`dn*7?Lrw8-~_i@P0vBdI%Lh^mF9NP=X9@dD0HOCw*ev?Kg6% zX3G1{5Y=Is#}2xh)k7ZZ3nwW@wJUfh9?&WRx^mD3uHmS`VabVar6X2O-C1-cP7OLT zjbk^^-DImTmK7A0&#?H{8z6i=$r#-z1ZioNRPqQC`938xYwPt4ym8!E>bR#p1TU=UD4_2ryDm8d;71<+fyOBy_3=K_3( zCqljvP*^+fjRhwtF&2N5OBc_o>RM)=P*yo8;pr6C)B&l!F>+G3Yk?u1aI(f(R;H(` zSI|<&u|Z41gV)rAT;-6uleXzkU3}0>Q=@^l!{7+oeX5rw{awlUIJGEa#(l1o6y-Fo zT1+UNecVsa*7$oa{)VM#o4zyDlPtL1@;PHcL*Tge$va@d=2&_9q7m#J1V(2c_tu*G ze)*Tpmj%aNf4$F~zUk|DvuZ%YM!>sSn1NzR-&?E39Xl!LZhOB^Dg(+Bx3<>!K`@>z z9ivs3FytU6_$N+j(5UpNWO;*bG%E<-Yo7f`eC{dKX~zJPi3{&W0lM|)kEO&>IG6hD zt@y49a*Xghw|A(I>0gd-FK&@M>`C{~SW0$S#4ixpdoZ6;+=D?b_Q~YjKOtLB2U{ep zBKyyRwVdI~e0FaTS>2p=Jihb(PL&e@QHS;GLb-Q4g2-hRDne&=bTv zLFW*}DXb(UG!pTbqmj6Sl+beK z1m*{q*+^%aiTOoX-frNSyx4@3LiQyn-cb z%0`RK$v^AlAc;E(E|b0>eDdxXaB#cHq1NFWneUTL#Gq!)fbOCaBhHlJXy!sNlscUV zhGSU&!Of^A3aW$BaT_k89rem7b&Ia}gX`FeN86T_CX#P(n?d0w+<@EfIAR)&HG;r@ zf4&JsBxb>XKg@ti!l<-l>C5tOrrt{-BU%V zfidS)<+Fayja{;%`fRz?7v0j~l%g$2zFYRD_fL;n8}CJomZIqE=r)(GYGK30n`+7B z3e6{NR2Egnfg@K{LR-`OsYq^Et8Ptg6xTQtf*NIF$Qc`Ua`A)GGhQ$eK^**3) zLGg~XOD~Jw%KKL*4OUJiTJ+Mo;Z{Y}2YC*gl@?e~Ri<@Kdj;oev_EBYbVZU2;k_R@OTq6JnPux2BIucEU3*q~Xixf^J zb&Nr&E~{gDaDrh9OKGlb<_>t5=#C&64|4!OEjGt%0M}C4KDkClfZgiXnxhyXLBUX^ z_`$s1rs<$uSe3>lP{VTxcLQ%O!z9Em2kP-4t>BC*#WgYYBi=p6#i8S}&vRFa^|EL& zls+s@W5<8zXkL^o*X{c)5ros)EScx@&q;1K`kQ2|wbt85m}3id^Tv(A&+uljMu(jU zDM-A?RB%Zp_CyXvmyB}eg&eUcEUmUq2`9cy4}2b19RsGLP=mm`TjvUAmN=|EXpvDn zuzH(?=vcQ<{XJ1Lay6xFz%Pf$LP za!%t;Y@9zE@Nsn3L#c$C2%+KjruuZ9ga^+$pq)im?k2!099?E!J$P05=ogXTvo6qS zz6K$nsP|tvH#dA&o4fGUtoHV`hiIv(ltmp|?3kcbZ}!hb7}|5kU|LgL@ADwS&BCad zrL~4=(1C>u<_4`iWwMKwRb`HSZ$z9b>P3lQ1;bL)Ch!^&yg*!{14$Sw=4EE6ofXF= zF-Y_xK&@mDW%13&@noxv!VTkC0;d>7En@HpoAv#OlG zUGliI*v%^HRNa>sKQj=9+>{`bgv&n{pKE~B)hA!8<>TGP)0O)>F%2uHwr;Q8Efdy2 zW8lxuSjZOTABo*-I)|=^t87LNf!lI#Ofnf%i?_&M>Z-;I8Y`E!psq&65USy-rzfH= z#sZBdD`B}zmAfo1W;tCoNZ+&6apOwiNP5wGd<6bOa02=>N!No=cb?_TT_gd%?%1F4W(<40aP?UHf`I_Q%aF!_po0j$`&3-)9CW6_m0sSc4 zaAZI!RvG-Qtihnn=NTs%q`O~Cpz5NKpakEq z(rLrN>Cto5k($)en~?ISZR&nC!)--YVYz+v(x^`I1d-#X3(Ghz*k{Jc@$0vMrNqni z>pw8DeYlPDP}f+F;4#XH)mRDV*@zBAxSpq!IuKD*wXHy;fB1~n<&W4oGw;#Y$EoNs zZ^8KuHbJ!r%~2{y!?7NMh99Mt9H9|9t_h5SLsNWw_`|k>YM8L_0FnV7{L9K&9r{8Ci&%rjyEM!U2=y4tAqseykh0qN0R&cAXAiF8Os(m7?7!oHUkI z4NRqGlfu6Aquj#^jh=Zz6?MN}S(RuKc|vr8GB2mk_N$$=SwlQiEJ)6#=i2`E7-?C8 zMHm#fb(Gme6zIt^C3-~Am%`_&PR8hCpH)}#x}-(~fh8p4eIYEDY%d4Q1T>-2Dn_6; zux_8?ktoewx|mVq_j5B$tqWMYD&=_I{DG^gPgtUvPxV&zFZ>xp!&2jvKolmxGx$xJ z2T(o%BMK$Ofh0s+ojabS=**okvL9^mY2t;plYa{btC@1*XV|qtmgQa6g7G(1cXL^M z1c0j_=(_gLcl-ThgGRmlANz6Qe!fq)c?qI$mF$g`z7zE3@*6&?6eixxYY8PnAuDES z0FubB(i@|me$ZpD%dw|ZL&KbEKQzb?maxMq{8)apAJHRi5qtQLCIrKT+Ysd0t1n1= zx4yPrvYh{h$#d4U8u|;CH=V5z)<6TMlLL+OjjlIfAUudFy>F^`IbaDym|BO4Zn#rV z68<(b0COsPaxWEG_4zipn;%nxXO#SoYLr~(Vy zDPcqVWgtZX4S{HZQAOkn9Ua{1`rh@!J8K8rp4w@M=ccsC7c*&8&i&tUqaCAU!}J8E z1l%abjRqxg}ND$R+n=etll+JBnMh4?UdFte^U}&VC2}Q-Z7W?S+5u%LD$-^VBq-p#H+L*W*%Ost5sBp zs;AEx5CVY58X`ispsi$zNt@3U5s!B+8o7wgRS9b4E8o7>!dy1@zP4lwz78Qc{y+m% z>=4#;*%)E;Of>zdnl?XP@Pbk+d#nRfROA(;TnN6LP&GbN`OaLaDlBMSrjM0l-Fds! z?B!Wr>pZ4R5I?EY7r71X&C8JEp{k0D$DrTG0)ATr_ansPN7sdu{dcj;foUFlH#GR` z*Hn&*s4fN+uSS3h)uE`WnUT0FYRaDC$LA26!T1bhWamj<7knTQ9CpHFTS%51@p(*O zEt5jr&psbo{a%SPIE#v)dAfg$fT4lD)&57$>Bk6ZXP`#N?TgT6Pd<|Jt5a%4SWQl< zYDH-QG81Cf#SCVB4V0D(@{;fxUx5d^cH5(o`ED~ez^uzbYzdkd^~^2V$8DK&9NCY{ zL_|Cz3)Oi3-Hs~ZBo{T8dF5laA^&6J3J2*o)`Ic$bxZ}&mAhhm#5uB!f#oFd=#Lmg zJ6gA(GsSX%@+;tmLo=dI&QKP=N?GGxJFFHgkOr>LTR(}vIsr!S+n#|XMQ)!Jb zE~lISW+FW07@B70kyz?zRgcj*n(>>5e%IF zf&TfcK}<%GL}1!JdE?|4HNTepIxYh?`sGih4*46@$|xZBwx5b>?4EG=HLL857P)Y1 zPDdhnS5Ekqp=g|li-_CFl}y*YmszwGr<(9!Elv6+<%(aW`L(3{BJ zodLpNQ>2Wk-Se~@Gsf4$qqU@WXoaA)TK{{4B4b3#bw4#QE*I%l;T{B|la?lgJ|4iU z>L=X}k@ol{&kdZJSAx{#jFErSJo=9T48T4S6L6i0nVyxEkd=jvo*DQ60MK*(zXUMY z7`vMq(c9P?)0^A7F*v&z+L;(SnK(08I@<$SIO&-G`ozl6nBKz0*5;pENq{L2~{D?1}SBlBO!{{Ijc;qLBE4;&f2vBh7;1x$}%aB#9Wai()Nb#k*b zHvMDREKC4^ts#S@or$T(zZvtN9gKfh-~KN=0tKKZSVg#3c(-8`P(`F{rmavk^G@S{u_nhpRU9I zu8rmdLI?h?jb>&70vP_z_G1TP|Nc%OU}fk0Z*4R)0QlBluEt*p1nmEV?I&Xjq#)Xv z69RSD|AqNuW&g8I8u)1-=Z}dI2qj=-Bm^GjABEC@e?}Yv>Er)5tG_@l#6R|Di=&T9F62ILQnSY(h z5XtBkfF^BgOBEFSzISd50%!h+X6_yb9j<^~W;IQ@M~dhXg(_TJf5M}(5uVlMr9ogM zt6|Q7+l6I*3o^*9BA?AW7|D=*!Jy=xXBp;1+8kn&v?4;{5yABks@Bn#8k!fQtD#CP zXh}wm@WbGf(us{+B?Ygf5LKGtI+=#040vubLD2K((@s4#99Ak$^7JYUvJA@dFP2g_ z&=rTBjBa_0wu8floYUMKDX}&D>#@_A{Q@LTI$yZAQvuM`ycab3S^Ku0=*r68Z?pg* zj483U0!?ukr90_WqgEXecFnA(-!*)%QwM;1x%l%pu96m`il{BMVEVhQql=EPQtHY9 zf!mFeMpVXh=Y^OG-wSD#!Wo635Blr3ERk~mqFR#YFE_jk+yDBG{RgA+Z@<@nFKcH4 zF#nHs`jn=&{RRNlmwo4VuXuSlX96*qqy1SOIv&8ry75>3Y7p^6Y`vNk9e2Rvnfo*m z)mW-2MfsO10o{bRQRm+tKUaQ|?je0J2{nY1U1ed9Eg!nvtk9^*Qq@ z{jMiN0pfs!Lc5?NpkBc$&+PUN=3vinVzbtpX(LIuuVr7FB>x%ax7iB6JOzJWq@N6h z{!C;`UWO|@erC^C{*Md*{m!`*TAe)f~1?SH?#`#)nY4@8kBt8 z1fIxH6ni!-yL$z+`m88ac{(f`{Fv6 z3mt}t%GWbAu$J)>M>Wro;G1|ls~|N4sHSxtp4!AB*{j^k`gNyKx-!

JF#K@*R>p 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 z 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 z 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

;$(ISYrsiXW9CYpokzQ^pnxySgt5&=j{yK^ zPJ>^#TE?i*01{Ma$-8+6IBOJvu3VD9XiqRWUTT?&O^56AQ5@N1+~s&^L5VgCkWx;1 zuk~a11khcFke=VD+TLxf#n@H8{(RdN$lR#{>^enP%u3SSGV&>)jEVk$iK2YP1Y2xH z;vdFniuD{=(%B5Ju`X?ulbA*DqYydws`51AtqP|MY(x-ZdTAKn^Phm93(+V%fi5|9mWjauU6FQ@GG7MR+V5_hlLHfG9O}d1FMHBj#rg3 z&$(YP>8f~b^kCuNPcGoVJD+_UH)<7CofLm2?W9W8DSH$at3U9ezxa0UNNC>vG;kb2 z92(JTFNZ9Gnj%jO?2wwd%@P%aqOOP|3c_tgGms5<_U(&3CZQrn?U9aXSg}9}ss}^- z(q#C^3d1QZSumv99;^AoN@e-p+&mUm>pomBOfo`(rLeREVI)4SXWoTa)_U2xZ}3~- z(||;m@Au?kUbTeigxt~nJ(m#VraU8P69d;S6@^}YVOsfm>HXzu=>wMBeFl#YRN?jd zK4%MxufzPw7*RegA-PFkI;PJF?LXm@^wUUKsw6$NmeVi?XGb4C3D|7$95AlNw%JdL zj(57ouFCKIE_LnSmLYD8>cHm3w{x3ja?Xf&&p$Vj>uwU$u9QM998yA| z>x$Ao<#@n`y8@fFd$e&XVw{w}Q(Ipa*>4|*Kvj_QJcL1+ljS+IC%wE&yh%V+mL+4t z9g=z=>u(ut+I;FkhH;df#S}XYEhe3c&3xU}U0zMBX7N?z^B8%Ob5$Gvr6J(Sc6)Ys z6^6i4R!Ka%pJ5<~LON1Cg$|jdg1|e7>H9<{JwN3gR%5+4PCClNQ+%#~^WhoX5z6%yA+2c&sw(QncJ5Ya)v9~; z3|_~zLl;kjlfI93WYOh5TE9UPukGp+)c2}E8q$Zj#>sB>`l!QKEr}dg&=8vMN!Npc zu{FZ;X9&!{px5JOF`PX+(9%S+ejGuHFd`c$BHIY7@4+qn_N}Hmr5)8?^Z{8aP~-D~ z1LO^CS38LBCr01$K_3s%cQ=>fKAY@Qf>*mnYduT`1bHq|lZ!vgYAAas@NJa|%_%Hw z^M~XOsHj~{j98F}a*0;Na%^NI#afGFwTZ|m zs(c4%vp?0*E6?pdi+NfGNtCqOj44>#aRzhg1s#!kp1ZBoG_)TxJm1j z%Dsb0k5=2&3S9u7SuNDi=>s+j>KtL^*D;*Aph7lnhL+~xtz=l4mT*j@wNM)le1_#o00_F@l|+Xh-aY>%}$65_Cl*J8*QSC zGdc?;SBb0GW2B{W8=LX1B$gY%y`?d&?HXyn&F&9LYf7Ta&DP2{XYcyX{62}Tq)rFN z+7^epwgHT5WUOlW(4(~gV+puJ7GGhMgLSsqbi2v^Gp;p`IQXR(9(g9Ht#hek*5>Rn z9WOoPadhhTdt1ND^M+Qx##+cx>?|H=6gp$JrRB9XeJ8dXb@TLI61?V!XuH?+eyp=} zuxT4%%-)+)>+*&lks~Q?s)Wn9Hh2{FwligV?4P#T+>XGv_gV(}$@hr@MRKZbkb=o= z;CBPvh+f8RijOcG8}I9`pv<=NpT4#Xu8)IWF)E=>zT12DS_S^@_3}5cccQwUM++JwfaFUq){b?`}48$=ijYQG5Bk37xz#s%KkYD6GO zY|7-d#IOOqQ6D>h7|m$9Nb9p6lS3_dTCM6!#YDQSGpJ*SVgSQmc>mu|<+A`Y zNB{j)KI{J?1;EI`LdU>P0AK~yY2+aIgNL&LNBzr&|Kq64f4Cd}O$z{60P;Tp>i@x4 z;Gqv7gMp2X?Jvdw6A*?1&;kB%8UDvQk^jxj|8c;7=5_q*^6pw zKj`>B!1?e(+}kh1zCwuWkjE&H$54Nl-Sd_wU2{Y}v+lgPbTdu0bCif^?r`$Qyowmc zx|o=v@#8|g;l;&Q5WLPc;?7SG1wNU%>fqqN9h0;J3t+FGUeD@v?P3`PkNvtk2UgJL z&8VHA>f1?*k2KHB_66y(`>?5ZV`DIVnDTQvY_^Mw^IbLmUA=k=EWv%uum>!uoog!c zsfav4iit}3C@vj6I_64=h@UO5Bvg)A!}YT!g)Q`WbYAfKgybGzC_?qUu9-X;>0ocI z9wx?GRC0O++c$a=p=IwuQ4l2pqaSi^J?cj~rY3p624K8?{#K7Qx;3EGH4&c3;FrQE zcsGPcvQrQ@C6s3Dq2 z$-^Km1tftOeCFwy_lG2~PAG;mNZG^fUeYb3jdq77-n+B*uFlBws_)TbY}07O)c0R; zJsLyK=p6g}kRI7jd3<-`yKIiNiBhay)(V9o_BarVw~b2f;p=_Cb3B7-6eZHmS%W1q z9xSgMpxoEwYJPXQxf!%&cQ56~5!fuKeP2aPN@`fCt2!ZQp-k6hNlyNTZq=rFm(?iEG zW#-13rV9*)hV1yp@?jU|gk0&KTS4bNr!@DXp zQy3grXSn>z2;z`fI*qVK7wT$qoMy-$*^4u0SH)02Ydl?%b}F-E6v=vKKg zr7a9gxydI$kz*)J zgDRD0B`>W4t#t9XRMol)DA$Nm@z7^E%e28$4BBRtZSNA-oC7=fRB5{Dp2O6%Dx@*) zKr~^tt9`N4fJi{dY(ry-$5_fl1-P1y2H^VrgT5cx+AGFi|wy2Qx&Nq1fQvY zDu{W=KHNxk1B(9HsG*hPxnYcSjtUi50@(?1t=m+^zjq7p3q?TIz+~89t*yR2sW^ zC^d<9UXL`!-(6aDPJaA3Qde01XQgyVx z%+3Drn^CO_6rxAuIDx9$hMzb4us4I#yhW%*zBvwR9UF|qJ9Ep;A3863Ay>>^mR0D@&|dc zzA{gbf-Mi_=Wcwc`6~8BxHrF$bD0DU z0XC{(3|TEwLd&jft5ISLJykB)r$JBiFx0s&julV)ugy+c#>~QKnTkXLXWgg7r~zWm`|xxSv6!L~x^| zcrr~X->~(ooT6EbgNyA+jxNYE;c_p?&J{*&8h5u916% zHTvll?Gt&H*+9>0FV&Liwujd~Py^$GP<4m^2HC8gJf8YZkrB_a?2gtjN@VkGwKT3B zRMF67E)=ISQMT53CW=c^yIp8w?GU90!wt;sNr**!ju1K64k`J9A$vMsE)i{&0C<|* z7-x0Kf|okPj`VydHn_|^JeO@CgNGtliM~m6KB$ayih4^zkOF@9;kXU2396^Oefs?S zc94}!HP<-L7yf059J-FZvrwzS&<({2#rI#lB6wQ z)q$Q?2x-P=JnQe`h5dc}OqGWj<+ikL2aDQuZ+%B;Js!Y~KQRzT#eC=PVvulLTY0Ds zlSQ4r_g3&5l6rLn&cMq;KaBUj6MqVS8x7H1KkSLx=23GG93ekNe5*rsg#w?=b8Z;o zjVap5@s<8Y+yMB}@lJUdl=veg+u89N582H10BY3=+)F#8|1N@E#pv?&o$+}Y`7p8B z1S?#t+~*A}f6QMdJd4QTW$mMBx#j(I(wKSH({A(ZD82yw`Q2Xv$wI_5Y0EJKmG$MT zR(lYBzuCe$|5Oh40rF`WC@)!(no|gr$KBy+_{7~T)`NV)DDqB=!PGBr)RuT5b_Bs- zWRnz>x|H|T*^0vt`(*pxfARSJ&pg^MmRgFMPyFDONGT?#r<0X?f6pLIN>C=j$d!|$m??yjag?Cw7z-w$ zlB25%xOnx+(N38$b+quccszT(JLo4#f2VJCck;Y})qH)sJ9yDuN;#QOq|9(kPczGK zlJq)J>JwlkQi9x0|2~Rc@QsF;dDK`^J?9|sBp8raQ2OvY!Yoi(8VgYMjRv(3i8bSr zc$`bwz~>KRa!g(T(?>xWRpgvxMJl8I!0^F9P-9JD(Ex}%Hf)Z!GSQ{v;%kq~K}#~9 zD~#xj^f_K;N$%MHyZnqG~CqtOrv zIsg6^=j~U|l}H1YFC9uaCh1~(+(DkCaH;;@gk^(ICspOEDY0aH$3jgG+2fH8941-N z%k&5gu=XSMkM&Uca8Thf)aq4D0$RRD z;Y{5`tCT!t6D7V_GgGR2ilFW3@3hMsT$XcRQ!(9Ex^G-QYSC7%_zL(AFL{PzT5*__rX+UCaVVdfNjOP>tHCEP`!){jcLN@ulfJLGv!n-!gCA!U z3)Bhww9Sw`376BxF}7sU19#LjMfwRfIzgzNj;&SSFU2Qsx2LI2QH}c0uq88u5(j+x zy{bA~*bob`r4Eu7NfWXV`Y|t!HQh2hu#!{9V?yFB+^Fj?w#nJ5oh9NH;iDhhy`JX^ z%R+E_#4e@!^Go+4+{p;?cLe;%xQ3V-wNk$Wa6UNHC-nBeQ*S)pDR;hPf<=p$1GbD{ z4Y^4S?nldr!p+UfL5v7Rp+Gf-8tqs@ ze^j>uFVK9|%}8?_=m(groBtBUmP+|UjK|f_E1i{7wx)v2{RJdDGa2RsGaFU_P7MNh z3r-spyXY&NBndHaJQ!`XDV(-FYun7_nY(G}UB4~Dh1|9X8+T#dqzLVt9b;l#JTrI1 z*9Aoa63|{DW4@X7D_N`CejxCvSpX!OIZTu2ShHNFQk4g+tzhA&O^k7|c_=x(2To$y zj%i1LNjEig`UQXbGcVDen9k{HyOFEy0eosM3Ngh6{SvdPpaI=Pkvfr*lUelG)al%4 zZ*pK{Y2CQfA5DX4hE0T&vFp*Fw~O2?n%vi9KGS^@o%%yLqyt?cH7kIz5xy{2i4tqy zzCjz~myb??qmSX9PVfrb%f!$@CSnpMgFfn>ry`CHTK^dpV}jUWV(=?}6?jU;^dGjg z9?&Uj7K$3QJXf&$N9n;WAiPrzW{fg@h%zu^bPq@Sn*h@+V}zpmDD&LhDe`;*UK=>1 z{Z+jigzY^uQ~>2GU_Sdi)i44Yw#a7R^?^*Npk{dI10%N39$orj1OX`LLuyhYk-NN} z3s&fC{)O+KQ88Vx{bLNJs>hesD?3-hk`EuepkO}u=iDvriB^J909%ie5QF~WT zKtON}Y1K>Me?!{)o`PDf#*a1fCiCU~4qDdlbb1lg>Jn!)SIdk9j;?{`Ze5nH4?!!J zUN(#tRpW5RIrF@@O1E-UAv!yDWgQenHF;e^cOC-z3RLggj4*9}sJkr)*jnv`@RH^N z6X<}oyu=-=jpH!*K%c9Xx5&NZf_lK(b3uQgV!X+8M<>7`XZv&;76@Y2_SI`YybhrS z0SKM+_7-8}S@Nmdn!(n>zS67v%DF=YqVDU>yEE@E_aoQi7WJYlssa+l6KOtZ;`u3h zrxeBTx`k<1skR;p4In7%l5%19uhrASjm88rbBzV*XNd3g`Jo^wh~+9dOAW;B!yTqh z6CG5RbG(={eo^K1+(^ctSfW3Ack5Cc8g?_6rXe)C9ceP+AdQ*{A_$CD(vcofT?AlI zO{CtV(HRW*W)&O|29#5Sm)`qfxZc=Wu_3~hvbG|$+Nprx(%3BSjj)I}bvh|XIJB>pv zg|l)XRrJV>LjRZ_%;*p+7;-@WZ|31eUVbtnjj-udr=@0>kpur+#XLAv{nskZ##86@ z{)O_qgs@avT*m5bjvuTsus1u>q~1?l>W>4jKCj!tk+}|DF%rl>hg9 z2x<-fnGX=&V0Rqg6PGVP_uKD(-EUiOSX0cRiv*oH@5|z#Cs|yd_leMQO43qUklQZ^ z1RmKF4Em~nyif^iLdV9AhYBKy9$b#qkQMX<*TOY}!d&rGlR?A2v59WujKQxIo{bN4 zCK}aK;d0y;5KnYHR0H09Y+Yx?%+awu4l$T`6e;uStQ51KfJ~OK`86CP61@gH!Ccxg znT{3>*w>61>kf_P=^+|4qgHgL@?{(+`7x-&`F3(Lu>4C_gnj1U^65fTjE0odse9z7 zy+d>M<&ed0@`Asxj8H?zH{3y)o@qoWa|uO{ALy64Z^uHAUP#f{bw7#75jsfL@-`bohseb;tQxues!!q9UBLjg zR_AP4t=*QmRgmf~Ia!joglt!ED?(tsI$Yp%wNOI$HwY5c&1n)Xj=Awrs!h6jrZ*+W z7;J+(FVm>e(mKP_txX)f?|;=M85U>~1vB}Vu2fI1|9vy%DxNyviPlP;FbSpgVvL?G zj)sJ9|LBOM<0V>t8Xhyp%u>-XQ{#=DCCOPIJ?${Op`}v2(mq{@X<0jJ-|Vk&_ncVo5owyb zX-RL2yV^=J{!@F>S&!HpxO;;h?JBA(A z4L=?p_))1~0opR^NC@|=G_5U@TTgudId{0^^DW}KQlexX(fanG_zgQOB=I}bIRy{{ zpvv$ChcJCREW?|DSJGv{lU&8c#nWq-gY}6@Jwp@1@e#)G(34*l8t4}RPAB)_Eiy&0 zd~xodE4;7+g!F^mgK(ZZ;FC}WqW(i{Ua&U4g`Ol!Zh^C@YPUVVygP2IjCt>1|hnp8*ZAV|hZ9k;mHwK`-m|>8C&fBx3Bx<<$Jnfg_@wfos-LuM+HGtTmWN>QC>znzKk@d<3l~ZjeSDwc9r_8mv(mcYfSu$ z&+&2gzLAao@cq7#PD{hH09vkCg87!dsa?Tl;&Jv%xUbvF+4%RX2X$V6!Ob4U2n|#p=nAZ zp5}(DfAWzTZQT(lH8U&Rn)y9Ni_cN1fBKc(j5_lejnH#U<;mmL?;$aU7Y<3AL8>|m za!18nfM%^Suh>Z*81}DrBY8iLO#U3Z^dYTb09dN%?pBWoCceQ1%>lgh6ODF3Lipp`{{pJYp z_m3fp)_mQAms6LIuADsdBsRwL{cZo{tzgy;!xxV*sD7_1;S`aVB!2HIWM49AXH?7x zLs%<@_Q)%g(S{+Uvy%2x^lay|PEYg|@dJ8gnB!tsP#%zJVnOdOiw&M=^~-)<5(^Ls zd$QMKSAEM?GT|7!@^#1xO03e_N?T@u6p%KUg_mE&FPkmXnqR+Gy8{%K=K4gzggW16 z+O9I$PG2C67C%&I8!1LEN4o=+#X!IuB&#Cp0&Ckpst82%eMq_9xBb)w_hfgKs7o0V zr*$g4e!ar7JX3ke=JFbCXwz26X>b~F1Vu0K4o0N~c2oEQ8~6a`e}U$b?{%_44%g?w zHTGU1X2fd=G;ixAy-%*zI+ir%E`$@eeJL~%weg5^QHc1*sW)V6zwqs~^d5p`;_o?& zE89cJo-Rz5o>Q7(1DG*FlB6ov;|XdY8kV5GM>^iC)ik!2HH*zHpTge0mSQKrISCT{ zB1U_}d29wG6r6d$_)TLJ0<#_Uez8f=55pten3LZ;i6$0ksHx-xMPezhf)Q#cbf`;{ zRiR70Lg)u+Xg(c+p(;N`X=O7i>kk3$LRX*#i3#d0L_F=7oqSkUi-E`QEyR57w&5Dm z=b-ld7K!-F*>|MgPOAKm{&n(R`u4p$fbb-!XpUtLViyJVgzy@vNH_`Z5@D3KWJf4B zapIjarra-t95*6}6Iwo6Z`CCk53r$|M+{1k*o}Q@4E%|H7Dmx z{5N6w#aVL>Uw~xkt1bm+*55(UrUIoAd}Qt&ua#e~7{2+Oq>&t3^y_8icI^&)%G3H0 zvtQ~U>&~}+!fwXQuPOE_kFr2FYmK$JmYvgoWJ#w^Wd}T1Z2RV&Q#N5@aL{-+OP$1Z zI<{BnFl{J<+O}7hFWDfVPL183ZEp`gmIS&*s{fo7=`NnK(tUnfs;;7ov6-joZ)99C zn4M^}1ivZ@YEa>Dp09#K`B{H%jHA1IvPV{S2Z1h)ig0Id?=^fym)f>AfojT`;a1@E zx9bZh;e>ZDCZ7LAU6-BLrj=C&VM{b;MXEBpT$)rJ-SLEBIOKa*HS7~Y1WOOVM9><` z!HhK10A;AYKvi={FT|*^drAY#O3T5QBMU@wd!_xliZ zF>db_#>u1W+Od1AqWdcz#>qW$XM*HXH@DA&E+i*{iauIu9CS8~;LK<$CuS6c+mpk% zKhi~}X9&r+O&APv7_mkeYjxP8n9ao4XS|3ql1qVS!1sQCGy%k`K2<3is#lpwYWU)H z)YO$#_(cWd!8H!%%`so$+|#L8_(lO+Kp*upM+R1QWA>~r98pu#rslM zKQuY@IKC$}u?E-^!Ojw5B6ROe&pzPTRl*GJ23A72{nid$6d>g*tf#II>Qoadaw(8Kdc-d+>0!fSGx(Uy<; z2%Uw2QXYY3DU=M!#tKt^JzG`3mbg4uAc@MNWl|`Wyk%~gdJDG-d?k9ZCdy{aShZp> zixtXje4w7$#=jyZ&EDhX4P-VVEh204pFp}2ng$DPOwTFh%XGKkQ_&&D*W=XN9x##g z2O6R*qn8p9f(kRR^)`YEl9WSV1$_<`Fr^eKfjQ0t5@!Lcv3X?dAAT^K+2DCNIU}f$ z8d&}}-=T8>^G(dN+k(9-JPJeI*EhzV*>#0vu!|GWYSoJZHF6#kriCj_?D}#z5!ix? zRhiM*Fk3LI-b1!PxcC~gy=zd)qriF_grYqDPzE|)!BttPto}3f;j1x%VYq;LG$?nh zf?AmrX;X4d#kXtn)ts?B^tL2!zYaNJT9ule^_KwFtVY25cHpONX~ch)TH?j?`LSzf zKZ)S}rWfb5V9tkJ(CQw&qjQIz;CgDH6uY$M8=M5T9l4zEe}AJ+QrfY2pHx1@o|A1e z7ZN#!vfS1#7g0EDw?F6Srd;Y~oi-i7XaDM=^|tq@XR{OxStc#%I~t}PCvZ($OqnEN z%qr5R-EXVDbfZZXQ~&CoIF1*|DX9wI=HGN-$1~FH$Z$QsQDL#PNNx?hTTG_hr&hKW zZ#mZKM6EIYi?6><73bQ#7*?TJqb=p7z&c>gv=DnDBMBkU?yz@W@lMDu$PsL?b`w74 z!2%T8{`Ag-Bd0;n&+y5;`u$6i*m#1NMp275$6vm-V)74Hvlii&T!Lp%Lz6f>QRqN! zKIus5=5jxc^CofP$|gqsWvLe+6;#&-dF3XgC0js7)A3yX=E9>C###|KK9P$vO%uOg zvg&%sUdj5)Xse;pdeR}WGCIPH<<~{a50R}A3;q+&LQQGn|E%QL{u_7y|59>H?DVu8 zKOlpDD>-I*mj9QQjsJm^WBZ@E`x%*-{%bG8kCZ!P{f|mDU~8N%76AYvzNr-~7Fl`* z4IV3!-ErJHFv)z1rSUi^iQV0GYiEBbal%ttKmzuPiebEP;qD6n^M2`lW0=^BS+Fs} zqCJah10f&Z`*A?^%xq6558wNf*m%&M!j$dx%q+;9h;$wEK9FuY`#z^hD;)px{-31n z)V{>+#l-3y-mKhD%(@%Ci>KT_W_$pnxihmlx+s@nHQ33h@sjA+ zb-KwND!g9db%zC>>VAnJTi@gabGk#+D#!7JP`YdP9scb(EI(A13_51TRV-gs(PQyL zM!KB?h)^7pM;s<$+@BzyGP0ov?6l+K_|CKI!^)%w9o{=3fVR0oAGrxE1>LIJTYa1} z4-O7?Kbwc@#Q@M9#u*O z9Az=SVw4V`My4d!ro-7H*zfSWX^vVEcldLMyKX$^6mZQO>cWPJV#Nxq=m1rSwERaW zfpd0Ha+V^a(QlV1MzRa=P^B;XWXBn?9_#{F{tTpL5?Sd}e(ski99V~+dlOAV*eo!k zoIWF$~7q`*Mn>Esx?9M+KPi!u+T2AV1Yz|)0kteDoOE_g)9VHpD~f5zgzv*f2)}; znglwYTelUdOk@D{J05*%AX*_xze-MFoO+=kYXg?f8#NojlJdUz_Fq+@hc(r_qN zxj`spyBY5ozc35pU8v)qO^48N6H)R*wO!Jl?KeuT`IFjJe^akn3%K6Z!D5)|BC(lD zid1Qjpt4fZU89Tg8daBKn9^FbN5sD znpApGU$f%?!&dc`H2J7pk7pjtK||scAzYrZ_^?gp5N}<{VKgKQHCKP00+aeVZU&ed zP7}dfN%j>TQ7Sd3mb%G{Q_^`j?zJDK?@s&Asgz~8OVfkxfMs=_V6x+D;J$3T| zsmrw0&GD~_br08C9a3%yz0+?^Pm*3JoMx&V*EhJ9)lWd6C8-baO&u?t`#SHyPd$t8 z@(Lde=y51`6cKJPkGchBAR38>G;ADAyHSLjYSd(Hb1f8M{nW(273z*JuEzC8!E7bD zuA7{>B-q6c#xW}v5m*j?8m=AOEbUALnY=$Q2D0HKxgp%&;y+=(9u+LrDA$+`v%bHYK=G$J$Ei~CYgqgE{iJG z{@|j_jpqZE;t&nalzwi z@32h|PQIgwKi%@Sq`{O{{G!;S`bI`GG*Dv+&SeH7g8NHf8^?ZKM7I>;8s;Y_)ihcT zm2R}88e(l&eJNaBGN8(%Y-0IXQz?z(U#rBzn|A}ZQn2x~uelV-Y{w;Nns%)3u18qj zq=SQZE3+QUsLp(iYx08TQ%rsnDDo6%S8+YaN`AxL-|29=R2UdWg1d_~x1R)y&@IBA zHj{?vpy#Z8d5nY8Ebyo5Y-=q<)_@s&umVXpohyT3LdrX0e2hlojb*dEabF^?A`0~W zg2AOqm!+xi;KdJ<_i}iA0v7W3%#HbE3&(s)a$8IOCPubfI_ed_38M6k#|rb}s(S2i zN}@K&kcY0}*=M9BmS=LN5SCP&xOQJ^jaMz8VU_c;(@=dMal)LWw#{^083WX3LX z3eRcgto!Adca!4ZaI=sLqFaOMrEI4KA*nhG=sV4?NTTMAG^$2sg}mWFd=0P?59}d2 zDN@|nnY;jsTjK{R(ay)NoGxT<@OPWm-?w;iwrqTd{bf129669h%sObe z3>yo^b9O=BfpLnY?pF(mc|D7Fike%!mr$H{ZQQU#+_2&EV9-f>`g#5`LovKpG#30c z@7^UZdYpK84e#857Q3|=^j~;h#vrHvpz;2*E&2b{s`~G0-A~<&mg$G!^ly#F^b@Pj z@sDk}{}YY(pPPaIgF~h+XK48Y$NJxRI0+jAGZVUhlfsx7>FNG&Fc|X>Qq9iV&QZzU zz{o_4PQupM#NEXB2M*_IVPv8xCWz1YQ&eR6Y2y6>f&HtVXyNQ6Z{jFqXJc?D;6fhthB~e()@=N)*D+C8L?gZq7d4y4B@{+AJRFTD#4JUjL z9t%OmHr9zB3CtF~c3vo08>H`D87v+dK@0%@_%Y|r@ZsXl`(~k+pA`uwl34_{3_Ngk zH#TnTi9}+{_zL~@Hfy5qvqgnsJMR{DP}25op8wh(coe9aiA3TO?GQwpjQyqCI zWOze)dDHqs5>8gQ+Z!zCo1IFW)AXB;e<~mE*V}yF|F_LjzTTg=n?D$7aqlkNtmVh^ zf1*|Njx04D+p0=XX{0DS`8;nno6avuV71zs@4C7v zrV@J(-Fv$&?Q#T1K4VQ#c@MW{W$mrM_*$?emwhfhfi`ZmaAk~l6gO)9p{Dy@Yx}^c zUG*OMWE6wEPL&&%q?3YXLyV{*Ru@%SwyrkgeV?l`Y1C|4`n?vDd`~8;)pe;k%;(%a ze2>$)=g?j#sOOt#xp11ge{L62yzoKeUO2+ESrVC9@i`>PEP^Gl&+w(S-C9$w|FG zsaJecXf|Q4g7%+7`V%lt#g~Q~$9TkNL&c(&WFU*P*wPHwxv5`oFH}8jPoI3zOR^Ao zddK<`$%hFKu(Qvufx|{U&q(hk$$=DVzKBAAxmiw+inn`4eD!*!Y-t0&yWM1O5~Ve5 z+HL4Jm3X^!R?QgF47}7kAM$YSA8xCYXf8evKf_%EDU9%%$VkpUdpoi8nQMXCe}3DD zB~7s|$uT+EJwxk-@ZR4gS>$s`b<(l{Q=)9W@8V67y{|;erptT%IrZ6a7rJSS^Zc=~ z=$=W-Y4=I}ZbA}U-QW`C6O!=BIC*G!k-{R&*Y1A9f4gGQdw}Zj>XZJ84&K?6^Dc6g zVb_&ekQNHh{?X1hrF+k(=g5Tvd$U0YwCW{wwCpwU@>S0+;FYb#9n`1M>jKAT@J`Yi znU4(jX&Yl%_=(VVqD7iIH97LU`v$@>IVA*<_2}ufMI_g){snh6lF$9n$>V6{%ntSQ zZ^bB$dW`8ucD*1>a0K=%wfE^L(7JW9&U_(%Og=C1sFysqQI51Z$udXb$|xs~UWE_g zfu4JxMLLDVwCRFEeFljFUB0);%7iF}e>Z8^hV7z)D&C_vj(o!%gCx z^M1)Aoi!iFPD4gxW(VTJDoft=?0MYB%VyW#uzEHfQT@`CvF|Agm=%qLdHo67^|Zk2 z#?%l~NWsyqCyG6NePNwtUQpE=`rMHj?}ANZl7+f5S<23dMOH9yVTL2d^fchfaxW$?ewt8vDtete)ymS$&1BPkfz@}p=X@cNpM9 zp#UG|f8O-7VE|gKF@;amW4dQb-N} z05?uH>G3OPa2esYF}UQ*IFXE~O#R6nIUVEr2%4_cO!8|hRUv1>j>$4K;o+Q0NTT4X zRZ+A)&057p-nd(7q;ESh4Stg*UBZ92MT&_#;w;I!{?`){q3yRXJW=?jaB75 ziZ1o7m51x=HKLyaE#@&hEn;}k;J!Th(fw;2k)z_y> zD=+sUMs&7;U>=l_6pc$|@6vX{i=&tFPcEuDZ37|Ieq#e+XC~f{CrYA)o%ikW;pNnh zPGp3GO4;?dgVzvX&6v9>^WmH_#k6E%_71?-wQu@`BdC*U>cixlUN0VAcdqg4=*2_s zs2H98Nb9JW-cx}qKN)PrQScIm_a9Nm9Y8&L$R-Azq#F&2oNYi9P30)FWZE?PbcHEX z?K;K9x=1oWNWt)gKI3rxWJM75%pT~ero4rZg`Zf|Km$KQ9|vP3u`A;?Nn2r8PEWpl z!4~yL?=(P?sqOG~60}e{h}C_i2&PFcbVmsF4BBC-5}RyVMeJHS-xD&&JMLAa>|;~M zz}}O}W#-hxNsk$nIqw3}KdT<$y~oDQwhWi=Ws6&km5NI)j+gja2^eY=T9h#4RQZNL zWCjfhWede5Cbq3T_f?906#DRWP`q}I=jy|e<0Q8fho=$B#SBLv|WRrpj1o&xer7b(zgkidbUrrWmnefyFge9M$TxwItOCxZdLir(vkIaGYQvMSkjK54SE>-L4_jwo?g4(_{+g+#p5zCj-oFpb+?v5XEb-x2f)*z* z8nDp6$5iCoGZyRvQM^bzsk1Xs}HnXa4 z)3;61qT5CSykyC{sqeHn)T@A}u}uT@i_3KJk%cpG7|P83=e65KtZ=n9QH&-{qjmt5 z?m>!()`w$#vzOn-o^<7_2mU&TCEKZ`uw5m!tq$bL46jK$JP6%9Z4R$>SYnB;#pFq@)bFiHq8oI7EY;x8@2(%e&z@b;|=kEMR zAnJ)hxlelKZz_;nZ%rHdw0>iKYk0o?L~id+D?+t!XRrRAX;d@imEpIygWtGStu1rM z*;=~~{@7jcRpxf#Lmix%>tVP_iMXyrxLtw}#*;Ikf_){Uf`f}uOR5a(JMcS4JC)RQ zHS<_gO!7-mOHo#6+kq+5DW}`xEL#a!gqP2-fIZm?Nuqk+Q&hDDds@bF+Kd}_AXRXV z<3o3@FAxZH#5Qs1sOZ30Bow3}7_-75zpcc@0X%+|b@V}!pF;~Uu!g@M8!DH5@(lG0id`DBB1uEZTD%&1@z&&KQUs_9B zx|^gUzN1~zI~dtV-li2X<5$x%V1umMArwTC8$$oKy3a|)>v#I@9*(*erXe;{ae?Qv zte|m;4R806h3#6ImI+o(#KuKEc>5IOoTi(JW91u-HuotI5kbVq4+og%7D;un>~DhQ zT&sD19K2|ish*Q?#*nE?S5Mm~L7%iT-`(=t=GV++%>o2*AR4pP1bN(u7HU$NXxOxV z>wD6Yi7YZ_8A^D5ne>{HiM@p(!e5&K|AeI!S!OOhgu+O=Y$pv&0kPr?pk-O1q5QdW#Q#=RZkCYY2@uD# zg8b*KnRGNO#+wX?Up-BC5fERN4zkE@T|$tMA5$uc+5ci+N_eS0UNp_GGSMwm04Jwl zW99fwbJ4=5fWU>fUlFThQ8^ng4RtdcNVLDrVt*)6OJm`-WZ?%J32Lfwx!inb zE9KFezqk)oB=u(?*no8r^aTu}Ns4>mBtgT$uB6b{ItS}5oh8DV4IFvQNi|A!tl!Ci zJ{XMEy7Z9sZN+y83|GsgkhsD{K|yemDk`62P{~1c_T}jbiO#F_(6La@ykYF<#rqSt z7mesqNO1)-_X6&)pJ}t_HStq+rG~4!=jes!)9zD&r^ppWy@7EE9P}p$q%C0qW`0#U zT^3^u-@9$p-QttL2GCs6*ROMv^9JBKa+OX!6<&W(#2*?8H$6*VeboSe3;pwEJ;hm+Np~JAE6qCLrta^m5Yz>!{!O4nejxlP#YYPdYdXQKrpblcET6O}_xNZ) zEsuKAH$X=nNNi~Cx1gi0VGh5-Egs!Sq2$1h@v$6%j)uDG>3)%R_qYc~eGL!g{p$(q0hRNUeh>C5bU zb{P4tp}1(RzUg1Nk<`j18aK<(wK#C&7SY++vRS#kQ{ghp+}0Rg)?w38^zqWa2jx~y z{{jdGzGXM{lr!-NRYIv*&(=)2C4PvmT%7|%!w)Z=-Jeso3#DmbY0u=dirr z;_S?jyH(xe)&<76CB}MG+(iBc<9wv_NUHV&GUAF&D|H)s$mF2^iCC7Srbd10H7lI& zOYZZOgTw^W^}_X{oCY=fxlZYuSsChrlc$Xq%rO2!fdR|XZA*CB4(McBERB^3H+vGT z-(B>+TvvI2KFysM;f($zLE>x`*BepBR5%Ep1bGru%usZ# z|9HR&;#QaSiTCtv&<=t|ubj3PbrTwo4z}Whm;M5>yc^X+r+10U*gamUH0T83`QQyH z7PK-%c`k#Npl~Pv|Ji9U4*M$Wl=<6ybi^q;Uvp`&ot=^CzFZk^6Z81!^^RT-r&T}~ zzYn_i8_R8%m+p>lxRkD@V)vH%meLY?h=lI~i!37Q2`b0J%Seqo5S>PrJo~}BVT;S< zRSDbV^qjiFDd&xc6Jc!IzAw((&`A>|4}5gg!Kt7nSd+?#JM992^C^kGp88 zEiv*S(dDy51Du`5_*P!#rZ{7<3_vPOH4Z8W4T{yAmYTa^5619cSvCEbRh>TfAr@Nh z8iEq_vOeMf9j~xBJcA(00aP;#6VRA4TzH~L^sVE_nZ^u$enN!d$R4Pe?fM;sCh0Id0Wve<>&Wndst&HGaPXKu zBsl6O8;9cBh3G9l8b=zkS;JPySLV7M{o%k(+{0tHs*>BK8<0Ua_mUHJYT+Edylk5^ zSS{h4Y~RjWg?&q74g`JSanc{}x3U(h2Q?NMtDp0!PMx+pNJH}BOP?|xsud2O;^2Xv z@D1#=pwaLT3zq*(ari&g;(xdlKiv_G3~aPNG*RZC^iFz4d`2dETE>4&t6-%6S7WT= z|3+jm{WRzP7gz<`|I8W4NYBdrUz~xMmH#N@>aO{#kED_!kcGG`*NT&;Wa1(Hi zwRGPM+v_j9e9idf2}S%GEY@Vb^F$28Fs6ELHre&SNuprn!iZ(>V;BfuOd2GrWM+w(q6N5mBomWWt0Uw1<;J_yjT_4=H}+u1 z_-@1f8H>tU}C#dCqkjc4OG7S1Bk zDu=2(55kZeToa$fXj6JM+f)4{bpG`SAZP`gTr6(O-(Wj~ia>fizI4`;)s=n}PAvcF zC)hS@&X7Aka%MP&I^9uAJiIUO_vFyfaZ7XM`^)^iREh1PQ^W9AfIO-rFBr9n{uIwC z&nd+s2_OqiI#>$x5f#P06{ku9+2-wF2DaHUliUBI;G%|9E&qVR)(?m=UMRKEM&2TM z1bJs=3M>&o7Ko@=i@dvzw*0&+SEqJYO}V4z zv++DRtn&Edwc+|&{TrUg|1qyN0v%jd6dn}Qjw44nlfW_~5_!agN;}rtLcpA&3^5v~>iKF0KR#yct8U4Z z_i7*O+#r$`BJV7?{6m?>x{@EWxoV$tjKsvm=9j#7JERx(5tfe%&1`6)c_~0;w4zx7L+Fn0`O;gNZODWfrf1-dm}zTiNILU7_-+~^_e*MY}C zq6$|z0m1gPCanFqj!UxGSKyFa^YU0lN&#Ts`iWq|PMPGjmZ>tbd(*7&5mg~~8=i^M zw5-UriIGd9pYqX*p38~BRjZy2alC18ZViG`dk>`Lg7Pb8T55z`9Wc);W)`bCEHy$oQOEWG8u_KL*E+g1G4lk8obJ?+ z+^y4}U)=#W11$s49D`{{hRO!^ZWoI;NcUAo%+z0m@p z#I##8C+%fV>PyDEUd~Y{7PXMM&xHY1uE{M*xUtX z+lKIjwu$80#P--{4e_k!Ah~gQL@BsUx*|iCN~NZDI;HALNibh^1wuTE{{Qc#%{_Iv|Cj*iM?X~6%7=>l%*Ipsv z0c-jVq608Z3>Mx)+XoAOBnxs@ew%E5v8a}L?H9o;;;_`*ZovlRWz=2MDO0L82fb(s zNMR+?>+lQ_iZ%djC&Nt&4eJ1jtXu`Z!vB&cTqumh)j>z!NOZ^7K+w=3kAQFt ztD;Rpjz@V>kOP~qASR3i4uL7S4+z5^yf$MBla(S2cw-7R(}0Hy$*EeHmLhay=N`kS z#OTB*rLA;kBSGMpXoxY`V=I#oz8RYkyV(xd#1#gujO1LF$L>w`>9eSV&v9HAbk23S z@kQ<$So#M^^WT|){w--(eqdPiKP{yHmNYCJ9JH()|KtYxpGcbjnHz|SfruJ@Kkg;!xVc|mk8bu#QwjI7L@3!g__+4~ z&_KDxjYjt4RT-of_Kq<3biKs`BcV=UXisSy-D+Wf!Z!nMdi%$7;ox-pqIz+0y>=ot z0C2F%g2WhMPcupr?h#(XB=Vw%6@Yp*Z}opE4+%2ip0XPf{!$!n@Pkendf0eH3I)j* z7Sv}Hpsz*-{7HramI9ae@frT9`_c_UN4yNj%V4)7?NNGA1|%LF21L5|Rg4;dCDA{V zpZIIT@RDf<%2CWP@(#qk`@Nneq#H8WEs8`KJsx|Y)9D6}THaDCM<&7({4pY|+i`{Xw!ng!)QBV?si{k20AMn=5nN znlu^nqspBOW1ftf1ZW)6NLxabVH+Pa50%^1N@h=qR4anJdG_DG4CB3!#)~D98oGM; zm3)j)R3v>R8y+SfNw`GV-UecNEG3`A)b$SHrsiHB6bb#}S!eX5M01cf9E#VBz=fhu?uOs(PKuOKo>Jq)y|5`5w+G&KM) zSiy~Y!$(M5cK!4;NU1FPT3eyW;x5`$0<;jp`vQVp>d;{B%~0(G^neR~TC&vq3XLfj z&VJ>bC2baJ#-sb9=_0E*`JVjtf?+#ouT%g!DJq2_{{c}E{2X;1PYN{%DOaa;hT(9 zS@ku;KENz~=-pjoY-&_dH7J?!G>lRjlswk!!0#dffR(XfNo#K~^zQ-4aFXo(sI+$sx>WDErl*Dh2`0?JAX{1>{hokp(L}r#XRHKF42N41Y!*GErlK z(_l=9s<)p(Y9X92GOKdP#TV#r@N@&UCW#seIey*Shhu^_yLa%MYX8WF?Fnb(JN#-M zWxA(>7N*owXE9CpoC)df*+8~ak{~kJ6gf5LadQ4z=jcwXgr_QO${6foV#IjF#gi%z zuCSAe!aEL)CS>Q-3Bo3G*_d_B%tRd7nYqA$`u;$csn&N)6H!B2^~>1N?-(qrM7Y7a z1sFis3|t~t8tHRhf+)DMmM8Eyp5ez$RFgln2W~e)dP}L5*lOb<$C@a5T6HyCk5vbFm4E)9T6x7F>F(wpKyTF znV@H6a|e-+FMs;dKUu!*uX~?lsyf0lYfOz!2n(WM;09*E9BFD1Wh=W3>|&X$<*&p# zk4DLS!xV{K$EQBF_~`PyUYLsw-P${QFm*K-&YjnWA5`aYMJCk6W<%U1wl!mG$F^7kJ+&@sCsz%K< z*PPE1u4e7&&gYdt7%xS#1=MS5BYs}95-Z%&T2giAs4p}&2=ftHz!-^Vu2FSLT7j6h z#8Ji;8C1p&-fEZuIEdRs&cQ|w`L-~S2pWT*S4jLdK?V_v854~a^4+(Nl+%du$d6ZA3(2!2T7zk@`|BD~oN z5A7FVf@^eyi7Z}uYEWPm+v7QP*35Gs`500nxco9Im`qa3=mlyagh6Id!)BAs`$@Ps zB;L>K!`#mPzff!%(FeUJ#CGkBg0!Qte`^Rdcr2F+Y;`A3CsabLEEVnnSO&EZ*~iUl zSW=mK{Z#Cls8sM|I1SuF|0<7U7Uqo!@~ve$sPId&>UK{tZNl`#ia+IhT*s%%-gDtG zXfV;Zp6p~gi$mq{ZD;-BYyR?Qc;~P+pEBco@lCBdB|{={WemXRtg&MsY;#@@x3_p~ zwpIf|w6{>CR(m2*BxJ27m#cqe98xdy1w_ZC7Tr17Wq>hU&PkuE+7bE00Oa|65a}J0 zS_o>QnyRzLWd!!m8Tr+K8lV22AXt!RffxUFrni>Z`Ew0$F1{8>prynQ&vi~;B>m6e ztakm>4zZ zG}_dhi*O!L_|YgTm@!z|H4MC^Yez8 zVUncaJO|#%n;IpN-OqerNe)=*Dp(5oW;QF7DONdoDaunD>(M%o)jOj97OW&%OVS#1 znl%dHKbU*&8AccGN~Rcc0T^6i)5Tk}8)iMe!mTBn>0s)J%|@ZeeV~pVD_+7P)m9ds zntSQgst5*(w`@`-fv6w@AMr`g19qD`aGViDy5mP&!oC49+{>K}PqhNnht_(ElRSL+ z4+NfulOhjOtO<`1eU!uJ!*opM{kG;m@X^BH6$^ZV5l(hIQ>l(JA?r&7QZ1{#SAs3MPlv@Ul@vbepv;Jg2_C8?AjegQu3h?;~3uzd8D+ z&oKxfKEHp>7_L;(U{a~6`dIum;FL~+-q$=&{K3P(?K?e^$mStdspW_*eh7{*qfXF` zX{O~C8$d^9jPtk6{2BJX&`yZO3q-w>a^b4bPC9c3YfF%1_rdd94H#UJdMj~ajknjE z*O?7F;dfSI`RBCuEemfB+KR;44I^U$mi1MPmMpruhVivE(@pZbjrCb=tQYFgLx|sM zZyalPJdZ3QPy)uTu%3-2EV6@5Ea12mxGp#oc?0PHXYW)=47r}Rb(G1MV$31->h(xr zi}zB=y9Y-{&l!H z5K&6>4Nt!>8pFuOPZ>2qvoDqb7Nt{EJ;%rb&zQ?K+;rkqU~0Lmjf0x8%SJh*i%OAY z`Lk@vYRdFhTfw|{nxTe<$n~^AbGwdnk(4P!M9&}(j#yVrg{3#OTrO>ZIx){_zfC@JDA{jJL@Hn=)R zHC5l0;x~54k4uj?%{8r&)dbAUCtt^SUT24$CZ?mENP(KU%fZQ&v0w-Mr)qN_70JU@ zS46(zgb9NFSnRtW*(@#iXS~7%#sO0CoK&(K)!fm>iCd%LVjJnE7Vwkn9E1--7}S(A zt1!_D=zj_g7dm0z@X5h^X8+$q5c~hyqx+wOD2z;u9RGbBS;EqG+-$znW_pMJ)eMj% z-GC=!GFmHH#0!HfXMtN|nZ%MVR6Ap?C7kasYoNWcM3C9SN{Z(gbFQ19E_EHNbi2HG zcqom%zA^TS2(WSo>}!c5Vn6R8l`*m3^}k`12i^aZO+ZZ>8;ib+67;8nJn*k5WjT$y z7f|PlElt~cf9B!1ujAdu#X*59#@LSxsxKd}2Po6Gm)GMP{+XW>W-T*S5aBmdLqHwi zX8_c0bouWNU0js4H+VmU(LhWq;qv#v&rRG7YV5 zG-Ahrl%J+{6<+GKyWMYuMf`y1v#Q#}M4Uk^OPYb%4Ex0a14!M@W7ZfMRl-9<$g}z7 z9&KiVkgw@?ebv6nyO>bO5zuw~vcw#NdpQs1p=901Z6yb5JBzNWhq!LUWs7c1TO4l+ ze2BrMTvYmV`-gRB`UlXwaS&0BVcB*L&oQAZOAbytkkl$70RwazMl6X8Vo&uWF(=~k z7;{;BKjcw&0%de7Qa}9WlWb7?-~)*tv~QJAQ}te-0`Hiu)n)A+hWDF{4>T?N#sO=` zLt~qqs4 zK3wVCRiRO@O)Y?Ks#C2AWJSYp`l|JHEm3%4}=f! zVP{~cW(RmO@})>OX!=`o+uQ$VIRhGVhnhE+P+m^+v%Pct;FCnsTvOo{(c5ZOpQXuS zfZ?o8-lBKK1^ma;jZ=Q;&juFp!IJn15@Rt4s2pTl!4wc{63C8m7ar5@h?hf8+$}HYJx}~_z}G{mGM%X)tEk`Pa`D^sU>E9 z6TqB2240dL+`!j65xckx{4`2?*5j+ttvFx#^Z;m6*PVnLi;j>BH={Qc_T{k9LZnnQ zF8B}jg3>{+Y+tw?9T4POxPB{ybxEq}yqG;8Adjd|F^;JF&!Xzc?2b1V!?SNpG3doU zHUxCAiKe{y7qE1_&dQg3rxTE5qAZ#Oq-@`KhI^FbSJ`!_${q6Jp8NV=FxdkQJ3c8q zP>SfiAnFDUT=aDFMBSrC$1_|4?sgcjo2M&2P@J3(`Svd|_SZQ7B?eu)+f(!a8$N+T zW9aM^d8;l18j&uHM?8-?#j9kX?qhUww5XyaMwD-c(#&~tbXylFf&WVU!`e6E;%~EBVrbr z#&gk_KX!2uAdN1>SpD>Y5CUTMA*6mBN0}GpWy6A{*E2{8lREfb0HR$QHHVb4<<$Z# zx0GPz*&@;V+?7~NCUhYRH18_wp<1dWNFbe3UYphBoF+ZDPw08M9CQVi2?Jg67 zWD&~hE2Z_i`Kn*^Ga?X3XnE}sR+SJ@49-blwllVDZIRN!>+0bAEn0>sZ}QwIKqR$xu87@VP-OV6@zm^d@khW1*j4-U+cYIPY&CV}15hv;AQbUr7p+u}5 zWFD}Pki~Wdauoj&P4Ww?c$@e@9(zT?GoPUNq%IT-g|Z8LrCGK6p-+csyGW?EBsm(- zQGr(o)1Bj(UBzqCCi@Y^TGw7(y|vv$TFX)9s4wchDlW%3N9Px-!jWa)UW9JUPEXnscCTHKm`4E-VphyQLK zlKkMS!6duxdkwHMq9ixQNPG78>P#Q`v`!fX$udXPcUszEZv1!(kS8WMmf7m9`W46v zY{NS>jmb{~E{;am$RaQe^hv8Ie^sAY7r?%~u}660H!5q%z(t!3aX%Sy{}4A;CwIHV)KfbaZ` zjLC6}e=UxOFC0c4OwHUy4@>t866II|LUyGZ*;TU$LJF`onCUpkFd~NRA9)ZCGIc4T zY8;l-i1=8~*aje>##?TLj4_CV1!YEM!iB*>I-FTmtrq#JXv%0Jy0$2)3!pfX<`&&z zNICYE8elp<&if1VK0|K7@}?{}*m9OIXZk#IP89-z8rRv){wyYI!G-lZSMGL!&nD3# z-rjvhU^W-y-EFUm@ocMd!Ign!UB$^grN}_xHZ8h$!wKWnw>I-X<0@Oh*42{1hTTY= zEr+36iQlz12S;L`b^^B^a&wcX;H;TXZl?d-G2@#TC^^bGUGAz652YN4-Vv7dk*X_V zWg8)2&sfUpo7zL8zXsgqC3fG)yyzY3Xj_cjvqC?dFCL7Yw<<7Ni7W1n{g9N4P`z#idZFmA2op>Th1^hdS~!%5Z6;Be`$bAm>B z3s&k*Z4jX^ex?mM^KPLFKnOyvTP4QF->V-EGE2?;wf8~j99i4(8Q6BY@tt@nvs#tf z>YSQq86F1^;C#ZvS+mZ1pxduTh`ZM3y1)ZyoO`MphRwo|`O-W=@7efKHlEy#jb-2tHo(JR=osRGC16u_-XdWjy zP_r6Om-h4wPuPG8O=Q-s;d~1_s~;3tgJq2HXqe_Ka|HfXDAL(YxY|#l->b+RYR2w7 z;9pJw_?+>oHX)%ro1Z#Ac15{k>m-@`^NW*lIutiz^9NU~fxh5m%uRC;(cF@R;XThT-V8S=EF2 zoVkT{5>aY!_$73J@-69PqZOC`;^WlmlT!c}J^4$KxqlkCdlK2lQ zo0afmg+a@IL`I3mq>zB5qO=@q6qz`!Zl6tRyX4I>qvQK~4mz=qjX>4nO7Sna!%ri` zc?*7!VI)v_^9+chFZ{5|J*w$fzJRMN92V}0ucv@c8)WFSiQxg=MfthyXw|?zf(R=~ z;Z`R^DJkFUaVe9yzidiuY`H_yWy$P(gTnA~#^3Dj@D1#=>=ZT}NNX5rM8<=k?_%Sm z%bskN$cL_W&l zXfl83w0k{LVhH>8{2UYAkm3zu2#Y4lxFCEoqwK}F`TQ{>1d&|u%-?5c#Uju4scKpG zFXA$d%B9BXi8cu=6AIAXpCaJnL(2qVN2)mQR7 zU5~U6vKz{^4AEa=YQO`!?O{xIIDmlh4|&wp278^(N_Gk3291y&9`|Ga+0UTmn$Y2& z3$X9^zo|YGZZX&kcb#vg!O}b=4U( z=4XGlF?6ytlJQ~ol&rr^}lXROWh5CAJZ%$Ie#t_ zjJfem`Q%NZ@{V0j3ozaZHdI zZaqF&2jeSlEyDl(qZ76k_fhs4f;s++yhl15ba*U}DRL<=7OPTTNI6TLnX5>`f|Gwm zoKy}`eL$&#D5y}ppOpFUmt1GTt}zzg<7?L0uNzLQS{4zza$~syjgZ5~dCf8cKeB@6 z{nP7KqDVrZG0fwfpBWVt7^)~2m+((g|CCv^oD*Qb^*~@)N@a@Mu&5kZo<&9ndu~vI z30E#Ns{fMYkhqndWPPbTIlnNjTW>I;4&>G_sbW1*n&$75?ff5e^kaWArL}VSB^B!8 z+9(nY6>6rBjL34^J_#}!1OLY8w$NJeNVRpGqWLAg!d|G}KlifY5u!aDX^9aM1cu8r zdL&EykovS5?P3R-D>|M^$drGqV~=Tc0U(S+;9%0b6>_~dz`K{4t#vhez)u9H6*n@# zw}?~si5*G!6K0+K5mR~0VbiO1wOB7H^Q`^IGye57l_cCJ7*@>Y=S3IR04~nluC30|+~i)emp3gAt4j zo{TEOu;Nju7!XogN7D4O;N%8#_yfCTh!F`aPlIcQGNbnUu&5z&>3UUoe`GSM`6z;U z%->Y8@J-#Px8}RFSA}6g*~B|1Av)2@eVw~b$rGLH9x{42nY}ft@iUFd>zDnHNF`9{ zoA;miN14BZ+D3tYPQ>i4i&2VH0tO_v>2(E_Mo6A3DpP(W-$=q$ z)z)KcIo#)9m7p%eJ1_{DxfR#~5o~(0JAsh;9y~8h!l;S7*@QsmR+gr2&Bh0$6Jj@a znxmgQIdX|N(ouMD05wTxlY_-BE_zuHjSCV-Pcm=>Z_a-&;<6&<&}O(|A7uGGXN;Y* zwu{GtGHqRVR|k){qqRVil##3Q7-GwkkF9UZiwq*gce@th5$%c{`%@(&TJ#I{aD#T$FVgO!wU&P~VN0yaOx{!cBMG>f{s8E=Uhp&$|)zN;# zxLPB>kpb$P|2mBzQIUEq(>7|?+4UKBK34IlEYmHuWaN>2j1-dNHm5MHuSl*^+aFTM z9z7-V;Lj0Bos@7Hn<%A*ntD0K;iaS1f52pRfb>aSO$1%oW~>?va*ioBOuecz48x%b zI4x?EjA2(rxL{_+EhfAh@BSjpw{dgb6qZkugSVFZ;PjZ3Jq|f>9Z5}~x@(jMaR;@B z)>?ILD%9ny8n+Rc?zlUOpmwW3VdBd*wZq0W)w~{TvJUgOvvU3RQB>eECSBrN+jU-( z$}DsMzOnV*eti2G@b%Kz^J4Z_jb1hB5X^_lPN)wmhH35%9SimQBb<&cJb# z7NTD)Xju#dww+|NNNY*ek&UN4-Q8h4sYi+7` z>#>mG;u--_6pi9O`T~5b(0!p`4UTP_=XeeavsOJ*gAxmv#Go`_n+w=TTca{Zf7k zOZ-fk3b&L!@w%vydiSDubyYqgKGcLe4?^PFbRmhFw2Ac=+-vFy7*Mr&Z|K|9i%LMw z=v^5o7L=g55KbT5nK4=s-P+OO^bh}iW(Dnag;Rn1EuzMraP{l8-)7E(+H&)dGQ z;|Te`3`;PqXlDpn{4z@%vC#Dk8J=V$_S@9#WQn59`Ca3<)i(APU=g#qS^~gLN{>7q zAiJJBpIe)WJarGY*TS51>VH%5wb;H0jE!-6_FYVVH#wi*kcF?8e29G_>NTMH!%$3T zJ9$YuVJxsx@CbgM)9lA8G$XcBR%$hO8<8`;1x9~VDq(Pf!JV*i(3wHB6#2@P;2?nO zBLCs&^Rk<@4}l9V0O=a+Bl*>i3T@^<<{7pRrx2wzPyVX%%U0j8*HDy|d9OIL< z@brGeSv}2YNIdcG8dtH%`l1sf#q~}=NIrN*O&yB)z3<9_31qI82wr+@R!tD^k!d08 zx1zs<9bFd)^Op;3-Tb?oL+uLU<-fjVXcfo)D;3}ALL5xK)$8RIme3Ql%bpVNlJo-V z!^-zQL{4Lxi9;kKr}U2r7>kVU%R&}Uae1z6qm0_7FfWS+oD#`=QF-^YPX`dCDr-;n zCCox|i1>rMQ!@p8^8x0`OktXP@?u;i9`)~hpxhM;&cGUw$w$a&q9Y?&$&oGT?73QTpyrhYe z*;P!^DB$WgfO&S>3}+uMj%!cg;~IH%{bN~`_BVx{y^U|b?~zL7DU#6wMW%U(Ww|2k zvC8#X!}K!y1WWKrwa+d?{85&g7uS?VHph9CuQr8LF8q>vB>Nl}{&iT?%wKdST*A+9 zwya}t+Nrvo#EftnGiIyE(^i8u%0EuC^ewB|U8i8q4C%ifF2F8woRAo#4#{ z+@dRj(~MT-eP~9Xie{ilyUJDB#||P6X0TQDZ#b|}%`q-FnQtX-17W#rHJ+7sE@uL3 z>~UZ&UZUolWH3rNTe3&d-c}8IP*>fNpc>7bOl%Alx7Rjy2GpERVOU#34Gv@24q9|0 zVtjW=@$1h;x*+}{#f~0Imww5sa!ND_aq)*+7H7Kc>3FG1j~3mF$;R5eLAejE87QUJ znj>OJ1xi6f#g#4o+g*n)+PHRUbuGoE4#mde+t)jz(WXJZrDZ}<5LvSh$xO_|DcoAi zdd-n+6}Bj(Z{CO*KF*|#<-cHp@$#>?rUBKQ^(tSX#f&+c;P+x+|6PfSf#PesKv2Md zxrtX*VE^3nZLHPp+E#w5Hra8|L3j%X?}X;dLz8gK&Ps+IKyDxEgbT!5ZH|TYZIryU zeTYZzw&J!tAXCE{+ zhJbnq=G#cy3A@_vX7tYMz{qzZtS5=g?}JmCvEpCd~8 z$k(;J*;_75qVSS%E>S{&(^e~n^N$@CPTlA1r!RQU2HczfK|=noIII6zLNfioD>PbL zjvK9iekJ4&IB!H6I!SlmrV{N`(TW5gt$hi63NJZgRx3|Id*>&50?-#I5eMNIVIck2P()jJ?nEjOp0>=jF)6ulx8(j5w`c96wR< zzy#-{-j7s*5h|u?ZldMT2Gq`WqkV4jlDtqmwq(aU7^gj;)kN4J_ujJK%%veID$l*G%I&`sx%2u?ng*t z7B@*E?3aBoG_v7GS^llmP*lR8AfH7Rq_bO)_31c}#ZL^?Fwx%om*Wm&s0nTqWP-cg zeOmmM!6ogJAN~Yy22)d~Ork7wQlW9k9?{h(@^~ibl&(!EPtop_m<->>Z1_9ik_Ia# zuW=I(iCEdB%RQZZi637W*OUJ}3r?$wc!I;Tz2WHyDniy`Fpo{T z7Z)HkQ9I~0-t1*g$wB>LS%rM+!Vz(4v-+y`>lZjCx`NA|Ue{=jf`-gP8GTxM{ zD+pi++yy3CocUA6VjsQetawbf}XQHRZOhl86Q>Q zr|Osy=G9lM_w=hDD`U2yqgJRQHu(;|iYx`~=7iT?UZe7z>NKL&ZO}tdwFm^I7v8o5h7TJW zi+OfR%~}^Rrq~unC$+7S2?j1Hw@o`T;W}BmXQXniPa`XooUF?X9v6ENvdYbE(xo&@ z;EET)z9!MT>SW^euH&9haJo){F)p#96?NW#r2t2g$_>s_P6csE5^jt-HmD1UrbQR# zI;}{!4Y(JjE&ZEHNy6K^b0ai2@s+r$R7=9Lz%kyODE_FGuB%-09Za?ftsIa~<_6Ts z&Fb&8-htY}W%KL9cJ7wmb@^xun!uX;Nf~S3^oR1wi2&nh4Pdmz><5pJZP}&-;eP#I zE@abeC$&Je&x(@*ThPl56)R`tZg2EAXT!UF<5IKl7I-!9rp!G7@_Hf+o$jwc6#0*m zO*H^BVn2d7F|?FPXKiwbdhn-j9d%RSnw(IM_D=!j#AuU9o5boli-J+ph6@2x^lYi> zdKNduyojG`Un|5CY84z8ME2u#VXC;310zcYS^!n=U=t=aX9fDOS5t8kyRpG-2I4^G_%u2C5#DE0;FR9&;0+>;Af0dwPlsZo*L zCB^_@CL1sNQL#suhxxz0Hne`rfg@+{fy^umKDBF}5wy?`v`XJxFZjkGVad@1k^;$v zn9BpQf^oCWpsaCG__#P1?lIx!@LrpRY2|b`zw+d<45C!B=A%7s`}pEeVe&L4A}(|r zt&NZ91IXJcU|T*xJ!+{4`@1;l)OI7?AkS93tZaHUd%$dTq}8N&upfJaf5TSLWrRWH zCPUXe#}e_R7^v3ox39T3%LD+N+uC;29 zTS(!6cYv7TWgrvwfIe!Faq@`82(gZ|c4Kahi0QD%=ws}Se1*68gtOJeC1yWnqU*8a zyt|A1ANcJoLo6Y@Fg8fUU#nng1k>7A{ljIYb29uX_a(Cgw6~X!<0k2Y6=Dt4t@URJ z0$d4to=ft0R(O{&%*r&Yyv?E(huK;ZGD<9*_#bRkWid~deUriAtnBUg>{AzKiUJG{=6b1-Nc2n7DkirDE-ippbsErTeF345D>*K*9IUwO&?hTVaGqU~-k8sYH`HzDvx z`MN;Fygzu4Oe$6VUupN&j{aFbDbP)Gw5#Nzz3{sSPpG3Es)$uFjmYaD+8@gQP{?ls z)P&}BG6t#<50IYbHLT z-}7YtRg+Nr4!6_MXGxHYgZVwC=*Z$PybAzHF_IuX&}q%3G&TlUu0d)WjX$}O9IC%9 zk*-5YExpX)hmCcN0+#NrnAk$p$CFjF?iC$z8~+uHQWjXazr;KLQ9g(rKK_+$+fj#w z_5wO~s6WArdRdXS3t#IXEP z&Vn8A(=wHFn{WN#A$2>Ms&(iq8>s4N#0{#2VNZ|9-t~D-x*4z2TMH_$&)OaVHkg%&O8(hkFaccUw!yp_$ zjrXF{E`yeyO}$7RrQd=2gYb8tYRG6_+*x(!k%uz)R(9;*(y`TfoQ9lvU&vn z(THI))ZSo*Znw`MX8p!%E02PLZNfk)Yaw*Qq^G1^heedo@oN5<#<%@54;6FNJZ{;! zh3$|!(x9WOIOVlsx-q~COTFMs3p!@(CUyGm7A~~b&(w7sDRr%>hQRf*^R)Xa?A@-F zOaLR}W#`K)8r5UM;t}xZ+|VB{@0KD77Eaf8$waPj&23})ugJ$Rl)Bwn&!FCjZfWn_ zKH1B^uP)0>v6iO`%=#NioQe4i%0Idzv#oz91vz878+w~C2DtH@b7=7g7Wm(_ejz;l zpVcpCK;9AEaw8;oAG=@y4iT?4HCZYA2 zZX36!Xu`ugn98lr?A!ms@M09__tNg*at?a1o_t9r?XLcZA>w}zo5#q($nxKP=%Zg; z*+J_S57QgGN2AMh8vRa`%T9Q18;+^I25ayuXb%M#*_!(h^?|ZuSsdUtaFl zZfCPt=4Z7KQ$;eTDaSE)aGzn~*-37{QYXARxig1soI!2^Tom;%Tm*IdgfD|&D z$4^&@K)~8^%{!v0r0;1|mew~k%MJUlVm{<_{0Sik&yVq-@v^~^4bec{tn0}rP2208 zkwkRSeE_VMrOtHh zM-tnyBc{r5W6tD)AsTXUJ3<_+dH7wCGVX;VYS8Q1CmKq`{<1&2c0Zq6^a0l3eVfMO z=6<`D*jGRhKq#VhXLH6DUkhuDxGO=8)C&ZJq>y$5`-#EHdd)%wU!IZ|s3vZFk?ca~ z)Q)`^^^I}7-q?ZZ(la%RF)t=g;6Dou{ppkOSjy>VLPhi^ksQ6(;;z+z&e_rm{>SiR zpSUc?V9qC2VC+(HI4tT~#c#Zg+r9UeGuO$gJoCcB9^R%B97l4@BCVxQA1?0ROha7r zAEECYvhP0b9cokY7fC1ZtcAzWAc}$N_3gu0>2FtTr+C?ult7e}y_5sx1^{y7I2Zf* zYW66I_O20G_#b#arG<^{e32sppj5qQ2;dtVYq$P-1q`g@Phb-5m4$y6h$-pA1st9Y@z_TP!e&$T07sHZwQByE*9VA1 zHTxf`oH-6eq>{=q<_RfjT4E1&R(m@IP4 zc2IN0C)5Smnv+8H+=qwI<$Yy6>ZapLGGMS}2SgaJfq!P-!ra6{-!6F0i^zF&mAr`Y z=cEf8wof`HZ-_DS0B_{?4vmj()$iKO<-v6|3>qPNGuzyL{!VAgCGBLhWXoN9`KAj^ zZBUDj%e_Aatm5HG0d`Ls1yuy$* zO$cmf(r>-Tp#9!}r$olh86^9}K)^?YI~E8gNsDX`5>xEN<$xV$BOxq_&$!@e7k_h)i?q<4gP;Dzl@g{?#J{(HQR_!;{GClDnwnXKFm& zIdP`-JHq_6hQ?kjm@`&SWS%^s3+=%<8mlu0G<#v|?HGm0K54gv zc0wODu_E)EPlEEYC(ro?35$hAkBPtO>mgfI)YhPM(WhWgRqwc&&RiAPvJHE(qAU%w zG_EzXligmrA53M4W(i&z)i)5fLtaXkiZ7^4%wA{;RKGp;4ZFGwC6>sQRiEtL^`UT4v8Zo1$9{YH7 zcVW)c>(XEnn}8uXAwli5)}(MU?TgoBC@K*r%ul2(Yr&FB*wLZSh02a)?%_rPDBa|! zOW{wh@SNVIv7>P*an^A3NxH*lSrz;Ie zm%CNe3^1A}6WC4eP73gqK|cp}F1v>u(VXT1YwQh~2RaQyq*|qdD~Ej|$^c$ADtiH; z0H-D>zAG(;JEI$3={E$#0jbN*oboZ-Pr#-_nchn9x3->Zz>{FBR}ix>_?p}&iOw=g zgDl&@edHe4RH*c~vfC@)T+*5HNP{zJpEC1c3M9c7ZE(8O!|^L&qt{;-`0Z6SkN{$W zEo<{epl@T)9>ajZZf9F-)>p`tylvFGfgGgZ7~3=i&CjLkKZBA7Es%pBdUWB|((^%A zTD_sU*u}^qVh!(9Q;fkhr|xEgQ7XaTL>X1nj6OW&*R)JoBotD5nq#cjC)z30z63~m zmY?(qMuP**l$e!K9CJsG&t-C8q?>!iSj0?=uDJYts4zG^L$L{*nyTDaFcgEP=ORo9 z%2hl9xVy7PZ>=H?sEQJb8f9qgmY77d6}hHk)A*OXoMeKx9r*t36z{OG6tUdR2I_{Ql#pex9Ad)gwsC`i z$0*I|PZH0Sm@G~-%YBvCD2zGP=$$cS4$Yw#)P zls6ww-)RMpzp~1)qMxdq z6+?Wv*8++9l3gg4$tEvcgl2>Gp#0ExW{4E%41IF7bchu5>#DC%%R9jEBpXVGxPeQ) zxk2IinKbpQa&Pa_ly17+8JJFX!rPdyDDD?NGqg4nwnWPD{jC>@@l)+kE5qxQ(dm7x z=Ncz?iGArJdRZ}QM30o+Fnah#++=RjwFh0qZ)rylx*l3@W4PBCe^V1L=b!^BuT%2x z>nkah*}Z$J;Nuo{b8e{dv#mtIE_i#Z>!+!J#`hRwDR9pNtt(7CLcbr5?C2(Sk)Vd# z1vF&Lo`DxHmUSw&1yY}`Cg8=*-J9JKRh&IqqoW1@%!d7(B!WId%@iXGpVbNkx;fYF znw+#b$skdG3Cg^RjIJ@iK$IoKW!gHTs{g!dxb%!xh@c9v#ZZMC{|+3Ol!Y6c{%puy zLq?PxiQv|mKK937CrXPyM?g8OdTPYkw$Ujlvx56FH})v4ShsrQ(| z@Qm#%vrc-pwBAA?X1H3gtE-0_ve<1pXw>n2B z^*<>0|2@z!BP%=8e^>5TzxF>?%OBsBsP9luVjfhFSFptxlgdSx`7tL0O>?|>-r2=5 zMVy3s@uKlx|9@!j)qYTcGeDU$+EjQO=eag=Xg~A|;OptN)QIH!K?~Vfe|Nz{VN>O| zqqRgy~AswcW&`InCHH$f6IS}4F+f&7QoxhH(GsdWDRKd|BdKqnrD6lAcQ zly=G6kcNg{O8`?ki^{itFVLQP5}hn}g80}w0P_{GKX?TS;tC}vOL+`2>n2CSlr*Q< zhIrh%xaEV@gjm?!>6?MU+_YL#n6gnM)=$1CB9pbXnQt?gD8L=%dZ9Z&E&v5~;r4wU zBJ%nGT5tC594eXkGrvq$B=TDykf(ufP^A?NndsNeF;d}B(`Z^SGut5iX*GJfA9QZ^ zZet^iP*h}?+&s{F*NQh+Vy~aqnA3gJ!sSzS1wBjxQn{nZ z2+2c<#=D=|%vPW(=vbAA0z?C@WqF9PuT zZ5j=ueN{@g0!>{&^whY^b~yD61mBi*W^@&^KXDr=TLDonu3iQd0o)$6Hs_a1=QikB zu`2>-$M>xt#<gA-; zeCQQ#*2T?C^R#P1?Aw0y$?vm!ObhBU|9UP@Xy@F}?uD_Me7bYH51&yoU)|hO>K?u~ zdybCYnGaq-#&?=Lr7ks>Gc{zHA=D55N`B}V&bK_!2*t6`&?~kKfS%R*?c2&r_Wkq*MKxR93a{mj$+9&@7BXEL)7%E}m|`;8pSf zFXJipofmn$g@l#^o@LdD9d>h7@DR(TMn0I_IYbt;#k7ieskdm9Z+laW;E{l|Jh&}1 zEp%YEJR3c$4%=o)=!>rZ+>W^ep!{e3cVQuLwQ4~3aJ=Mh6>NuFHrLcXv`uBzm5Fi$ zjIX0ZH{pk5fwZ2R>B$fRTLvRk0*?ST%o@94ituBYRa~<=dz2_gF;XZux{?qpgPHT} z6?m6d!4;5~(RV5ZI)D;r;kGY;LGNF(CcG=DM`O?c!E+HB8y{>tS#Lkv0(QIGO#*Yw zC`*x|fL6+yXju+)=_hTd5jE=*W>QuOsxu?0U7^FS#9ZiW2!6ov*!y1Qx)4W9dY52$ zZZ3(_9@r|<^0sJ?Wb$a|oHLBFQ)&+gDXfyxMOZ0q`J_WwNS%!&PVG^39nu{_VUaBl zA_1Xnyi{taQ!JXUTcE+XqJtUDfxD0ENfu z2exYot~j_H%XYV=KDX;8-VWz@uE@BjWH<@$1i&hYi)_Lf^pE6S;iA72Ud=NWFRTfv za}=_*f443GFP^Wz-4{pSV7(Qy;o}Zn=Ko;qoq}u&xGl}JZ97le zwr$(CZQJ%q+qP}nK509%@~^Ik>KlDK?$eI_up`#Xo-x*#V~)>5bnLD{1H?`@pxO7w zU~Iai6@m!J@G+KN3k$W)ZGDMgg?U3oN^M3#J+U{nhF`cGUP(&scB4AAMk;{N^0(o6 zKK3wfdR)`#{de93_+@t})9`HL?Y2s<{b$(pI|@2EdY}Ieo7&}t6x6A)ZqT_2O73yT zR{%|ppl=0ag4&SYI0C{ekVIh&ozbKy-^{wFb7h4Rdff3>*ZJI7J1z^=1~N&n>>QtB z>l8%y>>G}Yi%BBx`R{u(<#y&K=8p;HksO9Hm|9Jh=S~Vy@{47cEjuzJ<(o$)RvlBi zCa$&hOJY+m!f)NmD+EjI&dI4$WYER*o?h~gvX;RGx3HxdPFnCWi9ccJSLc`ZWYd&= z6j6g)O3gYHyTZ|aOGSJytaAy!-1q8wH( ziVTAvR0i$h_=|#cOr^2agu>p@5zOV+-VytX2Y3FvK`CVmRZ)p`i3&S`H9&gPmvxG| zFg^gWPST@0dO8N{g_e#H?Uj`ihE0Bb6k5B2gC(h)3-#u*c;{zC8ryuu#;&BC&XgB$ zPH^StMm*`UU2Qc!``^!hqh33`KFcG^m=*;N4YnT1A#n)l{EY736Ma z>>D!8MZldXv9!~^DBMWQ^(R;|(^N9al?N3d#kntfjw*HaozyI=KTCWN1*5CO#v4sr z1c@>y%iES3MVU&7mU!aM(!tMI`5Q;Hzgzo%tZ}z=CgnXGi?_x9d5>D@Yvwv6c3IU&9INslkCsqB|czVqFX0;@^LlX*S+tP1##6R-Bo5)TU7M|Y|E`lh0!sbj~=3^!rOdS$9snRn1Ejk;8; z2v#%;GUhZ4-GYP321m#}Ujp|K0-cQB_NJn;EGn$RPRGKiW5OH^+g30)+k>G3QzHD| zBx~NiQTA2ISoE79W3WQg-7X`P5h5s2ADqE7l0Ji2&9=v;ZOJ;WmuSvR0{)9NSIT>@N-wE|l!TM_vpf*Nq zn2R4inRjpj{vO{VWFE-N>AF~O({$VsyxYL&=@w70TDq)6G|5lozTutF5zqbpOu=fs zA1?s=J%V@9;17k_k9V6P5q92+K?Rmz_Mnpfhapk$sLzLj^f&YzDW&v(qhtT?{@MSZ z7z-oYf4!jlf5%wTNqfWzd?ahynY){k;G2Eg9tBd5UOgj@#T~VNUbb}*KEX(p;*T$w znN-OQAgNu^JEOh=K7D;t|4@80MT=P^_nXM}b+=#KY{sY&Oh>{%qQ zF~_+3I3pp+9*Nla=;--kO4j-_+%dx>Uvg6*WuSk&c!F-&eqCs&g;&sT+a8eL#)2e_ zbE7gV91Fv~=LO+K!^!_BSt%CkYHk&Cb84ZuK4C>_Ic>AfG_P?YyL+|ADu+AgBUHU` ziA3I|#ZOUnjjUQ7*NJ z1>lz(OS%!dCb27``J9jLt83p32%e?h*6oTl){oQEZa=Y)uz~$!uuB!u3^2V31JZjE zGj`;Z7zQOh{;4L3WR{#@6EI>VAJYxml}PYa zdX%dWbu1LgTj6_6_;!Z(eiBgpkk|5Z3h&ForH%3^T1XfsaigzfC096xk|h@JSVsw6 zol{JE>ur#4>Gxu)%EdP}XZb8Ognm`3`-4Jm6?||Q?i6!-du=Q1J>jCZu2DzEILs_{ zj{Rk=XfGvLqz@3k$*Yg2e`tPsHLZ6dtnH&0e8f-NYT}SB;xP_)4?3F1t&UV9 zKM*+jnfK_gKfh&k*Dma~Anw97xq$_sAP5O@Cr9r#Rn?|>g)4%LU=-OnvupXetM3>W zb69vK_U1L~?-g*M?~Qmf8zX@WcB$Fnms=z`4}8qpk*MXR@Ybi!Zn z3#XFT=Oxf{tb;TmBqTI?K%o&at_55YhwPyNz5QYOg;fT(L;qoROY6g2ALqf6H0Mef zAh~2nbK*i#^mfdzOWNpEML+3?=*}y^1TXG~#G|Plg}MDnxD`&Q`}2t`JaAV5{|mH( zI>1PvH<1$rBbuflk25)5ujGoKMpZvU&HU&1#ep}CV|T?$a>a_LCvL;*2sITqBDT4z zg@3vGl6(b>oky5iGKyX&l2|;Nre4k4)^@qoJto)a5X^z7c}%em+pLuVq3okKUh{|L ztY2-3sV1sI-z=G-r0|beNVSIDaqYpf77h+k`Lz1@KnWJ7>t%#Q-mvAP#92p9cK&?2h20X=OjPi4eQ}__wUtO(g|(|vTeR~pn@|5zdlcxN zyu_vnZelJHp`yB(ULl=Bc%;|!A2X0rYv=uXhWE~pkBl`qDc}l?#_-K z<4S)}&M-(OZ2(=bqYzbp4Tef9H_0;QW!E$R!l2^;wrHf0rmLCPj?t!QbEpeyd)p$P z9bq{WK;C!A0NuhuKh*x2$9!lP1OgdT(l~E0jcsI!ErtE|4c%x6uIcn!&HZuTZ)mSTjnO% zTVYPZ{tUsLXq_1p(fr2639v467R8OQ;&n!lw{gvEr6}n18`@KVWV{+d73K~oXQbO6 zP$~s;p|vfSZ(1>EBl{HkrI(z8JPDG+D7^$oAu=M|O!rB{&Hi>AHbpARCb~NP$aAz9 z{X63>w8PRajZp3Jh?Zu42QQ$%!ZeSQJ`86qbS8?9YrbU##wK2dMGZIG)zQf>o_o|= zGmLi2XhG*a!&s+|L2d}Ye2*}tZwj> ztb6Dv2Tx%hIhO=xZjdz-(-%bfxSm0Ik81{`ie3~bTizk()|{cAu4e$g-T;)(3x%o1 zuFer-74UGSf9e#hwTI)bw5B00=NP$DY$V5kfGFgfBIN*{@g6%74uKQy4S?4-%ri+uS4q6qZIw^>c;0W81UVFrP|xF&c}E2#kIl5EXN?3vS0JA zUW!3Vg7puDMIi%II!tFeNz%QVXdezKF_yIaUoLDxfxPbAS1(Jwdpfw=|25o10eZ|bAuN<+wbfgzCU>z@Edy}n$-)Be7A3X-U| z7^Hw%Wa?i)fx6$!sl8*MBC$Rzd;y^QqO6qr;Oge*04M5(E*IGDpE!q4H$u6L6AWS= z+%C;dAlTnsV@}K0V!7ZJnf)OeOq0Z??}Ohs*PgZvvfGmMpFHwhNAIwG<>yE8rtX* z`k~0I4fvqdINH1H@>gG7Fu!h3j#0$xeh;Ga>K4eEX%KiXRUx3G&j$jeRg=gQKnql{ zDW4Y>Iit=@n_a|LO+b;gQyjGybl7K`@D7aCY6nkh63r7 z{PLB`aCEjM`qkm#ODWu-#B~>HD*P7ptITBk4F~}VWt>sh$GC=%LLS13G4Nv{S>Pm_ z215ro`ta53Xv&0L41?`T_S4AZ=6|?h<%Ns>80a|PCGaE8o|WDqZ5jJ`Qqa7k#k6p* zD8>CO3pBo$;|qrNrV^Z!iViP-u9~}`qVuWLG3ZoFUbLR*a_<=_!Dy1(fb_uS)0#Rs zB-^MqIH@>_ZHrz{DY&Th(|fYsdx!ufy7-Un#e%~3ly+qqTncB`83q$9ce_K_p zfn*0!NU#eqLbE1xL+45ih(_aOx`ITaM91k)H>}|&D6x@PCLDM~_%v64`-CIShC~|!xi(K(51}D6%t3%$ zt*AeZ&XEGqy|6M9w2AE-wV;%1vp^r^6|q1VM4|UJP$r*SzMNouSxMB5Uj^VU_HJzl z)6l8^^X&5kGEC|XC`@~Wq!Md~6u}T#_ZyRgo=J%YNJwz;;ke=o^V9s4CXv3G{0eOS z6yabF1(E0dMb_yPkbM<9c_}GZz#8ia(?SA7wWtg^q#d0yTnG)2nFr};X}})*yz$t+ zoiK0Wn5#f}{I}tBXV3r*Lq|OUIG@UtW;!d;wk--8cNBnS{_GNWjOlYow<<&$H5Kum zL-$m?0~<6Pyp-$IDwvELNa8_atu1Lo5P`muDop!s-`v6&|hk9to zt%9&zH#27zO&t*v$z>Dqln>Z>h%5&1sZ3Krp6w9NnfU5Y8<#92et?h}!@>W}yV3uU zlJQH({;wXtl+#ulVo#;yPrzutWe9@Z0LSq@`;KJG%EkJGLC&DLw3eg>(>?d)>uxDF zz%Gc`fxc+Xl5Gk_qIm)Kc3+sS^Q>=A*O++d59UN7wSxU}C~4Ng{ehm^_`myu*@wv} zzRwua}9l;tPWhQArnRSx}Y(A|~OKI+fNt zO@7Lwf;;*f^4|^0_HuRjlsx406_htT^Z#}D(Nd$Z1xRcrOvqyM==>y(FI7BgO#LK> zt-o1Sm;&XLUy_}&Q3TBkWW*yc*0xA+F_|V6c_+WK6yZz*`gdseJf84q^Z2pdZtb2J z8u$~j428x2ejkm62ehXpY|*m9MorT;Qil~6GescBPzr-gMCj$V&A`#UND8l{&c0+H z9-N<3b)PUL@}O!6R_Q00P!CZB>(yBg(_?=$Pc`X0|1|~0fdqoql^n*gZ9ROMmTjzd z{Sz@I*2A}S{pPi}?kan~^V0u(?}c=^PFbUd1%JhtFIm1|31yWKUX-mU5vB1 zZ@Ls|^(<+DC_WRe|Maqv{#lNq3s&p7xunYNYJhds62%K?k6G*hpn|2jIjoI^Rg=_5 zZf>qm+?9XjWu@(P3e(XgX1(zZmHvg5?;Y~DXOL?KVAe12<>MoZsMxwCBU+E=yiB!h zJk(w;J!A!1q0ZwkdLp-nXsmdO({J>+oX=@vqFpm!OM*<$wxMh?46 zgRigBFbS*FYKt-Is#Bw@{x%wE8sFeY)3ob@3nDNUX5*{&_6DDhII;+(qbF$@dwxMX z0Ok`yDoqt^Ga#cp`^&!-krd@t@|=mX5_kzO4F{@4e!NhB`5K`{ERdXCbWv1*^fm|! z^zho1{_c?kS2L^P(2mI2A+bkx^bb)y!+`l>=pehPQGB=-idmh-1@Vcju*4EWqP9-H zNR97K6}~?9%f~Dn^%JasuY(@Ity!ZRMbEd9Fo03CxD)S}%iScQWP~0MS&b!ae)-K{ zOng&6G?8ZfhjC8_N-%F27=!$*l^KrUSZ*b^tYHcSTa{{?R^vU!*Rb4ipH1ZA~qXk#VuxS9f ze$KpM7B%l%BTm!_JO*;`_R5iM%6rh?;~t{sG{cbaMyeMuug11JA9NDD4SI;SHnb&+=w^$zMy|v-NYTTyoYyw(kz|*G;jDn> zRK$*eKboHo#STd!Yiy>Mkm1p0PIQ%E&$x1d|8zUuaO@DM`e4W3(>bxO?{!M z>cmyOxRz}#dv^k`uetCmKzVz7j1E~T@YNt~_ty(sZ;iVp0Sa0_j*+-1TQ>3k((z1I zY|U->+Sx_HK9c9Sx7>tF3D`%FaRT~?fP)(Jxp1*dj3mknIt{#1{C-RluFEC{L)~)H zLXtYhcxlp0FfG`Q-ed(yWZu4nZSeTnb;u)8Zt42UF{E%U{NJO&iwu&q=#O$Pbsg#g z-asy211e`_!93&ZzhF0T@hVpw3EZ}paPM%n7bUPHq%evu!*$4lxVOQY=A; zrkQdiB|&ok;TvX#Wt8i7*{?FzQSpWL}aKpzxbyx8$sBp1Q>WEsNk zjtbMmBYm~wr#^ENBe^9oGpDmPJL_4{5mgL)Cs%I66qZHxE3asYtP%{``w=ta$e~8# zkLu8D(P^z?)l~@QZ}O^wsn!Cw89bfrz%UPk+DC%6A2ceVPvCSbkFscf;ZbUVtnBx|Gh61zH3Ie zV>s*ZD3i4aBdTHKc%Y35e^BQsnJpWqo#9%8MKxHO?k9?7NMs!_OBCN>uT=C<4xe>= zq|Orvp|6pS%~Od};Id3M6gQHdwIo&1iDHm9SD57SWM!3I zo(rHJ98A5FYM*?*-;#oLgjx`$8r|a{*5HeHUUP);BTzCEyfZ)H;jMOcQ`s3cb!F9( z-rG2R>XFV|&B&z`YV4Cf_Ic?eGX%`*2?%O@q7b>StJkcj z*ET7%q|VKTi&CE_DjL8S2Ngx;Ih`<(RnCi}GMA`bo7WV zbDd^9q;_`8Z&U)9EvONC+2Oqtc<{__q0KM>m#l>THdM)&pNN5%XiygqA=A)ex`CR7 zrpnu#Jhty5JjfB(!;*gXbQBcr6qEu9NYlZeuZ68*Gq3kGYpG?T_!KDaYL8AG8yQag zO0|_80)~h$rY~k@w)UA`kNSMNi$Q_M2be}hbdxb^6Zr8SUDwA zn5qQ}i{1zfHx(@J{O}9^;R7!2zY%Z$H-+TCH?|qs*#1kjdRyD(Klhp6*O))xz9>u# zl3l>=%Aiv)B6)TehiD87!CARBb z{F|evV*D=+dZK|y>9(9^GWGa;oG;JhVKM1uMo#YgHq#_IQPB8Qt&|MqEHc_u6bUM= zDPB0^@)PZBr;BafBq_Q){xXp#`&NeiKcCO z&Bcc6$febcgsoQ;Q5uQckKm1oF=%wp$TQ46*8;3}%Qx zYOI>xlq+qIQ$tsFO^HhT#Oz~HhaGLiq;NZ_ca!vstYtp}YXNo$1LCFsr#%)K|HB2r zOvNZDL9<}2a%cfj3-?}}Nd9!5C~ZSr3Zb&Fd(5gSJh5n@Rpuuw(E0Uqfwt+HG&D>r z)fgS^k!h6N?bCJ3M0M}&0}0<@(o1}BiMV^##kd&>MP;57fjliWm6+!jV$Dx!_Nnr# z7hTUEZKN<#3tX*5GZfp1g4A@niQm#jm>1$=1WiPmLP2WuJSpP~5RH7Oo|EKQRR2-f zN)%fQpU^Mx&o97rKX5(Wfc2gJ-rn!m_tn+E5jP4XU9ZoiYj-}J-Sjo$21bs>@Tyy) zQ^25BbhX4FR(yH+`YyIDudu$VJJXr&UtA*>lx#`sF;3zTs$G}l|NK=h+>Z&hvvOV@ z8oHd>bVImKNaJ-(>5CukO=P1s29Z5m$w?9%#ZkYmV;q0N2f9LQ7fh&dxMpXiCF#;a zNJV+F#cq8H$_daa_5(3mg{;={b@t=1JxicuK=@6L&b`?6l!MsNZW2S#GrldS#Q6O*61{w=)nT(fFnnIZ8M z`~229Wck@}w#`OfZ0F;|yH4A~5PA?B?LK|oe|;}_xxx4;zwT`UHABs4vZX?m_qU=J zi%>T5W?spYnvAG03YRyjk9N+RDC=n0?%{0c`&9frmy2RpV}-hGfhLOnfw0=(iPpRu zZ2qlSNn~pBa_Vha*-HCQI;I=jk_xZ14*SqHlJ-|R7v0e)(KoRQvswkp3fr-ZKuHP7 zs0Ld{tX{MbLQhXv2XN^$OQx6XCt5S`)nwQp*yT9rl%&QiV1P`AqY?(u72d~F;0K6tj{z2q zoP2jv4U!9P2C`9ZV4Qu4c!yK}9!N_#*5 zzU42T^~hM&&{u3|Qtum}x8=pS>pJeA-yOrr^{66d+(8D66X@1d&Qi+cc_}x7S|z;= zh#IyY_r*X;L{=qlLqW#L&{}%IHjvf!4hwq#I5duAo#q8XGh=rd;%MTY2p321c$Se8 ziDOuS+nP+rmpkf=IQo+UrCuSCK9m?wwQ5Wb71>;sHKN_vUS^Yh0d(&vG#$zEsJ(0n z;SMLK(*bouMRoy>tXd;B_ZKX{eAhtil*#KbqqD<~jKXj)OWEA;sx_}oW=CSt3^6|Kx)cT$PaayT z;d&#@)bz{giAYVi*zf4%rS270tMIYjU|$$vf>&r-ejE z!Z6Pg<6Hu`Eii80>CO7!t;6-^@1;-*zMrJfE^3K(W-bG^E-ggVC-NknzG*u_-?C$h zWSP+4pziE)-dv`v1ct}-2#Nw*(OHkfbO{!Wm@U77c#`|FC2o5kuWni7=UVpc)C zh)wY0Sbo&d%Pctb@5doen3#*J$`~`-mtlwAJd{t$DX;jGi;fvS-&i}OtfqbbImru# z@XCSSsC_y_z6dmoy#2T3qaF6wDr}Fm;h`ypT`k60DsGKZuD+)d4WqGSvh;}wu0n@B zG9FAZ3@2sCRj8&Tt39x!A{U$oyzTjF^ABz{J}gDO>FqjPZ%hpor|m==>D)u}&{p9) zj-W!jg7BEp-?A-rZ|egA`6Y;*($FL$Ai8q#-)0&!Nc--J4&;~-*$JxKAZz>ox^=e;IMH= za`BLirr`5lmrI7@82uND(ZfktPH5%uZZTdUb0vc)4J$8Ni@4IlrdA)U9UH{!3)1pi zq_L0!aChq$!fEQE@COVZ)>b_0K8ELBnk%Q>hWR}bkq*j7O_e0w{{$*$}e+Qn!#bM6akCL!i4pHL-lluPp*RCM8o(K({3%D+~BJ)uK)f`+WXNe;R8E`sN}8W zOKc3fPEFGmQ9a+j1k54aUf%2c)Lt2d;7_bTJdrhb-39zqbXmRdRy-hQRhxt+S<$)V z_wo_uiQx6xW#6{=M#Z#~5o7R7=#ZBJ4F4=Sb zHyZhW#>``6p=bLq2IuejAvW9fHq$r!2e}DR>MnkJ>2qdL_xToc{q=kNk-!Rt16Tc$ z`m@jH2N21NRHybjm87d(B4(``ka*yK%99W1{&#uuDF&T+{=NkcovrGrSuZ!$%Bk7z z^z3Yp$1wD7dGhe*;cs~|w`Sb{<-i`*Z+UV{x*qV(1+}Pyfu6A~IM<((- z%<#MQp)rmAFzca_&MOU0ywSfH6Sd;@W(sP=^Y;IACohVtZULZ1Vh=zSlJB?FCAI}R z6r|uk-)Xc%7&=_d2a7Tj7mHa-?}nLjsayC`5Jn93)AM`!G8iKZU8A%~nR+nj^<>fK zb5?O$o2Vn5T;X3WszJYYeWP>p0<-ysDFxgT(B`fX7md1UplHx3Uj z?yoxk`4h~$)KHWfC?x7(S)Ke9Xhijqc2|hX^1TL}#Zo0cSGV_jW#-$q>jwfp)3T?H zXaYWR6Eyl%c*d=bu!)%$oOVcx=xY8=!ac_3zxW{)y9?}xT%F_ax2jDbV_ro>Y?Gxz<`gxcmTaPl_AF~)X&Qb28e=G$c zR@#D){I`Jk$^9_fhg`IXuwf@?BYKoV8~D2Pte}rFh`pabC6M)-J}ofxl-wv8g_)YT z@bA})Zre8vgtJFXi^T^nd+qcH_HDgrg%A)h7wHBGxBRNJJsrGi2ViFKh!J~c$#HVM zgg$1^SNPF14gC#}uWIXVA#oRI2fE#U{Tnle@G=OZIN1rRl>T9`NoK1DXN!AO$h)8Q6xUS<^uMH3*|(M)W2%n2z*W2!^MNL3)X z(6WGl5o_=wtEuLJ|3><;i>4+rQ)Jjq=-HqiqqIYEdj}mRP0X#CCG!oFVnKwnjHIVb zZm-YY^bzaf!p1=Niv)dtoe+7ufZN{o!o!p$kejiW+`chN^xwUiVI_pGkv^Z~O$oZ!*4X-cF6^Ty59VGRtKp>qRF|BdtQ-#7OC z1$aohDLn)INlXwn=u+ZMNp`KSV)Hpi=mmineg!7Cp`xNT5R;aY2wkri(9NQH?lGcIs$U2d0wGmJWfpOy&-*yehS zGkMej_q=U+9M6YeJ{@LFR=I8Vq?)8`4R7ht@Xi&zys}|&D7bX&D;D$IUEFfW8=pNl zZo1p|=1ckl19rNJXYyVBuGb_!w4=g%XPfPoGQN&<@1Lsmw_+b(A@&h2;(A<@ii<EmHOaKOGr>odpJh>hTrn{-?rs!4k}uB#jKJVXw}19Ez6l|is_T`odV%IehKtck~( zEjd;J%z}V&bL$R`nL}u^u`QwPT1FS{m5Dy1{ZXqz=Z$L<9FP!okUAaSmU|V4%P5MG z2ZJg7SM|U&0>*|xN?oHyKmhlV&9MhEb}Pb)m42k&D?LZwaK5KIRJXIl9V9QZ4|$_0 zBOTOpYcZ$3d|iH5BcBw=iXJ5yht+IfvN3$CPO+msuxZEMj|9IYZt`z4v2Q}pQI0sp z!ru*nvAu>M3o_N680z#&&v&gJKs-7SE)LwR&krB3_Spi_|4OLs>OeKWM?xl^v+n`HvNTDXXS91ETz_(h0VxehM?F0|_!R3wKUB#*jsEcagGio6&M}eWMb*%5>~*;UdX? z`Qur1$+{7GvFLQu{T;V7;_ub&LI|9U*+8T0WMLK>6(atK{ zHaq%(Vr2*w2Ul=#@4*5^EoyrxZk|=@=vvOhYI(QG-hx6TxBR@CN8?ur%6&mR=Gv}S`5h3P}wxN)vAigk$N1kFIDK}&$i zEgS_s7cb@>=unf~P|yZ?$;-H;Twg>l{E%A;>H@geToDf>@daZ8!dELvvU&0$ENh;M zi#ks!+&Go}z#Pe^<$J&$xrEu;u;c^hoSs~!;F13HsxHvkD&P}Skqr*UrWTd(CM7!N z!gr)Mo5!eVgA+(Vd%DRwj^?+1FFDBg2f>@3BO(8gaUiXo3aHK1+D%Ah2;tfx}s5@P|K3JoFJfCO10> zO9zfWrN3XcO-_lz#sb_{IXvN|N4$!JM4O-IFNQ8Uq+b{{KJF+EjedUkZ!+efkl7(= z&DiR;BnzIu0}_#&H|&Wk_#W)vRkMcv#TlKpmpu8U{4BO?khmu7{(<~4Q@-Ceb+7eg zY*WLxL7c%YS-xo=!xvtOfcpQ|g&hAwco_@(e_<&fYil`ewjlZbcH8~$dSoOwBA2sYnvJtUuqE2Z9Mi0_!OMxvG>_7y?qKM%$%zQ+spwQ24b@ zG5=$o{w}^vD%X#Pe{xNtCZqhewROGka3{%0L&j{cY3a!4P%)<^CCIrK1d&us* zaNLO-Xw)7dE8olUI6?+AtV+MW-S8E3RMlC|$ZJw?(+J*B zm7Z8Yzh4Sr>f5!`clVNH)7&g^tfBO$$Ca;lmveJQV*MY!4g44AzRB+EylZQ34M$Ip z`47((9nXdZ@B}5J%0Q{V(eL8B4XHfz%zO%qa!@{`>KdT}W`o#ErI?HSsZ7jKi8)8$3Y4xzGS>pKXJ;HOuN|D^xZW+W+dwl%BQOwB%Nt^$%}N=#vAH zEBiTG0E=E_@Pi}didh>(?(xX_GE7&*Zz?vNjuzjgF*12WHRkBRFN=nh3=^2qnGF zMRFN)jW`BW&?}-q0mA@tWYP7|jOYq@XFuf+|3(>7h!U0r_^PUh1>6`1Ft?<2FLuiG&AM6L!{N95 zHTGVpA-wH*7LkMX+FRwgkqhhSIBE&;cIyb zY+DW5{p*)?<|emC;H<=%#SQ8~h{O7b%Z-NdK}u@ZP@r{p<-ysz>RI0D zaMX7{YSc`1?7x}^IahDvk+9%Rz6*#bmE`mby`90PvDTddt$7WwTeD{S{i`b8c4UR& zQgiF~&#j+WVCj3SF+z4rN+@GZ6Jynf{PI;1k*%+t1fDwdYu zV7X=Z-v&HRw5Wd?79ynSEtV^_jDcT7#p*>Y0kqdMNAXP5vCQYcU{q)L9co~y(Y()3 z$KC%18h|kk4E8kyi7^Ou9tcGTI+5@DC^XNb4JOYzUA25yZe8@nf)UeevS_UARj0y& z)7Tabb}!J}{rwIFmPX(Kr&L-^WIy>Xu)->n=4k*XTW(@&fRg8iKRGas-SK_44Imra z@8PMsp7X&78|26^`=xw^XaRmVbGc0N`5TirxkW->ww~0R6rrPcCEvn1EboTrYMr^> zR|xCZ`!Q+xcM0R}%UkCYL)1)&s1G}vIyDFbc(>`1q+|iaNsg{0>Do#o=2++ASr-Lj zEM}gfgNMVr3-D|2$w(>(A2Xn4eMy(8(^LDdo0I?zz?*AzYt{^KB?k@YRO{@28Co+W zd2+Xj6l=@+&ZfEn5?z0EqefqVTw?SF?Ld2#XA29*RRc5Np6)PVs9kQUY^@vQtR6{w zCm9GkM&0cQDRj=%!ZMJqIx1Kywg`BA(Pt2ZT|BA8Gnr!iL}8BLQ$;nDZK1@s-q}aE zLB>D_9m3UCAo98$&8vBn7(?F3jgs>sMHVo*BpwuwX@{ZWLrx=T6b^InT)BSraA;;D z-}KgQ&)&4ss(Pc?!G8(3cG-QJcP`?r;^^r${p3F991sKMQnHCfRY2Ce%*kS5BPkYC zDh>O(5^=>5)Gs)YBtRs+wCpjxBKhk${fq)0F%Qr`e?;0a821ND;VaEbi1m161>?2JqJf;)GV=iVs4{|FM*tS$AxupB$B#B%~!@ouK;?{Kc0<2tTFjAb4~$O`za6MU|dNjc}~|8`8;GKRh61@)q;g1DRaBA$7E(D+$2pznms)}dYU1v;zR4t;?w?K7c;S^KoW{>MRk;Xso~dLU zCM+{bridwDyffnt0+SEE+uJZ7s8~qyy+tW@em7uF08MEoXYbdQyK?jr?=sOW8&f4U zxTsLioX1getX)d1s4IyNLSzND({I<*+b31~*z?;lR+3=4e$QvMepkU6lp}L8pf0XUH)vD@d*&VT=P%(Tk5z?I6H|k_-_U@Y!s%l%AAq+yl zz&Yw4@NMSOnEys-{tx+W%q)!m#eme7`ZXYt{*$mYh!si;*^3EqY&abKbG#90WBaUs z%D;#_sSyz=V&UfJ+Y#X52*$L4AT)wnD#mSv5K@X!1jE~;h=@}vRgK`~-X_(1Lojcg z>}4D+Pxp5-FO@W0JAPlfm~=XKc(Is7S19C_&qViYK~g&0X#ByrNGKKdw-x?H7>YI= zfi=l*A*5o6K+YygBW2OcHaW(9J(uBt6t}q=3Kpg(EI_h$+#pYKDjIYp#|s|}-ugSc zGXzHva{l(8nQ&{=>=sL>!zq8nzz7NMb`!f@9*k1OT#P0qB2Ib&w8yEd(;1K|RF$VW zWe@22s+T<;A4r$Tp)u<8=$s|*k*$E5@zE4953R+cnbrUA!?SE!VacCfeV{3zq;B>8 z(`hmHb`WOX!QB%j;}Dd_p^11wozuTVfj0_??fOgz*0jG|oP3iqK`|pN%m7HmV6u^Q z_ck@k`xal3SxhiF@Y>-FaY!HX#^BIEfdYm*=PYYUMWXfJ<_!ElfWP(4Zg zk^UZG2XXoWWg3k1GgoN)aa|{T{`<>V7~^$=Ch8 zekt~xggMOMIA=9_bTJ;I_X}}F>l8p&>uuUD?_kI++M{l_+#$tufL&QfE6oq!1)Z(v zH{=g*P_No7aYbT(V#Ra4g|LeLG3%mAd*79mP2cFuW`PB`m!IJ3yhP8Ofw4vq!FiX_1PIc2CQ>4&X?#J)n$mHE#Pr(8>4kEZ8fCAN4D*_rQWz>|CAwZd? zNyS_?$<%+=%@rq!{vBM^fC;Q3{Shm_XIF}eb#^GtbRx^-c5y5p;`!dn-D32&f~QX4ed6p#!~4YEaUBo$!M zv3t;C(evG9KTcyX*h(7Fezz*usY|&}wjkLED~AtlZkt zQqP-8PL<50;~ir%i1ovt9AAS1zs={n#zhT1s_KO{1>ig)OyqAgL~#mPrZl%0l_^4L zx!9F7udt*?<04s1sl%EWRXzt;U&c>efP>|b((m%-8B}bv#q5q;?q?+L3XgTcd8T2XKkx4i_Y}cyx@rnl`)Xk`H=5a+?*EDvocM?~d@tuUD{& ztN$9bZCcZxoOe-I{RU|IZj?U%!KDeOak_Av{2bw<6TM=@8+LUYozTjBFhpfsHKN!t zeT+IVNv*iC9V4=qXzWavh`z9@!1?Re4a1A*RBZ7Q4`jGDOi(C>UONbNcW6pJ+>wib{Oh1$IQ9^RB#>!q4HpA+Zg-mpT)gbMk zkrLI?CAcBYV{6-d+zPILVi-+3ibGX|16zA1TCdu=64zzGl25w3bN}Kqu83$_ghr=k z5DhLt#HU@mzQb$F1iyC@JHxAm0veTWeFM8qJRkjM<<_ji3(=?IraQyHQ(Rk{@P1Rn zs^E}>MuwCw=e?z$Rob!j3Ox|o$n`Qhc5edS^~0Ib*`HZZ@tcf>*Q+VspE?CnN zqfdKb+%>yX^+&h!c{)ZbQ{0`Fr;F!><&(Uvd}i3EC86vs=k8Lo3uK5p3)Q0m~_WB#dn1xrMgpdhYk-g zHJ|o7j(8VHt-Nrf7q-icBE5hPmN)#Ns50n*l(d@3i6TAVksUn5(*I)YouUMbx@^s` zZQHhyVcWKCTN$=(J0iojZQHhQ{MCIQx_ZxV~|%v8qoT`F86OZd|XNQQSk>RDtRxl z6;RJwZBYKczGUqlxnHM4^?#xoZ6f)IQ(rZtlc&z&8g1cp8si{YJYY0)jI>z}lQf;$ z3A2&Mvm)>T#mltVITK-n8nO{(LJ7+0VCqT_8#Bf46%X%CHcc4k=mr*>xOlbxvz9Lr zG3{@EFHUDO={Hp`e2ktjJ!l~7|02}>VL2Nj&62DAvWx#iNV|uN2Y6F+>lru#vhjx?^5i3eARTRK>Pk(#f3{P(X|SYa4jL@mXjY;2sV(3`B5D~n>0io}wL=F}aQVg@O3`2u1& z6tLO1{&|xve5owBiJ^)WHc3aw*G5G>z(P1Ia^RWnBH+U6_u@%%KHIv|gHGn@OBHoQCmOVY z2G-aEoLSH6@&FcLh@(?#1onHvAGHFHiN02}*N;Hr zX*#;8(z(+X`z+ayO%j`D0}|woDMwNxx}5D4H2FzIM4UZbdQom2ui78)C3bj^?uP8 zALDi*)Rff2KnQOPJOou;lp$e-|5SLEDOqy9xC%Ag1?x7(7)bBexNU{#?7HRJ>^TTY z80*AwrEwu|`=SUEncf-$chC2w^*BBlxe;@6MvPoPT&l!@x#r7=)3(|W@$r+vtsK$3 z8AZTOre|rf^FL9P;LW|pc8;&w+Wix_;s^rY)_|6tHE zbxg}ci<66yV56xXA(D`LcpS2Abgxk(tEO^qG=4oaqgLMIVkAB_W{|L;ku)ax^@88O zFv4897B#Q7nJ>^@mH!5ZuoO9VHL03l) zf%d%rDf7<$3(@55EA(M@bHxNaOodeZUnUxHQ3o7N}^D-DAd8;XX5?a7v6oe{&E@ok_)Sky}L5qw{ zpAmY=oNdQxLN7%S%d|jp#Pp>h9V%?C7H45zfdR%Is!dPJc=Jt`V0ELe?NvJ00hUQ( z!g1>i3&US>NMVH^GAtt&);I&3sTE`Cvs1jUSD+mq;p=JE;LpYlhhxJXZUmF=$r;lJ zMj2e2ZX7H2M7u(FB?BC7@U5y1uo*wFZ3cli&~KvL+-)&qaOa#19c8?DRP_OF^S5K- z)1-#E%+cWyMtU~6+0`llAx&ZJSZzmVnpy!)?Ftvw_YnPsF^|CjW|>nsFi$2nTSU3; zexz~6tLDn{J-E-s$Boz6J9X5$52kznbIr&ZKAg7Q6(~`@SCuQeIu~(<*I#B^Q0{)3 z^A+ucg1$XHp)hE{{2q;2*;aT6;#%f03q)R!Jdv?Cyi1Bv(XS1kTrN1ef?cBm6ZTk1 zh-AsRI%NP-Wr;6N9(K;#_qZV_yXd?b{WjS|^)ncE2`-ef_q4rZl^!9jbYcldN2b2a zbw#RUC?}@eJ{R8z_Ge5XWY z>420=dqYDvx?TOnNg{qnsDe2f6Ol=z6*7FFq-4xEWNi`Wt&TqC$|RkPtA_rTyNXwu zxZMztyPLp?WdBcHRK4OVzr3&mG$rIgetQu>pKifs`&j z*h%J$0?gYN%42`;q#W!il=2fB7PK-$Rozo#or%h)MCUADJu_4XtHnHDSd_-Q7Q=E8 zO~*3|VV{hJ*+3(S7`&kc){rLE#**gEvnl%R_0DP^$cwEO-9tB}1C0#m3CdOy2}xJo zDt!4UpeX_Jf{tl7hn4Ogw5C&lonZ!x5`-9ts2^cwN`V}`dAiBszfkq6;oo@H)mb}U zr+py4)oT?@fUC^4il#62jgB6^oOA?|1HzJyvH>_?3nF840?lI5G!$)>{PMKsgn$&9 zeOm3;aS)R_vP;5E0VabN&N~P2U=a5es~b=^h^S`lYl1e>PD=GueDjuvm#MyX@7Fh( zD_`&0c7$sLTl(CSU=yJ)@QrL=9Vd6+z7zJQ+C4aqtbMPIc&QAcbGKL8He(p6KT9dt zmySM}?E!<5Bk?THTQWpFD%Bt5u7fkBR347!5VqMD&$r7SaV07-i0Y$9urx#!*CBK6 z_Xc^_Cz4D2LW1m>Yb&!TW0;U5L z+poTuxbO%KRLtb$Zw+oCWJ&R|*96uOHRebr{+S&e6JH8cDef$`s`Fe2_d$(_b`1?f zv=y+8c7lOY{@vhSl?;Hkq;DU~DZ!4#Xp4~PlvJo-&~b;wLMqoVJ7Oq{-#xRcSL}O} zRrS0_onq5yi(&IuLsf~^eKKBS-7!ho z!n9{rAqB4dW7ICIno;E?hMgS@tQQ`h%^Rp;^1ag)7cy=k+hv*qHJ;XhkB~o9 z;p5ODX<@}Nc^F*sj={77xV{t7HSBmE6$u3=SB7qErLUN$Cu4;Epc|U610Dye>mP9& zHAR-=aIts_q8*Z{tNpC8c2AqZD|w!bJ-T*)-yfpVM)&PKe8a!pag5z4dAY?G7`*Z0 z{_tgco`vvzJKI_{pr8<kVk>@kRoF^TgKc$6ZDAGQ8sBs zJtj?rlBkd$|J#enj>Z8kZf3;_vVsbnnmDAVw%5RU%=aF0mj?h(uf%ggR;hC92Lu6n zj8gyi#w6@Tr2PQJt{UEEA3oVRB^lUW49N1wzgx?F2Nw}!7excc9!rl1gW{u5HJzG! zFR!pVR!BM#Q?g8yknVv>^oTJ8uv{0-kg2_Pk7`J$xE7fHP!M^`;}oM>No*ZKg-pUV5!5KDrkDN|Es>iB)*cOvoNGfydXs}@{GE0@e>Ln5t&#viV zXHDIAZoLycQx0zJlgKZ|c%!MdGg`n=75U6CkwX=dHWS#q?xe;&5Lhejlct4%@F97{ zI8J@IkH6bd2%wXd>a%NMSY)ZiC7D}kOMz}-eyuR){N>>I7^LOVp;cG9v)Gg$=EnSR zKb~GJr0OUNwMZE9mL|^A9ie+ii7ot24Q7#r7%}PJ%?$;-5~j}mcOb!Fi)6JVpyGE} z5?Kx$_&)Hszo8%(6K!AiAva~PYR-R3A}Ru@-~In)+z_@J0;>ptv1-n7aw@Zi!NbAE z^PpEkWXAW(T;Iy18B0%5yu1QT)jglNRlF72d~B%|>ENy}Rr*isCe@dkL>?_Zo3Ic5 ztJYYj;!kn2Hvboc-^(syJ9A+AS7kTt+7+rhvx>^MB!u5t$xSl|l>@`U00K)V84}OC z_l8#B>=|h@zvE+I_1XN4p2w-a9(4GUu?XSc?O9?ay!}!QSpUg|1*^uVIW;5){O(KA zShJPXpIPxLnob5cR4wmCJ=wq(oiqqtlgjN@a|k5xhTD-xU)3#SPiM{HYsp3M?c>Oy zDp9+Xg^7#`8~)Xc_iAbasGnKr+dA;B-SUHLT3o#tKH7^p7Z-A|H@)Sdb?l~ZRLKXX zKBxI6(K)&}%M9&kDP!;@hjeY8f7CtE+-8*`J`lV_fkA2`gghX}Sh#)pnk#CtFX~do z*I<{C`)q)Cx+Q-l7?Ye)Kl!6KK#oyxi}Mop<HQA~E-wQQTIHQo`-iSr&}HRziX z$$O5Hf12PLptK;}&DPvc?+jAK7pdhxZT?m9&b@k-Z^sjc%Xo+n*74rm4+0q6U5&}y zbAOABZ6+JGrF&@TkVyqc+DiWM`Es-rCPo?lp4aq$c*T>^=lYSHB^-C&iS@^Yz=ewX z7K}-*;OolT$#P`LqR>bSIeokvSvcbnOC=sPRm;#6v~D`f8y+IuKNax37Q(!Er4 zJkzPtutc}|Nh01BIY{TV#l-l_R=No^B|S+&oYo6$3rMyvmcDp>v%ke>=0mN9UC`kb ztscZ+3UMTdeb{5L%-{4sbSVEjjvo^{%YQq9Ueda-+ZaXsvF-fH;?@>q*r9qItCj3x5rS|QHoB0Dl#F132;DE*7Jb}A|`C}t{1dcox9v(_{ zwhP1)M$NhGu(Av}e_VDp`w{}K&n3G!B)zjC#H=t(JUDa}UFIgocor(Jk z#Cc{XWo-y(c#`h4{9bMb9)3Hz;ZtwzYzH3RHvn-52hV$Zd>s*&n`!{MoVop^_^>mq zTOY~TsGY&SIl{~-P7r#+-PEN|I6XN+1@jl>ckb$ol17lsAWR0Epz;5Zpf%R=B@g~D z3EJHuIGmUZb2=fFh&#Iz+d;!6Z#|Z|F1X%{(`|X^4m$GUm2ya9$P1tiT0@gggR;a! ziEf?4w})ry>D0rwN|gV|()pc@oj6o()3tX^4yu@@QAIN1AivF`+hDq2^r-CBZkm+l zm%-r(GqV71{{~^M-Dl^?SobGGtxAzHpgprtAN8^;FuBMYEh&1jib9~-I^UttAqXu% z>UatH$-1Lm3~{L4+xHMDxim=4mqx7WRdXW25L8n2FG_9F7f`dxmvvbS9ZflJueCq1 z&_G}+z;B9gMvtBAXiYQplyh7D&p+3h9eUhmDOJ~Z@(m%sA>%fSPvZ_Py_KvSy@sEZ zXZG#&H7K^qacM|D)UyAi_)0genZ*9;V9P;l3D>!!GNHZ@b!5&^ia(xPwmJ{YdV2nY zg8oMP4+=W@8tJ&H3sb>i3NMNEzfydcc2rf~ntv_+@V_a(z_CKg(XLnpQb5{l^Blma zXzK|~VIiRxvcnW@v%R8kAtf(OtWwhUQu!QMFnbiZ)R@2-X`o5#OrdCzv%uYqo7h(Y>BjaJ81F& zb%vryXz{36>ySfDfi1dN^iuockJHh%Hu18JKC)75UaFIJBo6?Wn%@`3)-*%nFe z#d2UR;#5>*>KGvsadHklrJ0#|FygMb^NlGv^MUhvvjdL!&2Qbm#x8J=z5M*i;D7$+ z|Hr+vO(^iw6K=ZogB|X0(go@{%#mcg!9?rNXL*7YGW;m*)Hknb29 zU9P|20)IbK)0?J`1n38C=8}T2k#&HpbMC<)=J&1*ymm1GGuhlx>6Dw&yNV`F*+uHb z+SNyRWgZHDLf0QSv4PXbj-c`de6?of9ymG__5HPfV$JjcQAit~vtLKqke|~?A+|gI zWgp4qiRjtg8rWxhVSx~tWj~oci+exF5F>!x#oJZHKG2>A(8b_m)u~M|dk{-N6ZkVE z!~srREB3UHg$2nz{y@XPQcOABU=_us@D4*+de{w7l@b5>=MluTkq3VEjg%$E@{^Q% z0P*~C>E`zOXu>}cn-9n(;KCCar7N#vG!#hxUJ`^_CNv|PC->JJ01dWi>qj_eeV^+E zkRdCmljT5!-@yDw-R(GDmK+R9@bD5I$T5&RIHa&2x|GCsJksirxvf9i2alk_;SO)8 z8nS&zMX9YoZRCz;p94)H_CQnGv=vtsV|sc(l0GGIg2K{2#pI97yo{Pzf~k0rw+j()~Gv*iu0m;17{KwV6fXwhI}QZO+=~8N9T1(9;W8EIMUEJ zOdeTaDj?_m)e2_07TKE^$6|JdDN4`m!$9Qq6Nnk>_W+Zydf1!anv8l* zbMV0FPh5-69ByBiU)Zl^5eNQii2ho6gpnA#stf%(@J<-v>mn9!Ny*yJ#rphfqNt8L zeMhp?sJz1imM&)qxFMSdTkQk?J(6*ptvRy}OHQ|%r96}`)aS4Kf%qg@(FMlWm?8$j z7mAZquM*m}f2X+d$D$=MTP_L4+2-{J>GxGy$U+lUK`jwp@Bci;Swx~g%`0(dE=mmy z3S^+XhCe7)w)j{k1IXFb}^5N55d4Wum@IO1s?c>aU2 zev{L2!8&07OrO|z?fbM76mOteftaiixq*`|X_>?wB=4J_R2{lt+|GGj$OF>f~s z&gME!Rnn2!?qJCIk5?3TD2ANoo}2{#Er2i@H%us08nW%7jmSc8GEUS57=MZpygOv3 zWFB_XB(+_keeN~5+w3Y-5cV|Cp1v6yQukxYRzD=J{%k!I_KL-CC#%Xv{AFkP`t73` zx*4;8yB{oqAyhxYZa?1I&FV5^!AbggXMVe4M}E_=$x+Y3hg2Wr3&6t%R3S}U#ay1O zJ^5l=Q1Fx^LFL{zdi112?I5`69Zp$*tOaN6^P_?{+iyp_@mWT!Z!d8}RA!{kDwdm< zBcz-DZwoVw8Xt`M48TJlM_u15H5;z#fF*~d;gmU>xeK`It}DuUHn(HjdW5`Mewk%{ z3_du8XrDj4o|5scb;`#=o0QH7^IDz=x_ZDwORbX;*o%e-Ar+O|D&{F+&mDRoWOoNe z+C+aux)`AmUy=20$90os5W2R6PJZ?q9U27CnBq2Ia9<>jaXH40QR*-ecRVrRBHV9z{=#!`iA@|du|nA z;DH6g)e2tRK${}W3J}2*9QG!5U1=j+IR^c23;K?7wo3ygrUg#?A9a-ZEQ;5lUQ1|x zVC}>3PegpVnDR47wgqZ)#@7-@TFqX$TxEByEF9tx#l?E(!I<$Z`)v$(PmcLgax8q# z&F?0YR|Zvc#TjkA0Gyzvk}(v~CD~Joj1rIA5*PutX&rX@0QYk-3s_Aqe;%xSC+ish zZ2L1tT4M#C09UM~xLLWyaGfAjKqZj*07E46Q+#!i5jp8@~UB*}vx5OD(bS2JizXz2sK zQ?;vL82E>-KlcsruRj;H>*1WRJ?T(EVi`9F*lE45HJRMsqC34voA{=3k&1cJHU=@e zdvhU3Xkx&=baTqIX}g@>;fb@Jy->=KqUDLR2&luAGNRJE6w;b!@DS4)O*_xSK0m;1 zpTx5NLkax9qtG!kGX1v<;4W<&I~;bn@81&GfbSY@bo10j^t4o4cYT{v7Mt5VAdf+D z;0aZHb2vPp!_Tj1TeKsgY)yk5^!&0Whm;ZyKfb{DH_!m{9q@-a%1x+r@5J2Q&F@!# z@xZ>d^_!PK|C^L>m*5ul6m&`F$IolvkIl6#Q(<;HN1;+%dVNp4+uf1YzA;14*wK6w z<@fS?ONUI$S98bb%Gnrn-0Q;GSZRqRxaYon2CSgVGixS@5$NYEbX~PtP-t$U@fNRo z{_AR^t+LQesck~n8OBX>gWktiW*&%wwpQ9K1a@&#udp{Hn@L%FPf}dhApHP((G$85 zJL98lSferW4PEVyO&Si98g413a^Pjb@nsu_&)y!Fk7C1iU7%1(@42f4+tYB7>ss&K zonw7+=EcVqa(!FdTEx^AzE)RTM~K?ibNHtBH;~=c>A+J;_!Ro*?cVpX({cNOwesYn z=(07q1$@YY+n@17y{ zEwnCIcz*obt0(k7yuI8f`0L*o7G9n zrZdY71O3o%hhxBMqf5+?rM2Jj`zk;WmW|o3Wwr$!1GAr<|Rw-hfin zzK%~gx}E-esd9TmTCazfNZUF(y&Yz^aEu&LKL_aal2$i}zwB_NdJ1)2ZP&KBufYO3 z+uM#d=G5MEvT(rp5p@QO*BgLxi(Y&hr-68`p+$Jpcx*%cifwrihl5uhvaZNKO2v|- zfBKSt<T)>c?+v4iso2&#r~ z##ukKYg!lT+x#;jBekBeIwE%Q{6}jq6lDOn5y7=~$uQLX`bD*r1rcZ=Ae?PJjUA$m zT9pQvV-ezw#^}rk+#~^Pe`wMW-^#Ypi*NW2W&N>-^Y-kMY)4(%M{ZQeoe3tvQA;EG z)NO~px1KZ+B}p+-nWR;@==3Y+6y$)G7qFj(Q_70msdbzVC*VLAUgSL4RM^!9k{8a_ z!iRGx9hI1VcakK>5aI4GC&WQqLQxF?DLnP;h*58c4@%B&g*18)T?|<|`u&od-(b-r z;YVFJ8EQ8_t}cux>Eb`Q>YYfNY;MHA#4|X|siv;ux{3m;8NFq1NU8I(yNr9|yd)Im zox0RSp9)sV-Y;gVZvfV|5quwWUvB60*qd3sibUB+$_O^X4QUMeN zy>`*tNb+lTNd_c)_xm{CWi@`wov9>jTxNia0UJ3EO@8QPOOxzkt8o@D{`l4eD{@QAPar-2?sY^b%3d{ynZ-%WoS4A9~Lx}A~{TlC5T(&0Xb2UuxX65On8wE z2f3q@piM_4geA|*qYNa9Mv_Mg!OEIRprE-il2FeST4y^>wI6kfT?M=<M%Dj9t+bVh*;174TTBWVxo=P{CRuOICEhZwgjUk*^&%MwNK#l*~vLt+%)o8KX#G zmDNZ9cxKO)vbWhb7DaW<60^J?)L{4`!D%CiWQLb$O$MIW9j36xOc%UqqL8`2j5F}4Y2~}Q7 za+2UFnK4pHNhvs*6uiPa7?>oyzb@Th5~DsyQgtvr{ZE>U>+963kiLRO(*lzjMy}0q zLL7_JF{Ab@GLA1g)GMreeGbF@_7=e;?e;jf>%L2n|GRAm?#7A zNf?FEnaHrgtRnj_g?c8RG;wO`>w;+i+mlM2~(nS zG7~kb$1qKrSCr6f97Bon7^iq)LgtZta+VM)RU1V_)nQiH`I#ABZAmT!;ld01A6l6CK_$?-RP}IgO?nIx|qLw^N5W8mEp7nnE30Bvax&b1*Tg2iot; zh7p~+h&PQ7Vo_(A$X7pRM!wQ z8RN9~z^u)4mF)$l$nmd5SkgTsq|i8h+(}9K*sqn|t+10Dyt&>TnF>2k=$Yr@TZI)L z;(FKDw#5BNY<39^RiD5O=EKN6k_SJ4RjwOrtMFyu13pCpq#0JCCyeJ>(##BQ9uU31 z^dH?$ncWkiC0H&ukr!(ST)v<+!uFH68F1bFeB;yJoJG>z+kORf8%Mjx9=`oD(mGym zA`MH5K(@UZ^wcq&@&k+_fLH6H@whnpnkof9q)vE#_uDy69(V90|0~ltiYhTl z9u_vFeMRu9E}Wx}sjM1`5~PG=yaAj{|kR+#Mu)nRHUW5Z(}ez2ILagUgt z9!yNXV`l-dp*%d1e1Jt&t8zJ(b><_@RQqpgp=}o>a9UQYKlRJ38D_P_*>u@A)EA5C z5&U*pCVQ_Ema)oOJo^CQI@(DVJ{)If%Ve^uA{-LOEiV0F$Qb7+Zfy09ob2EcDW;_~ z1|owfuseV_y$POh*wRK$ZhxJ}tnN!axk2sxiDhPyjKvSzc5-J(uML$){)<>X%OUW< z>WT?TE?DxLfZ{r7DtK%i@^@tjG!wnj6_c?mh>*$NwyI8RjlKe{k@(BRLS+G-zb5k+ z^3pX9tfLSoVQZRKI5Pn9ay3p10&5>=QSdZeO(xvGJ!cma+`^rVis&6$0lh6dUt#1K z9W2Dvck8=9XS%6}f!FhQaJftP1q#Ue4EL^}MAb6MyVhkGKw0{$l3@+XfAuW8Vs!jB+naHv2+ z?{{6Roo`L5%Ddre&go8H7Aw4wY~=BQ-X=J`aArM|>RW%Dl5QW+sDV z#lZ8Xbr2^B84d+Xm%t6a1W_~uO2iGm2AOsoRlev{qTjyo&m#vq)rMIbC|ail!dfY5 zM0uT^aIR4>t(Gi{ElrT5_*I^8cxYOof4?`Xil`xIyN+jU0b;FO!X1j5Yy&X$R3>=* z=FlzWzn0mL4Gq1ZcK1gr_q=iw?tDb5oP49pUi$2OT8_q-K=M?vf-d+D^?tE^gV}Kg z$Ew&~Znco+Bca0t^k|AMQ^N_aPzR^gjsGrmy5WwaosgOFVTSBgRtS@Z3elGvj>h($XPbM()tq_siFkY^Aas*h6mdkQZU6@8=!NubTUP zU4~%_*NKWuy|(|FCE9pc#Tx4&2y6N~0Urt(b(8=cak+jRl%NW9 znWTFLx_|yKg#Tz1cCas<#u^{cIqxCzm4w=IRXPn<1LPv^gjl6vA?2S1?ZNekHKN_d zbGuMUt2&=vHzU}EJgk!O*u1nW=W{=a=M0-U&^!}Hd0*@<>mD4g0x4DJaj~;}9y7WlL)Uy5YEo;@Wo}m z(U43GCKR?yOg{arU|j8*U3s!%jhk4y&C?N2erEP ze0CIBqFPcN4U^7W?fI?TaLy45Tr1w_K`F==>1s)IqWcy z5!+>sB-c5_1WZQBaF#ODmq-wm%i@}IBHRM1RhtVP=kE`BZ9!u+nikp+YoTL5plyUE z8tS5Wpk45lv5iVSfC^A+=>-GWNu`d3I8v0My8amS5R_+*Y7y#N4Yzm;Gm7V3jJ(zZ zMAbw82Awc_|KjL@x&;P9zi$G?Z;*Zdh|w{^I>yf)B?uh5yfH%iDvHCZ<+=K`doWZ< zH#>oV+eY#0YRf3szu?L{WWt`C5nh$3KD}DF`xf~{u3#N)XK!plc$wYeMzRl+qmm<6_7j)L~yaX8B8?jQbOz26xVB z_MI%llqHSffqV(Cq13O$5$*Y4uDS*&&`}PHXijs%!P0q<6A0&d6CfC((ME5(V zaMaam(LmEmFPehzF04avb9HF*Mt~Mw_W`aAj=U12!QiNCBF7n++U{igZ}FynardD# z_k2TkcuxjRMLb6fiR8E|pigemWR0B~RsAwll7txVoD+F58&8IxOzSJq1^~)BRoLW| z*i2P_&o2xEkSjDpQdcJ;VSGv%LOS8Tq%-psRT)0Eb%A$A*A~f(nxN__hz>{BP}uQ~ zoO4NgDr^pmcyM&PGaa>zAdfmcNc#10`WEPm1lQS3laI7jm#X-+iNDBJb^R+@_fRQu zVJAx`Xo1RD6L=OV)3JHhBc1uW5};!+-MW|;EAygkQYd8Srl>SONhsQJ8OdBJydYV$ zxLTyLZlJ3YI(_&dQv1v)oZ(h6Pb4w+QFtz# zg)*_FT_RaH8q7pCLwl(YaR0ng%@p&f+!jBbg$LU?|4Rz`VQzha!TKHe^?^F?3YgYWUrG5N*Os5CyNlfnndjQvK+o4(T z@{vSKdu>{qwz@gr+8>FKN2XJJ_v+t8Mvq^HKe(Zcqr8E7aMl!j0)G@YXT`lgOo`kX z=N&=UjPz-8Q>C4Ksv){$@!t0Is@&_!OT1RpVcU=_Jb8i(R`qtS4z#l8E=~TMQvGyr z91(U>O0O5{S{_)XnWy?a2KHJeB5@jJ5daT3#FDcu2N0ODv5qM@mKwus_7a~!Z;)!% zj_gBE`4<1rRccJ_)jlHnqzZnv{wDxuN;5WfNA%??EI+dNaO5oCJ7$8LQ@TWdImA=|EWJ620y9x9l3}SAq-(dR}YQF(dw-pf5bf7^L(9Wc*vZ4e!d_99| zd_RCFvrv0>$MPkRqw25PubaEkRcs;wT*BcDb{j5;gMJpMhhxgh0WlRilGUp+m*yPk z5Gg@W2x?`_(4|g`mh_`HL^uY|Q3&c&I|Bp((=v87u#WI-FQ=cEBp9>uT3A>5o%9YM zj#ihmt`p@fX8zd7m$9h4a3CQQ#A6es0M`}PMa%Gt)65r)manG`N6#=oqstA-_ohqF zP&5sPyu@4w)h4fSz#z_j!Zm=_S}~BP>V>Kn=VdQ|eQbH!dm8{+T>wvGF2pl79YkVF z-M%++^4NO=n{A@)r@{VgUCYJIxWMtS=8d;~lj;lD{Ua-vH|~L|Q1z_#iqN?8O52}P z@9F6g%3V#bg5e+OXCJ8}6-@qH_@X;L2KBI-|r_UIntICoDH+1jB?riSueq zNi<+U1Pi3?x$VR9zK}RruLai#r_VIMsr1Nvjl6d1H;wnpnicaRle!W5QPJL$auRGl zRvJIRS3lNPei)O{RafGlc-S>)7QX;zaxFa1`qoSntF1BkUa;6L3`VP^v}2e*<^|#t zq$+tqyg{6Q?!q&qzsnKV>KO70rV7>KCIM#u@hCeC~PfU7RfnM1lCnrdsVBWLd} zW)GVFX)e6ApMmEV3GSik#o&!BU*F=r=^+PxLoS-+!HB#c`f2tH5Xnxk++l zCSYVdTL=A`%4ZY2B{xz|#df)BeVfiqY3%{7E&qi`RYU8E^G(IYSa0PMjlCxqZRyR^ zYe4(Du{;7Zd!zQ^v!)U^X3I+rM`xGXh{#g18}eAP@tW*XV1Vz7=+cRp27FS9sPme4 zBflqoMy3&~{3r*_K*-cft0=WbllZK-QclrT(Mm9BTel!g7;qUnOF!}w%!xxQeEF;) zr>#HL@p*zVR_1p8Y}13mla%W8ukVd1nf@9A-Mnl+hi-141mRs3tpz?f0*xE*?cE=R z&hKG(EJ(U-;4Zj-EyY_z@o@M_ks}xT#+M!v(V`ax#Vv6@8%O>_ zMDYra8k&V&gVeDJ7UI0D>-FYm223zBKY$~(6zu;)5B9&LK{BxXH>&v&j+N7b_`O%f zJ^tfd$!OLwC9GI6RI5pB<>ocuT6-lBABGrUO>Zbiz|oGL+svtf1o6l{M+sbo;l%l} zwA{>N$584)VN&tyjAMLJc)-kL#9_s+PvfP_*unep_1CRIFDKH^DW&4*>)|~JNH61_ zU^Tp_TEfEY;rI=C>+6$Fexu4@dLQGf@pG|qP^gw@{7%OCGjjKfXWoA}_yt9lx{8y- zP24J<2iJJeao+UFrGu=e$-;V@Mv$xh2|>d=kSI|iyC+ebB-3UnJgcAZIwJW?3X?Ap zWS*`Vyo%8cPkW;u^7bDs6n-c;%3UOJCWj+=pUS;9$;pEna*c49O2-t8QvYffv)l8~ zl$vc#rX1xo&5gmR&1}CjWqJCtO#A8X>%;wqvYcsdM5M7N5&6T>NO?Lxh zz$buT2636*5Smx4FS$5lwtT!{ zn8d=djBK8L#}RDPYw?#3YMLqdz;%OuOg)@i!Is54A`RQ7DnR6IAne7$>1^EQ^b;9s z7;5NnPFdzVyvH{nvZpVa{Pu-ga(FFC%IyirHk;SWqx*^x0-0()Dj>xMseLKD6FkA1 z?1AzGxdo-@^Y}qowcrQDWE=8(EsTd0^$6$!!4l30N{`gms< ziC0*1cz(lvZ-E7y$I;aB`6H5fwco5&fgTX;uD5)Xsoa&rzWC|&-4p8K)rx1F#r%k- zXQ0}e(yTTz>sV_+SoUGbzI2I;BJT~%VVPAgr+~SE9@)$h;|@W3@aV_@nH_}uUvJB0 zvjZ#$27xhXHGV#u!#|@ONtnuN)-KbA5+-wrF!}N3c3QZMc`Q7(;vkM0x0JT~CUf9z z&k>1AYl$<;X|t6fs3LqCsfIKa(b84`97U+@A>km8kT^VkW`W?A+g?A1EW?;qkXCqr z{#;rBC^{>?^gZ*}){Y)c+Bx4z2Zp>sk7gFRfWoR2cBLOL-Ktx-$TIf6(lO`1O2kv* zDe64AKHNm46=%;pKR`wd9fFDQCAh6*`bXqw%P^IG2+?2=IkPVCvkXjNU8szmVGr8& zw;HhSHF?GBgWf*7(~D)rFVkR-;13`rUcqoExWhA2yPSA~LoN;~Ioez!&hJ|RHjt2N zx{|jgFJq&AR#Fh&+TH-SS-!-^;Y^H`hv(dT?u?p=1@U6tv8cs%OEVF#VtCpH9;KzU z(vknLn!Pg9&}ENpZ-Gs01JD^kY)-LZJWum9y;v`6Eh>;QnqzPT;_IF&Y; zQ6L6uX~ltVZO&Jv;ic~t&uaUSV>;D??^W9#KLDwajqg=7aGxgp1R!o}aMHv6Q4?Wh z_gO3wPGYBJFhkRKw|eOF8e{CArqlrkY>`?FfVM$~b&TXI?#m)_hjCSwrsbOEjImBz z#9aqrB*L|^)>4A}TPSQ^6NhlCUG{BpY7y4mN6JRzO@cf`s7u2aEYaD zUh)ud!ru4w>3abImoI$sM$qZ4%McG6jUU|c<+6MG9ynv?--6_=iHLuGI&x?W38Dk3f7aJ#9nJ`%4| zQZ_s6H+);0=YQE!Zb6P>M1~jw)@)~2pXpM=94B;OvW?bguK(~7FPcapzUB_MBjuk{ zJN@)mENKe!2=Mgg|o1O?p zL1%D*x{Y+@^7gU~_GG`DtT27gY65PV-CG&4evpvHtZggg3{gVCM)4i<&Q~&DVP=f*K?-E)OinScnO!sXI?ed6vhUnA155X&I?- z|FeOAX;Z$px1A!8W!^;#m1MuJ*W1|(MEu-%o7A!2-lMDUa+`UHrBr2>|sodb1W@hhkM*Ynq{?RuiqXOfj^*g`y*gPW5FOvvJl6RS3 zl15juTcd#88_9pSHuAw1e|#}tuQ`h*r*!*jN)^ zVFpCI$5n9YdE}Io3|caLXHAe^O2wHVaVdF9cw>-h=HrdOjlM5hq}1W#U3yAIvxnUO zTFuHpq9^WD&dH$|9Q|zR_2Pixa~NL;yO!vzT~PXn>o#Y@T8s`{&$P2ui}r&=poBZ!zi)AYs>famUnpf<`ow}B(O2uC6c$CMaG{w#WB_*Io316+flB5 z^bCRdv9*D-x=cMgT;6Cq`of=RDdhtmn_gv02bja@{&aZGd~SVySCv!49dKGSSY^(U za)eOk;sc_`A*!}lXs4$+?KPffhF{{aV~HSH&myk+i42_YJnfZioK8r5ykgM+zSM1G z-ja3@&`Q9ckF-9$Agh^b^2;qgHdJk=9-=B3gv?|#5W0w%;fKxD8M6(!sXJD?J%FwG zm(b7lkx;wK>#;|r3OOcLc@vG$qsZ;5;NYbz!*WE_4W@)L3$~28Wq$A>OxE8$L@0`J zDa9dAZLa@3@Ct_{$g)Iw{0SON>i5bbS83N^*<56Q=v&N|!xwnq`Rq6@v!etms#-JW zXpC5|M{S>ClCNStr%&l9KT|TNzh>@?z4Lq;##Tjb;AK&FnQPhdEveku2K#~!*K6^F zhjYmf!`}mWee%Ms_AD214FQaCgaMT34eSK6XB&pg(K)>PfW14j;zh$KQ1ko}n$Do{ zL^hdidMYd`Lt*kB?I>1#xd?``A0t$rXlEtPC!`Xqblm@+2+g)D2-8VRcMc=Azl|w5 zsI7F(EnHo*x7DE)bbS$#DBnlMG_84!NcA$oW?-Ca1lRJ}OgPU5;F3Hav!>6TBVWdl zWDh0dk0Mw7O<2USQy(2+YHgq%sr>!d68Q|ityh$8K4scF&p+_JO85`Swk8Z8{230{ zKL~%n`C6F3kZ;^ta&5Txl=bVL@{i}2i6p!D(WhXRV(JH%Ip=|mfS^_Uri4N1G;_SFdqohuElls zB-FxqMvN@Ao>G zUThU^m7e0?f%DQkn?L)w-htTzBg1!fwps6Mp~I~EoszyHNN z_U4x!w3`YRr1T4OiYQRkU%$gCHpfj4oy`Sf;KtNMrdQJOVFn5;p3lhu;rD>y@ z66Q#RUG_1p>3janT!N?npH3;{W{-aqt z91;8ROsR^A_2uH{d!L~H^>-WpUw=0#3*)c9TLM}lNn)BGaI4l%#<44eFVX5{3T?-i zm+##vzUW7G`p4J%@fVTkH*1Q3bj$|R2 zOw%+teGtMBdHip}^}kB9BLeZEB;x-Er_i-0wura|v`n<$!rla%ga<=*M5K`1Pi4nLFLO+nUk|?shIrdWC-fK~z zPsqKQB;?!<4ZRyxpk2sV2J9f$zd}T_-}Y?nwb+R1E?^`sB2f!Qxqzl1LO;YK9sra9 z`onpq1Gb(?7u=Q$(&lHO#ED$uss==eEFagNt`X!tuNhI$Cv2&02nqq-GNEBn7cBso z%<)HcXqm2;1O3(L`wNl`%P-l7W9v4f$Kv(t-^K)(fZ6mb>%!c_0_oLJ@4ID9qS!4&+VVNza;QQ563UNmio6`@@7sO>D_F?gwTTOLIK=DD{ zb(H+Ot%u(*chhl}&`%SU-L?A9{D~s@A`Ht@XQ{0r|c>S<`*v?0pScwfumJ zd9xbF+-HEY>FzZFR(3@8JWe;L4k$6{)>6P3G$9R)07k+33>C+JU6 zqOZBKr+k7wn(JVCKfY7-0t)H{VLaJYsJTJA!!QS6tc0Jt^#UEXPn^^38RXnl=hU)6 zJdF?LZF5Hub}l+P5T!!<8L+3{Kd`?Yp1b|wey20%kiR~M{d9Rgzw+eK0|kdJ7MH%# zJhS!nh5HvpAxsEcc$jK%KC~xW(B4i9tg*h;w2{3C2b#47nAFy)y64GOW4j%y3Mn*0 z0XS4bW+z9kC-ToIt98hP`{au~%Hn;K@{sP9%( z38oBB&`+rN11m;9Y_nH~CCoqe6%^=!kLVu>%F%jLI#)nr)rKsmI_ZD0U}gU>6qy~)6z1<8jqB!{@CKasZ=e4Im9 z|Jc@f#-pmkv|G?7$6Gh#T>Ol|Okxxgy2%;E5$oQranD|vdr-ZEbVPPYDK$G_N8-<8 zolYFXvgltcqah$bjD7~F`-kE>_;KI9bFe%_0&Qdn z&C|9M~J&YMy@+dRxdL;v>fD zI-qNcy>#l_pzArnZ44k$L!|Z1G*l1$91R-*uHkCNQ`|WcVt0+=a>H`QUA);3p8p$M z>jB!vafJBpFF9l#2N~cyDI)HTlC+KjK9V)?bO7|9?&+R8Eca;q3Py32v5mOfFBLJwkU7Wi3<5r*bvB8O9g zOFo8q1v-QWKB>7x=oFTVrAAGsz`(|`V<1wC^7(z84S{a&?;_3&YUthnUKqL*=oq&3 z{?Jra0gZGRc6E))M&Sd8}Iy5SLCAR!OYF;jtUr1mJq?4gZTv&8pOgM zjYk|1Y|!nS9r8^GR!=Ez@ruoXImNH=C(@ELo-xb*$`I6T`2ogdL574X+;hvE(tOOp zr1=VuN7Ec!GL}ATVh**+gZze@`~ms?K7r9CKaK7SU5&^TfK!CeC208zYyEhd@B!px z&OXo_|7LUw9cas90?&5r9W8E%9*jBM#hb%~Q(~!YD1f@;ObQ#yq~Y?C!jePDIo?5- z(mt|nk9-ak$Ujf^3gPmcg)vJL7?~Ro9m5Yp9LndO*IR1_^V<`Rz$@LJ~&TaT1QWG z-b{j-OSJ#5taNY^I6JLTs6qz%I(%ENw9HiXpwW`m5P3bvMzJSL9j&zRC{(r*f-1OC zJXp;%p~6=_lysBex8SQWl`f&mTGuN|=$a$8SiB_0pMz!f7u zXekov=7}B$L*)uMa1cROdyDxxttb;HSf=RCN9j2;wU_V&UvXo+Xn@+AIKDy0Fm<9E zB{Nn7ZVs@{2Pi*T^)Iy{gH=V=u;MU)r1UQ17V(jdqz}(m0iJNkHU^Kkx@ynOO7m{u zi1hetZ1rCfzu-UT3U@vEO-03GmOU-2*K=B;s;OfysldxV>aI7uppW1cRG1xS@My5h zSNlbQf>~>gQdJ#FB-HJ+7fMC?3r@$~wwg|-@XcM*Mbt@s)4G7quzDYlZSZ7xFQoL`OMC5>n^F75B#Y^~XUTYpF7t*y<@ps7d@KS*Q3pSROAhCo0D6{=%W6^rz)0tzvb>g+z@VB=dpglM}fAI!iQU+Mg5#^*={S(pFZBcrFB_3px z(w?p(hntD1s{CIjcfj>U5B<7CtONR8=Mp%~%}=D<2V0r(zLKImI|k+=cH?&N%QN$M zN6W=_J5`1l&Lk zRlZoW4hM^|WU3-k4|NLWa10pCBDvh}JPZiX_fW(=<+Gr>KF;~lcBwHhBS&Zzy3=~F z$Qve^)inOW^IMQV@!y8Rn1d2QukYv>lYVp^5#~2szf{#tH;nNR1iU5$ui)=;tu}YP zj(2yxxoOcIxC7(e^!3>A;AD8Oi3LnmbWAZ6LBhD~&+^lJ?UzXeeDpX%-hAO~M6QeL zwHuT4j~$!zMp|6n>JqAii6G#6Dy^A6UpRiU{h(SEBv10z;)!R9ff1|`nh^stG#3V* z0PH=tO)jhwhyZ`|Y>z_$I=W#~FuCXhHATdWI5?@kthmkWoGwi^cT>X<<83BoEI~40 zKDlI!LNG8W7~3P(BcNSfjmqBug4O6`R39TT{Hy8*CU9B!9Nl~iPA8q*{P_M-Q)Jy9 z@Vq3|vIQgg__lcYg@_`l?3k!?w9vEQa)x8PENhupgToT;` z#z}#T`RC-K`6w4&F*$#Oxj+a0G;K>)wyU?dqoY?CZrKhe2gK{^1+3=u%2u9tQ;+we zv^&*^pOkvZMwW_P%qxpLs%M}A1CQ>Wmn4b7z=eYu1(_`HFytvLu)d%vXU_ye4C@VC zoQMKVkf%KRU&&H@;h)eoBmFNW#ec@_WM*UfAJFwt9nIt|HYC6NsyBF_6dla44v!J} zZb`P|S`%tFvea-Be3Mu+9__qD+E}O0k1H`?1kr;%ftEumdBqWNm*NHeV#fr0dituS zA%EOMQPt(!_A`&hEgikj`y!8?p4Zc-O; zI(&ea9eG>F_HeFf?yqX*{=V*>S64-vA8nnVkNX4dio4(D<0TeAx` z!SzyrU8z-7`}V||jli@h_EKsrRaBnZElrnDV^dmZ<97NQgb@d=VUbvdu_;*V)qlaQ z#VZ$ZQl!){WrqeRH}MXQ}^zhE9-Vd7G= z1?8Fjd{t`FH8*k)FdIuZOF}`?H5&Wy-0F9N$MrnC)TC?U{%|&>sXR$na^oi^s3TAT z4M{bK(Y3%I7}^HE*J*$?iq<|wU5VW%=)7~;+Pk_%iX07o@7S>j|5u1Ja~1Xc1ON6k za%P8EvAcfZw%gQr8jh`h$Vrtp@7BsS{FVM68Ba;+d6N4p2VX_^HFAeqtw9EsrbDl9 z0GSE~XvewcVIUFk_J`xd^880#$1+)angQFS5TZ{15SXPm58ux2->o!7-!*EFTRSoM zGmi87T zXWr|(!AkM&%fel5Emdug->_E2*4=tqKv|~(pdGTPGj@)O=~cK7u_^DMSjR=ot=B5t zO(%e;%eJ0PV><`6+lmS33H8gtf(Usv@++e?7}X2G`5(u)j|B?*73%~gHd|W!AZ!W= zPOGZwP>`Ccs&3~Qs)j^gjG#oV-BPEkXv9@bXqu>@A5&2QNnXnMe-;J+W3U#V~b?(Q=AqRUzUszdn z*7>lFUI~^i3zGhuR63n?MDxd0)zV@V8DV?jf(LQIf>)LR5AWl|GBRB)sYX6z_A<8|77i3_OzzP9T=VoYfudtx zlu{PW@pBzM^onz!=n$n5^WdzS5a4T`TWpjW! zEGFBa)dOe|V`<0J8ph<+)P)mj#&FVVVDYUG!7vEL14^CYmmU_=jQ2RaEQh~B;tm#L z!mL834PDA~gwGP!A1HFGWAWNiWDUR~4mGT}c2k?i~Oi)C_&6Hm;ccIBoDnpLBLbRt>6FQj%RTN<3R= z4ITy;MH}Y=kAJUD!o{*72#x6nhXC+=G(evMWo|mc z#cg}mBJJ}*N}mG#wtOQljX1t=@5l&=R`YU{!~V6IKYYl{*aYzp>hMBAqGIk=@-X#< zQ#H7h-><)3TS3I%n8g2i#RJhGghRmJEwoORl3zD&U>PqRN=P2O<7o^#Ag<(%8dsCj z_hoM9YaNPTUrn^4 z@rF#osL|zJ7|g0+)>CZW44JG&QODDDL{5!WR|Fb2umpmR8zc!H@HB!A6j$;F8LP&> zJ^#oTj7E2+E}+sme`@6((nv}*v4Kf5yObcc1?_cq>d>uq%p9_V?<9?82!3!ubdZja zJUL4&v^szxlgJtT?KK!O$)KT{eA1vv&IAPxs0If-B7Uf*agaLCTHMhRs~L`13M`iS z7z;0c#O#(s9az{zeu`Lx%<#;ID@t0~vm}LW1dYAzi8GSH))|z&Ro@|_9mgzMe8`d> z?>>znuALl1Iz@sttsR8({u#vN?dZI*2iK}3mFz*p0~+jH4Jp02-#mEdMULN>C?gDWub z?y`)~#(^_{$-s1jM!cBk2ITwxaPc()#H{qg}VSkQ|XsYJfw6c+?@ z%0$LrWbDZhHq{`wyeca)$)2IydB=+r{vZ-;3~{67SiHZ94Eky`jvnLyT%0||j0?lu z3sFhNX(_TBE``I~i`=z`k-_6$J&q1o zljkC7Q07eH0xZdi45>@OiA`^I28a%;KZ^FrpiBt;o~9DcftpgCk(MT~Z8*1nbm! zBVc0a7z4&D2E_&d>;${}xJ;@Ej#x>{2zmStDXk<<6 zkQZU7P9s@G@FcGg->kEJmS$0!-sZ|XS1K^^=AT;mgtU`fNyZ(#m;lj=Yx36ORk79& z<+odXOyj4#$S6)N6)$q!qYQCKH8z?!;vtbv9ZRsLjDtu#F3%(HGinYq(J*X5 z<7+RZGfq@}Phn^v#~dx;)M>rsz`}orB2xSa-17;MdAF*^AfYy8Mm}XfBT)*OVeg$? zhZF~BI@yy1rB^8N^j{rMhH6kd8O9)EA#Juu!wdq)cd@F*M^cHPzPdaL-wB?)m<>RI zrx6(fI70R11drk1Dh>gSxKDusAhY_QFFe*_PGO8(0i=55s+6b58x}pnYG<(vClc{I3G1Gi?|6JKBFePNG<& zXXHKZ&yPfP5x1<~Z5j2oL1p9znip5$X1jh$L|fiitO&+f-&XS-3H4i0uNzFNjc82u zCGchb^k=-NI#Z(f8n{4$-_8f`34j>;rpK8dV-i3%cdcc z_kW~xWE4ipE3NGo-ur}v_2{sY?_@{0d1iyY(SWI+%y7bS6jL!|UfruMfPL7W@h4`~ zqax%t&RG-~W)u$`YTgu6oJR3>e~|qVB`9Z%({q0{Ib&TKNBIUr7V0+HGk9i!&=mg{ zOP#LwA=s4%@W%yH)kUVRyQ^wUI9b%S>cYxi70dMLnZ8;^=*eb&Bc0FZtcNgV)JHf9`j_#cKe^j$Nm}p7Zl;P&I?j`>UUqvhZ#H^ z)H`n6RUBV32|B);HqSTDE7)v_{CqBBh6NrtRz7A#_MK4@E7LTf_Rsi)8h4IE4IY~T zE!;`ZQ2mxbaDSF8IN4dOO+Q>FesoSp*GYCkV-l)PWx^UL`(PiIDTYOV?Q?zk%GCS3H3(m93!vm30p_|B6qUmqK7xN@{vQ*J;!Brh^N+uG#YoiZkA`h# zj^XwIW=#|2B^D)qnCtZ>&qNOMo+if+Ce!CG!m-5z___aJ`*BtkHlA0p#;^mPM|nXz zyIvAGVfo+a(ADzZ8pZ2L@1ltY(Pr_}IsCNmox?&R=n|UPjBh-J1MdR-85sBuMspSt z*Ivi;1>Sd2aH;pt&~ze+{6*ib`o@R;g1^Wq{xsKNV0clhj)b&3Jn_4{w?d<7vk%>{ z2CiPr=*9o&=OjRzYwY^pP&wsiYTLLyGuwI<4tM6oM*T&Y z>rRS{4ElzjX;r8AU&_w^428?c{y)pk6)au*Ewy1{jYx$0Wu*|((W^vI{)vi zc|LN|w=msz)|}pOocY7Xm)s)Y8H)ktYzf(So_W#(o{t#mtr#owZ}3+#t3zREX^zHB z#UF{X3Su3F;;*KQyUNK&C4X-4ojtmBjw)rMQXWFwNL(?bv$)SyVoLQCuZ{(J!qL!iWRsb*GIdMf z%8hdhg)WPRD}bkf;(Dkx9Y}9PXn@BVR~3vQ*#F(=EGF@IE%aRm{t?ywdpsLA31Qvh&=Fq#|z#l!O zt7G_9B}bUg3pT%b!LW*4&s?RQ(<7-fH{o%a1X?COaGYN`m*+bmrBkw!GJV3;t13x5 zz&BjpFOKpVF9DCSGYlmf`oXBN?+XwbpXzZ1NkBj8434I=Z1tMZY3{knBO{>&DP`lX z2`{tkLlbby*;~S}c-_E9N8Zwx3HahLTx%D8S!Ms~Ogd}xsQnB>WyqlL$A@YwZjA6c zgkmj*%QT^SkTAg3*dPX5z%rb}26N;NDXS&pMPDF9$tV?9-U9fR06o%GoVZZ1ay9(u zKyyyD+lDENdB&E?R8`}@j3pyj8g}A9xB``PS5LU|1*|>%7SeLPp>{*nX`O?hZ&!p3o&E{Vx2YxZZ9 zB$__$9snu&3{yxwIz*GGKtsfK0pyVKqJR?$q|iL*I2Ta_nDSFMsx^2^_nwL9uVq`5 z@$myVwbX9ci9m7K*|RqK;W4Ar$5_cT$GUK%kpap1TpY|f-zz3O4ipGFDdEOgK0T>x z^YD^8)Cmbr`k=&Fc0mQc7LoH`yrM=459$I~zchh_`uz>;s(LJSY-&4h(7ud<}$NPn7HVy?(F!8`Hp>??2_(5*GyP&^~BiWR?AW%#d zBSg#kzuOhG7CNJ9LoH&P7Pv!AKent=er=fh6qMF$Mt^|BrSKiuSbsQb{@%m2Ztnup za92O*n2sdw4OxpnXynv+MnYM;|KM{&OyNSY*|hq=Qam1OvM=KvMe{gB?QmFp7WL&? z(QqeV2fsgL9Ng)_f6t9`qv3H5o*MPp!aI={{D8wZDu+j(yC?2F?P2j$N~@yoWb+z(V@Thb-fk+n{(~G8!^6P}WIMq9pWklOjwp$Ns)`%sm<pE^52Ze7{+O@>&`Udh);HT6=CgXRmD7)R+?j5!TsuV=H| zQ+y@6P0Vl5(*hu&*yQfkoh$$+-ltDZsz^lpmWX&hz!c2!!YjZrPXh^NJ`7|N?Tmk9*j2NcZMkhxYDL9jVuWU`LIgX zISg#KBp^d_ zw)8m1O`;J{+n_PJX)CG~ZEd^HYT7@5Nm{mA|KF{Ujp09|fBwI5Kr_Eo_$`iWUgkIW ztZww~C5D6Yk?keDXS;Iljh!u9Z+7-AZwK4aGdbhd#vQhg3wQug$u?2W#(!nGk<^h0 zfd2)CFW}3|E1?{3(~3|A?S&9~75K1@C|C!j$F` zD*sJm=8#S>;037uYNK_~Ow@^6y#RtQcjDo%O{2!`gUbdmL)%Qn5+FCmC$VEPq$;tq z7^7KkN3ggKot!Ds$esq`_i|>B${i^BXYu8=8S8X_x=Xnji9Vn8cdot>l*H>NXZS2af_cS5$&bZW9C((BwE1bU?*Cp@Ab8X_Y2>J$PI zj@n&i#Usa^k7i92_gv#d3&ChzOTSEj@|gt}ZJM+RX7AEOt?UDXW-s-=U!p+yMnwhz zO>bKtb=o?y5k)<+%@?~w+mNP5AVB)2A&YtF&OGHpa&Iy6LSO~(50!frqoWpyr!*bQS1)1&+ zf%yqLV(KtNnN37jhL!~k#xOz=xFw-ep~I%K9aDwC@8Kez)BWWb{OBAPB1WByynp^t zU(00gij`*4+>E8OKJx>UK`zIYrTFyq2m-2{^EF^=xL**9e~qUgke9qT);TU%dz$Jm z$^;Z9fPKK52AX7K+Tj)cNGK&;>1;;7ZJ4WmUF96iz^=DlQv|a$skE(uiTEBt23&8b z`LKC!7R|}UL{A5e`RM4YOw2refM76YpEg%`un5eEbr6zsbUG-nhkkEV8oCZU5?kO> zp`sa;!sRvSXYXfe5*D=~LaLP=1m zk@}ok2@k#kJDmdTtRVjE7Zx)qtPk|$P!?&<%#=LG6G-a_wN~$4;=JT@AAXgVabnU*1xtK5krnY0iGs`&d@Ny{2)tGE zlfG;$&=>wE2%kNbgLBDJMj$ygEgKyXAV|rxddT^-?k#Bdl^KK#fOoO`CJ?{u^7AX`Io>wK3czMH1GL!Ab&Y<^K0_3GBJN^)oCdm+(l0)pna{ zG<*Sh<^E#uXr%R%ldKc!D!Xn>QrKxMM~5 z-&>H7+Z7WDqHQ>U`y;jyipYr&yvcH_{OouNMXnM_(;OEJYl+2<%9OaAa^F?oHJ~Hg zB7?Pd9?QluF2Q;Ev0b~jQ&{(T#a&r#n?t{8w>5es^h_37qT!~xX;kUPH%!t@Vq6YYebaJBRyB)w zn^o`ud|fqRnCc(=&PO{$^`{)*u^ksqx~fZu{-$jBoerUGuzXq9;=*>gFr~?KN zU6RAaB)7k~>*r3bJ1OOLw!tj0cJ=5Fe0woQWPX*C7lmuxu3jGfRaKvj+B=*EZfgd4 zF9u}eF&TqKXFm?gbib)3M@aH3XuGt<*^`%fjP6G(Xu_2czd zp)0kRe6A~cj8&vnV7Hl-wir6aUV&`rlrHsg{|X%(oSu{!kiv*eul#JnbKn6Sw-Gx= z(QXyAXhQse?rd3Y>xz8~tHY~=*W~oe%eFqaaslo5RelYU`Qj?=FCHSk4Dryq%?|&v zq)^TVTd5qOv`S>Lm3I{$cGgidSX~ch^=OkPh$^i^|2X+-?5KOLZxxO!Ot!1EswR}T zMCpJ>P1Q6M0^)b@gp_M$)mUf!gp%70J4}LEa+FoL zsxKLz)rLqg!!OsdUazL7@~Z~at%f?c$~=Ly|LI410jS!%IB^lyR7a6_FgEDL*$Z%q z6~d?@hJ!gAV5+hcak(c6un-I9I6s7k#yO_ROpES%Ub>qXC0QxVv|*vIe5b=o)L_V- zLP)%8m2}hr?kgjCK_I3WS|>YUFQ2nkPo@=z{*{z15A8t~0z8u|S=~mB&@t}5CA5#UeOY@4vjX za)0_=``Bq*KF)*he=x{Y@!<@*k@MAYa*W-6cyG4fj}slz?OYZ!C*u>96SAwBG;yB4 zvlcT4s*aSgb8P_&Z95Y12BJrJFUjk-w17`89hD7>OPg^|T5tN2n7A=M4cdg92%U0p zi&w26hq05JcQ>i#|1r!FmBB0@Ib=H!hsx#0LhSSj9riLB*$-)DTEEiiw#0p*`12E! zId;;yP1ePIwl1r)TxF4sJIk{PQ6We9Z{dB$!^W8GQ6Vx0kH`g>HdpyTfmUk?r$+Pw zc%ubfs=Kz~u;d;jZ_^72?LeJJ#hYC53gg5NVI23^E$pL8p~{c#-ggUgy{cG^YObVm zJ(CrFMLTqHerL07Tk`Zeu*y?l318-z^=e;5kAB*?T45*&L~!2j@q^blX#jVW`X+q= z7`MewwFss-_tcMYgJDs1oz*?xhvE8huD94&a=fk#fM2!F=0xj)-;K^c7e1lQcF-wLlTJES~vos;7d*IYH*^&-g1KHHwFMc9L2BbUliIoc|QJ* zzie3MG({<>L|q>a-ogNN6P9X{!rLm8qzbC;R~Qfe{+gz0)W=NSO!BKdKR#Yh=81dv zjZuC%dA}gM{QNwh9j+Epu4auWG##^(Jhhxfz|SCug4jPogRLkm-GEdi)Q~e$nh0v9 zsRUfbF%*_rz8**5f;43?Sn3gKP=*NFJMe|7yfqB{B?&`YDBe}vo4n4%6JkMrL!^J{)% z`JJ-!BPU$x$n*E?IeVu&JBQhSGUxUvg+rczu5Wi-B5zJMPIYAH?v9U9`TX}Zo^%Qi zY?HczDx@nDlwMBOag(i?cD4Ye7t=24HDQoN~FOxnYG z52WQj_ijmX7GTsVXWR^SksmvgHW@E^sEPZWf9%3wX8_Fq8BkDu54w`0n~#MtsM zr*E@Uv(zx`v#(_rZ^U(v^tHspkN0kUK+*){>6&_)&J9zH#&396JNE1QK3>qgd~K^Q z)46C|NSt-zNrA_^F^zR(Nnw68M=A8FP{ladB0UXR{bJFVUqSztsCbt#XrW+yaahqC@}K$| z<$2k6)gH4KY@d{_+>Qm1F|Esu7cvJM=9uXyR6n7N19^9QT?Y08TvNYt^S|J7xpZW& zk!|XvJsC?m!}=)mjP${3jseLeQG4{q10;vkill@?GJuY4(hiWA2J*mx84&%~*#3PE zU9}JHyvn&00w`l#Z(&2@obf}n-?#4Feg<8&53v7!B5-lC7nhRcuw-v*u6{RIR*No{ zRT9GupuSpqh&PUvjK6?|^(~NQe1Zy}Z?ThsD3t;Tw=5- z!9X!9*%^ESmo3}xGt&(ut$bp$cyGTwFdV*LF-J}SG?q5Cw!&KLP&_civ59?Lv-M-< zcFUzrMk_2n-=YXp)DCHrZ$7Dsc|$`4<4TYJgVWEYP?FHy(3ML`;QWy;<`v@91n}B( zD1xQN^qV0=fr`coLsF{zeecuBv9+%!t9b0QA!lZHZzH9D_;%G8xl;j38^6%DOxMEP>~K>==A-D zqYyK0tI`ft#mCW;#w?r{v)>|YN%yqjCVu4rFoNIXul?TsgCEMN-^8_po@7dkBPx9I zMr37c4c5n|!oww3`-a`8HY?;^gzj+c?G=cuMrLpSEMrndj%+hzI_RdQ`Rn8a`@_9( zF3GvsFU<4HKz;4@+I?%iheKR^6Jwh7@4jVua?@Pd)KgKMNtRvzK3gV3{cs~ze3(Z% z4>eWC2*$DE(k&oXTyi|h9?2Qs;m_&PZJ_7x{DSarMDkHy4^9MAjt(vao4)QF40mUE zBlj>CkhkCailtnCGut6DI1b+y?CdN8FQ;9cJe)qMuAFHY9)9v}0gSGuVUJ7B@fmrt z8UH>K#+%R}7#KG=W`KVlu&(2*bg|F*leylg1yGIJq~%c!6K9e<59a56#s2&h+`hmA z9JafRi5ko(?A*=NiFTSY8EM?L=4_wV+nAfB7yH}}Ys-}ij!o?v!Fx6uU^n6rIh+7Z z&xP0HxEIJ6%itx~_gG_NGYhl9D{VoVLDMkJ#*ling`|!|9gQ#63YT6s`7W`-6}S-J z%5i+I#rUQmBpFl|+_@;SC?%cmK~;|Fim zScU-zIZbrzv_Ql(&s*ip!CDx_t8(f<)j;({u)-PG=vFw#K*$d-L@ z_g(Hkp%qTU4tw}Xgv#&8fm$D04xWC458B(1&p3bG_A{BL?u8nNz|%^EgH z_zE^_63vCpnzglmR#@@8wt{MbdWX8Eo#jR}58AB@I@lCrLT$W%#q-3{|MA3-xvCGJ zuDaxM+0Ui z*rthDw}HzVO2s5z4O}d5EMLV)=wb(1tImfH0%yzMN=`ObWvfK0qKYpXz<5T67Y=Gz zvpcbU1yZ+Q$xb3xXM=E-Ag(_u)C?m`f3x2@Jo85_xyqY_E^R9VvMG~d7kV(LuACoRFO2{%ppFormn3qPrLO! zddAvy9ooW;ucx5Ovi+h32<=uviEg2HM*raw+b*)x-@72XraX z8lsIg{yKbCs1xX|85ul+i*LRxed&nno8VQ~nPNeGuBeO`1v{3kewv~}!mZv)I531c z_e+&!ATe@1Y6cV@6ke{-8xYAnqkQH2@6W_vnJnYiwHT?Xe`mP37=LHI6IJm3^ z$N1dAv$eH~vGa*7OIlQy&Hiy+qG!J6H@We{FoEjBb=lAD9!V7wQdHRmC{8YSsicel z9*hTo9iJ#wGMLuC3&s!hB&Y8#*xP#v`9iN|!8#h`^PpAziXHn=$9kfQ1-g`^2NQHO z-^C%nmf*iTWz_a6@iG-P|AMcZ{^Uz-G83YRp#eKd@Z&ckRa54PK_ZqiydJM&z{2~K z$TkX0Mex6WFWQ$Zp{K{fBQI3F%O4CI9_9--lreVP*A084&+ucq{a+6C{}~RLk%Q%b zh`X<}cI>y=VEp;_zQK7n2a7a!)n1m-WCIC-SII{47L7V|a#)0&+W#JNnfQN6Og{U* z9wLcbel!3unna>eCcP&XT~B$W+`;_xB+wY6<;_aBQH&My!>!x!c)4=neff}NBJeC- zK05Ir38XU)It_!maN2gvY@E@~_wr6`tRS73s6U=ewYMKGXbvsPUp}tg{ezu;wc~kj zN_QpTf>BX3nPjkv)`46Q%69~9a!l6r;G$gzDq&c39L$;MnAWW8G#7HR{?|Me90jQ) zDQz-Il)01z!Cq!hJcX^Y^UfsY9E(2;p7ltoAPdww?2t;7e(BfyQJknuZ41t&}7${0_L3|+xf>)%Kwd)S7qXytaU=yt0MVgnS}k8KVMEs zl=kwiy(54<45S*frNN$Syf0{{j4RXN^ayI#K6*n}xL#g605Q*dr!_!rl+U6&5=~DC z%EctGt~XwFjQ3T1%y|<5jt#^%RK_WhIUAaeG&w35no_T6y!Te&P5{+O8-8Uv>eNk~ zW4oD)d_3*55n+B5o(81b5TD=B_%3)Sed0F-cmV7}v%R^nURJEEcu!CLa)OA zOyb?T@fuTxM$8K|N*L2=C~-Ny0nP@RBtoUK8httf^a{jb&~AZAaLdJSElzBMO_LI| zOw2lD@RK8&B-W{}2kUa75>-~C$b(yTqW0f8Bzz^1CBq;#i5knxsiYgF;nImD9QDX?immT4W?Hj03kHI z78OO>?#1r1+3j`ap}3IkYc zas3Hj2u#advjBs3%(|MOR*<)`L&V!M!Rx9p3V|HNETVsV&?5y~1Zl@K(@zR2Nc@R-k_!6twQE-OW1nrAmL+GmbL2|^td=zfFZ;FgdY=Z=@F4FX^ z+@5h1*cWM0$e!$*17v>89iS_>yx)_<%S3&+3HDy-!787Ar%J$wFFfp!lt^D)xLKx! z3iXF%kduk{ii@x}!#LRJ2~BCMMUv~z@|G@Ei@M}d>`Pnkr&hG~n!fhwS?Q)mS1WJm zrdLn7!j||$hjkO)4dL6XpU$d@zh{!>xKH6nWf-r@B)i1v`$ z@abBm1E4ejAI<^_2C=jU;DL8cnut$iJSSL;7a!4w&M)-pMBfmoPnLLAl;ATlHno zT~*Ho5_XZ{?49i&SJrf@JSVW+R)Qz)xd!8Kx4Et)R=t2NGtH$t1jDCVYiQ!RA&Ww3 zoF_oNS}f4FsVrar;V3WeELr;~ZW?OT<9u)+A)+s$EEpg;<1Xd!fPOX4o!9OF;M8jv z!$sB;w1a!P%(?FUOV8)R@FiSa{RZ6h^acp`n(NJqEbOm(i+A+%liq{6%pDlF&URxG zqt0io3!F`6kls4@|1BGFNT;mhkW`2GO^pU=SwG&<)x?pmu1xNL9 zMB)H=p{b~oB2D?x;=Gqn{4rmbafs>PtBiwq2)n8$Z59;Ex7ASV#U7^%EdehxEFbSv zy3z`kiml>`sfbS|6f#aWUb1TpK}&y)+@GkxA@nCy6h#FM@YrGQ*aH4^srt_zs6VOz zd5bmGI|+Dm$Ikapa8Dxa!Ovh9raOw%M8dg;^mJStc_m)Lg{}l>eg&&xNRRkg- zFdLU!`I#8|qbTO6KpDp7R@Y=i;Oid=JMxe)NW*fWG~w6k93-$Yik#LIqJ3sFmtX#+ z^)LT2&$g9W(uD8!v(0U{AD?Rr?)fDTzU||*m5>YH!@px^^E7+-88m-)@q3dPsZDsD z8nju71gI>v%py|7*oY;iF$KsvGa6SYbuh<}U-ggQVikZIi;yiQ;`yGAefDPDxO#?Ix38!^h&N`Eqku*h$k-pR z0_pWw)>$QkO=pb2m#g(nYW6(zb_iK_e&N|yK;}P0rQ4*~vjoPU5HD-(r=n6DHmq2E z?*etGTup`BErJ{+ksIR3H+?Be>DBsQFrDvR620*KfsY?x-~BDusMwf8w+Ffniwr$(CZQHhO+gxqiwtKa0 zTVL;UetqvbZ?b<>o}}_5l~k%`jr*Q+j7z?Y4U9S$77#HO_a@d1A~!FT7Ceb!uY+ip) zzb?v}>3B7>Uw7ZS%blZ#Mwiry^#~uouY2x{iF61^2*?b3x_V#gTh5j3YdtcGLxQsnc zt9FnR>PwY#t*PE6Oy}}@Y#DQwPhX#pEfG5|y%|Tsz5VvZeuL12{+2FF*u^tI0xP)^ z0I95Mi_$-5cfg}j(21uy;Q8>#bo(J_vJ4CyxLL&m?>idm)m61$p4@=lFyu8~+$GTr z2?N(FxYCM(>pk$4&G1XQ)*bU6#=K(_sVn`wi7WkI{OzdaEUec%uRGo^D`A!gY`0Lj z<2u?*t#BB$b(07F7#{ou(Ff|mr2g?(dPV_rUud*_)uKu`3P$pZ4l(dS!c!azXn-FZ z&PnrEINgPK^PZ8IG(RbyYy)LA@X+c+M*9+0yeMT%wG%=t-6oMrgKi8?{)!DSSou(6 zT-U^Eq&i(2NCJz7O89MG|BjI2dOL2Z8i%i~!Kkc(ACING~Vr0&~cCiH`M;-1>MmFPlAjcZ-Bq!ZmC-c5PC zGtWWfu(O-xDou`6T`PN?Vrk7HqS9PPU=*@0JUJOSPd&7}c`df()yO`F6L6ezx(N5N z5@^{?e_tXT2Kt(|{-jV_z8_KANFCOkE!3B`IF({2AYA{-BN1kta(!@Y0G!h7O@k3g zMAqPI3MIU!F8}_p44u%k%U-G31C4)ZZPkwedLbVe+f9kBxdh6xH(^S_sV6@HcEiJ8 zWB!}QtZBddCj^~hp#S{+3Lwv5o=0ewfZ1dm@K^xAJ;U_ush&bMB}3xuRADp!bo8); z1FPwl^rURcX~(0JIjc=*qq?D?&p%&JbIe>0yCf1W^u@%f=XUn+d5G+{^ZVaP+dcOK z_n?xB#TvBc1>_*ySOV0lo?3!U$9I-H2iWlS?U+2$QH_nppFpsCtK@8GMo0-Sa&?~9 z)1c38pP6K*m0vIc1atMcbd$#&>wHI`-?tMi1phcp+tiaG6U zqODA{uBTLMxT5CZlDaI+T4{5N722E}n71~hBpV2hj=bR>3#*QkqB(hM#>3R)LWn{R zD;q~7c&)TNOBE>@RW@?MC+uUSfq=q9+%Ztx-SE7h02nW07W^}$5Q$xNS?xHNMGdH@C*ZJ7 zdgk|iqRcQYJw$e!14QNaXP$~7jg%F@M6Fvf`6|c_X2w3X;#;Wu(+Y)2x(wT-_2J_b zuZ-pEtJQhYi`@Zl!T!si|4Z)>sv{h${5KPMAxa@3Osk#HV zEUAN1`vGHwm{miF#OLHRN$tXXnZn!P1fzQ^+_mr&xa`saIu9s(*3EwSd$A26tV3w< z^*rtR7(p$pJyBu=i!BMR?O_K-e}K*{c9kt0o-xcsQ-KO)=SF5I^+<`%Cock0?21g6 zMLdk)0=@e`&x$JbUG zd~MR=G{2Dy-02`~6IUI~-Sqh}{*JYHam+>Frp;)Dq$xqd>l^T;9$X!p=;K@;FK>Dw z(1$9WH0WhqKLqaDXr*FavI>;38>&iPxR!vS8tZ`?EmGU4dp`rumw)Ge&bV6)dU zuY4!mcoRdenfbADGuO#-%RSN%p43q|JstHFo2Uy>-&g1-#IGZKC)xk(!%BKAOrOQn z+y1IgKK6q3Kyu_R$v{rn!HHX)QFVIn_cK@wL&i*I&B<=Cn@z_4wy|5xP+3spwDpgp z_hia8%?L;T<$flrtv8;8QKbAI*+0TcLkj336^lexN?Y^k#qh~3HAoBiFefdv6YN)D zhgwV6gMa?wSSO4DVueo%g%d@9I;9aDkx+N7ps%+I`*qqreZ7>73> zXe_TE3;f47v6>VrcQ0CBDvBlBL1JlxiZFQPj!2~}uO-_iULMpHtmjC{9yk%jgVBBd zzQowR#961_P+@sh>lokm#!q-sOQT0Sy|?>z_IEmzUF9?^lTS^dj7WA^ayMlY^Eer0 ze5uesk+?VD7QP7;o7g|3N!yP5CoJ=L!IYv}9z~N6e?@Snch;TfwKppxkNN1X&h9?< zwnG_NEb2a#MvP3e9jlW`hOGCQ-}DI0870yn)~w|Cd@AaYs(OimJT?7I-^6u*a)H;6ueIa2g7E_KB?@m!~0i}-m9qnHn!pmF6qbK%M zEL(uz{;L`{*it5F_ii-;X1EFF$tPs_*c>i1z=E(8)+o&+nC@2-p_hyQ_*1MS94QxV6`1*fGq@8*Phw|r^l(Fif=OS^(8(a?Z>3?#qP*E( z4{k)qw{rYNir*qNy?U~{uWdFXak?pHk_aMv%rN$=M|lf^oQkRx?qx`dqUML}QTdDpXwWhG^KD!GuIpRb;IqpMUgn$}b`uf3}SA*Gx z%lc;+nq`5_pR^8wMZY!JbVWhQUiqRBqKulzqHs=9Tb{lqKg6mi?mCY$CDL1~x8Vqy z$4-kcTZ*v}cJ%B-Rz}ayAKUXR_d6YS8E+~wxb@|P3_IPdp&RR?Su&nS9I|D3j!1;G zPs}3b>j~Cb?PjW7W%hSHKl<`<9`&8m+2$$GIP$Xne(xnAva;OM+G9_tb%U4p^1<_) z1mP(OGX*cK*FBl{orFM{oIZi0t@okVu|H$J+O3cgCv7+TB0;k zZ)kD4BzwFtcY8VPuPY?P)l^@H;q z8ix^w+Wl5lfFs31sG)S-rn^=W!6BRk*ptqH)=sxAaF~0{V2Ca)M$4EP`7K%KK&LlA z1XZ52lHB;s*&Qc%4#4_$YNr-ORVchcDGkxtR zoeGvA^M_v0MOSs@xh3I860^7v-U`k_ktbH!$}cliBv8aU^z2mR2MlUHC!%k|A^-(w zBrGr>cyr;;M?tAN)gV<}CtCEEvauiPwZLu8ODv~u2Qth=UC3H@|s1a{-t zs<$3Li%Ahu(OGbD+M6S2kU5R)hmUKqmQQTB3I2vbcpu3xBYoViMb4gkF|cPA{DH(L z2k$N;rL%|fj49T&fup7u`Z1=Wt}q%-*_)m3#X zKF1;49HNCb5tCXX8N3?38T!70_nIy&Gi13vjedF|QQytGIOV9mw{c|`u)iF13_nU~ zgfRy|`@~p2BT(Aqhpk82%)&}-{$84+tCzvoKKK)tis>j`->Wp%Donr<<$8r)`eYQC zviofPr>uIby0c&A#-Ex9NdU%CN!~5IJpy{Mv>(s`2yXE)KwDIq+O* zpk>lA*5|WAQDrBA%4OWz38&GGJJwZtf?4JiEe_raKuO^1$XH zBUtI_R13qaHUQ_mZ-RK4!%rqljdfF#W@{dD(Slh}7t*78f+T%<)$fX*(Y{p@=rvc@ zsdHFCtIJS*@Q&*0e)f%!)ubO%@Ji>}R)c_l5l;R#&Z>~S^2%|4llkxRI+l8?t#gb1 zzYcFvnDVG=@?Zu6J)7$N*@Q*KAy!s8F2G?1N}?V#G_0f65PRnKAVE8cKKFJ=i`WGy zrI1bh&gVM#L%49fzzbhhw9Qmn_QHiPI?HBu@F3!iBKg^bk9K|mJB`M?ox8|wKs13O zFZve_u&P|FKm5XzW&O_ji3cn^aj>Jr#4D2EsP5{6;iO!)vR-+JQ;CqQfOM~3y4rTx zHICfOb+UmLbxszH1A7CTu<4_UptYP`BnkF6~RP$l*|6HM2+u&V)dbGCzP zTC3J{qK#*s%+mmXDBbBh15%+Mu9O|2{d~h{T2IyhM^N5aK91Gk^0NDds%vDnH0Wea z)F!qMN9a5oslILf5jH*q0^d-(D0a7;F%yXfjnUQeE_dDE(A6S8+3 zs1^Xtz~wB0G&w}PQ5lZ0HhBJSXI~GIAM-~b0DWl7!!T41Q3RG2Xyz@TU+sUoA0HAo zH0HO~S}ePJaU%xWy-mv*dEEoE1TaH3IXl0WR<+Sr*zAcuW@v;}=x3t(=vs+L>X_f$ zyu;ios!TTXs_uCwU@$!p(b|Q!oz6B{>0$STsCLE%h|(Ffw_OQeQ30Ih-GdHIA*7DS z29qjH$+Rp1CLd$YYy1tkUto#d)zdgd;P_0$ujD}$w~Nn6?6eK*UA3b#$hv~3X!T=e zn*YAgCFzJ$=v%DHmv#+y)U}KBR}9B)OqZ$jR6ByF1;$!dbW$h6r9V13HsP#ZWdRCeWddit#OSiKB}a%o-}BA(D(3z#3gN$_ z=P@#~v;7Z+puJ_cDGuug7yn~`TT_^^=q=S5k^~ANv+6)o%nziY5Z~YNqxfctp+*nXu5YUIgYyc(72;lxBj*c zmv&<2_a?ze;9k3aboG|;rzaai6`giBVKH1)=&TKF0r7eU}1J}Dss2*Qlo=%MV zbArzI*XN}e`rX#sdRn)VS1Hu2iAXJUk(UBF0q3hzEkCQRBa~Vhh?YOHC?{j}cF#Z2_p&>KT4O>GAsjFR?|v^@}+cf@kifDMB-Nd<9N zj&@84BF#!pYtwYZk?ZVs6Er?O6K%e{mB6$@A%ZxAsL2xMwL$Aikyxb9BfRwx%o;v3 z*QN>D$5URWqTg^&Z^jwqt-YilS-V{{q0lGj>)UnX*xAxcg2f^RUhJK{o3JzM<%J6a zDEh*~l31GjnzigS{nl)>!*W>c6m4d@J{ld{Iq`vgTf|7PRZ+aHUKL9O6Qv${$AH*Y zs$Ai(`_GC_MphJdb6O*(;b-2quIt>;ZPxZ88X(ISdZJO8h%`xtkF%z4{$DKJT*+SP zsfQmP&lH}tnDcPd%7=pIQ_pebDHfmP%k$IW>wDqNO+hb|_@1P_>a;b0pJi$PR!(0E zI@gex5m^KcNeBEJELw{&by*e7r>F&=58tKn8{#L_3JJ;Ojx`)gjPEMMg zU(mz7EhJ}=(1Rm`=z?{`=&8F)+(fnydWlxh5`0>^n7VT;*jzj%RaK+Y(EqBWS#k`I62^o$-old}Vl>&X zMaGj_?i@fjhs-`ETv@flT=R~wl8D91U=m!a)D=J{{T+w*&CxR&DG`3lX#O0;V#mQ0 z&LJ_xNJVVoiQYN#)$n~PX^5>slhCumtX6gMe&Xq^4%!TD0b>t?*Z}oH?gCaff+%}p zObyi~cYTZ#^Zk^jw!R{e)P~(_F2gSjc&kZ8GSTWi-bC#B&`3m)YBqZ`LR#?F%hL-K zN6N!u{tKbh_IW*|eN^F#iER0@&bFgFVqB}`$6WoYxUvY{z|7wWj!UG}lV^@5@C!vw z-K&ctuWoSI0q5n97UnYNCPH;pA?tIW5{k(Nlgdb_ik3#(wgeVU%}b+oO$UV%%?`^b zmhQ5awb6&`2(7<|b=$Og<0Ncx*EHzYS*3p{BC{oVMk2ZjwokgzT*N zeJRj44@pX@xEnnhoO&xwCU2Rd*)r=Hm-yYmCS36?VxZ_${~g3$_-5=KAzZ{m?~@^W zm6<>iG`OyFD$`N`g4r*0Wm_S#c8|I?KUKy_dw3o$u~BzL>VBAJgrVE zY;1v5g-3zrgLTQGw|(n)35bf7e6xrO*sf0w!~xFc;LYmB$BDa}7RcLwI%X~?x$L&| z`Pzy;x#Xv_0%sb)CuGc&9()PjBXk9mKrNY!rMZu$@Jqa#UZ)}tz|Ez9`Av|$dMkTM zbH}WGQHK%TPBn*fn~uZHXxa$ zh3&?#ilhc@u--SG3;q@kzDShWV0wW9<@kVRzS3y>biMH?K3rjrH--p>VTLMhNTsfA zV$B=fr;DH^MgjXKh@z(vrCvflY>UZQ`OW3$?2?+C0^?;ZjF|f6&PiZ}Yi|x{_kiub z!Th@(rFQ@ER^_;JZ95gsWm{BT}AitgZt8HJi#tf(7~mFDG3?*a(-t{ z2DP4&$uTXg9+%ZMg@dvfZM0UDfhmp8T8~yL@dve6Vf1hkb`rtzRttmrNk(@0{gp|WwmhOM^|RDi4=;FU!fwbl#^ z9|`|0xC%#dZ0mpFFu0{OUK1?URLFR!0HH;p_^>>?ZWkvPfpyj{6tS;{hPy&pXA4B& z`)s~=Xv0C>p)fM=gA}9h z+O-;c;o^FPi$P%LLyop+o~vG5$X%^?<6@&U_4&m*D8j?29k6Gl1Qq$=CXDZ%uKyls zY1#CmP!h7VpkmO6kOSc=$^BGBD9fqY|NQ?|wWey%7)U#wMy!qHa z0*ZR`u)lYyxxizBQcOb@g!h`M(zgip`?fatVQ*eGSjaKz9q-r%pLKGV)HR@6)K^ zlwv3ktZ}ilu8^Eop|PF*?h%c;vL9*}CB-IJpy&*JbzN^kB)|=}6c*X2jecog(JhO^g>Ftqzjrrx(eNkj}YU z3*c013Dkg90_1y!qoV3tK!!vOF^eK0H3hO7I{TF~litgGR3^{>+HG>jewUorDqtvq z{GoA|R-=9fxOZ&D+|fcA34?Ca2ojAHh)COD_}KjVtUBKPwGY;oH{g7|G^@Q=l{{Pp zZm9m4du{0{8g!1twS+yvOy9kUeB4<0=`e&i{85!?3h7N0_wO`dM=JTyXKqO{A4L$v z$7NQ_NKiDbv(>5WJgf$k5B@W<|+G;HBVL0?l=+ZkC-jlb8eU2 z=$2A$U9NqT#flRr)Yk0EC#(hBMJoWT!NvzPA2#%`-Aucj>M+ zOPt{V*y2j?&h?4_K=1iM|D?_ZBoruAt444sz9`oX2M2P9r%MIylQ7YOl(GY8??)j zw4R6V%4T*%ZE^^K=g}>YG>0gYa&80R`;_e`5>|3Z0=3NmcameH2`Q|ws7SSEk!dwz zal(Z|n3Y}pr{pE=id#whgJt9&DGOfF#p#Wi!#Jx=*^U zyg_&d;wVK$(SwrrP$(rek~#D^$ip@(lACV`skoz^i0>SJy_j%MKk_97#{kyaPjMbj zOvLKqzE67z4`F<~{4d39J$aX~s3qeFhBx%i`wI*~#idUy#PMGU4G6=POt8m2RvM4m za8hv>D{j6>DQibWRfwDV%TXGZonb$EIzLt9iVv4&uwL=%-0RBE8V^{}@MTaPo}tS7 zlVqpbX8C61mh&8xp_H0=LZh^?jc66MlzNMsaz@wjt{$T~4#d!e1Y4CLDGg3%)HgE2%Acm%NS{MOyiDuJ zXV1p2gd&y)DyOs(KBYyLj8KfeYSuD(J!{xj&d9-=d5D07sAQ`^4Sclv2wmNve!U3^ zllSR@vas>`;_8B#mdo7SfR4Cy`m_TPTc%8Sj464P#Z9L`Qp_YszE%;b*&TOCsMopm z)6(GPU5yMl9DGp1eF;Xa^h0+v1Rjji#RL|R^K2+yKG1~2^ey~BUlXOR*WQ9W^Y=MCY-#!ToKk;)S zUyRb_;vd1Jg{ROA>@RCl5VU2S&ZS^zC$CEJGCWv(iyXKzv}r|BYZU&Sd2+K-L(3Gr zyQ?EeU3W5aX1BhfZbh5_LfjUkx-3z?Bk|m6!Kb^W8`kaZvz$B2oHRj%fezlzIq*Ah zD6QUv1*t-Yy%|i8I4JYtvdTFJYqnSOGWokL_ou=r8n%uQ2U(HJ7Bnbxeh5^D79Q!T zsTI##a+ld|2JC9A@H$Z-N%G~1Agi<=DRTdK!GX$l+MxPu#3Ont!T0S~bA-u62v1rR z7&2{$8ai=u=cG)xwC3omWoewI#BV{<2v5y%1vqd&;b&6=f`nhP5+KG5F%^Ypj4yJX z5jVqSX}X{rfqbtyZKksk^lR^%98(F}CoxVQVg~UQetj5cEFibh*1W7VD$k@H)Qi=}HH^ZDb$LUA^ZI5nbyulzKxrlW$4j^KF<44lqiWH9;gK>VHU2MO z*Z+=n!^rkOXP1Yu*BuXA?sQb%!FXX+PzAGrv&lv;sG8S@u+}~5l(Y^IT!^dYucMK* zj_!NQu<+fXA?%rfYPCr+2W<*r--)UH z$3r>2#%M*w@XP)4$6!F+gn8-TsVM~tVg=65HlQxM?~29?n&=FjO}*0Zr|GkCxhU!% zH`lvghvQ%Up&L0lUfD!f@e^37`M}AkZKY`noPIiRuXyFbre*xJ2PQvrbkFhI4UtNaBK8H+^eo z+}b4h{;O?$H;*%MGWelQL;3RPV`F&nqpGiwwiR|lAIQSZHg&LKB;H&%dvg)sBzXar zHL>Tbe*6!%b6je61nafEt7-uv7)llr7jeu(QZO=^QTS90{u7bpJ^bFmsk>oej6zR6 zNI1iStS}4p>>gG3oZ3cMuV^)m`9j*O!IOF4LgOVBpNjX_K)cqBfZ>u@o3vvM8bwDALC^D7@QilQxR1%G)YkZI>!rfO&gG^ZcOl4hHpe=DS7L z=!3GXfu$k}vgi<~s{~c-|B+pt}G%Da-x1)|TSjZ6x=KT|u<( zeTrR*bvR7Gt||e-uKx31D%D+W(}zoFQE!F8Ov7C@YwK<5`rFow!Ok$I*%&*NdBPHe zc}2sw_AujEX2P;{`zfp4gmkpQvrPqsedptQIb>0Cy@lvf^zd|rUZ%9AMBo)YFYps_ zDaQ_&jv`QOS22X-Tnq>z2U@3gqJZ;kC1sYMev#FI!6@3u#kAB?;f3`MA;8uhV_{7{ zf1k9iIc~+oCoJw3TB&wm z(?d{8EN)TEF=scJaU%j{m{S(@Zbtj)U1n7=&;>GDBApUc+-ph^huqeiQO2O`=nU4S z9>vlN0I)NDld4x|s5NuzRSPY>)DTCk;}FpV2w8M6q0w$1_)v~9f`)HiE1m}84(!_z z`y52qTg)wjVM)b0_?q~x3RA=EXdkS>h(1@t2v!LQT!cO;BZ(w?t{==x;>{qYtiq6; zyuj5*t7Q##GS6FI`0JfAbQYomuszvcSnOQA+b@XMm#21+oBCU0u$xeVoF+Yr^#1Mc z&F9jIC9Tc6hNjBaZnr$rUuTT@`3HhsH&`S}oDhV&&&^Y&Lzf@VpUH>A$9Z>y?oC{4 z1WdFlu&aJ{MLxI!zz-TGk{>{7_0f(Xsx)tJD2`FIcB)N!1dlJ3i7Uk*#|!&=X(8*0 zBxh;~Bc(hc55S5PS|h93XYT+l7xzoRpKCQfI>cw$zB2OmR>t1PvS@0(Wjop!>CqTa zKdLwdb3s*PhNHderNqF2Ml#B_FIZ^Urw^xCLYZ_ICji_)Kf$xBcasx4K@bZlSkz*M z9zgtpi-^Qzii%oQqU8yodd2-)6v&&H1~HrZb@|(GHJwI{ry|;Qmpi+fO^70 zD~e3-HlY)|HM1tH?a5Bap<(@o6VPJdy~hV*Zu#3U(y_tpXVK9_d{KxIB2LoREo?xy z4;wegp#2jYNmVR}i5uK2(=U0O&%v-`@RG0gDSc=+U>B!!@ln%$WU>$lnS(y2_=8~U zAz1j1YWk?QdnlW$)CI^SsEw3@lp)KrnUvJ13$H#ddzKi6aVY_2IED;g76zHu@0ti8 zRcK^I6GldhV`-b2_Q@%&6V~4pKUpywg0IDlGqEw$big4qyCx29Ij7K{&*na+e- z4VxS~8b>CC(?7x;AE|u$0G}Ih-o4LmDo&W#Y1dz*2FS>wdjPHe{7J2<83pFjVojhEBB5JH8k|)J#j#e^j5>v+K{2D?|7LnX!LZ`?Udnb^zBC;QMl8{E9*kkvLm7IAwAwUq= zWd8=Wcj~CZEm_D`7NTQsTGSPm(P;K?osffi*&+Qt!Q`kBVldo@afa*_nMu%8HNblR zN-Sg<#rH*feuUC=mi40l@!4?E;E_+hx@$Zi@{vU(oAdxc9OYi{*VcvIXV~%Su$UED zLswY?oo}RBNfkdVdAqj%v#nom5LBE5Bgf|HgV7I&lL={UAS$iCWglIn1^^(vnUd#u z|2ibQasqXC&(H-4=`dJhI|E%ZmSLwvp7F{yEOYaGwb)dsM5LAiF5my|(Sb{Q;=|7W zdijyEULfA4vWH^PQ9?58NDjy-vCf6WDNXVXkqqJqZ}%#z7%R?TB2Kj&n<6{U0WI&1 z=i48gSzO2Zn9bi^;FLN;N7n2^?>~$Yp;nqUHgfReI!BsnP{2KeEd0Pir4YgA6t#PQy$auB=yz_5LRNE+N~=coNvw?vzQIxWr1 zfl%YO>8@6~aapRMQtk|Dba2KI>jJ;ka}!Xl8e6U!TU=`R0)x{P%>;W;@IvKm*j5-@XK`GDvL`IBVqd0@M_2)0Mk zG4zalG_-9|;_&T!nRs-j_~Bivbx&7#iewlRrvm+i_CT?#vO4BM*^?t2qBKK_-AuHU z^zve$BRUF=Q`N~(?zqAZSqX z8av)Yov$XR+Qz>&7n!Z!Zpkw)tlTD3-V-Cn+-bU)TpmWzr#Xvnt>MiW<2t1GV5uX$ zG5^c`|L=l|897-0KmLs^r++O7eyh>nV7$0IjFR3+XG%()woI{FoskdlZk#7bU-N66 z8e}qJUl*NF@c16Y;t^q;i_(c1b7a?u>eSCbuLk3GWn>@}w|qhxs>YDD8+Df*oIG!D z60RPe_g`;k<9Oc#jFJ)r4G+KJi^#8$(WWKD$hH;)5tNM&fBRnc^Gu!{fNV_hu6~yy z7r(iVbiYdxHP`RKvvDW$yQj19*6~`LMWxXa^L`Ukzr{o)&OSYO*aid*@-|C>Myq&1 zMj7)`69M&%l)&_8#=>Hs%R!_a2uB8!^)^9PnqU)a7QP|X=eGU#L~Zy0xIv(S^Qgj1 za!ay7g@r_ulPWz_<%!%%*9(k};1)2i>*=VAS-IK^IdDm69QiSywS7kj9eAQmM~%UX zt0N6sw7k8aWtnf~HNA_;Y`WA{H=e6Y($L~ibOfZLzqs(2O?vSQnOUGtjiIW^`q~}w z<(8FmWaMPc0fi+pSl;jnE=N^bwDaCA!$xmPJ@}UeJt!BDQ`P$QJ%+f@p;V!r^>UMf zT7zILRHq5~R(r!#rkS>*dPzB^T+XBs)MB}Lg{xnyN@i!-$=xSK&OcrFUD#H9l5P(d zV|RBVd3pK0wO=||^r{IJh~Fp~f1Fm4#R!+Nv0{#ZOwcpqoB!j*2)F)Q=^VSz`(di< z`>MK$79GWKyAy~6OB1=E^O;^cUXCJGo3dc=AI@gxNi)Nd5Qim(<+7Hd+TB{P#k>uY z59+B&@+b&7-~0w=W1e~245a9MM5wJW&-`;wj`qi-%;`DRNa?g5f#VMaT9n!?-N<9w ztl95u3b``6vX)dLSSGe{DzzG1Yd1ndF@f?_8bnhmT9)m-SE^EbTX*2)i*16e;z*y; zQBk^>Dy8Ct4k=>+xxS)j4|!g00MD{g8S0JW(iYxg#3;t_(ZwEfGm6PY{=T3(S@9A9 z^_-6TdA&Y3*1=gQ{V;>eHH{jD$Rk5?Ilqbtw_416jwX6S(0JwWADE$qj0!Dt$CQMT z^lk2CX>sKsioXcVnJA;`1NK+cql3@6YiaFcWP0{iK>bi?2DDoxZVQ-u*n^y#6;jexQ-F2zby&I>HQz=%6ZPDN-^^{CJZwUpnK zfHDJ(Uv(HU%JthmqQ~mw77K-{(8TGOmFiOBziRBcn)`$OR;zQnOm;C1B3NDSK(5s^ zbU8QG&Gd~!4%+#xEHm&i=Z+Zh==*y>D)s%bFX5(dKs(YcJcJHT3W*g*kmLW|7YooE z#C^%H&0QF86=N{b>bT3Lv&{_K-UZUSM)3XO-Ic=gMLhXp^CZ;$(ASZUZ_E$U){jwr zOq(lNu^tl|cTHIJH}&%7>}cuE_4Q2h1+TavzZ^4kRDVJ~#GQPb8+cV|7<{$hs&Cg* zwT_c%Tkcx^NxPd+(Yd!;n}lqbZRH0ZqOe+(Xz1k~8P<-&ovmzQQ2T(LgW#Ri}>{t3eW}2vF?a{AGiybo;ItH zXAQW)wA(0q0LNx=JSe8=DC&li@Tpw?%yZQT@u>~-(Au;;Vfkq7E=O)*SEVc%G$f0A zR+G=agc_u0)C>&8Q!m~Mt*^8$LYxJ~Th?+L2SfGIbhwE-V{%!H<655k8W~b;@q@rk zpV7vOp`rTQe^buB#pi}}H!@F2bE+ul!51?k_Fj!%LhD|nP7g`uJ<+hl$slP7t_y(w zY5nEpIHf!TfMa@iy1l7;@=Y{|9QdaX0MrRyK6B4#ak-dH?_=lXa4Xoc9pi9Od9WEx zj*q@Ags^Q|E^fgbsDzewf(bKFu1{xphbmwPY-fjXAdy2UGF}IIVvp34L#gu}SvtWV zTQ-4^YFmj666>J1j3&rG+j}xG8c(Ig+cTG9f{tf9m!j|M^7p?HOTlRu+8b zFQu3+R)9JqHE`;!kjwoMjnzdJJv7;=*3J{eEoIdUn4svv?_vXHgho(QLJY&BE6F&q z7&9u3B(kZ6Mw$p}Y&wVF3pX|jH&&CuZqJ`<2Q&_JUyKNg9*-BG>CK-@CCP^0J8Y#+ zLPmE#I5u?z@YI5np;HY#d8k@kE##yRUbRbu8$Dely|pV1l3I9OH6te<<8@9%ju=)r zDknCgk?q>%Qna_2fQnQYe@BFTfMuETRZ)0)qCC62^aYdC2;43vXEf3t2z&V`2KDE+ z>G{V#`NXAg14Y4}`Akgl<hd;&;CXd-+=104#91ZHEg{EjiWa*#%%&CEvAUW1HQR zm=enAL<9F(%HIb^5%N6BL+vlipLclS`el6CL#@;PP|c`~gW+eRI4wrHUC=Z*)*u>( zCY1WQR7?+tDL}(o-f4*>YQqnVc}O*UAr`Va-_}GujxPBFnCcq`6ZTcCzsDq~)9s8o zc6}aEf&1wHYN9}s6`pFQV{qJxke5zW%5N=3eun9~t3l5r3TiCTy(TFhX{S~`CX{U1 zQdYGGIxqyJ24tk2#;LB^_u1atnsX5_VwHkM>c?9CzV67@mc?nI%4rI6l*3T6l)iEEuYHO1@bg*;LIt$t1wb>zq5C^HG$ zaY;Jq$HkYu61GtRe<}08Q}?DAt5qA|Hz|p2Emx(~2#ldEDG2rMJ#|VU3(2T%M=iB8 zc57Y+l~&pq3qo~y)}>Rx_46_S#?&xS?Fq-D8QFzy*66c#_I7;DBBOT z#Zgy-OO~&j&kL~uV*m*XXlrWr=sHHX|ELoS|*|{%b_l`fm|B+c~13s_(mWg||6Dzao@>q;4-5olO+; z=(wxRzoM%mo^=lC3;9H7Qb&H>xG*opGIQAIul&B22u3$dG^EDC+?gA45ZSfFQ+tFh z!fY2~x?oqE1F-1{U`W;k@*!@Gy({Ld%`XL)Dm}ncldlQe7W56O8=Jmj2`!$Kxscws zv@xi`f=XHq1DY_3jvwKBg*k9xABLs!pD;|+qZ)hpmhWdp&BWuF76-R=QqQ--#qw~h z3z1}C-T?z?C1S(|^X1Qo?4j?)vF9rEe@q?C@AUDl9PIb5=#XGC-2iKW3%-MK@gasA zq%(o`<1&e9f!+Jq=v2EBfX`}=nFeoWtA&^Ejp2D{+Tme;5X;JGeQtfNvUk7iA)Dio zvi*U`wf5oE^7C)ugzZo|#S31iIDSs|O$3S_0c85{RNC>=Zzg8mQ*YrE@DIEHaJlyr z(Ex1w{}=ZR|6TMt10y5D|J}i#R+qBFVuSC2n)BOrSS?@2>B%t4Vm3!WcBm{2D+UwN zC=;-$NHxa)ddVSZ_jFIA@@RIz?1N5YI)pas@sNL6lo+OZKM|;l#K5jWvsRHK^V6;y zcD^69=6w4m>;L0kvUX|832<12PG82co2ZhBHEQZM_VUg)%3E_M{Y>Hg_W0z<>7iG5 zFUR^}!s!u0rYl4CA|@hMIyq*NpO_iK!45Ikujdfa;h^(-1;7?Tnx;DJ^ko#ZSdL*H zp#B)xOf8=r$ySSXtj*wcqbS6~SPd&N->=1NxQaauvy>F#m$_6dk z$qj9~Uz-gx9+u{}|EjVvZ65L$%)cT#|FA{bL-AK(2TrPHO2dR20usypAt}ZI`&1Qi zDA(g$NASk|WvNMN*xxO!O+*N$s}Pb=q4k4nFVm1-uB5>9i7{a%k5M$4n?pNg<6h^D z%{PEK7qq+be8kNseI9o3r~PYwHana49WJ@x;**N|jye4NYWRqo`>WWc6{oK<#r~_r;M>Ao4I5uYJO z)^Z6YYSsb@Rbk8Ix_wPK1NOn zW`=q^;*I3B*2nZFE$Za84|iCk&V(g-?`B9_=+>Qqa8Q|}dz7v?+-X93GPjgl9#C$4 zwL>3H1GWC{=k36<~~qNtO>YiD9ey3aN5K++t4@%k@M9OX$YlbH-Xa z^Lvu&;ZNtNC>9*Fdn*|fvmmKzj~LpuE3=IkHk(g$z7+#LJccbuV4%ZV-n9`8wLlW} zSmMz_Z0H19j%C*2%LtDskqb;5lgNusOd5*0@3bW=eGe~&Ovrp-o|jG)^jD%~i4K0X zQBwbd#!V{dw^YWbIxe@#dSU{iQxRbwKsWR;v`POPQs0rq;m|Nk(X;^d3shq-;1Xef z2ii>s-b`3Q_VdG$ZfoAUrol+>cRDtpLa+d1F(js$oS3rICKWV8NRRvg#j!wAqhkbv zQ?m8wN4sS4rae(t(iPHlHJNI>-5*#7I77AF0U)ZW6*y$92aj%Dzc7&`7Pzfdg|7^1iPEXA^nfBR5o{2{GC#?6AhQ9Np8q;u!(iEPhAnCepjO8w1dDp zL#ZF=z~oURQKp(>Za|S9FL;G{nciK~j-Za~N;TChNF1F0f*6Z8n-H*1&zl?bCtv zMv#LY zjyF8eNwso+|KSV*tfOI9qy!^OPSwKn_YCT3&ySXhc1^+be&n{c`^Wd=VVMNOmzu*} z*<#X7{xF`bT+g-1Rm2QW%3jG52+xD0BQL)mBSZs(4(4lfBpOw`Ak?J0fy=nCigILo z;4h0p<-;2_13!gcm=q>aqa?g;@e^KSxk&P$q{I-CN(e;6-61%Fh!f;FQLV5o{fBvP z<2m0G!%QE-2F~$1Ch7zYZ1q7Yl4%s|j|ZfNCT$6hQUetlh3s5f)RD3b>XUL{@QEek zPBrd11s&N1E<0V4pwno!qy$6wOww^Qb(`dL#scHX3G^vR%Rq5TdFM#N%5(4cDMLo? zB*b1I+|v>Pt0QAr7z}Uq?Fqp4`BP(=mZqgG$6^?iPd+gb>!>oxOejMPgRa3!Im0Wf z*7Dt*Ed=sTsi)%KKNYj(+F2B7Np!anl(cC4bv>hifXR|4kFZw`goUja>&a9<;wWZN z-gcX9Vk2y~jpU^&@a5@_OutUH@z1-0Z)D(6w94Bv(}}CY0^J&`&sf4)+*NYu zC~CUeg2^Z4F{6BI=Cyv@i6t0iu50n7KM>uEOndd(0)B1j&fsW|)?^p&kOmzjD9`jF z#ybLOf-sj?EQP{C@?jk;1iZbrnS#ui*rSokcDf7p4Swv_`&Y;VLuQ215J z#ux;CLoci;$kTqLB`DAvr^?L7?tlnDNA~<$O!>r$pG<#d1B?Pv{ z1uHJ;=f~)rq%e&<-hBB0BoO?>2z|nhZP~;Bhq`x+uB`j^ge$gfr{WXa727#c#kQ@A zZQHhO+jhkjS5#4_p4)xz|90Q|jvk{wz2Ej;*lS|#bLQM@&fjFneaG7=Y8U$I0xr;L zS!Pkm)`K|O2bK9;pY~LBI#^Gy4C+i&%Y3`d+PQ&a#%msBFsa6(8%}eLZ33$B>U?Ir zqkZ^Io;x68Qvdh#-HjrJN)imek+dR+C}V!Z$QLGf4a3VxqlV#Q`RrLdW4hS{`NGF3 z8I3^mSe+5@k*KBWr$#~Ff+kGx6JXOY`wC}{ntl3Ym<``!!xGx>M?WYyT0JeWZed}d z3sph+NJt8qm&+_bzobYHO*Ky3u&;nbx45#`cTSEGp~E-81}lZGR^0Rmhcono&&~`7 zvifX{64^nG5dImF_S#4)Za-;W_&REl5wE<;9$9~lO5X#NRVFA0dh*@jmoMGJs7(^w zloOkhuWs8hQAqSSMTN_G$%LUd;`A?xyD|fTc9ryB+Vu}^H%NUMjflThFxGK@pQ5`d zCmVisDngu_NmQI`?ho$5>hBx5&K85|V(x=md-KS}x@9}TbdrJA`z5ugl{$#=<|oJg z=79^-cOVJM+aaO}TP#vSaIW1`R-!1H_UaZZ!&BgY(TWJd#v&NdDHhhLi|=Vh?m|!V z<(1GVC;q?|{y_irlqZUd@7X?k0k-b_8sb6sqFEHy?GMW(WV-6nJP+1$b2WxsY_-?O z(hQR%`eil}CIoS#PryCFuRKDN);bICa{=P;T~MFi8Tx*ruQ)9ldbNdK{Xl>@7EHAV z|FRO(-2}E6HGPA;5QzA=<=Zrs^Hz$Nr*i5-KVkH2nrnlq3VEbj*93INd^p!*I9Y3l zf*aTg{blkq9ApdiV{@bUj|Z1Xla0+EC6gUT%SKJjn#`w&piJPU-(O?%!U`JiY04!_W4-6_;)>=3oA9yv(-tz zU1&8W8!X8)_RYS?&WJ_FT4hK8#q%l%QpjtfRCe=vU;<}r=A%8y56B4#1{%*j$h~1L zj0R2Z>ynmn>`g|E!&E-Yjy0#Tkt^;i?wDqlFL+jI?Ua-l$+{mb{cf^~JaUH-(&F?p zRtRF0oYEy!pFwL`&}Q07DZYo`Mp<(P`Pg8OuclPTF7VCmL}U;EBQXm90bmw0hHy=t zmmkeyqN4=|N@o~|D0;${Zeu}@8!Uj+1=N`Hi8Q!3FzHsWq@E6B4m&5DZU4CD9kv-; zDua`eO0-w^wR3aO6GFy7V_s?jTN!8^ryU7VAq;q6ImzrJ$NH@$b9UMmaM{nk@6C?W zii#a5J8Cy+J`%F&?C%d|Olx8!pL$~5W830@&1S1wWwV$kDGi87n{jq^`dVn2KFEo| z0N8u!VQP`Ym28A6UsM<|lI(WMH~qYX{;|u-wQ_KWq)_&V;GpA)j-~+qQ#I3?z{*=w zeow|GKup_tkKNBD%EX>lF{#F~pL*E3-1fPosCet`=E)9tX2s6#{)di$a>FI)d2S;I z;k}Zo0|tpJDwfeLl%nq~DiV3L@TLDX=t#6Hsm#)3x?ZE?RT6{p@T`W`C+3fYw1`+8OalexZPiaQ|L;o^rv=A=>4 z`4uhF>%eT$ywm9|kO=)-bW;x9f}*wXa0z;Qr|6`T1Wgvxk^KOE_9s`M z(7S|ZrHSGmIGD{0-1rCc#w7qkyHp!~R*Ymna0uJ{CC;XJ) zH?WJCg+B>-&#edkPgqe#!@LApzt)gMnB_yh$~P3B^xio9v9r5=EjTSg-ihN$l$S70 ztE=Js(NPh|;Wx&sqm@0q5H)X=p`~iT5tCSwAjO>bkyG;06qY#ySr%^JQUvv4HTyKq zXNJ9QGi*tuCf|?Fgr>> z5JEWcrh)*;`fC1|PfcVG7&db-9w2w?wz2(n*i^5NJ*f6Jdj462z*e7Sco1F`Ef``l z?SV#`w<1eV#FT>(85`h8esGxjC%?jp=^mq+zBKEc6NSBfe{SLjTUzAZbddt)ib^{& zmhDNP-AAyJ>D`N+Xej~^vVF7fn_^oY%e$qKYZLTZ(6ngL5hA_`3ZYh;>A8tQx6@c~bF>Wa>)mT{jYjaz8L5>igEhB045=}oG1zAG2t z(k_I02t9IQgJ*Gh$~$Vs!AQ+9m&SjEO*bzFV=W83z)l=+^}sGi2RE>KAhE_Pv;NlE zw!w_qFku%&XPTWEuu+Z{ZzMkgGnIC+6Ysu6=Pn%FBB=m#3TgL2BoU9~O6M7k&;H|E zKwB2sSB}_hhEqrn%L*u4g;j>osJCb=&gVMR12;s~67ED_%3EIboCfHCwb^&b=OonS zfytd={OfVVsBr+LZdNSdV|=u#cXEf8QRzY#go}X;TQ4ChZm@MUnja3tldWyY>;wRP z&yOfZ{|*<4Mr-rm*w6oWh^y@X2i)6~jz-KTXS@%`?ni8lMnF^YBM2QNuwye|Eo7*5 zBf|S+JH)}cX+-elgvJx|?kYq`NlKFZo0JskreI11GubmlfI5CosxPmv7&qvL#<<+i z!cBSWwbPru=Z25Bh0}#QQ@{?t@57ZqEm{!)N=Zu(pRZUJKG$4A9Dy^yoP@_%&Q^fC zt>@K9?kYz+qvY`&fcNod;?7hcN1o%u)#F8XCa24VzT5r%SB&Th@o!QIYN=M<=bf^> zM3bMABUv_C3LR5AVk;Nt8@W>_$+h>(iuP4^XfF^dYzj z&rZ)r3N42w-J{OC{D`@~Mf*CP(vo94_`EQH;ELOgeEeb?^WoN-_wzLo+cX0+etkMT z9#iAIQj-N=rIx0{Boss|m+F%RWFc*>#>A>@FdL07>7)&a<0mOTyzF7VYpd%k$)Z2l z3m(SLZEr_gA3NJ0y(@1{MVh^T=uZ9^$P;sL7K4NHy*M!q3G@ga6J>XjZ1ah9c)k0Y zMpd_rezdA*6B625J>9)uE+Am+x$dmL73ey<$_G^Sw8y-AKb2d$mp89jApx*0Ag}CjsbE_ zP<}pv(SHz5C$8j5Y_DALHCud9)Rc^8xX9bI>L`c>&bFdpx?VH1Ol&s%sdqU?e7v3UQB1>!roHbmLw0mA=#}ok|!o3y}z6x4PQH?N6^vVB5FhShYlb zS&Q?5FdY`>n4K27zLYpCv;KxPeF&&tTP%Oy+E!Koec%O!TmCqat>5?VaSVPuSmuiJ zqxYY+hhtck71djTCbij6Sa{U0N8zy$*0NMWDGQ-&T=AgMS1n;J7q@+1#WD5e3y9Mm z5DGW17cS%|Co)0hkeo(MK)4DhR*u^y?+S%V3mZfvtNPteS`{fLj;bbuZD_MQnKm*t z;V|))(=q4d*p}o^JLnjjYH&VkJQh~z2XT7O>)p25qPN0vugy@!Ti>SiZq(2Aha9{) z8Q3E=g4MYX7D!J~c7NkHIu0fs?d;!H8?U`4`5V(sg0aQ?@?YTOhY*RG(3BF5C$MSZJfg{QZND%B`Nv~HY1s>PeaY>Q-F*|PDXSQO zZAV4!CSCI#zBSSzfB)}w!#2XHc#=PW{7oGaK_(DrO$@?^iLD;Dsy=1FhEK+%uFAEXbFZa~d6PXV#Z# zPG4oFBLlC&dcD?aangTu_28tRTCp&SzE~H*;JQw$@UX53@-XVGHbx6ID0JEc6{qcp z$9*z;j#IH5^SrjZ;Vf(a#13pit(xA+hS+fOOhXNXmog zWOHog^B%pIH@$)%E7pD@mumTQMthkCZaMZIIlwOj};h(`NG1D!`-q8XVx-RGiZ4l zp^3@1DTV%q9Hr8Zg^strOfrT;ho0?7cbzu}*v{%-yVa=p$?nl_6!ck&^WWd@@54X~ zGW%FWPI-60&rA}MaAtq!RarA~BYm^|wIEA#if35Bk}Jxc)rh&jO`65f9W#3> zMxS`%q*y3X(!r`&xNt9d_|SDUGqdDeBEMoN9KC&0g_`@a2^c4sg4a#IP%o21 zW&^LjaBSg8(Kb`ahC}bld)?p90GY4^93DBL#*9ZP9dd{#wHzR;#YT2t7lg@Sv<)bF z8Cv=>0jk>wlXzpJNk*4;g&7}H9^@d-IuX4LG6I7?w`P-sqmZNkk7$;*0~e82Vo`}4 zfC^@FUiVdf5H)$AWW_Eg-v<6<0}iG{Gix`kHLYr;C}a7HiM#wIh0Yh=@em9fEwq)o z>}IZdir#_FH3uYDfw?k(Y2p{8RRxkOP4-h1KRZUYK|}QLYkH73Sq^#-j8+VK5bvyF z61`T0dw5{&^j(1L4EZc6Q+O^PEgsfo%P2a*xPBMEA;^)@hO zxJ2^7to+%#4yNRUTLNE=y>x2uV+i9?g?ViQiBvO~NxJ1UAvXoYjk%5GLC5n~>}gK*+$Tso82`HIKe2 z@^w}0PfB~0YG(EZOW859s~};Va!JmtgwnI*m9}4_V5KS0)-n<<;#W)tltYBmm4ZV9 z72fU#A3XzTmf|qFJXwx@{+^(6aG3AYAqi&5+Z}GRM}2=?S*ekOO;tc&6^`RDnrO_! zwIb<-q;`ozR)xsFBR)yqO`{0HrhuFC(Nl^-8ctPBf>DR)>H?9kM#&JFeU! z4S8k$;1Y&<?!UIZ-tm_?5UxSlMo{2^6l|fs9qi`?e4RH{_rLBlWjeftuMn z!;p#DWs!;Ayl(C)ylf+{Re#j4sactc1+lo~64}=HE}V2L_f4v;+g2FY`WE4Z#zXf4 z(TO`s?eT5+sYYHqcysq%Y~TCOf3US2PJ`RP4JI6TL+@@zEDpjr026;%as*xkdIJJX zfM?~7Rc;9uBNF&oX$yd#zQmtbj6CXR>&G8I2U5SU6i3=x$@;P8vJ>pYS+Nh_qF z*}CjL=%gykJ;-M&q~aLAt0G~V@wdI#plSb9^Vf`&e=KBfvB1FXua=q}|5ff$+FK)) zSNuvNHDKFwS>u;%r#fVyyAydT@OB3KJLi{Q4XVhqnlN@Nz#MF+9FdQ)TIo0GK{=|} zvHok7rp_OXjEr7wH)2Pf95h^@Ib^3vTOvFB+;Nj~H|y7Z zAnMf%P~bT14#i|MxG+`A zNiKm$z&;$9K;Hm$g=FHaKg!50OMy++&cfcKp2VWqq<1+9iRAdWK;emjaUX3w-w;Kp zvz7<;=x#i0S#VBu9M(yuGlKq0aD@qkXWlu}UuR^!%!T0d{p2bj+~u-(60~U#-Qqwc zMrmDXAZvZu46Ns$@h5PY548(y21#HQ5J2pM6*nVeOww`^_isxr!@wl}m9C-4Ly|1;Zwf*pdcPs?~p)+nY28A=z`3vce$jlF#B#RLkZ`(k1i zQA^$7kB`ch)*q`6@p@J|Ca4g1Ux^r&9yy7$#y&$s#JVOk(mcd0agz=AF*>lm@BIZ& z>hKP?7q@O`o{yv5FhNibQ~I$l!g1`bn zJ1U0KNz7vbMLjA;T}kX|4oy4yfRG2V29Xs!?s`I~8LKl}&S8Sh&b%cwtkw=aNOLAp z%+X7{fTcLXTxSa8=^6*}6!7iHrokCTOiZVG(PJiQRSq#Xa67huLQ9v5;R}MAf)P1%`0lDZ(A@6iU5XArIxY1e;CKrem@8!fvQLi}D zDum*q5wluE0!dWHoP3ft9TrE?eVjCM|y|M7u`j5943y`tQDdAwQA7KA>Ga_*Od!=iJ>W!cNtCE^6kll^3yV|58F*s}+tufOHiI@7V3aYno2a!~+Mzoh;g2Hjb=dK*&gpu6q8@8y z_RyGxPPjra#5h;cNuIBnX3!|d3LDxqgRTL3RXbUmt0>3!IfOegAAjtb1W;5$PyHfO z+Qh7w1o|p_e4LF?b;jjYz@A@4U;_`olB&VSv;2L3Qgif{0hLM5VQhL5KBOR@`IqH! z!ak&;G^$Om>Vg@apul9(>L%>6V@S`aO#^DrDR}&Tg?8XLA}L(aFKHeiHIGDI(XTv` z#zX?Ve(AMVxo>|0tEr3+KCO*leX<5?L!+VyznHNS=D9BcGSCyI%z36}Jc`DRS#u9F zZ?c{#BCHcB_4aK;hQeoMXc3v>w0^b7x^6x@>)1V*lgYic#675$NVkrBwBpZ8dL+oB z{z>0)ds8rN(1$;%AkB(1) z0%D-X(!se@xI&?AM@&cUUREH6|L&|k8&|ZTPlewwGa*SNGN^`xYe6^Zt%c6RozzuY zg`E_bY!d)h!{gad$<#Izu#c7v?`^L})ydE5l?F}6?64V3)FJVDva*L#2lF>^lKf6P z$c>W^#61hRtFDP3_z{QvJn8I!(hqayf-`MNEmpeJD@)t3PBV8O!{ShSM4_fZ)`Cw; zch2fyVMt$tP9lQBD~#O~AOfuj8-dJ#ppPQFgN#c;cfuMzoa<>8SevVAJIQEa)ZYI0 zC&+EZhjal?FBYcyO@;CS-m*j;$MU#dTm!76c=*Pnair| z4y%FZ+<9D25!~N0wOSPlfvudaK7&nwVuqKvA*YaM!5D2bQARoO^T^93r_FIVNVM$p6E_cF5UYTk$?w#P%@qM*< z+nOXfu&sHDK8mgLQBt>wl(@~)B$IBzCk!z|XCJS;38@|svDp^`*vo_Ycnajp$+r2PdI$Bm;puit#+!Vz_I6L= zCFK8s%v)GzDlbEIzjR;dHs+m0lQ(ma>{hR*kjCZ;QYd1ZUOkXX<;% ziPdAFpT&^o5OTkR(LKW%9ZtG=?vE+@V^mo2=RBesI*gK;qLCRiefVJTbv|_Uf`TvX z)<6VltJ++u{U;z`T%2GXl|vjgmguZY{UTM;UN$v}>co1zj)Z&|>(0YtVBRAw#|Q*>C057!tO&S>`JoV39ZLvuQ+Lrv-l%v%sUZ3AXK@jIX35a4#lxa#H^8ch4ejb&tV>wTrH>~xbZsc zKA~&(txuYjIC^CgTu}za6XH#R$IN9E$g^YS(~8fxJiW1aSho$EHU&MB#TgQ6;m8)sey_!v(&L}_oRJOw(%= zAHJJ+eS11neWjk!T|ACOm~5A8Q(Cm?^R+uG=RL^4FnU+IS7eb#yw{DezA{-#-nfu>=eAEF(XJs(3g zvebCZPgPF$v4|0pMjDqyWX$Ee8R+9(o4$AcB_UR8wc@SylUdn?n-hk_80^VVtuv8n za>>6uGGAoeQmjBZyO_Q}I_Op7c1YR8?LzAkQcP81d+sr;le*Snvd3Z_*TQuULSvpd zaT!*kX&X`YSFM<|6}ltf_H)b3+Cl1O`uhXo+4^aO5~slL{l-KWYY2JAj?Teey*g`W zeg1p_bh`G4L8f~i1oW)7h`5%`OTq2ZO*L{qQ=gfdsUJ}+?X5*mEW(N|!$UYAOQpl0 za+)5^!wRRt2xA+Xm_d?F4w@)*!&lGr>Y`@p=uPb6-m}A#iJI_?iTrS?pOn=kL2b4J z)H9-E8RuTHcthraz~j{t2Su;?9qnZ0Aqex~a#y1u5CI!q1CZA{^t~Z0_YYzoY>|au zTI9}<^g2lb0ts-8H#Gi&51U9-Eo0^X){^)CUuP%b9zD=I?$1H-#; zvLyP-2jjLD@fYCepL3%(=7Z=R7_Nq_M5)7frGietiF>OK-9+2*2vt(6d-A2Y~y6^Hg|4zx9}K!E+XLH}H8ea`p`0;{A$ z{IC80iVOSyMbiHw{+p!8-}V3U!2Ay<|Hj*Avx=>_q=>A(-MBEb@*)l3!tI|Q2*rPA3FatAODJ7ChuTm?C>cb zs{bV(YGQzrv8nlIF)DW|p-;|@KO2;t?d+_Ktv}^Q{76t&E8o0YZOu<3!BC!Sz4&2vGhMoZ9D< zf5r$4+q!8H(=)Mhu>G?FF*7GS=ii6x5dYIJW^QH7{3*eI_Qrpf;J+s3{yW?Mu_+y# zjsI!=hjTF|uK%<_#s9kvs%~y0WaDW5?;G~--uMquep3B69raV!<_?Zd-^}zK{)$dU z|39w(5y9tX=K5z({AYsyHIwz<3I30V|0g~D?*#t;S5M6UcQO9V?9Bgr4OHzdN3s?K z-^a+05bwq9)nB)cW9P~X>>Q^?-1hsFNUrX&hfN35YqydQY>zuwUmle^wAW~*+9%0b zN+d{=zX)AJA^Y8*{w6oXc|UHIs2}XLycDUYk(2jvPvFhW_Hz78;!Uv??dO_Mad3C^ z==W!kb~9i*xK^!ZWnpjYglcycSo`UM;7Hl>dn_quJ1e_0hvKwm?65~p{vC$p`{xtZ z$Jf!aJZT14%FsM!s(yO;@f)HV8FI5+r_*Lv3c}Jm3@2!t%B&939HBC#&i!7U%J{5? z3iHiqo>-$A9i_RLh_r#PytcbhMP_f{+K<%RUIk73g1lAAM%1CrP2gbtUZn}|Go;n= zGou?gY z%2b&*E_(uJ;=5;~aAof}Gs->&cduTHMJfVcRYT@4!bK}TvVnvkK$1c8XVlMxe$Co+ z>#WR1+;K}(%Iic`f&G}()$^{~eW$^E^b`^Pbq^DHgID zA&Rsg3^77X4x}Y4K+nn##E~E-*ko!(5uV4W#<|9MSfmP#E>{ZTZUeE6wKiVcI#&b_0XG`kc z>2;lCb%U;m3zwIeQGKDFbB&^i58;_0inEN~`G%es#@ID!h# z``aluH!#~{b3iHvJkK<;7>-YD4-Db=pfl5OtyetaL_qgl2DI`o$1r|Zzssys`u%d?3oa+_x#S* z0y&YmF$V8{RCu%s*Z5em3C|C4OzDStMpQN$yvlpM(1=Dy+fIE)I=~a9K2KH5WQSic zO^Bk)C%5?)&lLLcV30GNdqJ{Y`my@(XmbhevOe=Okw$)M-I`s z!f7mq{ThjN_BB|or0Xt(6cbO#C^D#0&8-&6lu7$Cp6M11G&ChyEPN*PGyr=>dloUJ znv4gY%(k)-ab^xfR;(IsPxpPnuK~$qx7^>iv)i_mJl57C+p6QbP=ar1UB3tR1~UYyU~Y9Sb0WJ^dN-!PKyN}k{={i?{NGg|j;-e~4QciL4T`1}+Ydj~ zRd#NptA~cl|I8B++UB@vqoy9XcMZ_Hn_=`z$Y??)+Y=_l>9d#CoP&NF!qfhm4^?Dd zgBDpr0&a0Si-iTlrG~7(&EOwBgr;;9u7QKcyT)KGsE= z%#kDo3DP#5(5$%DD1;+h&ajm2-tdcz#iw01TOr-ps3ACXjfS0G} zt&EtjaZie>IDm(6t{#05U0=+pKN_;OO92go(GyYTN44Lc) zY7PfW?HTynLOnl551T3VL)-H1>3uFI$32PVh}g~3Im$cA{q){4bP0K{nWEZC{76h~ z=kZ49ck+cvd;@<{N15@uEH8=6y2`#;g_@X&`U{R#Fhd`-hM{iA~eN7 zT{fVWofg9wK zT{ILneYPcEOCB_mgNiOCg$dO|k0yy@@eeKS=lY-Jxh)y*a2UvU;X`|brQiAo<<<2B za(K<^iRmI8a5Ho`K0`}QWwLJ|SSXR6C{5Nyu&u-q?F8huMfzayS5s_A3&Gf6FvLcg zsrjyZZr5)=F=^DC%@}?2&wn|)8(JF^&1gl9@guhV== zHC5Gw1pNH)_ucW;B}lx5ftRq@%}s%fyLEc-7hJwy zzxLVp^!RXgcJJP44FlS(m!)uJU@j_zOAC!PiSmR?69>FZbU-#sue$sK8$Tn%o%`$c zmM4{04!_H*j{R&Q1NK@D4?uJ(rpvhlVZvHIp|lDV6kUm|=2RuTH@DB5sa{UHe2yDH zAMbv?mkmr4nwyuK=m!Ks;|98OY9+=Hk#hlRe^u6T!3 z6?`|4mQ`rMu$d)pjYM^x3o>n;_iiFGNU6vy9u)wx=vuL(*uz-$JG+pA-?=Z~eC3I< z-*g=o{S}_D&V1@p7vq+X9UWFRmfu-n8DA=NrOjVh7O@6jLQITt>vy(3NP&db=hJG! zyNS#pwE#kK>OlF3ePx29W{y}RdJ5lQ!@9jCyx(NVsLQ^Mr9RDqir!(7Z)2%#yJ1m2 zx7;drS@+}tr&6&Z4Hu9zMn0mEW0i*`=X^$oG(n~`pMj#3WpSG{~X`z)#v zjv?nHg8s;)8e_hG^%zmjuXj^ESj6vLgT)U~x!_ij<{hOfl>#oVf8?ANH|BrH3_ z-1WhSM@N<)d!IRa)o}JSU!u?LJ#iy*h<3AkQqwM%EVSM&+bMl1y$ z$j5cPx<(X}n*j8#^NdD+e(vGdlwtJ24vv8v`Tr|I4cX>bL(F ztFnGF$;m;?#=^wF!b!}^%Jr9XHdZzUuK%Z1|1XQTv2*@!#oMOvEp0bOZ#qCe3oaKr z+$6soeUAgsujdZsnK3Z@A>l%Alo9Z#`x&Z+C^Yx6ouDxJPJ{j1Z| z#W`nYhBuiP~V^o3td&+yND0*7LK0*8K< zTkbC5DsciAAj5b2TW+}=Le{1C|17sWMJo?pms)S8O_Gk;PwJ9P^lbtPsP8Vx5ZW8E z2cmx{swjhAl(5TSJ{>=CACg#ZMO?l>1ttmfOuQ8YL}#m47kmY$2#$vS$z`VB9mpzj z&7iw%XW`klSuN5|t&Y#xiG1qO^P*I3maGQ0mpL5t7p!OBfGR5z8`($9!O|MHa%x?J z5*iH06jmlu(FmOLi-@h+-2;DLzApaHAxJuA;U#Hr%O99PP0T_J2ZLH2Cb=y&cPV=<0z@ek z{411@8wT*3*n^{vK&3^1kNk{Z0noyYKKT*b+ zNd$yBfs+B~ZhVd(H9@-(G7M~=7K#x+@#xwTbgIc_?EFfbR86FYb^RPen|7(5SiH+3+dX^I5* zaD?TJkQ1!$2WOX2+_BrHq*NnUdPj`8j2bc3ymDj3!Wp1+TDAZW^XtT13=~PF0K6 z!yU#U_C*=@$+-#9$2!Pl$6aU%>T2A9m%}t%g0Etl@=7EUpm$v??$&L> z&m2uKi?fwGAqG`elAuHuOpJ&U6mz-B-UO-n-O9r7$fD0b_1CxD@i?=-1^o) zesAg4>&ViT;ryb=DX`fEd)_+p9;ItzyEXQ*k6)WePfsF8@HE7U3Mu#MdnE{ndfxNn zXm~9kZygaV{XpnOAZoubz%h7^zmQA-SQs#;Q@os_Rb(v^$t@zBt z7stFDmSg5!Y`5JtI^tv?NLN5fURqNjXJ3c*w#71VYwQ?N0@hW5Ki%gO z46nq0;o1yYP3-QNhIu)2fXO_`*UKUAB6xhRN2!z7>1_7!mi1}FSZ**&rouDnL@n+z zg%#|a5Zf1;7}x0vT;TO3GT|_$Gol%N=|C>=*Kv;`fTa;$DzDcZ^VBqF3+|`MT3^m} z1fvLeY3u?W?NP^?cW$+ekkh6PiRmCLGlYuadD-5_kbl(r#m+&Cxdd%7ku-~7JP>#I z00~@pi~1AY;un+QIlFMQ4C2=T%HbQ;;h4kWY59%2t3Ra69!xLd)5hK2yEF99Xn-F2 z)^Uz{sLqvWslAV)YenR4-E-8tPg8?+V>Lfr&b9h zD!ODdQm;@o$DST?FOq{8VG`CT|$#E)eHkcytj!n*L(^!4lbL5DBIG+0R9-GZ{exD zy-5SryluGi-JJ~br9Jo|VxCMHKsrQ~HJ)VY4#?g$NePE%(IF-zaf_~{3pUsM~6YKf~rA^sz9@9_e!P)AZ zm4^;lJUqM6KS)oH3-Y}vVOj$))e_Y`{`}w^JHfG!TE)=7c5OEB1n#&s}!m*Ckg zJq8zMVeKqBq60-$G&DUJxLY`)CRKNn9z>G1>hWb%OcknAvZK0aEDTYR$5?lMecgwq zn@K?Pv>Tu6A5e~#%-m)~h#)9V;oijv&tnR9=Cx|v6i9g!`X?SeaTa z*Vnrqs3kQt4552EriS*H?(RDFTgwlMgKSH6O2Ws~%jysoaPA3ugud@dP^B+qgj`G{ zH;Grzya0y||HI%?Q;ADMiy>A`pc5In;P)4o@fIl}_3N)kb11AtXE^aZYXn&VtojWH zgiQkM(6TDLy+R?GB4?iDhJkZWeGLzYlnP7w?)Mq`B{$I{rN5`}boC!RaAs|Fg1=vk z@2lg_i7m2&u^pRaza%tW1QH>3BY2TM$?g4C&Eo2b&^}#EhZN*@u78gdJ`N!g>|$C< zrOuz^wftH!2g43LXWg}{V)36}AmKa3kV^dfGI!XCojdsM_)vj(p6~d?V>|p zakHWStPhEFkMg7UZ1(Y}$KQPiWBXwOVC;CN-}f1zL0C=zvZ+7uOQ3B{dD4(GtmhI}|mA&Is^XiT}l}-)x z#5Mb>tjgmBxXyKn8K~;d8eT730-#t*#>Qy(Vfjbu%HX3^>O)L$&V;n)%kuU@WUR=wBiHdtRV7^UsOX z#`fxN;GC=1B@HJ9`3NhzEI1rust-La5cvX@MtjS-I74jq_PBnNPj^VPTyUn4N7xO} zBeFyuM4o;G;#}`rxh00Q@P-qJb?)Z{7S80NwlXS&eA~jn5>m#da}ITqn9@o_w-s@)3UgxEM{T~5->zk_>db0S6xeW6ji1-=7OBF=hpIk zxh~s$&KY>3ZFt^OP5Oqmt%r0eS6xsy?x$+zF|1KlslLgdm~r&G({rTB(e+@I-D(j~ z+MmN2?TEhcQ3|ubrPPl518+=JZ()(pR{1H#iQI^;$=G`e`xP_+{#OO+eRZdX9`x5YI9x~ zRn;ivQSk9dCvJ-{cjni!56k;T#$Cf>gw?aB%X7!QHZ9P4o6+0IH)$T>C(_h zG=!$=AK-mPUgFAbs`9XW7iN44dZ0_2Pfu>Ri;6Su=jU>7aW2=Rp&Ph_^CuXgusoEY zND}D@ib9efD~I*L2N#D9E$9&!CSyYVaCJa|Ujnwtth)Hz<6N?^k_b$s6rw6T1)eZNz`M_MIcGxsJq6x?RMV065&VHyq zQ5-p=xwJ%AJ)8`!+Q^qf2wgv^r~Od&`Zky4er)Fl2f=_oyi9tv7uhGsDGrIA4M5Zt z881wry6*Ll^dbE_oGIHF@Cqbp3~0pOjBs|xT~RFX8k0pZ^+biV`GLb8K@?Z%HqObh z`q@?*G&&^l+0WN{;LnpEY?CfK3oLQ#AVeneu7{-mmVQ@HhcGSYD%Thm?T7E1--Q}w zD(`U40F`qS_gVTWun^QSHHz!7_AGuFB=!Da2oE9z@-e4?4(SSGec zA367cJQ%B-Sc2B$iKHOiP>E9lp~aXV+5($jlj_ahjNU`*;EsQJ#yJW@3=`3(e+-M5 zQkN*GgQc$(&_reT!U>meM&-3%q|6jP4D3N8(v0%hC#3Sz4jVpQ`3s~)+sUvwOma_oyDRbaw5(#kmu zPL{Wu0VRM-#V$E#Kt)f%DXEM`JngZe97+P4F>5h}VLwk!Axtt$gt#?(4ClkEaj^b4 z*^r_S2a9270f`?GZqC6VyhIt;SGV}HRGny&^Ehbq?2Kv=Uw`-Qt(r^5=r@J{jp`qW zmKibb&2*SMh7)ACzaDG$Kvw3bzQ~~|3dT-6VHYj!`rY@%Te>E!5bFiU_b>AJC05Dq z5AVO&1%&OZtx4jxR0@-}V*I4qP>kekgoyVs3s_D41L7zv1G?@}8k~nv&%2eGZ4YD* zD;ufDodKa6sK`->y@+f0>c7hR3=5%&qZXd7#RP5LIPr)o{&Gkb&5B^YfXyrsC~H;N zP!FRfrhgbICO0xhKNq?dLvlXGcFnX!@C5jhR`GVWP3c_fa?We55_39@`*mx(|J2Xz zs;B|{srB{N{xqjf5w!wltLy#~1 zE&>8Bn1#>kpYWV3t)e%FO^)s?294)ZTXC>;?BICZAX`Ip{nED$Ow!nd^e*h+UTu45 z+q$1bg#&2?kfE07khey49+A%VGUSxK)bYXkS5qBKU zV+>NLRvnP!y73E%gh`OdRk^K^=CXI}<(r*lGn0JZu1FdLMr#|7a0H<&Ib!`+#p{bx zk-TLg8bxUDLbRar1f%?2^msY+@&}`Qh4|l;uu6{kmJb!Fp-DwOBC%N@QcCLXYqgL6 zRMzq;O2v#59Cktr#k{$-6gt$khrn;<92r!i$1)=%EEpL;eA|eU1tLj#d=FqU1n3Zn zSy(<2E4?YgC#%-FVOY}YN+qP}nww)Q< zu6%o+cG{{{wRWpN<8AN%f&1yb-&g16Q*n+52#qs+=fJ#Tk#G zq{<@ZW^rz6=_PbO%J@K45vOu|4_%VvIA=~kS!@?W-A7quu1<$wVvv&@%LSg4cWNOE z(|0ELLAEle+kw+#HA!4PREgYFh3qwhP$xaO9+juPpIi=9wq`d^Py1LuR{M zR}-2*A3~ML^;C$eHrOtTkpI#Zu_lWp?hv}*t2_r_2dT7E%9|te-ckzG*}(jA`oK}F z*1I@ncnDeV4$7|qiKM4%%;D}(FqY6rC-=(#q5Okck>dxmM*@>w2^)T=FOn<)Zwus< zEJNp|fma3H^u>@-R~Tb{o<$nIG+OTM`|95Nf=zgK?&2DlN+B0DNj-(uLv2j8Z&>Si zVrn2r@7!$<8{~O`I-8{^Gk)rbGNZO`j&1)3WvGH&ikL(sCY5E)5VOKdds_30GLUG~ zQ+TThJ9wmDRVi0+yPg~M+~e@Fz>J`#m~9f$?f9`hwg|;D9K#S+P|3IG_TZ4`ECn#C z{$%;}@yh1Ks0Nldwwo2SODf}VlJmqH@X!odxMc(b^6QFD+SwuXT#K1BxG9Wv#wRV= zc)^yT+=pan7#g5e8Im&lXY=6l)!dR{o82+JiH=;5RnK9jFb65whKIdBPkOP1KXfSf zfim{;z`RYKum;Y(pj&xkNbIz<@MUzd4b#e;A1KWB7!FTfM^a_rfyv%!nV=krWc3d3s2>P z=wPT+b7Z?`$hP}V#tq4JwG`(p{*FFv4(pNGUEVot|6FZVWZPO>i*Hkb8qRes=Y-?% ziVi#2U~bu*jADbdG%0JcRz^(4rlxl3(3v-oyKcnPU4QRxUqW~KA5aSP?t_e2z5Q#` zNG|zE%QyxJTQr#=oL=Apnt_1y12;Owu5oMv3H zp(0dn8S6wX2#Xbn#`zkA>rI!|{>>MHx7&X+G<`!fi-#F|whKurJw`L%UL%Zm)lRQv zR27vfz~1Dmo06Z(TPiEtSDxMnx<4>r{GOm>O=P&oF~=xP23W~oMt$p+h6TCF$%L6|_3Xh-jCc9C${@zzO zWWv4pMLR^GIk?Ld-;~57ZuZ1I52gpXvdOgxUQ=apPAVUzH%RaE*3Qy3IyiY+JPTmc z%rDJ}IIgTASp3qeRH?o;?rrJtANDzbay_3PxoGaLp83@~;BJN1x+D3x8u6IV`;EQd zr-gxGo$eIead#e>EnynmQ40Ywji+s})jFr+hp>R?V{S$wGKc5jkHY5`F!zAx@J3sc z2JjzxHW~gkVD^7G1~D=+)37o9W@Kihq5sXu_H+ID^TP#aVg8TjAeMjpkpJH?`LR9z zPsik6<6Zyx9K^uJ`tRkQKLzht?EhcE`(^%IRJUjsL2vU0%~h?c=5u{(h&5j3;N{Wm zy4Aj8$MEZf>UmCg7u3}-x#Bs=vlHJ&NM^qy|(GgTL(4Oj~_2);ob3WOI z6$b@qCL^Lg9@GreYSr}(&m*GPFL#k9LB`nHYDH<}^$jw;&kH>f7XvU4Xn>kcIZ)lot`+ueXbwk{K%49 zrD4gQhJOHwxudn~t3C7H(|Lh$+FIT8Dpi4=8nnuxgqu(f#02zNN;_99p1IM~gVyH} zH7y6ZVd(X8WXRYp&5!>tsq>T58tbUxXDbpFn!;npGb}CXknn|JroQ`m=HX(_3f0!4gUBmJlyrbMJKGF_X_gcva!GA(W54u^DS5xw5dzUhW z&5w0(E4d12UZ}{7!v_VT>=b6U9OG*=21?~)$sn+-SJX5-c^U0xf)^8Q*>b*FCoON~ zw%}LIRpVXDTM5vP_i;YcualG?zqYrur=~6lPdwZ}cTkUWKQBdHgZS%se_MO!6k#O> zVnN(-|eP*5d#M}HM{8U{y;kRuZSafL_I9Sz6YeEQZOr}63 z#%S*Ble*22)zJWIV%1LlgBEgLAo5dt=JXhoBF;2?m2OVw$q%F#XC&1KK#vx8LLVZv zudIkd?$Iq2@{w$GfX-fl*rLj;emq!3mx%q&s2o2-ncOx9DzRqlNO$1Y*yj3EmTeb# z4y0a=73-N83R)PB4JSrOb?F;efEMLzNQyI2fB=DL^Oz-E7i^l!x;AKOWT-Ui;tpLf+Z~tSKQD%(wL1wZeK=@{Ah3VWnj)xgG5o-MG1qG&2Tc{MRcl^fq9o}+aWwTrmcKd}8|m|O!-c%5 z9$M%kHz_{3@y+Y&+0pz|Q*P>Bx1ua#@MSVzN*~ircvPRlJuTl+l`ab7!0d>AUGBBD zdhM){^c-8@6$o99(-uOw(~wi-*_d7mPT3L*dX~Sk_*?+ascqTpSkon2f`ll&uimE0 zw2^^pSRN+DxUCZU+}c=kVWPa|s%W@?>$yWEQYYoKe_6Em#7WIRsEqo;ej91AdV1Rs zN{pj` z=*o;br$@kYB0YYSw@|tZeZ5Q^P&=1(Z?T9_+fzDVg`VtfGkN-?_=ewbE{H z2({_j!urF$3KqeKPNF3oNIhu?2EkAkx^xn+4&4NI$87iRn7ok{1#2G<-d2lq>B-($ z19N1i%8EziGRHTNkly@57(wddy0?_HK!d0sb)&}a$T8~00cHU~*DJ1y*(i3F>fCT6 z%FX#6+3l0&rJW$hiX_7nu%PBUFjt2l)u@QjlxWXH@3m8-Wm{9zwIfQaotfVt(xSs* z`5InI0q6ZD`lc=)bXUy|96}*RcK!G`AtD4G$H)HN8H~g|Ha65v}79uji55W3(FbL1sO3swD6H@ZqEA;2pyP~67}`=wFK6t@zMLcr9UJwP8vPXT%?d!s!(Aac1n`-hiCp*P^G!l-qHTVCvfmi z=6Yz%M{d1)RhGpk%?dv1 z1f7PWc9^?&t}>4=P~?sa>|R`)6R7Un*sorq(SY^xvnZv723T$_X(jrKRbPjNdPWsK z=5y_k1c{nQ30HNbZYiILwUOEq4a13fkz(;24WYKmO_Ws355<8x5^)8$1MdLw%-a_~ z0#2>m=JYWO+1Q)Ae~_3YmRyF?X|%lii%EzPIDC2m%EKJgtflp#&Ok zV9te_3iMI}Ta-!z&$v`^thbR{Nfd2nY^1WPL`D6PRs!~K*< zmdn5UpPE&Zef(K5=cVKBL|G-rzDkvSA;bGaMq$sDhpuNviY&n}@T{Vv2zo7#*BeMj zLt_E2oqexOZId~qAsV@ehD8$SjcMCuETcE>DXQ_?14Sih4Xa#n*D8=oD1-&mrr~w{e&|Fjzt+dl*1%ptYe!94I3sjjY+_?uXmfNvA{J6Hu>kvz0~_)6Npxncu)D7c{B_`B%z0Fz(azQJ*Ngz}z&sdO~A| ze1d){<~xkjwyprDmxb^s3keI8=%$A@d*_^-Qe|%*7dq(SgMpM4ZiR zT|P2R;WOKh0mFR$k;cbfW>5Do{{A!l4MhC5p!gqrkbm7=_#b9*CRWz}-IJL5iSTc* zApR5K2jhv)h9vIx+uR^dnci~busV>&o97~{zq3nFjW+5y{{C_X^e+_iZzLC!Fv-tr zgu2josq1(_xcc!A;uBwTil`_VL4KB-E}Xr*pN@t9xz0@d*b@KM1sr~HH}Hx9(#=qi z78lqrqb`;&<@}2B;_YrwAES}V_6)VTb^LLmLw8_vY_dZl>`@$a zEZ=y@;4rgjD*^T*+0V~PAPJJAK6`=M7%PR8Zl;E4%s?1AMMfymu7^kC4}YjXUS}6% zsSZA}n(iGs_0J^!Pybecp0Djwz9~ug@|bPXV(o?fBTGs6vs6=#A^cB(U*hU@XaZ{b z@$RPzcpfl-D~P%}B{ms+dwBvx8ih6`L*Q`b+&>@~Dz4_r25%XJ`rc}W?cEH&j97WF z5xsFb;R#w4r4nlfcs@>U+Bcp(M`ukiC- zz&Umn(gF@%Nyu$#jA(I8oYy9sxuf0O+`-{ad0^-sT!(^La5=abc=|p;VLDQFoqriq za*DZ!oRJ-6n~afSQ%`#jtaYuKQnykb$hkf=FjkPB2BO}FsOlop$uv#2_L@_&bE`5P6PapcJHZ7l_vK=G|}DP~z_6?$G?`R?^}-_;oB zquza+?Ca9SOIeOmn3hTAag7JI!6kO(s=i7a$3mqjZ&Npl+wSv^JZgpl1-wKUDm<(9&0Ai zPtw(hqJN&m^CtY<3<8Z~mSP%r0@`v=C z&BZ;^$F;nZixpLuj09ppXeg_c2AE5hTdUdQ!bDonmI`(bn#f~CB^JOZ?xoQ=8sdP0 z_YntP%6>4_2%gub#@LebDj6!V;maGGqe&DyT-Nk9?Z{1&kO@0`3x6@=&oFzIOL#}> z+;n8)zFSm#fh#zFfBW_r%Zl;t3Mx?Y1caW)j9!=wzv6xphHqH2Qd0FuW*T^*M5lXy zI0NluSaz!?1cuG4M!tvY87J?$vh_}*Lx$+&SyN}drs%Bb+9uaT1O*-W8~p^g{UC!! z#zJ93pv5^B6X@6)jS!`Ob^16~L>yE$!G$Np78vYn^PL#+*zX+}BmH`s7H*H=h&1a# zsW-y;s_NQfjkEKo+GTL{|w{Uz>pZA7ngk6{%XbbJyfJ1)xB8#u?QX-aZt^yQ|RV zcNp&N>zKQXO!AQ*A$mmh(p= zg!Q_VToWh5+1CKVRu@&n;=kaaDs5u3YVLu$ksvJOp3>iyz@~bNvoQ;Ye1?&hp|f6qqg(R zpMj+vnk;qAI-6M^T&?hq#6kW-6w&AQAkoQ)@mqesAOPK8<(@FRY66)w&PF^PMY9Cf zt@hDziTE=+w)K})pY`D~t}PDWjIa25N^>k991)J)Tn!$T^uw*|W4J`ZvUHBvRX6Sg znXx`9M(=P}_2AQlR?P$5(P*iO{=frz292GfkD(@GYeOKe;ElHCS~mBXUVyvA`PC#z zHG?cbGf!K{H7Eede;5Dh(7|+13+Z{?hUni7@eNlxxt_ulRWVgX`>^8ITq^Ymfxn-A z!{ad5;9Tms;SSfPzP8K1vf3;8*@^+-rW<%;kg9n zr0ME=*#7TbGofYgU2@#x-B~OUG|?05PZV}Yn&AG` z%(8Y^ir;)71t%frqn#BrR2y_Jj+R4CV-z!83DbC$%>%r^Na4 zwuFl*HJZEgrEpTIHV(TwN1#?JW5fFYEgI@^;`Bq2d^R?R_RrS6U5*oy;-6jODu8!n zo&yHfa)=U`joLPVe*jjo0y_S34N+VWaD$G;P?-WT(`d!xK(CtaHS3p~{%5=_f4*YH+II$CYEIaM(6jl=A3_B-5eENh`?<&7G_h_$QLFoZNe zUdMCza-9arhtP^pC16kK%`f{9xKeo1=MR|C;gD>Kw^mGM*aGS{U2Dluw99SqgDq&^ z8zvJF!K*31x%Qvy?2J*%1XqcEo1e$Uj)y)V2{S*ydA01)xTpmE>gPspy@LK=1t$9| z?sM$zq|xK9{?^(vesvSIsjv+iT)5eZIo_X<^`7KG*t)e`6YUN7#JjsQ!yEGKGL_N! zNK@QX)y0mB z_&4?e2sKkD)=0#}(q11eT=@M!z(`35m=5m|h(X}^{=?@UAP|pwZ9hf-E-4|(Tr(Rt zP`62q<*nY&A_Lxs4$ar&#m(+xW$L$jrnisl4Y0ANo$HNT#YwLtaw}7T0Lm9Hs2=da6H4!BZKhzM6UXWa(t%j<&W*^(!IGo3KF0#L-rUy%2+?3cU2G+uJ-5RXQ zy7teZ&W;W`c3T^IYH*eVq&i+rJCjCdCN&vHVe1b=XkeQMvC9YIVbV0rU7_J%9d5uy zfAX>h|TlLBCt_ zI-YfCp^O+tbNps#B~!CvJ4rfzeNX*dtC(jA;q7JGX-j%{mZgJxLVCi7W(`VW$o$B= z#L7j`;MSy1{SQ;&s2C5r2GB5I7u4>g;5F&z^O!^3HPkH1{EOZfs|PaP_UQ$Xx~yAq zcXn+=y^y~$^8r3U>|Nc5FVqicb{$w?eH2hudkX#A2ZMB)Vept z`KR1vR<4=-%qQOAG*Ds~hY$ct9P2MrnjDzhqJDDobH7DIMBjJ196noie?mt33+=(T z32o_a@OV(lI7+E^!=~l-6{#MwzSj61lNcEwK|22Fv8IC;#!hY8esB7MUZear#;>S- zeFgm&x-$_Dv-(lt+D8dAsr~k*jSx0nRw0UYgBSXt>naMMDYn0$#ydb(9H6W3O`xFD z8`^GbhB97RUl$W0cXux5{IFWF^hkWwp$rL1l^y_8aZrJq@UvM;&HTn3>o1C!>7Vt4 zV2bNcFPMekjQ4~di)%oEq+%s(X{KdOXiG93aCn7Dh|ac&R4LOZ69lQ2?7LDH!s_$k zh{o}=(ONd0XYo(AUFGu2ot;Y)ui;Y>jZcyfL)}wC11msucTxPO%%j>SNSlP|TlPeA zIFyI(FzrU+TGf;+vkzE(OJA0LKEuY^Xbw1KN?5@?IS0BJf7NP4Xp+~uHNgRW*GgTQ zVoKvaTr24|raIEaLW#*C&L6yDP7H3D3aCoM=|@P7%Ixah&ml~}UCKho(rU;pX_65g z{caz-!%N`s@RO~Tk9nf$${leMQ%2!`#UD=YtRG)jI@6hv`7Zx)nt}87C(s3iT5K3v zgM2~^S-%_Y+xDxvr^|qqvgaBQJE6Nfv}!TErkr3W)O9r#^MKx|3Iz~Gg##=Lr%?Us z&EFuLS}GT)gp8zt^)@tpq?WZErKV`=zsM`XR>byrJoBX) z7I?cRyJr}DV(!+n%sEKO1e|8h_8}?Uk@2M@LoGVpxLBs0e;HadmMl> zQja05_2y&OM*4P^`%JU@78`(2AP0(;mK#eADqpFyvJakiN|F_7CI9*H)#txB)?~#$ zw?1x{;ON(U+jQ`~TEQC|bC`Mf?+1*=sXC)Ln#ZQ|E^5)1#E+Z2T|B6NOR>HOZXFugUDb!3 zSIJ;f8Hxd%ru)!MOm7vc1x_*84AKQE1jKK z14`?^TY1-779SjU7)BjBDq0@+3m2%g(URFHUF zh52wH?}&U;1-wy;ArAu3hbidU(sP7RQAdj$Q@KoU*`Te=Ko=w-xY|RU?JF?{3Xp5y z&&&d{Ww;ZVlK#d#{;j3UxI@g>Z?m~CI&}TpdioBM-}?(|pr>ZMtMkEUB?TDpkF{;j z$mb{Qv%6Cx9=-4ks*S6FpJT z^n5)jD;|HH#A{j%XPZJXxmEK*d1l!*(%+}>IAOnXzJv*T3NQi{=jw&5a9;& zfDoMT{Sj(J%E{r1zYz=wCYZGqn4v)hU98I6m#PT_vv*SydQ zD!B$F*aFvnjyCKoCW6-od#Z`Mmu+SCbwf{cH@@h7_H2y}3K4Yu2JT?i-(d5xt05kx zL*Hg>ZP`M^fk* zND&1&h^DT}jq^HUx^4c43F}|?5&s8mjfL&sw6)8Bw6#`*|JK&Raj}Sb#9OnbiOe!P zGA94`)ut@s0M#i zp@}D>zf4w%p&os0@4&@pe0HUjynFbtAwV2cDU6*Cec^(&Q|*c8VT9D!{}|oz3l_N^ z_jO`4DRjp6;x^6h9t}Ou??mF?X_;U3J^tFl>_-T1D@UsXUPly8XxJ z&dLiQ=w$03M92a*8H0+;oc7MKE#Q>38o^NQU+v1|Jl}s=ia38EA4)so_T>tsqDq-h zCSOa8KrWe2S#T>SVKt)Q?f<~<qQ3Pm48Jvj`%W)>8* zOX<_Hv}M|U-otkdKs1;Wiq~A1rDfrx!Z^gTLd&!`!tX0%o$_mGUarGXxWuQn>#8P| zDtH*Kx#Q7kYVQ@~-Nw{M$Le|0zrK7B`KHIei&S;mj$}P@ZZ4LSPB|Ac?uyQu3e)h7 zDQJUi%Z4}70ZxbV)87pO@ckb;MrgS$-eV>UD}D!_wT6 zVwM}WK&!?DcrC1X4qX zCY~Qqjo9K)zn4BcC5v9J*8Y53{QN%WAMm6cMOHu}&L zqI#Q&37JF0PR1caCi9Q=wyN2rj9GKjDy6JWi&md@Q8F=V$F z=A!)qC9)B5-;tgMLJ4H(xND*`%Qp1Hd4$Jep1xJnRDBNU2)H1kP*pk7DJwX^jC)N3 zCqhNtZBHOuxsJYtm()xldC{P`Xcf9SZ%TF@aT_|3D* zKM1@1aLMQOq$;SI;|wh-q>34^hgPP5_&)%|Hz*`0UZw?Hhv;b^2Pk}2l-ugWG8kZe zKp2HgOxR>4U2>COh`fg)M<3PNLQP@p`QzqXal*;Mwz2fCFR$A_f)lpNnH1nBBO!%+A`NN5*H!~!)56&;V0dF^2?9(*2 zWaFC7zS}CdX+m+sMsH#=5oz7GU`-^z{yvmYrOa$)uZ*^Gb`zQxT@poOg!FRZp zFFxV8N;x4E8GiL@fETHs3@)}q{vmP*!`Iv+S_B?GR|DXWw`Y>3#^*aGj?AKjmVl2F zOp&HIb%rYWW4C;X zR(VJ|9qmS^T&m@&i$+7mc$KHQ4b-j!Fu+;Un=;i~4fzTGSSi9?yu81s5L}GA0|q{3 z7`TNXitbx*a<&9^9CURH)HMskGw3MXzgsm6@O*414C$;s)86PMdE}OZ;4n{FTFqDBUKvQ!+i9N$S$-#4%jhjwfMr&uHrSG>CQK<~4~==){|W-*9wS`{da3 zi=CupySwT-QXFv--*t*%5lEV#)Y3q0KQ@Br)W8Oyf-cx%Ie*z<&ckPy0 zv<2)8?W&L9`}>oX%A^ZKTSH*peE8{cDJ*#?j6;V6xW9I_$t=rH6Iyg(9I_>%l3L>u z8;{zvYq>f}3wB@Sb~$(E5>}y^QAARpLfNL0Ud3Bh-!N1y?cDtoIa7qoEs9i%WyFox z9fk2#I<(;(;&vg5)iHa7?2Uefn{Ax(OtZ`3sQu>H{27~_S zk-Oi0NQ0-yfn1!0=w#WZ!On}QXDvmK4p^LuHtNh^P||`#R#?CAo%J$Qk};=Af>97q zRbEBiKKkGgS~~R@Y^r)=ad=;UHJkA~qK=WRzPcKRYTbh>1-$q`4TX}058oI!lDURw zXy;_f@D{l;M5x{*H|Mrqjq$0s@J&;_oU>1XFRlHS*|piJoXbVQBr@N?4|O<%1yTba zdUVj_QKCB)fCH-^AcDo=*H{Cq4>W;8h-8GnTzAifQL>des@SFWhM^#R*4^cjI-<`# zf&-iG_WEs$o9|}H&Q&U2U;EOK_jusQSey_gaPQvlN+!sam4}ixg?6lh?xs~-wQ0|} z^pPh2`fybh`~5c=*KGBanK()_8pUFZsy-!dc;6=FS8e9Y>r{>3D@Df_hZDIbafwWPe>jeP|S-$c~)o58Q4PtJnDe!<}WT(FJ$x`PcSsZ8-c{LZO;=8)A9G$qx5~u zocE)AA*X^sTh5yKRfWk-ttH~h!tM!MC6iWOQnXaC!mo-AIPcB-iZ|E+Va@=ReOpGC zKmKmAW~m1pDlf&;AE3iqvKPi8;1@<7++i5Nb46>OqO- zx8;qz5guRVDZ_@YscJfyCFn=&N)^y&Af4`cI)$nW{lj-}=704%wGt*R=1q{&%c7gxurrQMf+$p6*NEwY zPOxND16BmOV=%MG9CwZqNz3OzT6t%_&|It9k7=ttefa<>b!*OZhHAL3=T|0Vja05K z4nfGyH)6D0AJq?)UdLcKbzg7? zeB${Hqi6nyS@vHk7yrX7%ldzo7fU*9vLODmyXGf4kD?bw3UO_g@JDk^qMRkV`APSk zFNWN#9@T6{Q0@Eu60~dJ=h%iS$59{JmJJfBJ4c8V!N z`RHhkQw)uzGMWsbhwiZ@Q+Gs2)6+$SCZua%`a80V zEIlmWi2$2;O3ks$6-}W?q}VO;~nYOy4W@S5B}XnUX7vV`erJ zrQKn1ATn~ZCK;Pq`qR};%QA5YX(_LQ@UhkU&d@e*X9$hDwfotuZkgPar)+SK!-bh` zEHpPD;=sqXiWROXZ5I?pGLIuw=)N^wh}CIH>8eSTIE>|~NrDIsRv@6*QPRt z5~H_oH_@s^%u$_Be3u?=?r9ez1+tzxf^sK9J+_%-VT;^p{c_VyTKxjv^2oxEG2Yy& z)xRaEhEbH1WTl=sM=(}}33rqZ+?X#5k6Sbo&gn0oj}Kf##M(X8+d{IwuNaClKk8Zh$rscgM`)(dW_x!?8;fdhFAuhRx zSCOGZM>EV7%1y)oJq!lM2$-FR?{=G1Y}MQf5SzJanF8cdg-ax(ipUVq*uU1^Afv@zVxJc1hDsV}sN(*MB9B zbL53>tq6?`i!$i#vw`D{B+anMEp$I{i80%hDG|>z44$gL7S?mXFLgXnmS92f= z#^4gc3epMH{=}=ND z^kJ?!)D@(ax5;M|(Pz4)Jhx(lkNF8@%1csBG-9>AxNT+RsdBYAR(qWi>brX&xc1ak z+L4&s3)$iSi>u{bp^M=rey<@*zaigT7f8j+zge zjTE4R;Lwm4#Fasv-=y+M#7duIuD_n%{@h-wMT~SZc%mx2d;iS=Fo0e802MvCrWqA5 z*SrpEMW1H3u2o<};d&~F89=MGm1vMw(YVwUC?ZzX115eGFI_$rOKm?~X1{{LUhDw) zDVF35`J^t=F=-YL<9K1ZEJyUFGlJD^Jp(-1W}v3H)Lsi7?&-0b_%C~Fc4gyEjim~3 z!YNxFaCCV!$d0n7(|h1mWiqnUdV}6(0i)EpEbwL=F(|l=aHjKW#=_sDnWf_}w2k4*GOOMm#mE;S&oR&}AH&{zb;LrupiiTQ!qcw~(syy^K96F0~ z|EzWcxQM!Fqf_%Tz=R6!cJFk=V}NQA(sNiF>czRwrdg_)+)-3bgz6ZOBgkwQ@(s7# z&2GqJ|0FuK5fGnJ3hoQIYZAN7CBgiIyA+b6f#)F#GIdIZ_zBV0#r&oxtUcR##!`~OFFw{Qt>K~{Z{E^ z`db2$U~J5?f+;!U_M5fe!Ng2cx3+v!u+17yaj%)z$uqo|soEyKvrWg67qfK4`KHd2 zA$X(Eh?c^|911V?1){Bd%KpCU9Lzp~sV1<|VD<7H_n1 zsG9}HM2{EMDegCPM8CvF<;&d=*Gg*Ahs&ukWVf0+)ptjA3U3N3apEn`xWKu3KX-RS z)oj^fmu<;+ZiVnId!8u0Yw|wA*cQqiz+GZi{sidS2P&d*$j{#JqZnMYoc(Csn(DN; zo^uTBF(4Q_T5H%P#eFA{yL@I~V;||&Z_TdPr;6{bg!+;i7r#fA;1Hn|1wVyl#{3&b zv@NIgPe+k7#e=?l#=P@?ZhJl{6RYVD#95~p9vQxswD_)rO8hye;=3o`)7!a6zs8#r zj)20<8Enk#JS+{idNi-6mK{--yDTiPllGkLMzp~2wy!S7a|_9*n3)Z4I4>|Q69JbI zpMZdK=(?N_XkvPW%tG^KqU{0wNCUOMeUH^SZHP{ADg_C*!Dt#bW8S7-(MG<(bk%Po zE4%Kpxp(f_76SLA{OA1l_914^OKgb6pB7q68SVWa+f0y<=7R9jr-YFhAK(lN{&Zfg zp8~(uYe^$U(DT4dTX;Jud;ofYK^qyvdvew*WW@M56<&ysByT`RWFMiGF6cjj?>b`1 zoUOZMxw5>RTd=UCu#h{@B(!#|Phmv5ekvwBqD|1-F-8_IOfy&(A*SGfWGsY1fe`OA zp12~KU@(M&<|dH-?CalIy#>!F!Ljm{K8V2Qh~maW%PziQ zPe=a_DTx7-Q4mu*d2s}55O@p9&6y}&n2vU=gex1h@><=X@%Rw!*Eqyw2p|+ehQuG8HVIN z-U;D&Vo)9j%6Ow6tl727*vH4k<;%x~&Gmmlj2XH)cn<(lh`Gp_4sIw^($feqb^td+ zbixnaK`cmC9;V)G@TOWy9EQyWNvS<87AWQUXJxQ3%r;0h*6qC?IXym@-OvTV zR(K~0HBH-d0QK4fVHvrO-xTQ2f7$H^;W=wsM?pVl93ITZTAP`X9m8CMfM~DLF9GtGBuKkdRsLq$f^2KtsvpUSZ|l;s=XBz{4M*{K}z+gV&dagS*Zk zm#;#joi5(8k*t~%-&|e{f3tTa!R1RszW{nF9|#gmT_prq?BHP>4d8{YxB*lED)?~f zN}W6i?8@e4=fguk+u4UPDuWkW6X|u~0B(?~jzE!wgniCj~+lo-X&^cB16Vfxj zipdCVA>p7=N5mzYw%DCdZi4zu3CymJH=w{>hu(@c^<7`URP`H&D-frcBhabz&5kjI$oY)~ zNb$YEI5l*=>-#fs z3x7e7#+F4i#6pfjId0fq#*a77L8hVEzw1M%n^6t7Sk#U4Dj}gOIp-vP9BlO3FmC6I zUXZ%HRk~_+56UZ>ar^?WP_*|VAdA`iwF%*`VmA7vKWcPxLMFB=5ZX>YqR(D`RdyFL zje~0`%4rX;HVwH^e1h;SA?RYIZYXuHu-RmWk8y225q7n%zPi8DwAaLFOY4fpOefuW zGtk#jdh_9RfZKy+a8gapb#*Kl2}FUS&C4bIem}7H337amvD0R;5DQ4|Rv(`>4PE{I z!OS@2U~Hv@R6sE!jbjD}Za3n`6jX;ATSLrzu1H(~luMDG$>!fwWz40yff;DFB$;%i zJJ5W!lRvJlCRY9Wb>8xv(|1ElqLgTf%=OvOE=Le68F`U{P;mSUXPd=KX7LZ?mDHr7 z{|59m6kKsx+a5n$o4SfP+-*!fvAdFYt}7DYme?XCJ5*ejSK#JW61F_{y}C3w$-O}# zW*l;ttOK~1UwR^wO zeOLlW8vS5o$UBIN7`d^~LS*zeJgM;+!s@bwlFV&=K$HRSyVbc4Bt^a3_KVllW(&wH zFGy!nrh~n!K>pNbW+u!E?h=WnL~>PY9sh`0+S!)&&)*X-*6IylgLa~N?^3^)*7fnr zofk@LyW-K(HB4n11Yne0C?ANeV78oC`)T?=Wi_~FIWpIo5B3(V;YpM?{O8-lP;@%2 z_{qU(+gF6V)S@YC4}xNjruTPxu_#FHB1;lHYW1FxB!~e!GY?XGl>H%A*aV=M*%NZw zdXFh}=C8FjQ0~iIdzfv`G6?D-W7ed_uNxljYN&IkAgibzMMW+}CT>E3Tc0s#5lH?Z z8dK;i>#*E7*H^NK(biyR^ifuxL$U2FV9cN#vM=SmokpGF^sS*I2^=1_5@%U4x9%*q zGa||rDV=hBWfp7fQGW|fIjt+{kmLi9!Jf!ME=$6JWCH?e1U4$n9v`=!v1A-1hU7Guua1|5R8G)yV z*JRE$E!WzE`C>15zeE?jCB+97G#J=K+PNCPQ)L(Jt<4dM@(J+Fywxr?xM?ceNiHf` zx@7j)EPW`MbztOO8pE!?CCD<#aD_agzK-)M@u$5Xm14KRSPVfUdx|0}KtY)uC~gyb z%t5992B%p3jY}^0e(|;Z3vEqp2?|!nz#+Y+tK$f~IbG(V)Zpj^$^_4?oqb0+==Q~K z=A_0Z-MVNlWaEJP0NHp)mzIQx23U428x~ri${jq^zlHn?wo>hSMk+SZkw&*8X=5G7 zwSPNzk+D0*LAwomHyiBE0Q zg3n;NEf+tbmFlI_lWIrhJy|g^-W;!n>msEJMUm+Lb>u6)eHeaZ^><{AOeOu2RomT> zq1ZO6t?wX+KJVcY=Z9d?F}aPdosk?W2HikQE~Fh}n_QGXd2n$`o-nV!_$t(84E&Gr z5I^udA)-M~B5YZrqqDJmbMo9)PcNj5p;X~j;(BY>wbXBVNQI`j@T7^}D*7RxPZ^mW zR#zx=mx7Umr2m^$CrKbS`FK|Cl=<(`{p_d4;=*%@i2 zh5ug=%pG%nZ#ihX1|5DTQXCS7aOeo}8{xZ0BHe#exBky)yv&^cH;wm5Q|6~`Me6b# z{+Y?LC>0EH#AUC`W>_F*QK*!J6hf}$8M&d9Ar~E9ySV`?7E;C5!Htalf=r)hsErsJ zxZ0<_o|%zU-RB?qt!fI9y&Pt(l#}!MNT!vQ^H~eve}6KIbC{M)qOYEr0h}gb&(KT( zyiAfzi^nmp1+Lc!Ri29dI2$+~#)9N#re}1IHE!LSUmidHQKsI$zOKD%Ea;x~TVd-; zX3cTeke!GoG>pn*v#fGBW{RtuGoDcM1^mm%_LS6UZ3xJjus;!!)f%;tjb9+ZQ^P-g-1|D%L+T zHHWiT4bNly@VPJc_GI=*1s*tWmAKPPNuCA@-0T&?&Svpy6iiQ1qVr!B^C0@k!CM-B zWb&*cZiqXMmCwDDcH-BhRu&(}jDPBSI(T`{-Ll@D?44>s_Nt_n?bi4^QKcTWqS(mx zSyleRqC}DoBpHqxIFy!CdKG5db6P}_#|>T3`D+n_B;VIZpVD%Mf#!7MryAuJC8 zqX|PHa4n$6zi=(s^H4MlxBZo>U`V2) z-8I0o^r3P3fhm1l;XmOOVW%kI{|(>0)7269z;HKJ)@J<=zXgJH&FKn(sxaO8gWhUGtyceA{7ef2v1Hb|Gt-lyy#bDEwS(!Sw-5R=L`5gZpa~E^vuWpWz!k zv}t)tFBKf+F!>~|wi*B_dZnZi*Fd>3nX543vJVz$omU_cPTzXDZ{vg9sJA-U!jJth z8$=rELS8%7V8;h=Nd!x9r6ezu$GJZA4?l{XONnO7(IVv_OO`U{)VbI>d*^I%?Y5|7 zC?Z*>1E&YrhsMsq?tw<&c(N)L_Uw8H-dq0l!Uaiy^vLRyUd8ogzyQl4%nSRAokL2# zgqbj}H4u8I|KiQ4J&_`JM}eU^J0dZd4wc6=6eqvEZ)hLJZ9~gCq4WR>wj{8-Gmz1B z70n<6jm(Gc{JWzp<4;iE!}>;kesmfC%v-u{q*@#HKb0CbBXBqB3ylceR*-gPYg?G# z(d;6{+6P7MQO@r)YG+8BSWAQ=Ojq&_S`A7d%h^@Pn&tA-_7 zawVODzv|a?_PjW-&GRDnqj8nYI3|M0t@&hzXt1Ft!uE1TiODIJgjsupZ&DU@7^05Yv&Wx!h*f#-kR-o}604gjLC#jg1FKRK>&VH);)5qD;z_v~ zd3;=71U@Qn$jL(k1@k!#KjY-VmUg0uWjL#*RXf<PlnaH_5oq+~l^Cml$i zCzLwdiYjxNQ;=P|2Q9T;@8Qo$46PPc3gERfm&ra;*H*FH$?nh9;ktKGDPOpY~%D5p(+55Dp~ah=sbekl11Y`o-paiWC(*-i))lhq(Q?GE*pS5?^NUPA9|>7u#W zB|Dr@A-_#|nZe8n2*(Z=lu9L3&F*SF>K6+#lQdCxqkEwG=u1ZcU(tG}A`Wy(T96ru z43CNKUv}Pcmj5Lt`D;eRY=1q>bo5@f!e|EaiK}Y)x{Sh1v;q@!>Of{%m%z@E!bNfJ zble>50aK{pK=*>w>vTo3Kx{c7TQmmit!MUBa-HfVF;L9zm1M?85s7#7TxNq3@;m{{ z5e|4fL$=nA6Se*bB%R*Os6tNGk)}FzKV~9D%*!3GT&a(3G0J15CXFeEj+!(1W}IZi z<%AXa82KV5fCSp58|UQeI)Zd{t+907747BAD5j(uH|Km{>Dl#Cig<4AUHL)gy?{_v zNK##m<0XK=bc8MzZ48J4J#c$i)zeUd$98nj24Hx4mn@r=w*Z-Rd5*Ea>1;woUN;lw z8}$;`4JD~#FcUW#8yLwwj@-}802!S7+WXB*Rt1*=@B0e)cse~g;OFb!EBSA#f&ZOo z`rl8nSecps?>xs3UG$(8xw~Whry7`J6AI64&K5 zHG5hq!A0Z~@vkQncU9RBkgm%RD42Tz@-jbfnTUuqeo>Q8HV*Tb)2TJq(9!+4ph?ry z{WyBN+n2jm7or{$arAcc5ENvTGLM%M+DpcWFXd_bg8Q@c%_?`LCU5F!*NuL)@tlI$ zBOU*+GxoT{z_=|G#;>dU(cEBJ@vBKQ+*F(5IQ=+t9{4lTzBX!9x~~M|mxe!jyoC@d zJ!}6R8D^pQPnb7-ymTm0;Q(f-5lOU8Q7^|zC z$zh}CJ>h;lyMW4C((l$ikQ(tUQH~%lg=T~M#wL2_ZOf@POqq%#hRMNhat+$8Tpxh+ z47E&_rN~U3g04F%5%&FJ+?*P4BNdcWs#Rp~)GeBq{ei$SZa2o2bv_0H-W)k|x<5qE z15BWHbv#LhHAlK#)yDJHt*CAH65{bzuGqUGjQU=VtaOno? z213P~hFfuu7=&7a9&ipQ`+)SsTWb_Wq#)cOgd>8%y;!ZGP~M=bOdJDKxd32&iYeXjIM zmpOWyMX!06hoG0nOi}g(mM1V(Ivx5tzia#J#>bJa##8o4E)~E4~63KmrxvKZPm4xywmqI%7rA`|0oR_9kc>#JO2H#AF|%(F(;tF1dauGR zeS*r;zp%4MQaMJUaAA#UJKHqh8zKbkR%itP-8{4tcphKKn3NE-R(7XfteL{E-$b@S zuU;RSe9lgywFTxYn@IvGc$&*?y%jXdS5yv`Z6hl0`GKwhk#R4g)3c1L115#tzsAQ?EnJ-0I z15Bw~ptrg`cPSn?F!g2`hI0*9F-afE9pCph8nvuD4F{*G@xjNikt;oPF@Ja01h@3H zZ-=%=kC22XZ=%hq^=S?})7|c;lig?D6c_MLp_b*C0B5-+`w%dbbJ*Hsus~_Eb`&F2 zk>#%m2L(d`R$0{~X#Qf|pE{iYh8D^UBRtE?7GvgVWCfGjSb5{q{EV14ebkTR*u!WG~bR zyp3J%#|$xV+6-7qh5=bmmBpM95d`DMp830mBgr3v8OM%Cj5B<=%*ZKgEvzgoRREQM z9K@KPhXbP_P-5+tv?5f7Q%HxS6;L^xD!FC2upp>e5Eo(*rI7V`C*hp4_rN@GZ(8I& zs33~>q|Nf1>{4T4Ydz(0`A<^fJs5JCB@6cQ&LsBjFLzm4!x;WX2>~jt>0c8xnlsEu$kM@d}f4q zb#5J;zni9Xvb*~;S30~h(||eR#t-aYCWL2(s!qZaRK7tb#RZVN(&a+=W@jLawo+T@ z#IYfkj5Q0LSf{aeup6MwwFpxT7z>wYEoP=wBtv|=SkCNQ9&opfL1hLX83=yN!=Ejh z$!pca%kE||CR+hvMF0^c0Hllhiz)P*)MR5MSMTT}L;%mVL4GdLVsg2rc@n{LuZk_o z=Kwco_VNxwcUB{Rf{Hsh#VZ~o)_Ifdyv~X(hRkcuXcc*^^D#E_-F)(KrHDj=_(Aj1 z9R|Oo()^;h%R-$Ijod3=%VHn?FjnvmAPhZs>I{Xxtew@TQGRdB+j{qR$S;s7CuL&N zo^kt1JayQsHxx62RL8#SgOlX0ETy$>N}G~ajFRHEK-4V6-R`MT$>>vGdZjupkdO-t z>yq5nytj}goLJZmB9hJ~kqf|N3V9s37xBQ!THimhfHFt<>&+BnAQIhuv#(De{PL>f zsMT{lET1i^ewAa^x{F24Pu1dWGt~DKl(R#;Grq9PMX8(<$-l?>uj!~EXD4SRk)9?5 zGtqooo{dSQxh)ExrnsO|GNRgomeZ$zx};d)Y2}W6Z4~N`K8k0uCGyfB%GOKQo{CCGbuRj6N>t7bv|1Ni?`+eF#FMrCB&^PN$Zt$|6r3 zob;I6v);wx{^2W!G)CZs4!Z#+3$-++?$F`zKiQ{U29X%+WkRJJ#X(_62vB-%lG^BD zby&hY=~z*`Nib}sGm@mjRwheR=_Iir8fpiFTR4V5S77{gDTk*&yKE5IS|EJOBPa$chzD5C z;9a=nCT}bIZuPan&pOaxc3>r+@-$yIjgRQYqN5AdV|1B!|D?Q2Bhy=}hD?M;5-#ci zgM{9kv{QuD8y*pkfXn6H?oCh6qZC^?iuyuYeQI1{aZVKMP6a zTIx9?sEUJ6j`HcjB5+IJ;?usw&~9cmLJTCv;+-0jdP_xOUzAcOM2axxOb6LMGG?!k zJ8QcSXUm8gGUmPv4pWHKWaPHnAXLb-7lOT>eN&ZLTgbiZicbYx+5C{R&&go{VYt_~0{&f;o*p&vz0Rikh%{ zyh)wB>{R|_ilm4M;ssn;RoM05cgEKwb(0^CGg9ur;z-$U|JI)2b1g1jd{3+dQrT+z z24-9BfD}Heg12Ow_~TG+Z3v5hUEL$N>Ma&(Q+-j(0!X`t4EX#pt{cyK$rtpKw0CDL zIs*yzv?Xtx*EX4tUU`~$K{W#5Z>^&MqYY7I&b^t(FisP)P1(7> zpLpz$j5;*KIzSVSTZ5nBD>+9r*tI4{rS)DMHOVr@>vh>(tJoy#msDfuafXvLFP|lP zg(HGR33Pu&o)6})ma_MRJ_%8=mjmwDHS>`eiL%H2A;@ZN*mDI` zk56}JYlg||`@bi<6ioiUP&)?3?x^@D@f89oRvP8wt2Fe;$6Y0oza06c!4+|ITA-NW zxcw{zRD0|V@o3lwBDBxzBNg#bh7Omrfug@ii-fJ=c0x?K)g3&jiNgj{_Q1~$hvcQ< ziW2td(vH?H2eu-y*O8YD68*>`x1`z{esDN#t=ZX$k!Y1-MDMvnukoVDw&`A+L(p$` zGuqR9Czel*qeK5-H+N&mzgC?Gov;YQ(FnKf+wB%iom``?9ONl^46PNWQZ=(Yo{CEJBa)SS~Y2n~ESsy4Ud zrB|>3a&xA8+%7T$J671X^S9(M4=@R@AaQAH6y2oXgaMcM0CYzV2IG)pue&5w$EWz(0-d`fuMl6*bU0F;=t1c%a@T zqk9pRWA%GDnO7^FN1&*fW66CeQWY0AMN~t70uj8NLE~M4;6H@OJUw84UA`HeG-bVy z9nZ8L7$)9CBJv->ZBJuNAgEN9U9ygt&^#0 zy>xj^@18$JTtZmzrU-_6veyvsdXYe9<<|zLr!G=3#DrAobGKWpZGL{mz7YbccDSLh|6T5AT;mI* z^Y&iDx!`R_zwEK6VjJW}tpZ7+HY!ZQ`U73AWGM{=sS@C)V3CazsW5jIFky;>n-(VD z?0q|rK_(F^=Wi}0ui}^7r`=zFNZt|c)!il_P^~ZdVN2=5U7bmZT0<9aog3j1=(>et z5c0xY%`Na<6@W(ex`oGt+J+Yt0f%?o>^*q=MFDr1Di8amvO+kc+tA7|#dJq#kXQ^ogd_JFq4-C0h-z`p0|4jzRt{wzeCRKyww77!)FA z(OLG1=EMN#W&_VDaYc_PUj1l=-Q^LvGl%Jb7TeNt)Hw+ys6E|m>PQ)Z450r7qO|H0 z1a(AkQYWjv)X(1Ofs8{`$Qzo}li!%^)|S;Z(xC>;xd2fSTY@@&HN2~%-#D&1aG=sG znAto~6uM~NYT>2^Gf*xeRQZMrxlM+(Pi53(H~&h;GnlXGPk3$z|B~Y=o?@+;5Taj@ zT8;WG0MVj?euhwpY0YneE1ipxDPCLL8H%A!QWG6#*4R)a;-ctk|5f7@g~W7Mk_Jnj8K%Ov^%4QS*7`kl`q@Z@CH9NXnyjv7?{?4!iBjc6#?lYQ`(rvoxw6Jf zi!y%0gTOy#h$6#mRR`BH%Z8(R$q#wL=&8;+sIpuT@5w0aGjJqwvq1D3E+La%)NGnN z#A|kv9U9jhL=GOaZj92-Q=G_b&;!>TnP7V1D>l~r&UVa;vagH!+436?w{N348w_11 zu_!q45}qcE-Y`>EISx2X-tEmNB|7HYVWDTB=1AFdzh;bwhRMA$T+TIjzFw_QEzO*@~?^{Uz9wyD8=g*zeQ9)C0O@vhR7p zgNp{v5*6ddT;nK%#0VM-ft65`Xv0DBH5l2x_t<(#8%#Pa=1j?Yl}haVfkUAl^^IIM zYmHUdD!B!mTbftaFnv2i;SFp6%}jhDiw;%Tyua22ffj+F)R`4Y?vWQU$CJG>LIWJr z?`+0j`*4K(A!-Xt`6YmR8V5J2)B$y#)weDQRY=zK+m4oRm^?0*x_|%zeWbEWP-j0@ zUR8JS{l*18QqM5e_xBqh_%y^J{;yJXu5-~=Ec3T;O5@)hSmw$|lr|Ey))I0Ua_h;? zJ7K?qdCwN;cd8HWeW-Arly}`%S^v(vdPuVI=}POa?ZTKjBOv#8;)JwOSLuA|Vij4R zf1?m9I@}C2;>>5+jK{Ff$5z*t2RrMj1S1FKqS~%(;k0w zrB%7l#Yp-+{O}LELO%!{N>xYxn_~5U=iUGJLvoh?zev8_kAlmWWB1#DuxNMkE@PsR z2?_G{F+AVKk>QGXEWnV;HC)8en%dXbZ1l*oM|{jm((y0%?%~pOEGr&DNal|GtIr=H z=%H`A|6q^2a3&(&U(dz}8N-Lp#)g*8#`G9G`mplqTi?9?^#6^)sH8$SxEUA!?X02g z4ce{e%NUUXdD_tGuw(srxw4S(oM8A?*ZMYcHimn8dwDkYT$RtekajX338T_#rV29* z@j{K9i>shKP!d0gfc^T5zn((MqoqzQvArCgl`v_hqSGL69Hyy^M&w_dGI)Lv(d4#bP^riRw)J z=bv=mXAM=_vmY94rmtpL!Bxlf00I7aAQ~Pk0mK+ z!b#ebycT!WHG9#C6$zXC5wpZ4=%|HnzsR2fQHOm_P(U+->xKz4V!QDo~0(HiSc?{2|BJ{!c_8RK>8t>aU8jjs;My&b7xO*)Pb z8aJbS=;f}zZIrwwI?MtxbU`qJYG({(pw!XAqtuQp*-gf0j;A)K^0GTeJU*Zhd))1& ziYo_mDGuRD0{Ra{v{$e5EPf!xJ-_x4|BK_@Ro`)jS6Jx8RmIrOD z5zR~3uAHWQqL@f@)zth zD06x~Y)n4hNBR_aGkZSZmW}NUIQTvi&^;herLZ1TA4HdiuqbgHw+W!}--A2ukEZBb zjPQ&Ou5KfE#S`z}n@xH~)0oA0M2!(3{Fwj;IjV?^PohwF#r_ewtJLYJD8}(a=p07q zS319bsV{U=AqfdiEmv4@zB2u8`c7Bir-o*O%xt#}b#Y+)Qx3QIlE*SV7hMzTeT_UB zth0zW&EOe;-$;VAdnN zh}kfyf7nDrm4R-PQfJI|rs};2urH*mGA2nrp#pDjv(NS9<|F|Lz z`G>DZ^{rKy-V8Wj`aSDm?2V*_yr8=*&GZb~{O!Bd4h*5x3e1}z2@)P+1@x+PGxbfm zHB39eEFUGbKaq=nK@j+Y%TU(D{Tgi%SJy&&hMsG_aQG_@!nchOQ?lDRK0vk{#}Esl z0?p%y8#6 z7hYIQ3HiLa#%pWUVCN*>`eMw-+YqbM=kvkxA9xhqrkL~U35}6(5C#(uZQ`=XS~iOs zYppn#m@l?$M9<#9KEml0(Jn$vcYVF}77VN1)9WE3F{+_g5u;Mqtshmu`{o1X+%rA6V^s3WB zwyVE;ZBm9R**EYVAEnZxn?JzhzJ(#XbdMhB2126|$bG#`aju2%S=cEO^QxKFBS3sY z)PGo}NU&a`Z8G*zDJLZJF%2@}uws{fHv3zP(qFK$&!(DHx+$aYE}h-ot`5`mr{ym& zgef(>Vc)OsiD!AL_wQwowECPV8+Z?f6QRs?3X$3jT@iMh)UW^`E}{Vp3=V~ClYorI zRGM6aA89YEs6BXArR23s_DI--Vj@+R8I zg-q@8^S1Q1V;ab8{;bu`y4*?G|F7sFW?A_(NlQ&;)7=G>GSME+C z>^jxg+%I@Udm0Y+;HUh@5jY1O1J%JT54U6Pz775#lHseX4MuAH;zI9^2%1`hM6J_IxZ1W-=VLc(=VfBIIEeIO=p5!un@E7*rc8iI52Rah$1 zickg6+@3(!MganLAeZ$@KSbXS8@FHjFrkO4dBXpILl2t=U0jHW>dEQ(k*G_5?{dH_ zlAoIY5cxq|Zl5+zb$wEYv5>G!LY`1&e8Rp8ocUL>@$mIJKQaD5h92IuEKVI3Ou_)& z#*-G_;>C^*l+8;7wgw3&Nm2-Dsc%YqB#T6odKBa+8`cNWo*wEH$V!jfl5`rBHbmE_ zK$WCvhB2)S_vv}QjX@>XCwUdC8!NS)1pba*w!);F-+5Qxs!}t5S-ENV6dw&2g>hrp zx`H5x68UV{u4Y#+_U-2}lfJ`R#%jSeystR_EQrrEG_Y^~ zclf@vVts;71QUEiOU0Mq2PK(rl20RuITqdSsBrqD8)(yMAV@p8Z`gl`nat}KUQ;MA zH|FKAW2^~3T2_-`Xjo;H^A@M!9H^P#g>B9rh#SXK;-ZX!55XRG5XHT;(i*pDlX7kf z!o|o5T?X%^WQNgxu}=-t#pB!Tp()09X9keCBI8E~tTKx?Lco2qlDNj@89x)7p3Z*Y zL)Ary^T$7zI*uOlL&viJs)iAdfTQC^84DC}CQZl$2GG6G70CK&J90tkkq-&!Z)Ctt z6BnRzkG=4tFrZfdH?{2lOrylg#LE1CqT9FdtnBbcE<1oeLq6Rp)fcj!qu;45bV!4& z7Q_5=LnHQ`HOEraTb_884|h^B)4Z?$NtU!J;ehg8(zgjCj1hAl{`2PLmy!tok;zJ= zQ~k(f$uoZPN+l7-KjikyrPsBbuVEBP37YtdjeAxYcMG8eX%v{2##j-Pu_fN!u1{jA ztL7iJlvxk<_vPj5+DwD-*Y)A~^$){ce-QB}wnQnxT__b&WIk?USYt6vjo&K=4Y?gE z{U4cZ0=)fyWU_NVfqW?zL203%Kt7+Vrvi!~T`?VwTIi2VHZ*E4WVW6_Rb4k8mgL63 zT|nJK0S)!{85uw-z3$NR^*+*a8FlHN3RD8iGuBa#Fv=Jg+|_HGKB&)U=AJr5rl+h8aXq4#Uy;NKUecn!}5eY@rP zdALfc5)=~|bOxC5uon4WO%@R~>c%!-AEVgoaw)v*J%_CEd@c@2h5E&MAopZf5b(0~ZeF2ZAbVb#fCtdS#&>JP!BV@60jOmNbu04r^1*q` z8nh(J*v>OgN+z~*57*IJE5wz?Kf~7wj-TPH(XOhZEFhAK z6T1FG+v-%oi{{*A1h84D0GJYr!9GhOf1(H}6P4598IA19(nXH;5p4+k1r{<`eL+6Q zvMOXQE}@JG6kx+Dw-ODQ^MWf%uU>KlWUAf7+4BY8@4ZT-abVfH>2C2(J>M?3?A8AA z54_v*F;ecx`xk9@UKnPu&4n3@&wA5Jggwv}f1lo+#=s^xV30x*(sCUE&viZIjbLa*_yK*me2?q?WoXcG4rq69*VLra597lI^ zoH_>3>IkmT+g0t}#5WffW;IAhLC=(Q#*Np|ETMzv--R=aAv6bAb%t8-N*k!q3w)YX ziqS+3RWPs~RU0Sd0(+<(wt#H}W0vD%3U8<#2NndRU_(;O7U(KwDaIA0$;dEQrw=?&|T6N-Y~7cAe`i5!l1TOSmoC5#G1c} zle1=HY55>+NVloX z`0S57fQjGexa~`Wh3W_RuoG$~DyK@+F@-LaWz`rQDtUFQlTjTs$Wo!C0Re_0I5ZfG zUR!(U!3LEEcL_;MeF{o{KpyoyVeTIdgw&m>T|Gd2GvP3uY!`|P&v7xwroJZ3W}(6j z+E%MzDwW8Gs*y3*_tRCH+D>$DGmYR1?0 ze(~q!>&R@Z4-?4fYeYpWG0;@hs+lA8aH6*R)o`$d4f)Mu(fo3N=pGF$^t&MKnX)n1 z!MS8H=0fJ3Fmj`cazo*@9=k%Y0iKgGp z`vaJFS&~wG&Gt3W@w%q0*WOKB{_V77u(hye&&Q;*qys<1#?`HNoT5%z6a8n=_Nv)2 z%%h2m&bg;)>9wPI=R=umP^>Z{l|X?u{w$WR0P_$$pmwKbFT1e}b$8EX{ElR45DxeD zTT6+ODJk@8Eo^dlx%+E-&rr9!8Y9nTj-6>OD8sHYa?`)EA?G_70Kg!qzis`u&RG?g6TLgYo49`Mo3d06cyr0+Klx$vaN44vj>^ zj$Ab1BH9QoxspDF0iU0IgG;Nz`EJF-5QwA>6GgigmlVgW9je3io%&9s!x&x6zqVMW zkye+Irm}nv%oS?c78lC)s|cDkk5eQ@B-K6*Doqv7w2)ZnDV0+phwJAc03pGQjeSUK zbJzPjwl43A?64;8smLa94~?%U%eMD{g|8RQ8251bAdbI-(e#3^H%(1Y0`Dp!wyTOk zfcGynIOl);!SbT*uypwlfu|#*2m`rwxc}czJ(^LD+ThL{UoU&TVWOmF-;t)42hp4m%q*m4#8D>^nRn{3*E#Gev#-(QdsJ`83fM}Y@-gY zGvZbIa3z=$3F6_I!ju%>0Ef)-QeK4~a~QABj*DamJnVzU>FG#LWij5P4e>Ylnnm-k(H^^mBKVus#p=kOIK3Mhl4d*IS?aITODyQ%FT zlGD=)4;q1Ah<4JTT`6;Qi0T!(s_waKH7lqVg_nxxi;0Qm({B*MJDXc?t;dz->Wo&A zu(hXUyDU~<#E2>Np9Ml_Z5Lx-d^Il6D#_QjKphPA+=!4Tj2SC;dyD7O?B>Dctfj&7MY1 z)rlGhHx%MBoG*_hY2cBt{8FhQtCjt!Ov4EVnwNx()GkQ|DC=y{`Y>JM;$gT?rf~_+ zBwzyF;$IQhj~V|E=PKZ&$^VE2TfTcz`^M^;=(970Y#^r&GIIY;W6h_{zqsthOn z8y%NNYq|P_!i+(XyA3t|8*3L@PWdFv%{gBE$EqHg;)0Icj_0E&RZ>BjRTgpRRP|sf zXQ7=T?6DqWT~=!!TD5;Tt}a&pKr5W7)e4_WM5Bls-W%S8IN-gBt7L86$>8aIo-+A8 zYs!fxrE|3^8J4j09|n!7t}tu-_$<%C30v%O&QsPCvM!eUT6YVl!U4CyXHY$@wu-lD z^!f|JEDuj)Ju$f%j<4#Sx(F8Q>Vh{~+&8ctl?~N@(-j#X9D{q>@WAUpm>yP)N+3D@)YM|7j9xnSUWo>!MAG%yFSd$K$AOZGH0;q$5hZWd4WR6(dP7 z8IgiXxiW$3k0K=ocZbs4s4FDZ@2tjn0_fB8DIfY*mfUdid&;b*AAFnc)|8cL#^H~+ zWf(d&Z}5{vDEK|cAi#HF*KT?N2Xwm#H>|lB1{3^<%$=%zy>X<4roP)J&n)1pp@yKs z?ltmPjgGbgTBP=4kY5Q~B_q7A-p>Lv;@T0MF5U2Nt}2s)EgGN%S}dwQmtev<@danI z2!SWntGP6?dE<4t{}Ss(PlsVQ%FP>j3bu|t<`llSJsm#0#9vaLUJvZAVBo1KkN38e zg0=p12tT;1+ZAPd`Q*I+OuLmeHnX=%SbXN-e5X8Dh|5!1EAH4@xl&V^S5 z-=W7@6bE1)j;T2W0Y4o=vsFzMTg?#^7Z{^`VK<^aX0x!H4xEO7Wb(*$#@tEchC%*J z--)27@%)KEq<&h~#TTq?T1E_#Uh`vB>J%YyG2J*PUXTDHb6&+r1>RLL$P~@uzwTn^ z<0cugftJy>)h}hGFIaM>UZ%vhYXj)-zi3Nf z?XV0Uz!BOsmyb$98xH6c>|u{HQ65o*rQba{v*-$K#Zn zG2bGUS}^PT5iSn|?R*h#bBo@)e0u$FiAEM;Aj6F$o$K*LsPh>OM8Jz#&U$kSJR6uu z#7KQZfVsqvAlM&jVLwzgtsw8wQe#U+??bZk$IwVe<`Gt=9Jxl!&(iQnNAAB?6XYH+ z$2LTmz2WHgQb96p-M8UxJN5ZM44^u>h^u#7sqn(}HBtPJm+r@H_Sug3o*0*#9>bzL zbchYy-e-Qx2opT~C0uodf1NbdqJ7cW`<)@6EQcj@yP~_{|B3(zl7YW`g$6@pZP>}9 zu?3>#S7dufHunwqzTRFks2u&AWuf?E$;okLd3)4W97TBE!)%JOG6f(Ux))Ak0h7# zm$pt`I}xtVp{a5+`u&mscZZQ3_hb8aiGjSMVlsHhR1)!zB77^t?2I=zmEB(pi~waF zZBq@*dc{J}^J%INCLY=iK!ZrD-<5-CG!~{Gl-+n&>wg$5p3cx=_A^=a%cScl+4x@{ z8nrsHOw1+cn^N&N+15-GWywg2HNW6a0J?nUJ|*|O)H+e`GjA`{U$dwNN<=NMxwgTlf_83cVbT$L1vB#exaszY=cSuXB^Wc6Q zufyGaabdL>SYr6=W6Dx}($U`2y#a3G(cG}Q5L#6XV|%d_3q2m>QTt4Cm;ksbDL4ny zSU&=T>;-?gcr5SXvJF^$1G{LV0Ux5(I8q;`P*BcfA1o%ghG`wHeCas=(9RnP#V@oH zCJ1-4pe}drzWpj;Xt`q`e2RzU)+j$Pdm~P$j{k*Px)BIW(S+h|_cm9&pC~ zLo$hGV@5jgyAN%klYn)3L7z{L&9xBu{WGaXw%n~%GbyC-?WbQL{J-H z)gMM^YvdqJ8>t!|@~o0@)Lk8Ko~$ML@h!RQAhGw}P)5t&o$~J3nT@%jx;{K~Kx<@g zACE;2J@ar2ZidEpP&Qn(?cZl0Lk|CDcb2VnzsK@wul22 zIMpw4V^Ef}cd^#r&tUpoiwPGCW=FWb1=Fx7Ude+zL&X5iYU3P;fQ8#B#fEwNn^bez z(p2$ayRP_``{}zmD#%~HRrJoN#=jGe9JG+m2mHxriin`e`&|&+vr%zZYE|$CB;qiq zVtrB-5nc6*i?J3|J50cji+o}PM2~xyIslWufVB_yk9>Ri2w=#?YmUW5 zC`4)b$=y^!Ap(3PVdV+M(XhYQ%x>S&!l7#}-2F}^>y?)zVCOgwu&i^JxBVPZ6Wd~M z&?m_`!he_ti_3aBjCR+AjLD_sz(xGY0)S=nnmnv2$G+}}N5uQ`D{9@aTi3Fu)VHpi zp*A6;ZUb<~ zEASOSaG7uL`&QWann7UQ7LymPV}m`!b9Fo5fXc!ampkg;)sxTX^o>+J`FNBtWdtpf z7Dh!v{j@DR2K1F$yUrQ6GryvtX1oVsp$cRS9M7>~jT@#ywW~WdMd;|4Lwz zr(MlUrwtYFB*~1kH|_>7a$!hPAfiD!RUW&Pu1D(a(1MbbZ7E5bcL4ZXZ8x@KBds8pN9^BZX?Vh7oPllJZVYP9*EMkJftSmET~lc&55a&X;wJ zszlUE@cthzZ7h@v?Y~j}h5Ld?*qt4n_tKZb5saoZ_(Eo-$WG=`05w|uLXa5@A2(8K zJho1|fs~2tJHbEsBFDB^uCLkXQ|v?)YUV)F1(<7lPlz54|K zjR{QsdcrlAp{6&_`p9uOF85~u5GsFkm>(pom$V76VP&8vKNz!ZN>2s!~CE9j4yiLgF3wWCP6ZW8>}&{IhW8;z>w6hhlwheh0{<+T6ZG9Io_` zSUWr*-crFp=Tq?s1*1ko7pX!tKut<|=M9h*gW4fBzC<51%80_1;TW6PQhy-+3+wSO zN5Llfq@08J?DRm-e-JprW`K{~(Jb0_1fBB$Yq(nf%0KT8C-4kYcg$YU&}-q{lR~^5 z2|ju%@x@oHZcu0Wy$7EoJ33%eHpSW*gH=BI;tfr$m`!X9C_AJcxC$Wh38_<8SN7=; z=4!=Suo1s6InvY2iBm#?dxcBU0R6d%NE!%!kS~o5uXMrTzSW5tdX$g;)Q$YwdR@u# zs8jlCs8N44bHaz63uvCDjF61~Wt)-w_V|&3JxrCNVoVah{>B*g06&C73;17XLn`Wv zUNowZCkh!&qgY~(SvzFly#v3784dVCUdUz~IBYc&+|qhS0uiJlI-Ypiu-^983+6~A z{EVhNJ_0(i8`FhPv1}WT#b~h859ifmA~d_Dp&RY3Vf0=b!}D<6L0R}L)6Yb|kNN=D zr+FS_ljZSON6oLcQ_}mHbP9k5coqgNYwxu6M|n+Y%|5X)PdmtnKi~sEwK1m_e|hpM zmQr*7A($n%O-hYE2ZrT!nkn-eB-a?VD??#4svAsB7SfrWSIV7Bx&b{g5*(SLsI0T{};peSj+P()aS*=%5Q8biV>aGNl>x21r+H6&OPcSEKxs;*Iag}WwaRy?ER z__Z(i$mQX)Jozx1H&0guaO>XhxJH5IWAF>hv{+j@)HI1khUU}{8rR11rnRyF3!0r6 z&=*eawpIH01Y+A3%%hX_XAK8#-D~aSXiS2LxJ_DyOSJuM*(Au3dLXGmqyvh>cl0q7 zXL2YGCX0G5+JK7Ca-l@9^T5_#IZR=s&1e;d3=7 z+tdWHDI!a=IU@bFFi{{_Fe!&d;URB5W@#stI4sU)c%aLvg;;Cyfgx*objB+b1DqkWu~U~CU?uMBzjpP+^o?28hFFR#sG&I@DfN#ot6`WW zGSqq~z3^D7P`jvzYDhWGDupzK5Bl}P@2FHzghv7IF$e}mvJTsT9nIK|Vfe=~XfLrd z73gpTSCEf`HsxuQV~Q@zcpc`oO~1v9x6MPt;b%5^mY^8KzoL|(Cdz4XSZIa{4@o}C zjtVLD*_UNwFgI$R_e|KpKiOQ|e`$QWQUlpE45c-t6crl0nXMW0P%b{^d04ES>xymH z_uKIUhB7lmhU3wE*w+`4b9<~e_g@U6SgeOezCN>%J*>V?+mf4cVy@|UeJ5T;7E;P{ z!n=~O)zlHEz7eH0;YG(q-U2D2%L8kz)3Dy7F?&(}5RpUAE3t9%*TBtI9Z@w;bK znFw7VPPui`GC(a*cr%QN(LOIp_TuXpT*`m6trLGLzqh%Roc()myJc+9@J{ot-UZ}p zw{Tvj?O3ek`>VqsF?=v3 zeMJ}a%(J}``zx))jiVA`Lcz80_>5cdlYK@VY=EO<^1a>Unv>zO;K)0E#-178AiCHJ z#;(fKcL1W+i@X}d$2b-n-y&=s=%9nB{wd~}qgg$D>A}<=n|vEKp;|n8ewM30z+G^# zTZT9Ynt2-ByB@^%5C=r@Bj}S`oP_(T2vO!rr=guN=!zFWSsr|RO*ZJzh9t|5W|h5% zmMM|x^#@8#luf5*CaG6~*QM$0)vd{Fnm7Nxs&meDKpAv~usWvrpskUZ7KZI|w1Yjt zm-w~aiCw(0>qzQ2Vixmf0@;D)_`D_0{t&AHp&H(EDA>HRYW|bnu+ZlG)G%P+4B$Hw zVR7LTz75I=e_T=o`_|i~7iJz?%C)8PtUOX8v#-ylG^r5`p|GqOA>U7i{HvBxI2OGt z-PQ+mNqA_AAT*V}ad+uS+oPT>*K`W-UPL8jZ~dMmOY# zFAIv#&%7<)*RCkaxgwhy-&{!me@K~MdgM211Av3oON?{!Gh7ntMefqUy=9!HX zSWro7NpSHJ6)UROWi^lAe(_%;s<91VDBjid=SIlmoR8to609oosf))vI98wF-kb6s zxAVos?>$$6yPs(~MPpGOaK zc?f3PSS7k>JzrwUziV+?&sucSYE;E)RMD4&?ycC$8N^Yu1!i@$2k=Ka-e#OpHuS|KAJKtN&raw%z?dELdcwUluIsd?~TDZB3%fHSP2x zfh&9jHPZ96hKzad|)bYdHaw5BkZCZfQ~pF zikHGJ|D9%Yr)ZcM+Q4Y_;I9~ohWRVFQ%D5AJQS-+Q-dcVHF^Qcxnq{~p zFqBVKOM(1s?eJ;q(KoLht{2?mnH-&h+a z{Dfnr5mf%w2Um_D#Y}Ay8q+TH@g?ap_bWO2|#EnVI)s4 zHxciD&8Bl|o**>x?+A6QK|ORSciHL*H^~Q0NDC|qP%T{By#yr`RWNMwBV{kuX z5tebepjAD8USQKHPPtRXFw_4;)cjN8OF#o!ccWQJ1z72V=2Y(lZ*Eal)g6@4Hjk}H z-3Bp&SXF8Rokd}smoD9|-ao9~J|d&ak3SYQco`Py?BMP6rg zB{{$xmxaqFlG90+UUfoa{G`<%+?4`_!74U5O8QW*#Svj=rZ-11j2^B-dKLCf{%NZW zSlRDc1wbL8)wpk?005lR)DN@_$xfIad4L4^RnPAL8iJ@p$NqGck=H2#lopOEAs*}i zi~eES?3Fu?WaC6JptNE*l(@=Sf6N)E5$IDZqz~t_+^nfJoqSJ|C!A|aun+^s+f&vN zeS;34MN$QBJBCHoRub%!e$KOLi>|>oW`^edJLfr9uxgA`Pc7LTyhGeb0-E_|m&6)Q zf3b`gT%d(OrmwF7%)UTZG2>6!DW5c6Ik{})*p2^yf3IL~n;*ieo8EP3ZbS#X*$61q zmA*gcA53ZEx${0wRUZbiULtxR7Uwm954&oYa{~yV=tO#61=V_-+tBKEI3IY0ScaN~ zwqqntOM&6Z8nj{wbhHGh;M(9}wEE3NYWNa}FY4KXO8VoD==+Ddmju|h*FB5&j(=Sr zFmU&DjX^5GE>i7ZLe{fh>g`b5@ULu`NUjvHW|1lH`G?XNT!^5<&~QVCB($cPa_FdU zfOJ1F$X*$&gT&P$C(lMo7iR)=cRF28hdgDe6>F9;fFKsBka0B*^@v>;BLC3y6DrX1 ziWb4=;*8e0zX=7@cG?D9v^Z zY_7+2+nxE+O)J3uc~ zW0g%%vYQDB|98FGU!ywnP2S4(AWvlX=f5c!)j4g^T(l98h8DK{xcHyQ=Hr-Ipl{;3_`a%2o6Ok#L&cViHXRi>g zZa3BP)m^9EV9G=34ITvo5bPgGisu;;HoclON&!EcQ#PXvWxM|Tu$Ucw^+A8_Y)@*T zvw&k-P5Klct-lP=FDVQV&`)J1VXrs2HzO4SZbXUSYjOxYVPG022!p_D=jW=;c?OJ> zVcynTvgO!8ljjm@)+$E;FLwMqW=aq}T*Tf86WoM!7@V;xYJQ>=$$|k=mqfpMlkdQ z6bA>3o=nL@i_VM;pircKQRx6&%%y^`OBwSwjay$px;oUZMjAX6Xz;Wp(4DjRp0<<6n>4n6jnJ1Ip(iL`#8E#D0a~4Ffgf%XSZG>#1f>i z!p(4Qjcx^viL6b$Bwm;PhUgJ-#*|cdC^(Aw;rgm27W1Q84NioS-o z6&*6*FE7Cz?b8o%Ey0j+*EN14X0feQy9^sYH&8ps<72MD%a}JCDCBp-9w5rl8b=h+ z(!D1Mp$*s-i1{ex31s5dQqiH(FGypWznDuK{{-wrxY)S9pfYlWhtL8Ad&%+a5q6j_ zyr_B2xH4V&f`k>qJpnKKe&Y*UULVmg8(wEeuZMJiGaKId-4~7w{49#ZYhI|HraKlf zh=+X_#`|XQK}FF*pJ<_O4dO!=O77!|7!4Hh67rB7BhV!!;^@Iy%+69mYtK9lW_szO zsYj~vjAzOS6EGCHM0#D73}n6`l3;-l-u?P53w)UJSko^w=Inl4 zJdr?E)M|X_>_*KiFEYq3_L{_{ad$s3@w-UvC)m17>o zCfH7V*^lSSCr@k<)TUv9E-)_Y|4SwkZZ`c-Nw?`LQ z{|xJFes9fk(5zQR(qov3R!~q@mfjwoxXeD$!gj3M%L0XqCJ`I3Trqn#kpwv0^~34C zF3GRNFV+azy|O)6^T+FfSAMLYtm4g!YE2_y9<7%eh2x}jiivu?vG)#@v)4UU?)n2Q zRs+regD%%_^C*~*heS;UMa{utd&8n8NqDB(3=dS$NEmZ8XGj2v-dy`er zMMZrlpF_KkB~nlFQba{P^r-8ym+e5a+GrTSSAux&;jWNoi;02*E{qp_`mMZ@7Z@Gg ziSA{fj9?WfGzA=-xW%$W{E0coz+)cw1=tH=5dRNp=fAYNF|jfJue77N<+#~`;JXs_ z4bF|L4M_s=2Vm>$@A+W5(!I}8D;%Dt249WD6QVPZv3R&6jr=aTJ)y3Z9{^SG$DWEh$yGlkDBuX+} zkM#sd2P4_hdTj_c>fvo-2{a$ZM1FLeEmF}ETE84dZ1`n zUxWg4Rnx~R4JQiff+{tFDhmb)`Ajk|1H>XUKdIm3(%{a8Gzz!u+~=3xQN<(Su7@T% zgS9fJC~+$oMSdt568xq>dXj$jARM#sIzbnnp-uL7*&=m#3Cw&ug6X>m{InSxtA*St zN5C8MF76I^F56Dx%d~5IXkHF_!)PAUfr=R@D7O7S{UQ3Xw(65EZaGsLa57P3hwK#LPvt>CQE-0~*$Xz}f2J9eZQZe>=N3ho9RbBae z?#T3@u&_pph3FmuC>M|GhQ`S4sB94FPnkl8jn)n|CJ&Ngl*Zg5K|vV9FPL21#ApV|c!O#44e`$t(FtnA2+N2Xb?8`L>k>Tqw9Uj6}GF}Vb$mb=MnRQ@DZ zA_rmtM5S+d{U1esV)P@8_b}EQs!Oc(jk$GiJg2uX)HsRiz=}si=hpB!Sj-Nqt%1U@ z&&^+OD`0>Be3T4d8sw_5=MQwZamZNO#LN>2w{`mx^&>8Zf%~Zxn#Zh2QHKv>$pgw~ zbZ3R$-l~QfL!CGO6*L=zG5E&2{k{gX`{A*%V?`jsX*nrx52YYu72ca_OU77(n-b5ihb@Z&3;G~J|CNiJj9|q{_`^^8&AE;1=K^nJ zi!Mz2;5w!cozx3J?zns)vsCSpgYx#x2tMr^iME-;mqk2}0is5Bnj|hZT^kXK9 z4bF1__sqZXz~IFqWnS4c26xTy5u2z?A?5R9d6Xz;^6aECJe1UHWfm?i*zD;LEeJ#~8)l;ol}M20i~AmCLLr~<*ye8-0DfWUf=|A5)K zb)FR->6`IQ$u^(wo$^w zt_BNmU-|YPd`vn#NI!x*%(2+)e)?4GoCUXl8j`*8{I+J~Gky2d&1LVRxdYNR+miD^ zc|M&=^N(2GHt1Q1$?kidx8z;rw$Y?vKAckp+Su8jdV|dfz-t!_-%c?PV0C&6woMcf zR%W$|mb0YjCN&&afwi4w=P~^}jKkV0U>&3PD`LCB+O9ZD`K1O>AtdO7(?dz+Ppqx^s}^EfpapnS)BeFl~r9 zzX|r#OwFLR&R$Zxl@e8fFt?IVrI4}8+&B?IPmP&4Pi|uzHbzuv-tXREHJSLq#_RoQ zmkJ@f;kvWX>QCr;DrB}IARj%gT&+epqIcscGyueW$Ve>dm0g@NVZeVv;x^#*?+$dq zH0hg$@(hQWGx-Uq`uUm})iiK@^0A?3fwG#{fn!DeTw7=)2)3M3upbZhfhZ_XXhndg z=Q((Y3|^n@!8cKYP%xnhtd`i5x-Dm_*mmpUkm6FKB5pIof7TG3&35mE>+{VCq~G$` zzsKOA#o$%8-R>Jizde7vyHY!=Rb)s5;K`3Wdq$)PqR0WMKrG`|#1QHEiM=}%=@Z>~ zzjZ-r&$42-!m8kT14_3PM;m3EFZ?mof*YGgo>U@)5Xa`RR%{iK`-j_PjHxfG1w9wI z)ggEXhqvxl(~!vIDb@T_(huNiq~^Pm)&XaT9z5SXYuZ&D3Aq)WS&2g$C9ZV^9Vw8H z$}Uq4q~zGD%;BT-J?0N|ijgA%QRgTfZ}Y=V2Y}h zwcldDm0qr6->@kmTNNT0W*|6Y3rOc>mRanNV9V<44N)oh|X3W)<8(7 zu_v5vw{xTU9o?lt#T0{*u*#l=m+}5t5Zw%G_W^_dfb_f(*prkyWjGgUV_BLA#X*NJ zjRFtG(Z9yucQcyDHs~b%J0U^A`Eb%(;<9Yl^b}4#eb-i(8Ti#ikAHl*e9{%g{01_2 zN!(Nw?mf8h4hnFK1vi)zVnpnU?sTEbDv6pGxH@P7!;&eL9NV0^C7@X>bI zjN|Q}@`4(wb_IP1@_&FD+@%iwLqYc6smPcZ+1dYBL8i53i^YccfB6*60)v{gsfRY# z<*65-t`HF|_IB`7JfrvPsF;>0)k(`=7q%v1*KEe3B~kcd{+#PaE4L%*J20V1yxF-V z)O|ltIU?dkyS23QW|}#^a@%J2B-GjQthWczf8HDVp0@P~<>h%$epu zPm`UKN%>hxkwSf+M~Q0236^BsiA@9*yC<1eg}IF<6`8EiZQ`p@DJw~nSCuqIQMz>G zR;0vQyxk=b8e*`9fMM(nA&|zL3b9M(l+F#^w_>b#fGjPDgb?K4jKzyy7z{f`S`JSz zPDAkmjv7|H9gQ~`m0ynwM;JaGov>$C8*pqS)u(v}!N1lGhkAg_EF8vl>Iokw8Y1S3 zs>AZ>v0y7d=GP;t^m39>lMOBBtrpFT!&y{0Oe>^C3tk)qtli0%;!)u>$$apy=73Ht ziM252L}EyGFGg(10o0$vgHdJ|ea+o|Jr8@oKjGW@wHqz`O;}`{Gqb6PV}~*|n|&Se zf3)M!*N=o9@48oFOvf|(k!#1@*?xvk`Y})k zn-JJb1{#_vfU%Nt%nDZ;Ijx+@NeWmi5s5@s1$_s6uXHeEK4=YXo}d~htJI~hWe)at zo@RbbJ35ZdTo@P%f1)JA?wUAALHKP@kV=XQ~I8ZVEuN5MXl!x@OM zk)X#|qis6amAjy3ax$K&n+6vegRR1mCk?lB4~SxmLKflgKK zSIGC)$5g&C96!;e2;&39?`j31LD5V8j6^c>L;1fuf>*xUdVP{1cL#;W-5=*w4KWF_ z5nBvMhJgO7G7_(&UFW8_desa$A(G3FIX(39jKG!e984BHgc1G$O!#ReQ_c>PB#}M0>C#Y%Nr#W^cuzfIRB|^{!k=2SL~A^Sl1@Q@uzfI7$MY z7_K@!Gw}fSqN~9NYglz-#=@jZ^&IU* z90yB0!%%L47@+W+6dzbH>)tD_VsXlDJ7K^`SQHf9T^%FwOerZU7iu}_j;B8%E$vmi z#T&u5CqDs8jwNFO8hk|eCY3-b$a(duU)-}H*Dt7Ej4jx~+C3oyoju{Rm zTbmi_{dKxZ!fm<4Z1~M?rCnFkh(_?ai{VN|x$3t^Bd@i`mC!X^}ps7JY`bJKXBA$wmd};(-h}#z*7Ajv(^DY{i_JG`G4W zvtyH6kV)Rcwl>m84guvUA<-L!QJ}>yoY}!#u?ZXt>ue;P5RHV*C;HBEWZ891x6!h+ zrayDAoq{7y!47f);jfESuBVN!tNWs*9w?ok-aY1}dUaM_LBS6LFkAymo*%d#ZLfbC z-DtHl@eIuxI-?aa=Bc=(6ULHsJWC-MA&rxYS#vLjvgL^@Jy<&WpyF3=R3LgY^oI;w z?4gnRDg<4QBWBjD+ReCn2H~uD#z(6(9*g_X`976(nx(I$pE7D#XzE`vu{ISyGE25i zExPD5&&vDb>twcs#v_1Y8@cOrr~v{blL&VGo4f80Fz!JpiI9;Tm}gA{>@ms!$b}}6 zCipZVV%0_$-mtS1MML}&j}i>`x0z;zNBte<)6V>DBsVeqYETJV!CIB#yZ&{R>V*>ZP;eIdffPqo07n8y*|ZqzU=!K~l!!DrXe5{wc@g4At1^T+ zNpPQLJWFILx{)Q(!Fq;y4DHIX*hi|w7le*54*J#9;1i#U)5UwG^b|()FlV||xQQ<} zYT@g!v?C8$yF#d2S7K2(38KUQ_HE~mnlfa)uWH>$Ii;!GF!cYE%{MQzzxD$YK;G-_+_8J+0| zvd7{7!=wZ;^6JC^`NuG`IS`n2be6=}aT<))wF`@=`U>%c^A{$^CJ6^iD2pwx!2~*GMRuI#xYDhaF#wPhu9knT((=iQ$)e>GDXD_Y`v~^0 z#BU%X!2Ap=#d&!+%@;g$3}xv4DI8f6igd((ykXtOzE*9yEw4y{7{kiLEZAs1vKI42 zb@=&i-MXq}>MUanh+kb)zJML;9Ac&9XD0Hh0>r6mA&{*}qDh!pyN}B714@MgkqN7 zc_e?irJ5n+yh+@^wkSZhf%rmJJgz3Qk29>vWJk3+RS0tjj)h?OA-`|R2?f%2 zTYSP%Pozg70MK#*eG49B-kv5m4FgtrId{Sj8K%dBzZ?REO6O*}u~n^jCCxPm5u*|{ z*%Yc%Dfy0IQamwXJM*~A=LtEu^1^?SoZldwIq>Ns7Y8vH(yCl5gP%Z|zmL9R5aCP; zhUcR5DOaXC?J;i7ih0}z%9$}_djE|G#t^?i%+3EP0^KhPg8x|Xl6vLw%zofz>sJ=> zZT4J)hijWIRgFED(fxDEnwilNu9IZS@1~e|ObttfWIdJBZQu9kK=VY{1 zE_Yv0E^dc(4zVx6rl#&z07kKZL(FT|4I_Ol&PM30^IoDw1NrMbwAK1rbGc$7C6EY8 zA4}x^uU~%!eQJ`Rg}rRO*&O;1!kRBP>`^#pciZJKOQJQFZNrIEV6|%?^v7OHPouB)(wsq~IksrCJ%`r16Sd1O0*C^M2?*r{z}QCA{B1?J-@O1p zkTrQi8%4H|xMF350tJE=>g#oI5Kizjq1Pe*_k+Oi?}AX;dkgcq%Q0BoKFtp5+9?K* zihQ+FkI@do8LAehl)Er%-041vDG_mc#64h7bxck*lTNe?bL&Xp^O6l(kFApP{ZcFd zj>u7B71x`_$O5$-k($D5ft^t%8&_-(BFDdG)Cy}ydS|gGVszz}HY8}!VXwe1GlHEk zEl$wX?Prk4sF%5288@DucRQ|jCypYz+Y#u&R;hG?XPcXpxvON8Jbpd-?G5-~e9PQw zi*!5F`X|ZvvNTbTOm)k;g2iUTEb@tX9Z;6%O08661wM8h1v& zbU0hhB5QRrI4~BCI=R~%G?b1;0sFca;hkzeL%69tBT58%DJcTU>e#^rpv z*3^QD z8L$-1XuPZdp0*Z~T&gT06Zfj^)pA2?NVYpNnOxfbPf|>7AZe6S5ufUXwZQ#i!99wM z$j7Qkf!B94DR8uVe@FR|A6UoPehaVyxJaw}RM-BEg+=y9ET#0>--Ry-ThXqQbw6E; zY(^6dCZheVFTs>w>8MC-0XVwNyRjek{*@(*VFGmgrxt@d&k7`|Lf7w z(skTmhx470>JG%MmYG5lmO%ED?b@~}Wy{WV$(-hC^0vb!o3b)2weRe@F69Fte#&(y zn3ZWr&0bq%B|rq}!{Y~>D2Q?d*07 z{rLKQyZf=64?DLgcf^gLE|lv|z57pP|Oh@jy;x?B&2rH9b0uO_jZ&FIY#{Jx)Do26J@YZk_l=&6vo7v;*)Np z-v7d5Na42z)<+l+$K9Q`5Dz2DDqlj5bb*<0J8d*DZK!_Y; zd-c;zc{ScbnAv(AZ8On$e?1*1)5jdltqXXR_V11_Aptc@m0(O_nXy;2>#O>|9rFo8 zO=G!N?fhTnjj6+m4Ekf%Y^hjKCOK^2z|xWmJ7(R|FdbAM;02|PLh;vud5&qg16#qq zS!OM*i6B;u@z%d`4>c7S?w;zc7+bX1bxiP?pxw$WIG*>rQ zDXN%@$|CN7KjUHn{ZuhbWA_Xi=S-08GV;MRU;LNIj-m+8qj zDoX-`=1_VG5Ttpc>S=s3og10<{!)$FxnKgM3Zx6??#0gbnotvgOF$MD=KwDGmRF0y zsURX4MGR(VPBI8J?Ad`mg>iG0j`UGY(9%5%`}1Utc@NMa<4@pqlq+{iGA5>a;;4Jb zF@f&jl5!^pDo`)f5v6ZNxQ@K`S@%`b=M(H?OkqE@$F;i~8?c`;$UQ!hOGYe?x_q+z zQ&dxZJqK)YwnJ}Jhjti_RA)oJwFC7;3UUlAI+K6|B1Hg;9^6zaQvKo-$Ik~?pAWKT z-f)rF33~yJUbzjH`USxN!0fO9b$*I1SoCLc_`5K3%z$L6ul%6w`qo-GOe_*1bu9?h z7dU(%rv_x+pm?O%NoQFk9o#M3* zkNQ3uI`Mi7k5xNy@%d;v$w;56x>z$12HkiVR?b}qKar)$1A+OZ>`Y_SH0Yl|Ok$BH zEi6~yO`H}Q;XII181t_SSOC?>)~jF$JT6)kif+UGaQecPjPO;&hzvY}=fdD9f^-HmGK zGYr&r@CrfhkY};{u+3QQc3_i_LwObnNb^|5^EHu_V8u+;&ZgzqC@sfb^;Hq7wr!SS zMXU$?TdR*l|HhyF-B$igeQ4Tr$y{!oNhLH~4(Gqzb)@@Oo&^*(`_HNuX?6-j&P6&S zOY)}A?XZY=Sol-C$9D%to_WoXqyA1+e8tI{I3cLr93zjBrzykzg^veZ^@?m~yR8oiIog7vT%4r zxdKwSf9JmQGQVdlDwjjDPROT}g1P}nC{`@B6N%t1{=TG+aieYnX;a5!F-nRrd) zWT*Q02*ll?raTVUD_V8C0gccrzYT}ADr_oY$kSGW1j;rYjiU`f1PJN&r!_sq@`v){ z-Cfqu8q$(Qw+`C1NSB1ca5?-yIkZ%sG$ZP;c~}yzvcx(DS@{9cjDq{*?|N7F7R^>m z6iHmKE?}7?Ym9CtiOR#k9zGXvLggzk>7ik<38|h)y#FxiY8w!_T40Y)gg=WHBeL5O zV|evDRrP2|WhU}{P5^cl}pjLsA*)uY=5do4T)FT}acT`r@J*O>(D)miF z;96B9mDC- zUSBTa2y5ref;R^34ssW}YU_pl9gN$N3QIDQQ$#PJK7|MKo9k`ZUHKCz)QQZyUmPVu zSAMwkI`(cP$UY=WeF@j>JbMaz%X*X_wNFXrjl;tfO=m%8VPX{QSO`D z6v1fPIeQY#BkIX;db)YX!ALQ%?nB%Hvbtycq!YC#yDT`FXzB7L8BsDXm;c1ERRX7lQq{z&vG_7MD2* zUhpM!Mu?B)uA=jCyqB^5G)kf0M6`P^Cs^xMYcpikN-}ubBA2)o+s&U=YGm=DsZuF9 zxr~TO|CFSrjb5gk*zw7gfFgZ7^?{}B9cnbCzfHLnV0}6YlOetSna2S|Nl3!nw4-h;M92UnsY&*I6O_TDVRQ$1%p3 zTLs~u3Ywe)ubtk9miDj74EHQ6iqVqkj!fXpM^4nHa}gzR&Y8PbQ6P%|lAqFaV4amg ztee_S_@Qj4(Auee`f=fHuv8)VW( zs_w9jmxk{&MD`&_TBYnC1PeZuUDF&JvJjCw-p!8o^Y?WEH;JkGGd?j%aVHX$W8%t# zjWaG)l%*GtxVHcWSc{;#;0^J5?&!M8=qjl0xzEz&)D|A0c?SOK(9pG%oP8PX%Y z8eGiRL8>eC24LSB`~Cq3>}Z7jpk%g&|}!k*KcpP{?yE+kSoW)#z3UL>dK12diY@S) zr@w^;KjV_q@=iQgw#Crm!bNh6FNCXWpzY{X0EAC#0`xm6N1BlLuxHnD{=X!yQLa21 z#54p)CIP2fXSePPOPp|9G<2GBkG`r+@h+=)!{VXulm^gG)Clhy`=v|g=uokYGF`ip z3xR7vuwd^`)$LFSeVuD#ot&_HR79d|kj9%zayIeCzk`;wB$v<*mMe29{c8yo)LGV1 zstR}Sn#0`kPc%v_80^B9wA}|AEvbMHsNpzck`KIc-I^7z*4sKbga=k))l7CUk#KBy zm(bI6n^+IG^R6x^`X>Kq!l1uBG~lUn%D!f)Of~mz7%`sP;zP7jeCApkU@V`2dDA*q z5*@1^i!W8*8_5;*&?Y=&O;sC@z!n@#RZms`&iKw$Rb#lE&tA+5yG3g0Ct%^FME4@o z6~x7(v)^HK!yR@NNYU2^1a6U4R_}k$G?*Ot$v(czxxpz?9zxB!?)kKtrDQe z0cSi;Cyn9MOESscZ8Ai(c1u;3a1Q#u#2(x3GtE?dTQGs#?Q~MB!grFc;&!KR)MmNs zBFBd|3t}gA|7>St@mS#|HcM5u4H`Jm@!asRiE-xV>?iX6K?`{3CUhfnTdM+enr?FY zfHV^32(W+{k}kwFC!EQX4B#QsQ;Nu+ZK!2=(!0So`J)NA8y)n;_fZeU_8*erf9XJF zr04iw&u9Oy>5U{t1_`eOr`(!$(ghh0$M&{`P-6H7DPJw5x%xxPhns)@@LvfKi~b5E zm}X20r8G(E)vH~yJw81Wn=pJ&w1w@D_F5){pAzu#ysboQ|||0NXKgT z*d^kp&)RSnZEyL#U1^B4|_dO}ZsGt2J*- z(vw7OaXFgmUV7O$UU^B_r`+L&aDz_Crb;j)i6_z`W+~|SWLK_jY0X?ev}bvTu)XRB z<1OPnUy6htV@xE)#?bm2qyT;xrX+Nd;M)?L+e6JK4`RAc!Qw*Es#D~XTO1(j#*?o< zCKHvC^KBf4zolo@zk0%_WcL#XFJm^KuP2{MN$cbHU^RrV$4pmrk!$s zd$xVOXOg&)^g@d>0!7^!1$MBNv`m#4uNX{;pj0*hZ9T6E44|}!D6K|}?gzI>Mqhr! z7)TK3F5+SN*8@pEs55-u2}wF6h((%+!-~&*092taY~gZ0{tLFJ-`cnD>86vjtX?Ky z=>&51Ox=PN3)fd?oeo?N`$0-(Ex%b3iO}Wm<0JHia0|b?{L8ORtJn}Ua)Jc5XYw9H zGdJSC`Kht#e^a+!#RrhfO8~DM!lT7`jLv}*rN7ZKqd{c)!8ykd>S9uj1p|}U1e<$Y zH`o;nq`~k#aLWUn5NP?~VLHN+t>~1zK?#bjHSey=zhaM|v^Ios3||_l!!EJQJ!Zv7 zlC;)2!fyQl#o-#Mzj49cr-Dl0md}@N$de*86*}V_wOT-iP>dv>hm)cm~h% z0wV@jbBw9^A@#KBvtT9TmPccEF*bZvb;E;nunk2!;y3OCYZoh<4xda=q;wp06H z*z}Z5-`3mp=1gcj1|R)`{ribKOij;IcApLvwT4cLX~L*pF-;=yEv?1FSJ41zJ=`mVbi|lHc~>-QH)el45k++hA_lJOA;fFP<3<^pPyPj-!d#0lz-{2$WZ zF-DXq%EE2iwr$(CZQI?qZQHhO+qP}qw%vXE^~@wMlgXQ8lJ~1pKPo3x=OnfEIctAQ z_(b|lSGUt3n2+$1ZS`Del0QuZ{U?Ck`r`(QmakCvh}?4m{{a=u_c@3?e3^1^&$hQi ziXYYUT(`Hs-NFOA#}iuL@b_ypiWeqlk{EVV52?Eepxdg)K2_i9KxT&6#7Z>yEeH<` zmwdoitzt#N`_P6&f%Cvd(Q{rUrJp=D!L&lC`QSx^!SQLImKf$?6}_fI!8sO#^e}bfR!Pgw+MINDu!0=zP21rDr)Kxz`}n~)+4f!15OdsC z7uPdNs=x*9AlrR+YO@re2(@( zRy?u_M4Xr2sTKT!moqRy67=|N?!ErH#v@^Azh7(# z#&BcpA?iKr!Yl1d4euy-mR$g6_c!R_N3-3w1P}K!s{D8pJASK|aqX$$R zbf6~X3>4aKp!k#85~5N{dg-Y1;tZ5pG+`Geos@Z9Z3pW{sj!q|2~n2fo0c)Kv!RR} zGp(d^@7&J1Oj6SK=9aH5oaCXjgVhM<@OYt+b)2_gJia@Sf`c1CbQ~=V~pEr|CL%7bOCSeZQ{TXO99Nk@#TZxD{?BVnB@@0 zF!mtEthHJZOo+^oL@Ztx@@{xV=qGWhV78h&9m!bC#+ocOyebV8iN2 zz~*OP_<}%qcL-sQ0;ftKZyjU;HP|F&QS8Ake$yz<74Mz`7|naz@8$g#D?6}9piwxX z^{G8Z_$>M=9piod6GSS(?^8{%KUZvyS+C}Gx;#O6Si)N6j?W4r6jJpS8$0`r9N6TM{zfck3LQArK zDjsd)s!GGZwqE-5yH-&3byz*4gkQ%ol@9$A6a^2{%T%YlO$WG+Otyb znk7KS)*p;)?E8h+B_&2s;6nhYS0f8DI5kNJR2|40&oj5sH<1AqaKCv~hBt~6z58~_ zep2#1?-od#h8<0Mvg$Tkl%0`ZED9se(8K5S4gJ^IeNq$Vpqk-$r)~-bwCki3!S*Ra znSvCJjv++oiouS@esX86)2$k+?zcfNDpP(aS3OzAv^+2@)NiIFL1rj+awu=Q>%qiD zktqG+g3*j36JgfnF~W7`)G$CyNl^9$vDW5xtHy~QHRfVCULz>o zn(SqUg7pT^H5%k%6|mL5sb80s{Wzj)hc0hVAPr7UXFm{Gb-MG4g5@}9@WN)=a(VJP73oPUdF6UPni1YH_eu_(>Kk=%4?Pg z2yK={nQPa|hy-0*q{=bM-~~sF#gI}o6-nvI5@q1oTx-GD52A8%Fol`fIB0$Q-7imy zj5K5MXOTh*jX{~_*(oUP9ICWbUWGxKrw;zQw95=$7i%g!S&$Xkf=C!3<|=a-nf);)vGCCz-NDAw&&+8-_EgY zWODbsF8AhXJAR<=yp_&W>~*boiY~t}^?#Ff0@qov(I$}Wmced3rWL%pMwV;N+^3!* z?5PI&O&Ys32IoMHcPZde!k+(#GT?BmfaNdh$%)#Mn7pemP_hNV0?Gai->KdtMbTFl zx@GWghe>P+u%M~3WMWXh{z0K{A`g#uaTcVOi-*Pun%*aOiWlD z+&qM!R723r55GKdlOyr`IpN6sFK@8Q z5G=vf!UuQ^^96c9e6C!I9(_?r;CI2f>OR`}+AA~7fMP<)N_}(2BvxNWnH_2Foa#9W zanKbf7T1om%!A8^#tANSYe;4(>=2MwGdfgeYl@d-{`szFLjJkDHjVvINNFAxu)Jen zF#r_`Q^+nM%#C7L@mocs#su#EkxS*@!n(=j9tW8#luB*RItigG71Tt`ccSflsG;gz z{gfi3GA5JIrHqO+swo-;!?N$>rFd!$mw3lgjZVn15T+lEkhs7~;oOm6Im2RkRcvOO z1um$mqtZ=?RUAX6B+`gFvdjTR>sl;{>v3zxjExJk(5hBJ2Y$^R7MIS>jAO}=a;hqZ z{J6MsDrCGmTx>ELa$+h#JpXmNJ{x zHs^7I_}UxY*oc10tG9O#MjfHBM+5yx>eA53uO9{-Bf<${2>WPcFMA z8XwFCrV-=0ykONdpv$vEUau1MOoZ1A8k$lRvb3;W|25H&UH|VySIhiPbfhIGE5BqM zUaX0y&+!|kC%jr}i1{pjP1hj$;hW^HbVf*ue3?|;LXr?u2|0ETX6kd%o>S&*%bP2pVV*$fZU*pOBC;%Q&SD}XfOe` z8_w0v!X4%TX73VXZrH6$WAS>UsnT_o+S!R5&jscSmfR2Q1|O*>jZAsYSq|>Pk%nq< z(hW39SK9~@m%RIg!OKn&AHjI3i`=BTp{hH_50VX03co~3X^MB&85?Ojb0bhB%Ym|T}c`REz~e&$u>{(yQFgFbVRh#OPt*?!!yo8M-X3lF_ZUH zP)^YIRJy3g>HH2>^+&BMi4Fy8T~%n~_*)ib>+elgQqigVlucA&UHT_?DMc1#Dh_px zi1q&a106#Gh_FD{VCSLtKKPlCRqGmIk{3*RD<8GjYeSv4P%@i*(ezC^=vZ8uqNY%40?e@Tm{of|WefB|=L>l;o9AOZnR8{bmL#WG(}_aULx#3jGd3 zw9MX*eJzqN69bnlq+G|2qWm8KVqT~Jt&QTp$9yXPF>>*6Fr}BVw6msHGBtM5CSYb| zqhn+tU}9mT``y!GV5VdFy|j+O2I=L!aEbk{~)~oio;)YD3afAv$bHHYrx&Gz0>WrXWIy!EBu+p zG(B<2PK!e}SI=udKW1ScEuxe4#-22A(U)kBp$vRZ{6ci>s$AZH z{{j{{lj)qIJYu3xTXB34K)&`+}>of8rHK(z+Z;AOsiF7p*#3Q?If`6ONu*hgC6M+USbYa<_ z*h{7+13Ta(llIX&B}|KKyeovi1B3r55{Dm+e?{V*LB8~<=bZTY%44Kt8Wz74{kP21 z+gIUS-27fD^qwa`&1Cdrc`VSnb}aLP8GiLBP|!UPp~$-7w)=MGxs{Fv!?*pfMpPhC zaU@qeafbZE(17sQYJw!XT&G>-6qmdx2&m&pK1@)0AlV|fZMQ4UDVZyof|*;JO&LLYB(Z-Esz;tYAuV8_<|BCsYaZ^r}6y zjtr%O^T^kaUmk+9Vnwhr-i-k8*y`mH=k|xIz)sHK#e<94b|ln^8V1|moS24vHxrL- z1rNIB1VrBLh!u&sqX^W?IGr~P5jK5tgxDq$Z<;6_52k?@41)kI*oRXH*|6tj_w`GK ziEsf1>_Tk8f=0e!d5M&MEXYGv9^?^aZc7+C3W{E9^|y65WCXBZ#iQw-EzmbWK*c6E z&tb~%x9Tm77a-iveaVsprvHnyWU>L3Tn-K*jhw8xBeY)JB?{)|hVOq@B4GF7v=gho z0;1M8G{#?#Mw3cd!Kged;yz>mDqh-HMu062*(OXeFxwBLV{R4|22@SZ51{V*5={87 zYrOVVx^l zf*(G%rL?-e3WilML`~&QXAj*g&``mOVjOJ5wQXNmYCv$p-wii~=L7{e42FiN3|ERE zRw9yEXC+`bxr$%=TaWJj90eHjcOzleEqDK$uHL8_#6(kfJ)t&^RIXf7%fi^~*?P9u6)T@h%_<#=)9K$S!(>lJP3a1R0A=c*)GVgr*}|Sh! zoj4N6R6BwO1e31?BrH?dQy+5%!s#e>%D^CzF7$>angK4LrCqf)ulR`32!<3oXyBI3 zL$W!qI(n=^NrV z?aa{mC2n!*N~ed1i~ zkJR95#Yx*W*@8dMh!8F2l%|@zs9l<_I}i8bg`qa$U!hL?2jg?){EqdX=hd}1WxU4g z7d^GfMKL2Gw91xHm@BPW+E9yQkvaN-PGB|dfTG15hP;rdXK zph;;8LK0-x?SWx|_09G)OE%*RGRz~3e@Lsn&*EH{Ww}O%<$6WJzN2Tgm%E7GkzPCN zme7arcshbS!M&K$**(2W3&!H+NIW`cgEv**ifW{xMZ0!J((2A!UzVJ6mT(GE4DW27 z%7wta=+~J$;jEp!amh3~YnL)LJ(}AoTa5pemjZo<$f>y!(+ogSA+l?iB5~<%qyWd@ zxL0;uOxjTZv3r(Lbs^TK!d6F*ormJZElK94sk+`911O!Fne)76fKZZtoL7_E5OHOn znFJ17>u3D*A+se!$oLM5xqDgNk|qb-k%Gy6=A4GhihOwZ(^L;j^wz+%kVM*acy24y z9a=j}Ib4n(WXwj0JmuoGO)~HPwCwS#TcjFfo!iRLNYqpA+T!nY*#O17g89BLIEVW@^ih+b5n8-eoZnXr3WjQZtUiz)v5nACrPyn<8 z|ADLW@&9VGUybJM;$&)Q``_dm>;H|p&dkB`KfMCD*7n5VBv+N;>Qkpzj5%>_P@~e zseAd6|IkjkqNI(VBfrpfeUqu7Ap1Eu_ zniQ=ckh+R{*&=M~?qCm`xVn10{F<`yP?M_WRLeNzbR#ONAyUqU3hx zWKLjyp_SKXYx{4YdN-BRVox;ub6~f>vqnCU{AB6btaIXB~W5O406S#N;GK~zi}42@zWv@>dL95EiLxYspENJ z5jblI!#b`vLHX{1{;R1iy@^Q|2@{twm5ovkk9N?+xDgD*gA-ZZ)lBWC+MsNIIU!4O`Y~D)1Hv;H)ae{uW5Q$>!KZ zk-c%dnOQi8b^FEF@qk}%nYBgB?Gw=x--u8;HLCXoZ01P{@(lqJpXM0=b1~lY1Plz6 zS8e&Fi>?6RF3+Skh}H-E`fE|6nww~gK|6SN8f}4XLUsdZ2B0GAM9ls1MR49_fE`1Y zMj-$X;GPK~pVyUSij}Fym3LNa#zPtaG%mFT-Al=dFym@2EmnC$<#ZNi^G1}jLkod2 z`g^4nEHX%-O>&g>(K;}@0JV+vbqT6Bv|f#|xN+jy5t4rO3G8$e4R;`) z5Q$~@B>f4K%CJ)G#f`*f0AQVC1P-{dnpjR_S7^gqje8Zh1J6t(>VvMJK)KY&6w!D9 zr-6)5;U{f(dP&IZw@S5TO{=zytk`Z>^}Qy9J0PI*mA>h+xz z18xAGRI<=DUdKs+!SODR;toJbbYbf8IiqBLcq@IAI2i|;eAXkY{& zE((%n0Ercgd^`{G<>Wx?p5p#+!Ks0i3swc?l@CpVJb0<|DlKAWHpNze3fR~N^+kdN z*p_#|K_ej5w7ljAl!;7eHZ0B9<}~NS)A(t`QP^#Z$iL9yKwT|C$IiE#=$Q#-f1vT4)m@0)7FB)Lhi42^&6lSm0}bh97u-kyY-%@tHY7IySP0ufH=o`d+eP z3)2Tr9ohfcUip|7_iYDVvA#0-F*0&&Pw8`n^g5PDK*4R5lJfW$1+DT(c^yDPy`3cx&fAz`dCWc zU~9GGsGxrJ=>u8;@7KDcck6&tDH_z+LUS9TQVtJ&(<=iz;Jtg(H(oh@+Bf@$*;v$= zH(Nc^dlKopA$b^5A$J54E(Ek4`3t z0T((XgJETt%ttjj-TZN7)J-q1pZ)NGZ};k>#cR?b|QK-Z8F zX{@mhHG}EH+6fWaGZg1_Q#>q2ft&Q6bp;PRusn9Hp;g2ds9BFwID* z&li4fW%@eBRc5dWREK3I_K2yg$n!S?A}^7+m`fFrkhYPKS!#x(2_)wn0~SjNeskNyr#($AxA~{kGB#ozgqzy!Al_F5INJF0s z2q~1=ONUogu!$)vhASpugGs#1y@p5$sEXQ_Z&Vv>L6Vf5EbmMuwfcv zxd8B?GY@tlAjWto2ACA8hvK{)=@=0`Wia!Z%nP??)Oj8s>-33errxHu1br9uL{1bu zTh@-($}zqI-Rq+1vawKx9ci*55rxmi5{x!v6v(`shfBxq9}d!bn17+%%<=PX49%W9 zA_P+W%&28g%&GCzjVKFp#sTb_4rZC@(MDVq;{JRp2qUtmm-H^#2M=JcUFaL<>`Sr* zNk3nAN9W1dRKu_^*)_9FneAFjygUzk&K6-u#P)cQl-bzXLt^4BRf?&k;qdq{w6JrewK)L|s=WmX2)_PU+0t0u;1et`D}@2~ zip{a39^F1YIi#KhwPh4Cl@TIX7_oRwBm$i2!%k{SKe<38uf!b!vy)`zIPX zX>CpPhE!=QZME^%KieQ!@U1PAuM`2|N&`RPPiRZddQdGL#2;E`pm>QXQblJ2n0P}Y z;`{d&yo&v*+MBKyA)`gk_qSsgx<9cVD)4ejx1Sb0KYU}ds{t=XPLTztKMUx}aj zJDLV|Qw7jD_qI-vZ&;z*5Jx#EYf8%~W4M(%^fE2b5K(Ui;X7W42}E$Anf6Ld5 zZF-<=bQg)d{!P9`N@H$R<&_r}AHlKlZA+BR0-ugKStd&XkYi@4qfWzCHgc>&tBWJT zO2PEl5M*%7UL$|<1cT-Xi4X{17S7;{d3-D)Zv4%oJx=@+<3z=XgtCgw`4n zdJ`^~WmXr_0QI!1sT5>WJUOs`mS_KNuXUobg0M}`xzI?tB(nlZu2O^|t<=pc2=|Ec#ifYL(4$_aCPhdW!ufP_tT_8J+XW{$c4c zhbXpQU>P$O{Dd-rsu}VToRb#9NWn5dN`76m2qKRn!ewPtz%t&^xi=juePOGBLq~HVT>s+IuJ!+*I>}+FEEaG8S)(Ow z443w;WtZd&l{I@M!E1xgj{$(>9Q6 z4&GA20*e5@YSBG6A?JU-vP_9(D=@#+(P!y6^A;RMC#;6nSv@;T>s!V>m}z6}7gu6M zH>>>ez^<@txzQoWfEysq#fgIH?gAh*CMMY zA6gWT)J8`nVP`qd?xtc;YFbR335|cxq{XyfGj(Jzk51TSm+I5)${roy-%J8c+R$<3 zsA(+S^a-l)Fs^HWCUD+6+o{);MMvR!mOHUrn2*Zk+++Q{+CpAX?@YX)C+;c7FO-h= zu~S_)trwE9~!+v7V&4L*H&W#nx5Y0 zHM$)C%vq~@A$otZ4arIR|M3oJRHU(ru+x^@KpEVf2pefkNF9#%>T2h{tpK}#|_Z_k8(yJ=h}-;TKN$<>dAHqwD15`EEsQ{bym5 z%_5ZZAgk+!D!&$VsK4R)^xp{9)%uB8%f?J0%=Ho=+61jvNNMJJmGOiRwPi@qxUH^^DuM#gx~`|G5_Hk--gIOVSultd43%$& zPK`Ni05{^ochxLIwSN;l75h^`*eQKER*)SfZ($hkaa@d7=hE`KN z@WUSdC3snq$a?1xRfJyx(S;CU0x*)P)lNjBfF`$k!!eEPE>z<}6i0jppzJWT3PSnF znO{m0ACRFm&6XV++w*?6J06|;q57w zXvP~6QRoQ=={ghkr-WltmtZ-t5h1j2jzz{EvBxsPkKQZHHyKzp__R>wxQu_WRSJb0 zZ(~$W!tYQ07pU(S6c&X}(8%79+1>4L|06v{eUsqBY`kiV8P;6U~KFW$m({IWds=Oz=qQ9ULleAMHs~S{E$WCKs^T53xraqqi zu63t>Fm<}5ipk8U2}V*CFG=;H_~c(~0;zl?+3^oJIbsnp8Bn7q?%@6w5LbW_IR`gE zb<1pJoy#v>HwHdutR^`>H;hsG5E7}E@(Aq9 z010gPDT|tcSt^&h&R<&sl#C!M6~({*ik(FrQ(SIxED$OiJXzy&T!(-+&H>{U&;u*? zTgKX6Lkv#GlFI%p>l_W#yLU#irEbqdL3l$R|0<*lsTyc<|k0uSnct>F*&$+UV6Mvk@f^|9Yq2;Vq{b zWoMM55#e1h0Ny>wunihJFVF0PS(^UQ9=2C^H?rYpIqbkAv=@N6{@_PZxdEmrQ*_dj zl|jNBH+g==mPubLoh&U7D-DM|H5GA(6GoftcHcgJ*`X+FsqIqqZ1A?%MPD#Mu=z{@#GYgJu@S0!)#uz*21Twj>Qr4uf0VJymMi`l(k!A zD@)1Y5p|YDH?@DlS#a{L1<0p=Lyel-XAEP0O*`GgMSvk6ib!;3OYh6ZYYIfgwGbDL-eAh$ z-%*Hjm_^&dk`;4Sic9o9A9q#j*%ZEkv~G7y#*J5%&S=QO87N=O^6@`!n)&BKUqg~D&!{*8im>oKVd`ANV{Rf{QbX{#;eYb?N2j|U z!4TqQjNf`l*DF-xhR)0U`-prwtQ-b~g`(rbCSZZH-j`JTz&A52Y_+w#6||1WikU@A z-)3^kJchtddS;q~Q1~H)^aIYZ>f?AK$|!R!_oqPxD(O^Dg)WG|Sb%sabz2?|TBW*U z1ETYnPAAhzZ1-^&gG~gNV^GfS zM3SfpO`^J50rJhzmdadv>D0_T-&)T5mDT3u>VI@ssRD^r;fw?JQr5uXwOB}^fRroo z4@>fk>~Si)ZV#_J(0v)GXGBrO!vd9*V% zqz@8c!t7nnaN=u%tB`LGrN4!Z!MFG0P7!z3w&Dq!OR4nc0{@Bpq19D$o%Rlz@S#KY<4L&~az5hxGtQB*EUkR~*%Y3Du z_xg={RJZl*Mg+P<1gEA=sHB-uU9_qOQHrDov#NFlKzM@@A212YLtNz%N`>btz?m7% z(M<~f+}?L;h)}AkKJ*B*l>5h$HH|Q24*JE#$HAaWBrCY=GDzBSERL+? zt!8Ln8T{Jq2u2wv4wW!Pruh<>8vfoYF6&~K1Ck}P%3i2>buyOB^dHqMx$~0&+vSQT zPV0l#i95ar51Xx~fw4~I;AN;KV`(*3-DG8(Kz}mqV6&`d=~j-rVN{)mnCSjqR2?|p z;09jC0+{_>_ufl-6o_*hLj97u!9P>@2yhZn<5U-R;tS+L+wglg^=jNjpi3Uai!6hL z@pZl8={t^{YCrAm5zKlU(3dw{r(59iC(V9{+%pYVXP#JFY-3}*p6AWq*VgkwD7B3y z4Cd3B!(03Cn%i~k(zuh?uRuEr%NA6&0&y+hYMpZFuc1eAZMZ6c1C#^|q8LqDtn7?| zR+m7ESE`x_1(;}j?G4*uyM{olu{ua+)RCxh3 zoq5Syl~FS>D|B_1fAw}#_~R^(tPf0O%?9-c@g~%XhvD$mtn0$juhkmi^iMvKBwget zFuz>JVZ7GSUeT4(k{sMGl0ywkK8@Y9%V}K|NHyf9)jJsKcFhe#X-7l@TC}XC%d3Ju zUR@Q?XHU1I$M^HEPQt}1rGuTYp-)j5qBdj`aXS&x6Y-q)Q*gJ_a4jT#;eN^_52}x+ z-*PH5JgmGj(KJKWYJurLtAF(c>kT*Ne`f;B%xvx(tdbki&oerzbF&6fyBTM6d?fAY zyB6rXDUIERcGo8ev*rzqQA5l#2BQ991`k!5|JaQj-x{RgI}E7uR+Mv0+^`KclC@3IqFswD zjpw!L=s%hpnz%z+s{9DbH-+n4c)|72m#vC`4)1(3ssfEPO?Q0gE)>t^}5=jLXb z_4sZRjz|J;3TCWLeSNXDBTt<%cceIo{N+ew3d!uyLT5VV>^yniVHr7duvz2d6{^ zB9Fq|ixCGhPAXF`;|y3=y|`_1^#*pli(`7#=+C%8%G>d9KI86!)bN&!`@@CT6N<X~q+02ha`Z*lP))iL^Ly4xeFcMyazKhe7VwuLyJTF+m4`b*q*P0RSB|+n zxWUcJ?tSF4D*N)8lC&L}8^9x6qfM8pVf$RRi^5^joikF^1^4nV^4IJgQ(rWx2DhT3 zBX`J_<}BS|M9iwQcX&v++In~)w6|)rf_HX@7RQZBT8AwL@=d=q2nqKBW+GFhqY=VSsiOq1>7qB{|BuD3OuTBX5hX$1@rlVn%(pA)X& z_RX4bPiqJW8AO21{wEGHLOm*r8+&q)Nwc_Lh}VjaIq&zaHT`qiY?13kliJVhOJ(07 z(BNW)Nw!Ps^`)^XR24Vu(=>O zH#4*U2*Iu>C)6U!KUEJ?UNNPJmel#gq8+ZVNKQNmOO-2gH_7>YmfOWO=t`vsygO3JFC!1l!pQv?M-6pV2olLMhVh} z4DVPT8`Uom*M1?`gGS2O1j_6i?skpc{GBP=5Gh=?1AlOeX{H@e`s-sn z3qY7>LIaomz+D2H?z$A%bt!%itQv@F*5Z+4`w@_KVVe&iu#43=D|Tk7fsv&Ai%=mE zvvJr!+N?dfR{a(|&ww|pE|Mck4q-qUz@9!kMQZR=j}KpOEBi{b@$gu!LX%zHWviCO zOC&S68dTlMi^ z7MKYzxI7^aBEdgZgK7XwD{x;nVE}S!%Nl@A|7JvRry}@pb?0)HzCVhL3tlo93LeA{ zfSfYpei*LxSoDfw&iB{9Pe+fAf0PHjnYz$1(Nxgfqk|CUrhcdDEDyLxyr@Ih4}Ay; zpP$_CTz?BdNb@%8k|*%o;-y1_zHy4Fk{GTl#2~RIm{KLy!5!*k=A1sMnUcITn~~ZG zOKI zPkT+#JRMGY{lxZU(&j+4TE3YxazHHJP)~W4F}}DNq+i!1W6aljN8&L6u+=(K$@)fT zjRzb|13ou&xnM6?l z$zXn1A)=o-Ircm(Op~--cym>G<@58;Fd_O9TZ94)1GrRmDXY-sV3Rxp_B}Ujay71) zoDfx`&Ywa>1zu4_y(R0d&(h>aq!S^s+BRU7en*NRMH!o zosc?ld7oeMkHwE1s$`+t`^g(ZI=cL^zPe6#Lu8G4Q??PNuuEO72ArNyeJ^)p$i@ow z*hdhO31XsTerHpwH5%X&>7Pn*#r_y6%tEL>7@mqk6egu{aH1#Fkwy#P;xBp%+PfNTfnPr6 zVu@?o5tlmc*8RZ}G4A8c=Apzs*>cG$Pt=0Yq&%&n6(g>kIbY8*%S#jVP3OlW_F4cE zrXyEQT!78WKq3xE4(0W79|UIB&0aou!>U2fk<>RSy0_0RP6-iT_>7-ET<@sn-t0Nv zJditBIW1~<$&P__gc$yaUZk+KvRo$(v^3$gwS(tEffU(^T;T?$lmgPXZw*uCybzj} zb7rGSnufI4c(VLvXkcoNz1aQ5+sZ#b)82bXILVF8 z4W!XZkD`FaAnO|aXuChXur?e2dhXF@x*k>1#AK}S~unV|SuQ~4=o zt~!5D%1Ydy(S)yga4|QrEQxF7COcd8xE}pWv#B(d*=2A%c7jBsOg@}%h2Qp|NU-^0nqZ3?dC1R zGyl7VDmLOI$Ff^;9ZAjRYa$nf8UnYc`B)7;^iBuAF%`_&pS+m9o|;IeI+KeDZj?*s zXq}bUneCV?(%CGe3F47Lt6zZ(*=vd-KOkI3h+B*e^c@4bXqNX{nZEW-I*RL})6Au@ zpCkI)^v`7sIiud=kgjA@AunNCRq}pg78Ked;N_o;8u;?2WMHJtU5VfsMn;bqt>#@A zQ%7)unBM?IV=N%kvoHMrPeR*1`e%Y9j#vfA)CW&Gc>2gGhm%1{p2EAkTG7U_TS z&H9hZy#EIThLwZ$o3SC`{6=6n*h$#9*%(>4NI1E;8JT(hcLYY{8^clg@8FJzv5Td> z9g{MXs?x9j9@G{tE)LGTOib?X?u<5;E-p5v#Y-)RdA2QwWrD-|;{)ps>ndz1f54FxBA z6IWx?|G(S+uRZ*Kqr=&m|C5EEukv_o5HrTc9i}cXJh<;pItrSItj+}a-UKv>4q;+J zd?fsrpLE>b^UoiFhs{s?(%u6;9QqlZ<~v=s;~Wn*+F4_>y#mXL%b{*9u;PQ2o#*l+ z{^O;`LBNEiVPE;lF`G4#UmDLlSWi6yjWg9&T=y6u_N`>vS%mn$2i9RrVYP1sp)%8j zB(jZcQ~Z7^ z2F*A%(+z4_N!|MMurRACl@P8Jmnz&Ll?~3&JsUy(i7^#QfX4qA9D?RQw2zVW`U4aV zAlrXLoh9Ig1{c^&jPWFA6!Z&+*7e|rUC#QV&kDvmq{8E}x@34*Ol8NBbaDK0E0%ii z>!LbY?&9`T0HyFqal$XMq$z%-`o+8PkXy!rzj=xZkvHZTa?0dx(P9hXHHti_amZ$= z9jvGk&$GE(E9Uhh$#sV>#xwMiE8o3quM+#6gI~a}apu+clmmDlXsJWY(QdNt3gqYp zC~%?P{1+qYKay;cmNqV?PE3+E-*26`sjLNozFNnDJHG@=|fg!U(MfD7mqrX30b76ztb zCR}+|J{pY2MI9UKqDs<>JnKyrldJV?cFNH8 zvzaDH=qvT_uOi~jI~#}@%VPU4nVbE@iblv9VIQb6re0T<8((r|Jql^pU;tOd+G%CO z(O~tix?SbQUUL^q(2b_|8NiKMfVX-joh>hy5dWp)48ankVD=7rexa#Ts6@(+|L)`} zm|Un#!%1*GWnl?EuBnv|L@Rx|Rvc)Fg4uXGEqHtFWT*<+Y1l zvg(Ypg?b#w&LGN$q{#4#eb1{)udv`_w#UI!8(`Y2FQD_I%PTUH9gR=$3o>|dsCqXw z(U51tN;jB#Mi2ur8m$u+=gLa1Yl6T_haN4oH6eGAbIkkU(B<#4Ov=wSP(!XjxuwoA z=mftGMY2R;bC7?1h<&UE=+|`hXw(v~mf30JFoohccF3}v&ii5IOw;QUs(lX*am+|_ zh-&KB4N*?qbt2y&z?tHrfi?L7c{j`r6B#}BJ;gKpHlvsz?31;FdRHo(=nCJqV8nGS zbs6O~!n0mAAi9~tDYsQ|uwcT61l%<_Kn{YEgs`m$JuFJsrDd67BYZlji|tfi{p5E! zjH%DKZ>ZqT`$q@UP9E|T-gUz&i6@qw46ap`ZE04^YqRbeeOTeg*|{6|x?MBRGUfHv zwF{{Y5mgA7>lETYo=wKScV?B7(L$tSF=0HQ@|svubT1BIz$M2sIh1+*hY?Wz#bVE0 z5_Qrs$p_Cz&{#0c=Nej3bY+NKMeHj>359E1OGJnyyBVp^{}}cHV#Btj6q{6kK=D)B zfNd}d~VX@e3dzs{BZ=S=6fCFtu1a&E$iKgcqZ8!VUbh!F9^ z^tRxUBQ}qDTtT+TPi2@vGM`3KSc!tVRzn^C03Tvu%_u@10>{`{7%97810pa5r$ga~ z56M;Va|k!^y!`1@P~YuK=;uK8=Z$hcD5rVJQ96@QQ{_=;li-8AVd>H8jZhs5W2-3` z^cVbsZ0NwU>PdF|WeEO1?86?t^%JalfsLB28fIWBqfe9f{9`8*7bY2SO1a+R|N41g zR^SwJ-Ra+CTG*uxE2)&tQ#DiDKo0yA-;D)tvteePZBw@EDhl5$63Nf*z}bP=B3hCI zs{ZOg=kMgmt|Z}gi+au@FS6O{Hj4&lJnMkpF6)tD<8bp=w-R!IzbTGy{LU&BWjf!9 z_d?#A1?Dk^ao*zWGL?*T()-YlhPCzLN##p;3+_QVzE~P^_Dg^K&o3}rKu5$-pYQrQ z6~(GE@-*yHTcN-N^Jj_KLb9k1O#!!n)`rb zD}hErGuIQbH-0QQ9YE({zx|+jfvi!4ncO|*D)O=}OD$^7hj-5IAgbXG$E_g`W9LJ1K9#w9K4aI>cYcx)-5ZDCJLakLk`CcRCoU z8RB9eTMuOxKFA;kxW1B8H8Uk6IP2%jScj}Oxu;)|*+_zMr{%x-< z!TEB_S3bbE0_4VhFeF6Y6O(GAr_jqWV~?mmNZ&#{8v0^?TT9;t@IbrJ_t~mroCzMr z&2o{DFE#22?t@ylR5B^w^m$3cPAoajOcY4f@L7V4`KQl;x}Qyt79kYHy^9{e2kvqNFz2?|Se5BZ zZKUhBLuU^&c_7|);CP|kd7yr_Z&d2+@39XJ%tL;-pjg<>or;h)@96jSqm1o2pcr?? zK0#U&Ep~rsyxrzE&HwojS*Qn0J%Y88=`vE=)SX^Bw1F#ahxWL*@g8FVwLs4KBG_*+ zLrigGS=7&6tvLTulJuhO*a!TTOp3_w3jcgYDmUG;@dY0A5o{BYz>{R^8t%T{6a7w7=MKHn)J`n^AUQhVmBfF-OtaD z)l2nZiia~j4!rK6WByDlBIUKfX?Y_B#>V&D%RfzkNT6Pb1-5ihEtV5?Gv2L^oHc00 z5merTc2tce;;^^!*8WCsEJ2;%NBL-jE(Q2*-vz zA~sdeoE3ypyO}5kbfJB(yZRs9!8_ITg%e=9GRDolMX%yqUD!6p4kU~i;)J`_E#k5+ zj_rUuX^Q3{m>sDidYv>~j$Q^nGv)wY@iIfgNw`xhxvT+GWybY%{4l&k@X9!S6a4F)!};G)pCJl&NM{?(A#I9bxXd z%^hKntEg+o3YWCqJ*6Gnzk%1BUyy=~s0R(em^)@IgoTOl>2mPt-ru50;-u!yD z?8zmPgMaaTp7n#Y=b{!BuO*r z@=q!Dh1q7A0jSwZOXvi9inl+{qj;jWOs;zoPxQ#Xb~jeKDQ0QrdkaB*h7Z~^&#qvu z9l6&8W?FX@xV}lJdJ8FeuwMOu7?gR5_N$qse*Fd680AM{6c8mD!@L*|4ox; z>nE6}(CNwT>Y;Rm9;W)GJN_DGjj3yG3)Z9CUSqa=){AO4uYJNx0%*}ofL@m+i94fF zJ+WRcnhgH2F-$|a*9Nx-(G_*N_9%D)L)W&1FzQ%OMKO&jbgUVYXS%Vbhrd5<6MEYX z+6zVtvYfmig|eArkG-=w^qSIxb)%))v#1$o2it&45B&tH%tJ4(KHl^&%8XaIJU^q$MoCAiqu6UwR3JUR1o z5hICAAYKK4ae;oY%}gWC`F>^VUuWES%Jqj|u#8-cUo~!D-*N^4daS9gXknKs?rldm z6CY5$*t1=I1ZPyhy!@tX!hXq07l&shCk$@?C8@dZ6UDyM{X6jc+kT$n{Woh*a4u*M zf~LNII$4mj-&RCh8yFXb80W!Xvi439$9(@ip|;AZh2EIy?%L_?<+LyfkR`(D{HFO; zQxs;&@VJ4zBFCXu$`aeF4kJ7rA1lDHA=&MtlQXKpt~j1XG#A6M+#bAXhDy7CE{F4Z3W`&T??v8#Z&%;_vExjE>Hg}}f2Ffhl!?lxwI)if z4z{|dGx;iG?V#v%Q>Xl`11(w~%Aw?w*0jDCoYrTKOfgS% z@dfES6MZ%PK&86OK--JF_O`6Od}%Ld&-=urcjvb(o`1B-s-Rs9k7MUU=6~P~xlrcA z8OEBA?APa&@F`$(msTG4$vvsG3}5YZ%}_J5RiL@6m04mN>Q9kBLvPG_Y_~1D%~f0> zTk;Clo(F<<%;rl|!_nhH;C0E+2X_HpZOAlZWlQ8L_Dz!OW_)ob&ej}!pW2&lH?yX!eSzUyy#&Gp zZ&9KrmP<+lz=$d)KCvd*__mZ>k7VaMMZLu@u83l%IGh8f)s+rUHZ30^C&G7jZoMNT zGAomwfgfNGneBQfO9epVyvKsFI*G1@H3WdPU$l`$T4jOs;uDlUl0T?P@rMM+KK>?q z5FAK-=?DIb>w2B>Q71fh;jrkws|~q|x)k56iW#^yP1Xi!W?4i(XA3N>iUaecrj0a3 za=yRp!=+a4W!r1|B}GLioT+jlVD-;kU`lgd{CvgRu*zU7K1G;qA8uwe6a9sjAHHG+vb=)cfp_ppw5-j$>B+gE3M+x<4`v@N^)C1aCFUg*}X z#p}%+Vy9ZpenI6V?Rix5tbR!$vLJq^OZImtW}xcWBUzzxzPz11$I5KAs2zC4l(00fOSm_sc8GL zf=lsnqqZ|E*W?{dEn1ZCw^YXUApMd6K>W%=>0TepB0E(_d4Vts5-ZsIO|qQ zM`}E>wQO?JV~h9;Vc*=79Dt&sTXeA#;^8i!mk|^@ z_+0%R*YO6|SZRT2VwfVBw}}>&zr~>RdMO>cs5%G=8@?6Q(SXwp2)fOMGCOr;afeQf z<;dA`f7w24<2#F{3qQIP7?Lr?W(bpEV43RK*n3Md9pYcL{4tXT1=z@vEjg@O4z>oW z-Kmeoj06(C(Amy#L_0HeZZ=?38fC{F1C&a!DmK+(hO;{fn-Q7eJ+kMVvlH`ZoU(3^ zm%+YDJBF6nL9G4#2N3Z|VJ+nq{T&IMyF+&4%|I3pK##LNhhPWY^H+v`g!u*4|FTeK ze+-njEMSSfY`(3hlu4zFj<678=$O=E%=`Dsf^X^~N+h;$$8r0fm57Oq4SqLxBHH&J zLe}@28-uvOK=AK45@cJ>3v5+fzb`7>CHCI1gWmp~%;f#u8y&`kHA>m^k@kZj$a>mN z_z+Rw$9Va{{hdVL2NB%DB?vQ;h)lzi^Ff-JR()0A^{EbR>+~P zpNYd5Tl%B~P6o}TsgYds#%7LyQOx70j-Pv~2hJI>{1ragNRE{@hcRz2nycj=%YSZ! zv%r1FKP*4!0gZaXnQy7q+2#%J z(l=MlbR&FmLU*yOlbOqJns&%!K8ykeEhT=yh_{SA%bpjGQ(UNSN$_g(geUZu&P(GS zy$$SIFtPwOq!>tEaP)vwVf1ZB1KjH$(|Z88+$(>~ZpIM9@q@mze$yM4`$-g`I%2Kj z_cl%f7lE#de+OgR9JJzG?LX@M2$8DwD`RhtPJvKklYPOwGZz|5q1Dol~L{b3Tw5@icRBxRc(xXSe z`2k<-UHv5Jb?@^#ZojnsY!0Z+Ay;+#l(Jc2I;=+xw8IO<>d`yq*zp7RA%cvGDRSpy zjK`Fnc$$&W^${Qy_l)iD*;g zr)lk<-e=w(%U;CKvjHsM7`PfsTD!uPupxZi3Lr=HkcMmdtdFobewSr(2dMR`*S(XepZ$b8XUGAn?{lCv1k*x^s6?B{imuT)NakGTl8 zbvjk27F6>1$TYgG$$K?$y=^I5_xLL@S><436cd9rPazAT_)8mYLb#>qiY)sic@|(P_7sdQzeG#Th>G=(9yZ|1AbtB zVLk}?`1HsR4W)NozE;$na}W7a!u~MF!i!porLex|X3IHTNo(PMYH*`kIth|@TAw1q zb8p4e;SQt_pc(Rgo>KA=X|`11dhUULFb?E*y|;enIA-SL118iudxuzJ3*`G=4&X>_i)3F70i$ypBVnnm!#Snt*E-!En@Fu2M+Y4$la?W5j z$^MFsRoSzXG^f4%1G{&VqO>zxsj7i@${$vd{rqne<;4X^Xwhh>e;z5cje%|UBgEjA z6P)pwO1%5(udG@&FC^|)d#q`4N}4j-Fa?;hniH zr?!+ZEQMxWSFPvevkP6$a<;b=Obp~&xFpBE3?{JKQP`nyc&($eJE@Uey`d6G$s+uvLA)FHJ)W46urb~NVo(auDpJr#f zR_MM<{`5ol!G1sj?B#dFPZk3C@YSLFIp3^~t^`iG?Va`(dV&Qg#aKe;V#qv!IH4Ur z6hp5>6O$SfI|N#>&qg2AAK;BW(bGSpr7R2de(Ju&gm{vlkH^F>ybfN46Yl}mM9`z2 z?Va~YJ2!jF6fMlYUgFA;iFLHlaf|?D`D|adC>+J9^-i5L3nR|p8{$oti~^yJtqLi} z`K~j9w~`+C-dWyj9!cG}n?_d?sfbztijvMcOIdXieWsK;;HbLDn&>SD{9%^WQBoMw zb8KRffq9aS`9dYua4&E3DG)sD)6eFpU@ex3;?-s#jiMjW(s@0%TUfwB;FU-egNK!Z z?n!Cop<=gBd<_0=khhasx-!gAKrDV5Iy%gfpvYmhSV^c`X4mtIh{qXexn6A9^!>Zo zvue?{*23FV$4AtttN4+Smr{SB!Z|IucBAvDy_2d$(SB@XqO)|mWy$pEV#&X+Pb4@D zfiRVgpNr}16_sm!#GLjkZMvu+SGIF+`Iexk@BZI!^YvjN;WX7CY>C5E;U!|_Wkmq)~HNBZqS33Q1jk+?4J2TlV_E^jLdXWz=*E8{@TGb{= z6_b!P(~QtsSm}{_Q%sK!Tex>geEmGZi1Q~*vV7(r`F&Rs3X3n6@0(yL6W)Gf?8OA% zZkm&F8CWtjg*^i0Qbs{sb4L$Xqt~8v5})}x?P+Gux80vt$z6F)__oPql>7}1BRiAP zxM@2NQDF9^Le{VCvlBrG$?8Oy8JE9_2{Y1#4-ym|B>NBS_vsk1W4z!FfOw{EbW0<; z=sGW1&#bH;F}}DHLHhPNni~7W+|*obMV2-;dPYI|#c{VW_epha0Jm;w(UVF%K+2_i zg;n=n2T${$c5Z#seeIY9o+gTZ(TKVVH`!7h_Ms!8>#m}GC}5_VoaLySy4%j{vJkjj z>Sbv*;lbqn`!}}dM;zi9Voc1zRyTigV7Jy;b^*#*8jZvhDSZ1KE&u=$W0yJcc4VwGi*jQt5vN55LArGlxBxk%H~mzI#<`S%{X z{ob818v0n#*>aDjURCQ}xgy&<3olNY4lPetBQ$iEGP6{#H7S(e6*Uw0=tBW1%{v?K zA8Dx)5?nz~u#R^LoY0%k@cW?IV>^PWmk+Zui@dgbcEe@gtsHKlVjygTmQ)_4TcZO6 zB*G17n~>lpG4`<2j`Xl_&~Wb977dG`SIOdvI>7~`$kR-pj>-60YKUN5%z>h=Qide? z&doG&vh`aJd!r>}3B|vomlm+t72I%3=4j(XXrrJNcpsFlqxp0DZTB|V&nm)=dcDJT zJHMH0`9i6+n-wvimEc?Fo{SPmxh*qffob#MGKf8bG=QF0?WT&ej+V0SKT$L(2=peZ zw$Lq$82{A7{X*$9{K9h45Uz1zUEuKNWK?v_M^pyw0nJp&NQVtl)~DUg(OXyEkx*O@ zUI{M_=c>hu*xm2n;`6G7s*|Qm~S-)W%-OeK#%iPdIIRT6>$hn@E@oQyQ&) zDf=(#dRh!}&mhiLDqcC|Y4Dfx%hD4i=5;aPz4h%DbYNxzXW_k$QrbjyE;*S}wJ<9k zsi7N($BD+UQ10O-Yi7ANQYG2-|KZUJzeuUVDH&c0r{^oCWD;W8s?STRCWn4_tCScH z7egxH!#J-Q-d)Vw=FHm-iaX0-T2{k47JuxNkoj8JmGhVXN=<`#IaLh~wZeSIv=Q-c zcAAtI5dP4vKFob&5`98TE)~$6;ozxJ@^<>|5*#Z-r*rOW^*g4M(EdtQYE5_=j4vQ5 zK;+_v52PIynBXh+ZzJ1J?4N9;&52O?o=>Uoo2$xavmj?owdGv69j9&H#L1%VXmu!Docm=FD`tnBz+vtRrMG1Fckk;2I7D?i)cDk-xrWoBVo=R{`GgkgW zO(AO`tF0?j4>^`pg;HO_^?+ff-L-poNAKtvgYRGBRP~tpp%$49H+_{W-By16epoRt zt|c&CmrI_j&(Gu~=Usbu9=o=`5~_l%>Om`z0;ME?rCwnxU3HtW_W>1B6Q zSsu|qVyT#`IFd}9b~XABE=udwTa{tSLtz3wS4P}yP!;Yb=-bu-S>CB|Y&D^&cl%_! zV_|NpsPcDxRoCoc4MP$(zj}USYGta-bbTf&2YF{Qp-YOu3GLc8ZPpR(*#Yg@CGFWc z?b$x9^%d=Jr<89OV6CpP%&ya}v(BQ8mUWKx1iQ91Cw#j}*~{0ITLmrtv&n}V3(C}f zK&X?H^?Q{aJIhLlcG200zWnrJW7s{`%4bdywRiE-R~~7vG-|}b`27RcXXi??K(l+a z5QSjZECuvi*P!{EE_mHE1GbSSk?6;&5k0b)Go6Gn(yO8%99Mo+!guT9cT)Q+`5HX~=VA*^Vb=+Oi^*C%=>_6gS>HY3PQgIga~8`I0-1``onJKOUKL|5!viCBw@9NG}!6 z6vVq6sP;}oJLNGcsHI3No2DIH6(oA_|3o`e{Kc%wPa7d+LHld5<41&CqFeuu3l-T; z?zAD}vWgSL;)+p@e_tij$D21d8GD*)P=~2q74Afw@)G!x*iR~ZdQFbg53*Iq0=+N6 zpD3`9>|;w=O3KE&Mc&~*szSF!eJ=2|LJA(Ke_XF~tVmJE<@% zn&gzHdu|wKsYOublv_Y7i4cacj;s( zT(aJxEDEAvVWw!(xUU9YpezT2y9%T;<6xog{1CVAW+o9qxDIDDAZ6->sLn405@l-@ z`ekVT)8o%jo!2k~=U`b?h`vjG#hE+3x%G~%%B2U)_YQuq_7415k>fjN)Ck4DW+<~T zR6w09rg-j^8LmiP1UlUiqyXu)pr4|4DQePhEd@CWjb6E0ushd(XIa*k|H4`**=P=P zvgqj6o-d-dk~wjqvz^ml5=!2RqIZN(jVVnQ2|j`R@a82!xUgayqECo0QG)1^^lt9m z?n2_oXLMnBC_~*ofxUjE^(9-)JW2e*PG!dn$~2#4)%tB8-qkX*%5IzU*~ud#_(Ku? z%b#vOw9$fJDFtYIkFx5hBp&ItYwD;H$3j%`+3?EMfy4j^stwA?`ZWj4R6mw|4Ue6z zGfKxP`e!ZnU^Ku!G!}ZxbG@F;Yn0Fx`#QtC{OWw{cE3zZyR>-ft_o24fdA5GdZr9I zW32CV1`3@4k%^;t3mYsLYEgU#QCRf&DW@zLYpPm>waY#Vv%Iu@_|B{!jvnM6rXPr- z1&0v!=;)+dQ&ya^vq{y*32))=E5cTl^pkml>_Q~;qB$Az`7Br@&rp5TXRNg3nG`4t z|IWSL^Z1Gg%`z3H9#eNl5gA3NQ=1tGc!9Ob-<)LZ%;$sr*l-L4h9K)TqQm{P`c2!=3z1<+BC>df8yy zF|JD!R>{I5zt(RCk>B&HmLDw*t7J7YYt;gEw!`jqkAZH&Z{mEFANe1pOEYJCYfAP- zPcwCMQpZUTxUVw4xxKI-FQtAX%*=i*F|Cq8H(bU&H`O<>H#Ij|xTcJ3R~*FbahXyK zjfFK;HGzxVXMR<)uf%_QA?hn=y}uakN5{Q?={=Tc&$|4=mo7kL_$N%H9Vn`(BAiMa z4h9KX86dnOUJyV=9S+}E4%4153OZ0ow#^#LY`2#mJ3gT@j~j(w2rm1|_e5dpX!iNl z>iKj?;oI?)d*yS)chviLm<%&40{!2gT{6drcH}|>;5ET2;${Q9nb#;bZWNIe@wPhf z$OGRs-uy<@gikMSaz40p7V%lYk6BBka9={_x6ZveKmN3&+$+0a@KnApNx1wja~q+( zNLXLe<+ndP!Bmixle{x5f0B1zQ8A<~dD+Sl43Zt6&#Fy$Q`@c{Fe}7PA}bvH19g5w zX+9t}Up7d5F_idso*}Y9g_bFW!scFSElkhhB{Dghw7S!m0%&U3z)S2<5TP%7iq8H-K39r zx3@U>Slo!}OEc38^a50#J2n*92Gn>5@%VB?lMEhlX-?>k21s~c``Dr7AQWYbarR{ zSpGvsjS@HlQL$f)nbKZSe*J;*8sWK?=DGZcm^h2>k>rgn*S4jP+mC2_RV|d7wfp`J3_=5e&0?h-h5E@cF!RHB~&Srm`7R)T&v< z_FpS)RgE-8ms`K9D{iq4Wy-;>`kZmz=+OA)X;m(cS2 z`a4+uDf)-x<4wJ`_&CE<9kW``)0?kzum8`ITAYyPn!CZqnk^L*55R7R1AOSq)Ix|G zSuT!eRmP@s0l&FCwDr~mD$WzhIUN}_`pt2^-!XX@A~t-0Z0EAf0}+<=Q%qVcpu?B! z7S8z6%z9p_sx@DOJ91u}y}Gr$21czIPTTgflG6Ez86Yfx)p|-*i35jMPe>xnQYJ3v zQdKs&{5Z}uI)`%PMj19!VDO8r5=f6f$u}vkk|2vKjR1&neE-eH@&yIM-IV6R&^GlO z_eiD+P6)yJd@Nmqymc&c%n1~=%xaheADaR9=C)FE^sdQX9%*1{r$T6FcuUjINu*J# z@vv#Xcb_t3ZHY20A^fvqA+u#Od?~XnpTW#Zjnup2+?hiHcTDsrO~GK<&<#fyRHI0C zO_iUU5w36AJE>Gk>`Y7`0UKAjkXS>`0#tWtSKq zrPI3d>vd4*Xg7k6ouVNB1Zij}YF_IeO@d!M`<?z?R+ z^;p;gV38$xH`Hyu+3n|)arFfR{f!lPVtlEZbt5}sW;2;P{BrTv#@O)h5D?pmlywb#k1| zyU=d+Zc@PDwYG#y54h}Q>*BNE6bFiS)yQFKv=@9is2O2S;mMc+ft z5(5IPV%l5UT}kn8fzn$CLnf{+dALG`Q_XaFI_>QM4>3^KgT3d?9-9gJSGiyo z<^7G}AqaA?bPi{M<@hO(@}0Eh;b|n|D~NR%4d3<;eBPf&or%67uwvvV4B!if{KSRA z$R6X<+tqUpLK<=$Gh?-=G5vUveX>av#>Q*zM4$Rc*?q51ZT^!Cd&t2=Q(|oFM?Z%N zcUe(r)Xs0xt5KQwAoeb{*u~Dm)ad?9!984p(8M2AvVpT7(jc#&mp{qD-LCiry1y_` zY9n~wu^A=S8C*JSuvlrYysz*t%k;6GYFGv0ot~p=GZi|MvMDpCsqn4~hoxY)Vh{)2 z!92<9fA&?P@_ll;oG<=~6MBflmiC&eAZGFJUxx+9RzZwP-2)KzMaeUqcwTnp$y3SK zWJaD4XNJyi)kj}zb8Tp|c`5GxFz!%-DIxBsH*MA#Cz8Q3V1={T;zmJc)%#t`b}OkV z*yqNB8k+B=$EIxjbN2v6DO&PZ>K=}z2A9kTM2I`mea%YyJnR zbDEl9JIl`LPF~_hDNAegEgl4n5jBuQqI!5AQwbttnrLl+X5Kq#8*G%XsOQ7z-a1DU zv`vjiuY36^L6yN2C`U7lB(boz9-b9$rsh@Ap~oAaR?P~Y;=2QN^Zv^%Tb0G1lCe_L zhfyL4yA-N5s@EaY=<)1$S7SGF%VN4w=}yi)8dA9p9>3%iLsd^&lUIn?;O^D_H)n&? zH?W^Kd5D$J2B~WArBI`)wJe7>km~&Y5u}0pawnB!L;Qojfz$oPt_M9Z6EMAVQ1sR1 zAaAVT@cbU~!r4hYhG#-oQ3zA6b-DZ}GkuI(FTwDi+>VW@KGrL`ppBFsOSO~G__U!& zjB%UYRu7b0GXPmZmpO3RrB7Z{PZ#{V6x@I%&3deV$EcG!TH%C#Q5<9q5)S=|>|(!H zX4?ytPZ;UWVvusSyBNkW%E%2 zHlW?l$V@9nJiT&+N%Gm2HQ?^u;ijb^TJz#ja(O2d22mggV?mw05Jm@o?1rtl35Ba1 z#8E!YyN@+kd{<_m@g{Sed~y-j)Mao0{ViQ{9p+CyEbf=#JEL)NfEReZb1#>ZotL)i zU7}s0Ot-r+RrkXS-@T+sHg~m@x(aWBmw(tYJqw_clA;7$Wav|~Ubk?YwKiNm#oYzj ziXL(mia#rG(9^En>F{OvWT9pK*>Qy@NF|sfB=yLk$eFUli>WCgGj`i`ofW4EC201OCeXHZt?f-6G?u@ zmS)lsjvn<7Qg|%wp`~mngkdsUR8v2+ zTz{yQXomh`I!p(VvG(*#(k#pAWao!08*q&{$AG^8Wf7j+{z0(an6GW(ntk7++x7UO zeVONbP??)0NPY!@PAqfgs{TbtwM2n_hE0SUm)DGm_ezh?e0Qgfzl4ZOmNd7P_>`RN z^SL@V>d)`Arp*=DCprChYy+PR#p8Z2in529?Y_%8t8nx1Ze@Xz|$E>o*tFl zz2Q)Pm8Op*s!Lz%t!c5Mu1%f#Ps}-_yZKc^ZF6LQ7au@aS#=Ko5kwC!mbK@_Ru^&q zZC##k+mrqrl3?8?i|I~Xg#D3_z{$txIFWf59w4xd2$DYo__O9t=EW|<#G&X}`#IuP z^ixoe`6rf$_#sRFAOmFt_B&L9SR_pr`Br(m`bzxJTsSZM72y;np?H$|<}>L@yG2S?aq zzp$+4XQRiP;Uonvxv6PvzW)AzU)U&N6UHG%;$LpYjf*IeU5@$=ZA*lBz0X7;vwKw+ zi% zI-aI=hHc%sK4k|h!+@cjTEItvrE8NF7KOqzuCLl=qrq-s8!mVqMDfzVt7*~HG3?~J zY&q6QBicDjvC*v5WPJdHmTZvR2y!2Cz4-z#;~?iGD~qek#FQwH)U8ns7YdIOKh+SF zy%CYbo_d63|Mj3r80X3q3;dABzZBMfB0`gs%-&LD;^2&x>t8muu?ybasXwG|doB4- zk#a1Mr#~kt&92l9U~iDy1C<%0W9HS$P_jg>>UAttR;jWbPZ8dmn@Oqt%E*An zh1D$Rx-2DuHg%W7klJTj>%ILM_pjBu;bYCb&(^b@{b_T+7pJG!XmZ*pGF_Y8``*0u z62k1E(A1(e7J*YcSkI6mgi?_Z*7IjJqu=O5*PluLn%mi#^D(P@`(GYcxBH##lUPwKB;ao4}xkgKV=z6(n(%mkCo=}R9L2-abvgn8W>P8FPf^V=n$OY)+mejCcGTSlnXx5LT=T+gd(k)BO)e9 z7~7yN19m}7VRcYrd_U&sz|olA;fJrk<%7glxIgUd*t}kxflQ;j-N_rs)zd3MQ(n&y!u;mca`Y3`uuc zS;0MY!pT=O1LF~K*Z+lbYu05<{G+}a>vr^vx@+(5=KgF-&7o*uSeTHZp{r7C%vWmN zQP(a0eRgU{*yvUM8eCg-wD8IJUM19U2P@D4ON9dAKhjfF%?N(O?Bz+|q8>40AzhHN zC!E2TU#OI;{~)qUB{4=E*pTpY(L8_5u=i&_M-w zh074!NZ>hViMDbzNCS`|Kc84r)mtJzdM-F$AETNV+kuz>H*5XY@-}Tht4wH6-6snC zGOh8kR_?RgcJio;Snzjyv`HhP`X1x6o(w?nDbV$9=t}+v;PvfW* z0dsgZ0kegG{U;!lr5%BI+2r$#doK)K`jd{qEkl3L-TTi?U1ZL1DJ7brX9n?M?TbT3xHe!(a|?6yYJoHc_u}j{+dxXSrf2HicaB^D0&7U$ zEfaPzy($S!WhCp;!DZwYb_akX< zd0ruP!IGIaf-K>`WfjlX)5LX-XgY9}?V!)UU{zM*#-rZS@Xp%=GR(^-0VJA@26nd> z52FKFseVyZKJUx+?&gG3Jg*~%`|k3-PR|Q~M^fKbid;h0%N8n@zfj$0@`y}A=RU_b zIiplUU*}iwH<$?6eab}$3P;rDO5ybG+aefEh~40NsnG;73qMT) zza2A>6L1wkh=WKXjEX>&WZR{)tLK9#BT#;&ehpBe*n_k&w^!xO*{>MvV7iASY?-Iu zxum@?{UdnP#@52JA$dD>NOIA+4Cg|L1eH68w}Co8;I=>pqPD*ulijWr8jqq6Fa9Wg zdjXG_GUC?|gS z(s=&4h-PwD3{87A(jEP+si3az94+B*{9w-y7z<} zkN1ypVdJmpRXUHeoPY1{M|M2i7iP<1*l8WJziA_Fh+?)!mO(QF z;4g#G$WzL}Q6?AROF`^$*}T!g^F~n+vL%B9-YW3yu5ikm6eE~R<~beCA%lnvd>mJ5 zCev+~u-blH30k$ZE)~#N^nDMq6m#d||jZECVj>4FEJhN5VQ8UTle=q`cXq^QY) zM`86cMbAmz)y%+3g2xt$NbCTozT6FM`VN&*da3fZzGJW3!-Z^~2o8^8V8#%JgBVkY ziO1H`OzcRE#6N$U9F;tN6X3ZQIg)s`Z3FolghC#}^wpqM%JdzkS(@i^$bv_Q*neGf zgp1=MEko4dd%4>RsZh2b7oq=8G-F}@LJYeEx(u`d@oE@s@<;M-h)(Ce(<9SpV4!m_ zE)S{IVw-)qf>w%^QiVD|93WMzgKVSd7~3uMR<7PKRjOC&P19}l_UXR4wne@bbg6Zv z?P=Rd+ZVo!&Au;uB(=JGjL7HZ8R;t~=B4jyK8ONlRnCk!H8}82GeuYiNo>GGugFK4 z@$_7lv2ezIWB~)1{lcO4!-$6m2i_Z`959|B0tYJKOR`0^TFrKc(`j?LJs#(BvqAF5 z+iz~>ZB~CAhqSAmkbDrH&xT~q#v5!-1N5zChm|K*vt%@8%Vuy!_J1>Fdz=oq0*^h; z(L^#g8bUxIm;e%NR;w%UkegAX%aDhfyR z)|s!jTGXsY%%$>X`30Fymlw%j$W$)%#eBr~wh;!=2;RO{^7CtWGLFYQ@Aa8wrw1I} za~V5(8Nq@+(}hZS-rv|!{i$J|TG#LzTQ%ss0b2gj4tx;Hu#WxD1M1$rJMP|nlwO^<4e(}nxhpC$qx=fHAmX5&fzi>p z?8kLkQqR?d{E|HJ+9Ta2#Oe~Czr5BVc|Aw@18p@2pIeup_d+!I!>_n}^;2!V>2r5J z_gX{SC_w8?fL1f0)s81<^)u;gey*8TnMau?^7ZD$DqpBnDmPhY8)wT+WQ9pIz!HmQ zi>jKeHoL0YRg*pKb_#HlQFOq|L^YYRMFI&b0aFtux5Uwk-K35tA(Ntj?M46Sx$gIc$H`dK}6E1({*M>d?Wf?_#UQM1jl3X{w!V*3Jl=n&7 zb2mM+|8;u(xoUdlm(Q+#w{0n`!9mc6ok1U}CQ4qUS3&Xe<|zKY#V zpJFa~2h04fgQ)qSp85IE2Ce%JZo8dyviGphv9GXkX4Pl0t7g@iVJB9f#gay;RSf{u zA+Jx*0xW<S?i2V!I zachU@01Hripria1xDJ<-n>KHrT+=YK&#E=a`{!@QeGk1jrTfJDlgs%7 zgLX|Db7)>KOCYh6{Cn88x`AWDFqD_uuM@iH`}m#F&zfUYQ9VD=cejtL@OA+XWZ6N0 z*uMMGbZNsT&6XR0XW4UICJ;oI#D` zr@_VY34OD-ps>>A;y$WbICANf2b*q5CZC@$sOQm{kL+f^iziRbU4LfRy5#AtkIq?f z>&P+V2K2609z52qM_o@an2!58lhr1pR+Wk4^cP4kg{%ccx?looe zGHV$I#{mZa0vL3oJoLSGXMh!4vX}@ODPtB>Rh!M?^5nTQJTAM$=j7X6d2V+ai#9-| zS$4p?Y!;d3n+tMen_F7u${6Pf0A8FZn5U!EZ3$TbvxdAp$?fhCF%V_<=1V!nexZv% zguVq#%&hL)vBh;37WaQ7An6!&d9K=`ewEJH*ex}k!)C^7e2VAL#X1*bIQF<$@6roh zJYzIF3q}CyAOm=+)&&S32MC|E@6gnLCeL40G`9PUPwT4&l}(=2vixamIaD?MzM(y? zZ%F3y2YT*U-27eeimE$TCcnehb+-&IP0XUjygc;oA=(YOOjWIE|C+x6a9@c&-j6x~ z!cEplF~c;wlR#lhKC|MtNL&Lqx+0oHX5mz2q@Ri$c++LF2} zM$eB~Xn@9EDLT?SyoCkqo9#Jt>~o8e!p;D1k!2cg{hO^l2ad4jFd4dM{)_v&mVL1^ zHsSjD->+{zI~~6)JFZAYwj^_c+>&52nEa8qZ{L2d zmCfXh_EUny)H%e?GD(%JkwVq)8{@2Z-ht;hg-eo3j>~o-um>_J7?F@zVv|B3T&~z_ zE?x#q#!w<@@>McHGM3|Hl4kbdC%EEe2+x4edBO!6r`a1>!nPS&>Keeufb&|Q4aZPx z7$kbMBawtQB?xsiKq8b*CR4d&$F^xDUVrS6`@pIhugxfV`dD-4^~tj@Zu@y|5eU4- z85OhFOnU26TG+PrugUfe(~dOO9)d9>)7s969@Fgoa6fV_z7}$$3$j1nK3xm*$mj?C z72pk!Od1fz*@Slx!Zz3qx@Gxz+Q4=f6g*M6@#4&X(+qL z$O)YcjXldyAz|_$gHzEHCKzWrVX8|dOj@nimyzK~|A{q`EM}8Ql@&#@L4KrWWh)uk z+1Zi;Nw?xwoz85R8-U`@&XC-GHA9tXw##W!2+8)i4bDalps--K>UYO+uVzm`1?cqJ zYYJqLY#hh$H=}^$KY%AA6~DhX|ehPkkUNzzKw5CQI?MTtt zy{{MdZlFn1^s%N(JNlR28T_L6n(OwXjP@`0seZ{1V?_%}OXrtDn$dk!TBQc4E>eMW zm`!xkq_Pe@-N1PC=r?nzNbtN0{L0&14b;|oP!K=yR>JjuSCQ*kl;l9Vh9jpmpY`f< z6X}q)?Q8#3e)E&nv1Dy_K>TT zf$~75pSiDPggiot%fF#t9A}(Axy+OnpbBNVyh7PwIxCBkjMD`OqnWr}HV5HwoTA~Wqp=mPPv zyHLQoQNuAa#ArA&W3wiz$L#1a!!c&s+Zw>Q;UK<{gXjg9lu>(=L&@Fa$^l1Vl(U z#!DhezmWbrKCGb{@c%cCrcbx;(` zvxuT4i^xJs;4$go%~+jd{UOTctynAc!m}qWxZU?FBLGk0&oE&`stBFjI*C&8Doh{~ z-UND-YOq5@j;(Ttf7S;~*DrRve8ff5TQ=32QjkP0)#Ce~AII&`z*W#bD6c3~wJ|yR z*T0`MerhLd_^-r-btq2VmAq;1vE5I?uJ3NuQG(=~1Q@p-&3r){KSg{LD@<#?f)J6! z(5fhsBq>g(#py7MvLkEF` zHKGb2I;e?O><~tO)1Kl9&{CqBwduHkC;{Nuen zM9%C^uEDB`jNoQ16RQkto#3r&z|bfZgf@l_vYgCzG5Ak+)36KS_9VsC(4dd*g_nD% z>83y3r>k+iA<2=?KN$mT#C8W3k?|mOC)Z|v1gHHW6Yfv0*~6Ca!DF~1*+%Cj|BM&M ztC5L7?20b!JFEwg~MU4kSm7F zxkV%4RLDk5m8N;Yad=f7OU-U}P;A2%75tM57)Om(n6BEtXQ??^NU?Hx(2o4qHxKw{QoLi@L5MR*xDA z+gX;AP|5(J{kX=aSKI?o?-S_2!O;f~P9}*7x?h2G1y;>y&kLcwXy|?i|;) zWWh6w@19lr;;#Ak&as)L%&Dc-Ic3WlcKCL^}w9@3dCkf6gKoI#`#x!FiwZywazz!<0yFb?zi*y|dNHZV5sPTLIa2 zJV+bm%b{4m9ib2ec&}nJ5dtd5?`JuCJ`mh~tH=jz)jkM(5nr{h&i93n@%c!^!3=nW z($OuvpEVD!$5^UC9cUscpY=JqNnF3|d(r8RAB45s=~!iB`}mt1y4U((ys&Y;aXv@H zWa7$T)OrB5u*)zCQU}$5Aimd5)7oN!8{lGoYd)v-O4n45}OM-Qn z)-KG?8DOs_R8nn@yLa!z9CZtx<-2-R$`79F1DQrF#ztn@L@;d>E76%As?FSMIVo{2 z$&opX3ppoA^CZ@x!UzlsMb3JmRbWQKGNH;@3&#mlovhnxHH)HyH-ij6&sinG;YXt7 zeW}6xzHDu>uCX4o($-#>b22Cgm~bH62Xnz7Qc+Kt(h;5bmqfm?oZqIeeItpj6c*;D zC_wh29+(^oZIcisA9?=JyGOs+^v<$PCz9u%O_mg`oVvAT=iM!1SG7%k?D*y1{2Y!w zb_R|5W+HrTP3PRs7rwdUfsuQDM|RjsOpmd6)jc2^ywL}OBqoIk;wO<37okc6p$eOy zy~n-BL%ThbyjVQH&AZD>1M*ss;RTcpD%MPpBg4hmY=<(Oi90l$LuYu4 zlm~6cu%~XL1Aa57V$Q%$`@>p>BVY=LG6Pmk4a9&|wyw2a#*`Y96CPu*N1?$VDO4L_ z4juK1JvAc&rB=RMNLU5iPUKubWmDdm!7L6gnDW(NFogr8X1*Lwe(~DIx0gQ&!GYKR zD1G-o^u5iECz3hX``W!~{TbM1yX!BjFW&PKoOJXr@6VX+_Z)a)3*6!}?|$f*foq_~ zGye));2mvch=ciXm{`eOwqJHIZWy+Wuu(J?F|?DiIbALV_W@%T&6LPXipv!O3|6j8 zodl%-4;`q8!j>#eQ>+V1Bl~&>wO+;!oo&6-$-7()fT!1E&pcw}9ym^@{Cj(`v>6gN zx-!J?zJm8nBn@-W5o83Y-%bQeTJ+m0<##zoP9IRiMq+SA?V)&72fwPEE=f3okZyeQ zsm!PR?&!Man!AEGk13Bk+`r2F)tl5~dk?j@jLrO!yS%w$?{}?)gUXZh=({loWrHZp z>;qwAN0p|coMnWEs)@udb(A97UCGZ4FAH~;Gr5H&#PPN+-g_sa-8gjzi*bYC%y7Lp6 zoH92yws+{~5h*c#QE&cx;NS_k30vwkCsCv;gXwO>h?8V&+3O-)-^GQh%DRj^mw0^0 zj*dqu2^nl_cc`vGsV5Qi*NAhj=AARzJpZ;arzqIE(^Se;Td-rtqE&R-x zwPwQnmsdZuYTWIs;)|6rV-(li$}{!*`akG~MUTGo(zn;2e{IFM?Xx{-&g%H|S=%6c z+g(Q{Jw!49!2~R(N0CSibZECtqG6bWezV_#c$jON0wd4V#k2+M*;h@k zDl9G15^{(REOS&hLT-1+Fc*2VIb@L?*a^2|-Ac5q1#>iy-EVV)h2JMbS>_{_YRh)Z z1q&@(>MTu`H5S@p=|$VL;a&pUaJw$#^lStdNNJXrU@8mD?l%J3ANBJ)P41b+x0YlS}!lcBecs}B|5DgvVPBWn`iyh*8 zTEJA}xLavn)~SZ&2>C!a{=iQ9B8_P5aKz{hByvZm2$v#SVLQQoU|Xbz)}|L%>u=+$ z!_~AlCRcydT^ly;N@Iigt|K2`Y$4;R%o3yZMT}NWy_9#5muBYakB)nS)i;#onE!({ zN(m}*?H>{;<9R6-AZ{C{|2FizOiN0Pv9bMgmD; zfv2@>UeK(SO;}9GLPV$*>I7P-=LLH{Br?M;)OQa>rI0htMk5}&W%|d4`A5Q{-;eEM zdt9GzN=z6+namqt$t*KE(#~K)1MjS3R!EeQ9MfSUbQdP%z?hPeHMy62J}s=M-8qTS z;~#fFrcCdmOTO*8P}_oc_C&n1Nd~nDTl#=-{i-%hlw$!#V;0gY={@ve`Z0#%X=tTF z)RV#|!j}Tm#@|gHV$V@@Dq54z%Vs4ekOWGa)aGGLKrmSVXAvpPb|R9+25kM3$SWSZ zTv&zueML_sCI88?R_mdh3~eUfF#{kO5z#C|(IzB{p&>Y#sDYE=O}tC41ZLb!ooAEU+{Fy6V>+3O3}u3TCc+$Lx|lP}b%sL} z6&e7{018V}9VByWT1eW!8E^rhPH+*BTq^7nt}swu^-Tj2dc4y+jExR7x2+naH##62 zU4JC`;`kBX;09_;KLdyxE#BB5y|Dq=*!o?(u|Y~gkoMGA@?^+%<8B|=?*BKg4DW6N zn1Ca&FdaaZjR%13#Fj(>oT81MsK6qP7h*??UJacox}d%r`V6s;s*i?Va=nz@RrIRL z)=2fHxzapatF*m{&W4 z1jvm5^!o!=n=NE_I2`1L1KRD5TtDmao6Wi=V+;IQ#91urg}>G;4l8eKaLB+e+Y$B) zS7{c1rkvG)O$@*6M}Bh050G5Ya04$E;)Myweur!)g4hrX#;?JdX|!si5jq>_y#Rsz>w8t!T4plk$Rc1{)Rco8DC<%B5oA zKp|Dt*GiKs*XnDPGAv|#qeF%%`-19)NlifrviWA!V!^f?F%Yn5ICb3IAmc{ErUo1| zGhRj8uz!Q#>EmhxB*NW3WNqAohDEx1g?*bN57 zbudxtumlWJ{03TMyW!H)d8XyzSS*zH;mez*oK~58Yv%l z_HRiW-q0=BE1Qj}CxHOi)CUx7L(joBbcUYv%frRlYqJr{WH=pJ)O^PRXMI+^e~ojo zpB>M@_3}o?R_~Uq6BOg~(;RlhMQZ?P!y_>e4tfHBlex7V#jVQ@FB{^455h!~ zo|#>a56ukJD^`#+-;{0Ia_Z2RZ~Xa@O#JOsWDvL1KXTmdJ;Tt-k2Lz{Xn|+jizNfXSF|NUmC$31$*;@u^l5HQ}+h2bKi*7Mw(TSo{mMO z9Dua_?}X83{f+x)A3l5Qv8U_Lv~7At@pRNa{>F~QH5-?WOSUnuJ+h?sqw~)szj$WG z&l6{;DYq4moe7&x?b<)(pT@G zYZR!I>cB#<60q4s#1D_gNUKdzeK9u6l{HVoHoq)efWw@DB&#(fTO9Zy33y2P7M4Uj zWP*f{c&oKR=GR*AcE!Y$Ww~0elbd9`h_G3cc_qMv4`(Tp}hUhN5;%Nv_9oMQ429; zt>Burm8W*{`%Mq=G;48Lo-zHB{uBKT#fDKnT>(d+$#65g7jlvnQ6j>0OSw!9CRR)_ zrqxjIm~KFmuaxgW>@*Et0JsNb#u-mYRS&_fUJ>Pm9l3=!w*3akoenm~(>Jp$an{FpE?s zwgGTULp8@W+YWLd9Om`gImSOs%p~PGa#t5nd!{vu5 z;K(3uB*%b_4CWdWIFzcN=NcKAb9+j5)Nk69lbigH{P7dco;dq2^ec4dhD9reXKlMU zqJGIQclGYr0auALZk@PzY^0!It7q7n$#>aTnHs`jw!wVNK)T6q8 zMGrI20Wa9C6->3ZS~psESr1E(+MnfL_Pycz+>Vtsq=3f?Y+{jO#&!=STCXZt!ycE{ z+fKtIu%nD_M+0x}MH$B}>&2g;49u(v+~HTh-ix zs{M~B<@q(CJ5bwR$ZSjAu{Y7P))mOc^XtTXwUG{E{hrh|cuXGtfOwKSDSYPq#LZ!k zg1_6m(|v$DApDeio;BqOarZ`Uqp;q*!Oa%Ih+L^mQD~>fjm-|1$Kk?O#&*2iE)Ov~ z7?Zxcix?DEcSE%Y%APt;lV^>G_Vl7{ z-5Gd?6I;Y*4wNwPBJ(kGm7yXGN$l{bjLLY0iZ@e&ZwA@4Min6)iIm3565qtYq8Q49 zm>ve&zp+sFN~D2YwzRy{y~Q*>MfV*;l;_OZt%tHZdmgY&nKbR8wxBC>anGe^-}wFg zt>b@;mL=xTjZ}@FdPjZyKKLGXt08y_+isgNO$G3TR%^?n0_KT=W}a!jm)p&EntuYH z5l%spjw86}JfQ-RQV&rhSqIO}grde-ivdqz1?;pn0F!J&m>N!Ow&^DVS0S|q?t=(k z7f-|K`T-W%QVBipI|WN2V#hQjK%;9;l9XT)Y${1gFn|#HK`)&7(#s32uGlQtd?s;> z4ku16{-FI~v|XRiQS4X5@qE1a?}tC}K&$Vv4-NB7^4wTr9!UX?hhte^u>Sk?<9yXw&K^J=po zkeS=1W{1PeHhY0!KaE;|11&q{^{J}Y)}Wk*eLzGl-ERm`=!JdVr~zVYq@|l62Ycb0 z8gIp>h$rLzz4{4c`}D8cKa~?-H6}e@xf7llHOnS^>Ygrt^;b+Q9Rh7otY0S^DY&M? zPRJob8ej6y;OoRmC?usZ2ptI_3A@IY+bz!6(ssM|7z!7;eUSnAzCx?xmC9(4wBQ|1m>mbnD$mEX%3sL z1Qe8K)s&e^t93K?vBE04i7|XsjOATCCK`*y5n?%xpgvNe0}3;fS(2=xhc=>$OPws#l9Xm$P4E|3Z75?{p^CWd|38TavU_DU71~& zd<$hD@wJsp;O@j{iNF26rZu^ZSf|NZ^fpXW2RN+F3Ajo`&8)e02@G!*EiPUa3d9Nv zYclZ`N#X!>0y{KOR#}d6l7r(UizIL|Wiern76hI(2~@yNEH(+^|B}$a!_(+t;Kani z%qL%o^hdC&(?eG&uvn^;+l@gi{fgoOMgcMh* zQ!SH1c*)X0vH@tqBp8h$0FC@iG-`D1j*8@l09EczyivO3Pz8J{xEI|uVT$EY zM`Ck)F@F?~V^wk%^&s=FpcMS5XC#8&tgK!LHNK$OQBY89cR0u+j{(q8y($QnmYTDJ zxmIh?3@u$!FIuJ9>|d9#kUi8V9$TybdT z4Ag>V%p47;SIt>oVKqH5Z2p0Fx>gqk+Z$(GcsLw(DfTBUj;0wCKK#kZnR7_l@as1v zXQ9nH%}!~y*5R<&)#ljjxYt1!cp%NPIst7iht1|Hj6`$-`T`E0FW~WcU=V;XCZ07E z3=;zW46On-Oeq!>X|k&?KtuXu1a=(-U3#^NYdw*iuH2J_r%7>lRMg|^i$oy)$gjGi ze>$wIGAu|45`|E*5o`4SA4-y_FQy&h^h^Y78tM6pBpE$EKtBDpnx?J`Z4OOar%kc> zrp+6ZZBSEH0>d)%wlvPD9v+A{_z5{jjSZH}L@hr?GxjE5shGQ>5>vCFEceiBQ(AA& z8P?V`{lY_e(IQOEMRnsI|Eyx>Y&^$(=s&4iOiK&!ftZ%Ll3KP3yGX!ZzK!yKV;U$X#ogsOo@fX969^E66{;Db_^!IM%V!-MfCm;Qy}!gEFN zV3R()}cMY2wYjVhi2&<67lLI|UE<7I&?pq>n7QlV~^Qi3> z7T%YdhiXL&4hGPbXIXE~h)e@gy{{=1TH6JHxLL99Cp&aChHX8UMX{>N3k zjkjUemi3xEzt+^7Pz!89?XVp&fFYr^n_wryFsTFqz0J%@Wu<$K*5NX;({n7=*bOHa z?9h`72>FkReT(0aR}>qXaX>y0q&`p&SXg->20(>zq)~D3Mv#?mKy~~-bJwAf?nVN# z)HZT-NDd7le1Pslk29q5Rjww$8o=O{!|Qe$eh6qd=asw3x+U~gGhl!EN!$aG%O!N* z<;(c}D*6chj(Hz*$tKNC(Hx#AmybQoqI4libVQRV%EW(Q%IBbXg!|g`DvSg29U}4L zI$-ug%?tz*T?B$~Zt@K^90+(8vq`@m_D_HzsNzBb+e`C}ov;jMati)<&GJVwrkyNX z`ve}AV{+DZ*XrtoLhPr*=p(8ek24dj)Lb-8yHIBa%H(gt)u+?ojpU$usPaX8q{y`}R}~KQMp16K?gOk5;_cT4NfD#%3~?=h1sq6wf6eY|}he5q{^q?)p}xc!?7Omb{DDi4yEIAoGBT z>!$OJx{2F+MrRUav4eyg{iT>2o z`t_=Mk;eXX@(O5&Ln}On;_ClV-;p@t&+k)bkDO9Bwsx2r9NVIes+{cF?>)HrzWZi2 zOda*(y<4BAo{}p^OfE03SOrJM^W&xE_WHJUv&S?#vu0N`?A-)p&q-l4N9@Qk_4r@*q6Jyr z1zT1wSg>*n)tW6x1;xeT>{bxDbgnXT?&3Kjb|aC9eDR!o4toN)caC(2{_3xT5u=sQ z8?XP~i+}KX%sq}!Hu;9Vyi{vXwQ8zOKhJ&d@%P*BKmYy5x!?Qz^xva?Qxc1nJVGvi zkCsMDb4V{4FT+1CMoUYhXg0YfyyOPDYv8qsmr7z~W%`TZS@K-+W^(;IdGRBpM;*kM z68tFnZ_#M!W&8jh!kv2ZVO#M9zE&0~PfW(W10^Lf6iB@&$>GlDNjAd@%^&su9RRj z@C11&AI%QW8(4y6fiWes^Q{?|v7{tW0`FtWg6vMZWbg|x^`BC#ERt`4l~AKrVOuN% z6l=cC{JlK7m4_RsdnmM&f^4w^6q}_y!IejYNdF)DVWj_3KPga%ja&zZg4s$eZVQ%i zF(Vl7bQqPFpk}E}p8L{L3!`5iUcaO~OI3_3Y8y2^xgDZW!Y_4Wp5GQ zgpu=QmChjbsUB+=&upG+1F)uinX}@!5JzHF@fQcU@iUr4?;52S+{fx?~BYD`l`B=rM>Xu#eW>;2Y3ciNNTa78` z1v#KW8(}Y=hkfS&URek&#Tl7-9IxxI2l-?C$NW{EUIVwoeeg1*$=7l)*?9_+rz#-w z2W+M4gKunXC*vop9*y+Nm&zK6BIQU)t?Z#AHmVP*E-I!6!U<5b`WSTiqK_Ah>ReGh z{+8tre6zIU?KRcWGn;A`c1&qTU7XjI`MZfFu|<34&;9zs!_SS0Chu=vSliM>=>7rb zgd$9L0qb@%0t_o)+pSn&5nl3FXh23-1|x~{W%BtlVhrWk^mIg0aQf<8=t(a0qDs%U zWo^FO337Gw=39RH@)OvIO}>rkGaA#!1A<^Un52aXJ@%$IDEw(X0i zty(?l<`*Amt>5v#?0pG%TgAEP`R6Q>j&|!vvb;&MY|D$}Me-)cwiG8`vWINWrfiPa zEXGM}X8{rt$Ib#-2y4O;D5aDo5GPGjvzD5|EnJpTC~aw=EiK%(DTVg+Qi$a{Gv~;5 z0)5|m_r34+-S?8Qo&U_tnKSdxzs|aO*7E9#j^3NP56#}wP*k>OT45P77OiUv=4KQ$ z?a$2Y+g?*%P`-X~Me&iw)@8AV&U9~Wm&Z%EiSiourdY$eU#Hx+pu#z1$TwU8H0hyhxi>RA`BJBxdC@ zd9mYIH^&=zf5-I3bu;sFV#y~V(HXoWchdIv)~-JCmzA9_b=H)k+gCPCj~3;}-jjR! z>6@1>{`Adbk5w0A!*|>0N8Bo|iq0F)irVON@t&V*TwAk8aMO&qP z63Q__mH=$nWCy$5;|%K)Txxxii#d-@Q!f>F2vzX1RHBlJuCK=qYd$I|u10J?J`*sV zZg@aXzxwXn+uz>Xe9!vOoZEhCSb2C=;pXdC9$8hig{yk!r6aLtHkNgqSbJ#XnT?mK z7an`DtMBFox8T2rF{uzS^%_@(aUPCH0?!lSGXzKiq@i0l`SXxACtuZ&&OiBxD{L$&Yd)RBDRaI2U++?p*!+jNHu3`dlX_gUpOXyS+&APl`lDr$3jSTRPLv ziyE?1HB4&k!xb)b4pnQivZMMw?c@ zX~D{4n-;iE=k+}B&P~^y?kX`E%cV3)V{FRm>^nAd$>GchBNuRKySIW>PqXDbzeTi^OM%!v25Y~uBBO*&awMB?%bJWj~wlSldB%+u9f8-C-ZFd5H+pLHhI8!n$_-TmTN{r)*LvxFe(0yc#>ttvD^GLb{YBkG zB4WwvpwT~K-ExYausAc~Wwcrm5aI=a<+wDBC}}ie9u@@}qSQH!TTrtic72)f$T0q) zDi}-L0a{twwSfXk59Ca5tZnIlzQqIS=%&mMFMgOg(w+I+i@)QCPJQ{nsZ-nv`Fuwq zg`UIFADJ$Sj9R6ppB2?=8+LFsB7;pd1Zj*Y;XDkdLn?t4ST>F0C63SG_wy)`T%M)L zQjv?Y1Rk-#aB(J0z$Vi$Wl@C$6+92*nV9bn@JgklLGnOvuOLPq5JDs;F7o!jjof< zZw4&NfIK%Oxk2rQ>B*3o4EycSVTS`Y*kOYX8460}}aABATb!wCc3NDgs4GM@N z#q^hW(WF4}^)CP5A6c~Oj!S!s$4lm&^AR7nRmq{&MEsYr!KZ%xYnZz4!v~iYE$XTL z!8?1W-F3~L55BpAeLXOLlDlTpiKV}L^2y4s2b!B#Klcu5f&HKUCHmN3ZoBr?!CT8? z@BYZ0zT(?|c)D=gp>HhRaQgbGFTNN%7yb5)GxN!oHF=k54_D1dOfGX%WLa+(^d$Bt zqQ=D5M6}lkULzdTflmiyMo62iJ*Z`KM9_-KB3cAsNl5URCCSVXv1wi@bxO!2fh75? zE)ym&izFtPg$$=bmE=TPst~az7{gpNcs<=bJdu0H|78k_bHm9S&pe=LLq)c6tm*h8 zGjCi`k~6Jo^9_+7HfNrF|68#_OK{QD>AP2#d%_EgD%Z>oWhERR3~hX%W6kN?w=VQQ z_pL8~4kz>58Y`m5Uu+9E)n*14tlzSUL8BkW+EA9f_lcPj$v_+yohp?_U?c%}fe8uw zu`5Cr+^PhQMDiX$oA35(7Q5^_@Q;x7TB#@doe5`fpLhFKRSewTe+;4X9!m4+s)~uvGv7 zIF==w{gBqj#JzKnq)pc+JZ;;yZDZO!t?BM*+qP{?+qQe!wr$(CU9Ii8pZETDH@<(~ zjo65digV?;PMti+U*#25QJE*pK-r855vke`LlSPsKxIs^@!2CivaJ!cEF|CMD6w%r zyicFTAjYy~yps655$9{BMkH~imCIu*3t<^uM6qe0bD7{yujNkje$DF!pspuI5s$>0 zngEMNiP0`_p!-3!DT}IP7nqe z>%ja>g4QkoUke0+KNS+C+QTt@(xw{P1-A6eB0&$-(IJC|`+EGRXhciO0y)cvqs~~e`q8_V&|cpAAYncAV(0e# zdNet^>SeJ}-NnkHgKXklx-#P+tHuB-_GYbyW7Us~J(J3aUEKJR&Mynul+N#6mQv12 zN_0)(u{h_1Dn<{e49pTr4azheJ8hv_5YEZ`Cj@+vuzQN0^v?PDtsv*fm4ZdXNyd=T z!W>eHe-5*dsFR-1@ed3L3&X6+o}@%A&C2A&o@P$*{*@hW{H(5GCugP3U*4~)FJ5Ee zl`RhsnPsx&RT7of+_!H|S~YhKZRyl=Wf)*b=NdRa5Eza^;J@lxauqw*@^q0m+h4Kq z*=%-{+wc8Oth3>A9^&X)>pTs=QmJgS8Yvh+`&!2P$WUTxK1}r7Ob|YwKi@}X+)7gS z2$4(D%onO|4{-Qt!=6AUET`auteyheVl2TP(3fB!6au==d9++OiI?ahC#u(ib3^*T%S}`c_Il4rCALtR>9BzcXM9b=gt}aRchj+ z)A8~Q*n>*Wp6$@h=7L|9I2gePH1)^I;`ygjnxP|WCj>UsxHPjp3xH3WhD#Hp5xRWb zZx}VdhqzXGq*slTei#Os;kw8`@nZ+fT^sFum>MoxnF;sKQ7A-vz6SEPXStO$@cVIox>640@ifiY@O zboEZd{k6UE=QJd4apJjI<4_Jgd%shpCAf~Uq_(xfkE||InnwrAqwzsHiyk@>jUPpK}wKUJ{ffM^yO?>m>P_VRWa5K#CsiQeg zuU)tMeXL}Jbov{+=;@ShTo!@6@8ihwMz}cp`Idav;g(=9sRoO9)|$AEbvWrsa%)b1 z+zj_wTwCm>^tT>Jia!)qm?*Yb%ql;_6=SOP&whz34E$-82d9(X#J4)vNSkspTBwAz zT1_{3Tm*d^82KYrWfFMGi^^H8(+Mm^mC~vJ zJ42Bxl;h-%1%#L3V^i6!+7##^!=CkZ<;LAa<76FAaiizaU4Dg2z4UD6g5fXv%2U_f z*41{kGvfF*-yH^#4 zB)EfPO~4-bGmo#C9J`YyWkne7Mj0$9DKlwo@oC`)xiQK6x*M;amKgZ)Uf+JJ?sshA zyXuJ#H|Y*#glnoSEY5AXykE>5Jjrf2RhH>l7$9vV258tqHwli>hVSe76_7Q_r`9i1 z0d+9@o#xJ=mVE2=g>%dn18GM`IZwamy#u_%g{H7Q19=# zp*_zxa|if`tqOgXu-9{o1kakg(pp=u4)0J=vU%-uoCWh6+%0n$Fl0uQ-ZTMOJPO=! zOOL26yQC|f1u9V3#U|^CuRu#ROp_y9aL5O;10`(};4`x@E6ky2qK8w!;8>pELuquv zE?%Cjl+vRpKP1r-9CnHnHp@y~!?YFM?EprdAv`8Isa=uDj1hbe>({0Ph02Mw= zhe!}h#uYBsIWEA_6fLdelowh2W6)_p=sHeQ<(a3FW(<_%H*F~;ktz-_8gP)MnoxCs zodwpQfJhfIC>wpsqvz#u_Hr9zAYWFfS2h@OO_N!JlycjKxy&rKW*+xUR5+lrq#-R+ zuwTJ85WCJ0npLpX(oz*E;l}G+TN;x~*r#E_bc5x!vF)MQwbNS6%*(s>xm$61#@W$q z^3tkMDXCvm%1g`GP>%=zykr8;l^XNdHzQ%iP(&I@PFWi_Y~BwvUPuhnpS|z{HeXa7 znT9y(Qs>~o+__vQK^95vqiiD<5gUIGJtw4Z$6EqY&zK0ElY>|A+-7%ND1p1>w;Qh7 z9YJAdMc5;Pvvo^tcK>E4t=$k zAg{-NQxFpR**W}?f(~eyE(4QH&lPP)x1IrURw=3Jfzf#J;yumz=n8;{4QbtjmXkV@qw%yMPr-zT=lPx|3HOM=tdey^)rYgrnhx9#n%KV%Ke zTo?Uat?aK*Dl6m+QjS7IDvKgd3^U?L!>3UCW~@^DRE?23yr0OTRpzidsDdeyuTsf` z8GqpDhlbSyVaD|0&J?yu(M?7?@wz!P zDrXF=6A>j$Pc5>l0_+^LE)mST z@i7X}S+TKn&WbTd@sN7UxXtvL8wQqn>*5q(Ofxg858lw;mt-zAR&Qc*ymCT2Wx}X! zE+cN!Y}q&%o`sgB&ygi%&5kRMeLJEG18Q{c4TCD>b+|(+574$hUN3*&1soi zCyIa6XFC?$9--!YE{O01jvn9Fpf|t{`5sGyD(^XgG5O;9{@YhrA*5e|H%rVwMg3(ZkFiOMo32$tUJ3r43?GhU4(2QP(_9(AXCG$yRNO2<%2=Bj9Y zdf(iVX+t0d{cDoaJ;&>qrNHM-qus4R*|* zectG`5ru=?Bo?S-$sB=Njqn7fUSpoaL#|)z%^%QZ>|1ANMN~|X$|?Q*^K54_h#M(I zWRpcO&Dv{NCr+fFxIDKVt|t|CCkuG+>|DsH889JdzB3R5@(l8E!YcY#by^*se=HmnPK2PJIcr`~ zTU{F`y|U0Hg{78JA6jQ8zdq+v_kZxo8Jh`ml+u}rF zEr_2K9QgBq!I7k7n9bn^BN3TTecyviEGrC{yPd5(EQfH8wn8tYO|p%)+JAL-y2Tw= zY%~k__;sBarxCxvQQbFN8jZ3{Y}cer;KzSwPK7l`Njb!X$BFTLE?F~TMe8w47CKF_ z@z3=X@4UxNWXiC3l8rUW!PTSZH^vGFN!8t*`csKYRb~H9+fBuSnWh61!;%8|MYy?|TYj8fW00Ga?4V@@|2;OI>wUamE;TWOf#JXue zHElqd@s{3hhf8x$`Y=)A2^JoAS^bCP4=7^zHDFC+1uNtq_Lc*yTr4al8BDT`&*m4) z=Jv}0>X8LsJ57K+fYfs!Vv-{)!{JSZw*|SYMsy)ho#M2Mm#!9s!W$tpnz^G#vhsF7 zwT$DwPjQB3%n(mU;voI-7}3=4Nx8s`y8w3^9};mk?**mthixPqG%(UMG)i;>b@#z& z`~zBx>zh?)(`Sb&-0MJc#mfxAQ;@M;Gh{v$B$r-o7vL)XqZa$|tvsyne!`yIhkBf> z#9-}*knvucW2wFDMKyo6niyxFb$M{1WSAY&GA-p>8| z_OCp#7%=9sNRqG!mf3h?v%ZnHJ51x&VY>%MTG(T?d&A4qISzr}3*Nqm1DhW+XSQo= zBwYbb`rh^53I~(=0!X?B=4~N;E}!N*m$6f&rS&q^5&aE~Bm3+HLwFR4*1UbSXXnCx zQ66D8SFH2HuN|9b4g*bLg9c|4;tamB%GUe!(@?FzIzB<^ntkUPl|6ZWB5`SgZRpo_ zy&xJPQ>O<08GYkpH4fD!B(5)hXY8(UHl_zM$cq(eSzzEy7fbwAO&Sqn{*6Az24 z^&A=UxdK?s_sZTbdyMGBvvtj14eNdS`%1vEW|7l^TTu8!=012=okZ0KkF#f}?x|#7 z9UX@x$R)>SWnHgi@1Z_+8Mf1A_yM8-Vi~7Bj%<;uz4@mcgZk|DR9v4r)Z$F>?A>~u zUiJ*JP1fjz29V@eSOA%9$2W1i7L>F2C=Iua##^t@U1jqrVqN6pGFCpQWKRUT7ZBCl zgmY|~7w>zL#l9|~uCJBSqKX%mybp-7Y;*Gn+e1IhXH`%8j?viDeG+${4C>R0!VF5= zZ2!a(k%COTAyeS z@KG~G|0w_S^Ifw;(u)JGYWTZi>5GIVhQK1bg-`j}tkx{UbeFy<6Koo5kxshCc-Ift zW#mMK0-Qphrpo$-6^9EsvS8$X(Pj@(=cZ^omu^Rx3?#TzI0oB|FP zjvU1fCmOsfSxqeLhKGimiELzN@-`lgWNiW=Q!NZfo$ISU`pqu{!5j<-Zc1)b2Yg2; zLqZ2W#IR981fS91K1rWNo;&8v*pU zmWnMwTLthdHUGTtw(&OpfFu_%T^MFNz!R@54UjQ%KLCu(D5=h5^5g2%I@}{zGKjh*sFymC*vajCxb?B6g(L0jRw2a^u9l&KNd4GH7 z9XNq4GBzv*L6@r#o!MzJ+tPj{5gq7(9i|i{v{8-EJ!7Dz^k?T+3tq?HW&s;y6tsWW zLyP<@1CD==rYa}DDUAc(d;Y~1G%{|Aou1dt{9&Xz*abWGoUDiS$xOSa6KwQ0Rvo4m zf2yGSUxEj4DkqMh0VpdBih8Z^J+eYNb^G9wS#-Q8jsw2GX~wzm1i^7?XFin!J47UK zNa)$?6%$Dy%Gh{v3^8DOYaKgRI>tw%!1;oOL}MLbd!E!pf=99CIj!eW=EJn zPz|Z%b~oed@CU`4eYinO-!92>I`z6JQg|*&j;U337i1`*PUalkQ!!GR&;&V{y>)z< zw8^c`PIA!pljN%RSwOk2%JTJj2y`x`sF&g(>arH{-U#%b8F)QdiwK8e40>(?6^2P+ zFT(m12tP4o-`%1cXFpWOW&snh>ScUs!yamy!+qg2Vy?r7z+gcbYS?{hVoX0#WcldA zI=bxfS(?po$Hl&$`&w8ye!rW-RevA(+;(#{-d||bXXLVHui3mVt7*(L7q~+Xs}nxQ z9_cm2ru-^I9-3QTQ_MUlepZd0Y)dzJ*1M$@*(E$`s=r9(R=iitjw_|mW{1ZS-SB%m zH?z^;U7%bJW*{iMv}ek~7W%iA43nK3&VfC5Vp8j|N~@hYiWP&Kd5_W4t_#OZigkts z-9QG+(9o*^b|p%WERUBB$-o6Ez?)@aX56xSi!?=B>a#Tgd*H6s^vxJo_}b+{6(OoA zpunc5!F0&RdQde*+F_I~tVy4(0wveC;Xb@z^33#1{X=oy!DupUtn-Iy3EG|k-+L6y zo-T|`>`iv$mUZ#P32vYMq|ue!cvq;t0t6rFD@POR~Z&dD^V( zi#7iT&!)3~9Wi--!XExRH9?HC%U-Ldlm=B(Q_!Ld%taR&>QLpU>Cvh;PRr;sXJfMJ zTKz!~#QcvVKj(O6nIuuAF=hYB)%fN4n!e=~N1c+vtUXuucq|r{&6p1`$eA$^;F+W` z6l8_mAoQ7_B&pbEkX4Sb{)@;loGM7~Etkno^Bn^BJ!!VyvJh-!BfEfO+ zB{OnUvx?yIh~n}-{uITtAF!2c_%)ElgQ7%zN8+WVOqFInEulg@%YJ7(7~-tZ!9yda zv;f~=QnX$Nd&4%$v?P}8z`4*_c$8i)1=_Ea=SiB>JYc?;D6f`23%@%;XoU*dPTm5 zd&Zw{j-Ujde52w$xvM&`AfaMQ<_GXSrP(1>&@@<`Iyzf{*bavhqF=*5$%8JiKT&de}L!9R1M< zet$C)l3AE*-$>P-E3PnGl;)8?6plah>Q?}duNfDGT%bG11zj(~Q#RW$&?>n6wfCFh zu0iC*R@j4ghZc&Q+t7^sZ_NvB6nTW?}I=n11-KZ=LymHN< zlHe6=V|qPt@hTmCxeGgjKL%U$Pn-jNJqbdRo;PImX3C-j?!&gQg6`K5HqA~e&*M{$(!omN!p&CPYVEr;6Y z`JzP9UDPb?OpuAvaXWsz(sCz8ILo4tMSG?%k%gPviA7P;uK+3^?;&MXY8a+Kx?|*B<%z?@Y#d*!1HrU+VliY33MOpW*AW) zYLa6LE~n*0Vvbls_3b9Ez`VEM0+T}dkOIH{e;)Gsy++7qZ$LGeOJNWjhZk9C3h=@r zzm<=bpxW1ybI-aL$uSP1i1$8^9u`d68JT|wFx&|9g7gPfDX2Lc5$51WoY{7CtQ{#k zEg*Rs^1}%iI~7V$-FSSp6Tz-5bz<|;8ibPcc74AU=Kah`+q#rBWGrY{=DY3ln!$(7 zX>$F^DL;iEI(CJS-z_6uvsYBJ^`tdpw*nCH+*OR$Ooc=nab<<}T;>byb<|o99o(Jf zLpLCdL0)8~o0YgXI4PP%&B~7O?V?(rM#*0uGAGa=y|gA4W9Gk~Lp^sNif{-v4g=#P zn+ye#WIUPNOetXrBe7YRlld+mSVx{Y0@_`jPeeOr<_wzay^Ju3AEa62g$h2Tzo4V2 zJz)hAQdh6^UC?!qnP`33PZ7w`v-eD1Om`t9;TL{flL3K3$1x==@lv|zl+sV4XI)uP z`R1rOB>&}jL-Gr(QC-$>N@N<|#kCP4T}aPh@2QZ(oCVTb)i`w(~(bl zEPAlz+w!;=@(3;1$dvR;skD=uZD<8C>7+=^A-jFyfIVT?ex-wM1mAILyNnuTN5@<@ zlSsB(QYGkvkf7K8*lc(+ZVc-pc#c_q4S3J~(m0uReI;`uzxYsE)&af!7m!vda6{JM z?;|lN=;a;;KQ;r&of5ix;V`o#=B;fBbu1Fl|NKG5Csvv@El~TNujl9*9GL*V#~H{R zhvkX{&3tCB_&7(~U1S%r{p2azUPj%&q3tMj2mm`JD1 z5IjiAFNq}m%RaW9dS(jP_qM`1T-Kwm&4jDb)UiKmu5+_wh0Si{RM&F^)g#inqhk$i zc}KP45^iP_RrxH~wSDGKYOlBcPz?{>jI)S=NAXHE(~_xDdRv2-g_LGri!zQ?sh>3H zoV7-b;KUz2m(Z2Qi(hA$>Py%YVo$+T>^K|fH|wB^Qs=6&P4XL7>QT!pPR^@%IJ*|Q zYv%RrcoH>D7s@Vp3QQE|XPBX~8|Lh42@Nn8c#Bo5n=L!6ji*}jHXIi05JA?)_17;YR^rpR`nW&VhtOo+?Z+AvnR4qmu%dP zRJ6r2M1t&@?8_(_oHNGcoJ+N682;+xuAmyG?Q1o~t@D;;P}+Fh8C$%sI3?6wV6!~) zbmRLf@U90`dsoHfB`hy5Lk@RHUGI^1X9HKLKFXe@&*nGIHz6!X{3Tm{nLZr?pYA>% z4Ch570S=JmnZA#_6Z(sT5s@l@(Ac1NCXa%Dajw=8^y-WiTvt+lJIHN z3dMh@pkJ$B^J_Qr*6iyZ_D3P1X?oMc9NTAZ$F@_NT|Gf`T4wq2qZ^T zVTFHE9luh)R{$|UKC!*Wip*pWPVp&wVy5M}<3bcIhaLD)rCDQVWfU^Rn9DeHf;5c< ziARv_F)#ZJP}1^s+{5KJ-@nb?<>;uo1Ko#9G5CKR&Nd19v^^8$|J02Rx~b3m%v^w z2iDUBm99BPMv$vj?XZBv(X$*I9nV!tP0z#KI;BdOZ1npYPme7fZqRSg|$ozBY8IHL3SBOefNTnhm> zXd`Pw2SPPQ{@p8)@BeU2Y+ue<*#C|@69?B{=|5xr_m=Z(puSvb z5o!_suNZRuPYnMC_?NzL`w}w#h3)J5e;KlWEdPc5uZRBt@fW0jK=?}T{}8Y*3;#{9 zzBK>l_8&O@Cn*06z_}<|AILC-!T4}wYBhUOKAzx zKvans&imY1?{9u&qSWAA``ueh=d-K`zX|==9?v6ORvPvk)Bm)ZJhoYf!@4Uk{F%44 zlxzLg7$RIjOQfoX@g8`s!RltRLe7a3#m8FuN1X;TThO^ezbU$0Q0ZxIAzavSWY4V)I)alVxnuVf$rB(C-%$Pk1~=zmz$nu*N`x zWQ-gKr*Aa2<0!R+Ome1v)Hai3qF-eWd6tHq;nwT|QHaAJD-(tb(FF)3sJcILBw+RXCGN2)0)a|O7=G$@yv@uevt5x{Ouk;fR6FmT5wqr zFJ7^&NMkw3j%08khH58rI5f3MoOezlX{iua0yz`Mu2T1M3%WL^rQmOYI#pvr9{htRjJJWv)Vm1y|R<{4bn~9K# ziIJU|@qfpB-xJC;aiQT6FzA3B92odb(l^6a0uvb2e_U}G6x0x&6o`xn>aO4?gZTob z(DgUv!h<}@cwcB$SzvQPo9`Om%k!*)8h<4InFpfNF4hpeeZN}W`jD0757u4#e91oQ zlH9C&Y+u^+xM*0ymz5yOJA9rlwO=o|k4VZ_mL^v?B&;v6)H{j8P-JmNj^q_CAWPV& z9e=vtdAg*a=8-X^PiruI?ET=;C`5|<@GFtDee~BbnW+wa7r7fm^x8>Rlvn@o+AT6o zc)*%=fd|%iry%T_Mf!+xK&RK(G`OIV+3^W76-fsRAN!%=?XnN15Qc&HLZGVJ>M409 z$Re;SPTXOmH&Cl!RVM#qbkqLOM*gHXjHHj+ImRC1^eVQ=@MhLXS!LDt8CSMz|1gYf z&7A)u!Sqx+ujr)T>VehkeM||VG7X9C8OJ6s`Pt+ZBD0m5Ph-0A{M8G?L_FRFxE+a@ z@6*>kcrmi@+!Wxw_0%M)NGbMF@0u#Cj+_4@tVp{c7CKF`EHq-VL`Af`s6rW^Fra;q zM9c;?##Hgbg;gr@2HPA(QRPKkK$x$bq~0@a`$Ai*g)We1;dVw$u9 z?O1P4A@-Dm6xCz`Z7GNl6=oH8+ zfBVJZN9S4Xf=+m0sO-`C zeSX}ZFxO=u<#jnodhIPWy+QKoHh(}f5lDei=9kQJ`GZmKm-+_PW-((tFN?H49>mSc9@!qm*R2l0>p|+|F2FpcPEJkcH>7jh2z9t9Kdp6H zM&DG2g}G$J-uVPQ&P;;73U@5#Ro=-8*ll(Da11&Tp91_$NN?qU#dI~P{lLZ%PUVjH zkL*;6=HUca5n_$GL3S#@rk#@{C;MLHmBSMHE*=sZNhY}O&#->tg&N@FLUP3muFEH& zAfyQLFT;;RfCK0IO_rqptRmk>WA3Y^+6SrC!xbj*=OC(c#$gY?sXrQLS3_Tl zx4bNTK_1a0pTbB|yH>bJm~aR)8q5{yJc4QY;r$`t*3_K<cFhgjm%lYGZh z@%Na3d-C^!)$anOn1lFdC;e-AP)&O5Zn&Y52bdq zwbNN4uClI^RD3|$!bsX6zkszm%tpnoJPQ{U1!u@-mb&%%;=!>~=j8XQ=$UARP!cj5NEOg(0B5n?|`pKR~zc9+2-}Nb1oqLYMw95+K1#AMqm@e4h_q z0@Frm(8Q>&2 zH;xe9@kB8{jswAG7w3K=M=v5TMA3j$t*tu=|&6|o! z@@f!r3=>Px2sy_11UAaLXPQ?{F*$>t?^~n~Z*});mc8zq1ASDM2o_H)L$=%ZPS6_d zPyZr4?}}h+b+}Anp^xwim{t6G6Rvyi9HqSI$DcU)$X=W}^?c$@PL^m>1Xdh{wGk;@ zzWBx-yBMg`bCgRNa%YH*lfGFZ9Tter42L$@hnHT%*`yEbxtFhqlWrk3bbai=Qy6mO z18Ir9@Ps`eYg8pVuYrwbFZI~=yz8$p_kBN3WtZ*^E)vBUVWrOk(PdnG9~C|3uH=PL zn%&^|O15Mi9;gy>A9~lVzHdBi=~a4*r`J=a<#zo@zgJfu^X5z9w)kHE`OQ)a-X~zt zp&8)u%%M=jkNKi9N9+YoxA2F^!$!VjfLV0eSeN8lgMuDcbLybCPmfeR1p7I=M;(MxM-{B=vWW3mz-;Q_O@{ zP(uquHbkC4v4#C@uKm5P`?>L(d)UW2&%g?^NX;nKS#*wKg5tc;E0iIkZx_T{jjRv% zUf}fu@j9Egd6LqQ*Co8m>&D({iq3`{OYhF`cL{v_yj)l>%vliYt|v}7qZ9^`%LA!* z07_&|N~?J^qg+gnY%*ZNZvJ8eD&RzZ|=4F)qlq$ zyX?XaH|(YyCPZ6TD^O-7;li}hXvG`-F~30nll)wDUTS_e*OI61eYBBfttw}&Kh=-u znQGgsb6ctsXQx%^C5;_qMli47F7}Y8A>IkNl>++q9qv(#2lHBZ&@>G046a;DUiA!K z_{tju@Kt?Uu*+_dRlG?%&j3el?qlPFpiS%p#lk$e9~Pq$^)jccpEB5k?xV)k^5Ua- z>6WH^X6Nj_>(ph@4FXA+Dqv@%9-e94`Gm|_kmO_Ve4XITWerbY^{Q41w+kn^zs+c> z#sry?2z06awPw2`=tH{W;_7-kYbf`H{QWq8-Bu96G0EcCd7I`q!ui`G|n0k0aQwh~%HJ(8}nq93J$~aNa?;Yk_bIy^hJZ&7SkOqy6cv%^H0-CkrT^ zdGT41S&;!=Lho4FPBZN?1tSTdih`rf~tY^fLfAhmgZUZL7iu<9H+tTUV(siTa>nheur)*13=?>>y4 zf1laKC3(Yr0a+fLqk_OJT6_8h=J}DAiRQwlcS%|U!uFPo9VHL$GmfmrYaMU5S z&S5o;Ux)_jG4CM2XI}LCH4)fE>wxWs*~G^)DHV}>F2Txq4b;Eugf)1|p!dw_*6pr3 z$(w32_uOGz%o3;k1}JB}v#PqYaabMyYiGz*j(*?e&aH@m5AmP{YIN!htOIA*&=z;e z+LMDCz`j6*N?QP7*(7?`J8CM}uk6Xa$b8Ycq0kBO-uR(uH;U=UCfMMag;_1c1o=Yc^|gAhZ090+Wc%km7Z}fzoeU5Co9nHJ#!qn+-6-UGcX zH{{P{p8P)~E5E9iM*#)hFT4j&)%dB+eo~}f3ILt^RD=MXCsxox9rK1ibt~m$11+m) zpq$FP;MP}oiCxYcR6w)>E1tJ<+HBl8ZvfX$w!S-mgv$kV?%p;5e;6-OoEmRFXGg@RcYvCcUD$xh{ZCfB1nOd6Z;?^7r4*!8T0|zjv0XXG5E+|^j$nw2-Xje zn#wj1x*qV^(w4SR;(1?ov}$AFLB@&|Bwk0cniuwdks~of-45Ez&Z~bBn&u% zoZ03J73dfw7+4W6Q&gh`cGw2Pz8i&cOwPi3Asv`b_0r=5d4+TLcfgJscTBK{I1^|g zgtq;#qv&^`7%Qc|^{v*)i!CbrKzjB{fj5|HT%{xhdy$btcqZs>?Tk#qX_~Xz402q4 z^S_cdLtiW-bpVHByv&WA++5U@KoV1228(m&P)IGt>2-;h`^0I8Eb-TRB99c$esDO2 z-`MadA?tNnIieBz@Fn;<|JmQ<8iq%DXtTBO&bqr9$V-9#8H?sJBa0Z%!;yK?-~wMX zlMku7W7f<`1ZUOUJKQ;?T5+zwd}9J(W-6X)HrJEjC6`RGaJVPhe*h{n5N|8B-g??HQ`Ey@-k>_!qqVR+YbkwwA5Gk> z(;SFuI7$`9>GZHWj*Ke`-aKFx>f0KbR~(D`I9zgfrkGks#&u79f_O~TbZiVhd`l$>Z{8kD#-K^O%V|0?@r$jen11^ z-LmRiCAE{)=Mh${PChKIL}=CXBC~yYa^gBPD8aaPZrb6p7GC~T0Rs5)s!Db+`KPs` zYok>&V`kkUTi~jq_no*D6J&aSU;7Alo`SkLpJy0*R~fp|!Atg0X{#Fa;M~XI3%On6 zyQ}py@C5CwCEA=lFH(g!`E5~~p~VzK-)J)>93gY5hICK~0}fts z<^qk5%nYVLyk89h!swR-vY<6Scr(wvk*}OB*Uo5HXQVr8GRd5DhC*-ZWjflB*K3L-r_JTWX)KDtzfXE@ph=w>`XqW3vu~w#VXttv6KayzV+4_ytVLc zR|Yimi){I2k2dhhCIoa<`<=S>lW(bqTG#&Fhi$_Trda3~3$9zbRz zl4C)?fUoGb3-pB2RpI3-?Rm&nUZ4*!=aG0;SpGHYCWY;&Y7yJ_-nUGJm zpCBF{AbMMp8QT3^X2hp+u9rFO!)gh|72jk+@R-)Q3p|Aa9`w!qn5@9>dsMSyULiI) zI)HMT$|tV7{CoSJ z=-(tg7dZ8Dy*lfnD`@tQu>u=Nym|NKp5puJ@Suf0NVFHKRIlanIj8Qv*Yhm}W}c1Y zqNNPEbxXWldL(%Xfa9P#$Te-1Ixo5?@FWzhdX#YACk@=`Av+2mpC?jvnHj9aH4?6+ zcr0w)b)vVEs)o$p%xfQJ8ed7#@mGCtb(i>ArP!ZYgLz{ZwgXFh92vGq7Q! zzxf>IL3>(@9Ne^LJ$2b=VRhC4S2M!lLO2`Mb7*ox{y6f5$klOSbgZSd<2PTkcrue= zY)aNc;11&+Ws&EnutIoW(AJ@uyjNK{kf(K2O!8v4c_-{TBAirwv5dM=FV>7DOR5DcB1PG`INQejSZq-)aBf(xD9?D;F53xS zvQ9TsZyQ9H$_R}u0b@7~VAcn;n$LFq`$kF0@d5thT zA?ypV8*BIc4=huLeujj5yg<4@?@+PUuIT^(?roarG*|dY8N;_U#kk*mX!qle2{Qz4 z?!Vpnd()mR+y$>~xftcb$>fknix-!+PrRp1{F?Bz*AYDfzs|f$#*2z36{rMYu4C+M zd(U(g;FtJ-T;8 zn%*OEB72wzgB#W;H6AHDu;G-p7qjA=v!}~aCDaAq=Mc{bd%|*4Ps+L<7tg?1Ozk4} zqqv$zO$^#MKf&Y@#Q-h;#f;?sd&u>b1yF?%rVocD>NMIh-MchTsGDcS_KSDLbI3H* zj%z(rHNP!UA6`*Y?PKt(n$I_bg_aziptU(wuJU|U0XFb*136B>m=?qtGq|PiAyEf< zR0S(r`KRdCordYVgL{M?yPu3hoH91S^ba;PcRsX(A_a~dzMtUtpvZpC$XbS)f9^f} zCS^E&YTp&LgR6$5eQN(~>|n~LJvS(qiCpQn)|jdR+Bngr_)zCEn)vn(>Ufa2*{V5m zO%Q&&eBncz!J9_uc=>o zMpJUj%7eVSn8ry`+H9B~N0G83PBX~lBf8?Op5nj{d2dk7NE{5iLauw?@PoHFiJ1_d zrWw7u}_-QopKNRbs%|@BrpY^59$Q`s3)h8TwNU-=Nvl^r9*m5c12flHIH8}+ur7h z=@HbYPcYRefogfI8oW6IAOL@QS;$dQ5D#`nH^4l!cI-NK&)+)6c@x`Q=inC4>RUJ9 zyffrKU?LR0uzHOv<&4IL0N@?7JbIO~^&XJFZbp@Ij-5hEC%O&?Ilg)ix56JEEI+k3 zA$(pU`M5}2zO->~ea%o^5_q6>R*vzB_keqKisPQFd4-lp_nZig=ZL;%)Y~U)+t6FW zGq>IjjK@BjoGPKtt0v>4bIZIl>S)ZIpz!d_w8tko#^~_^i$v z*;oh$)^=(*rK1^Pjszr~ndLBmSxg`e6QcDyv&u{1R4dbVJBSC4nj@CI9vcRC<@WEX z#v6Zl^{o`+DJ9+3xO18cY45212LL`m!N0l(c4d|RIPB=BKo9lRI*wp7$i(Bk-n8o5UgCQflk1{|?>t z?s=fxNb8+55%=4{OU@>;kZ(N=bk+@iQ^4PmG>%zE^!e7~k&hF3?}t7qfbLldD))0H z!p(fxIC&Innl|*&*i(KrSExfhW0L0_EItEG|;imz7A#gGz`r1`Perx zk|BqTY6-7x+eQqvE_%j*-VItr`Q9#|NtEx|58Zg?QYy~Ch}uCn#_(Ny*qxy5??W5Z z+r{@AV<11KiB$$VlsqQvp}v$8d5+3FkBK|H7^G=oZljjQCiLfW=;Ye~XK#3l3XKbp znO)Rb8wuO_2{Dfb+k0c{Luc=(m(yVFE9f}8Jku#xkA>dPp(^bG8qd%*^gZJa?Bf9S zF_bkAa{dyn@Ki%)Z{qV7T4@s2g;MCo6M`51KItfJ2ptyxYoZo=LBm?s9i%_ft#LPmf~EsvryB^BIwRXIEv;LA!6G_QoJ_h8b%VW3A~8Iereb z98~(jLwls>vjKj$87IHv%9QQcIC*#3A9|vt_q&(2Yn_#OorzD~PzATI*Y_^PcOlCjJ3BVyX3=d~+cF zM~C_)+()6yzOcSE(LVit`Tsd)BJE6!;Rm#y|7Qd+SpZ|s&?_K|?+816rEbzn?J4wu zLG88QVhkVVy8?M`wUpxJopF`e3--pCer$cK9|2DCIhfT-KM7FX$9$&3_B@|sLBF1G=(`b*OlU zyp$G+ee5yuKVZ5!Zx6KILPs1jPon?%`z`V=-P23F)iK5SwzPM`-Wk~UBB4Jm(Dc(2Q_fbzn*%s?}(jJum z9{I)h*))l^_Sf2!Ht@lvwkMs~PVGxRxLP6g4K#!9psn;2{gU?6A*GkvPyMrYr}lF* z(-+~3^~L+z`BHu9z8v2Y->n_uQeNZ#!Gqi>$X6=zJxw)q@REFOd~HMdmf88N59Du| z^*+kLI9WTqf2vb{*jhLHhv2yrXEvXC?96|jS$XcsGyn1Vw?yymIy;0K{@0Nn1`ZlLWazL=%A%ay zyb&Wu<&Pe7{n&BiCrq3)xnRoF!lL47({H$OM#)uqZ}1aXb7|P-aL*o1kZRh0;F)LH z_576!JINn!+wT9>5|BA<<+7zW-?U`$qJ<0Q&zn1E_NvH@>zToG=eZ6o$Al%L1PEJM!Uv8T@ zIliD$;>!)@-7+VTTats~s+&Y+`?D(|yLY4N$R=<$fh*YBzoc4eJya16wRP^mYL&dr zz*I27pOYJm_vbJNK`kY>v^+R|LSb%BVsdg(_ijNYyUaf`NdBx~RGLUa*`k`DnH}_q zYJ79KHMGW8-R($VZEZBoEJ#Kpvo8AI-xK;Hkm(*ickjfswsITfjm^b7M(bHk`J}1D~k$)%1Tt}OfEGHpRL%ib-rlkeDc4ZOqWMfRh<51!6)4kg*wW{C0B-#gp?xXSO+tQ+e>FECC zWFFu(wV5;%o?zvKLfh}7nTa)&nVwb@R7*JKh!Yc6z%i9hOelMaACi1PD2ceBH#PJZ z72PT}ch10|(&{SF6?XjSN&e9jiVJ9R0G_6a~kn75RfR)BMT)!V0vddLT7T zo?Ma*mr7aHer5H9>P%(zq~gMZST204Cl}VJike-LRaD&(afJtcSSm!Q%Ap*{9v^#X zw1TdwQN1F4;=xR!N)fAz0O2pIRY-(+oiK&UYE?Td+O8;7RFnxDq^wrAV=|r8I>Nkm zSf!o1vrO$pOf<(FB9$#Vj`BDhwmtR9q^cu-D<%>_G$l@Q? zv|u894hhA?ay~V!u&EjtJqZ%Xk&*oqBg3M7oH3~QgERcgleu-lDgIlN5$F&4pskUp znntuO3Iu%k^`lqHrWD$r9Hn$?i;{|hl{1~RiESYh_1>n)D&%T^Th<|=+HQAhyBW2y zBj8jQEW2!N;6A8K<4^G?*stzOe!G6G(sreR>49R%V{)(^S1kE}w|UzlQ35#GC^%8X z;#3BkU>46MA1gViNq>H|IyOyEMbJRLKerqy7+7@sV6c*X}IiHS7DnRU{~}G zmzJ38PcA|dHAVC#It~+UCV!L#*lxU`Bn>^$A`lbs4G3Vu-w@6J{aLQXeAz7N^;Xy`ofMLNj%~Yj+@eg zYU}=pzappgZI`oYXsRpZ$XCemfGIwHwf?ksYN!ueu7PN zM%l>*+R1udX9xGlvT3JoHjPQisAL-1EaS-VR$41GvK1I#f=@;L4MiymCDB$bj)H)y znKC3(i`m~XHDk+RO(#WDHHFG4$vUDbHO*RN43AVT^*qH;lKOY`b2~=;e1G#68C!R;(D^$hnpK8FEYfWyEWzH0vFFMyYSZ^|typSo=dwzX2Hsg(EFp zI+9YPqjjQm#I(w&RexXeT^C4HDn=R-^}N;r`_|rChnkdL5WhAxgXbpIsvqq4r6p}0 z-cx;xf&iZ^yoH+IA|EgwC;^rLCS0fBIz^Sh1He`w2tdm484dW(sFlbV$@yp?)FJw~n3P0ORM6k5FAI7cv_0sn>d~6^Ni@6(;t6@8 z`8EJF9r1?x;{J{?N!IWd>S6R<5j&oIMk1U`lq3O7S!Jd^(&!13iVTwC1b6mTNw!KLhm#puP_3^PxTu>bpUG7|OI5&2GHDSTBa_Mbi*& zbXZ<97`=~;W}`&2QRlPKC%lUJTbL61Hw}rxIZ5J-ATM*8dQ~L97Yr;~faY@&Z#;?9 zaFTq2Nx%s@iE4Bb8###$*f6iaG!@ecOy6QkV3LqJ2N~a@=Qhj>F;!riifIL=Z!t+a zJKtiWWI>9>mvzQC(}gLMz)q0N8>sDwqh;GUD;zI?G`< z*kfQh^u6VW?=8eQ#7H;OE!=g}t*LTLW1tFevo+@T4jlz6zw1!w$3R=?>p+ZR^{c?K&|kta0UASp#xpM* z3cVZH5PG99X23JY^J9R;(XdW>BrqU!;EYbX5-;p*4Bf|zL!sq?5utej{lcu|g(-FT zO|yl@lTtG$rfo&mkn+#sH54wa4{ zUlxNoT5ox~JW(Dc_m_+0-g34alCxyL>@qkEs=;b78x(`VAQ=P$H4uX0kE%m(9g>r zYaXnwCO*%d6}}3`V0-y>!+s{4mdYbnKEA8!SwkDPj~qL(v2_3btfAEnMS4Av!1~CB zU-7M&Bk&KnFnrh%_>LFV6OXXL@Q>kR_<1&XSatQt7*y$WBn;mn9jeZEI-LPgn$wZ6 zA(*7wnWW3Z`;o32FObe?BzZbrp3$h&3Bc(N)^!^`>|nQUI*m6>>U5eqZ@4SXnLMP) z%hPE*_2i6BbH-E8X&MIWB!K{u1Oqw=WRieR5`avdr0NPuVTxo!C&>oACk9t&0!bRn zxipRC9MVMoub){%BN1pCR6S!d-^QAjJA4+VX$=qDImgE%^6l#DkNyS;HC!X@iF6P9Ij?G-7l~*;RdQ z=;#lCe%gelE(-8I38z|D69Nsq$KG z1@-h;6KFwLOzNsxLvZ9ciXLHHYE$Sa238y^>Z);obr6BNbQ>wQBN3APPWYJ9Y4MU& zEhUS^sWN#d-cpwqN#}k#d@>4I3trM4zaTStdI=B*tsv3eX#6HbdZc`kEFwEu zjR1++iGLvn+2k(dK_Hc+6;99ywmyq|2|ifHuEkcKNi-x*Ayt6XkU3;0ISQpPf@X`8 z6P1Zp;=w-d##VQbMsf&`7v25II^9%T%-iOBuc3QYDF_c(QE)Q{O zlh??nkO_q_3aV&Nx_~~#77+vX*bk4H}j% zeDXMXlKd7dIMOiG!Ts!tP$#Ss*NP8FU&SZJPsRTf|2|QaSW9k3 zeOQUyZzE6P$c~V=$oqJFLOuf#Okl+$4B0Rq?#1Iico3e3y|53Ov6r{uGx!>T?Vs=y zMcAei^BdT1w2!qx~=o9oUJl>{%r#~_;%fZENDT}gdwg9YS=8cnBBv+vj+AD_7VGxU1FEnm15F&7$OapN6RM;8fxcB z(n1b*ec%V@*h)5>wUEuUSjfOt(H~Ktr;?ehlA@;4y|A7xhi2MMyjvPX2f50 zK23MgOLP#cgpn|o%;mrC!9S8q*pEe2I7!-t<2bfIV#{|+X1I@jE15|nB>#QfYpkyj zVQ-QT*e4(hd&q}^0$ymR&$H2}1+NH$#fc=FJwaY#wXmGD(BXtAKN&Wm9^VA}(JzdH zBKUzNa6x<%YEc>cAF_(fqkkpsXvgcxqcBsLO*WHaSVq1izecO*Dc&LVlHBkHy-nCi zozP6Eu#dmz0^NX#F0vYG*iPwN`aW4g-Vzk@F?$iYe~Z4vDuoN;7?^_=u$-(VwTYGF z9&w`Z4$LMDsz{!24!zqlRwQI&xdOe)Wb|o=(7KPJ9~iz z2>~_eHni~x=*9j>nx%0xMrMmvK(9lH@Me4rnUwf7*^!t{?npdL`k+5pmso}^?j@g- zEo3jOiQh{W;_CE$wCx+k>*!nJb%{Q7BYmHarQ5HbUzBzp_{cYSyu_axi^s@D;V)z? zsYq-}{28^o2YT2Yx<6QnqP6Fr!?jxEITenM_eJf8@GLgpmqlTqY2 zc}^C|bUA`^+yL+3c<&{%=$OP}HYSfIO_06_t+w(93{-8e0PF&VR@)HRQC-~b64JeB(h+!fzlI;y^ zA`=fv`VK!OVvN45nG8`$F%A@>(m;U1wvIMZ(eXuv|6oABnvYj0krdOL%s5aSAVkRk zq+?M^!vOH6qL@}@?|BRZb>ylhTB)|HZP-McdY)8NRH_|cV36J<`?F)$%YL9^IPAj4eyypOXU;SyClA~jK6u$M3uzJ^BW>B}!l1bfuCBR&MC5yRymY`(!SwfQCuPA>+cUh@* zNw)Hc-}nf&i=u6@m-AiH7~Rtp-ZzIUYE7iQO>OHeFLG%n^OSs(x!Qq(wwD)TzD_KN zELTshEAa8c_HQ4YfSQ_Ge~Ty68DKPqL7izna&L5mY$jRa-jes*#Tv6;O zFN_oy7Zusl6`UxqGq<$ZnO&OgEM`0vyK`B#JDcS?vzas7nLT^LzSnPve+z{ZwoiaT z6CRy#;LVZXiT`23_Nw^l2}@w$$oOj+uzwrO+Xe^XV|m&Z-?lAY1^eSwv;z3gY>>MW zXQW*?&nArT{G>a2>y_0b1V!1H_3mB}B7Ji)vw}GU9uYIu?XAFNxvb93Fl>LlZj-^1poKI9i(hf|9m-?W%t;NE&-;$yKp&TI&y&HkW!Q|8xo=rV&%`=y<{lO1Bv@TGW zMVDkQ^3x^cUJu>qUFE0y+%I|Ps^G>j-KeYz&^N=UyVF+B@BH*==4ltbt^ZLEz0EtT zn9eGMs^ZE0>2<}ELbTE|)KB|nmWOD*zgw7+K7E3H3KWI-J)SIg*y9O@k1Bm!iqa>) zrwS!Kg9Dk#zcwp($~5Of=WZt}bZSoO{9D!*ANXQ)k`~Aq99$I6f~)}pdQRDG0n6@w zQ^GRHbIWQUOX*ZiJG%O|i|sX7U>)(It-YdsowXohMO~7u(REf{s8PM5+wFgRNUHSX zvJyEi@c8}i44*GcEpWR_)Ucwk{46bKWF;}yuNlEW%|{DwoUd{XiQtjhirR~qk;)2- z?dfl*GkFqfMECsClKy4+JlB;(g#Kk-N%nZ&eBg;&wKf$ z8AIQCa{H_C{{^{E#<9L*X4T(wdpx*g_|y^CPtVPT%J`v&Z{2+V%?A$5nDN-M9qT_F zyJ+*!)hA;s|MW=w;Kao}PApsd%PrTjHN)prjGQ`USkA~^9i^~i!nW(HPw>|X$s`1Z z?mCu5b^UP@k%4%g61Fl7TY1@we6sD2m6MLIyr=s$xoF<;n~%c}U_Jjq z$4_rpZ`^+Dm3Sx~CRcHkL_Bj3+C!yA1*ekRe{qwtivgC+WEY!ajU_HLt12Cjl^>dI zHoel;Y_aH-ziT!{q2q1V5W>%kjuhA2tNaJ&U^AvUcjgj%N%wp_ialPBTcsT<(HrGl z(|zg6;n$4hpM!tRI4V~{BOkh&{;8z62 zXyz|@%907FkH6I?6M-4L4vQ>HB7e_Mf6dQgHn{|u89ct1=GvY(AE-ET6>S9%L@-Le~d-fiOHD{^+RO>Nhs zlXe{>)g(%C%abMG@6d3|D{MukiqY^~TyXu%4z-S+P*jetqqX*d{K|~!zeH|^K#b0% zwVl6Fr!%_YJrESGl%k)-#ln*JI9LUQ=*o`#1g*{0pt$Pk+y{VJ&6x&BzF`VW* z|A{YYIchgcO6&+>iH{py`nqM{^Bzrt-`({^eeR1eJ!|N zYg&qZVNBPqCM}Q0Z#B!49v@@nCX8j$Ht6PPy>DxLVutwlf4MLc9*>c*T|9waAq(RA znuI1_M9K^bqAO^zcrjrAO7{S~qGfOwV6+o6KSMlbGv;P~jufK#w_?_cBi6^9T-{vV z(nV}Z;w^oFzC^E_*D_2di8rb8Gek9;dCt#uHhHB@?IuB5N7tLy+upE>M%m<}!<{#} zZ^*dTKh8PXJvn2Hf1W(gG{ZUHJuhRL{~mgmbf;;lZJqR(yj^|6_W^xRde8KsEwhuQ zA!_0xF%vURPZjYd{(&}RO4WZL7GeQSvsZcRj9PYXNniA2Mio~uLlnFzO=wJfl_We| zW!xIFo6Y7JXw6l2tI3qCpqs!-QDOG%oP7*eDpNqVS?Yz@Bt0M{QJ zI)?3-^J-14UQLMtYHCSM1HHCE8$GdE3TLPRblHtGZ2C>&9PwasV6tHvz(0Vgy1Lqb z(BeY;Zk}(k2$?#N3t|$;xtgmEj?f+lx@H}>ohnCTyNU=cOXKIA-F;`{;-PcT?s@l~ zhmP!9wrt_q@YrE^GXChd7hn#|J%8I;)bUSn$@LTJ zm;zR=VNFWs$kP=iEiIC+C`nm#3PsDVVtl1IPgp^>&>aThMFEUN5-Br^V5V?J(WR^K zc_N@MffDC*1jEWVnq61dfUd4qU0qRHS_W6fw8rV$muVI?T$_r#Eh}$Jgs`ZIRLn3P zg($2cNmo&uoDuzlUy{236&xn``V@nzbexR~RSHH)6GbDKja=3h7$oUI6G}Wg*DgtN zDY~y>`cw0ev*RB9tZ=b#@8D&jmqwhKierePb;~HZAnkr-zd$qERg2H*l*U`QLD}tk z<-BH8RjdVFVvrlEmlFho{Aw^@#VbKGA7L;?k0DQr*BcJ0c1pt`9<{y887gcggR9UB;5hF1Jo9t^g-r9Sro&De zR8)f`oe5;R0)b3JAQL^MAv3@%K{ZC7Z5m|bz&s(Q=cAV{|166BPz%W_wEook|zb6;z-{X*XO5ZaJtMX$@c8MY#XftrNi%S9vvU z_H@{g4#<-zmNHq*=vM=3mKs#0-y|*&84cBdr4duwUI$c@8mL)>R?DZ>;+JI$4I(r* z&!=XWMYmp8%6fUwjUweZ?at0GLxoC5)*Kv@Ycq@%C0UR!mr-xtGdsWCyW`&bpMWFI zAO3Xq(l4I>-P4nU2M!F0&Ny-3sn2hn_p2v1I^TN#n*$T~AAffJ^nR#`Rf#VI4{Blr zE_Fc(Q-)9D^Xm%`;3g9>;}__et5|GiTToGYx`P2B*fSvZwB%aMz6=aC!zwqzu$<4e zgp=nNavzU?jt6m+S5zS6x8q>iPphXLt{`id5hWw>RnMHp_MV87GP#(3td zb6qn%ODy-e)><~YHu#^j=>PObkOBJxt_b|)-DAKXcUYjb*=%+TzN7S6l0oNaM&wRJ z_AHL8^up0aFC1N9z)?3fydX@&K5j?hdikoGPmQylfh!~FjI zt$lnk7|@t;7LLLI36Ja&z*lnnT;>t$6wA<;6F;9HzS1+PSxFay4gv^U~dC z=G{8;{;lz^-urC=R{3_UYq)>e9@kU!?&UM?U%fiq^7`z?nNy!A2)?rUMEsv$@SVC$ z^nfa^(G+5#0j_z+i8=AFq}ZFQEK&+U#59sf>58!vThbLVjV)5TV(dhlbVW9#hz;qA zoJMDZp_3*BO@?$uOjo3I#h9+7a7-(!a!fSOG4C|*GrwULZ)7)G9ub%WT^2D*OcoUr zlMxLqmNQInF(xnzp=Jv%TaM9V7&ubctttF>X3b`DMiFB4*2AKxXj!2WB@J^*GN#fi z=k?%9i9wlWk+q!M61hIRRNiW%+(u0nR|%mi4O0yC@n(JxR@x5nduWR_2Ag!%`#X<4 zILck*m=IOJP<4<~FGep#?d9c=+O-mrTZ9OE`Xg!!hOdrt#EEw`Q*k-V=~K>xtgNX1 zfEN`JX*8EvGnJd`N0*zm{BmlfOEBx;b77Q=empF5mE6d=Gl=Z5{K_A@Ha-Tl_WR zs;oyO&a{p=(iNvUHQSDK#c57WsRJuVxS=PV;1L2SRSOp*1guKX?G89N$eL_|5DZwX zKx7|=AbJR`S9FKT;g35!Zpb){j#KF5xQ{Dw=rC>5^O2eNWNpma?tI>P()^zJL%+f3 z^jUjlGNxgo{IVVeMFxer7z)a;xg`&4y- zxZ8825A$seJB~vsvB5T^9MEWO`8i(}y4sgr<;`mNDi8ga zE`u8MG&TIW#X3VlL`1bBT>-P%*jMapI*K^Sbic+uTWt-0Z6F5RJoZPhfH}{4<&B?c-(XSD=OXjmWcpjT6&os<+%nUC!ED5YJtPQ+p zc-Lc>!+Z|ACtZLvK9>h`eqPJgFL1U-TPQN-hqF`lM+%6TX(oYV7ir16N`LaY=uci3 z{mH9Sb^TF+sOYM2Y!?pmm|NZ28-3J(reNCWf@wD#M6Y>FZzl-lnx(=!)w{sE!Yg>y z6ah*@cdOPauZK6~^>CiOG1{#u(z$d>Vr5r-Yfl2F4wxvgPUSkn1F+`q;oNX`EUjJo zZaKQFYJUrWs91XFI%To=T{*f=xh#HBhfKeCMW>3A+5~cbcYW0)$s8RWJp9VdA$GNl zVY&~2@_BDI4e5hlsG{T+_7>8xc_ zynSSU+YxsE|Jxw^>%gXMaYy{8*oOz;8+iQ*!pK;(nhdlWFUci+>FFzW(`+XGU;&3Q zT;I^~1qF`mpd|JPIxImB`1&Tr#Y6fYMa0JUFuCd2(hCw^(J$J3EWN?W(p0R|1d7MYh= zmUfGt2df2VGse5a`*V9;|1B||TaMHYWPmma!h?Yuc_HrzUU{lM$D zj$OI;!2K(pXa1g#&E5UMC%bQbv}f;A>yIZe%s;W^w=izb>Qz%`tXq9KQMq;0uj}vM zzn7%;`?zHVNiRC-%AUeuQwY&L&yLuBNmok_@;WZ~_(n+&u9rT$u9$Xxzr^md_l}r) z1o<<7QC4QPy2xk%eGzC;?b3MQp+*j0d~<1^iqsV89=AvrIO;4nB9-IUN3V76Gjw6% zO1Px;(&Ht&Zj1k=*Q@*bx2_7icBG9Mn0cc|%l)NiLhh|>zUTJL*||$Imj^dxJ`mjL z*_U}d^Bd0>;Y(rXHJ+zD2Rv+G&zTbK5gcWm%Hyg4?*z_{PNHEm?>01~dl%ggb_D_V6r9w5M|yOROv|Abr+%& z0F&X=U|L$zog*KX1Qp+5*LN24A^p$~Rej+B&$8)bmyhlb{g2&#=rYKsx3u58^t-2D z{D8js+~T_%_bpq#2ga&P@3?WrUl*EvRrA2`*H1v*8ULU7KjL4;n_haAl{|jv)DxQ! z{!qV<5CUt3eEof%{VdJI-%FyRBr%QZ>=qTaqB6DWPghI94d7nL-n<-V zl&;(hJDcMFpR{j*kD|K&opa{>+}YXpZg#Vq>~0JK z_^7WMpD1EM{Y!lnv096@D3B0h=wFdPw@RtCx2+E8uBTI;Zg|j zJOST;5WdV(VG)D`s|I$+D)^wW$NXy{A1RB#jOEK&l4;{O2uL*yl4@8T&XWUN2}2L2 zxqlq}8h+3hY#w-Q^EdIV6Ru-W)Co|C4>8XG#UP%sCcr#nEuL}D#c8^QqryU*1+2}p z!+FH9mbRmqY2VBx48%< zD(vr&7pS0~w`3MszzDo4d{YEo6kZg8mn#c3I9Hje!LiyT4Msu&&ro`m+fAu8UJ#>j zOIl^3BGFPVmA6z>#9I=H785-8k)ptyBirKq@BE;tEJtIq)6ot=jQ$cZ+MZNjEyDE-7>iPj*GWgEN=V*XLd zUE`j48l04vlAJR2%-l@vh8oSE zssU-SHkz&(6CRtLn92n^qVp2Dn%vZm+@j#3)Z&_J!#6}%ChrX15nda;H?cY$()4zX zqR+=*Tyj;_%k46hdH*hW7B!KY4tI4=Y^J4h9K1J!cxHJ9X8J%IRRwqT)SZ=d@qq7z zx0^1#{X10B*yKvq>&sD4)d!xXB5-4O>$ut^dc8Qt+xs`W5 zSJ?9Ur-hr}d=otQ55R$o=Im(rvhdTtzgM`Y@a4prm)rne0p^$B-jxe~)${h`Szfi^ zzisBYn^v5)dZD@EGV`hF^Dce+)+a#grg{0t1{SV$MXFA32kN??fQskeDJ=Q)ABBz2 zZvEcUKisnNqlf;PJ*G6oaAIN{Z7fvNpQ(dGF6hCjHyG2n)5N7GrV$Zt632uZq zoa!Kv5Q%D7vaQqW^(Dfk;sX6{dcD4n{ROvMKc>q9+W~U0UB6V`s(-G0u70kGjKZjl zM$3}OGK`{X0>|?Tq6JRj0Y%|vQx_@c#d*bxo`N)u&-w5RvO z_)Z@354zquVEN$?dZ51`Qk`%}KYA1?L`xW{60veeaS7h(q0HE|AM9FI>wEWVd-twp ztvxb+)3?g!Pv07wG1tOjbLVt3E?VIG29M#!S}WdIxg!4!iP7RuWShYC(xXgenIKRA zIekF^(CXkLg*K#;m7oDs(zvsd#;qnaZ1~@B&b!YIJoe;4@b^ciRFpNaeJ7@XpBE;< zxnRSK*WGt7@~In;m-qz9vYTYD-n04>kbs#rxH``;Qz~s4&%Ar!NX<>2MwHo0|t)6g1`y*lX67#I4>4UZf0uOb%*Dyoa^ej zR9Y#+*Ht8ZH3bW^g0H27N1)GmO1?^R(owNEK|XQ2^85vfV+dhaolkTVskI2sszXbp z_MFd*pC2sNmGdnFIPHE8Ic~FRKi1DsnGrqE_~O=G98%#bppgYez^Oq;wu?qBLN7a( z83v%N(jg^)sFj_8CE+PaQdy|rcIx6+s48>;ED^<6X!P1d}wW93)|Q6;-U+lX{h>n=aOv;M$zZF{fpbC zUR85)6R(WBe9C#(6dg@X3Ir_)yi*&d8s`?x1Q1tVtTQj2WXq2wys@=6^@$xg(oOiY_7rKZ&q(Bi*Oraw&M%2@;X;d2b z*N4jk&Y%aJK@Zr2F69F0xB!q{CWmTHAd(`4Vi(W18p<+xGJt3-5n(4GE$D-u!hIZ> z3|JX4CHz%?E?rlcNH0CQdl@4t9z<+krqI?{S^bq33!}YR9QC)8uYfCm`w^J6?SuUz zH$Cv9!r$)SRrqAh&oMgOh;X>#LK}%!O~8*9&=GbV3-yS@0@Y8s2np! z1m&beEE1IvCDKV0Bxi_H5f2eAkLnIvb;+)?=vKgsluG~BO7%}islIfSD)tRZWgq5; zY0{|riPxKB=?E`y0xK{A!-az3Amn5T*#HSa7{Ax=@zY#{4kUn~p-oUIO8~#*PEe$; zx)%MAu4+pEW>vGbEZ`6L4WAbx9ZMxf+ok#{q*)umSI^D;UdPp|&bi_K*Y7NB1KIn3 zJZf^=50;&?rSL1Z&lf%WqQV<{e^MwsyKwZDv7;t`^336X*2ZwG_9G-Xcy^>r9kn`H zIW{H;JWtUK9x_Rc$&|oj8TaZ&BR`X#7MJ2Gl)@?_!lI9Ns-i_>CjJM;OceixRa3^# zv$en;f;Pvn<=c)QI>nOV;ENTA)nZvdi4H57Q>>Q7PG7=){D?{RZ=^H*Z_;!yd$%$Kxb(Wpu!?I?xP z7tb4JRNM6Y7d9t#!b%KzikW#lr^U!x?GafV*&rRC#8gJg!eyZ{np4tx%9k!r3n?aD znF^}W1m$;m66nQVPn<_b6>KU2%4DSMUN_pr#6*Hh(r7~_R3N3t*_R>^!|IP>^PRMr zOeQo^2HCL;01an^NAFz5iH66c1&B%4=wW>pZqgNo?fRIMdzfYS2l&$A#qX9Rd?>WE-`L3fcJmz*mq#-&%nS3D_6Y; zE_nMbu&R4W?|;=V?`)fK$GLYuvA6JL=fWo7Ml$j=vi23&c7Q1s!c&nX_&vTxhK`BS zCh0d4lvoI50a?Xiq9Bxrg5Ze4j+_wZc@Fm=5HN;Bz?2CfBlSxTR~dZ-lmP@C45u6#y_8if zhe;!%_|lWsc#xOcbWaZ3I*6MayT+YPnjE_t8m;}vdTU=@W9=(b);=1u_Q9~#6j`h4 zjd6B8`vQyf9pROA)Fx^x#ne$I)lR)n9ivzyj!v$pXx3^r!DAD&$Luf8nEllmvoB2D z3gXC^{fK$1qr_QHoIhuKCyLba9V=G03=~5k+=W7*Q!)POLdFr=9nP5hFYm$84B~Us z;K%er9KnDPv48p^xP-eJUc=q3-tFc@V)eRZZ1j3TxSNT&L~)piizOm14vDy!mZWc? z3tc%OE#q1SzJ1wg{g5rUKnM%x;xi^GW6Sxt2gE(5r`@x_!+1cNB3*KpkNwn<=Rexc zWV+GguuW_V-Q*fEH4q)eS2{{p}K z;;ENa@9B8uwpU&Un}VBfnz-tF^k@B{-d|q!9`>myGGx!gHUrKie2vi+O<6%~u9C)Z zW2G~t+4NoX0h+&7I!GTx&~W0BS&$zk_~YibkT5 zj^ho2<6TPDz-PPAv0(2RypNLo?k>ZR&%b9*459y-N}Vo4nXvtDXg$*sbht_5+q-rwRC+T+f3z z3i-G4G~WyF>iU-!3b`gZ{-1_?pACVd%{ZNq8N#Cj`4vZTJpwzH7Hoc6TJQte7MxSS zeWYj~ByCr`ptlGuVEWeJ`O~*XhB62^NPl}=hgI3b2gkY;H)icIGk^$A*W8VQuIY^; zrX(Gyv^_ttBQvB}xK+z7Rv;da2xS@ksEA~dQoq;ZN2EW?;USQXtWe?2GNw0+hh#?z zk-lt6ZlVKU8LU{D&rmpt5kZ&aIEF?;L98b;%z8H1^Tx0ag9Jc-ynDkQ_%`4N9)Y(F zQUhNcLx!{l9vFDO|6zFe(*k43B2!CdaXoG2+yO+Mi=_lyH|d2x*}=o2Ri&N5ql=i1 z{?-`xi&J6??wewZ!+8tRV)#bU4t%v#&hZXDbXUJcHtKVNP#>l!&V}wkr!8+F)XJ7Y zhlm)~X@*RT<>UlSbrU#+EGZ&b-2YvTDaF7~vo3`eDF6jg)+j-QlFShsq}vAQL=Q1Q zI)$4C?K}U{x%2++Ve>g~pF`{J-TH5Svl~|*GPa0N&isyYo)~YAY-zG($d)Br0ZV%& zrXWGZ2y|iirwwHWC9>t6#G!y0TuypqS)jxvqtQh+EQ*4GhT<5+Ow!|suSN)RkzFuH z8I%rlrfS1)&KWLpSqgVeWRBMzCm|nFDeGqPC7#4mf{1ww1zmy{Mg-3=tF*Rjp?QL<-7zuJeEiAQbR-6(A?6X*wRK1xBXYl`X2 zIsZ*52zUsCZ&7gYEt1BZzEwfbRhJqnb@0n=nuMRUyGMWDlgMf#5~PE)rzxwAZX)E4 zk?5@5C7S72xgw9O2`)`jc)V0>&sn_q8g$u-PyB140TiJJ#x{Wjf@7c(xE}^dFt6Sp z8Uro_?5;xYg~A-R@8oCqpVj^t-G5>Vv;X86=7W>iB0P?KTse*#AtYK!2c5*b;N z=M32arb1BhlO`hMul;s6QKj2`#w9C5Zj z%YC6|Zs5XTE<8JOZ{QKAhhj8s#AMMo3~TyIgv94y&7Pbuji-mdR5CS{Aa!>ENx$(%7)jJ*d`k!@hOXRh(yUWT{1fjR|j$4j6}yxI@K_mayPqbDg^#R^Co_O_U8REHGz-x#a$oL+)Ai}zdHOsrBP%gv$f-ck$`={K2ILzj zjCAFUw6F^ek5%Q+assI&2)gYQkDCVOlMs%F0s0FERfprM!*R6;Qq=!6@pNh$E>wzD zhN=rItRb<7!^y*uU>Bz{wrL7UKxrCIKn1@!0W~@hgJ@h52{)pP$xK-DK-;nhI{sSN zSGXJ8`16hVvq#-gxQFf2j72?H>?#Zl{EP-`Z<&9)PsKUsIfLJ4|BCd-M^!_bjKD(| zrk_Z|P_W4de^<9CXTj}x`mxh3uGyGgT7DSm$wTU)Jp7>SFDVfK9-_*S1_GU#;X1Pqzjrf%_oU& z^P($8blYX?c7rt?vaVzy3EV?qO^Po`gkjZ3XUEz)@5Tn8DP6_pG%+?9!1fkGox7x7+1* zDWVa9iLhVd3_O#Q4T_>a5DvuxFAeT4soU(fGIN0dm8c+gE{G&i6Jo>Uc6c*zF(nd9 zYmalzOmWV!OeEbGB8fkaRA2M)(ZOuMl*&GU}Pv%`Mb92S!WL(-!tpV*&`Fv{{)`AbHh15c&bp(_MQ9M z^^d<5O(oB{rmzBxx?}A)nIE`@ZfLsx%uDeM?fHWrGk<1(N7d64NY9F!sw(M9O_$Kc zc^zoHbbACt4iQGggmUsawWQXsl+bbsT~|GSRUcN!S!F98KO>$N0 zE_#i8kGjTnpMGcZ_S6IF2G<5(%nqAJCelVE9Tw9yAWcyyRRd};?9?QQ?~K=!9~L$8zQXARd9V zfg>OMF2k_^MzQo{hXK=c{AxAgp->V>b}eAQ3SZ=XNDux!TCCExq(zn=Q)F1F9L<=L%IX2*ep zb2@Lh>*Nn#Eqwk6IG|s7-|RD1O`5!g@GVuSl%D_2Q2L9hv8Ib*EVGIcyMZQ{3 z?1ihk;#O_qrx0b<6e6s;Wy^`rG4Gy4 z@f@y-dBJ#V{id{Q4l_sCCoukAyFS*)j2EUb(}ZhX&#*^ayh1@YUI2j;y~7-)w?rYl zL!|+48afd@EJpNDx2vQdSP?zU$NeDgZ}-Cm{^kBoKkfgQQ9@5nB?VI_A0frL1u=j|dxF?b_kLI%ePoE!1BXBj6_P_{y6 z(kk8Hw&OKYT_A-9H?v^RC54l}|8?QS@;zs6x%sUgwy%HNyM_Lzz7Nz-=yUtGzr5q3 zJ!GvLN<=7Z3ZDH9ClU!}M>tcs9oN7h!ge{ruzJjiB25hoiA(D=pA}t>!%V0Z^*|i_ zwCME&hwjcvUR8a`zV2b?BuLslE6^dNu#+vqFSENjLDH%2A)+L)YZ|z|Pa;c+Vnu-k zkga?7b^YDf-3<+tm4(2QSCVxssHLjulvJnGD+`o+gnPvG%5LSDBFB|>1u{?;pgo~S z1d2@Z&aJJa`4GKZ62-W{dIf={kn%y+3n43_fAvXRq6Be~02V=k6z!_B?E>f&)(hwu z08@o#b@oCC*1;zrg!qg*&bG6#o?XDMXLqy5SeEUDcX!DPHe0F06?lad{0QpSnndBy z(O~P>)|Iq7AH75A!0nU^3E|(jiw3|u!He_T&YY|1TdUEl$Ih5bRvg9OK}Qk?c!K7s zv&M zX1nJYvxEA>!ox1;4&pMJPPR5uY0yD9l<_sPjmji;k}};llbxx|^IgJTqFnB~n!Q@N z(dS})I6H435bJ`3=dD)qEI>dBmcAIxuq@0+s1 z9PbswjrZnUpCHC57O!xN>@c8$tRTdEL9fpjG!#*c`3yuFZpGz_>u#^EyA4qhfify?I0*zk{q4DxWg`#&PvOd4 zh5c20z+2ddYhmU2~W^DDV`Eyn6)_sFhjsE!y2Q;GY&M- zEdr!-H$m2Ht3PAzHQfr3Gqp8Lm*rof`Ia;5r$mnHs)YuGP}USf*KM zmhlzO5@s@aVZJ<9n`tZoipJxSXk$0Dl)UjqsSqrKu{=b=7TnJTe+KsLHhBkz~N>&?8D7 zPuyC?n1-qvS7@)I(8#^eG=v^iRTN67^8p{yw76m_5ZSQ{cgCgl(r$^CdO`1w3vEx* zYf41B_q&} z%Y`+pMc7-qvovgP2XPNpezT|(ByyK=4Iz{TIBE|@vIcGqj$}R7j=^)sBUzy$lEq6{ zZ!g1jsoiFIS=NIhd>TDe%^zs-82-TNf`}-ZL6nT^5~msHnnqSuqKVT16-~6r5~d)g z6i)!1^90a2OhH5q*V0n8?Eovj9+*USssgSYLc3mp(*eaw{P-*#hX4UAz$r2ZP{;w~UKlb(NkS@v zaGur+gQlp6=b2Kc1d&qgFjZMr;uL+}xo{m(jvXdmx6$h)!AzM1NQxa4eQ1YCFxaDN zw!#o_j$@&tc#0_A9mcUx3tsQrZF#EIr)4q%LSHPInS!a+cs`1bHq*BTkQXT{nTaAO zqQdkc^GgpNw`K%eQ^RobOC+r!=z$dDy=@_!*XsC2p|zdOb|7;&-6buPQGhTcv1AP& z5{eB;ts9OX*#8%hXrFw>1)%K1ft~OQx~(wfrkhr+2QTz@4LpcrgBldwZpE?*&bKgH z37-G@!cN0%rpjd7O6;g3ri=ao_ab(M)q6WaSy({^DMRcZ8V*V#?WqVOlewV~Sjx|M=&OSd4O>e!Pd-T!fC_JxLXU@0z(cL4 zHc^nemWE#JrkrI|d%?3i;Sn^9_A07me#ZZM5mlBfqFR`JKiF(7ql*4_RbeUUCR`wv z(hM+chUat|W)LjqSQODc&(J9zH$j>b;l$6x$L5mWuW!740LkqGjk6Y+;f8J>B*rwj zE5{^2cVX4RgW$fx(ucSzbpL~YDlBEz6#k5Etj6wyYQ?MEQXyvIgpvu*gu8fJI959v z4RJa1Y+>nbw;|?C8$804G2fx8sV2IDTw{c&inSp%Tw9~o)@IeQzNScX?bO=5nyrerI~A$)yh8QEA^|4yQvY0gaiR(w0pGn;P zDdUfwBp*2GWXF=daGt4EnRu1Kc)C9QLYmFudKAu^rh5n9vWQ(y{MeOCkIIrhkXU77 zeRg*iZpwme0I%$YFCGw_KBGV?SW)LJW>@Egq;-~AHQl+ox{4-d62$#icH-l_g;j zwdS_!ZB;IKtM(_oD!m4a3ze@QM!q_xprn)*OE1P`P!3Co7Wrfy>Etd={e(9A3Ao|X{VqM>(gfac}>$7 zUetZsjU;<{H(tl2cFCkFXdBk?Er?T%8m^6-!f{=hO&L0q$)#J;XQY>B)@S%hq0VS$ z^4#dT$sVysyU^%~UYuMaF4L|yu8m%s9L#*6?v3qD{CDWf*q4b>4GfjN;I011+g2Q8}%BOt_UW?h3b`1zsD%%s)JKLAc5I zE@=65jk4Yqn4t%dZ0Zpgs6}D<6etm1a7W}6I{dIV)}GeHmgY)2Vp7$)Iwl+opbnk% z%)pAxmu>8IM*jB7%S-9jx!+&){LgP#^*pz8`0o#PKltYLBVUcY|1#aR+ z?83Ta*60D|Al4g6`cl^xi;W)gt$W#TVV8Wu@Cnl=$Sn%SLtFLR4P+4UIg473^%-lY z6(OEx6{JT5kz8v5uC)NDK!QoGwE(Mr*Sl{(YRr7Cr5I`#nKHR0Cddo*RIo0}FDe2;}VW53x#f&-CGax*RNKgvD zyW%jZ8(HBuV`0&0_6*@4$hBdHomT?MCY`S~)(|!u2ad%Kp$(!}5la1jfzDUJ((}+I z{G=KT4(Z%n@zo1^NB(EUXZQZ{c{sin() z`-k^`LoA-Dm~%gNd)(;|NXj)b&1!kARXa=L+QMz=@6Z>>=ZEK{uc8-mS4fwK7p4a@ z?{e>jK1}Qn?GJwy`y#O)Bw{p^DI|#)oslFmRTxj#Xyc=k=r(NzJw=-uK0Ey#xu{*G z?dSgzJ&F$NCWa(z1B}>JXu9i*2mjxCKk+T+07M2Cl)`FB2;R#D8JYo5D)|OvSZN225 z9Tu!BZLtK7>LaPTT(+%f*9d-n0I8E9oOf#RRbjXAu`nvIg!{S$MyP}(42FSF=`L;H zNHETXByeP+vUOHKPLfCnWTHx<5ngngU$DIF9P*M>2S5lIhRbXsawT;0tA&m(^xVBTScV zW+``_bcG^D+=(l2&4--x3008>%uf3Q?r8W(l0Dg;lsGv(**-5hIX&B6kT^emseMiI z()4P6b>s+rByLhsWN5M2tSCtzGSRfL-rQi)rpcz#vOw*me?iu&uf+x(xYZ_>IX?_x zIYwH%5BxCtIHNbMn!GuDg} z9@CbYlsUnqLyRf2Ay2%?DG+b6;5YVPa&b>n!D?yh=?#cDx5hOrR6*htRRO3d&s@B- z@vkp_Hu4n;|JQp+N8cQfx7>C4{lk0d+3G39d)GXNim@jLPzKv5Dykp(Xyj`%yK(2$ z=!bWodG*u8R}En{?8AO?3|;Kjx`riWB$^Tv5>8@y;wS1)wdXW3snu(n5`zgg0b$N$ zrnN%U7}ZG2C_)#)A(r7O`LQqxkA~cvwY?Z}*fKbRFA!p07r%mC36^5$hY%E?_n&-9 zD-@y^(wWxv6iPTm1SK2|iy$xNRS)s591%)XqZjr1n^*W1_6ol~2fGT|SYVdJj?tq4 zElWKaPrQtFQdQIuBvXE9taQ&wkPLg=ASezN4)(ZFG6LM+VYyAhVbkIzffun?V@h_4 zvUnqf3aHSqb}cGk5waq+m6D?&Qc`fzz%quH4XE9cy}4K|&2INWbz2L8tHQDaD=MO= zA_Sm%%VUp)l6R~+cR}iu=JU_my_@;*{k=c+a$t52^x zw{CsohDKpx)x>dKjZ>AWRa3@YP<6q$#lq!PmycW6*w?tX?m*RFtG}wVVo^S_gWfz) zpAHFN>6lq+0@yiyz|h#$rEhgiE}b^yDY>*NML*Z8AaRZm?CT*9i*d*;rRc?m z5w?c#B8@T>6-skp$>S@o<^ZW5Uv)kbst4H-a=lX5tj976OAyR*F@i1uerBDEyGZm_ ztj%xj3}TI5xlw68bLFk~#C5c4)1MAq`_A`XzWM1Z{c+r~^`c4{oV6p1BTW1^*6VTMDLk>-T3BCBKU88yIFs&CskbwxEVIV}@g zMR}ru%p;L7iUklO;M_?`vY!MobeJ^+aUY4)yMVJuKuO^Fk!{eG zHWNyGVyzQfH$@Lc>E+Q4(M{3OC>y22J`;s~MhW};70$bjH6}j2LnIiP#fxSi#X>Q@ z7sEg5#6X&{exG`vz2>Ov7*aHdFB;s@nUQI;;z1j`x8OIa_ZAM1!3@z!I@>9MmfhZV`S@Cg zG6oqYCMUea%{PI7S()YnH0#p?MOyLwbf4gTLcm1nONRsARhi}jG#jYfV7^_zsWDl`4#b(((_!-N(aRz!W zTVgd9SdEp*DX^e4Szl?gemxyaq7pJ;J9egcJj1PkIlP3e3c(S)Ju8A~$g%%Y+gX|8 z3GyfmJacFN5#UkGQuhoD46tA9-hC{>)*jnS(W6g{%tn)dUu<-@%P*xKU7t`(rEWf< z2Ww--R?Db9p_TUW7cJuxs!wR1d6_S=T%J3XZQ<_bxR}Us0?X1Y7ow1+&`elmElv>v z_oN!`iNXtM%UF+XpjZs+0WB}f>lKtyx|D8(AzijkJGlp5*DZvF6bO1Ml@PyD$!$ud1dUuSZBEsB@-ClHa{l*LfuHQvf)V(jBo{TGpAO3t^;-rco=JatcYh zkfPibe_RQBYO^KaRqsg4EJF$2s)Bc~kUQap6zvf(#=8ebuFg%&v`-vpnf&nC>}T)1 z^Ytx{>SsU1E;zQ~weuEXafjDE^ACauz}RlLq+ZJDO5av<2aBZS&z8*j()bo{po^0( z@~#WW7y0=TV`%?}JHj)PkNM_yRmeUe`2^|1bf7C^E_0(y+k7?z$=yT!b{$Ff9vZ-p zHU}?2F~=e2PW%ebvK-5|OVcnr@F&R^$~Q7M$a|Sjc;RUtRr9q%UhLpck-D^QZ5}(1 zzfhPb-OAp?Ju1Dy|0nxCKg53~{15-N7_nuUV;Ghua0HTwpGcyZcR>gkmd(4s1TtRc zEUD0AIZ_s-D3r|ZK!zi6ETlzpB6$|cLVU(_Tl3aqN2-iK;Ipx!dSHx7o+>S$65G=y z94$JJ5Vp0usBSE&3FyShppJk)DHn(XBn1hRV)X-YAPT}&R6^DMTs7^=AZG$&dL}d} zx9&Yc%B>F<4wecuu-hH$Ac-{Ahb@4?w3t)HP6oDK0#=(Lp^S7VLrZauG=ui^&T|LK zII`4O(IJTy6`cfcU`qvo9e8(379KWNd1GUs8@QM9$~gGZ!7WwLGP)&79zNP)0$2fl zfM+T^Y*zekViJWShq6CpkrA=*r`CVrkcJ(SXNky1=)dpx3q+IZ$7K0n>hpiv`o#<~~k1*?n|} zzYjWjZ1WjhhI@?rm}9%~<`BnZxaC|QH_Ea2lE^gU8cF1vz*vf4@8~fK4N`~56!)^l z^pCQ|R1vV4T;_CrKhbmi{F?C5QNK#uQ)bjmcC0cZ+65 z*#0c{9(N>5$HZ*46i;O(hN-Sh^AX}<35c&wCQNxx9<9%B$kTbOWcB=d3t240Eul-& zf{ZD|EyFM%07f4YHnC`kUV@IbAXjSnZL#GT<_^@;ANPY!-4d5TC?a4J$NIcCbw&!+I9wo!CTwSSOmUp!ZP;yGNb&Z9jP zf-;2+MT9g1Lb~DvAq_?Z74 zgc&8zhoR!GcZCZ>(?#UHNjg9SXll9|4%LQLD}`(=;yW0AgzTT1h>mQ^Nh~T6uSBpR zvTd0nNDN>4#4ZKTK~~y?WM*1)4y;sCXHCfYD zeT)mM2Ufmba$(a&y(SJGYaF~+1^iY8{8pvpw<;j-lpO2q!EeRSzxI-xvX}il z;x+**;2J9k|0px#M7}184;w!erY^i`P@gkZq6c2>f0zF&z=sb!-bE}GUb7W zrPHr}hOK>g>8NZf11J^(U> z%ouX6AXEb0umw4xPUEMGMSh-m6~9;%Tg^%Kq-a}wiaEoc5uFlWz%7u@H+$@!==t$$ zxND?E<~8;;(M9naQAFZ7?IPv^?gIHDbs2L7cZIx6m1AjEu&{&-kBPm70~w%jDfVU- z!!;?0v!#IDgwilv0rEUv>eNrE1L46zxZ{aD$Os??9la*sIzd2`U^AjuF#Ct_hw%@Sf2bS^ z4^{5Vj%K6PY{4u<+Sp0vRQ4QmzPVrdqGH5UES-s_Ntp&8P3sD!C&n;TBEV3I5<{hn ziJCn!GG#|zDEG;17T7B5c&%lhx>c%j+;27W{j(BWlUuSOlT~6s+u2GKYN1=o2}EBc zd6`5fQMB_E_3afHe&K}~D7-Mo6kZ%TzVHHy&9JV5!i&tb_Ba|-c~L67D3CcT6RXa@T{(2k;A8VFejC?7zEUyX3^7O(MT9(;M7@6fMM1>HR++N@7c5D zhL3NV|KND*=~b(L`OM1eH;*jlUit3q+4qk=^5n>|`_7#-e2jT&*K2RR_tu+##9T9d zWHGZ3bB#%*(XWAPmML_BZit^s&!BHo`L0M;Vn$+p<%UYGHPo8wsyr)nR%%XYPU`Z| z<*9|0eU@7bU7pQ)e6&2e;2Ekru#HuY?Jsyd%uOn;#MDgH_Hv&5&VZ)gLtS~!_j z1f373Sr#z%K@b{*6-T-+<7+0ik~b z3@He@N68&DToer6-5uH#jg^+qG{=u!cVb1W=7b#caTN_teNm_Z@dv?u0fPHN)OEDo zY+*&^@nL;0svijH`vLvKohR~#%N~dg1ADNF&TC2%*h3l19?0^F8YX(-`Y~DN#)gOI zzB2OFb$__+_1-6jtDawd{nHy)-SFhdVp=?PCK``~4I_6v{lL*PnP2VN_1k}c_x*n- zcFkQBMZbZ$!$L6Q)H$^&giIDyv#soz>>Tz=b|uS8mMDpm7P2IbVnn2XFrZ|qe!Ymq zTsDM4bnf^`_Q9+D&tu*t5AGk16)+rlknv+|RyXX;2VxB~?P;%lTiAQZ>^Z!GfFzS^ z+~LolrOe;2(*b*|X9em>Z6`)0wk4Gv%*22#8MGtaRGffy{#{R;zPRh6i%&n}j8iWT zSF*K__fDVmOx?7ug)4^NCD*WP^Z>INU&9G(C3xed^k&IdNRT*JJFtCyU0 zky)l|0(5nN&IRbI0G%xvk!y-0F2#sG*v8;lwNJj+L zEvSW1`KNw3{8J}Hc#%zyS29VItVuYbcxyBHcrzrY%!*2X1c4nubFNpfem(ttn2 z$a*sOC~+Y%1xR3Ciqmc6ajc?|``8a2CQkP1D6l*X&ZWS1M&aO!nSQBmq0mdJDFQC# zK~fHeAG;3rLY*#&!Vp9T@=!wRj=8qJQ+HBjH5YEIwM^R#nGB!PvMEZc7gC5j32!RH z_-U11ouYEpnktTyQ>ea9lKBFgqB3R$@d{jgZrFe`+E7@#b}bc<-6WIIQ+@%t&MAdZ zg;HBvG2R`JK3+*AlaUIr|03mLV2cz2A2%JnuC{JG-PSs>{RGSh{GY&NK^nGei*fHQ zYgV`AfAGem-IGsg`2L(*Uzu-hQmOz({8HI6sF&DRs8$~=eJj%d`-n`2Z~w6zEzK8y|FPFwvJl6jC)AF;vu)3WkiWMn*Br9F;@bx0r7pRAmmE zZz>uU#3|C0g~D>7PgpOo6m}mr2%CgKVUNHAJe`MAcNo@zKu{o{%F~V1c!Y;scNBP< zI3~o{B&h+iy*McZ(tEC0z=K0=1YBLiB ztSUw!81BuEvh5E|JA2UzC;tBfl`;oA0U_G;st;MIk-OZpUN#Rr^)=FnX zQ3CpO$Vu4Y)JSasWYIv>A)1fJNO&L#v4=j*jdGZ*9v|=RQppi>H8bgCI6q}g@L<|yYNFGYk%aa?Do06kR zHd#uul@fSfa;~4`@k@q-geWO1?UD9LtmGRGQps@eQus0??xDL5lJyX4kRVMi%}k65 z^m@7Q6N3t_5doFco&KaVEM}6dscVKtdeh0|4~92cHAQKn8rHgvqS%zf%x^)s zicz9GutAq!Qtj3W*40AJELMipX1dnAckz?mrZS*d*Up~(z^Ma29hiPiciZ*!L&N>w zJ9*mdIS<}LcO2V`xgbgEC@>eu^yMdXv;}}EsBZ_RprfTwe$W^f%azy!T_jj#9pgkw z7J0;%KqqPdV6>?a#GU}?iS2D1qHOG?6EBpmL|4*_#l_NU z>PB=UeUrFax=~(-*3ow}_X_uj-<5twJtBQyex7rz)hiSU@|e>Gu)Gm9~|oO#*&sYYgWft z9w_#{{^8j2pR_5>mV8ibohr_5PD%`*{_H4nRwyL7e}sTYlrW=>beV7(f0sX zk{;mgm@94W%a<`{l{k__bABBt(9yhHqc^~;-7O9obeafdIq+Pz7(}VqA40r=xm8o4Q&Y7N&C0ALdubI{4_jp1 z_%8GPUFN%h3-0AOf&0q#Q`88f26miGpJQEQJzz29kAs-cKEL2(pI_K~$dNKtt!BEy zP0KsmGc~O&uSy|4B_(W*rC45(6kW7UD#V0^w3t#V^cpHJG>8Sgm1+|viKpskG1GWQ zI8U6RoM}w6&ap2t&bOBei^Qw!oA{fBmEw#1PGg(>cm9}EuUPd|y;i5!8+CS5_!O$$ zzEQkee1v&eeFi;CKdU^gZl$*IJN4hO@ADr>2iOC~U+lyDQ7NqefT0RolXqJNUGo^C zyq;J|$-2SXlqCvcUNG`H30>&|qaih~?HGOEX(wt-!_uJv;!_$5hj>}BYUP4;0eil@ zz*=UlvA%1`mds*VL2ie8V~)pDX(}9UazV_@A@bifo$*h~2{VARB5;x{i;Aksre$FZ zVn#nl+1L>{+qqIU^z3gfLCgx4Z5KEp%yEK_?{i+$!z*js;M$t&H zS<$dmU4zrJu?;|GOcBv$8w4F!4j(Z!M24&MX$_w>ZEQ-FVn5bTM6JMfAp6)o8Qf8eeN zy4gv7*Le-oGd5-Bl$zbOteT}?9^Ho>%6)kK?-`&b7+D*$YI*Scj7_a`%GfL7=$_5O z1O%^F&6%;OB?!zSj_%tmWZgIIu>&3nMC6`r*yX|p#F}Q$7GVN8%ogetdZ&B%(h*A^ zj|D$&jqdB0vuu_k?|X$36_ZF%m+$J$QYwsB@mf`rGDS<~`{h?N8=@*|y7QDz;_BHPc5^A(R1VDzZ%TC!(ob z$@7ehr@~8ssA3o<0aP&z%`Bm*m@;qBhHSn;y&=(NzJ#aphK96!5K@IV0a8Wowvm0d zcAJ`$jZ1myHb=%L!*++C#rMI8(=#1C%iKoiy78qy+gbx5w4TGR6@iTibH91`;0fp{ z;|o3BG9k_G0H0zQ>i{w3HFt|21VB;g^jK{`k5_a6u!&O9q2^*84E`n0w^VhQ06!P$ zK)I?8$w`+cfy{%%9F)(1HR7mn`G|3ZZ|+#Ab%a`C#4u?m6*Ej7GSHnPkN)||@#)5V z{~t%bkM8?$@1&8>=z28r^|T3Rv>Y2zhyMeeGjF7a@Lbi%Z04_+=aTg65V6B|&9B%k z^}+ecPoFSYAJWY(t8CqWSMv$Aw0|j~bwaHnad7;vDzUYC99vh&VS`babi%NCg%3Hl zkyRWu>#=vDsgV3I8Q+ymnB)P%ouFb<{YDxYUv!;Ra>x z653b0VW=k7F4z`MghQdcEr;F=q)9D>_*H!~x z5huKZzQ9qsY{#ZAv0t@mdj~pWn}KrFl$1=~f@|hv)d_01%FI$n0c7Zm{w4!oA-ZcI zm0g2X3BH8GWJoXOelo-&ZXO;=m_t3i2a|F0AW)d|4wjdK7%WpGYr%sLnz2d8GB{qA z!7sU(wxb7#fQO+uAcDiAA8l*zkaO)FIu;XKBOR6p_&bmIp=1D#$NvEvy^z|RAX8!- zd0E0RWErj|*ywJKvCggLZwDwY&tAtS0roa;51-oDIX!08a>~dxzxl9`%M?Bt7+E&C zX2P0c>&R8lne{cPrA7r?Km6zoYuBuzmmd4w#xv&4A*-YwOXhd+D$&tjVU?g0XInUW z(cVG-UZic*>|*Bpha+JEon8r*l)rJ#!NfSaUTQKsP=|arno3U<&z8E)1?U3$0&%`H z%Up&or!N1%YDOp~ugEt&@}`z>Y(G~+BTik~O+fyBq7)_l zcQ6ySE+f942OQ!Ct4I>Wg>~VpU09ciEme_v`l;(L9O-5j4gcG9H!VS5Jj96nLpKgz ze2erG%q1Nov*|V5AE*ZEXOKZUZ<>MXZNqA%$wr7PdTZXsn`m8>8rRUEX7bq()?5~r zhMDXODcj0(iAkw^Ei;LGp`mV4?F$VJmrxHn=v8^rHM&tH;}dH%{p@2LDob(VV`gU0Pun6{!{i4$R( z6mMo^bkvT4H4!Uu`k%n~5c52PnWYHPn1WBRPwbD5meXg;gz7KpG;XTVk#;buj8Pxb z|LRe3BER9=HT3F1!u`b(_YcRee)G$dgztef(Y=p=<0Rp}KqsOVl7c10f&u_)r`M&| zc-2Oi)2UG(HN+1|@cK5rtKk4b^Z zz(U*rmqx91MqGEw0L&VUc@5@eZg-wE5+2Ua57ULSexFbJ$l}0;xH!D{4k5^Ov!}Mr zdHmm$h=2&agC3O`?pmgma>HV6XB5- zC82y2iH@E|@*g(ri`y6fu;UMg-^Tqm{tph}rS!8I*yj&q1hUeyk1$UwpHaV%_G;P( zX^MIwD?3;hToS}VVv3*iW#k6W;JJ~c%yd&`W_m_?T55pH%*xJT^0Ts2LiAV&1_F8H zoKxYj(-kS9XD7H&^6q4uybomtgZUGjpmnx5*E+u#)rKQUz|_jmHFbm z#qOc$px2sQCGGt>`T3yJ_Sz`%Mf8;@|m!@FV+9T%t zV9*)~Q1lEWJ8q3F3SvkOi4U`b|iG~21ike7=+@Pi2W z7PsFQ4S*kgL{5tMn_olo8?T86dV0hIm)?ZtUmp_Rd-e#VA3hA}KYvF2FVO;)-Rs7# zZAy#JE}Qpw`Q%*B=y8V@-`?KNn;_#2piarI&G-6s!=?;kk= zX@{SL;NkDTVA3-dl}y_t7;IUsht@shOAwF1>!S)hg$bnn-;To}P%oj-xsRamk@!a( zKPPy5T75R_w*-xUAZUC)^g+I6k>EUoe{s^)=?T((RwiV=h-afT;snl(=q7kT>uK?< z^?c=FJ^O?l3Nj^1+nshZjY->weuyaw*b|xWk?YMp>DtQXQ84*&-5{8XVqhBjBQV{< zkrXUWN;}wJOSOPBFg__1_NGEo;74c)rRF7}u$OFp3NpDVIZ2T3D@Z~=g`1!DJl9j; z*dr#QvkE*Ofi$BWVjJBFnotxsp=cb4e}fsLWiUF=opB=mEm|h6bX?qV?4!D~%Qhc# zE_1X`XnSDSqMEJ$0Z{sNp4AV0`o^Y<^VTj*teEiRfdh{=($%~f_)~nIAVi5QXo_TW z1#MtBk5?fXl0gzu;Z>1%Br_o}2biX>Y_Q0-&W3H;fV|22h}2p3>1u1gA<`<*_4Vnb ztV#B6gG?3WPmCk9i9~6(4A4s22ej`weP;KbGpF}VoL4`gs;-`U@6xg7FZDd%eQERJ z^=sPOH?CMh3_|o3v6~F2m#*C-^_&*X{4V1#u!B5a12A zg&1)R%8+WHg*+O?Op5c*Mj`xZ?Z1d*#A$2Bp2eSXA8B7fKIK-4@Uo2g0*~ijmw4GP@p8Px%dds6O&A0);ZOKajQAb?9V333f7ytS@yCq# zXZ+8McrU-#h&S*XjCc{h$cXEOdK11|xI4y6txCxt(=Uvadnz?ys)n!=gkSLVgDfB{ z#;6EDqb*Vqj{4P>V&a2ShN{~!CfFlP^-Bg;v&2toP+pfTNy^NqNkc6e%EkV^f&CBJ zImpS@R>E0{odoG7qe_i#EsGmuCtVt6;$^&_*fyct%2O^RrA<%I&trZ!P+-3$EF3y9 zP!>1q?pq~l*R5mz4ihD0?u%M0D}|i`RtwP2!!`aZ9-rqg^Y{_|D35FS1w0mb0yx46 zP!e7U1ud`^cGJm^ghghaTu)*`5zW3%aHV>*;})(6{gnJ#_!Lp56j3Nqx(BEx1lvzx zFh~pvRU<0Vn84k-h7R5 zOBQ=&EJ7keCDDM8h&cnRBMQ<+iLwD3`}SFQ4q4M|(XffulA>{ag|PtklHoo8j#xZM zv5+12==UcJWvYK(r&4~EY*r8tn?Wn-olar;sF9Sz*-uWzLc9+)u~ktP_SM9D`z%toIPMte`HFg};kw@Fn~M4$4-RxrKVEiJVrb^45b z7J9htgPK)?fgxg`N}P=<@jeu!94A*ffug(}K>cSQv(J9=3BAgEd=)<8-a>NJ7R{+m zV;eK%pBE6Yj2xYTq>}>kC-w|J9MSSTk-j_+$Ss(5#gwxUMD#{Q-$?7Qs3ohD4A zcX(3iCe_c*uqrEVx6(XtHyBpILA=e%@M^2g5PuHOK?#ubf?n+}(SYV0K7$l^ zPQ;`Kd%_StV0sCu0~$ZFB|g&_i^@u|NGFfEub31#QDT9drZ~zlpaH`qR+!68(C& zpfkF4k=ClQ$7%GP>OC)r(G{S5LW|mZk<-C)af`bKxjXm7;m%1#U&03 zRQG9)hdWnvqp%USXnf*pv1B} zuzGpd#@?WT0mTrSm^$`Ku*cyNHE$ z4!rO*P%Uabk1+lU0safA>DR|O2at2urMD z0VOy+Md=<-dJ!`zS2as7e&F~7~q&CS|JH~$D_ zhq67iB!+Xy>zASI>=3?-Zu{fu2YBP)x&248a&vN|li?EmPMkrv|DY%Dqb26S96BHRf$kbjGL6O{oTof@|bLo%)o`7!BHJ`*F(Cei3 zO`q68yj3@@zh~CWTI!6)s?r946i~?mCf%<{=b%7VvSm@Q z@1s5l_FbcmfZoZeC)Q!e$w;AYd1+=Vy)lHwOn5}>B^wAGG$qfOlWdA^;V;MQ7Qi~P z5!WpV&ze=RMB37O{|2psB64p9QlsG!2QQNcHmjjQy;P0W*vICxm<6SZlTBfOQJ%qb zPJ*06DA;?or$48*hu93ko=|OXVQp=H4*_U6&y@#sioe^;=$TRCdU#+(V`JCns~%nn zzZWeF9tIik;y;NM_zs~to0*0jXj&x6XU;ccoz4>A^(sR^qgIn{k(kwL6_7thL2lb^ zFqs%V<%tF{WNVjrLI)!Hq*kM+$)SVS`f|tzIXODA&(5lam^`Ge%x`p=UHm}bPK4zX z-|33)C=G_D6qlCnngAb&+mk0uTXbk{&Dxf6lVF&k$r~6|JTYQ}j*iFjx>{C^Ee#bA zj=f829wZ!#BcK@{(OUEYE`g5uDgy}!9Hg!h4bSmi{Np?(mJ`p|UL^I^(pn!kYEkeb zx_XyZxmF({B~t6YP_R$;QD2A%moAE+>mn`DN;>sA7b$~D>X6;Zka);2?_lQI<&}3$ zxqGenCKR_+7K`m$izn{hN<8RsACwl4THanh3Kqh?;*hwovvl}I!s{=IjE#iX0wOjY zMjQ&Tf((}K}#EcXI4#dTo0-jVMkdUAXq$=ph*qoD@nNA-iT!)GKP8`1mGQ`(f#z$bsx{d2MfRB%lOC<6f*|D^2 zlz6|mpg0%yc6M&0<5)CPsD&Mdj0Az@k@Wcns4>8N71XGpPJqeejq5Sy+PW-YvA7c3 zoLbPD913;31D#=_3oap8E5%eK6|IfFfJP!VX|Ow)&YdsD#(|YjW>Xw4Tz+!-(2|am zZOcwBD=O(Y(RTmdu7~#Q-NO#6yzlKz8!z8iS$W^(jho)SukuFmJFi`O=kn{Xy(6vN zA=RD1hKY9Zo>sge=KvG`i{|H(Db6sd$3aC*CkX@)d^<$y;&SU{G2a5uI5Dcb?cn?2 zcBVYP*7tnorZRfPa)g*K2<<88sYt^ZFRX~$9*4J^p~DRIdZ^aJHVrJ-z!(9_SxEM$ zq$IX&m%&ikN*NBwi1tw`Q{VK%!~SRe=lo2of4v`9`Dgp_2tTCw3;fs*hBl*d0`Y{6 zvSh!(;MX~<=LpaI_{HN$C9#fRnAm(o)U_1Ey;1HN=!axa6c24jwSzC0i|{gB%;e=} zVycCTnNW<;yoTXj%ojIiB~?GXqGiKqlfAH}_d+DbGG}3% z&*gMx`g~lQ)v7JdY$LWw+ZruQ(9&Scj5b)337MH`sL17TCTewAI!M$d>WpcQTmrI_ zMu$QZV^_3!=tF&UmKfn0;asiM^y#y$P>}i`R5R4x&bEOUIG6!Y`laO^#W>1I86Uo_ zJjhmJHvcu!Q0A@Ne5z^A&pO5`PsMjFk1VLlNUdyDfQ;md0BJtdQ}+qN6K4OQ(A zPMLn7WmsJuJgAP$TwYp#WW~rK3--^n-G5(d)uOUtO=Hs(^2cn2wWISV4^7&-!8Pl? zSy_3rJMU_HAcMBVY;h$!lnoJlYfxFluI81*ZIHjwuGy@?4aAw1vCS$dC!Lr;;C@0W zlN0cF1FOP>HzlM8?I{Tn8iTz#r2p*g(e>oyNNvEak9MOjy&Kq}uXgt@!pHW#DsJIK zuecI6|D4%%qYdBNzgLoZ11qpz;%RS=JdRhfV+7FC-PVTaYCRGBR*mBq|x6VBlmQ9P4+QtJ?6a+Hiz zNsc*0&5@2)av&ukO1Zcum^^;&aM|gC;s)57sTu4^KlQ}yZzat z+n<~HY!|-Le+IsuA&MV>iE8qVqv)B_DZ)c1A{Rhc z%kPSRAa&dgov`z4x9$t^OYy`0&ewPCdhz+)d!%`NCE{A8#GX=fm{t#D4EzAMXK{k6 z4Ru+;YL)qn1ii^^GK10PKn#;)c4#$84*5X$J_y-C{)DJ~`4gOxMI)3-L5^u20-xl> z81&rj{Ft40W?{Do_|0Ajh+o}!>YDYrz?)AU7vI`=@bQ(ae)%*6tD8ab{)Z4JUKBgT zHgWl>Gnzj_5Cr#&yZ2nYeE-g4=;lo{nV?6{y^Liv`Y|~kN>u0+?q%Y?n{LjKJ}E+o z<)t&s(sA|8&)GQXI8HjwA>XHP=g6_eI&ei7_j5XXQTm>0iBxh$8M2w_aV0q)aYx8; z{GaLZ-Q;_lbUiy7_`OX!KLJsF-hA^aw~%{}+@}n!jEvhc8di*krcqEIf$9h}41p;D zxF-cBr$CtlMkPXp4FWnq>CQM7oMli}rWxb(xm?418kaNVh>IIxclekQ4puHF#y2r_ zV$l7eWI{cCId{m$<@Wjf8fL&2qtiH~o{m@z16`foWO6V-YzPhMA!)X2(i?IMuW7A9 z%8ca)>O0PF7*)9GcZbeiNp(!z)iP`6+@ac+P1Ejwcjsg8ug~Y?2K!CqXT2(A47)4a@3OW$yLd?HeOLC1Z!|vG zGGW9p{E^CLvnjQOV{5VsXO8mb*6*E3I5_X-AGsF7K?m}qLy?7Bd{E~F-fQvV=47b0 z0dIq9E0kHmr(deyqGz_NVWkS11Zd_Vj{!de`51OPU=2|p4w&J9F%BSRy4i=EIwy8I z14(f-#j;kBq`(T~a1til-3~2dcX0AS)gUQrqOB#xKzgd$sHXc7_$h~dJ}E%2v{KYy zHoF`Qo$CiK`lwoixfW;Z!HbKZ=zqR;*3oYd?D_oh$={#nD^@t&8OMuU-xAf|_CZ0c0x+_KeO`WO;u+?o3mkAHl(B%q~pnMD0M?wJe1n1ZFn?M;c{3ehZMGe#rBXB`J5?;))Zwr z5?roWeN$8v;yqH0iCsWEjF0+qbkynlA-I3K{+2;H+_%1GE7GbrOljX=<0d2}Ol#d- zK5pCMX^DcrzGKI@d(UjDc$s`ZwSE6I_fL?SG`gi~89FaqQ zBx#2nR>&cb1+CgijR2(sIqj4xxkgYCNDoRO+RsSTfPSFO>1lv*cdV`IVP@v6-Bb!G z7haG%XRp{zq|jBxox5>*>$%1B{*8?DyVCb_rbLJw{@%?@rE;Kp@HHB@6QxBgN}jk$ zjMFLal4Ch5ckqIOanNMG{XH}vUa+?RYLD(}Pj;3unt)A8L^c%f{PffQC7*xJojdyd z&yF5tXVU9FNzgW%X6{CtBURrE@VNp`E3S}sqd)>LIO#$;g&=$*2VU-%FOzr5Ps=&E z+yKdt1B?O@XAOfBDNN)7NX26(E0hB@8U}u^RUFhWKsCR3~ zN*Z8@9;S5)t9w9del8bKnd`v?+-&iBzu}cv@W+7q_4sxIG0l5dt-O!N)%}G$01Unqi z?0`l)Otr%3IIx(@%(y`dO{6nrVG9CBoF&nc=(8hhLPA2C%j&aOj6USjxtuP><;qU; zIeF0XNj&C#4i%G_;IP{WM6GcM6CD!@UF*^H=j2@Lk=*E*ADt7`=BqnVgsT=`0?olw;Jh?HyLQVnuP^Qvuhxk#Lq;|v z9;^KQj@?)HkFVJO$4A%x*MoOUxmW(kd`zqpGYX&uk&19iSqcs(mnGu@N4WzRSj(-L zIMq`%jT$^vXcVyBZuWx76piixX)b1=Lt2E1;2?iY>m%zxB)Gnpn9eEE7HBhrN zbjwk2kyb;Ek7y4U%CUsGknWvsG==<+s(gW1rNC;G4Ttlo$OE~xiGT&tauSlXMp@9IQ}bR2FjB4PyF_v%C2aH%Z1lf1*iU%f zx8Wj=0wbzz2W#%V6DJ|I>6y9DtST>VKhk*510n7(rOT5(K$iGTNmFHN+V};L;f)n3 znG>2@wobVJ-Swn{oH(&++xLyWuv;&CT##iElK(qY|KPmokF=D8=O1jSd$2x-@>@gL zP{L&p4V@g(DHVd3W3dva$v8nKA-$)Us^;Dv;>1TC_&oa5KV){p`V$u}ocQ&xnTL0P zAbz`p#sm`YVm>3DTN)Z0$=H$%&Ds@OJWUG*1M&s}2^mU{LXkuqdS?PoNOj1R3QvN` zqEIJrT58`=v%aL~HqU3EO?d~#?kv$!lEK!c58c*RF`wluJi4-aUrWg`<9oxKDpJ_u z1IsdtmzXk!=TSaC`rIQ`b)lWY>01 z#CB!G?i2V06pt~|D|{nV;Ru=%-FGxCa?#-^o=sV^S6`0ik4Rm-ljC9@`!4tHgZ z9J%~Ref_Zw6_wjwSziCfZ$Dc*lPd{Mj&dPoY)g6hD#C^TcNWb5M?FWp!C2k|(i@DG zyg~9}TiI69Ynai|$V{!qs4$rs*2osf_7gCZf|rw-IN2Bu3OL|7;5cK05&Xs}Mr_1_ zT)~3^yofiEE1(q$xaoxK)Hr7w{5RDQYa3dWO z*n(8n#H8wst#ILpkwKgqy<}z8N}oclj+h*p9=!qRD2U6=xEMEtj7%ouC)O#?u&uqT zMctB%aPjT&i!>&kO2%?ZwNY~~l#1ur*8U}=GtWy)jZa9+$n%MRprbwe3H@n=eiL$` zOf)@`g)(&>JLgGp+5x5LQm{S6o}$b$XL^y+sl-ZTPFs`#T^WyO;Ear9SDNY!lX@~a zO{o}g%xYWdv!+^NEgGaz;aVw_EzM;R8|HPMgh%w`|4aN zIDRFu9Y10vej&@T1B4(;$F>q#a`dp{q!ikOgak?hg#Zbqp+jkzk4q_i+%)Z_osxmu zuZ2Rn%=ASWF4HNc1PV?~-seb`lfcJtZ|}6tAcH{WwSRb>ILt zw5M&;mgTr%8Ez=Tn+>=}i??a;W(^+Z@CeN9w)}i#J8C;=d(_6Qwqay5*+d&>vz1wF z%d#-I2D0TtvKCs5^aR{$Q3(qt;PL}XIht+1_yiFzZ1ve@NK>{VHGbDN@YfZOe)3Dw zp=WO1G<@tQ`}`*&{Y$>J>0hoqd^PNB_Yds#-}|dWNB;S9eKn)|wpd?i zp8C8m_T}K3o395?rj|SmmehhLH@7Ws)Z57>$MbcBBUoxZdD?!;?}e@(oS`1O5t zlV1pi?!KmyqD>`P0g?!)udQ6G6?nc)z^es}1QYlWCkWV}*4YsjVR@->=yX`+Ak>Yr z9604hXOliep{xUFVFrYKs5M{t;a8lGb0OGH9Gaga&+)rYCVq4>@qp4h_XPB=gMA-N zVj_=uULYzv{VpV;Ar78bV+TE}|C%}(ftAkc=mM6$gTlH1r{tcP|12q)f8{ji;GRo7 zbuys^zOpx+0&lW{H@OZLVS5oiv;>#s9n2#)nXqKQLk8TK)ssbBJZ|A}9OGrn3QDqV zMx)h^O2m@3l9MHTNr4@9AewArsl#ernqz^15%z=3t!&=Ye zGVo+Wosl2zS=r*&np4M*o|=E`^l8$6ie$~d1HRIPpOU#_H*n`rahr|8;Hxwv~BJxVj)%%AY`s&|v4>fnL(4EFRCvUs5@_S#+```Aq;TrN@Qtum?-h11c zH3Am0I1mj2pBW(teOVmDbA+GiPzImdO(7R-2-ORHBNgILz?*dNRnjp2=xi za4xnTpnszQ*8WSXbDLlbnSF*ob4azsr0fka?3u78xjo=-JewGQg_}US$Zt7 z4}$oQ$(lr|;^%a{t59WIj@-LS!z;szV?rq7i9$;IXCnwq!yTSCo+b_a?(@|$A5}H* z$w&9MU46G1&zbS48N1BboSSRsIWy1Y@`r@G1TrJw2?1{va2G&hFv#+ zs1>Xk6PHb_BfnPc>|u5ewKWXGAk@$YW-g4i^gURxxK?A*#Yo-t+kUxA;fDOE&Y5 zaaW#y5UlYacO_eMzrnu%(IpR+qifq*50>GBB0gflhYN6X?&e&wMUR{Hc%v4t)#3&X z?j*RLV3iFOnTo_BuBZq$Ma$^R0G2GF)bb%O1IV+|C2s`4>N;&*O^#px)4PU-jy-?< zffw!^^xXaYb)&a<>q&#}h-dgS<4yIx&+z+)PyFn_{+}K9Y&-Gn?5+QD+bt}1mD$M(m}jFRw6U#xPyS8$WN*%q9HO?NJQJ*?^0JrejdqkRW|M5A zLl6vEMX4!j(R9Ex$g?H|hj5d}9zV(x)tT9cLu+bxJs3;8diwPFBS*@6CfncTcdvqd z&6WfH=EPRAdHb%W&5j&~^aK36fb>#W*Z-#N_`y1SV=X>hg%4NY`r@u)(onRih_vKy z$tPRPxXFw=Io!bEZU(p&i6T9#F00WCf@H)a067nff0bJs&uNt}>?-nV8|YIZ z`nmT@tUoePE7jJ!4z6px^@^ky4E1d3FYnn`A#sko+cLm z$?0|f?V)|U=C8pmhmY<%oOl#Btli|uNtpQEqHA{a)AtwftB>RUt^NV_DU;1GT8qGk zTF`geVlz!R-iY^BAE_pDD-W+Ed+hkI4euARBw~+<4=%%V#duE<9yj4(6TX>XgErSz z-eN;2=)_k!u@jY>%8!jl_m)I;8tqrXfSCiE(?Bzv-44h%@atkUkm5`DW=W=Hu zXIV>^q023W$z`Z)clpJ5`8|x(L#QU%Z_egi`UDl1rB2G7u2PN_%u)K;(EnT@* z-QgP=cXXFqy7%t5=42f9(GU7>_=o+S{9}CMl`|XLCO20s9r$c?{PwFI>!!cp^M83y zH_t8e1@kLg?AF=}Tb{Y5KR&wo6WeMVrCYb^Teoj0Ew1UPEN`xm1l3gdgH|0hMe!< zm+GTo-xg=BI}qOKAh*v?J3L$3tBY4(d0j6#3Q}ufY+MUc8)2Q z;qCP0cEWMQU_{t}A#`Fh!h>|+;Qbg!F!p1NiIGPf8z)3wu)(f!J$qQjHkJ#=`D{g! ze%r*(An4yxs)L=IJk#>mCRRV0SpP#@uhnO1RYYqx;!b||`=5o$>&g7(R;zhMXBpQ_ z5idnZ-2$@P@!Ga;l$)?A+n_h;v+V}G*`WWN0UHeZ!+Jca$K`sg7fu)Aib7mmh=oFY zrw-F66{N68Clm@gdr_ges8CmQf-OCI1iVtfOJD&~w7Ccu6|VrbS75tce!HKy;Nv{5 z;IXBcClu zwgDB<)rvr{KDk#vBSV)8!2qC)p}b~EJr<#xby&`&;Yw?!t!C0|%4{w%2BxoUfL;)y zSJ01#(M>*G?QG!a_e3ey$Wyl@p8EU5yQXXomT1|D^WRE5`|Yoo3)LXBFFN3v)Zf`u!>&tv}UbcmuJ@L@(N+uXf|XcJt7=0 z=&=CHXT2G2QK2B{%z1jY3e;kxTfmjRt->BH$p;^2&X{0TdfsS~}>Y@?Bd zb2@oZTx4MAA`tWbmtI`eWYn!p{PKDHLSpP^zc-f(+Lbu#sl+I*Ugt5JS`(ij9#WDx zWvR+FwBphE-=yoCjn=i5s_iO1i^th^5j_eK7c1xd03*j`v!KJVv*29zX3G4F+i7Su zy-42$rHA^8IA9#!pC~__X!zy1lA0WYqwGDvd^)iVzf6uMZgcdmDB0AAr)clXAiBK_ zz2~4S+H58b&-3_y@z?-;+699dmO(i=?0IFL78bQU?3U@C$3RRDdVF}cwwC@V077(6 zE;o1Q)X}%hto0a{bL?wKvWdpZy?lNH87(ezu;k?G~twqscwZT$*fI1!cFe zmK*SPrKK??s|)ysSj$#?mE1BV>q=;OJ!{#9Jy0fmgJ5K0O<8$es=OVKD4g?CoU6!> z$t|j<<$lQ+E6wAQrFBqxJu8K_N@-52bUBpX#7Y5Qr8G+}1uAdsL z4qf+)yi(zN1)cW1HH}Th@tR=bu2qf8vRrE$w&;ph{U-5NldIBXZ5mkRI`FCfu9}fK zSMa`#RXywKm#*2~Rk5P|s>UmBZ+mlvZhLXz8nx)OmPr-7xs=g!pDH)VU21&Q;epU*83U&o=%O;AqxyY|ch?RjS z%4K}AY-P$@z!Ra2c_PoHJn<#);`deGH>r`CeMn}llI}+D<2Uh}?)y(LGA zd_`{+hnIfJ(qehD0oBM%H|!bnpYy57W}?Bd?F%zO8B7iEV#QrYoHvBh94J zJs&y!?yA7mIFmBzqI5iy{)?n<{6*3;nUqO?h3VDpWV>C$zEmRFrBzbBv|j3x{%t%y{@sbDi5n&!p43i09;gX;0`~---Fd~% z*`2@KbWZDXa>YhTY+Z!cR|kPv5y4?cN;GM}pCk zXlwL%^xfDC@xJ&i@qhYHNN4}jX{PP3HVw>dpV>7tH*?d>v6(N;e0}DLnV-(QJoAT{ z3x7*#_UYMQ&AvAK?jCI>Wl|<(QYQTuP9~ZVLe1oHMBm(^ACfI*Z|G1OqbzpEvCqzC zlY14KL!IQ43eBh0QK2Q|2MVo*`oB=XFY0NJxG>4X(f2z=YS{)VAo6jk<8fo&A-_EN+t5bEfXi44)h1Q`i_V*s> zKZAzk_tI~6;5q0^Z|P^W3TTt%8b+&Geu&W;mcN(LT1FpXvbz}@>TE(lbHDeVv$ZKAR{ zY8agdbgp9qqs?jc^O=q^U67Vv#M%xrdMWEm=2?Ihm-G{;`1V1q}ho)Ih2i!$~rdKcI2Uv|NC}~GQ zNFs7W-UPIdp(wkP;I{;|XW;5*H4Tt@;BE|ZB{T~;1B`nJ`c3xJ3*6^`cO3YLz&8v$ z1IP!o59nzqi=_GyQ_|O^huHSv#Y2`l&mYV{3zs5{H9YDT+oA-$3Thz zw2T4@?X0G(QBn&plZkqOpY=#(-o>;V|5)C0an0sMy;2{V06c=M9}!hR{Q%P-oWiXV zZDm+RQ~ERj-x~1d1x|e++5cZZ&tg9rU;kV2^-KL=!AhOX6K0`q2=JhG9ETK8bXvu* z4}&}b)mQW|Y}xka<#sl?2!r8iMPB?i91ts0lTKMKASms&^b@nPytb`i?Vs zW6XZr7{($SjdKiB8G~5LuF2XoFU-7)qEBU#n0$U#Z(6axla2Eb>t~utEw}Y4TqNb* z%Xm*S4W^)0jFr(=V@!^uJukLROlcu|O5~E9@stkE)ct~QT#C*#yZ1vIAKW_?KcVAM z?$?>>=VA?Hi_J2ed~D=g4zpQB(*PS&K{k4lBmH9RX`3LUDxiMlB452ccUgvyi*5Qy zNcv}l`F_&hlD>aA4U)ZIDpyOI4^T~HU1F@iWNeJE(KE;VhyGoW5Q`Yz57bolJ?|o~ zl1F}6xyo9}G>t*iN+hDvCasy|Lu=A__hCLNN9~YenFa325fV^Pj^vVyO`FQzIvuwla|IEqj5a^fkeJIi%R#$#jk=^NbvOXk_p*{AD{Q z{aE&^X(fWoJxLCPw}FK`TXK|_7|{43L!7kJ*><*$@t-CIdQ;79wQ5D9Ffgx zLB(e(k}`gi8l2So96BcFEe8k8aM3qFWOCi(6CF zVwT}J^)c<3oDJw|Fr*+OrAgpt zSK8+SE<2%yFKzCKeMmf(Bfp<%keuUd}8v!sekKs5i{!IGKkVuKjSojm5ZbB(i&Yw*~6= z125XP3yrcqx`5jdtLbLE`yjU$es?MLXp0WW8HRgGZ(>nU?ynzO$-4!YGAGKCdLUm+ zX}DM_7wa)8Ss&cFfq#!u+77&3j31Ss_TSCu{*;{EilprfBg&cb>;Q>+*&WRthTnrw zZ;18Z&UBWg?Pof4L%FO=7n6YYT&3tL*Q5AsRZ6IhsC>PU7PM+-81yh{7VztU--94I z<-Z9^J#2;;fR>$1(;!gK0xir5JPq-3LFLQrNlKRhGq_#%(cn zBdmO(maJd9a_wNq4X``e8XfG;!)!%Mor*2pOpl9u9bul>#cH)PjfYYm(#^bAmOkm7 zavuX}lF0p0+osEs^lI@##)!-%Sw5^-`chmd>g@~@D%Vh|=MUms^^jOwQ(G^3CMB^i z916$grX{f>9GMPBysA47PBU1J?bz&L))!-D}-r)44*y9cP!oFRQyE!}=5_{tQDDBBJ z8HkF(bUx$Zh`2E@77X~jK~d=u>V% z$3GaIWM;G6(k)HIgWiZ((HHPV!c?@%tx_aPyJ@JZsb`h?JSk2LxXy@oHV~Q+2gb)i zI&qcg4vz&wVt>Fl84h}*PI1s1iv)ZDuQ=poI!49SO^vmw9>i#TdO8>Y?Z(5QSe3Xf z92cj&b7CCyj8Q~swipYGzKG1kn`8%|*z6=|mL}OObQ%cx zf^k1}tfcheP;gGH2vo|pOREkXK1^EK)D+K%6s5RPGc9yLo2PiSFa#0LF{+@UyrC774FMU)Cg*<604UT%c_RH@NRYdlY3-Wdj+C^XWH6ok>o;9fkIDU^#w zv%xS(jT2?w4|)Rx6119#cmWx|Qyh=L$OP~4O?o2}pfkl7umX!hb1^&yBQium@v>-= z^s|qy1r^8}jfP?5Q2+3Ueeo%vYFqLJ%O zQ#3-mkH)~6XyApxD-ZM!1AvaVo-T1{pxZOj?(Py@L*k%&V5_UMt5Ym*AAq zK0OKKQ}>eq+83AkB{rk3-XVAI?*+!geCG!zJy$S1IKj;ue{NkT;J07voLM-%wswl# zV2~F)SV8>0HqhhRG_=6HzIK5L9kvk!E~-22Lsfn5cIVcXn^M_X=_`+M3+G|9q}GfY z=DF(SrKx`2N8FJ|~53x!76LBy$0mbONw(yW<|1yzji1 z)h%BDv3IEZ5$R0EuS*C2Y!&uFK)56%sG4t_v$YqhO=WR>Uyv5l9NL;;)V9Vh272s@ z4B`bxRgZ1(JxA9sWjsWLo}m^-CHJ9ER2RP1*|p&TtcqlntHTka+^W|)R_uY6q!9~8 z)M*)nHzw2mgSSyzIvJVf1y67-@v&uZeX04Q#|PQBb0YJQQ16x;z<75{UB8&wri2a?WXU2ktIgubf3lTHI>ov@hh{V z_}rkwI!1D{YuvSdHjkjP-U4~dwZ@yKD{ZUSZg;7#0rrO%$@Pp&D}EK_RsN$dQq7~( zLlf#fCiX#YyI{<8h@&%t?mLm1uljUT%UjQMun3lzsVDd=on7qrkPM?C9dZCVr+9&` zT+I?5e1k;0vE0=xizf@!lEM02_aku&2I@3^yfzADHpv5V3_jIRfPkh}Eg$iFkF3mm}v#2X+`R4T5aTC5esrP@&n z3izf9KYco%2~*ZKKV8+Tz5(srxm7hI6=*kSjZQ$Q`U#PT{yv>c5uN5;M~zo zd(Cr_<_VMtK-|in^a&Bo@cCCC%A_%p$lc@|rVIJWti^=8=HGt_pVKRbJg;A}0zy9D ztaAGMDtjRT1dnsDHaIruc0a2$6ZDEC8wh2@(W`*y(#(T)e0yY>)<^AxyUp(v1bGAB zL74uaeuV)L!ON48@{zqF0hWU6;yywzC32=?~LUGPBAHv#O}Ipeo4 zFsD<1Y_Mm)lP##{*k`A3z=sJFiS;luI?1Gh^)lRT_zrH4n~7-Gis0}&DCvqkb_%gI z9g7w!GXrNb$)twuItX{gpjyt_PeIUU%{?ojkIhG(d2TCjc*jkScT~s8RIXsz_6Ug# zDN`j9Bc=3vkx79$f#IiMSZnjvIfzD9g0U9Vos1xEgSiY|M`FRF$qeK0{q5!vZ-PL~(B5lZ5md%DknJ84c<`gt02rPlHaIU2!W}SGk)nAn_DWz2Pde z7kzOZ@2wudeT2MF0HUjZmwOZ8RL=rcWdi4W(F2ipJ5zf@s#L3yw)X?Uirk&9bL^uu( z7Gfsif129FOxnbp>`c1E#H`xHESy~b04qB?F*`fQ=OC9hF&7s%F$V`HF*7$aF)J(U zf8cYBor~>1%%5Zb3VsUx75u-2|Kb0f8%1e~tL0pPq7XX#dw| zj!&om$B9op|F-|p`(Ni+{@U>gf9?27|Jv{`-@o+lV*T^^Uwi+`ee(Xb^Dq4uSXn<8 zk%Q@TQQ1CiU}pVP&B^-dIxFYjF8gPfm4p3nlaupb^O!lgKSw|3{tN%L63$l ziqxW z=kEpb@4Wwe``@wu(0{I*|NTN>`xN@;JI}|*_|4MV+0>Eoo3){{shFv;orx*qcT-z) zXA5FhHVy#+M7V!%8SWWA31hZFOeo?H-XST+q`RgGq$CAGxDnz+U(caYyd>izYY;Rq z9~#Upa0`{_0$k2o+y)6>OdG0HIGH~t5b{DJ8Zr~026wC>s>w2V4ni_UNLf_O zIOXf75&n*?b)h)-<(#l8dy0De&0Y<|U0~EtY&ahcGFS4&UDH5fvNnjI1zLLZthj)u zakq>an_vw<93Hr?*ent0COJcfCLf*^4p+cMy!yo^F5!2$Gwg9W&ManxQ-N&w0=-Lr zm#QvO&q!Pfx@_mGkQ^#~ad1^b6r5aggWnp#I z<}YHx8k-a7gm72{#jiYxR^eWpDYj8{%#AaT&DDLCO__mXFLObzUmxB;ezf(D|6kmh z+5aC!iH(_qne)FPVsaFhn%U@S1-$|Z4b6PA-laLefP@>B)_=&az}2}`uk((jO|SDEJx3Hp7y-7g1grww4HNBQG7wGG^;-AIZsU;Vg__jz!JZZ@O>G zm8JypR;&9OHZiUY&%q6+VlP#R*`2{yhY70fOc))eRAGC4}pa1kM{b zggz-To#@=;5Db-12et?r(v54*P$9ma=;@a>xVbf%4>nKeu|nsWeI8e zuG5Nm6=5&9GtMq+Oo0PK)?7v0PCu$Y!4gE7^V+hibA#91Mha96*M~|2PoqCT#JWfv zCp#H+@&37Ckxc=k5BU>(G(gIN=ujS1AK{huGasfUP$(Uo1Xod_0H*+flE?yWR6ga7 zQqgWczf&$wf7sb)zuNoV|GQ2VYd7k4Nw#%>#tMj&W%H`?Ezwd7B$EQSNZ&Mriw@%v z%}q9f#rsgn5@`1y3`JzDR9@mEg(I1I!gm#exNaRs3;7xRJFw?%3a#?0d~*~zY2J)F+P&t+Y{MwC=Fjx;iU@FP z+p|{gX@-3g7k7*$+%Z?1-zo5-NF5tYS8B{rh9%G{@prV0KOH&%l1OM=bz}~=QD$iSXRsPSHQ6*ZUsT{%*h(t>Jtdy$Gja;uL99I_F=Ux+o0;_ zb~DAeyN$%Z(j0pT-z~p9+lqGvbI793V#!!q;{12t@w#P}L&9FQQ*o_Wb5(AD{k(?5 zcbsSejPT6ouanY*Z2`CDHPH{kaDh8>dC^12AwR~0fmp`6G@l?3{qLG0gi z+#Zh=!876KDbiP;aV0g)-8Ug!0>2ropF<;o3{iA~$O#cifHhsOcHh)#5HU%B(-w9n zFPANoitu=Zkxklbg^vRxCyNboB;?MyU}rS=`7Z9a#b2EnM#s0G0rQi8@_aL(3Y3HwRkgpJI;7Zz&c8w1_1&gi$uP=WVdp==numIbiZ6i;iU)9wLi;xTO|( zq8bC}2C@1AnmN#S_+-+Vl9QwEYb>~9iSFnc3<-qaYD4%xMc(l@s(=L;o`|;>*o%S2 zfTp^VG3yiPhp#rp96Y~CYV5DU9|mKyfwcjZ1$%?zg5rb3hj=f&E0TzFL$qKA!efuxF}nqjzH@Jz zZaeW#66s9d^}gk1ay-1eWd51Y&LuaJlefmEnzhT-TP3}fjcm!zWymoIB^1#`z;aQP zBj&^M2K6;J_f$#`s^62ekuJgm_2YkCojKK)XcH7#+k_Cf%O@5kMW325A$Qjk-i6D0_1b|8I23Ds{qbZ9GOAE$j3|5)}U zTo&ARv8qbcenaDM;t+>Y`e4T6vIXxuYuWd-1RMMoJ9z!-2aC;X2Nvcp_)0_%?Rh~A z__|HG>S5t^rGP+ILH51<}Ou-x7;0C8Zu>*dVIMuKhZvNKI`rx|Y&jhnC z-6_be5QZ|sUOm~6LPQK7sP7~oi*IA#{;VMT?Fg)gjx3K&An?nCEt3Mbf--n3e(Q7% zlOO;&Lno2VZvK8*a09aD%8TpZ$l@5BzEkLmZn zJs>#>NzN>mYkLpPUKEuK?TEhI7l>xjz>PMtu2os{*1f?!CoLa!zT4Emzl2_;XcRenyx zO6LC(ab-qku>PiDkbyLJ_&a-fZy}k)9)Bs8^LU9UZ>Jk3ou^URe4I?z9|PpR)C`|` zQOJq8%C2%O>10**&!zDjyFNrH*wf;wd80$SSix)JL{6*3HfKEfqK{4Ca7H|Vz-WD&(8b7_#*kpspT8jV$V%dez9VGb6EA{Zd9BrZni9qzCt~p zC{hYr#8k0+$81|TJ7qr*-vcDB>MplZ=rd=OU8*Czy$Np9(Sgb-!h6+r^q{SJo1mT& zfKuU*DUldd)kB?t)Yg8|>}F zRCUkU^qgXK(=t25u~*(k;xXwfx(4-h3z^^#-+g?V?Up97-(vnpXU}}T>M7vpR=cEa zQ9Q{!bHr%El|w>cBIGPD8r-yIOr%Z6avZbP=8MO-fd^}u0|FgJ;_soR@NLA=wi15P zJFKinEO1Ms78$jD-W>vn)|3u|k1^9LEXm4s7w38YD<>$pmDWSpZ^6C&sr%5oNI=vG zis?C<-O00ZE_l3RAjISPOo4+%*_?VnjVkg@ed8BX=KhZCr`CQ-oAT)?m_O-?s}D(k zY_NFdq&Hzhf0TjPwxIzmh$33NA1E&#ATVrPJ`YO%W-LbVWNk}zi+P@Ji+U84cvfGT zn`FZW<>Q0eT8DmMrttGKwMuBm({4G;wB!NilA-Wmv?*!Sp3gQ*fvuSYMwCK&!64Q6 zf~521fY;EYii1ca==pME(L;`ER?DsBXC;DZ7@6AUm(`2KWbNP%8V5b2bfUP)SFq*+ z@1R=a_%5)P_a7q#t+{2OAX6%^7=Ug!|5b>3RngCzWBd0+@BsUwtAMzj_y8fUIl};< z$LiDJ8I9J#eG5815)>HuN950Lr$c~{`#R$O7y?8ut6wmFbc0i|5OMn);yyM3OmHkx z68O!R#p_n}YKgaBIuBR@7oY?PJkag|Q#Ap{vmc?~Id8u9x48Z6xA%XT)rg&_3Mlrk zQSUKLwV@+y!*}9XKN7NQ7&Y2#1y@@Es~vB(QCi&ce_x!Ms?9%Z{i5cPXFaUgv{h?7 z9xYji{2oxdenj7Lx*9NU1?$|)a}D~cPaG=^FoZdr2>ZjDLULhxcgL;oZD|c%EDAS*|H2xd*17VrKTf%G_Yzb4# z(EF$RFP3V(!nK|IO*OxMw#f7D;cmLiHntXCtc8=x%aUD8L*{Pu`zpWAiI8fj(DOT7(7D zP{xtVZOEVR|LXYyArl_orTk*iG6nNF?l*M>V_ZA1e5h%%qnD3BCnxF^y}&(eC}W$K z5{^Lc<|l)IYm>8-zO<+oOUte*9X@1JFehVicZQ=@#rkiMcXgcQtReht0l>jWLiuF^ z(D~#D;MF4o;?p|CSrv(MN)5KvsqN^rezCJT&)Mx7^#+C%;U0IS!OQq>qzx0V=qY=? zr2Ta<>^(CckO>Z8&Mn{)}R$CERigiqp{bTb1PeS|HXb*z9_ zH*Z+FuU%ar@!0JKC%PZwbp6}U72wMG(&TBdtRH;?@M1}_?QZava%$Qg;U>NGbo~li zsgsD%;)PjYtFF5-<0-~Q0$Ryq>myivqAtOg@>sjv%K8*?w)=rLy2IRZJ?7WmcoE`O z2gK~_vm3Xp!UQmL{0=aYwGr{+Ij+pnasL*;msnOj%Yf`1=JcyFH1oct-dMEUNnDF& z^Kc#H&aQbf{pj}Q9o>n%+s?BRnjiN#FXAWGxYHoK`X6^=dvJgt^wv~OXaDab9p?9> zUTjCkQQ)&LVmp#Ik~g9XID2UyU-7l_lIkJ%@`*3H)zH@(!IsUJR)=S^q&A#`{T#lZ zCVNc#{0IWRbN1lfW>nx~)mEh?dmei5cHwRcNac`A`P4^>mpWqHSdjcv)oUBJ5^cH) zO@dMHwWf_@DNpZhZ{d9E>oCy|Q65=W*`*KBCT@f*A28m7wm%Ey4?6diPtOUjEvRqy zL@wq^$PB($6K~F*F-=KjNVH{vy@wr9M{JF7%J>;>DCL49B#{L;g57Pm2j6M~?Z#=J zEpLqXIBr-8pyv-A0Y$N&c}RdYL4c2?~0EfbowN%BXy_GjeT4iI7` z*FDoZeIzS*740K=l6xz`1Vad!xWvB09Xv()QCM?n$NNszZR@l^$3ITZu9!-a*g2>dK{?$;muq)L*;;*!a;;?Fn55U;BVnPOth5S6)WG zGUbGIlN|?7&Gx4ff4or6oca^Jo#;wxzicnbaT}eZ+Z_`u+sw$(%3t~78c#GjMT2Qs z@_}n# zJ7@#LtTWWXVTSK;bDdbvP2;1;_a5zBP6u^QXk9?=q(0ZoN!LHETi%&R+*e5P{iz4k zU3IJV&rYi(Y--~Tzm*R(&!snuBeix`{aYJ_wu;mNiti=ZptY2GTX?kk9^B%ibXnM=m#;lw6*gZ zvGv@i$0cS{0c;=kN%6+3ctC%_U3u%e$WQ*QoL9MmRl*kbvbZ^y zpZQL_mAvd630WiO#QUx}{tKy9IVpf!?j)1p40m(uYSS>x1&idt_g=5EV!mRsWR0gh zXzVGoO9zO2?Gx3{h`ozAV(2N|ZVGkK##A5^???dt!#}@!2+`pH*^!9zkFQ{TY&GeU z&1^o(JM3|#6wF74bMBXOny{$>oYxL8s4c7~;a_&S&%1COYVKLUB7T{~ z1!#+s#*A-2_Lzz2@(EYbrychjpF!0+s&f0Ly&XW6%N2INr8rq^D?dcP(}v0o2%MB0&!FC_h{V zSZ4^`m*(gUB2H^6KNuVv1yK+2wUup-Tj-`@L9kQu9-DJyMRh!j7tfr{b>zIab6-2? z>a~*xY{el(w$xMdliKBWlZO@#e_Jfa8#n9e2Q9Yy06MHuhxebhNAIqa!f7KVDdWl~ z3Lz!5#p&Z7>DllrT<_SAnxUMiu{=&K_)|8PqyZeeGk@(TBTr{4of6(z>JKM(B;=%ZZL{@icRr!VAvR9Lop}2y$ zM}0fi5BG&riXz@aIywI!pwGdWRt$ZBczmVQe1^m@elY7Xel@#__znG9lSgxjPduYP zOXzC|wn}hl{O-$aPAB$;s8vc?z4n^>$J<@6v1I;#$B%wNvJAKoix`nhGC zh{&k(;EHspPXANecGL89$^?SX7ngzeGt?s~Pcf-N^8lA_i*E375Kn6Bu_7bCABNb| zgyGPw;OG8k^pP}Vw(mqV&N2y z`^7?LzisWbZcb*|5f_5=_MNsO-tngTqw%H&l4{weG>M-+%PF5VQ=_@2UFX|Yj$F13 zGG)cmbp~6x@P3c6DNLsOJowe!9l8bf7L{PyX`(e?QGfSdDsH&zpbp+3;L8lPf@eB9 zQ1Vg-^SEV2&t=SOc((q^=}RmtXsm~3i8Z}fDL-Odo*Pa~Rlz#gC%5wgeHybzb6T#_ zt_XYN#;kFqW)WW<-B(RWRD6X!m6`c=(iK+NbGUrA4uhArg?Z@_9P}-M_nEafYY)iL zbO3C_k)K|gfJ*1p0iv?E{dyLj3cYa?IZ>2}H0C`!I8P#ZU87OLkpUNKdkl$As*fsg zee?;`%Q4ES5R(~#yx}k8tqA7br~!SsR|g;wOL!sLyzpN`*IO2_WGEZ%ZGf!uTX+qE z+~#Jtjl3Cwq|cmGJmC*} z(BYiuiY|tYL9-pWFu*3x3j3%iHvmUilklfnr5|7o4`zMilvRYRZk+=`dU8I zCoNH&{r+t8${u)1T)u;R&;Twtw8*blB_EFM6q9}7E52Oe4<5_J9VyXvB!}{K^=je4 zYBNJSgUcoX&3eq33Y_m`bh>m=2rT?F~` z@ab&Ak>T9RJbp-hS%BLg^ZluOjwU;wJ)q}M!ga$}?wS|F5Pe~oI}o=j!{N^Hb*s~ zu6=NMe$lY&ZMZG&T2GMYGZ0 z%I7*=g>S)lJ#jJVUm(gWc4mnsK8}m=`}4Ibr3rOsrZwWZw0+s@9-DHAJ_?f z&;YmRlGjLdu0%UH!?lKt(_5c-D87$H2Sj@$jIqQXg%|aCa>K~GO`*oMG9U%!-d*f| zK8)3{nt6W)k;c5v$bnOb7=-J3;sSk-K5UxQ0OYtFs{Cv(x^5i?!UdYeNw}(gv5a$!;K5Vw{^;PU(<-znfCZzng!(Xph@09LFt_lUR8I z@`i+O`EGN%VxSl8=h@Qc$P5_>ju%rYy!+vViDj*{AH^G!UztrQEx?q^psJtucC(*S zcBU+DpP^b!v~>%X-z3oL_xM!t$=kwWV^*$9Ik!-Cu?Bdd%nA)uS|@D5rsnDubwSY= z8X}DUD(lC8&UGKt>^}l2G3K0SUi9_K!OXYO)SrUi(6!tu#CsTK#Xfydc-$}3SzDz zTYS+pUGG;ZMg@#>r&|R9#U+5Ad|Yu5)e7sn@~-A`jqK~%D=ptP@OuZjIj(779m=8| zMS#?Y3oFCRWT*1W{>pg+d>6O;?Ng(25Y2W|*y}rA zbTDViysRln7orD60aF3gd5-=Y4p~^9#uDMXU$_c;u|0>?CMo&+My={;HOD*yA6T*s zbR-EKXXfq~+vD{@t0u9Ntc+Q*2J@;-pXd8iL4)m_o^g(!p|QiwF8d{GEOx~+#vNZWPSI1DSa8=S*J>n%3vxQ0yu zaP*dTTseSwc z5&`DHjK)3VwWyGN@f%rYJ;x5m13gj^^;FF`857&r4N2*8sNnb1`#(T) zz2hDFBpyk3L+c;}*nPze;~A~2H^X-nYigdPA_OF!>zn@wMB*L7pHn6%v{DZi7r!7V z{xrv23LWM5LbDoGJ9C+v544?#+Kq&xI(nM#^=8O7C9DhcnaxT z1H$IlIv}e^xbveT8YiGVG;3=iwo#F*@T4_ex}h%(!KO$~R*pN|(VrSb?0yp_@y@a& zluW=1^0!fQlzD%DX+vg!KL>T=_9KKj+DAYYzj4`m0Knbd4hHA_|5e-0{qqlmfM$mA!) zk|xNJ%-if;l~UBZM@x`y{>0D5UK-gxvT^Mr4LUTx%xvSxRWu*-$DA=dh_Z{^EPz8m zUF7XU!EJ4k%na$0dv%kzbvbehpD2af)hNqcOf$fGZTt*MfVNZLC&T$ktN7@TVx%*T zVrh7Yl3b55!G18_g^9e*L7b=5?-W>EatrsUao$_4^nb#8lN{Ig4xPy2h(L=3tNN@Z8Dxt6o;7dLdWR zZJ^fhaGC8s8D)S;ON zuM@*()B5E6;y-9QR)`fo%cg6CZRl3Gh11Ad0Eri>)OrN0otg6-Fjn zDhlHBRyGifGDqb3 zNFn72V8Qnw8^P>e?nsRywMnZX8~Ee}qa)7yaIpe?1?R63>7 zV!UqIbAss!qc9(heqyhH;Ha;Ej%ibu%Tw=C$~jR{IUwgm|KmUzn1d@M+*sD#7>Q0k zRW5x(lEzfW!$rOjeS3h?iXWJiKP>Id6TAg)|9pM2Xv6)Its2sZ?v1Qgcw39VaB(?L zSKmwOSTb0TXsJ@c53DcGwYWdC5HZOnhUno1tTln+Z_sls9qK$6%4R`V*tD zrmWpRG1%CMXc3A_54bsDO#*Fg;mP&+J^^|M+tZN7Dt;wOw}7j(K}z00NiRtdsFD55 z#k1|8=q~Oe(xoCTqrj^Smy;7s6nILKduwX{D|cyhTGSV}9Ac|H7mthFM)9|j9SiISP_{zw-1r4y5;{$H)v`rWO?Q`@xcOYh zGN;@lr}$#^O!W;0K9@<*hO!cABNumc)+7~SU46ARO!l_6rLoHPZn zY(_uuzs4=}-)XK*Dg6BXdq1Nv9lOK$`L@*R7iT}!GdyOmUmXj?aX!kbQH?s92MwjR zBeSSq7zxhv3i4Ig=Ih-L+(yfmPY0-p0$jm-RR08+66Lpp;Ua0}kLPm=`Gsg&5d&lr zIxF!_Fw}kXUvYT@u?t(j28&;+;(XUDpG|F75Km^Lq~tLIU5^lBxA53U~i5)5P1SXE13e-&ds;u$5jCGI3k1j?br9|_)R4cM zpxW8DD?sg{w<}Oj*oh4Eh`7ABF9Z6h{zIUVvj6t}k`f3B3a+m`iZp)_Y>c%1E2HHW z7?$a;cRyR;=kX*6tl(U%q~I)YFhP{ zbt}X!152cqHhyT^*ubyJylQ{9DqJUJb=iF4KO(4qetY>4$lf{^g?%grpiCzm`Ds@)K3gjrX8-%28AFoS_<| z60UghEG(hnpIG%le=*6y1oOllWuVs1DGycxD?}MJpw?9I9&FID&@a9No?a6tSyO{j z`wBofwh*&B@R-;L)@;*P*lEV~4vkC(93j=4V1Za#jZ}ixR#A9`R_XM3DRRU{UJ`1w z5D2+7KDO@MkHKCmMFBzLZ0I|g;w)rb3FBz!SAZ|0^zNkB%Pg z#%Hnw?(SH$j`W6qXO@sJ5(LNrYp9xF$Guxj9+w~ZA))%p~^2kCTLXyk1r z^gy>jC>R>u3KMUwmvh8iMNrr*=N?F#7u?OF{}I7uFqM8Q^i>K?qT@Afv;H+v`*p0A znl*J;QqDHY&61?E_&41uH!4n5s)IFEJ4dGrVkO)dgl=?Nq6NmE(u!`?2?EaCQk?h0 zx`tF6jSy?O;qvZ@$*(Hxxp^KMC8e^F`b#=!r9YAf<^QaOT#?<`H>C1`jLZhNa^N4O zT*&OLQMNI)0(a`)V2r1Hke8Oonyd`_2^?bVlVU1gLw;!K6FgrXydN8Wy9q5_Z9P24 zxtj=iCC*aRUuX}sD?Ov)Fv3x7$=2ZhQ?)jAh_+U8`sl*ZR7;rVf;Ry&p=J?U%N=0m z2zh;DW+4C7omC@Wtc{ot=^QLWh<70{@LOBX59U?o@wM}l+t||eg9kjDT9gyERcEu@ z?0V4t?z&%Xfx`K!MMO(iYRwFDc1#@8fZ?Mc${?R_Ul1HJXX26Zg4mBfmdVSiq^=Gq z2L?6JKb8kmED|%E{>VCh<}bYYb(*OL+n>e_7TR6c&B1NQVO z{XrW}To)ON*X}2<{O*@x`k7aKZ~DhVbz|c_Z$0+VLo$_x3~lWNzFVzru>^w>%U^f) z^uSqm>1eAqbW;`Wc5vHJf7o_^l_qHd0eeP`10!xe7iO0v!8ye(-qu zXwRlSlfYA#&Y8DB8Tf=|fv&1A8WH_~=oCV$Gq2(16$`#30J(!}%kx!3PQ2T|0j!#q zg~aic|(qg+3dki3R_k-r+3ni4O+V$E!GMG21M|-9f zJt*OO*Lo!#6-TbQ6Dh8R=8r@&VD?ph#SBk+&eu;=c+Gz-rVc-uxdBjY(**M_W1|Z- z<-SZOE{kr3=2K0>OAeW#6_SPYG0keQ!EOX#=IZC419Z>&_d?`$zQ0~PN(mXGje=&` z3hQqh>B#Dt96p9WQdz*Q#=gVc8~~9xLToUK0P&B&-6~PcPUNyjVqaNmbi#;=a6vpj z$kc#r65@CVrb&c)xQ@`zTIs@Dai&+M76_#w@msw(%dtVkSFzz?bQChj%t_F7(O^x{ z7OX!)F)SsZr%B=_wiK{<0umi?J8`GFV|VSsQ^(0A0LspsZ*hkAUU6=eqhL7nLX3GG z0C|9qGX(s!A1Gn0-GJL}^rKsI6kFolz87Vk>KRxRtZ;`+7YY&92a=;5V=ENB@R(5J zRK8k0-W$#vhEGtZxOoi$a-Y*>T{Di`&YT#@n-pTI42KZr8w-I1QDIe$ky?+fF|bZP z_$36o@HoNOA?p42d+ochxBe@5cMQfea^4K_42FLs){LPuf~R22dw{^+W59dZ-pJ!O zY*PVW5WyJzLAxE~%M>P=y{(4s@IEPupPp2y(2iPCgk-UO0Ex#K=%?Vpi(kIXj3^yAP;SZh?|fR?>Jl+A|2ImdidQd-EK65(Pj4RorGKd z<~zUK5#JGg(F8-X`>MJT43NaYHbo0E<`a%hFg0ZtK}i~iL6XymMI&5otqKCEWvaIJ~;In z=88TFHB;-LM*uM92E4D-9MT_C$)!aLuV%H5MUS;T803apx}T;5LdXfHdwflJrOd|c zk#&as&-$QPk$ZUN1J%5vNL9jIYOY_pwc)O+$=?e~YRo#_0+4fzUNN;O(e|2}+7#g5 zd5?|k;%H~|uh`BEwT}sU+sOT0{n@qTkrKe0!Okg7P0&2jNWH<@_h7qUjBdF)5vL@0 z?U6gdwxVP%S#C)jX0+OIe+^`lA<(+h2?Y6r*9T6py)W*6T=o_MfB^V695cfQf1e+s zcn0G7BH6oJ`8OKj*-)q7dT?c-X>U-r-vs(A^w4juaRB+ybi?PnsP*Z7aE!mg$(GTa zq2ByEQC2|}F$|>SPnxRDm%DZ;u6l9|b4)Gp02}zu7#8EOLL($xN9LUVMP&vuaKdFn z`6CvTtytxo`B#UJb62WYZM$xH58Ep@?kEDW=|W_y+Yv0c67E%^LsvmLVd`&FH?Mvj zx2YxIJ`o#S@K}KYw=nP_cfGELO_!yYom>zF9k~3E;qM63<-G{DB1AciGY=Y}4OcnB z)CjLg;G3t@=LK1WB4jmK6Ofq`puBoBoQY4`f^(&UJ3>em7wt2lacS%;pp$8Z_|u7kA}P39mW?RS6ql zeZ3+FoO(I)r@@jTi0?6fXw!Kq(r7G7KU2j$fLKdlGzn{t(A0QF+9ow1^X6 z5cs(+f*cSV(RW9Asb>k0UI)=xHXvk93bazF@g=ylM^Ik;`C(*V6EPlHl^b=tHsb|& zsHVi#rdF->I1_N~c|?GMy@Z00Dly{hX{Bz64^Iw;C{iwv{ysEJ78NK55XKjS!o8rYVL=Ztei1JTMTfu#mB3W_?YGk-&&%)wtkwUuJjm}fAFwUhd(X6g>a!&>9Mp4KTjMaDZkUC0AxID{b zrm=bj4GXk*p&AP%Qz?HOW#uY5W%8HvADy_0e^x_*iz+7%I9XA<9JRR%ue*{A9TxI* zxZsm#{4w)NXZFd-*I=&`R+4!G0q9yL^Ng5#z3qB>GrG$T7a8v^d55rPHqQ+vG4=>6 zGZqtR#%t0M zMY0AJEN8LR7lg+pnV6SGjeFWC&&ejLxs_-7m^u{so=d$>U~SV$E|I)}zdcv!O*iqo zupXI^+vnkA{9IUHA=l27H7mm#QLCN!N>fYF6FWEQA>vOIRJ?KB)T?YZ8GWNBO2}Vx zkiUPwOXR43p~zz$n1qYa_)-*9@3AI z$WyUMM-drV_A(8hZZmNjG9A9%Nmud^U9#E3r#W`J&u603_>slsC>V5Iy*7HZ6uvV?4MbdNAZU9VJFR z^EWoES`u3EsybS;$61u-4~@>BR*bje ze85@n-Pf(4Jk5PPd55h@c?KzKkU%u#b@G_pc=)X4Q220s`ta^5A$0utS(RW42$PETAs2>Xg z${s!0PhPH~e!rX#6N+<0l+K5~SX%DRx&M|@J=)1(>kjn}|A0pgKe;1%M6v}m z(9VNFYJlJ9fi+Iaz191(XwfW3*HB+qW7!=UyGWFs8;D$cAL>Xgoyl>TlxOufVjIrz3Mf3oAFX^Ii5WG; z9Fka8YgIjB+sQirv|Dn^y;J&@cw0CuZ}@ULIK`QB>l!{_uI$zw{2u^RK&!voh)sht z+ZH5bbk;!B?(Lu4Y4QY)z5XM=4V>YgPy;VqsR7KmFxBO-OJZh!Z0+kjBrg+f(RW??$)R3)Anuvv%LjBvv#yn~}-U=~HV)@Fdxvw(>-y7{QR5B27h*I&;0VPE=sGt1p2X|mn z(9JT}kBSd?=YEciB8VQ%z(EF%XjAvN_j>oIz03aKKI%T|IqH>1rj1M=nK8-p6nnzG zooz{%MXw*_h$Y@JY@~anXQWpi;2z)^;H9o0Xyya%r_-KJe>!7(`t}Uji8AaN{){0R z3o}+{tk3u;L(bsq;z~{lXAryDmcao`I07|*5#K$4H9~FV*;azhHog&@=`-h>iJ7mR zc}tR@bh=y+HelrS**fiuh^ODB1?)9eunb%$EMhFw&<$=r6m2L2M}-|lp(x*0KpF9l z7Dp-Pp~Yqp&1x@Yvb|K09Y7tWiLAbUm&m`|p_!C4PZ~)}!aVMVj^HO+&yi7eZQUW1 z7VkpoP%`3O!-fs3#|>cnup=V96Rfps3IVx-N-Kl$iNqw!P`}tD!4q z)z{6D^-~@!zkU4NRnul7XnjUjEfvaDVYxJz+`D`8@cE7-o5%6eJ9R7OP{}Z z0PDhe6;K+2|=LEIE z78Ru6bU4~bljgEolC4&YQ%&YEkA~@ZydD%2khjMU>IG^T@7M>}V_VWJ5CBZpEItU9 zh|2M(Zb{|{G9|mh{^WvWEtw{_;T>AC!{M{%+eyAXVz04NJ8x>|VD!W!BP87~;~e#iFXtNPR#Y*KGGAlo?LYHc@A4HrTN$axiQ za3n-)1<@KV#(*lwvLTw3Wf&_1j#73K$WYmJ0~fzo`^1t5*WI@aP9|P^KsG@oa{=uWbTtf8Mla_k1@j?*n14<;7fB4L4=SZ5|SElI!msnuPr*e0_*>gdfsNwV&PAX z`qg^U>$rd{{s9*39dHw$v7nK6e)hrI2+^pGc1S`Zt#uF-XP6W=0g>!;O zT`09b^+51zDN`M^)PMJzxjaAUE zw%|0J4Cfxb`b^??4ur#y&q)wnmG4JVyi-$3O2c9fR1#MjC8sznYEZ#hr#3#24fmiL zh;l(QbJTqEFjOK$%(tRj$t-%aFh`!Po}#v^Ma&Z~swxVT6pZ~yf6*!hjdXFjkuVO>6rX|%l;x06 zw37jdK?}tXQH;lQ<4u>sOAqKG7&doo98Y)wnjj%ad3ykt`QWodM!>k{-Z$6exjB*S zWo2vLd^6!Mb}M1U5=J5JD5{!GwN=giuAK~yoyPSRnW^n@9VB&em&k?<>+{J8j~)n6 zc;i44rNUwT)#b6hcj<4F;kY#S-M4YI-YT?T{5A2%y7w z=U5l#e$LJ^rUX(HF=tR9%jNW?)TEGtl$|LgB_%ntf0i>z_9tgyMAEY7ipxbJR^?>x z1k1$38pRX__wf)!@p)R__`GR(bMuzxtW9(h<;wa6JHW(pIN_=@sMrjHUX}p{)-<8Cpn0jb*$(h5ZPROk6G_7ZHU31WJV^L%Gq*4rWqEpzkD@xq)2$%8oUY@0@!7`slL@ zuhviK7M%0?%emKFUv>4M54K}xQ>da=yX#${J>!N=Q)j;v%09Sk=Aj0QOxWA{%Yt(K zRh1JJA+}#%teB(YDsIT-`Zhg&Qn(Q^3NQLd8+X65HhHaUGkQ||gYqH$(DWTuvXmTi zj%8r-Kv$#CsN65eQj(OKnv|M4kmS-VLCO&}2^*Dn=vyWsf@{EQUuQ?S3vuP)B6qmM z22}wsZFsVl>K@Ewt7dhEtyNQPxWQUSy}uzIa&OKUHC<#BfKDSZy67wl?xh*N$L|K1;)7H%hLQ_g&W*WtDBbrzdt7IITdQ^&aKU2|MQY3k6lHEElK z4JN_o;IK?`X4&krCwnJ%7zs@BS!qej1K1xZ0MF}i0t)Q~c4Fr!^#39XFGG;evH^1# zrMir550Sq!6CfHvIBoz%kCTjj(^j-i8(ea8^{N>!#E#*df80|tW@=g4?X@HJ2<_>? z*Y%Ts-m|Ldrm9>Yd;Mau)j8>{?c4X>?6h)>@c%S<24-qP>$NLo0i0fz==2G=K-dWm zM^Grsf;381vP?*p#41Y0s0f^=*KaAXXb{XY#gBP<0g!+hnSVMXV*$ZCmi3nXf?5fn zPZ_0P_LqZN2|rUSDu6{Y^5c|1UwMK>E`C9}Vt!gAw4c)te6Kfr58Q7A?pFi%3Yw=y zfO}EMlKgUkd|3WeX8H1ZnaDCqOhEzuBVr9$jq4}`-^A-T6_|+W=lrX`#D6rA?8VBQ zocUkkZzK4-;bdm)Y0le==VFg?$<6@nI|SP22MafPSih=%lca_6Li2s{YV&=mtJ4%Q zRZMfHI@59-Iqn>9PCt2!X$qU5Og7!h?q*Be3%q-+d+mR)ylwy3e$sBG>7t)&o96SD z`k;515_Y8z78NH~IA>K&5>DdUmc+F!*EQHi5%>+yRJfe&oJ4$nKZPmxFX&JDd$OBU zY*T$|0pF4YtqUyO{4=fNlehQwG#LIOp?#oyJr3?Y8bW1;!7~&P7enI9Aj}0YLQ+=b zXMH-DVt4WczL-YH(x|?9&*%E~mpb-8{1@=PMT7KDd^?uEe&W=@=z)&Cd(VEOU(hd%4Y$KQxv$7I@cF!!r7%IIL{YPtb0>si5TpnKETtsN zfKEa7i${!5?Ln=-W*KjpW}$N}%PoXMwFz=BW+A4;Vt4Rd*nn%}&lPaq*=XMmw&60N z;%jc;l^S@Z2{*vWf5Yn~NL+qzz&WH6=jffWgF<`kFeyJjnyiTNIQ1cb$8MMtMRyu{ z&{`Pg@lQuC=jl=jjYx<`EqfHd z$r6TjdACK*hWLdCFlc0*<_U_~%6j&s*ukg z;+5(GdOzJnHz~hWx6^j|4pm>HN9jeCUa3}4G7n-M9BPQx8+Z`or&^t+h}afC1&OCA z!U`-dsLaU`<~KPbz{$~8nu*aS$L zgdd4@lF|AK{a0YFV~ym&*jpD@kmm37QLvJ~13UPl@Cp*pm6~_F#8JY)gCm&qug)fO*evB%brD(2 zUQo8Hdz5zdta4s;ZD#A0&Fb6AJL<=zlYOKdS5J~t?1b{AYFVT#R#%aS*ec~Abv=>l zOtZ+XY_>8-T}bX?QYEQkl}eR*y?nh=r%G-$-x?-Yu&^>*jaVhV6(cH&nnJuRRgwC( zM|>bCRT0dRR47`_g~sMDk;luHu!&d3EUkbnS+iz`O}v6jPiuC5V3H|@Oq)n5k~wxG zWgM}Ig^c3-9{Yzq`~qa)!?nRMil51fQkd8nA|_QWqy!ELbVJRI5Hl#1BFR20wzgqQ zEB{5;b~4N`5L2QF!;o4#AuJS1nzT&D@}Xt03WrR7lbN)UVVV;xf(8wd28~dmj|axk zjfLAddoLvCA$!?Zc1V-#v4&Vfnb&QHQ~)m6yBqkfhoN~1W&25P(3b}!)dJ$>c-JnI zp9lR><7HTs5CV+=*Z@)!h;=-Q4`3Bb_@LgS{{xc0e?sW*rl-!2W-Bi&f zEUEF)9D=eYk53*Xl)w@94_%r9sF3{$jCAZ%IBJY!DrA_Wkw&ZKdrigia#OJ}u`9iK zVYwD6fx2iR)hHWH?}MI=?VX{JfHqi{Z*fO$p?M$pom3)}#CR;S4I7NRpe-RA~^&mWGoeX&lj{ z8^|O{NhWDhH5n!SR@x!GM~;(I1t`Q^nmmd5xF;+_v07rEvGJ-HAbv5YD8P3%cGsqt|%Xio{HkAp6+50t;$qdbADG( z!P=M4fgcNlx7bw*nppuu?*JZ`1(rt9jZHKd`RS6)J*WZQZmujygM`AyusXIK5Q-ny0P>tb7*L2;Oy6Q94Pia3#)*R!%Cxs z=lZ;TL3T2SmT<>7>~@uC4hIv_DSCA>qW|A`g}*3TneQJL)twi5`GRj!i*w8(4`a`> z3z#sVPI-cwOolLYEzeIMM88Ll%ho=1^|qPUzW(z^_kM5El~by_xWoSVhkG~nw!3_T zzauZ1t)s4<*t}Get$DqkFNAsZF{MEL)@+DwjPGD}cz5}C1^89^n!w7~26=;HlfKEj zIU@2=sU#fnM!oS+$#sF78SzF2<%FeRVynZe3s=YP5H`Cuhd0C?5_TwCT~7)J{jd0s z`CT=U1+I3XUA~!F4R8caXTHUJhatuOL^@sU7Z{eusR97M>0UhjKx$TEq=e~+Iccg3 z%`u$p+me(@6@}8cX>U1l=SS0RTT8i7-deuAytBNkoR5{CD#ztT=`IyH)grZ0Wode$ zr|e&?1;+KnARuF={&asvA2h*kY}{hk@0kuj$+T`!;tvS4V#^QnRmKH`u4HW9j(n7~ z*3g13H~RX{>n9nGL-*`8pEYkmooFg*L~E-{&BL{|#}6F%;~$?fY8ST5x$p4IQNQsf zh40s+yU|j#1Z^=p%!ht<&ke?;pMBr_dSDO?%{L+bwstIDJ8yEV)_*H2tE5$- z??pFBn?f6+yyW*vs?#yYag$@c;{nHy9h@Vksa{P}ovKd@_)9#x7qxo3yx8kyVsUE7 zVA4KDbkJm1n$dKChHppGUHm@&DE}r;_>IexD3+{D;$+-+p*<%qM2yxd&1Y+@uyvlA zS^gP(bIS#pdW)>U9Du2hu`FHi`vaahI|?V0F4uW`Pj1D_{_;-eOFwU2b8V0Lqhl-P zUfEXn`**Ibn>D3)|4HuftY6*wliwAL+wipcCshA*E5cpYTA5I9LIykd(&{b zYqglWR<<5adhJugp~5w-Ru0mKr}i7V=HW7=Z@fHSt4>tII8N0jB^r~D%TFd`t6FBK zV9wQe($=5q?AY^USKxi#fS*{FMYB=UP%ONA;Uhz6TQ=5(l5j&&uot&taIAI=iw6hf5bXoXAIuI*S<4av{xh zppVQMGI9U=dm*(qR^=+>0zMcL( z`XT@Cd>`{?ctulH#9*PsBdJPEdxOGVi?TSg0~| zG{lCeBMART%HD4|1B>c<;x3pHzqPahjpz=XOweRm_5G++@of3Q+RiX4t-R&kXWx2n ztv3qr$7ZTz%f7&?aEBkyq>r68-gZD=cgh-~L}Q{|V!SBRA6w2CW{5Mum%8I$6tGL!ksVHR18 zV~Fv>sdBG!ugkBh?=x=$b3CSg&U`FMPm>>WPs=}1pC>)s^YQ`pH6o27 z39dqpsXNL2+)nvHRm|5vMC8!uMv5Ls+$J9qJOSbtr(bzjkIe~p89vGouc2oO&oW3L zR)*19GZ(NxD;!1kzoZZ@);m<$!vhKI9U5bNi)GZ<1r{Ll95+Uhy^11BydcCx$t#Ky zQB*Zg7vV!#mBEOpEGH|1B=VvlaCsxKh$945Sosye3wu$eA;bL4oS+Q2?7quF;XEnkm>Rj@_KTYd@tE8cagWrA7rhDjFaytJLOl&>++jKkg>!o z0xR+gVMUICndKM>NO}wdJAxBlQDO}JcX2qFHkd?U^$G+2_Ju>d;qhhpCR)qu5yKiR z#uw-&p963eHz^eKDEW}6(uoMsnV_k!Og}t5V?Sdm&Sk;AxjLQaL>&hp!lko>;sm?> z)gj51mB+$im~2{ctD~cXSuq;fE7cnOf0*OZLX<)=bh$YW&UTv5n}_irK4O-k-wlo% zbfB+I&Qha6?-sz=i_9-+E&XT4#Y**284;FntUx%za`y8WMqXMhr&nUUKxqUb0x)`5 z5iACt&Tz5_GtrBefM28I1p~&2^7A+V@6F@D0pRp82KVB?A#@J#we?7Jd}yURq@M`t zgLVTkDQ}%;PS~;+mt~f&eBMI5Fh>Xowr-h5dsk(G@6%E<^JMKgR9s z?7LySFQL{hU-IG@>22$f_uv#szsmsxZcOiCVjW;is$gJxATR{6!&V}D{D zhaG-C9f6<|kyzG(dP!Q~?sQcfXbRtqu0hNAi9{TWmu3Y6?gK9Mc(*vO2^78{9DIE13vWyJ%97>-7iX7U$&weo@R^Gq%R2yNG5Rd{h8rN%_#?q0C!vywKakMoP@j6 zHsz#0Q=p>dOebB3(RzElJL+ci57vD$Q}4(Nb^9qswQ>TeWzqseY2(}EHh){Ny?|@U zF)dbghN`4oIs*fi_IUurp35|CM4?-|Uoy?XzAK(H+}WwCTW(vwWbp>>@ZhNj%#-F< z<|*_2D{{MV`A=po-~IH#M;@jaY##Kz9#%q#`J*v=fivgM`IkD|-R=H0!PTK{c$@l) z{z~w7`mx|={Ac24p3i(|dCxe{INvn)G=F0-r?#uYcz2DzCdjVjRysFw8=RX%Pq_E^ z``icplEbplNY-J2PjA*yrO_*)!mO6hxoC$GVPqIHw@YCRxRo*BKBnp(u+zf;dkDM~ z3kZl_MRBG=qffN>ET9D8h!FRN!V4yzSDUrW=+B()&(MNo%ZZGw27uO%bsfVxGs~*R z)^I$3PH9F)n}2b9dsh3Jb=Nhw`H(kr`oBIi|APGeFMW*vI%dw?d!IV8>xyL+KYIxR zBS8Wx*+ad^To}8n@^*8NG18smb8^mYTg!GZjkA)pys)znk7u*$cwaU&jcrh;`5HnG zNs`wx7lm4l;ZOvJ6Q)8AlsU8%qL$)xGT|-McH&|vx}fe{4?E7-7Gt4EI|FHDF2Gi_ zcD`M1ciYy&x8&mS>U;;?Rbv9KIJ(eO$W`Xo6Q5gn$o$%TsryzG8gy4Q+N&|y;pwI(YA6Wj>^c#Ni*r7*uLw_eif74(qUZw#3xR23coir-74@o<;t@;z( z9{G9cd961rie5AYPv#rtS%pt%2l<2HSLN5#WAeM|S>a1fD{vP04Db*>!{N$0eJ}dn z@UcG28Vc*J))9af|IkpK4tKMo)qx#BHw`}rLy;`1a$ACuXv`LtB+BeIGtzE@1y*Y~ z!JT$de5k|MUgUPuz0yQ+2kCGZD*_Wo6+YXDDhd}BE-Tz!ND7^C(a@Y(81TF|%zQ&( z(ogqldxJ))w?1eTI^h5=I7of9g{SHVtwe+yz69K1r48XGcivUgwtM*2(|Pb~{RIYI zaM#i=-5sFKz8*=w*gBmUueacF?gaIqE!M|73>YN`{ZI$}c!vRlW#c(ZwzVRY0Z3kD zF=3j1aN8aD|BR4;2u(w`y$-*?dYW}zC z>JYlDV#gx~?)?yKA!EL39$9ne6!e{&*G-!AUFtW2umC>cehYZ0*BCRFpmGw^W3C+O z400lQF^GMB7xudSE{Dg-=nfD4B@M46Iu*1?8B(x9Cqm|t%jri$e&na8g*v?NDf;^x z9! z5+~V8RE4Wp15Lt{*ejelZ?0s1*?gF)>zrp@XFcu-T9to7Y1N1(t-;?^+A!jjIv9}e zhM29Wno_Q6X@@`H8>y)QKM5Ao6>z{>0hXaVT$YjaD5~9-mfH&;Sz@=Nv-U!ed=V?~ zFXE`fDRQQ13o%EIQ}!%m$N>+8z#px-}C8i`k<&gAL2SJzvXQAwwEj^Ys<7(@HEN= zIDcR`?pK2g%NuZ@I_~m1a54r!!E=E!cr}_RMoZ`4P*dX3)*d~!=4ymq{ADK+E?)lp z7W40a8n~@>$=#clF21cXJf!*Hd%P~UhxKCQ zq=On|1xc2@J{gFDBBw;jh!tn|N@xf`df3_#<4+W4?+JDV@$%rQApRnVf{Zui_gQWW z?(OoSQ$FMi1?ugA?^uz^OO4>!nf#fZMF0-i4`Ujz;FVaH7gJM!P>6kC%2_Mi@$@Nr zdef1scFl^KCu6fOYP_M!JPEMiTiNLJv zVk-uF09?u<=J|g{O zfc%5!W(qUKHhvAci|i!3xE=fsVTULe5jUS98Lpf!7s|y7t%)>o@;TLuEU`RMIKtEI zuvF6`v$Cv^UVOa~<|@S6A^{1DHLRpiCxfUME2P$cKM%1jMT>r>BM2)>wz3kqu`SJ-Fe_SYjn1(0V>1e&sc513AiCZBjrot;xWfZy(D%$A3|@&o z+-yEGyywiC%{i8q$S9+8$u)DhliSA~<=*7JumwcxxGuQB+1tqgvm$1A)__m_+pOj1 zDZfQ6uNPX&F#LA#ifJ^Vk12z{-2$HlQAqXiel^Qx#cVK}Y`~X_mj)Y>YK*NYnRukjKoeM`au77B7z*g^&9L$-Y*=+;`Pr$QKTq=@Yf?&4v2C>2U zna=T+YjX(>jaL-~pejZwKV!KzVBmBw*nebu()Hh` ze(f^AuREZp8nB&h#*|OdN%2e1mp<|;{*=S+5EqhgPM`0Y@6QFd;qCl(ahuvJy@P+x zeIUJ~p5#vQpKAIZ@z?nO@h^+7sN7BBW`4cMx-2VH0(6MHMDW%M;nv9V2#z@7%s1$X zP4aBeJ{{M;4ry=rHM4}vbn75n}zKV#jelFy*enrupj$uCQDswoTDP6aSit?|F zc1C|4Or(C|-#D!mn`peJoc02qLRIiSYUxa#)KaQ)zSnmmzUtX)`w%t<`W9@N1yk(5 zyY1>*H+*}^CYajhYs^2GgXS6Yy~cTipRs*CPe0tV=TXX4u7JK@4SjbpQRZQz#$AWA zTGm@vFby|o4c=)5;_@OC6@7thj?2lHYx6z1KrTE#`nddf!CC2y_N7;KF^&iw1fuwC zQZG1lJ_v-Y&|L=1H05$xq+Z&hBRyPX!=y78^#Am~bU)LPAAokQU2gNV2iikzQ5XQ^ z;w_M4Gf|3iQ1(1cWvA9Ww&=i3cOdrYwL9w&Yo5COnzqgBue$0!^E=o-dCsQYNJkK3 z7GCl2KO5QoKi>W5zP&r2r3if^!>~2h>_1_YZsU;TKy$b@?k0|{a4&Eybu4!iS)$4X zyhR;SalJZA#cD5JX_N^9tZ)|daw#L}Ql+$9B2svrd$$`ea<6mmb-(E*Zkd{E~!_C{Cwp)ap2`{#F+Yyv(_zcu-5Li9{kP6eo-k z-&I$6SNpzKc2oH#-}>?$z6Zp*WL|P4=z|x!#VshJ^=B?%H8FCsI^;#MxuTupPR0xnQ7!lsl?cLV|*^k1+GEufip-(0ZhX21TOVx zDlQE#B8W7WD$QXOZuAJin&5vsC2c=iIwG{-{%guP;=Oj8umlOk^!#{FQL%j<3R~w! z1fE={p|Od^#CGk0#4i$WC-`_m)d&eQc~-+zS=sWy$a<8gz}9)9#7;a%A^J1ORvD01 z)QL_ZmI1q`nge3p>G8vz2pKaNf)Dq{sH^z+<;(_g$dh$=Fd z%_}Xai21y(ri%#xoe4QE5}NFh_AzSt|r{%I*A2~`?-kXXJnt(D@(k`oAUV> z>L49{3n$r$j{gHEN#Z$xB%)Iy68|#=w1dpQ;G-5h;g?ELL4)_awt<~F{z&_EPfbUm zqRZ;1tSCpJ-Se)#@~N%3%M2c0JYm*NC(uzKRnSibkl;e-r-CAek1GvVWCeQQ=|Q9i zpjhwrKx@&tSa^JP2SGfmh@z}2z*(`I4NGA;!HiU1Ra98prwo5ImX#S!@iHN$geh0D z%y?xZBjqdUGSXD*y%Z^sC5Vv_&&afbM+;$gW!!Kpj7$_+k}yU*JeO)|?$`(xlx7vJ z$l7B>v_K%N%k}asOV(LwCQa2HFB%w#;7 zn<7k=Rx+!|N^X_3N?xgMWHynF+$L$0yit9Rd5^rqy(7IRzoUN6d`?bqC#28i6Y5vY zSL6(LRyZSlC7)48{;S$S%BvlG5>-3UvteBWFVR`MK-ch1QNxV9sA0M>hKd^gFQEc& z3l-!FN4*16wSqWNLiC48czivhz{6lzz;E3ht$kuiwW{56%PIP+`5bTI+4Qac8OU8o}FzKJ)>4 zM>wT%q7WuQzLc+F#)(r<4*dY#B*-b05yqnNLL-_cY*)_mX9cN*q=a%gOUBES$V~ZV zB2Jg*lAL@Exn5p{*2oW#t-@jX9rA%ZAZsiU1WERj7%7*lNWI)hBp(UMz1b@Co^ zh`cVJA(8;S?QsX`Du1^J5HeK}7(UgNMMM?|ojGVkOYZ=$94s4|9kMoi95fH+pnEeqI#y6|#EL3p z%`2j_s-kt~z3B26UP05$?P#;P=iT>l60_z9sMwSSe}kr)hv#JprU?{uJQuU+_30r3vVS469wTw|PHk%ii zcz=R1n6#} zGlz#@wuVkU$Lh%10iNH?`KjU1T=gE^6M};~SkF;2gA>|z!+CyVlf8%p2Me4iZ58Sq zC}W;QNpth0l1Z1ZYo0wbbV>EqSB79gIq=^Ha9_*S7bRRDXy47z(N6&DIR>MzqZ#|% zuM-65aL5>~yRtHZgMdUCe~He@xJH>QPgWP81-Kox<8^NFBl4#D1v#z~xq>_*JdbZ= zL`Ft)0cC@SLKW&GR)}}%IwNl(y8&RvQlr3fP-ed*SLx0?KzCX~42sa5x-;gibQ;ce zPTm=Yu|EpD3A+Wcis@AEp;U`*2Z8qx)Brt0nQnys1I||g=et&Ye;DUea@CSqp`Qjw zK-G=(%IUiP%nIwbN&azy{>}t#QO9r|5e>a*IHX_}IT^VUT3Hb3Tv~#YT%L}B+qU=J zVu;(aQmg1HJT%MC{V#i80^ZbdH99kQ(Y{NTWXrN-%aU!`*6sz2Edw@YHJHU1F#Arz z;s9YuSONq{2_a;GtTahOnzY$Snh=t-Y3sDvAT%!|PMfVQSxD=o?cXeaK-cfg+$-ax zuiwk}zQ6D5|NZu{q;v1wd*{rVnKS3ioH@4xB~rMmT2u+t6+=~(@H-0e{`ryEL}@R# zQd)l9IuCyAclgEC5e}1czn02xQ+)}-t?$dew}t-@dJuJOs6ivJGrh6admp}Eb-(65 zlTd4|%BjlbS`)2F;wak{ypOw2_@VBHhKIxNgw^YV8xvP1xuyAgleZ_hCAKAwrMX;H z&Wz*|Cs$>y&8_uvrO8@SW#ppCFc%wA+f-FuT{C<{Q{ifm!4H}DARLRwYqt8Z?;+P7 zwXUA(tA-;b_~DXQOWrHtO2)?N8Er#sb!=PgK#Y%3zZ$J)&o&yFs%bgG$ZhGMb>86)o#mj$nr}XZ9_u#4kpiwaXtI^(pHTgvSfUI0zfiPofzqE=YGS~w8oGzomX$b1)x|jThh57@Q_L|R{ zzsOKYG`^R4d6_d`^mei@+#hSl&s<2HqNqxI1HVK1D7 z3nxn-y|{UwjM8!}<2txCY<)!QpFvag&sEc9h2I6EocFP69yQPwg@#};WFKybl#aHpyWCypQC79FV)Nq>Yp7Nw>oT|}1_lvM_9F8q)Jw#dMNqW4{w z801|Ubcum2{Xh;U`4{o;Sroi*+RY)d4b*yc04nWMj5zWZMi29H3>-Gu-b*7j)yW}n zPGURUtChZ>@v6w1_%q;!7EOFo17+t0glX{2A`R%nA80k0%*7a=(N1Kp@ws|oF8_TH z`flC$A1N+$X69DTw*LQ}&ULXUXROAGSgbd&5EA&apU&PeXMC0GR`MpnjsDy6>dJ=D zP1hFhufErz05+)^(9AmCwmuoIj@t3Y4f79n2zF`(^0!A zt<@(@SL@H(@mvkooN+pl>5Mr*@I<8eM=tekB@YuqMi$&dLw9~igMv|OnJzf>f_j`e z8>X|A{X}<$v$4QHIn#Nb_7IPqun0}?k>@tT*x_gXS=qR1G{j^!uo?i_khx3OeyGb? z5KkoH;AbHEWu;01+C3)EOecei$eJ)rDmu>7N!sA2~RX-!C3 zh^xUcsK3KK zYV_p^b@ra8ak2S3++#+cJ#B7c_n6UQG=rbXPe3Zr0-T@+gir)kqXskzwW4-32Q5LX z(B;s}UPv!kddb8oQ)W%ya79hs>a`{1a~B52wdmC&(>&;6YUJ?+>dFIw@;Yw1CmFSy z%`VS`G3&d!<}Yp@zGYKYeC2X$PTMph4ym68P&j*rH+ROS_qc_s8FB7puEI=`-Iu3siCStJ!X`|nn zTzZ1+=)X4eP&65jvy1TyG)(PSkc7hmqp{$d~lr1#Ns?BiCjR+5|6^Jnzvj9PnE zG@d0W())HVj`Y4uTbJ4Iv%rT-78N?|zzd)BzVto@CGVG1m%@LNw&HDgyR_}EfBP#u z^*OX2H^EbByvC8~;6eiq8LAB+DRegBM+LDP6qR;@`xqJdB$e7s?TT)4hK48P;0Cf4S?=vCTu$EOuHw#A8~VTw=UI&*NebNZDV zTBnzHj}DmDgMKR-@-EZ#=68 zy5H_K_cDq**K}GEfK##)kzVuLy;KpV6w^A4=de{CN~((0CUyG3g;OV7E}h2pi>@&} zu5DRrsG9MgKUuWEm7ki8mu+Zn#GCQei`q?7UQd6ue|t??3^?6`HsBC97Zfm0TCYLk z8Ke`C<}7>xCAB#6$|;}*@}>U7jv{MywLj&@p^a0f9T!gdq+3WU`Ebz#58dj-vA+lJ zfKg#q-$(o?ei(3|07cVzLXXcGb*7!1)9KIep(Y(M*^g=sxku4)?jg3GizA)A)Fqm> zPZrRN?k1}QMZTWcvg?=*dk&ej<(Vz@!?!)X@ycheY#6@v>5Z4IS+#ym*BXA<*!`z= z?s#?o*s=Rx-Ldo3{;?OXJ9^jMM~~ip*HPM68lZ#xlCOahmOh2_^p$8jHFe}BdX-wO z2Pz)LdQct{5oobM%PR>W#P7ElInY9AZ0=u5AC=;~IDfJ%VCgH{&;n0x z0VB=NH=qFMg#OYz>~i6dh^-ErP19rc`n<&J4F-A;a-cxKZ#_=#dfcJ+ALX+Jhvo@& z3suWXACFKz)9BMoGhmDmRWKYR>qSLpSW|e}uIDeby=7D#&$cg$6WraMg}b{;fZ(!_ z1cJM}ySux)I|SDRcXwN82<|+x_x_)I&buGpxZ}MyR@bUo^_$jncK3%K)w2XUI!X-3 z*Qw-7xba7SAmo!da#^o%n2s*95=AoZYfgPOP~){80HMiKBS*uC7q`zoQn}iIaJ93m z;EGhO9m~5>6S=Ody#j7ezK!$>l>T;N=R?%u_zGFNSFev5B+h@4uBWfLDy~ZX9>n=Q zKK!-hw|@SJcz&9&(a0STWKT4o7)Zp=al?Z=g0WJssuWAppp_@RvwX`dm@`#SKkL*Q zLmX>76Kw8ru?2vox$B}}03+gykjh(hS~hIWbne~`L)$Dd`;@;L_Y(-_99z&=5TV6} zS5sTp$%*aUCbn(X#Z74zOvCm^)qeFR|IM6`Hckfa#M7ek=sPS&XDZKY-`6n3gV8R3 zDcQ0h3JPWAcOQx)KTGsK9to=_X+8s|+*ZQQuWp7{STa3a84Lc$dfXGhn_eu1W`55Y zE3YE(wNQOFqy2(<0DU^gTRYXqLJaMQ5QXsAEnis*gSy?EWX|&D5mz}q0+O}Xk`4!5 zmU-O+0*B-C>%*;jpN6%=#?LzZC8OG$m9kG=jk6X}i>*-fK*RRny;di>Kh!Od!UD8m zCZ(a}5!pi$=Z=qIzYd(@Q9<-j!2-mdqep@w{F31m!kFqti5-63Vv~D}E<6wY@Petp zKFbEd!c=?M4(L-tIBe7`WMz(sfLNw`oH@mQe!@4xl`XWnYSbj&{-))bwRch?-zy(o z&&&CfQsf#lrjD;Ol>LseSp=!t5-|spC+mC`8&TgLo|ZHiJ%3~71SvUBRp@!V7BU;~ zRe1XroZdftbu~40r-@{fa=nWUZ8#`Y;}b6HdlZU_hBj&3JYtuM9yC){-?yUZy;hIY*D7tT z!E6c2U?YN{#K298=Z}v1GfR))V#}j+rLo1lD+H%32RRX##Z`h3;Z?GsTr3*xKzxKi zu2Oz^Qujz*ex`D=9}G-VmjbK^U;p4cz(_itFFcRwXOF(A1Y?PN?CpGG&w;xjm#h+qtOyQdTHUl zo<+cexXt=GpUe)4@d6)+^*TU1tc}3*5}8}u<4J28l!T;dBrmI$OEN! zI|&Sd_Te|jU@!k!7dafoA$Q=)LD(hv4b5}mH!zo=v~*df`) z6=->EmVDeoDe^P?3^{XV$`yfwR{Y2&mG=kGo9b(}6XgIll|!7JLSj$e$XuI@J1 z^Ji*n+7rc26u(7v)Ch9pR9!_yd;4B(t#9n<<0g?aC4bb)(w60?xp4hcaA0rg`=7W@ z0iU1r+B-W5Iz9L&FqQAxkP#6evDxk#mx+faeUf|SJYW65ScNq$>%=>5OQN}FSy@=S zMCPwVnMWRfDBG@%xpx)2_+mOK-rG0a$tG*inDN$!dGMi4cN6TAZV{lr@*y#@SQm33 z`bKamb__GfJ2I`AB`ZpuInjqZ`8*7;n{Ia1x0?^3guu?uq0f{f4f%(d|9O~q@~iFn z6LHavb^-thr(Kql7E-f`HhX^On zZPv_+h_^6&B8Y%}Rso;-7=OUwIDL{xo|y<1J+k>0X~x(uwc@9CgD(k{ztcOnYigbj z749cZd@LZx=84SG@FSI!a9}^4xKeA@8Q5nz^*@TOPx9w7TYGN0X4p+O?fq|X z(ofTy>~tFJ#~5dID29jW;HL*EQ@5v2Pnd+iv$4%iLp?D z;L+5mc4}1d!q|?`#~lRrc1>eRnGxCKa)+uR7EwAMwZZMfyyQ(a#<{u**I+-0vW?LsOR=WdM_)`vmrYv zEPXnBPnDP|`{nU59&ZscY-tJboIB}4L)UC6`HSYC!v|5N?FD>CVIOi33X!u{buetV zrmGsvusW$pbgFQgM*bYj&F^vELCO7C#tDN7unu-Cl8NAYid9Wu5S zd7vJhN&LfUBM}%vgR>>zo1(?qQjwSEVdY-c+|nytq|Q@sJUdwf9Uss?vqr4b_Aqm9 zG_3!8)gozobHkA1xQS||^CdS&@AvJ}RGGD|09_eqoaF>=1Ad;pK$Iz6Zk-Q8p)~V=Faz2%yPE;Cc%k+&@I*$f(;L=( zaJWSJ@?EJ8RYf|h*Rm%VJ_+k=q2Vdg9ZKST{py6 zH;t{*7Z)F#t3teEhsG^K(KqRrwi)4{zFqH3!pxyscR1~@98fG~7e4G5_xjK5U$h{# zn)Ms*lodN+kCOr+j$@;IGK8!U2l z)NEcHH;0G$*l$Nc>uBKA=XJeE-1cn!{-QdO*t@}Dv8^DS|A=XopSSK(WtGXiYXj_7 zYKu)L+r{EVNNGOtj_~r5SZNyjM!QhM(D+%pT8E&TvPf;#&-@d?L3e7Q<29+9mVgv?1p^aJTwY+7k+v&Zj7MsfcUDK&B~8*g8IX6*swR7Dbj~4-Al03yhvt#2XD(NU zwOH>JepMZy6NjuESdD4K4Cm8>sYKV+o%A4ASbVHf)5LLhJ2qoQ#9PJhU%%&r-OwyH zM<*)z#WX7;y4POgYP|fxZx~t_yWPJSv_BziZS*A(;6M*x*6X~VPCI?GJ4%8J-RgWp z!bL3>KD0>_a&WeEe;iaFc-_;P<$YMZFS^>kbn|&8vek1QO6NBbc(5~EpHKJ+T;soY zNg~h{T0<`;=C1enT$*hd2U~8t-6Yx~V<^hdgh}wgfnTs_{;jU~^H~X9^0-uR>_*oX zqOBM1^W}zBfD6}XDd1t`=zh<&h@A2$ELJ>*!z3_dl$Y#DcaZ^~#c~kt5zlMs@%5MB ziveyj|7_troqi#FM1US9baStzn<%6X(~cVp9}lg6_R_;6t`e#(%vvC~SpX}M6kp?H z>7Ell#9o%hnBx`VIG9mUV=6v{8vmg1mckxfV3>vE)RLPa@_)%v2z z^_h10?6YL(B+mSmKUYowZ3iN)c)k&QqX_1*3iPFjf=DR~)>=o_H^m$;K;pS>6Rl;X zFVt#HMl$&N%#sUTvCUG%-3L)Wlm5q}CZl_8SS1LYwwa6hXkYh-oaH>x2yAifqtK0X zd2DL;FszbUv`(|%(Z0GwWu)xD&CI_n=0siz9b{7rVL;Mpk8=W_E9miu1}aDB<}xK?Tb#U3TeeK zG!Y?ZkysNZN3sLN7;Z{-{gpy~euT47x@()R(MU~nvf_OUZ2g?$HI~Wm+T$!wfUN#m zOW&Z!%FBIa8S6L%Yi~?;chwbH$*S|9)$^{~*=+XXaiYIg-zZ3Ev&GqHG%`P%V9wuY zB#+NyAsuWcv08YWDJX=i%@Yd??O+ATD|5dnXw$sf9OFyJb-+}C$YJG`S{SIW_6d3K zG?l0(x*6#Y6*W^>imgqTVc+EJS2wLeq57ELDl65us@O}PH)i9fE!1YkY;tdcSF(_Y zr7C#!51)McV0EX&)j={H#k>)f2zHG`+$(mG*y1o)#CfeN(UluKpkW)K5d*HqPq9q> zoYPP=8iZw}(OAoxXw{@xSe(Sd&V!^+JdAO{p0w40G@p!P*#4FiDPifqM8ry-nx8EV z5o$_FgsiAc&?liV2_{!Xu3^IN~nmLwuieh#g40Idml?ozp;^R?CTmFGKL{FhHdbhyCq@QE7T!FVRhE7uidm-C&fPd|kue;{2Jm)YbkMZp~ zX&Csxr25TS_UD6Zv135@K(?yViGCWM;w( zX0{$qnx8`9>0eF+dPW>O(U`e+k?RuUSF7&I=PdNATNcQDot^Uyd|*Fw8bc$|1x01C zYR73F_Yo_Vk?t2z?9><4_^}Nx^dOU4GB->ilR}mZ@t3<5RT|h~VI@Y0j{cf_Yjknp z;(^=KNwJ^L7Y@SdV9M5?RXL!KTs3VP7eLkJFFNg(*MFZU?=nrF<*VO_w;~a;2Cg(w zL5r7YFm|4IO}##>t~f?P*Ngei7yYW=N4%Zb;&u?1-USUj4LdcBr{tb;t;iD{gfd4@ zr1P@o5ttoO;`(D)nFAk+l2;yp64BUd@M9^j$XYPNFMmiCm41C z44rCPifO=3;&C)Bk<~o>SVJ^{rwxk6)}bGsl$SzLEbY_CGd+XAXPjn6hsoA3ng#{v zMC(<~SO7V+jCLfkn&4Swj3O!*QYgNjmdBx-2^Y=y--#@x&f_x@=$VCr&HZ2p?|?{i z#5qbS^B<||JPSW#2`}IJgc$ohA&*rnnt3~oLxqo-bMHhmT7!bci>mQZ=H$hPcIrAp zAym|cqCUp{?(QbQ{9@=Lb3<2pvLOrT&_u)9ffw`lspLMmHhvOOf z`iU3Phu5yAawsY^&AuEjv)LzFYNYc;F8h6M3f~@W;<0$gwGF?eOd3x$nLei-!0_Km8Ii9xbk7K5AVLpt6U5_c0=# zWtm4`XH73NCYph7_F$aDO({KXE{HKxD~O4qhCmu*MvczHcov+NoJQvm=`~pWQ0K%*d^>EuPI(UbGBYJa zfgzjkgs3$7Bi$XHIT2ZzZ$ae9TBH>J>cu+Tw_OxOD0L|ob1ZN^Qoy-YJm{3M8OA%C5QPu>mVK!HRJxF`#g(# ztz?f9s0F`gXVL401go<=;{@akbtl+y>dZfBS|z=`A=f!+4E;$Qz>WSRX?vz9Fpdlg z7R0Z7Js4-H8TGd`$T5dPK(Cg@Hh9=iigY?^&qZwU$%D;yw-ebh(79G%d$rq-uQ!z2?V9niWX<4HXKUiWF&o`WM#sKaUPgG)q>o&vIj-=VpYWx?AE>De zy{XZ==MbVRj@~3_q*Rc<-Xs{rS8CBs%bU#TT1))o6xCOq^&@8sEIDp4|3%Z;R$6*2)9)3hCqhlU0HKl?d8d_ch-n z^pM`V^G;tc@*?d5VFTxB3y)(s2w>yUf5!R#(;@V>Xu^2Sh}nhX=#m$h&G^c)#k#-12AzcxC zva^s`F|~lXI1j$AaqVSY;i7upDXt>EiOc5<$~|RpMmX`|v+A$w4E6qE@bZp#@-}pt z=nDkZ_*TDp`%Rs&BRz%a!W4sXzB7JP8<-D)4rKZC_qY_s*Z3mxN#RgP)QN;(qbhYw zz=>9IOE95w8>;;0Is9b4M}uUa`*#{xOkEMCtEhlTzn+?Hx~95!UJFbr1Nt@?Jqk0d z^{@NE1da6(b$u>ceXQtb_jEj>KVBiBkG}Z7B0(R;FTUjjAjsIh>-I?&xqgM#%-4E% zoF6sjFWAPP-)Et16O|;izWhG!7?(Q3uG#0Fbei682R>;jn2DJs&6|^qh_mwp#GAJ* z(BR?1rYre)*beOT*UZVps|mUGn8JXcq)0si53$UP)BjkzmioxN$M$Zld)N~-_L6F! z{?5j9Z7{5E)_sHn|Ccg;8*A$`n?hm9x-j4jk*4EG64V{ABg$$GF{S5;{qZeb(?bsU z01pl8(O-#Y6LfueS^Z%^$xV1*;*3|5md88Bt1J47t73R$XC0x)9pfb7gEdUT2i5MB9jr56ZaNRJ zzxNaH0~Hk7RG;44C-9|H*!f5yAoD#1Nkk#7mx`Z)sQe8115vC-e)6SuBv--0+4v`( z6NoIIsle;8Wvt}5*)S&X%X}`LR;UYuNG2oc$Zc0N-7ey8oCbO%Fh)BLl1V19)PZ!3 zyPM=VTdrLD%bV!SGv`Y}5&>5%0Y^L?um^}rGfU!iWFlR{c>t-ALz{A70g!#)g+ zfo7pmSK@u~+{;~PKznmjoQcNyrm{|zJG=t?NE zUar-7Y<>6?MCF+EtHJ=ufgHjOkYMX<&KrNgNM14VL(;! zRzg2FIhklZxoQLmXFV|48Sjh<=@nWwF37m@8Cd0PrV<0=+DP2jQ|oJKjEEOsT^(P^ z-#Qb2|4#AR%7T5RRdA$ss$Ya4#vFlpOY2s8#`Pq)ORLHsWmlLKKxzPRA!NxSPo?Qf zW9dG3W0+_HmH?rkdvU8@&R3m~z}2(jo7TQN55gX-VJ$n!8uk)&$XcAGubh9ZKC+r? z#kMSzz0~~rP};u8xHxB0d9c~RJajpNKW5ViYpHechw!|jo=8-HdwBTTb@a16mp#59 z$!wRsFgI7>++lr;pmWrmPtF%Xxvt}!oM__FFlW3{KFvvuG-q!mg_?3~O{Fi#1ofqY zj3vYMKIBQ2K>1WIUD}qwWYqoAfp(I8VB9m%9o1~hYAN2IkW{INnfMgJqi|rMaq>~T zM|yELCO>;gHQiH(w(|SI+MBuumHCONbq_{-vnU57Z&Sk4h6^uUXUlYVh- z&Ze0IlBbW=u{#wH6~68S;~kp_Z`Oi&Ow@4G#Zlj3OiMlbaC>87ZfG*#g|&?$F(z@n z6)~m)hM24=0;_L5iTSz&Nzb9bcGIWT&NB>p@rCASdhP6a*PGxwCIsH@YnPP}cutgR z94Aa}I^+8fkm~&Oal32OCymEqJu|#rUL2+Fh))pl z_n7wx_v^Cvrr8e75HR zL4N{i8rrHLoRV!|iV}eF+pa9qGS19#Waa5mN9Y~8^fO8BHsz@i$FgdFr|tz7n+E6B z@9HVta{)AGkIl}kVr=ypGp`#h{DfVMjBHOPvY*zgpV(!9E#B(6rMI5royThctDhgP0EPZX0 zmFsP6yQ#-hGimHB$*Az0118#Ata|xw#{E}zWgQ)8gBt-vV6thnzwtG0GMVpW?u3X- z&O!WZk#ESc;nXDF)-0ltM1rgdHa3=<#Jc11S15Q>!RP4 zy3!8}kL;Kf4Yhv4-nDE|eT2Zd5$4Ee2nL$R#g(1F+Z=o&=qlm1T` z;}rt2WR^4-!PuTg!Lwgp$t_8+MZxvJ!^bzeV}s$3s-5lVvEMlw1S%Y=%(%`+8peIB z<~zpI)ArQy?%HO@;_xQ*&AsEYRiw>((aU2E`OW0x77R1-<5dD4C52}*?aAiZqu^H5 zkIjX0_kWT^Kt7}B(pM;mkFTYiSGOX?H)pq;o8_1T6UpZ+!W-IGZ*-NpbO(5iL5bwa z8SEA@Gg!qf-_*^OM1igRIc6)BCVKPdcOBxMP~ls?&20%buyX}f&8rHmrP|J&KIrSQ zYYOt?&Q7Tu>X{|$Vq(mwl@ z1z#7D#yDd>EwKdEYp^?QOiRi;1lzPZk60xJR*7>9Ojxxi;*A86n@tBDnRV2c@X`ct z@CfsPU)Qa>&)XaudTmzmbFFaJf9GL3=HY37*U_(!)fm_GY{2a>mp;u{tf1w@uTwh1 zFzz(bDKJ~ibdh(QGZeihY_zc`D5y`ZX*=lbv9TmSya*Z(Ohb9xug5>tI7NMqwdhY>h805V6Xqr_XU&xc=% zS(0ivfoYeu%#f-ilEQ@kUi~}awG?7@2S*$T&(`=;(PIA&zX3k{QT&*t# zD~fCDq5ph2pY%<^Wg^jJZCb&4)|Zu|I$IH?K^JxN{2>kMZNG7J$%zH zUch4zQtl`Gy`&kjSJw3%3u;>N+blW8FLt_2;15Wj5YKd+IY&J;^oUWD;{zBQPaa}}3Q%LDrfneLCWZkbWdq6r! zhij4HE~6Obv1(UzQmB}7z%H;PqSH@J^GWF)0PtMkgJ$AH>hF|SXVtVXzW^eKr8A;IT<6W!UPWvm9_%Pq zEkB#WKMjmDQ5`sxTEemMFC9OFUA0QuG#ZugAdeuPNRkoP#3dImOe2I3xH#R^*~OA8 zk$6txJeI`Slusr9{1V$j2CHao&ninYsTfOlP~4|C%-7ZVrF2v>wD}o&ugknXt9CLO zyAp!_SGu9IWRi(QNgH|0LFAlyJb(9>Np-pcHSEX7U@;+B{q8hI2F0Vu#$DPwEO{QE zt1^jC)hSSb8_5GlEOf41debA8al#3ltA*sIw4a)hl#VcB?1p5jHHVFn!JoAm7*cTL zk_qRP#I0BjvH;@pHbRG3wLAS;&%s?G2z>(=ug<*|a+N8fb z2kaP|Gy-oqyrMBe`iqy&XVXLWM&3>JfFw5N>uO-m7%RdP+XFXnA~j-Pszt3Th4u5m zm_u``Gq1tVV#$)MT2xZ@1N1?RtYu|GvSrP2SpZb?CrK!IvmaVNZ>`fOjp5_e^Cto$ z2ZVX)b`^}0x41zHCU(QBeDRo@-zG!akbK1P_s1{wZR1Ke3*U6T#a^LngyE{aOMT>; zuLXUMJYOd7AKqW@-5%K&vTd(^PugCwdGK!?xOR{I_DbD)Wa_EU{Oy&A;+u&wz49p3 zbM5VO^!)O^a{tJbp6XN@sOV8ih>q>OB-|n?9 zVUJSWMo3L#ewRMH@(MKedJpg9Q1Q<_xmTlTqdtqAJuSy;aoxo)=YMQt6FU?$RD*C{ zW%CH*8+8$1*^A;>UfaB*BqRO(^JC)^nbSFoMaz3o^{@A*_v)@+xk=UU;ScxrPd(r_ zDa|Kysci|}#J<95_KQ_bqc!~1O=-?iiRQ}F0`z-k%}vV!(p!K7_!J?;zS2Si<$^ky za39%li5|k&lmaP|D4|bJ`5^H;k{BVxr+84Ss4vZv<}|b97T9YEUx~zgXw`Ta6 zhtpDFM8~OTrw{y-X?PU60-?fsNm=+5<+k4L-QYkTiR_P0Pt4(tc?KIujGdY;u2|0Z z6F)cPDBYFWipzcq{6 zn3t>24fYoKQ&S{Yz8mK0cKB1R`5JSDw?pxbE0DjucZy69^Q{{?}Kd^xIhk>dB*KRvaZ|h2n+ca!wpV z9tb?GF`Mv{)`ejkpmgOyn;ZZ7&ZN=hW7a{Zvp3euk;y2*Jc*HRUa1}ep~EA0wf2B( zQImjiaN#GBZp5rgI0<%p0q`u0T$$d~pp>$`RhcGx!DOwGTkOHGf@^o(-!kjqliA_? zqP}GI_%|Ejo}yc+59FX)@&L@v)K?ivv_h0XMVeB-%eQ@>n108+TqU8YPr~7+ssl>k zN2UH;-#p=JQcIYiD^iR7zMnXVJ#TH;o9H6J8{2$$baF8MX8kYH*3be8o{Ni%l!f$P zB#@K^NXpI0qDM-~4kTsc=J_C4S%IYN?Ck$;JiMfwJRExm|IYIMOV3}`9~wWj{H6YK{+r_ZFwDmGKN=SoHz^k@D=GJfg}>Op{o(iz=U;^9 z!>@lyeQA#-;?f=zS{)Uy6{X-2m`(IaCxj!Pp$-?rt z{q>xM`vYO+)g#p-{qM=){$I)YYntVM{QeIT^C9S)*iRAoF7~vblsK_oFmN$6@IubyI;z7Hd@v#h)Lu*0#n`ujTblk4VghU9H=yf!oYog}Q0H-APdgYB_XV>GT(Bkk6Ys_w@- z3IyVBR@rc|&pF}kEJ^N!#ip*AmLzvb^1%dm+oqPe7%$2zyR#Ibu`R>iHuyo`2~~0N zPVkmlhwn36iFm!-fa^y(@_G!nHaqsVCe`D8A)@r#UM=DEL1?RvysFONK5%pFiElcu zU>qyiTHf*2YH8sBm#zX@KJ^*z(JMX@({xjFK|h7G!`lW@Bkd_=k|=J#ivBRaWKIW= zgjwnry7M0zj{$?P?^~HWNG|tN8=>#?C6%VFFYDe9wP}5q!gB_<)6AB{Z#17Zdn$*3^gyW!85X{$d%OS_Z)z{(#|^O?(}vD+xeq*S-e!JSxPZ1+QVk-? zAyp^jFpY1U`7) zTnS=dxjg=h_rHn#ACW8X=%?$?j`yS=mRE$W`9z@E3f~bHjb%gur+p@uN3`|0ZGR^3wX-e{_BdQ{R%UnMqE-fcABCQ9DqfzS6B z43#CVlHQ9u?QO00zJl$4aF1k*vuAuMmqt+k4U%9*N2nof|e%g#*$`FP35Z8N*O%g zUfSx7q+;oq=^62O$+ZMtn!bsLVqzf^bFc_Aw<;;RXq5DX(ooGD*R3%e@+8jWEtSKY zdjEPkSlG04an?#bClTb+EPCa%n|HET3+=K?&ef$pt6q$7S7O4G_!*)q2UGt2((R*8 zHnP!x!?WAi%jV^Ev5zfmZH5YXSM$8VF%rq_4V1!ZLvs)kTrLXd4`V=d@g_^{T}tqn zCRavaX>BA>6`L{&tcPN1B%g*I@l zq>df+;(!_HUg!E7e26Z|#U3*w0_=;K)%yG%%Jw(!l!4#Y&msBOZ{oSRXXW7@h}to> zX>o>OBc*VUD(p8%f`boULNlod`~g*Dt@pE*J zF`Bh^&x0z->e4-$TqQxkBX`H=uXoMA8N4XA2s9cij~2M#Yszh}Q&VPtDAay}l_v|} zoT*P~zMqhO%&f~l(?Ns2fsXD8w3u?&D%3YSe`Et3@uXo$k zq0ea^*Ot{{R_?n7d3yVeJT}o-G_$m*%8m6K?hi90wu;$TCL1H5xBm9ja zcqH8^RV*3m;XZaE-|2K&By~H3ECqZXc~u+Kl^}`2r>@T`G)~C~PDIEJFyTnm8p5(*Q3+n{Y2X^dCl_RDlk0-f_*9~q zx?Pn*vHmz_`Jx}%`lGs}u+do`=*hCYsH?HT19em|AzV^3AzW>k20VS4k8r-=++BgQ zA|&DVrp!=T9(57k5-1iNj!>tgC6Il>G(l+6f*7kk5?UL*?~MC%*_LPprxgheOV|6;)+nGE=vLFHvhFzdVy%;hA*NX^-w)n>kdQ z*ysbU?FC#2>d31WQUR4!9&}=#ryZ56+%j=qyWr$8*!WY&Nu!1EH+q(+KpX!<=cfWV*8XVPu-W`GRtv%RbaRyfIuRib%&=36~`K!>Q^)0?vH#G#yg#8gG4(DrzVXM zddS^;ECjmd>yuB7GjC+y#JQTwr?63e)mq74-Y*59Om^^ECg$yT*zMCaZ4{7|&jL?`Va2xj6apr+!;>wX2{;gaaJCm0%H5BF#V-uCqAfb0k zeM16YZ84W5!uCo`9kk%D3%2AL_%x#L(P-X%_tZ}6nBJc`*oy-dZfm7LnAwXuY~=h_ zWB96ptpp3Ly?e|_$qMA3bPBA`Xlj+C)+5}dWk8_y3*ot?AyodsHKjA*!_C0JUvz7V z&OxRy4$o=4k7G#1tga|KZ9&*|)0$K?G`vkAS!5$&2#V5auHemvp#xWKXtYGjg^I@TLVKuHVs({Ouw818QakI<9r1?Ua4BVAj}-WV2wlM>Si5V z7kP((&MRv{1&|3>Jy6;+RAOrBPiwRn%7lZFqVIfcY9OCs##Pf5CH;5egL2xQG5F+G zEtyB62c*kPWgns!{0H?*`t8&{W`7cBVF(}G7gPk+>?=+<6+E+W zc7zkhlrn)yIe)&7$`=sRg=Z9_ok)xhhw77SSgHLZhN9du_BEJCGBb2TD=Jl~hS`{w z#XRy6oGMv>Aq#+pY`sbZmP(UMy>3LY3Wt2XM8uE^LqdUU1bdMd?GOY2zc`IqG7$4t zWnNa9enw`5AHe zTugm{fQnNpxp;&VU|pq1Hl9v00`sQ|rR+`uxpIV!3Z=|WQa@R+UW6OKN=2)?~RaNJ>Pw0QyzdX@rqo?F08{cVI)Eu@)x{&8pLe!g?HI&jb&I%bKIxewmOh z=0tlW*@1GuJxO?c0g)|V?nu57>Zb#6=9+nuaiupSDqcj-mTU?Ejmr#wnm&<{f-}RK zkt@JTS`sTikQf_n=SW~hpa0wxWX6i6Eio_QBt_YU*c4|5u1qoGRS+WM0VvB+ah7P7 zxDK-js|Y_tpUC%U1aL;0Q7dC9Qz=8w980i=iAl_bm!K(7Wr%U4o1xE06u?RBg%6`e zN4Jgm4WmZKw2cHvp(RVN?}-?r-Mf7OD8tRj{2~y&4Uia8v*npFml!D9|58Av))iJ3 zXT~x^THrsg1wI32Q7o)1T+ltQC8SKeFh+GEj!Al=Fds=9T1LZ}t&k*XZG!$7?(t<# zh@5%h8r7NR7pWYL14gmrEOmfNxC*&>qR3AP*?lK8s)R-YWr+C1D?$kuhhdDBu&N|e zGB%7M<(%+QneSmmiZI6%<*FilX zH<9u!3?j-WzpG6ekJzl==w0GBTr)tmeb*$9L{PNM)p6bu#ZPvTTC^^?NzE{QYL9S` zB;6In47h`k(hcEEqr}vg_$_ong~`&e97>M>GvOKAvi-dzk0>*enZl&|PcsAiUSS~7 zf-VWqFut;V8#zG{C*c{Ug6#Mr!!MKx92oP8nA9DyApHW*unX!{Q727GxIY>189MEW zX8Z>mqE7rX))GDB9myc<0&59wRU>X?dT#U$5%(nwJ!vP#8BVnw3pqVWC#o5&Bv;;M z2fUf$Bv-hZAqgBbYpPW-D&`_Jf*ELu%y2F=>!>yhkt1o{Ymp-~>##O_kt6hM4Etb_ zYBZbxR$=~Kd?+2IrkIM_Vh>Za>hQJ`5mS}h1&PWq4fJYK3o;!=1?IvN`S1*i8l7o$ z3oF)S-M`l(%#2t8v|4Svnb2*Of5j5Ug7QzD0(S{ci3JJA@WbgmQ`IRGw22~7P35`d zn>_e}x$;hSkSLjjG2aYFLAit~dAR8GzD$8zf00bV@+JmFIDrTTd3bx?AGPm7FvVa zaQJc@l)IR~!mu)yT|#JlLVFEA7|AU4JpUw35f0MbGsqJqs%Ob8!>`^HiuPRB;a6oI zOoI6+%6|B#9~UtG7}<$zl0p)eeT4Qe$}81O!7>FB&ck920f~)reHdlF_)OYpTF%`x zB)M>&L%#%ynD#tMavWuHW$pr~itQqJWQW!8-Eb=j4LbAu1QUm0wDhnj2^hNa(gZ$- z3JG{L8pA%tXMxyWR?q6AvaZQ%$Q!h6mPlnB^h6MFNhbk2Ogj9qrwNNsnA{$zb#1EooBEYp-bXRrrFz3Mk?IR6~j;+SorlH1NM@-vGz1h7k+sNB4@-;_Xm$iOC zU>Oan(jycXZ4^|aZb^Q#dK$nG^@##IN-#-5j z|8Vdyb_{a#3M(H+MV)|Ji2K*$7$@6~6IAc?v=~KJZjzNHA}8PNw_nvp7j>SwK!v(e z_t_-@vd-b( zs1?%mYwYa-_C5Zqb%L^QXAYf_YkI_~DtE<^w%_UQ9VXi#i!#2L;JCW~S_o}_=n@p% zdqL+CWT_b#EQvwLq@F^&p4h1}-(}}1rn6cmG|8_>$2!k4P%D4+5aUsP@d-~6@;%i^ zVRg{uG18Hg*l1xi`hL)6S2^96SHd4`LaTz8*61~KB_esrarn~vn5^n7c;eQVzkI%K z^Sg;&l%LNw_I{9lw~$>QY51N%*QV9oD&hguR4yw@AYkYvSe;m!y2eNxiB8w@xq((x z-d@&yI$^E#<@a#AYE)tlp;>xhEbkZ)VwGDZ*(+EECP>qZ*;Z7?t9p8t!7d?uwLitx zxjK*Qh$*yL##DYA$NJ^yqL+CKbnhYMM0ZrrXAEh_WQRNrpM_Kfy9jRS-{{BLo8D{j z6{`+i3%m(z%)eNKy$(tXkpUvZkKHf07a|WW4TS^jR)pva!Z@UbpT$=u7T7eTaR?I# zbrGsB;91DyU}C*aU-4P6(jY#=P=jOm!}Yp-C1keKA2NwB3?Z}+SPWRG|8M`_em&q@5L;lr&~Fegcn|mw@DJz@5Ij&`$X+ln za1WRdP!ANBte0q){}*Xr8B|Bqv>8GI0fM``I|TRO5Zv9}-96~V-66OoxVyW%UoIDS zw+k%q?tZo3pRN6|Q%}v*^r<CmVsp&pXlU~9CA9_T9&_F++08kG|2($w-0zG=N zdhmNrdTe?sdp!s0G9YHuuc;sPrWDp!fI#xq5bcOnL-?N4`UA}&>Tnw zlmNm2y@9+yZ6F@d8b}9}0m1{Ffowo!AR5pZNM=Z1^R)%V5}N4~Cv;X|OwUu5y%_!Q z(*gH8!9m_G#3ef*_Ga4Yjb}>e|1R{!4aDg|h2}Q?B>5c}0Y$(XNDkvT@G18HQ}|!w zt{!l|5Lo2xp1NfF#nw+d-SbQd4*y3eyEophJMp`CBB$`RHR_6L zC|1vZ&YsBHs}SkvX>KULKybNeCc>CIc?_^ zL1@hjhgq+P4>q!)4sPw=;^Ug(|DxB@Ut za*?_vp&0#%d`6@!3(Op~gjhL!<5k|JdrnH;_1II(pYaLZ>f+zLi!Ub6bnfKxK*mRm zdb)+bGe!1Gt{U%h!{hezbKSl~CB{2sy%79Jqm?LqgN_A9ra9%=&*bv_L# z2=(q*MtrMGRbXgau9F#vP|8Cbgs<>z#A%wSDNP`P@cP?&xYP}ISJ8pdBTk! z(3F2j1C4k&^{PsQ;&hG0s>|uu`!C9{4b!Cw-U*!(`bG|p_zSY9D!xQ!%*R5eSGHeF zo;%YI@K*>p4-9ZO~OQOzv|EIe=Y{SZOTEb^)FE^YB3zc?q)`XL^;`@ z<4MyZ6%l?T7(piZmY*TK?Vqx7pc# zP!n$~_igES`Gww|H;#i#%?{4~T|CT`lz$6vl5&s)p&*O$KFM}?0qye@SJZrr!I%~` zKITG|i`l^-^Kd=i{QT8u<$Vkc){8-8{VEp&7EHKQ9?K|7%GK1oIp%5LXa)$5^7k#N z`gd6=CTAp?{ikXeBx{GKw<)OD-7zg!?YBUvDX7=ysUfzveokfiAHm||iL$`k8&9>e z+>HzVa|V>kWj*PAXztWsQfZ`yGPgxkFKrpgCeW$?dh*#tf!P8A{6V?MtpyARE)!yp z!e$3^83Kdi1AIoS+|vbdcMmR`%u(xwlNj|R`?m!8X!F7f_Dn?00-Ly(i^Ci%xpAj= z$2M=thpqC|7JFPK+anzum4Kdgp&+jn$F-NuOZFchTu;U+B;x?Ew7mGyvUSyNYjWx`B+$YZzdmlz+8^F_9DY-!zKCL>xcuhW>vW+a&|%yg zi$$a0agk$wb&nE&9P^~;(Bu2vP(+>D+!UFe{-53}0hC41V@k~FpDCoOYyklv#Pe_l zT;R~@HafdHL#B+1Rr_8E%ZgoXBb$MOa|~&LqwEyl<`f@~DxU$#E2Xs_uCgoK)?qj}<`t_#q>_qm5(d&H0blxhL3GmVXe1jpc zaLyL8vFM?DIR*$*IL%v|jF48`1u+Jk>t*J-+s<8$dM>3U=m`dh^+wmdApxo#SPteJ zRQCklYlM$$eN=7+4gRQk5GgzK5OU)uKu8&LJ)^>%0qs&^!DOg#Q3Oa=L5GSI#y@96 zAU?LYkSSy_#nCvJEQn>z>nuvYgCWHSsmY_r_T??b-qWB-Y;0EVd?m;p#Bf?)c(jx z_@S>u=IeS}tW2zKE3sr9r^CKh^(B*9KEm{t_Pk1Lp;1I}oauzD=tE5FY`l_8XOxzT zP4r>hNwhrV^C@c{K$LFUpn@_|QUM;?exnII)*_nz{qc#KW7U6Cvd8Dq002AXehjhi z58JwQS6<(;gA4|zm1L~>Fp*+`vx-sMSb&GgaEyAc;u20aLlUB?nz1^WQ#mv-7;{Cn z6%w4^f25U+SGxZ@DfPa4YpsAO?mU6aE{=r8DyS?=oracrBe`K=?fseRuc50DhSf`u zv_`4=#h&wA*%FAUtE>D94s+!dQ$<3YjLg$IilAu*;zNY*7*{RQUa8$h z9`(BFOcEXSl6d`ec|;8*84nM-YyIcPTc_Io#^T*udHFGOOY>t8oPe$oz{z&KXotmjQ!>`W_4__pCc;C*UZXclh)D>k53#~4Q z4(BF=tleGL+H<_Sy;o??xsKo@sJU7pNA}(07{qCryH~d|y?}$B@5Splo5xnhn1(<(!veK{QLNf2?i(qiF8$$qBR1I65ba=y8(Hz&%R${+1uO{T$DLk&U1JZY8~R7<1fCf ztdu1A z`qeMSIBP#4C=;G|)J^XgP6XveR=Tpgp*w9i*PCv5dDr=JreoGC*`o2~Oq$(X&EL?u za}rl~ieM?&+h%U5ws@b_H1bR``e}D8x@EYP%jUJ9%N&<+pUwUd%psK`WV(%KY;k*B;0IJO?|k+4&X3 z!yb09hnUA|arK-sbQ9BEi2zC zi&_5#>G|XcB=Lj~BSX&Ko8OWcx7Td)8Xxq1&Kj5XsgnkF#EWh-<}Bvw9T?QQNFIDk zARv+&BHXn3kes0_jgsvmvP6|kk5)Pmrvba~#tQ2mIX7XS6=&(}fdpc8@!G)<14lrP zIpolH4#CW1IQ6g5Wg2VYaCBGd;?$NRlEJ&6`RyTVLClVYSCvQyAJxn1R9)@f-ZFgQ za4aDs|0q#z&gdocFK@(3X&b1qK)#o`bk@S{PZFM==G*IVM zPi~#jB3Ioq+ter0;cWUsmlq(f9yKlFaJY?$cv?LtT(rmE8aZL!^*B56|wSSL_=F2nn?ZW4CJwgkROZbQDEZ@dw zIuU5Uzt;1X9gMREdZg?#YY}SWzl$V31!hX#F)5#;Cc9&K>;Rc{Yw6L?*D-= zlcXpwffT$%+YWi9uy>|>!?CuU<*&vQ_6KeWI4-o!S zK&VvU@149XvHZXA?{rz$&8w#~pwP^`lMLjXBvuON6*W6*HR_H;B;aSo%d<^DV_-1nLc9oblYJ?O_C4aGLf6)t7Gii zlc+EBB9VU)Q4jMvV?oC67uk1SE${KlPZ2o#OxRz`(FiioL@0#8o*Ry7iXSxvuJ6Fv zG!{}W*r*P{U8an2%VP7p0lf>c&V#y0ZI3?FQfteHxg$5pk>BN`*T-VNJk2(783ka= zv`A4;j53^wCAUf_Y2mK-w^ZxTP_~7HoET1%=Z9i@hxNj%wcs)T8^G5ICwz1Ji7YN^ zCg7eey8m((in?0n9&ciD_jwt*@!L7{%evp0;=><#(uS`(%rEPKgd56ZWvIGIY^B5+ zU}3peZdsg%aw3mGL`HYWx+|$}VYKQh0`ouVT5+6CvhRg!tZ$YW_>-A2ZfS`m}5w8!|tQ8f_?JBrPg}0hr6HTPPw~7 zrVWBoOQ0X31bDd2<+v>t?KWHrat)vglSQjqYDy&?<*B{Nvdrvlkzo|}TWjk=Uffuy zCiyj1orFf(XFT2<26fTjWCu0_Qd-tOWpYcg<~AlkT7Q+~JA6^B|Av9pNENS4BgijK z+F*FVqp#ZMSB=4e_thl)4^gila(?NWQ>pi##h6TS;j!=~fN++m8)t!wq{VsP!H(v% zqixsClMBwY7|O7UE#}$qy+6!(99oLElMu#>xUnE=O6(8{Y}^e4ndYqWFQyScYQYj% zB_E+U$}t+IsdX=iyV30x2p;onO)0L7+46y-&xb}Ii??);P$%Rru^`MjgnPCG)nA3y zLMvk#FH5rhGbQN$vK#)SHE`1VQKr+A$j|e-Kdyl8308>t3Tg47VkTxv<*(SjhctET`*e#Bkhu+7D=-c3(uYoA^mcg6gL} zHVnz6>Wc-Jda!7JH%C&kV>&=;AK(*Znu(r8Arxhb_F{jj93K-D@01ud^@aSyy*&qP zhA35cT;{~P(0lDHG?umA+b^WBr-^gy$?Lc!%+rbz3hu7 zPhn}{$n{zS8-O2l_6Y?`Z6#l#7s>F5}WO=4qzUuQq zxWjVe{M0VMHYG9D(j57C<2bsT(94xycKcMArG~y)(6oGizk~lR(yIm^X!KZLcX=R|}y;K4zOeL1jM6SZ_!1^{fU>eY5ee|&VJ)N4ZIUD~Tb*N9x3 zMrOS>wOt2Kvy>~Yn6*+^#@P_}(~dsB=q(t%bSK(Wr$H;An5hfWni-N5H|RWeL>yF$ z_LS2Sd>F$ef;qUly@YHyz!PA9KFmkvJwDJqE`AYtGl=0<%`yaUR=xJrHXU%V##~eQ zXXUv6u-KnKk4OBVi_)MRR_vmgS2;u>ON!C4x!2CBKh@hZi8N{rD2?y9IHQfoNG@Cu zDnuN_=Z3!}>PEsvc)@M<9p8}rlAUE}5e?UCX!G-R3=7tYj;Q@GkF{X~R&vA6%6xt! zlqF)Ci9kiZ8SiD4;Mc-@HUsio<*gsbPdR0lYw%~zwxQO4kDZ3f%;y8^dmr5(R+Q0t zal5RqtB^)bhv*}%agM)Y__YbE>1z2((9TtEyffzUHoZ^uPLokhF)d-*p8u-;r*BHT zY@~CZ5VV89t&^7+KqvRAsTCj|D`ttjs6pAmOs+nv0Ile^P~>Ln@if+gmnwHSO)Bk# z?H$#|_(H)0-I`>lN=6~AJi3`+Q}f4!*{R(%f~zDEDVR6q z@vPgMgp=E*^yj$O zRP_`6<~^BP-2-@ruoQJy&SQQat)UNw{=H{N^Xa9xA#~QSOE~TnYIkgFDt{9-q0^tI z&lWLL1Y5I^cptuH&)oqQsp=Po(gb1!DxNSA@l+9MSlnvX3IDDAs^Puh@w5-a)aSP-@ zew&}J$8ZzGLybX^D_E+@$=msCeiWu2ZMd8NiKlteFB!)3b z)(Y^Wxhv(O!G9skm7>7ORn$IqSrvUtoU&X-J5)Npjyr}=lkg4+ij5aIJYsZ%g(N5m zI&do=EB-L-)cOc|2}}@$X?6EL_3QQKPa|{<s*8#a?O zRi564g#hQrh+swaJ&!-3Vk`2UR?#mU#fTZU-0SOFE{OJe17(5~8$jmln$sMxEn)TJ zsI_d!XJK9HOVqqjwpww+Czk_OOVCN)uSf=INrby)_fSII3bh_Z&dQ(xqu&6lN&*JQ z0LM^A3a}fEAYRTVJ$BwDIm;kp=84b4zX#J$_hma?OR;`wuqcOuy9%mZ83jY@{SRV*B#4S~G4<|vYQ-QXq zhhCbn{oWKz7<%rUPYBA(!ySyRw+(d7a&05?r`5Ho(hC6NEb5J_*u0Kn@Vd= zUZGCkd!_uJqFxec$ixV-7ENk%6|cbklB zJ#+22(xze$HHEP!u4b%xv3ZF@&LKslPknWTSJb{Dg&yBxqV^Mp1VI);)abd+8dI`R=p>e2fOMP3} zB!%AYj&Xvdv55*NHv`@K#}3I%b*%($Xoj}>*|!K5e{b2ze5OT?6hszvgcAa0-Nekt zDv~R$Ub7X>kF(Hu{pY=U(7?gh_sl$On)bBE36iS}5fFRGfCbE&W$xpK@N28c0&nCr z5?UT1g&^N!>C5S-sgfed?fU_b>5dhdrICh_2(DF&-8EZJ%e2p#jq3RP^Q0^ zWK$I6#Gk~|=p1VEA+aBKvZ7CgX>@tHQ(*DU;xT00&)33mFO0B+WA$C$E2w1P1XZK2 zqe&%+C&C2;Yt)ve4zWp-Usi2|o4!y`)y;C$0d`I6MVh{uj*Aqat(97v=6$q(T}>e2 zL!z+G?^I$$KntmRBC+|piZ5bJ*U)Tf%C~EZAku_k+Wj3(ZbmTVNme;A-qag%Mcls} zf=qQ3N@1cr*I{Lz>K*xQa7MMY_5HYk(~0Z8>MnK%bxfJ(yOybY5JY zL95PGe4q?H+BaRC>VwkMWS3#?=u46jrf-Jw7ZvO6)2>yPz8RofWA|&E z{ieu?Hw8j7u^|+!)<_8yt&W8KQ0dL)RAf7$i`27>Td2!pTF$1`>Lhj z|Bcm^*ej7=VT&XHO{`a{tB*2ilt%fR1>iMy&|~CblqzEBT?8o+d*qXs!Y5+tBty56crvn5o!OAFVT%oEbh?BMm zrkp7Hd=sh_kMIyL4sHi;!@VFj5+|vE(Xa8ZeXh~GbXZ)TezmaL2R=G+JmGaPPm_Bj zESge3eLbC5zb1XcKMF~AN$wyoa(-g?IqKQs5|*_3_(7TA8wZI#4Z^uXch2;cAtIlS zPa6$@|Ize0NEf}*BGJ~El&eqAozbZKg9>*;ZYe%|lzC@rO+t_?F98~i;uT7O&0whT z=Z$mahTycE+ziY+q8~8OI$QM3d7d#pPIY@jSF&U+vqa>4!@6CZ>O_$W-@8P_lqtO3 z`3rb(n?!bm%~{Cn_i5-G`-s9Qu5&8Cd@f~m;yc=0jRIRMoc)UNh#z*m&xp2jczo;` z4+XZnCmAmEtP6$duE@1qi%z#V5lQ<O6CP09I=8vq%geC+>H8WPF15%7G~1kbQSc4krwIiU6Rdk^hs>jcdVm zYVSV>;JB0K8d^>WX9uptwqQA-la1kfke^HPM?7Zt6S?CWi25R2=?x&GD3JU2u|$&K z5yVazCgM8b7_%DlfW!tQ1~MXCP!33$#B_sNkgo&=6mY1hNzHluwqn6M5$Xf*1JV&H zs5+<@!r3v061P0BK~rE95dT1Ege=O39zS&fEl^JN>nF|B4x$^8E%;YT1A-nS=TaXU zL_flV_#%i&{3m88$TCsuJNz96D9Eu$wNb}Whkg2?@{Y_0tQ9xxGoxBQIZ=Z?^(TK9 zOO_VNNH!nf9LNw1(6ErB&2cu?~2kY>V=TKC=Eoli?YksS^D`T0&}0ibaAX$soZ1_lY%5JUfsZ zt`@5nYBtQ155yp5@yUIiAC@&@h0yd20R@|!NmMto1;$ALL^bd?f)B-m^gn|N{cD+L3to066TNa{C4#X z#5%D1VYXZmegsW>R+3Cqb`%$sa8iAMr8ohA8?_d%7OEE0G1`pE`2Uy($B74IJ#ZJ1 zh1v`q+j#nuKk$(Nq!Uq!QxX{=9f9FQV@y;Kt@(wUX)@}g2Ph}10^}MpJ1F2|1LbMR za>HW82?`gPy~sxFBMXRVz;EZDA@|uQkjQ{&1T#rjFn6FQ!BwZD!b*~Rlu=tmdJs23 zE&pf13_;vlq*~Nk%qygU)d+hrV&iX4M4+D^uQraVQEQ8G9sNf`_y%~M1-ClNFhXp; z`!GiENJ!7+A25NyGom|!&U^KuCo(em)6t=hD=xalf0jt;sq9qfC(}XjbFPApxCWeh z2J#c=T}v+T6y!YfO-r57lw5_>$1+eiC8oF`yW9O=2hlZwz{{E6hzIi&T>M|_^*Rzs zqOUx5w5IxnqyRi9QRpa= zL!=@Ne=uGIt&>#>kD^#!qiQY*Y&&R5^q}6}9rF*m`BogE#FLSEN`@Joy(04_U||7FQON z(1qfNcSynn^O<5kF=@Se0KY=~H;PG4S`#;51wMGyAcUR?ka%0N)AO9*JW}_B3xgm@ zIEsh5%ZpBUsBQ~CqXu0j_`w1>TWnE~u~TD<)&?aJN*?+)nu2seGAUx(Sn+70oORmI zIb*BF2CX$p!uZ^ztwi~wi8eUixR2#xhJB8GmVNbk{(0HC-sbQ#gW3VaZj=1<6s#YspO*9x@(dbIEeF$fdW%9f{6ld+7C}*%nBd2CRAV z#pV6V!=+2b&&nFbADQII-cgxWe49T#=BW=^pMxm-*%mkK~g&T~{Hjm2N* zkxCJZa(-3IImmjHdXzHD8DzaVdK*0NL80XEUeshmYO;(y74e>#Ag3oJHO!E7)`oV^0;l zu-~xP;?m}lx?eT9npsa>Ds&(tXM4KDW`>s^jtizCR!u z70C6W`j{+JG?FzEG_sac52jA0bTXSc9c;F8JKj3Ty@qe5!1&ko*MMvKYnz+(>&>Ul zC)u0jeTT{Ir0u)_ig(YqjL)JX>LN-a;v#k;IzjFE?S@vpYr%iN`oKRU#9|OIbE{a= zOwcjVRnb&2+S0pXyJIsk>gu#KIw}|i>?HK`XH4k0!PP#yohHehf3|uYSDc%fHxxJrQln*ltAJ761Cs2+>Q^pco!i>%ReBs+(h=%(wSHE;|bWL&0~t{n&RAQ>IEU( zX1@FxYF#yfeNU@trs~?-Zx>i0ZWgcFh+GQkAz&6`3A{ z8aMVX1jx_r;beKDbR&~RSX-iNBx7?&Uj!~(o%Y!y)E$m7IuBeH!D+nTZ@wNd51mc4pPYw^ zY>*PJvuLy55IBFrvnP1`cQ^TD$IWFerZN)H?2_u(rrden`gNqV2h)qOHnG-}tRs>u zUft8grOyZVK4aV>Z=8H|BQpCMoi}Y-@B>_ZN5=9RPHhSEge(@<`I66DvzOEy5L%9H z9;ME(smIRH_2CQk@fY$D*@5pblTd05I~T}4k4yT} zRjS=Ty>x%N^R`v5EilYq*>=!jhW7^D*ywEm8jV_#6lkp@z^<$=E)GIN-7_aI43!a8u-lAYRFvbmrVq|fbVzmNqDygIK};`mM7z1k`Od+n=6VeL}RabJY%>@07a=ie0!7bLm}} z4bD3GQ<;;ThE`g}@uoenx&{@Vn$785dEz$4({lOxo1bERv+^D>MH?#(SR?1x0B4U; zf3wel$v%hhL_!)%&TBnZ_@!q9G_~3i8@anlYW#d!cNnG2j$`DPbX`f6f=cV&aB$&GgS~rVk6=GUdXZflxiLg=X84c18sbC{Fhsg4?~Cy0Z=<+r3OzIv;#l zZJ4)rI{E3&?_79^IRq_IUpI!jcZgPp9WsX>+viQLxX4ZMU~R46%K16oUj_#v+@^$t z)LwJn`mI_@AjzyNf&2rp2w zn>>7Fvf(}K`Su30UHlO@cEbbmT=)1k`oRkOm~2?XG+E|eh`td_69QS?0`m%?x~8Ea z`uN;#Z~hMY<5tNB{#R6S@(xq#;%b*WT+6h#c1nIa9Rez^n@P?(%eHytPt|V% z@Tzw>xUQw+!i36F-(6}mg)o(eQ;{DA&Fu20!>cWG^Hgt2*Fj*Tu6ev^-cB_?;_R)0 zrr{&P%(rz82xkmLo#Q=W{|UF!`;DCvPyfZ&Ys0rDmmTkQ+IIdDcH!i`MXG;V=_U_c zHvGP>eCKH~Z1X5;{pL~{W>CCCtiCE6n58_~9m-`8jg3|LjL=7iSnW@YQRL52tfcBjfv0JL&VfJ$U2ZXQU72|v9k7{;rjDTL^`s*8X?DTdGjU!VA_61XYL0 zcly;4w@U<(i7R%CFLzX|-?`-$AQ{vP5QDVxCk6Zk$bl8ztN6~>l+JOh^t2+F*wI5dIc&{qk3Agr)3)2`zzgkt;Wh1ua$u7!$uaWMj7Gb`}M@8E42Vrpn z6`UJHN&E1O5C__S`0?UnUt@)|=H6$W9HKYG5d~s}Ty|Xwj^tp-|0EEg%nsgslX{Gh zYDiQ^Bm7&S7EfE7Etzax#LJnLPHO%WVS=%?*<3^>G?(&s=X{FDR(sHG64Z5M&zl36 zbpE2^&0nz}%Ncfocl%hv`-~y28ecP{wkZ?SVR&Crt%L-iexN@Jk)D-GMts{)>hXVu z2a0G`Ncs&4BjZo@2i;2q=p z%|$3=UP`+_(4R4^AAeYTe&dK12V&VcZP**6DXhbcFdD5YWa_;196XWK(pCntYG4a=lWsWOHj<|(% ze|Zvbu}xW4Td_@fxOdTsCG}Zylw}}H5$f&9?TIq$S%Kc1)S9SI(TNrFSxT4KMUjV$ zx;J*GES~tqp9d*QS6n@+l({|ER#k~^(QfjXl84!sBImZuf2l(=9Ii1xQvVg(6g#;R z>QSrB+_`qTLT?IlN$nmb}5f~3x4}qQPN%1ooszreOO(j{cQ7WV+Fsd@F44U z%le$Isz6*CC#!PgaO6;|bC`51T^{rn`zD_$5ugyj%rR$i$gYg;mnullF)uVDB-K23 zaCDOx(GFttqREr8NWYtR~+YN9-Wu} z3;LR>Cng3;ECf@0{!E63k??UT2xdSalNJ;HDwYV&W|u-6B_aDbc%=;>=jteQ90^_sGOx8GZom|Ttk2ldY&qk% z#)wHaN3M%ev`=oB7bLB3*fA+@VA&(guG;N2q3LZb+1p$-tuNWpx3!&ZxPu5E5FZd{ zC+#kpus1iGH=4zexmM+{1U50a#BZJ3Tl5Cn?KPS!56|3P+9Mw}i0qMPhtKxz(JtCM zH@6C^*N4x@pIiMly9&Ai%vV7#e_sAP&Jdm>VH3CJwdF-Yozr+E;~d7i4M&NbdwO&{ zuH+obV}xvuo||4p@-61jg|*CY9vPSM&F9dDwYqG!8n^Im=P*mOAZ&($R6J_iHKSeA zT4V=kJTlsUMZ0UX&=25v6t^o!yJ@sm4sd(Kv`a*LEVmj&!JVsnw5OM3m>V}?X-Dwj z>BXd17N;8L#vVqbSKHYEzVcQS8vk)`q{li+kBuDU{VPu|IDh2ITPtQUgFB#{qhx_G z?ph#^F@8tYDP1*_b!UFnx>e8|k>XvsMb|a6e#==aFiy*nZ1Y zD}S-nKIq-4ae;|{>)&Z$y8wG9QY-!8GX~S1%LM5-PfVWEA7%1ps0Xn8Wb)7qPS~HL zS1P8DTtN7KA_geyx8i@rhD-#AehL{yX0AMgup!T-**4TkT5R3VK5X~6QIDkQgA&DDhoM4;*X{c_v4j@{a zU7HPZWbj~+CXkl;RYv0flO4k5WlTamvBKz%@OmZSj{KTGD#tQnk`8A531+2G0K%c{ zYk8?hT;YZl-=TdmvLbHWbW8Z`x$t&Z7#9kaD-f?4(*_eE&Pu%!~6_{FM15;Im% zC#;?FK_TXlB4-xjN*6u`b)?3Wg1}Zrk@Dq=u6hgsSIs|#7)@0~4FydNRqYE~xp4&! ze?hLIg0Q)oa>{Q>H7hl|y0W?o2L6(<%IiaqPAQO66h&QmMFpLyMvR)t$RB;BYGL_B z<;LH-$7*+UVD&RqJ}G5~GA@!h>*_U8{gkRi(mWX@+IRyuCB6K><3HZQB8#$j!9OeF zj-f-)bPjtuX-cas^5q;nC^Z4+%N|nrI?;7ZWEENP^d>Z(y<+K zZlzKh6)I#Gikm!hgeRtug^**gltKlcxVKUcnpfKKRKi2e`S0x$Q8#C>--q~FIS1`X z((PabR`^y#kczaqmo1L^!r#ofmF3rEKK>MYeeq3 zElu~R+hI0Jwr}H8@4;mK<$HwW^z36A<_*;oI0gx|U1Yny;#7}Oziu%z z!1QdZ8m3XzBR>ohj=IR$eZ|e6qb9B~Gj{3OmNiUst4Dkd625kk_1C--lJ80Z5g2nHEyU2K(pW=oGzRd<+L7xZ<# z8m5KSBUAE(5p{zE2VZflM6z+qqAGH6&UZkR?+Ja~rUsbLAc3%p zZ2Kh&0;I1S*8oczBy4t(`S^<8KSiBBVDbRtQbM}e!hOw%c7f+0`Rn1_=mVWI``dy4RSkr}WN)8enXL z1Oq?ue@{`m513Dr8sM<%5jlf|^)9mRm#B>^%+`~*6rYEbT3{C&R(o~y;03)2oIwVA z(TKP*n2y$Y9G`Y8y2fMU77zgwpLGUC7n8fHvZU0UW3C_JR#1vHC$1bLM|D*95u zL@BQE?7`nOY z5kpjhZYiU*4nkoRlVuUJnT7cYV!XooEnX)T79oX7iv#D1s@H?HDaPd}hI~aNHi*Lt zGZ&Te5u5;E0kA@JTkgKpL{AJAN?`4>l2=}}ButLjgIS!t8T-lGU@nIlvI3|ZAAaDQ zw#dsrXGOY~Z;$K+n6zCPD+`FbyUvbpV$oiHWkV9ElDiIxaXur%$v z5L~JDcu2P?Vx7Y)L1imKAV0rL=SHU69gC(X6|D6zb{I*2^as7H(8V4|eg4M>y_^xZ{ra;Ct#S~r zR=o=SWDutIYWkU|`Lc`4AzG4;@PS8VV!&?-)5R$d;fuCC|FeTro<2S%(Y8;^beCr` zu2T*K<)PH)Dd|43Y1r4U^X?5qQ*_s%6mpU=>ie|4@#^y~*!J=e?Da6`^$>y>j(SPE z2`h*<)T4<5yL-gcENw|!Vz|JEC^`B)9j<=Hej=!q1$n>!v*tIzOq4H-tRXE!$X?B7 zLCLJ^uT{Z|H84wkyqa-X=H#})%tq|KUv+>s4P4tjoR3&d{T?;YU6Lm^(5Jz~MqH;s zoi)gIvrydM!htLw>BN`l+9kV=pXK{#xe+aZ3~S{#j!^z#fUWupAiVZpgB?2EkdsUN zjle8N1pEFAN7(Z|fs0_efY{|7H!lJGJfUd=AmSsSgESzL3l!spzLm_i%Y3sB!Q2XN z2LFAm?BHR`UlsGhkU9c2=^3`8mqpxD1DKC@R!A;qey(D*eELar>kE zDatk=2LxLy3!!lb2pCtdP~QWfLHXPiNC0wB+2bgUT{5dXo)AuZG;z%45RplB?evNR z0Sgjdcy#{|>TcOplG6mYeKw0cUTO6F5bkc3(-gOZE{i`W6JA>M_z>nU_O8Zmh0|n< zJ;Z#2#U8IYdVT0(h;a9x({yyEm8rOvv>+}0c&RC-mYRB!!uWArSQTwvLL<1ouE|$^ zDZ$N5K+8ao*&rSf45<6#E6tf0V}`z}%9+GGzJHDB+c>aX`DjhPKDKPi_tfSq+C{rQ zj&#kqszfy|&nE7kss~=Lqwi`PJ+BKtrS%#0FmrgyJtf~x^D`4#HSi}9N+uqKa?U59 z5K0Z%qyG4ZOcy@77SKbRln8|5!x||_r%2{%@{8e6+*W`8i zo7Kg7+v;k)V|BB-TRp6vRxj&atGD%@)yI0@>TADaceA_OJ?x%#FZ*4)xBZ^o$L?$Q zv-{g0*dN*-*#qo>_8|LXd$2v)9%GNS$JyiU3HC&Ll0Dg;Vo$ZF+0*SA_Dp-0J=>mR z&$H*-3+#pVB73p@nZ3kbYOl4|+3W2M_C|Y?{iVIx-fDkie`{~Izq5DP-`hLwAM9QB zkM?eRulIYDMj+6OBey)Q#$BESe^oHX0XA7fm0{5RH#!j3z`A zqnVFsAv!TSDLOeiB|0@aEjm3qBRVs& zbz+~ye&h$~nigGK>d7Z?w4-#zXp*Ro(ZG-58H@(@h=$@N*e9BZrf`6K?;+7%w1>m! zAK!%|Vu%<5$Hho75>8MYaFYDnDe`Zp$-kW;|8`a^6U*To`H2fgNuv}4y7I(L%d}WQ zQ=6I8h8gypyP5iGy6fA-c?>AWqf z^xhU#25*bBtvj^UKdx3r@UJhGh2>Yu4iJ}!CK3yfcp@2zBoM*K0{gKb_GSrQ0vIpN zO9SUscoh)*Y5p`A{8|1inAT8hD1@x#)^d>6W$Q9-kDIgk&i|0_4SL@Hzy0q29nb6e z*1zgc|C7Enjcg%X$=326^h};deF}YPP4aTjp~o6T{<8u4PS0!J_n9sKqPOh!5B%ic zddX4fA0K$ehrQ1KYhE(d3!=XqiGKZIZ&?we5-%pXACY+RNNtQrZu;@aZHz`<#7Ja3 z#Uc|h61jz=_IVtsO}%mXhfn3N2mPs|otTrxN$bQp>74XV1}EOh=p;CaPA2COC$saY zlf`+=$?81rWOK4RIh>qME+@B>^rv3<{Xh4^Dxxf9|0Qoc_iz2Na+OxGzwydn*<0+d z$v1ENQ}4V7{qsKifPKh5@`s;R=~V{u)j$7TZ++)){k4i$8CAkR<+TGo+qv`a@Y;Ig z|ITltjenMLmJXBQ1eOcpSZ!7h9;e@* zO*nTriLDRk4HsY=!-c|y*jM4=;o@vdxMa8_``Wt#$F_zmge$Ob!j;06*tT$$a257# z`04P|YlL=& zYH77*2d%bNGCOLeSSjp0dfGAU0(#oD>>7I78|<#l?U%T;8{1v^%gzMn81EUa5v{>D zMh8Ym^G)}E@rBvye7bVen6>hkEPH4PgHjOkV~`wluM0=7JB`Zu7#&Qb+WTv@|JQ2# z>kz)Y-<{=Qd2sCHXZg|Xm0%@sn^jp=bTTzq4KUb9Hj;jKwgp}`6U;<2llh35*?iQ@ zVm@YOH6J&#nc2-8W==DgncGY<^O$+fd}e;LfLYKiWEM7yupihi_9NTP_OQKdAKT9k zu!HOnJIs!-qwFVkj2&ku*hzMZon~j)S$2+{XBP}%7~;D4P23PS#Vv7L{4VZ@yW-xz zvdqAy7@TGz40=j&jOLKy@g*RW_uOfE&X0-edB5@Y{_9d0RV{__Vi|l{P!3-!-gmuX1EGu3ue^He|uGwjn%5SBJCG`T96($J#+Q`UP2b)`_J+4%VG@$20o__5tK(AF%R8O=$M2S?ZkH zCVx(C1}gOkFT@LBmbBiN37!*Q+Km_z+>n|`am|%LqKly5R)K} zXV0Mk+VkB|2(9=bD2A5&2oy(KejJ`adwvp1VD5DqN}^3a3#HJmpNGg4f0@$DkIO)S?i^c@05QyTTa7b$|%9%c6Egsa+75owqJwyS$d>rtMplQ;dq`aZG$+bgYgQq38E5sF zcfU|v>i6&r_!BM4@G_`{r-(s)Y?3Y^(nXRkVbUdn@o!_WNFAGc-64&l){EAQpfGdq z0WRicL$L3MSz{m*W@pPFo3+AP3&k-gt^cgV}PYF z9DV*i7)O1-g8Ke*^yELmN*V!Q&=lzlq z>e}x(Pr-Iv=MgrFe&;J5^a$OR1(?}*qptQtJu>@2k3c;rm%5BY1xR|RM`nAo*Vb5T zD(-omwFO7pP1_s4xRf&R`^WPb9Z5ld?=AUnj!4hgbD2H7E#>`;j8 zkR&@4COZ@%J7kd^vdIoPWQP>lA(!lsCOedd>`+>=Lvdt>(vcm?Kz1l2FtNeAo0eA- zD^ZDmbUlYNi>1M%%*v8jVOEM&V%1q4Ji6wrEo;wGFoNmL`m;f7818iD@%2AR*vddSb3^j;F;&uEm=jXTd~Siw_#PNZigP#tKVeLQa#$t z;MK-5GoI?@W=5}8x5Ktqn`y(2SBIvCqg1aBE2`IoU8?VdHPv^+F{3|8iyaDJ*@P9uvMDQsWiwV7%a>UZESocoBd~47ux!DK zW7(2Dfn_UJ$@>indlJjn*i%@x!+3#XtEyqyo;{6a2UZ=+w^&UqN3&p z14)K%&<6&t zt-_CZHMTLcS7R$5rFwNZ3)O4Fk5PRmoR#Xk;m4`I7tZF@*y8L|muKUt|0Yn+O{AWi zL_If|dTt8!*;MMYY1E6;spn=;&&{Nso8|RKIF1xgM~bH>#WRrN@uYZ0QaphaPb9@N zk>U&t7wEnSLACnm%E`b}{ql%Y%&Qc{Jj zo7OGsw)MMp$GU6Xv(aeUpV&j}q4qF)xIM!D)E;S%vX|M*?G^Ut_DcH;dzHP~USsdK z588+AqxLcTgni0BW1q7x*ca`~_Aicf!cN4o9NTf6sG}U$$>Zd8@;UjP0!~4vkW<(x z;uLj?ImMkPoDxn+r<7CLDdUuN$~ono3Qk3*lJlff*?CGiDyo!9qtdE4bwk}$w^X9a zq`WJkIVf`k$`(zGJ8GauY|GoB&rimz(Ba)ND~!_J1d4J%mohs|bGk9HNGyUhp#`CZ zkT$eDv>eifehdAEQ6J_zkipA$FgiMHorK(8)`PK7fAsvNF!NsuPh!r#4{BoGegK{! z&tHo?|Fh)zYm?`Hjy!)I^89tl^VcKKU!Oex^W^zoAkW{xzKcHpMMtBbZ%%%`JNfxu zDjoXy_pqHSq2XWY(SNQ7|0DhMM-N$~CXkvD(lHI`m`FNiqn78RmKUd%KSwREM-k2o z_wz>6GNW`3R|ju)xDsT3c>Mp*QT+GEQ7Dm8KeG8 zL;abS`ZJFDGadD3dg{*%)SvOxpBbq?6R_VhK%#&2wy7REdWF%df5v(igT^V)IAt_W zIgL}{uj`oZL+i$4Op|H_{y5Xg?$B94BiW>pENLWrcXkzobboc0Rd4j}^SXZ>+so%6 z&d*BdPBXn8xb~hl#&k1^1s^OI(W0s3egx^|0rebklv#Oasx zOOQ@C)lDHiZKbAn=hQ#ginpdkYudC<1uFA-y}?)UbJ#!-rOK0PIVJcw)y%8UbbvShy=hgT{T-puaS08+n z@5Og3?5AqH@I&9tMEk0Z%M0^N4}II)4@QV0L1Ym*9(0Z1)*64!o z5VqkAzvz8VU1KH3erFev?BKh-x*3z?@v&4-pP!DZ|4xF)j!4=o*!OEF^M1Ne}@ zQTD~=SA6?2L$eN zY&*t@g2(X$p5-CkFt$eGy)!@PKlVGj%(-_-1>fO^mhZ*<#Cx`h_rCmKIgH0l!F%$D z_ul)Uzo9SmWlPvfT;jdgJw)1J+%SlFPhaug(^HA*{Xb9EizPGf*(u(8z(Z>l$1}eL z^PWlNz1u&uRwl^A%3-Ea+t2Bq_u2hXUlT{YcXs5~b#RO)>H4}pA zqkWmQuL$kSrhO^emrMJKqkW~LeZ|wh5@=tE`Xl`jWKP}V6x!n)D5B@#eoLlWG2920 zb*OxX$_7;SzJHf0+6C{gVpyh6wRi);K#SK-S10B@M*aF)zqu38e;S}Z+zrYQ+%M8p;HA~MjVSbv6=%w!yBwC~ba^bxqqXL`g06^VMUB~>uB0*BL(fnd%gP#aKK&Hx$8{Br znV+tzG4s>aG-iJKY3xa^tD_I$x`sCnbxk~1IG!A*oskLD+mvtUCKwaE@0HP_H1<+} zsfO?#=7~A57aOA07{q3>4eTJh&NWZsm3b511#RtIzL_88w?v%CFRF>=qMH~Y7K*Ln zgt%+O8-V@72^$$%B ztqSc9U6z*2Cd9QKRza(})dC~9k=9~sn{^7K)dah!UCVB5_qNAkl)A${=NL|Aj5zB! z?VP^OL}#V5%efd0N3%xDM4ykgkA4`P8eJ3JOV10>p(^~5!J+o3l2=BHQd#5=;*Dk0 zFPlfGd_b}j$xbADfaD;OgGi15$w?$9k(>dNi%2daxdJ3Nk=#Ub2S^f;BqB)xl7~nh zB6$KNFOj@N@&-sgBKe5q3y}Oo@)OA)AO(mNAW|Se3KA(uq+oy)B2tJ*p#UjNq%e`f z0aAoW5h6tbq$rW1M2ZGTF(So?6bq2zM2ZtB9w1K;d4k9j0aAiU2_hu|q$H7&L`nuo zDI%qalnRj2L`oAW9Ux_hlp#_kK*|y+OQdXolp|7(NVxzhPozAN@&QtTNChGl0;D35 zibN^~NF^ebh*S!YCy6{s=L!=IoIssCbNL?az z1EfBY`b6pnNJAnGi8Kt5mx#PX zNLwOp1Ed|1c0}3*$m>L2C-QoLyh-FuB5wvrdm`Qr3(L_cQ866;Fh>RgJCP2m#8B1hrfQ%zD zj>xzG8Bb(9k?{dCfye|R69Qx+k%>em2FN5LlZZ?TkjX?Q6PX+!Q;19BD0Ci4v;xS<`9_^AajY#B{DZa z<`J1kWL|*GCo-SN`~X=%WC4){0kV+DLLv(TWD$`?L>2|eVj_!)EDn&*hHt|oWDSuu0kW3JS|V!$WF3)pMAik!dLrwItS7=Doj)7n zWvh&`)g;PR^H8>$kFwSLn5{O0!Zc%3lxA#7(2PwPnz1QIGd2}z#-x&g0l;46*_@D=;}6fX~6jTB&? zJsE`P3^r#In?ny6>i2UdyabD31AGj--~b$gljyJ8B3)Dz;eJe^D1-0eKg|(`sT6DQ zDbtuTJ&H1eDbGYvo@L5RrcjNuxJJ5~9l4qlxtbffdLgRim$;6XBX!J=lzJ_4wIFh} zFmkmhs*cyWj>VBWmPAS|ja)6`tFYYJv_kNX6%Yt^z`rZ;Z^uY&tN6Fo{y2+r9P(Uj zurI_0Z$){FXL(CNc^eE#EN{ud5r~J12Jei-34_7WD0Ly0I>l0FurIlsWl8m0!xf2r zz||M*=u=iOWhGN6QaLubyii8uIbT93iWrU-Uhl^dDfVMowJ08KHR0&be4mzSp`UI| z^<(!1)MAzm0qa5hq(;-lQE>)htbzQADfG)Ou^;anY>g;HeOqkCdg@!9{rG$VeZE+X z^P2un7_|2WSn61YT`pqv)GC??g}L91}%dD(EThJ6S&4M$w-U^epzZ z{vOQ&>Nu{EvPe5cRup|G=b&)aiOeW!S3z%lKtB-gI37iB#OsN8eKd-iD`@6h;?-!_ z7)7@Q%`EYHgHI*t5P(`@DWUh~PZKOiM zGw)-9T{#01!x@vVtm`@lyFxfmauoIQNU;Dv;Y{xWpS~OEJ!sdK*i(r9HfsK+VzX~4 z3aGTZEnh4Z3kp%EAT?FY6_W~4A3$mxuEz%pQ3vARLt-q;_c>}u{JRtFOy@$>hWK}# z=;~XN0%|t?oiCdB>!^T=_8lgRJm0b`_!FROn$=#ocEYPb@G1ykT_bRYrXk*pW0_B2 znNMVyPYNzTc`WjOWj{v2-U|9|#osOXyCr|O;qS)$-H5-N(5i)i+rz!d?MV_Ex;1nw zKxkBGG)pM1Ik%Tfd(Ev-zt8~S=VuTlw8UE!8fk`@;d+@~V(z4}SfU@^I{?dx(48Tq zg&qn$1cA`F&^UHB4bYRL&QIw8M zL7O2<_>@je=^j<4GgEp*QMxdt7vB{h-f778G#9FI8dLjeeA7~b6hU$*aZ3{lPP0y(oe1@WtulW|THf#$x4e*Nlxxdp5vYIJ^0b%mSgWLuUcJ#@-F!c}u({$V-&Q z(0$x?+bFHOh}#|rw7y$M(E`vJKZL96M^R(2&-9_paQO(Gq`F(E8}_9~=q8rxf8Dpu zp##{rdR`;!+hT7q_KkW)b~@Lu^L6f3E#8ln8llnHyN7Q41NGC~2x<9Nr$*GM7L&~@ zRNF(imcq3;-Xd=i?~SlRJ!R~_Y&WbebMbF|{!raZe5#9lEAM~8^b0w5v0f7*FBw`I zS{7O!dL#5^XhmpcXjN!+XiaEs=&jJY(E8BZp?5+XLhpt)hBkRsy=q={uZCCCtL4@9 z>UedzR_ZBmPm{Q(+OKtJXjtg>(D2ZR&>f+Xs7vk&-HoOG7J4xBcjUmss8Rka^xvUJ zE~+mq?9(RfYgKGRhvi+b(kt{z`c1#AUk1=?^;Cu@ z6;a8ms4Aw4tDp)gsg%+xQTUIo+MwQ58`U@JTlJm#Uj3kcR6nUh>ahA*TRNa)bgYikSL;T) zv2LQT(M|QWx|zOCU$1Y_&2tlY zsAuX~`Z@i)o~`HTx%ve?4>kKz)a%RjYQ09U!~a+7ZF;-jp+D6-^=EpQ{#@_YU+6u0 zuimG>)cf^U`hZC>B}}R*Y0^w7lWt0z3{%ErnzAO#lr!Z`1yj*vo6087)HJoc_1@dw zJKnqA``$<1R_{}s(^B$gIS_T=of4%;zAtw}DP>d{sG_Q>M$kZYP&Ywqb-#KDx~Zqt zbm*mCR12Vw+N8F?Aaz6?gFAJ+PJz+7gYE!N=q~yun1I&mE|{YKuE)c4{i2=^bMzbf zO?VL{X%)Q8@-ttr*IVIL{k1*@YfL3m2|hMCCKo<2RZKo?_1^SW!gg747UlL=y`kPzE7VH0O08CF)LQk0+N1WWedDTpQlW3Am5tD3+nqsE7 z37U|RMj364v5jL~;~58@al^A*j%PWaXSo*7ay_2q zMm)>Sd6wJoEcfAA?#r`0h-Y~i&+RO-`3H?<#`l!CDpSo4uruwUg)j0KE>c7<^ z>QOaAJ)@pgGu1-1NWHEWt0iiwTBeq(t!kUvu6C$T)lT)9+NC~MyVY@ZLY-8xGVv%W?5(S7yZ`W`(> zkJgXr$Mq9>f}W`Vp(p7l^<@2ue%0Kg7wF^qgg&W%)2H-leMX-(V1%(uz{HqX6KCR0 zf~jh%d8@qD-WqR{_ks6`xBX8rleDw?ymKU`HQMAsrVV}%Hf`~Hh;s@oXIfN=_FSR^ zm*~hPPIC#gE6BHgek>}3&-mrBPf7o#_g;i;`_f2Blpr}2e^W9}CLte^WpRi_WG5jJ zk)eSih~QG7s4OWBjN&g1@3})K3Sd+>Kf|GzTmA;gnhxHp+TX+P>g-bU}#Ke z49L*)q1m9^u5LFlQ4$#5(YZ3xYHVb-v+z1cHh^@TvEES4JDx&2y3aoqv5NWEko^~k zPzb5dX9+w<3qU4*rm(M6K&4f9Gs{|t{I$y>Yp5TTtsI=~6ovk&Dyd3CjH;$;K%%Ov z>O-<>pc+C@H9};g5H~gjjd-yoIEWS7LJ35Q?I8_u$$BWI-_aW&U2oE#Kn7y4ZBU6& z7-S;`+Yh;jOWuW=J_lQKEQYwSnmO2n*D6FP0pw>x)>pYv)EIukL^hu^aU*o%;-Cl@ z3uf~2@bU_>#@H%aW9$!FWAvOS%gGRj*7#|NCwq)u^E2`p#EmoMOzaKfF!Z(&he0vI zVGu+d_A*GsVXxvC5Q%|CB=$P?a*1354qC#A;Gzwj1|<>GJPT#f{+)vI`m8<+*=YL& zPC#pO+MI?q<}3$cB{AIHa6uoiyZ&YXvA(aapgXz zW)RLgcV8G`pLL#qk*?*&iDWmyEh0j0QMZ^d*hWY= zu5xYRxt?26lypnE=_13$kH~Z@xH+P%TiLB5D!NtOY9hz2>DCgJ-8ybvQN^wAUMZ@& z4c)6nb+@tGMAUSzbvudLDRC)DqFG9EiV`h|r_?Hr23v(#Y84WxRVYHOLQ!fJLewhQ z)GD~tDtOc?q*1F-np%Z2)GCyvR-qiV3KghTs6?$o4z&vPsa3`#0%+d=J>g~}euw2` z3+wr?oUDz+iiLj?iYS7!KzaE0fKS8OKrgU8TG{nzB{SW%X#1M5?xPGzP~r#WMNw2u z+R~=@o=k;+%#axI!)U%2WfiN6GS9*$gG?26+S8 z>6Wq;*4Ya!l=Mz}r#bo%gUIDpY@l*Ud}MckW-p8iA7 z20i;J(3^4Zt?1EjgrVqZ&x5;g6vyCx^q2EtF?qxAfw{}v4Ii2N%uM*idD1xvzq-k8 zvgqU%cZ-Y8u5_j7;ySJ?y1Hp@n&|G9c1w#J-CQ?U^l)t8`dY^hb#h{cTDMbY7_aL>3 zQi83b%wwx4^Vli`s8y63Y!%|DRfwlnA%R*&Ny1i9lCV`oN7yRL6SfM)sa32KTLnpN za3;n=jDJ7dm)cR7A^bLrx1#K}6<%Y!a)_mp$fhfuZARjoxTo==vKNFB$M9@MbYOS2*oL0 z0zo}o4+m*Vm=XxzN||)fCc|WaZL&=^I26+Wm*+9Xv`4f?S)F(}OU}U_yd+;j{q~f8 z3gzW#jn)cnM-n8EhYX46A%{3)5JS-;l%VDcJs6acnJ8n=>F3Zk2NDqt9T^5XxcCEE5MwXZb%2KUZT9WZ z$R1^ng68%ZdknO&$J%3|rTu{Y0JO3nw8uef`%!y5bg&<{A4gj|!G02L?G*cIxRH6T zeN5V&IsP`yF><^i&RQeHY(d6srJ4H~%>8^`%?(jky$!v2j#Cu+jH)zZL7^(B3Wy8y zR36(Ciz80JUT!#kT#-&bTGH2(?=X6^@q=1YoQY8X7m@w{fylyW{QT!&(fcmbE?nOf zr^5M|Drew)JS%769K0asp)8OtDlX^CMaccd#AVhPo_<_E4p*R7m<09p6g>s5!nHL6 z8nUfz%(|hEK8f7#%NpV~)DVf#-xNWPk1)k?wcUxU&4as`%lDgOIFi3pYzW?^SRZU+ zJN-V7=K~(kM{G~~$UfNb+vIK7?;#Scj~p(Cvz&*|e_BF{3_sq&{;dBm+WSF#2=jnW z{+GQd4`yH+&ywsZ7uQ`;m8w#4m6ldzAf#%kTBw`qs5)TO`)V`T>O=J*>Zy;_7Vs$I z2B~VN+6ifDm!dfIDRl~0b(&6tGCEzSqt43E87PzGbUD;n**XWx>09(IP(hEV`ev9JhLU*?+ODgZa}B*s-X>^-JlhV9Ig&%V z5Lg#l7tzA8h$YZ3W_uLk-z5L0(Y}AmdBm6ttpm?XqbM63-ru&7N}FwF8`ei_Mc^v= z5-gm#UHm39i*XJxo{>>^hhsmRxHsF)cD(yj^BLa#x!H^LeT8c&(fi!n%};*#XLW>Q zSMTu%x8WUtt?q`>)FamMpcm`K$c?3XDcZ5+dO2Ij0vvEigd-31rh-hA3DQurQ11j# zn>>bAj;u#K>X8#@`%mK>B(g0o!WJW$M_kN&XTF2t=9oDKK|9$_hLG*rE=W7a&H-iD zvFm}hTi7kYu{+tFz_q*C-N8fKG5|`jRY|kQp(QEBmL%PtYEOj>`!)MDC}Xd%S3suy zvHdZWwRhXQAApn~(N^D0zymN-kGlC#=b4cX2HX9MIoA2}aE zuCv400hP&*Vhs^ z9Gmf%V*h#tu{;-Lc`nA19AZh9EXjr?*=9*D#nM}v<+cpgn;IGtqWB@9F@b0dahM!| zs4h+}mG7aYI;>EGAu`K{JT*X#g)7x~M9l3FHOzyX5H+lYeux^rgdyrH^%aazU#lPB z4)v4z2}V-}4DMB@wSfB&N3@3ragFqc`M5?#zyibz55gN9WqV7n*6Uy$BeQoIO}=l2 zo00H=yV6|)pLpxNcVPPkYwF)|?E~i8EYz;R+EuW24X}2NVeMLkb!k!7rNt1NB;v{> zoheyo8rGRMW0O*>Crf)fP(%LJxfYH*cJ`wL0O4oqb!DD?h$Rw{XG?J9_f&VF?tNHI zL_PTw+V`5sArEyR@uL;;V;!{dwxAts&s^!iI-@aZF!EmbX?n4~*G1lyG_z1!q&QDI zt6-q_8S0D)Q8O0aHB44Vu;zo`eK(DzMxohn#&vznao-Z?<%3yfRzi8R(R{!=rvJSr zP6$Wgnfpn|{Sk;_iSG@V*G)}d(ufCKK`E^6&wA8@!}zVYHYZ3u7r6#RbAD96je`Mf!3AcpJ^QbEUnrie$HV0T*kCU z9%P#5&GU%z=9oFC`+jzgVDFYAC-T^0)w*n`H!%{yFN5PFds>Du(ly-cejJ@2;vB~Q z-o?@RQQY70QS&$2pT8%f=5Gt{YAq%nh?>7GJbx$Qq!=7Ee_Kd;P;OA_^tC8Gnx!Pe z-Rin*mb2v%`W&_GYF|);Ng`fitO1u+r0@zNh z6AQ*kbdtb!ilVf*j&=;BIrtx>qp)~T+9~OzL55Qrdz9(4bXuVuYvZ&*3)aqQhqKtp z>5LYvo6{5WoZimOP{Zlt^nqGVKc^qmb_O^Dp^h`e8Np9Nx;(R632h*0riG|KE2^#P zAk#=YPB8g{VpngR!fHC?wYODts_0Be<%xIWr7MP{*l38umz(VHb z>t>6629^*n#XjPt*iXC^UlA|G0pg`NNW2t35--Ie;-xrDyc9nZFU2p!OL3BTDNYeD z#cATDI77U|i9=pmal}h2fp}>p5-+VJ;-!_0*kX?*ofFPUt1bB!R(r&i?^#{F54;bp z?&N1!JqVXuJyGi&vwE{88Oi>}IA7+rvb@qR&=FA-3y$)$g?dNRL^ClIXwULFT0qpW zGWZ!m^`c8!Cj&7Y%_*QER&if&>B*^rS2|qa6H`p*pLh(2?_J-!j%7^~r^=~v=$(^~ zoxnbJB75pd?5U@)rm4h8IGgQ3J=4~-MSriO=?FKV*FFoqKGHx#SOX2^XyY({{SV~z z?_gaeR0;GdN~&~RF|AD-TvP2#J6tPIJ5zD3kQQ)oEGzh(UcWa|u!$oDagpfN?KnoV z{IO^i`ay!}Z~8-$GtHUKQKNLkte+x>_M;aYgI?^{SnfOXJ;a+I&CiH#e>Eqem>rAW zszz@$0SqGAqKI6J+X^wOZI?i_nuT6zCVHh65S8ZGxlqo|v#UV`yC!;Zxrkq9K%PC% zo(I+Jm+Y6JI%3%cP}5#yFNNCn8}@3bZ*Q{EQ?cK-H$!7Yx1Yc@_E!5-xYpif?}g^} z_xAVbG5=`)1nm&-{sJBBqxMPkn@{7q=#FD3C&$YPIMzvW60UWM7{oDJkJnG=Cs5lx zsVAe&BFtU{G5cx6>9foWP!tjRNgNf8&E>IqJhl=%wvs%y3?5r~9$N(-TO}S_4v#J0 zu4`Y3qiSe3#F1QYUk`N{*VnaM*{z_S-QMm1S1`uE5;1-^Xn^>AHC)A`ZOo%>!lP}< zqix2cZNZ~$$D?h}qwUC}?aZUSku&f&QxutGiKP};Y6VNJ#Znt!sf}T&jm5Fff;g7N zc$US4NDLsuUpw2_J6wof5x6(HH-#^=;8}gWx*fo}&>5I2!Rid+$H8_kM`67~xKEjyuPB?>4oNiS+J>Ou`oKO+R85KEbr(9P(qd zXBh3JG1{w)9#$==!kDi$W4?Bb`PzH?u(b|Rm~jAMM!r9t@2|l3*Wq5&>0JlDndp{@=Ii$>XI1~1%&;Oas|H(L_-KZ0^;9;f4sh3D~9xc{Oa_kHJo)OJ!B z`LgGd#Q4`^{CgG3?{a9t9!CfCrJshb=pmnhN4#&nA7Q@tt9J|*{*TMSf4WBE{|%pL zY^`~09sC``w6~^-zpm+h-T_2Cn*IDvs5!duu5XIu^i;i=3j=W-KCH$eWxRTfPtAmL zmyz1UV}5PB{%LJ>ag>j9oMblotzXE!=${;xN1zDjYKw8MHc0!@KynmcBQn~Kh@N8k zo;t2hB9^CEekso9W^hEm4Ciw*IiFh=ans$9#qs-ctl7(R9Hs(ds8^7$3-v;@#joqv z(H4`I&*8{SE=OkaI5Ja(BQsSwGEJ zC`|)VYg1&VF-K;aaAf8hj?7%kk(p*3jk%7aG1uE??Xz$L;%WuWopMe&XyMd#>OxDW zh0_9BIlY`-(3&GQZ8&1nmLoRpIAYV@+3W0u4$e2uH_(wV7j$Bc+=Y2hI290^)Hy9elLiT;TQK0VMd;y>@<-jFU6 zYCK=lDPe*0O7-Ts+5E4b{7Vk-nG^lJDaB*?!KCv}6KbzLM+17|zsJF2Fp2d{Eabsh zde0iS*Az<*M!Y!|?ulrnijm06UI_2AD`>l*&Ax=3^g(?P*BnWbU>UMFYZqXdh+zqc z<!YA`yLMengoHJu@b_9yBkk*jr)t7QeH zQaq&eqf(Kpb&;!ZsUWzf3k0~P@ZWX*-(@U|eQ^!|^}|-06HVuk!Y3G$_-T&eR#GCZ zq(oXtxuBJ9ekeT)v3G zMeGiF;k*wXa@hJ*X6sXhtxrB%pQ@3wJLLU`_dtBfnUCafEKO94qBZ9gQ?SqGOO7y6 z77jS`COE@paaJwBaoiY=OU9z*S_N@vE!SSQJvV=xKeU&qw?gkz^-+Cr9S>52P%?(9 zp@`ldQIDWSoS-J~TaMzxEpXkE>n_7}XL8+HTz7e{wF2AxL-G*TYAMQjFIJ1O)|F}{ z*1ALOz*={!-RNWPQ~R*}gX$pGPMM(uEwtdXZ~rdRQXscj*z}cof}-REqBN8Rbju z-!D9~sgxhodAcE}KTyZ7T*p0nG}bXjkG(`bh4*h9Wv^_(A6WOtSW_)Fv~xYC(7kt? zyFv0@>Vo!;b9=8{Bywu;`@hefqB!C2!<)&cD6%6|x_>s^@Ah$*0i@^@2ijaV3m(8$ z5gVhX?gBS@$5Drd{j=F}Hd3jFf_vEZA|pI`(Gi~H5zhLHj<791^Wb)WEWhyxx4|x; zXQ}jvqS6@$8fmjaC3nLDMrAc3RFd$ydM?UI1w(O(KL=N6hUQ)pZ?NY)0t-^*;~WK~ zGD7Z=d(e9REPv)$cu(|u2B-n(_dKi~M%^=BjYs=2L(PB$HA~GxySGp+ge3KbdIO56 z6Y2yct262h6y=CuF^&ip*Bx~y2y#?Fa$HbxTu^gd(CAli_1Su%ejPkML6^#V;nFyM zR*L(a&V3#hiEdT%XX6xUiSXFCuY&t(abE-6*BFlJH&Jb|1ZCcevvmtz5LG)(9F(+* z19To9_1E)g$t||k=khKK{L*KzT*{x2YomOwrTZE%4W%?4=Qx)2V30LnC^DMa{%Ghu zN$#IyGzNw#m8d5 zIBF$WDOR>s-)d>~wE9~ktTEOT)^pZ;Ybk_JalVhWmvVn1oge)i7k4e~G;-g;?{@Bc zxYD0)OC|eat0}oL6EUmw1;;e8MGuIj_We zF0qkIY~d2Wo>$^+F0qMAY~>P1qk6WDDaWEH+nI7ain4<#C!#2yGUa3xWhYa9i=uqS zlv7cZT}(M0McK`ivr&{Eh~gEAqWs8|riduYKBfesDEpZb8%6nwDREJh15AmJ zqI|=YgmV;+V#JlbETW@~#kgNbuD*?2ea~0n8uoGxR#cr|G9`v7SURe%&m&g{{TfRA zNmki;nwE1NrF_j1K4D@(KA-aDH$@4`S;x4-6>LLBfpG72CxFXZnWFsxcf30uf1615 z#VhYsfO3}&9a!88;9g{1bTs0RjpnlWz8C9Df&TWNS|liwC-^Kl%~O&)$(@XMOmU~+ z-P7G?aI7=knGo;3=)MRE?#u4W*z;H1SFq%3?rYfpMeZV$<0bA=D0)6R7StBjO=!Vg z!Vf+1bWDW$KetDadb^7>(Pfgs1l}bGyi2e+?-H!a z{cgv*1iSJ6pj&vCU_b8h-BG&)d-%Ec+aa=VO2l5c%adsr?D7<`EHktx5O`0Z;5~uA z@07s*?gONK?7an0Tusw3nuHJ%G`K^8OMu`G2`&Kw!JXj2T^0#$0fGmD1Pd12VHXV$ z+*w#)S=?O~mIeOJ^St-_-}~LV_y45otGrdWX6l^oK6B>u_Vk=H(>v2`b!SieZ2#Wg zuj~81N4OoiKz7rI@{7!;xE&=xG-r{+dwx*++R+XwNC>mUnz(l&9A*m*N$Ua}Y53q7 zQyg|GZ;E@9i;aSWrD2Cngf1^|&h|pGQPY}f(kxj!y-0z?r3@XeXp*O(a@01}?|z}a z)i<8~2Wm|No#LOGPd3AgL_7;HEgY>sUZ@!ncpwWFblb@-I(DHopw2OkyPT(2Ci|6689gjn) zAIey~d(J|a_uB;;TiWhikWfsLW&UR&`%jz7)KDIUz{w1M~As zl~Zckn2n7-fF@m zqto${FXHoqkweG#ki?}+gMLn;H zaK@^K6RGEB{tBWq@r;QVFTx5FRmr%>Vvd6sUm915_F`T9^zQWjM7kG)@2*JpI_(p_ zdkNWVK{EO+o|nOnL~>)6W)F=7cbjH2$p?IVw@a?XSpn|_cB?Q zJ6V=BS=KgLRxeqWK@L;9OQDmEj8zwn9^LMJrXt5Dq93sd!RlltZ%OIVcg+e+{THnH z4r;j%YFQ6zg%4`^4{Fg4cpt&%p1{dtuJ_^)(AVy}SX!|-oyBwKz3+cKqDbEOc5iYf>jLOS`h>6RdTI>(6^gdYw@y@?J*m*5G6{1v(k;0w!UBqg9szYok z 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 CNV{OH4wT@)oPBnFP14!2eNMsLmhVSOLH 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

X8&e$`po>z2_6n@o^oPxHJ@#?v>Rk%W@NI1 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

(pnwc#UX= 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 q0%cN>VW!DSlIh;Qhwz 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 EUyy;Qga7~l literal 0 HcmV?d00001 diff --git a/local/recipes/libs/lcms2/source/doc/LittleCMS2.19 Plugin API.pdf b/local/recipes/libs/lcms2/source/doc/LittleCMS2.19 Plugin API.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b2099e7e254fbb9cec58800948d1708c957257b1 GIT binary patch literal 704682 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%0AN2Abn=A;BZQ4&W+$j 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�Ji!Tguc3bOts*jW5R$AqHp;CBI0{a` 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 k?Yfg#SsPrNQt@!c49)B(tW)fWEVLMPDkB6y8 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�poQYz-cw*|D)(}J4l-i~$Kk~@qG|Mh z83@Ma%S!JNk}Bp)*8U-&&}1tP)FCA(igpN9q!Oe}ct>cF@E8p_aM}?{os&THC&Yq< zaS9c}B%MKmm$*}C=6s#@tZHJWmgJg6z3#cLs}vt>jt-9@tDfo*tD+a+!t z;R%_s5h#n?wAN!DKu7%&r5)vw0f)7~APg%SE(Mz1(H++_9{XvThg0iAyuWwILUH~p$R}iAxb|#@nHf&6#cLis#5|(=CY##U z$HQ=*m^uRc4GhubSmJFw3^S3Bb0|~Gz&jJ6FIDyCfepN7Avoy~o8$&5{7imh!&$nw zQXAj&_+d!?>2Y`T=TP@M-Ju9WPd*d3IH8`If|bl10(Og##h_3-NClq&F|LXRa{m2| zq$6Ots|P=U7kDhPG~C4C=G29(Rh=OgKMUD+b8{()c{9K2Yh=;gecXW_I(9F$V5xz`Z0IgCp@>Y5 zKj9M&VGu#eJ4&QvZ>)ycZhk47D7YgXoHLBXOC}b}o$2S>-uXfN93WQ+Z`fz0p)jK) zA?v4&FS_|6sWUJEC-P0eDPX&)fDO;mdPK;#tW59Irx7{hp8Y=0Y}x^5qf`TbNExtz z7*iPaGRoWA4y$B<{zX?qj!6Ft7uUvR z$xMM(+NRqUxQ|EErSd@0c|AP!Vfw-O^g{1|>J?ww`NlCjv@cVM;_TboC0`MN2s)Fm zv8u*z#ZI6=yd9gk195!24AJ! z>NCuFU)sOzuBCF<+NK^luXzInkm3a}0ziMS81#$)1x#9Dn;?j>K@bJ{c}NC60ALbQ zYRS~BlSQSh$dS1|MJ6=ak;`UqrZK0{StifZT6?vzUuKeJ*^p0KX0RlX$=0*5Wq*HN z^Ag$&lPAcPOqM$J&-*s}zJC3z$vX-T|8W=Se({tuq4)d&IZbIOd{D@8`zqn3d~h`| zwN8Ycv{;J6FikvY;%vTn7$gqW>T_glCZ{Y2B~z0^HKJY2t`^V37&FeibmkJgvA2NK zXu&A}4K=1ZXxK*CGaPd#^muZ?yXy)&?@oH;`@R!U5{+AamgUqztkVQG#kvj$wszF) ztnDt_Y*)!jJm(H|4KO!up#QCO9M&K8pa9HkRU%$~`i5iny zt-5r#wpBOFR3+1(b?@5f`H4sji*+2iK}Wo4R%k1x1ze$KT`C9dSP?`;yjGr7OnunEODGeUQbvfb?no!Y-9dFED6Y=Zz z*WR8N0=lR}8`hJ!x(dY1^bEvrf0S`}?d`KBPW@wv5&3!GZD5NJg> zI*}Hmv2}V@8LX9x<@D-{#LEw}s;~v>x&HA}9mvj(RJqiXnlQb7#Q?VM{IX8} z*x0D68b$0WzS?Y?y1(mU+%mnuXr=24tJindTX$X~>Q4y$u24_zq(Jwb5}1gS z(pLQ27Sf|Q*t6Z)f_Os!Y9Q}6F$7mVAg(g+WWBCJFS@PUic)%MWsgEm zoX__WzuB|{$T3!x$2T3gw9Yq={!(jt-44IE?B_P34Gk6LHX=TyT@okSg&>Dc z^+P6Ij1%HaJA)DDfk7#g|Kxre0fXZeu#B7oC`x383LJLq8^vbhP_-KfG4-g?X~~M= zj(@PB-U=}IUXmfs+&D;5YjOE~xqpw{Exv61*t$j|XU#Zgw_Eqj2O6=wA4EMiPD|ac zerpSJ%Ou2dnd?Prd-h?K6qbGmOu+tVG#UtEj|tGeESVEi@TL zQ5Uh3Go+3jRY%b=x=JENS@Y*AB;6Qg7j83NCs&)6cuF5wp@%giEuAK$S#@EO1y7!T zQZ|A`qd+AokU40iR7EmUxq=gTKGW!pM_|FT^8;D5oRdpr!6Z)Q5e2&@leUv9RMGC3R`I3Toc5T_lp~mF zwap)02GMF0eRAUv@22(Df%@%P#SX<>%N*Z5{o`%M!`m9s@eF>~?GJgpm-r$HU@7eT zIz8{R_czib9V!bb8GTc}y^^Ko^r)&fWpYFAg%i$}v5l=+v%M`IAIry7bLZcmdf*}3 z`G$(l;qP~isa z7K{goyt^KPB_&)deCM>Wq@rB9(M19=?EUu6)P44rVO^}5`JFVtR4Oq@<)8A*3ZxOGz`dvnp^OoxK8{|jgmYZPJ zgA0t`j8o%DQ``29$JksaC#NZMmy^WUT;nWBnnG0q_f(=z^b;*At<&%fciwn%Ts&LQ zQ^V}aa{ToXvX#Z=EA6=##a;Pu9O4iY>bxA=ALZ=Q=aa!}s=iOd}=hp9P z$##}`%rb9IshfHLr)Exy=0TL&2q16Hepmu#MN`)6~!nHKnLK4HHv5U{fmN zcKBUuGd*7@0ETYr%^4|a*sI!Rhv$?w$2aC!cP$rAUqQ+lEwk~ejjtsI-Zu}G$!B9g zSC8#2+~ZakujKOCZuFYUww%tvyuf+Ln(~h2Fw4M2gz~<>|IiqIH?_r1-oi-*fqP)f zj5jv8@iyo=9>H%QUb&{*TIBVc!zE-^3kau@EmxaAuNV9E`#M(Nu3lu6m#D{I&?6Uf zF4byJh}T@fTV<(MQiE58v@Yjex&AFTab@Kys)Bga9qt4}Vpo_>3!p$uGrEN0pvBwC z_FIe6faXmp<-JsJr+wNGai`>sqSV#xVUOhHK7ngBms(z&xre$~mF!d~d8ZN&gKRhQ zF)rH@6i1l~qMUNO0^exVD(l1)dEYk&S6t6+MQMGbD)Z!41 z$^0eOg8PJTJt9^Y<=xJlxgi06sN`k&%Q~pEFu&IA(MoBxGe6&3S<}6>s$h0OLvPDs z@4cP6fpZ7o%7GNODv>H7iKp~HUB+guJ&apHtkcx5P6X4pA;2xsc28H5?OE=mCGayh zE2Boay(*EO-kntw+VJ_-H6=-3S33gUXGJ@^1wA3gd91VwkZQH|aBlT6y{4pX9jbk(zi*y0$k$ijQaAbg z%vsCZ3Y#@F&1MX%&5mX@bRV}R&|@y!T64OZHC088B%1i?-LA6ZcRK3I_f465tn`!J zTW4jANzHH-j<_F%>ze#b$51|I^_}khZ>HyNoaO3VZVfsv!pGLspVk9i`>?Nzi%CP) z()4?9boJ{tgR+(9OUFs8Y}vmfs&u#JHgvS+b-OEI_fdG+5jLW>YB7?MDFQz7L9Q2eGpUnhgDrO+3!RGPCr z;C;iA?nt}diMi=Ui|-52WEoFpO>`|ds=aW$M0eI(I6Q5Kd54|Gs%Gpo*E8p{{DA?} zezyTx`z<=D?y4ty=UWt>6cv5#nfyT0BF6blKSeF)ov7$gx9PflNlR08S@lHA@JjjW z-|*J`Sos^bZG6|hT(VH-hT5X6$FYa7uC<@Flzo`Dnbz9cZSCI&v5(k)ckiEP@jG>_ zo1W^eey*UMC%b#e+iuR`JNTM8T#9a@e{S@9*?o1(3(Nn~{~DjWNw1$vSbr9LlV^=O z;S<4L7QhmQFt6gvFlfK>8XY_=0TEFdLuKIP& zJHuz)Teu6CuiJhN{rU14_ePi54%>HR`nCFo|H_wmCmF=D+C|9I&S-R?5_vn7Ca1&s z=PH54*~$WJ@5fHw&bk-d#cKC)w&nRl(`nCx?R<3*l+beUZ`OHcXPyg4U(UT4oNyle zO_$ZWal4KSbH?*+0@g3!lF8cMl`9R3CVn>-H|>k66`$H+BmS6946pry#J%n4Z;mgS zkE9o`f41SDoruXm;*k!FWxL7<>}((G`lID+Bv0+a23fdfA<6rkEOZ=etcexGb^xh4yr^GV6zrdYk{(YpevFb%yqb)T zl1@%d!>?>XSSgD(tG%US0Xs^k;`_>$Q6bwn8(#$4Ozi^ah-OCJK$t;&VceZga6=$% z?@F8n+A!LNZ3&wk5;rw;=ObYq#~17ZN1-+Jsg`F7W2!ZzQ2b9PVNGmIG0zmtlqEY< zNsjVg@mj2TZMF~>yR0wneC1ML179Ui%xojk99glpE$@;l|DFDI3#}(B=|&Gp>L2dV>y3$NUiH2YXEI5 zf=3}c94S&JXj0%2UKl4;PM;nhI1h5a7zl6T9%hLTfp@=XAzd0$aT!Z}c`QGzq%l@x z?6VzUI7JI;e;xc0L!J*4Ez5RPCuM~(tAt!*9#iCg!ce!sE%hA80U?qMLVh^biiHpf znkK~~WJMZOMJXh!PYe2SS%7QJ6YTzYk_IROC!)miF9$z4m@I-PXyT^J75zRmq%^=Z zm{R~fQBmT?%Fshc3d0vsWjvjlfJJhF2!e-5U??~nO6@|eUEwSZ5D*2T`CnL-87~U6 z&TivPqDq=DvOsu*iNx_%7Wg92M3fs=BW?p!*>xqDFH6EK^bTj>lV863Jm}v{wO@*1 zkIwrBz0#W)ko7ZcFdhv2asp6PY?Xo+#JTbaq%A)ccBL@V9UmqM#FSvH{W*ezciIfN z`)z0~NojXxoryD7vp{t7EsAWeLC!J+zM}|-h@yu$2ULa#;_k}V(vw6P+A!W^$RQu0 z4ch=kGmM4hFFEOV_lYXq@g3lbLYw8P0-bAAJ1z)69o+#ntsD zkI@edwVsGD;{W0MJ+hw2VYsiDY%M*?xel~yTpyZ%FFy6kkfBNgyO#>Jd!i`*wz^W! zM_5>v=QEkF!OQQi83G?+`zE2V&m3G^J(PjYB<|oQDu~vKVQeR+$4QcP|=jkXsv8Z<+Uc+rmI~ca;)A><8}hb z-8B#dHPM)Z9n2Ai9A&$%GrUboX2$|9FNta_qF^mJ`<4(_VQ*&x^YS82A&Qy1zCLO} zFy2ATjH%dhD}JV&kHQ#2RtUPWN^bYpsAj!M6q6^qS%e1^qiV+YB-aDrvCph0S`1%O zh(>z&5w8N-yJQp=fEOjM@F+LXXkGY)7xku{PrXT{5A zFxzmVt5~+z%EXTFhbe!#Bh9d?N?NZeqz!KDa*_j;lDCN=FTWSxJM{}uP%OM{425+x zmoG>S3FOL%v58>}@m?94l2NhN;_au8^a@v#g($fFa-ktgk1AP%MKWYd-jx!=kYE`Dg@rPECC&R40TaM^>1u1Y>9s1}Z_-Ly)D0=O*t~r|MQ&18!#Njmf zQ*l>TgZADU|H#B*L4azRBOp4j+#r72O9>qVzGU++0Il3A58DVcM|_9Kok-`e&&G~# zW%V>r?}a2Az=8)(Q^#tKDb%{^A=LKi?xVM@;ey)4N5{xH2B#G9xQ@Hx>Jxl6poPcE z6pmWAKMw+SAZpU^$t}5&m)g7v^|(%(3Tv>Wsxw9srPV_6Q9E1<(3ioEQ3=01cFux7 zFs2-NMFx1rZ3CX{b_U>c8QHxC~b40=7+VbS;48RiIzr6M;=NX*Vk0h~BN&Ej8pbdV3Vqsu}acc*tji zesS$RCa{=#vG>!WuR;KxsmG?p6?({oGMiZAo1oPo^(up|H2lj1)8=;-(oIWw!Q+wS zdRyqI9k~gyMBfm9=}fUqCt?TST*uzVa4f1{tCg`Q4Zr5tw15~XLf+(*J1ATVaoT&5 z)TmydoXi+o97YrK%BG9XS~dtBiI^6l#b4p^rlW~(9R%9p9dFK$3b1*x5=)`H|n8id%e{RARNMBc%P3K5-GNhka=3CL~M;3R3tc&>s2A*oMq zsbrcRU6O1-!G!4q{WI=FC-M;y^ZiZC5%t}oDGX1af{XO&t?w(;7fY&Hthmp}o(aJ` zzC*dU1w-nX88Iv@BVa!-cN-lEHEf0qNNCW51oK|{hA}Snagc-&6HbDWvG>B^*I-w! zKGblL8zY@$J_|D)D3Fo>%xIC3K=`|HF9kD#DM(=;Jx2ICZY==>5F{TX;yq{~roN3< zq)Z1tmz810#yqhsnQ&LC#wPy5Fp*4S`lS-h)Bwx+`Lc1rZ~Jg$pk>_qNwEHey`BLO z3-T&N-nd%>4HxiF<+xaSJ7jR5FpU}fhcIEj21dFnTU$#BNre4T3l& zl0nSv%v2C=WEe#?8Zx4MezI4jcv%>beMNy)vbR1!Ml5KdO8j(*o70F0MM^eg8InJn zFF5(7M#+Dm{_qteA1Ay)&pHrXy>1&2eQQ*&eOXC@oOw40EH2GV#&sdf{|<$_Q`nuEEwq=8TZ zj{7M^xd%-nHcc)JN(go&B7mZk5JnMbC17M$$EK`A(T1Uj!MDp<#OVyd0ODQjzb`nm zYR6F1lO7rzzudMY@izd&M`Yh5z1{T$z4%K@i+=3os3U-)3`;(QG z>3D$gt=I04fWKY>BR&CgO&BsGMjFD;FM53&BpWjfV6`2^6FRXWLy=%i3cgI)1&;R} zHHIMXTMrO1xQG~mft*ahn3n@Vd>BBc#mIdk>p?-Wf!OnUm2jYha;B@1>N431f^VXLJh6QDLG{REiM0Zd3tKUD|UM0KAe zz5=lfpdDd)@geqltP_Mc*zs1Wiz=ZQzH12s-f9HVbVE^!sQ3*#-Z;0@U!< zVL;;wY;)y2mf!QYiZ7&mo6L>-4OcsJ#TuZ+qb4nXQ=%F-w$@Y-1v_ z3b1(@SQA_0^!BH4NK0@g+w86*ETe!Y4{%R*FC;HmEaZbTw<#Trm1CTEF61~oJSV!# zsT+uZOyaN(dn>@N+q;&MmH0|i?0`H8ATP)tzBk)D z-JrhkH}H4QG@eKg%bstEt;^Z}wy);yWjcQP$qoB&i!J+<&Xm^U?EkgjPd3@D*Ih4N z?cs7qTVDUR_wCir=LX~o_+<#zZ=h_8B2jW3%UMh``C6g08nqQN8$`CgMpUhLgCpa2 zmtS4!`OkCHw;;#zZe3Bk+6Iv!cV8TY=4B(a2Or;xhxO^5leiE;qe0+fd>* zWH!j{M@EDhEu>_!>jQlHL>Hm2L$-UZt`}388$hk+ez%5KTz!6rf$hl(S2-=dWIXQv z+<*_48^`C6?0=uw8 zG8*xTJD&EnYUI3vp5Su%D?jaX_2;`FA99=oq^2~cXm*|HmJboi#uqUms>kP5fprV4 zK|HgrA_ROTpRWbB%irN<;Lq_u-xxQa{l0$Qq=ECF63^VZ`b(Wqhu@X6A1TR?BN zo9hDI1;7Wc*Joca4_-Swdh(Ak2xY!1-yk#Fi`{?^_>cBTa^K_uVG04O3NjwTVTRl@ z#KD^a`tjgS_jprYsSdwlFjA1LXxNgGr&{`2!f%GC_Q@zt8QcIiEk77%_!+xk9;k=5 zg)`Kns)a|fhxmm?GsvATEl%~i;=hFcI!7oc>^`mz5I!X_#37w<{Te9GY6mnvq^eK%Y*_*B?SvWQkYTr-50=r zQ_~q1%GA!p*~Q7!(Dq-}-pC3Tiiw$(fPvs&R-1r9n}D5_L6?AlS(|`~o#S6(W@RN{ zWo7#ja%vN>v9S{{axxMyGc*5(I5-JdIavOq_#^wD(T~ADM*qL`fBHXj{4>wL^zUNK zZ2wv9pB34enEs`Ics52x0`?!*{*nDy|G35SU(J8k&+bR}AJ6`g{g0TLfA*4%;b(7I{vU5|85LKv{EY&GI|O$^aCdiy z;O-EDySrPk!QCB#2X}%89o*gB-ClCedG7zLdq3QJKfLeSYgcu5^=_$ORj)m>W~x5c zz|8tFH7Dzb0$BfUg_-jMf&Xa!Z^WVVy4?O=;>3>Y{e=}4cbN}zS{v!X+xc{<% z|3>+*=s#Zj@7@1jJwHt9uL1p!gZ^7Te_Q^shks1+zxjXb@88e=GvZ(VFQ@t#`5*p| zJN=dYGyh-L{Qr;QKXd(E-+!;+?`VJ5_YeOo|6Bfh|9i&2(!V9Hk3;Am$v>R+@4@sT z|L3W{<-flT`{+jB)kmKWHl(4XNHgRN>ur_iw5i>Ei`)DSG%*q(baWwU5+k%ERV*}}C{?IlWuYRvKr~uqtd1{@NRjO7I%48w5eR+_Xu((o zjS!8)@z?JiPJ6)_Bk0!8{Oi}=6W9-{ZjEkxS!r&jYg%XIFlY^ZVG<_B10{taV;=!8 zhL}I)g-oB((D3tZwRDK}T7}OrOk<5+r&gbJrj@$m#3^xgI1lJO+gdh6AI$BEJ#FB+ zt#Q5%p_n30o*1C<*SMHUD_uUuW8aZgSNpHAqJcaeW@vWS(cXZp=jlxsk*+AOcyIIJ zw!mhm@%sE6*A-1kRnAN*-&;L#1X(hThBw&Di-i5Ecn@*Qkh&iPqQjbooK@CA_@SV|{>P3G~7y6lLEG=w3H%OW6$e#_6B)kKVlX%4a zwf5yG+LLVt?g}BT3aFbrK^z-??1IOINN|}zk4lSg#DJvY_2X@urwI(2D$IgvsVMt+ zm(SuY5`63(_I3${tKr+x*=Hx19fB?IxVhdOXhe)uS>#jc^nz?r;&!RX86*KI5ucwDX=>tvC29{%k@1*|FBT_3&v=>%ey0U~u80uZvu~ z@fWxkW|8^4NREc({D4kT{5Z4hPH0bU$$|!BHf^6s3Ep#nUgXoMIL=W4VL!oK(m=Ci zDeIFXqB|!f=oWFibQ?MG7Qu#cX^YAR>(o>AFqhDUD~oq*THcYs@k|v9;U1F>6^KU* zr0x|w8w`EtRTQv4D?GIKJLI!WFP+dP`XrG>hIz4ov6&=<3+kVptzBbZR=}x5l@W5U@~umC(;#~f0`h2wzj^k-7P#NC?MWmSdHdgjZ@dUg zJ{~HOWg*OvXDmJ8Nokq6uR*y4N_<;61>6A!zX-qpMTx@zoYza;*L9l2Op*ZFqRwRY zgMCs@bmyeX9B@xhKYw4m08d;g51Y+Ly$X7q5-O`AJ-=*X58yU;{64q-^T|!XOw2pn zC?Ro##{-jG;&v-*EPNqJ48W0Sv06Q2pGo4qxXbK}Gc@&imUHy=3EC-xdD&afZ_*px zX0pXduCjKIg-GE}d-$~PIKKnP^U0z$bAltHp30!2z~dVc$*VwA7q2w+pauJP6eWY2o`y@d^nEcK@D

%<;>ync2_2nXbuL=2@F-$gSbp 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

jS)}JC!O= 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

&V%+ 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 z zE~?h8caD(U;Q(SY<|WO@#diTcT7|>7bx2vl`VXuxUMri4RZ}s3qDzqpN@X;A!f1ud z5%Lr)FiZ~cGD}R6x~-vQk;$>N)Jc70L823^Rm038_ku-fh(M8PBD|*{!P0bnyrkw$ zSoX99k4ogS0+g=Tl0_$C5dh7;{Q9g0w_L)m@Z3T~C64zy&U?oBue`MRmd5kRi|^7V z3i7aR-|2o8vSgc&_?C}1fgvL>pLIdMWyz^PN3`=+@T*$hE_a4n4heUlT0!>?yUG_c z2(wCp*`$plF@;3`S1V^`3b~R=y;M1?@i6CCjcLCi!Yc8K`KmH3f*FeRmCnyIq>i$Y z&MV&A3MP%dcG=m0eO5^leV6s}d?y|zqmsp%6Y(CkDTtN&GmH^VX!$-Xd+aN~SwLTr zbdty!%~CuocPzF5h6aCV2{6oKi}T#IYD(oU1dnUJ$7%`&QL`Z3a75SSknNyPq_!y< z(%T|;$O)^-*WG#UNVOzeALk0Afa8W0A{}r{WZD%j4BWv);FP;>-Nq?s{g3j5WTcxS zj$UQ#*fpg&7kKVaPJB7a_mt5@Zp1>fwBys1p-6Yvv24xm3kNmH5qV~ zbUvX^PAp~(E*IoCMTG-@jDGe$m z&s^)}fuT30qd2!_E~{?UKrmhvCS=lqyfeKDH7BiiYkTn(qzqbo+L1G-3ofT_b}fMb zli44Tbp)ARYz)z2kNOk4TJXxNS>i>>V!q{6gK8e)7NW&Fu(~W8S3Xg8p&k4IK(?yFjJ;nwp5Aa;Nb=?FSpL+Yt_J)A30VP0} z)~2UlwL~-`f4aZ~#Yy+}&wCqYSq5gOq%LD-b-a*L8eT&q-(?hz+yA`2S=X8X3vkg9x?&?QyCRuM~_WG6*@eBx$u&I?t$x$`xPfs zB2!|MXAFM~|Fmh_X>5BFXDlg`Z2&N)nF;{fF5;+A}iPAJz)nRkwih(JA@JhF+Vx)JBgcOi~6+nq63XtTEGS8m>mHg`!2I zh4lif1w)HW3qyh|g$ufgL5N@;?;PPo__W^ClR>Cyq>wTdSc^E5%a}2u)korAfSI{d8P-|C%3~MAGz(AbPdA@ zcuohiJW@lsw4m4Oyp~Q!t~_H#c^`B>6IbIu|CB|SEO*N)zBXlE*f#s3=Ax`lRyVg5 zWDBXY6slR87d`xb@x@i%f{(bC%0-_oPgUflGqGj1nl_j^k6AJDQMm-KEF-WFCcYM?7Ks*`7Lhw~1!;v~1^Tg_k%AG65%V#nk*yJh zk-m|Lk+%`55qSl51%3rb1!e_f1`*d$sdtp42>j#yRQ)IYCjGhmxcsaAs{Lb7wjXRi+(sdOkoAc55$i)%bXF8rG*L7! z(kpBS5_YPFhgZzU0;^{o#C}ZvY!5Y23?G8f+pxXRuHHD{IIuWSIEXl)9`mg3BOfTp z{L}pGAM&BrKUj%-&s<&c!ZPfIevkWs?Y6D-8=z3=Np4(yd_6(&`r*-`R0)vk_=1k7 z#k=)RM!~*{FKX%n7l!-lyfv^jg?3bEO6VK+1@5J&WU9L~P&)4UGGsYKMh?mkb)V=< z+aGy-=|S&KAM3hYyzH^*1APePoS005dPmR_>>8G*Lvx@)E3a2B+lJbxyu{!>r}`&% z2RDP4wNSDZj+OehjW&X|_%_wH$?O)cw(2&gPT_5X!p6xi%iS7B9U4^_eOG_C zXN_%^dl{0L>dPoA?^dW+KCa-en75628(y`+D9#UIt!gQ zJWoTTl-X7y^k~)_!wU@eq3P`VN78(VH{ypVJu+`VZ4@?5WYwJg#6h2V7E-U^bRBA)Dc3@!@xdq8&o{igVuP%scOC<~`FtjG%REZ6|O9xCHE;x3H~R zuHn_yEgLImD`P9qozb1qoSB{Bo8j1v?GXH!QKLApvp1u?pYF2UWTanHr(-XKbR+T9 z?Yvzqu^wPWpxVbz{rZc1n5V^|RE=RbTn#ctcqjZm!{{E|yE#+yWs}#7<={=G5!Vj} z&ah!>xdGWK{}u_?Sfzp4&6cOp3@4AY0m33P#7fZ=y{a2;PkNF|N4}jjnUXN{*NEcE zLGk2#pCyVuO%#2RC`yqAzk7ndYl6Oe zqOfbCuzSM1Yr?#HV!LZ%yL*DTYl7HUM(CsM`t1Z=I|YvZVT*4i zw}I45=Y%``9Fuca?q=S&7s$dc`;xspXdGCATz#BAqi0>{GV`o9kKF_Q9^xJDQ?}zH zCDsTy!esz{fJlT>YQTO(ZB4?(A#6kt|N_R}8)bCPC#B_^xhQjSsoa=LB zpQJPmd4=UL5$c!k0Hx{~n)D%fgiD1-KoTO`w|y?`t0cWRPzn6wFqOy3+fQgdC1d!6 zuvHRC)WzDD5Ym3i^sCRPs?%Rp?tyT*%fSO_Ls)WKwD9j$^{r^R_Q)zZR}tRlfLk zh`m(57Hx}JB&s1NA~&dNt7p{}(-PAW)7C7@BKb%28A4^+U zWIMxDf0K%q-1}lnA$cM>?1>T@5<{=WtNH@deWt4`}qu zq?|+Y=iT9z>j%6V0ZXH@RVroN&4CFY-Kwg}(qUpfZ>nU=s%kVox>Z`036^#qnek|| zJZBOS637zB66#ErnP`9J@B13(J^>r?20_}nC5Qla=0|>3r>$V9kX)45eK!!2EaP*f zT*aKV^_X={VQ_A*g{9$}vM_B@f=mt1D5<^3r!Acroxk>!Wg1JhQK&4?nJn9#!L}~o z8A?6;@jiJLkjEz1GGjbLZVloY11_f8i+p6M$gFv;6H(SX^US*V{M$J;tPaojymV~F(0tMt>H#Uby-vE2MZg;D-(UN?7aw!R2CrLl z{A-F9?DqJi+U3gS+B$9DcuL`N{TYlIyM4ps4UcN~bEo%Mq5TYdWHw_vO4_1mWaF3as>S;hP(Z8$Ym|wPfhZLUA9?~CGkkO zavmkPfBy_!IGS%W%H4Q5h;M7;sq=fUV(b^5>`I<+82uSx=HTSj1JMs~x~)JD^s!Bes}G`)c-z_+)FJ#Fig9|% z=OM4Ec&(YOmaZ$6H9a8D-{z^Dd7ySMY^XQ5>Z1++&?g!#UeD02idY*$qz{9N zkY0yqs(I}^ys{&6inig>lfx-%tf@61ePl?wCra>&Q0;E ze9FY+J`KpjuTqB#DvE7V$*+IP^G1xA#Z(H|u%`7>nxD-POc>|E>goD=q-;2JyArDk ze@-5d)J3wGU)!L0CW`cDnzOxEGO{7^3@cAu?)X`1gQGh%Q+aNK>KWBKx@<(&`yNiW zFkDwr|5M|F*E6JbsIIcT^6&t9Aaa3MCjrDVhF0qzpzd-+9)6@k`lq3(i}4=5s8;$} zc;NTK7q7DW;PFkQ_h_4uVO8z{(*@5>Fop3-)y6>(jG<4ln(Lqp_NI@uBH}>EHOzaA zwVLW@%tUkYi;R_Z-Rp&0ihI_TJ_KFgZu{BgmDm;Ty;56z`bm0Ft)?TaYQdF>`JAfiJ^=Gq>+qCimP)2rXl^o|=^ ztslv6hTs#umH8(c94`uqq2F(L-m~W%;SA!CUlJ2s#Y;v!v`_j0L@AWJZRPlUE;;cl zrqzjf?A=JsjE?6C?Ud?%X@01A_D7v)UJYR!g=sVEv);3D&O;B|TK8A;MYhv*5#~7} z^Y>rDk#h4yOZn1!21vWt`2^BTRAQhCF6Em@+qXT(1!_W&-f%xHQlT(EV#bbq1VD*+ zz*xaBjsZhOeY@}bQ|RU;)1c=&w=Dao_+!IHSv0S5)=HE+-$#}jxI|HhkxD$p7ZZ=1 zeR753gYxW=q?)9ZQH3tP*UhEp3V=H_JoNpiH)&NW#cFR7WVe15s4(&knW-`|B@FV= z@)1XM9$uydYSQ=~%*-q`xEYorCt`DXH{ppWwVw^kXZft*v-?y0{36|1d2GRtONkou zrN0yN*u?!w`eXV|)ip~8&RhQ5N5ZI?Xk)?K9ZqY7Yv!v`$DfdH1ccMk*}hD!nL41i zkdFpwb}+4}A6s2X@niX58lbjggSYOkZ&uTeS+2~lco*?jP7VOT5J!~O<8vSf$$e&y_SC- z;3)cz@8+$8EfUl|;>>(Rty^X1C#QUf_l0JS!JYpg@Xp~ubnx%%qKo60!JV5NqraPA zHS9R|nAV;1->;0{*9GQS!0+qg`Z)er)#1r4bIVhMM{L1afk_=>-NnaP4x}xFiXlmz zB*%{Y1dc@OtT%NFK?iHBo()5kN6~(NVV*Bc#N6h_mUvC<5emO%Zz_cTDDC>csQvF= z-6bz{N+10!*#Czk2n|IpD%f$+p*g40FWTmY4E<&JN}~NCpE7y-bMJJfVCFCl$hz8$BxYIU;RWDkox!e$=GfN@ni_>Mx+8F$SwelO*}E@$#^cij^KrX9q~0GY zw_D?r)4e5{|G^>{-rs0ue8Az;_<6nhIEM%DW`ry}RM0^nT77GIpGj-@0Xf znJ9D&8Ml4`Jjh>uj#oCYvb+bb8a!O`x-f0{)~^9eOqpyx*VHlvz)tVS_qAr4p<>M~ zms64^v)vL5|+Iu=@QeOh(6H4R!jYmwDnDK4bWox%RHIz$BpR|fY1+=Zb+dN|! zQ%8GKHOAMB*y(e#524J!0EaNG0UNpuHT`*p56eHYj-@Z?b}ufI{;CRYEc?i6ojgSP z3(oVc9x?8wN_al9-<<2bWawexzI)eTA?`fkxm?P>G-eNNpLxx-Q-AZ;z8Q~}Ocu0t zW_^9DBidefd0l&dwsjcjZ9T|RzAx8!-@UTAc#qhZK6u$b@Dh3a$B-L=u%K3Jcr0k4 zZS~Gxf5LNgoMm>J)jsRX&>EMQnWg>pT@~JW<=7Bzi(LXu~K?fx&@RzFoK3s zY=$1*Ei8+C3K?zCU2#qSTu;3RUEv#l6Qkwp`jasOF>zAOgD~Ev8lsuWqS2tNJo&lI z<7V#gx=;YpV&PN6ue0p5(NPJk$YDGTz38uXcNZQs{8G^xa@YJjT!tR3S+|5JTjSjr z;h`U_8CDeD&THJAw#NK=>p#{_acpqqlDGxjJZu#i4VGIwWDgY3dq4zdIXtwrWYe7= zO1!AbZ?*Y5ifdckvTeQ-Ige<)yE!er4QYDPvls3Y>gG6MA)`tU^hkRwG+^qN+-#8G=15L_q@(^HHEo%I0&5N*>9*? z)DA6gYnMdzhQj)l`^R2UM4eQ>KT~XC+`0_C^bOHfq2yy4f_~oj)FeCWAK}Y|daZ8z z)dO?)#&3o^&3Th(&SQOO**q|idve$T$GoG~?`azAFHpzuuO76lWcl(ti+r}*zO++- z@kFeq&08YA(vQ5FI6H$_}TI!Z1La2Z@VAmoWh#~yE+-%8(jJMxRsq-UK_jaw3Y zIpgZOCPAbrCgFHo8S1m`25Q=B9j@R>H2Mr84pbZkyfEzo76#Yv)Eu3lxdO)kemsyL zTi5=YN<-ZCh~m)+l}lrt=gPOXT~p$l>ngkr3jW+zzWGPl)@bBc-UH)M?>ETlyh;U` zYV&4@GhV9J9%;S{(ZL2&%2#$!)*)*yX!_?nsW~U53wxG!4aC$nJ?L>oC3AQCz3sqo zJ3Op+*3ER)0>R}uknez&j%pu-p18#4z zt8DvSh@Ceay$>h-#WaQ@DL*4=Zy9e$JA!=2KddDutjv3Td>S8}uJwj8zDfw}!6QhW zsy(Mn1-Tupu#ee^P8Zt?@$Sbf<6o~m+BKeux*OpjCQtJ#CN$BesN3(GP-G`gM0cY8_u+J~f_62W@EabvbcrYit){A4=Oe0Hj@lCo@f zg$@w)zN{3>C)A^a-uGAin!+V5!{pCXa5-{h>{WMu8z$TqvuAb-ZlACphefd;bLa%79i3kUHzlZl3( zn4wh%Xm^$wX|OZ>;ZcO5nR<>@6|Xj#luW9ZNVrhHn_}qw5u)A$C+uU~y8#*K-> zkfOwf9;uPdl+Bc)1mQGcG90-~rA)RYFKQ2JLE5>LgGc}^8+~)`DG{LD(X%_3KRn*| z!kP);g5a4m^wECB_uZGwU^`gaTY}56Ndp zrUhCik6(gzi(T!s2o=zo zVZ1Mk;aS>1nzG2X)9H3m>}|dm+KA#}v1GU4xuS?*-sC||4t~a3hD45|FF@w{>W8AQ zx%2h2ri@%cW1$Vf{=^u*c)mEkLEDyu7InLg!_7lSGN^M-(R{J1m2&Ik4)@?W?mqSz zVsEhQG}PynBV-cd1R32SgVg6j0b-#(S!Ln*FnVPU{{gx9*=?gbhf*(X;(z>%zHr+n_4`Tc<4?0+dpG1F=?*4rI!kt+dSJ98YTXj{EA2aib zQegaA{~G-&$uYA#uP{a?mKcs0Dq8??x7_OX8n-)RIxbrv*Xou7UCToQOmKi^H(QtX zvD`7~m8pBVxjB^=K^qzZdnNd0O(=8eabLy5(hBtbOl8An2qmS|A^u@^jv&_$Y~!P3 ziFxUoW=Qs7?tH&w2p942&PC8g5QAmbqA1T^jgqymFzFCBTR(gKQ04I6DgG~~Yaug7 z0e=BK(fQ1oHeSKTYVet>v!c0gJ*D@l1oRKL=lq++>9=7gW6e2ul0?y*|IbFW9pK*; zvHn1i`^^~B9|-#^gS*;>VbL*WYIU{g9&G2y&FzN*wGOj2jFeEE!Cd)tS?R3?>fN4MqDH%jO==+%|LnffB_@RYsR)4S75 zrL$`7Dy_vpT^D5+?epcmz-gCh=~5*%{qx;Dr|FDod$o4`JG*m?X(~-$jXSAx&FK}j zm7@D%xNEtJ^)z4xZoM?$FdsB8QyViqT9l#M{N44Vt(7g{aBsf0R-o3S_PVyWcB?j_ zcDnYw7N@qQuCcDRuC=c8Vr0Iw7CP;tbt7}QT`N*+IP0Ukpu3>CU^vs%jA z>&-P3oFw!qL@kg;kPeYv@>1HASqsm*=d6(`@nu>c*m&ih9QL`9iCNq>oK*L*k+xgi z7MuV!l%nd>63j{ks^(S>c>8(ixs|MZ$~*vP>A%oMu+mi1xKcIwz_z27qt>JLtahyS zARCY!$llK4*T~37`N-jj{)j!Vp{)=2y8D+>s+j$e<$crj!ms6DZNKg{%6VFNN_d)h z3V7OFy!OA%Y|f;VpXsRT5Z4#fn$?-rf~=RuoAPTbYV&GyYD;Ph66$#CYHIUq%WHFM zo6pN<+;mp#?|#I5TP|@W_{VXT{|P1TLIvJMHwr%~B?`e$e|>jaa@3dr<28r_xiETk zNPpMHs`Tn3cTQn6#i01r;$!1uZhjIU@=RPYlrcX9=5LFxd3SrrZ>z4y@#HbrarLpd zJATUxA6$cnVt9pJY#o-zD*O}%=;j?mYx3@BEzb4# zVRyqt_dY7fFCHPuUsvA-pkm_EhP;)3&raPL^oZcue;wI;382UPFCYWzt>7ygehdRVdq2Lev{gNRyk%^A z|N5?l)k6nSy$8fyLaVQ?)EizbVo9f?6FT$1)Ab336G%hJm_k zTn=Pj&qXn^LKfDr95B4_kAm1b^^Z*($b6QnorHz`Ukx!-i1o|Rs=k9j3mM4ovcq%D+u?N!6(|6&17l6Xfye6w$lrQR zkpJ;)x3tj{t}6yFY&*Z0?kEQWuZN_`-Px@rjtbgY&VG&Bx5q*s36{F^Y1Navi~XMg8pwx^lYA?1`_f;>Km`h z{Ci89{C_RvG`I2MUy$wJqR!3!pSbZkF*sPP=Y0YkD0jUFrwXqWbSu#f3yqbRo>B-Fdn-WQoec^>at%=Q# zVzxE0q>&@jp8qicNaU^h7bD&B+j;&=H{iGU|EJXL!`e8dYlUChTD$|6*Ar2kcJ%r# z^Hts}W-nY(y!vk9Rotsri#67?&F+vj(uU`t zz(5BPuSW&!fiYeEtLRt!i;wv_>A(965EhMhW#8%j7a#55zs0&=``=cL3(CJ~R^vDz zJ4*DCt=c#M?f)kSp95Cl|9n$=5jHEM9<)Of53#qINuQ!W)7Q?m!*rr$o?qizJ;wWq zZt=ou<+23iy>jUd_H2WC6<)MHK}~AsuwXwq{yE^zInBk)^ax( za&hww{4LcUjeh!JL3XjeT!<)g)wEjHu9J5*+j&CU3?E!$W!LlWJC%!BZdg>o>;GP( zenmym@uvQ?fM3|a%I~A?>#984lgkg<*vzb(4Doi}jZwir)vbphY3KM0(zaB{HgsLZ z*C~-W&0ml#n4hO-&SC+T*+$^kVn5r~1vN7~6~Mk6H|Wb1-m3Pywqq+C_eW(}KK+*i z(JKKIWJ0{IHU~d{R#qAt_xD9d{mF#UBMRGrKbyt>BurvWuP>k}^(LL!9Uc9`eV0JH zDTOBO`W=m>f(4h5qbdC+-OHWXCe6!TACd1E=U*vjXn<-lyPrj}>CeAq&Ts)W#&$hg zzZ0Lw8O$&N)xoKFZbLX)iKKB<1`zH_VH zcvO=N-~RKZk_G4Hqw$O;Ik$bvJDtlt(Iqej>^tQ|H&8NWk3$4R56jD(m;?gG_5?)0 z#IPKLi6NjAc#o$Q#0M)_o>%}%L-#~l!FaH2(FvKf-~v{V`0jW=Trz8q%NxW7%Ws>Q zg#%XhguKC2u-wt#9sA!A+^>+oDF{+y{u*qE$o_N~IU21s$^G=l!~e`+gQIZR)bRZO zX|SnOW|=Gc`Om=z565mZ>`$Ut%h7~`xvi**Lu3@ z&0L{EZO0Vw<;56c%J#P7tF_a1E%)0E^R#V*`$wqfkdOUGSl8K*=J18+%^X|Q?d~F; z*iGT}-H;Eb5O2GAcKh8(rC8QY?RAus*ww-I5W?ZU^crvU{#xAEst5T$+?QLY;9rR> zx_rLwM;Jp0i;tUw*Wkpvdvjm0cHeu5FZAxpZ5t2K-sj!u;I+o%b6byf7ie#=K|h4B zIpPyT^sc82Ef0fr8kR#EsfH0tRp4KmEPB_zRClMol;_t<_otrsw}nnaKGWx-Hz`Wj zBaI02#iVxNA|JStzf?@;e)_as?_P7rx9%3)ew8s-`DM(mHqlP$@5FM}{7_>f;^CSjx)IJ3Q#%tUXGhbIwtu1apR916aB_3JWPkY=DlE(fu(WYD zbz}qBd~`OIG&Qz2F=dlCwKI3Nc*)7hD=Lcf6HTe8v z$3VQG=4y+Ar>31yT2W2MT^((@5NV(l={WQiYZxEDa3lMw@~)=qk4!p#F9YE24Nsqa zdh9c`65Gx-hCl=PmK2hA#0OIX5bt@#u3G`oy3h|v_qSwy=pl04&*#R2N{aJzEHd+T zzHHv_3h_i<3^}-p35Pd>_L>?lFNe3FOA>Pl+Na+rkS?JE=v%;y!O6v5J`XT%?CJjx z(&GFtNsE`Ai|g-_<9Nxz!OqYBAB8s}h~=&}oq}kLNg1G}j{oZRxG_HM(wGi&Ea*KQ z+gns>S`;q7xPf5>Go!eaQTb=8Q?J55Nv3LueV#6D>UY)5D_ST z4Y5rFbI{`??`E5a^u#o_)lLkw2`%nEc&zR(-Vy@uyzexpTl#5)gD+9Nmtze=1w80G zZl&>kA?5sfP@Wyl?`3$$273VUuE1MU1}3}{VK?6$(lgQ{?;fRx4%FbWUH7fwAzc*C zmiG%w(1yOT{JkO(>#v4;n&Q#k^aiyLzsZJbV)MfjDy5IwF<+iB`!OyP zzrFWcUvWOZad}WlgtST)fnQyYJs(r=cufCOxO*bW~@}O*6A&1S9^_U$GF2V zm;drb`tz)Z{a;k>4cNSSHxcC~XWQSehsp@_RE7zpjWv0BP%vDO^{M1zLIa^6dS%uEvkgQyI#1pL3vrWC~Z`JIc z?=;K+KpiXD)7v~r)vlJS1})>rcVGgvOqvff%;3GmsQ^25hOe__jD-ycZv%{ zt+8T_dE>&xYsp%OBjCxlS|cT3JDJ`?J1uVOkut?Bx5uPVMM#&%=S=P88E=y`#f5Fq zZkVyz_bBzhlw5u!)D@(i>N~7-D>lI^ z`Bp?fRa)d5z9`SQwD6h-VE1(?ccGbsFD3U)O-wSLx!HWQ^s?WunPpA29B-+McGVK3 z#z>e1upk|6@-r{8k!#CzqoBvasDJyl#aq2wo3|;M#!rn4KgiuUn_$+yZzE?CPe^~J zGx0iCX~?pWIYfEe(WHAw(IH{4E7E-`x$j6>6(@i4yd>E^E+2x2!u0lkarO?dq6JNu z;I(brw(+iQ+s3=LZQHhO+qP|+`~KOTot@cCW_HtcI(0hL-F4DANp*ddD!#{l?Fga5 zvj-V`AW(~J=~b*5xqeHFa!o}+DdF8PP7!Q1CNBy1b@{Z))Ne9Ka2Wh118dwDEb5S5 z>k`NwTI)bO;UyjHj)FE2UX9RxQ`+WAZT4(VPS(VR_?fGWjC9={S|d{aVK&DIONz7~ zDTd;izb>m~B+rf|$!A_tp<4|Gj;TvL8`Z-t#g1@j*?N4ur2-dUBXoR`iv)C$W{v7e zTBYff3#g?~?{B3>BG*utug$|3#5fUhYXaS&}Y0P!yRflfEw}y>C#0*=QWPRo#lvsdfX^{)kQ6XxaQLbdm zP;EeW@ybV=BOlLIwMN~^FImrZtmNcV8gTsLp$&uU!yHHJhPzW!l%U65(K4 zXBS&dRX(mPn4g;#y_@1i#F2ejPrTC8Lqcuyh)eEt-%dr|yM#UfXUf=3DeCu(> z445aF2QZ?6{dvp~U^4(AM|MZBT9n?RDTdr8QtG1!T>Cq|AgmI=Y%jt74lfCndF%y*E>8>;+#o<0~9I z84t2`43P4Rcr~67c;SMCU$%0Jqg}X*;FgP5Nvox+beEmNYqTz<%xaz%*43mo$C%@U zzyxBw&%*dl;dqN(2%Mu7Mk)Svi;c^jnp_=AqYc-VsGvmaE)GRMWj5rzuARrGptrWq zErhNe9hG7UBQ|2q!0maRqvs`sLJF}Hl8KgynML;>*{Nwe5~Y{NCH8CUTkEVnizO_$ zHLc6+lQCqU_U5F#hoqmUWu4BF+x8TMyy#LeiFi~EL6+9rzL3$M=T6kiZMl|Pa;z;I zn&~5^@G|;Zt8IW-S8eO-Zb6Z(hIAc`Q!gRPiN2&#Q&5f{&l>zlemqe1ZZE_8jx2b8 zxm0xZbmdCx^v{-fKEjqu7HahjWHRpu#bLvy;(@7)H`_>E<5czZ11aT4DExI1_rJr97;%$GKCdvM-e9#~S0 z1bE}k3^*2nZ0s2ysn`jkv%?&V|B~Sh-nQ`nLH1#Hh?A%RrF6i*3Iu9H#0#<{WOhJV z8So4N5fA1mBjlSCfbwzNmeUQL%m+28>Qh_LBJ}$PEAo|2IfMZu)(+md4f5RQd_#XD zHqH}<&LZ-7us<4|gTOT(l;wc)MZg}~)aUbp{%5u9li%SF3F49Y9{l2PV!3lZ-?i0aWt`>HdQFM0D^GA*~B%Z4rNs9qADR z#|vFWvjl6#R^xSB1S5FibISF*BL&*9=Oj93IWjROh`K_FzX5Lh*RFiq@m>XQ&PRIg z0lFdW5IYaa=o0##9JK3fLDtLcR{V|TWW3KDyBHHIBZiwYzfP_L-Yu&Y)4KKRv^#cH zSdCnp8356cRE@xKOr$|l? z^kzvwvPNA~MZj(kuqN3Q$A?S+KC(a}n~l#+;E#9QGPI>so31|HXy==m4Q^wUJsxRC z-mdzKD z@SUEy0oyxiYn1jl_qb`)uI++UOP}i-=$FtJ>RkiJAFemHg8;aF057T@066<3?kUFu z3Vs2;eK>#Y7e{U~IMFL(Jg2zOcCk9cnm|noG^TwNHCi0^*}Hc`C8oWR~b|8cn>_C3xU*0r$Gki_e(-+^xS zDDr8tx1`9??ceCqrJ21?_Tva-=^;rEG{Zfh1W)de3eJ z16po5BLZAB++ZX=J$TG0WUKtinidh$Fp1V$S@!l`#dU5!Eifi}9_8nSi^!#NLfb=P z&CVo@!JY!fZi>HWTNDTeNhH z@b^u~_3R09F+&S|CTTO-GdzxDxWp;$B{eNAEgKOA$bajTb{w`NTh$lN|0Gmc6#9N_ zXns{z`Bjdo82=CvC5k+XFz@g3on^SK@ZKA}65hmzXNu$c25kMTmJT&13Y-oNoT>HR zs65R<^)@Hhw&+^mHtblVA{_-YwzqRW3`A{hIk+1b*wT^Hvm8y3xf@8<(2PSvI~>~` zX^k%QQ59=dtuWlLTU(ruTUeZzQ#3NrqV_K-!{o6}XV4WVJEpJmOiE4ts}**n-A#8K zpfPYNlQlW-MX9KEfw)H-=oCktR@JbD%ag?qC7b%{(PjHzob_cVw*-V$P7>AbdSyF;%!T-T+i>;;jP~HRPD{@ zjCVKp-^LTuhfS#C+H36vuBH+%6Wd_M{ga|5=ahz@AFa@kmu{x_(Z-5XeAi1RJr0+v zq1oH>Hy07S$f+YL9!{05bCJ8YYV&+rZj)lbhK9$Mq07cfMZ;isQj3M1p;*H=MnR^C zp!xz$A!$+jv?=V}SZsW&qbUogWhbm}vDNh3@FxIsocd&18WuA2Bl4qDv?=XW!RMuyE_OF8yZ2XQNe`0W5NjVa&f3{bb+Z}eV^JXd!?)UVA z+LqN9G6M9;VP9gY^`qfa9A@ogSmbYHdJcMVb*T)^qxyX#9QRGL68H_D^TiEtY1_w{ z8YM4408l>mbI~UCub}iXu3gm77jQM z*uPeGJiY8E4*&MkI{ZoQAJO0&QT#ld#Kd8b~1qWqwnI!ZuyEP9x>FMdOui>~$Qfed5ZB zaFV}pqF&(I^`j3WDW6Bb`vi)K8)YYW@0N{RI)dQji!I-|Oy1!2zLA%=R11*Q7q^$W zUv`RmdVT9soQ^|+P~4H6Y=9~^&mP6R1NH9CKX57jJ9i0Ty-<>>PDNEHwc;#$DJbOa z4H&x1%amCpE(17PXO<_Yxx0BOz)n?}s^;3kD^R}5j*yVG#>oRLP`Z%L;kt+8f>%074a(~ctib3!;fM4m!WTgZO}U6I_Q;7F z2+j;5yG49KwCMQ*NKqa#xQyFzNFGq2R16cseNMt+4SlWOJcdAN_x82G^UQXPe4mPP z%uq~-Axt_4kP<`CR;+J00I8`>h|o8BnTvWi8?SO0r*oAFE8bS&O9eFG4qVJlOob0+9C?W0=O~81-Dxj?RM6xBNFnmT9_1lST#7ZAj$eSeR&$tCiRSSK z8%!Ohl7L`VYuEN2W*Tf!lDxpOw|P?b)9Sa_cQN83IffGFw*p$GYYGFW8k1`}EQ9L* z93i30(@{VjUYaXVX#Pa-mXMU+PNkqcWy{Cdcy}K-HSP0`!a~6&;WuyU-XCB>KmBn> zie;Heqt$NTj>MMn7vQ2SE*S_YVfXf)9z5ocr|3|_RhoAiBl)Oa2!1|a6i)}Crx1p` z41x#u{Y|*{ulG6Ww|)pQzDK(0xZs}yRe>|K)i1Ruyk|=-+AkABGHerMP-27L<649<>(vb3{=$y9l9)V zcxjNjrBxvaOTjqTHV6_g1TIm)S`Rp;h)#`~|8%QIcc55vuUT4VhgQEfpw4r}BRuX) zUhp61E6^Kx@Y3)B%KV_X!XM_pEKp$xS0J0f&5T=w4GZ<2 zXo@fsGj0}Mez2y?n${0By;$VPX$UpLFyJcS@i(r`GRYjShgg;Iu}?Mxo=2Kytki&D zv-aq!rXmdrN?WmT=h{psfeIA4rJ*{ts6|dOB(@r%w zrFUdj1PI6^go;pexR%aVpj>2Ty6=yA8w|5eWq^{-R7*vgMke3C7Sd6_5FXhxOj4i) z**I3!OF#NFbD4vBu+{Q+Fk~3;SJwKd-V#oC;F*pp+jei*;-|GxcMy%e z{MjRtylsLvS#&f1$m-_c@(Jm*gROpHs;)Sfz*^Q~t3DNkFGyycIyf@!d{$({Ug3GJ z>%JA?r8_w-Hk4a+!&DCX8s?y?N+_^zPkJhY)njX6UeHC= zRGq2-ypUK*MOb8imM(lK?CDqw=jxMH9X0d7s^%Tds))!*;j7N&m}@P33DEJKMF-fia8n zL*{v?aMA@x>A3UHr9e)DLKTc=&}@hKvOIR(cQ)6iG{(Bi_=KpN?zth;6{sTj>v9bT_|4;sZ zK8ux=?f+Wyzj6Onn&Y2NY>bTm<@wLpe{}qh)PFSjH~!y$A?rVZ|20m;$jQ#e{(nOs ztjvsz{{wDx>vqyV3up(p+%luV;W<88>cR&dmkQoT zby}r)D+7N3EeAKX~0 zfwYLvnz1pe5Nx*Jb=;^&srSUxXBDh$tIOiK-=#p`d6Aum-9B&-0E>so-K<^|UPdnC^)Mr`bjntU z%8udU3kxB6G=xkr+2S$Q$|udxB@o@116+C-E0z?bQUDN|;e#R$ni*gS%7d;@b!OL8 z&L0BIK2RNi@@&C^*%z43h!HG4-Nc{K)OY}}E<~m6zdvG965O77t52`r@C|bB)a=rY>FUSglOOmgYQ{H6&I>c+ zha1m=S(>y*sz~t+)vRx+-)B0hSKtjr_N%c0a&j+$`CV>blS=RV_3hZWjJO9gh+1wn z-iNAO4{q8Kc-i%*kqM?B;r|Qq!wodrt^c;b2r+>CD)qtsZX*4c>A!LWd_d0!5^Hol z@G>I~=4g8UGN&z8z3HD8_-yCBFO35|ca3Hbz9EsptY*HxudRP3{31o5_ubSfw*aR- zdXeX7wBgYq;nrxpK;ge18?gciG5$lpk$vEd7I);Qy@g1}b>JZ1>T&!`^sd6PE~+PYFuop|6@SxK z4`n4}9XN4chJxPO*3!&}O`{vqWJCjL!hy^n{yA~&v|WmyNxbM}RYmB36m*K@FP$?r6qXOV|a#-o#Z8#h*u zAaUj&k)OKaYS0VH_MR2t<)Xa>n#ujDb29#1M}Xq8Rxh*YwyrB5S7w+^jEC4JrZ<>Q zfFgNIbuik~TwtcCGk0YA6Gjw4adnYs1I#r7OXjf?yKN(Tn4PtSeLjw!v26dj!Jg z{vy$f6&9{kr<-TXN)J!@V5xEhb>4PH#h1R~8a#Q&#tfh;6)Q}RZ6tmjD-G|CW9e5_ z{PbHkZ=+Fgm~*oqYe_-t>414a={N4_N22RzCGY3NOl)3O-0HxN>RcCH$^~7A5*vol zcrZn`KjOqP%kN_cB`oZgs88f2%O92-nxpe@#F)VKD$!fR8AO~X2OsjrEvZ?U8q_SB zP4z)666~MtfU>5QYI&t>c}+2qMKWZyuf12uNwB9*P$99F-A)cIn|nz>g^e@xv7EJD zIZi2XvJX(_RX&=IVxi|jY7m2N7d2^lMkmH05P zyEjlvJM+Sc>VAde4VcOwRRi$IL zrZe4$lMrpLk`uPwmiE!fsR7LcW8q3dG02_D?G7to`4!n-iTZ$aqs+N27 zpju6IP}W`5Qc3Q$B(Dvm8~6^=uAN>CuDGP7ikRDqN4$6yJF8>ys0&`3gj7Sk!M&op z*p9A$Z%5VT%gGp7bX-yDNVKEh_Zj#LDUx8tbA-f((1PTWUA|rWs`&o4vtQVJ8jYWI z_omyJz+W!7e`vmEzhrt>@#@T;_J|Q27~2nZ@kkN|o;3CRUF(kY@XNsd1lWJv_6QGZbhfw7Bi1*=Q4>iq3^4bb;x z1%a(iHu#B}vj>^2>Ri+0fr3#L%Ej?3!`vdo8AXaLs^Okj90tIuV`59?NNbG?&y=Kd ziByF(eVRwL$|^sT7t?u5nLFjoTrAS{-SS-X8>LJ2I3k0byIt=4l;1&=O zHxf0}^AZCf#$)5+5fjh}+Yu8m2?vQuhy}Y46EFxN5s~l-?Gcf%2^kTQPzh5Y7_Exf z9py26h5vujZ(c|jR^3CnLc=s8f zGPhPYr_2u9v(1R5mM-v3-6uXFYn@8ZfNaJIE#)8nQ%JA$Oyd}$@~p|VB{kGct!=4u z@=tBUw%MNX>|xkt&iTK1uU%8v+tof)w|27=Q%Pj?;t z;CgB4$2BFPY8DPJZPZLph$>isDyg49w*s#i2?k4HMN^y_c5FwjMxr!W;AW|_2HEDE+KO;E~5)0gK8DjA^|f#%kx(+;OVz2Ofgl*S7~3` zRZ4a4J^>aSu5jxFHkFr048+hih-$BZKvGX!A2S*iN?BF@iY{=anP!82a=ur6NUXlZ zyIWr*Zx1t}mMYdOQM*`*cslI$e3VD~Pmjy^d(k4x+E&0A^zfmCiBVhrV+fh zP;}a}?2tf8fS4&=7R@kX)!V;J4`90>RwwVgq^~3^A{)FS%vQ^)(G2~ipZFcZsH?_r zi)F1?#+8xt*;-O(z5Y;Ta;o|zQ{xNMr@N?%``!po1nZj|Gnq=es;?o#`b``9@#kde z;}7KU-gbkwQ0wspSp~LzM~q{4&89gCS7(RCI)O25uO%mMSW|I~GNq+FrLjDvt~{l> zJf)&MrL_FGf8|lPio-V5yG?RdizJ?>QLsepDci-pc52Qo(W{0Zl?Wjz;mDAZcrjqF=r#nG(qLD)QfccgY1%Ztx6(NYg4-8ge9y4l3x>>>57c$^E8< zh9Muj^EZyRASXM(Ao%Q&In;e2O|7$uJHnE0Icf<+oS@4+ou@+F7$X>K($xm=mVVDP zNa}soENI9$2yzW7H~AvJIk-iA<|_frj6C))Q0sv7JJ$C>y*|LH5X?I&&GA~f&`^D% zk+8tUAi!FRFaN(ZCe!*St zzE4x5blm{b8%#`s7iU#aa}fG~wL0i*!BFLp=fHX$gzN+BzL+=?X32u1*}wcNQXUuT zIQm+{?QtN-3^8ywXzCELgSYD@2MXWva-q}`FRA+sKY08{q3^E&0&nSdp=oGTrDkw} zKot4u(*aTjm|K9agUk?TBb0A`X}%Yt3*n)n7!o{{`(*0i-Ak6k=24@VZwQ_K*Cx9V zzf?WwJ5t)gDEGU68okhTgKGEaDfS_z1~cp6ck?Finy>J)oDh!=0*nJmQC-nAbA|7tCQ7AT;4^|F_J>)OU zF0K#Lm-bur9lL%IMM59=`kZKoZK-=Tk<1TZPW~+28*vvrexI0KSQXq{03FT1JqK#( zVR9SF?ZC4e{Z1_X!R6FYfd-G2e&U)}OUSjMr#mJ7V4z?~9Q_i+^Z@FBgF$qfTrT7R z?g5#7W19#MRZfy&(e%;29&fVy#o=7QT*O@NKuH~I7SarKYjEu1HB+$aU$!aoY#wng z_oS*rR|Ww3zRIHHR*8<-J-Iu^D{{zRC~`(P^HKW(BF{Uz0@~YJd-TWw9I#Pw9H|&I+Z7l!5ahkI#_G?^>N*n*zQTV zMq=&#L5|_UC(1)qr}&FKtv5bGU2zf{b_g}d)%X#7bg&?^VD=z65d>65RcX}5VUK$k z`#)Y9xs56fQs)aq=ceaq=ZusT&<+9GG`l3ViTFvrw7oWA%x^H*uyPADOmqG-j=Ql& z#680C?;>kKR`yt;2H0+kHoF4S{y6duu zE*R~gV}dL1Z8gtR?I1PO*sS-s-NTj(UV^6!)q%+0bh#3D2yIXg#Jdni8g&LP4<=Kq zOvEf1{uDE&>wT($v|-%rj-JT86o2$c$BUz#4@0qsoI>|wg`o($SU2-Lpu@DRu%?m)_+ zw1o01J7(8JO|!sFBi`;+58T~N&AGOvY_2!*Wb63(BAPa~%;DDoLa!6@A*I$IzY%Z4 zF^vVh)InAOWjnRT7ToueVRJ$HhT!ev`Ix;K^^mfp^MaNiklvAHn`#7x^sCohjyzoNXMoW6wsPoeOsW&NgZs&!`1~)|KM!lg!m^ z`0ky1j}xCHUcl@KdpQT=qW?VaatoD>9$flC%*yNj1n?R|Ad~1N8jl@tWa-791MrTM z;~SLpJlB5z= zncJGl zn=HMPhPctkD5(NfF$r1}|F|<2xX_{@^fIYhtnd=Sj#0_1-SF=!513MwiL+GnE5OzMy?VT#$40& zg@F3PE~Zh#dWgqJv^(3VpI2XaZ>ek-M{ZwrFKETNsuor)ye0-MhbGDy9DHnCbllxI z8ZDLDTKVvZdb0Jch}{IsN9y!>Oo?+!krag$g_ef1g`$I`%Y>D+)qi0&yEf+$*Abn& z_c`C+MfC5l5)z`r`7mk~^)rk+tbFHOldmbah0-qd_^4r~{5N&#QDm#APF?IzB+Gq^ zX(FCv{+<0}Y|lfhX#v^_sF|$m5e1}N>$c6~kRv1=-<2bDYHP#VnMi-ANu4cg@$3>A zeG(J=AnDWDEK>TS;9gfM!B8FUlqUrW#8{$YBxr&kw2QCS`V&Kwl)z)XMLi~Xi_+Un z;pYVD7W8;3+>|@`xB00E8N15}WLGA_6SC6cC_YKQrs+pzoUn1IOFBokcy@OVBPy+X z%FOS#SBpmY>t29tdo3T{Py*v{{z9RY$4=FH?(E^^bZr~xac^<{{Y~DmJufoG9gg3~ z$*LHsW+Pg%&zEJZmr)1LWOFzwLSCj7&m7`1NR$zcLtQ669S45k%p)5v5GRALlKoZZ#d*07uWaaypwk?jVFd&!-n6!em_hxn;XoY3Me$8w|Xt)4Jw> ziZHxDHXE68dL4Zwy$Rn<)OQ*kY6CnRYceznuwHF3XDB+OZ^}Z^mtS>BKgq$P!Vl7KN9G8G86ryq6@D4vrLP?dZz4oo8Xyg3se@SFo_q^CUbO zMC`P=0FMQ`8bRD(9&6d?mjd*3LS6!KZ!eu-BoS3fH+@Io0FD!|8k!+asFed7SCbC zJkx~Ak0ud}##+_5_Xc1?(bN{M0ozjssgU_tlvNW&I)HWJfKe2ci8i0uI=2D?H+YK3 zQDN>UmLCO%ggd+@9Tk^!ql9{zmP188&QrLtG9Vz{o$eXA(l{wP1gmVnxkMxcb)kCB zzg1i;I)$gwa@*{fZQcC7(R$LYeWgM2CdpMZ3a)VRpru5pgmLqreqw8iHn%@DWH6;r zRRV~4BTay1BEdiN2;HD|-(*qhL}|q zp0_2IY0FUhG@1fJh&`H^8G?{4BXiA~aqHAk={l_woaUNLlV@eC1~PIsnM^2V5DI2p-LnX{+`(tP*ynI~hI~w;9lry1ji6#}X23E7)Ef(H zBC^SHpT*MF^MEWN%^i;bDj8&Cu!>+R0b~q?BavKG1QJaOg{giM7Z?jfNW$fnhEqBD z99qy%0~q^Ed|(DC9c;Gwe15n0d3iYNV+DWaAD=^UXpLgU653PEZKBnfx=UdKDp49I zks4z3OW=R*;%-%=q`Z4}gGtOe*@PFe+SEnSrx7C3u};BU6mLYXi1)Wp9G;Nw{8d4* zIqIt)`=qtsLrVW&`O0^tB_9h)&T+nI8ZB=a6LKR_ePd_QLgYh@g0m!8#&v7DPVJsp zo4DTi*og<95DNwz<})%^!rDZ#bo4#1o&X*4T7%Z{-XQQhK9}A$fgO-o=-xzjOg7Bi z0KWFwxxZeRF8h;TCI+!@2~U7Nq~74nGp_WNwh(%iDl z32T4`xqU>D(t1#^b5Iaq;KDC_gy z1fk%{Mj5?vOP#V;v@obUF8x;8qmaHSzbjFU9_3^1D1}@5` za|=E*T0!yd^7wYrq*+^4{Fl$RDSCYf3E>1kPnMOtViS7^FS z*wF#zruG}HSPG)(h^$%%FEG=MczGC;b_<*ec4oVi5Zz*Ys@ z^Q&EzxF^qZ$Do8pP z)(p!c%aqIpWHZLhw9MV?*tcQ2_>F`YfXA&0-X(mFddj&Cn_rSkw#S2I@JX+Q@aa9# z-vjU64~2`Vac7{nm?j&%;qKvGo&<$kE zxOD~3KSeOHco%juhuoB2J|fTgqoI7ay9%#$zeTpiI^1kA@^h)qFJlmZf>+ zI-Y;aIhNBD!Sk~j;^lo)#WOFbGQ=GO4F#*%vo96K_BP~KB3sX`96w9QQ*qy%ocg7EuOlWwunzvj=9mlK(;Hp+d4 z-W=sQ)SLeLWYt3|7Zi=?9A?{Eyg=!;?i#eb86kbtL*h6!4B0I;5P24F z{w<=O?0--iZF-Xs`ZhiB01}SUlUDFX$W-1`9hDu`1$X6kz&(b$2}?@~ge$#fJkmQ$ z5tptnz|!hafC&R8D%DC#BX?jdh$1A`+Xu6q;kvnJUFDdlbiEth1fADKWER^!qQ!LyrmsJ&!>fFEhH5Nte?c% z_}gQ#JX?#w>9AOy@qV<{>(2GGtoSw8LihLJ_!*UR$MclO%YC=L_bSFxYe8LwkEhYr z;CU-F2O3x7IlSeC+`RNB#-$=k_SsA-%KVV6!%VaI^>|R)BljBlCA>>*XWC`_3-Kka zEBc-;U+RnY&iTsa-DjjWL~Bp=sDcImgt!-Bv>wbq_0eHpaPJ`<7BYi+)g?y(g~Cs1 zh)-bA&>1lnfl-iTnsB2s@{c0PNqmYpHYwb~KX8GI3Q{p{diR7;(J9Yn&4A*G66f(v zbjFW>i~OCwdRI)X)+ES=mex zk29E5;xhq`BwRwba(c+o&~a@ZXKLPuI_{QY)k0J|=)=&df~_@w@LeSj^V&AHu@C^a&!qF0H~*3;CvKvS268nM~Y7Tdq62 zVsx`lyUWWezrWv7-zwV)mT291RkYN7EST~}ta7zTw^i^5v5MrCd_S$oMkgB%W*156RvlK;D*T=owd5JJ)G4jDeH@(! z)gsB0C-l;6Yw5Gu;J00#O_qDHa~mTD(Ynyvs#%LObStf!svK%<^e&H&&5v1+4jm0#4=*R%fj7$A-x4mK7mWhM|Q6*Oo4efric#+MkC5%w7B#G+)0#zSnx^6FO46;A8AxPMs) z3&XhX38P4*cQOG|IU_Lf29Lrj^(B?|dFmk`3kV=f4KN==wXZ0+3FT}LQ^3?~NvKAt z&4~adR7Q*#ws!$oqMGa;VQu={S>1xXEM32tvhWVx5?{RenwtM zX84h%Yiu@qKN^-hebcnt?*ezF_inc*QGDNX!@D{s!A} z>9@1x+8-HBI%fcfR7M?Q%}|A5b*4B&uWxu|FJ4VFoM;un2G~`%@&8gz7mlQ|+*KgFr8?2oEo&L>FNd`G(M(R-*SYSLkj0?18aM3Rb?2D@3NVsf% z$Vde_2pBGQ9Aiv6p2%Dz+;ah(wCjcPs|+%dmMU8*c)4&MFv&=D$Y$qA*CuzN6L6WQ zTi5v90V+R}JZlhtsb3_Uc>IIUjN?q@V zgAX#AqJ}=S-#3~u68_reAOSE2+pp730(F!?5r;j&0(J|mWzMsiZ9bF&#%X**QYm-G z&(*|n-wNIgi^UYsA`l1vBu$)aal}l_>)E#!=i?)}in2!hsVgrs1->kBa6^cvRn{{K6h@ks^{JJCV-EnEF{aEWO?d{)cvt}0v&2O+`-Fc7_!F|(L^19Rh8k^g- z-8){7gJ>(VdJ zNAXYF+ho=0*6i`mf@9a08)y`HkBv9^rOYe$LT3*9q+CJlkdg*|`!7xQgO~CT=SQZ` zKHpbFZulqTV4cbF@tQf3NZ_&|+vc0#h}KAoQ6Pn+X(p_t!2`)o>PX6WQ(F_dwj zNR~NUr=#N}byJK(bqj(ax2R<%Cq24Kn4$QlhD8nob8TAvJI153_~}j6RQ8yO?)Y%K z9Ftssm4CVke2VKpQ5TVMWksJBm7V8sK2*s;-t5(wv+^H@uQy=&Idt{2meEkBO*``G z)3Xds-K40&fDF@#JKu?h4e=PN;5Z|gXnG@~bb15pi1YbY06ejh@I?3s*cPKF{W$pb zQ8L*%Y&6{BQWSTcW@YSl&NtKpF>{4Lje)Reu+dtUHu zaK(Rt>C4MDdY-x>EYJOXVnQ+|#wIa*rS#8$Y7f<$#5%aZ;2{B@voTDo+C(3gt~EZK z$)nncuSu)3*A}!Ji4FlGH9}#YNHhzfs5{tRQFQE5r-))aN@t*3xY5VR!Z84qXmje3=*MnR&JN3%mu`hVQYF7}Jfgv8) zYEcnQq+lm1!+Mq*qzzKdv?0%$DfS%M4B=$DlM8}oL50>%)0T6VI_`fK-=idvI;(jP0}*! zUj<|Y@-~?CvB!fijyb^loI$P$$Kc`nn#7PGzCXzux(rlRC8>y-waa)7@tt zgqf5^U4rGqmzMQ3uFh?rZIL?Q+NIlE@k8qIL2C1p4{)SL#G~@4%3NJo+4CS!E%^_!|B39p+ZW5?=Gp;-;8 zT%1m^iQ5QBd(>n9;_pG<=Sa;BOI3t(u#!M`K}ku~Tbwz+R`f!&>d$A@#d$M69`_R= zTTGt@ZiH}Cb=(xhfcW8R>NuTWww0-z_YQXVlD$*OcDIw((7O@;)pJ0Qnq$a^7u+6} zu6Kz!;rOii`8`|Crb%nnyq!ZYL=r0IG*=(5UA18weJ6bO`QqWS<*@Zwyo>KQ)W4p> z{jw3g@%mwy{bR?BQJ*ny7X^qNodCJ64+(!>bAr)BUzD!^T_W5O!jPl3nmRT1FIqLaVKDD5&%&9bk2mTRS;1P{pNQbNUPcbW$$#VzVxA}f&h#q<_ z3xrpG#hR`;Egh9^g$>;iVCIz?a1~0LlDyuQ_M9RPlv82!NV5j+i|pt}K{IKlH?IGD zgg0s{_U&{>WarjMB!*%p?VIcu&AOt=Heq5gHT^1Qsxnsw&NUpGw&xNBGue?ch04;RGDAvF=vfT=5to=d`CBF^S~ zPpWYHcoGg&Cr8rkeY=KPJIRniN=!H%1HloZ)2}=k_t`xIxJ`Y5jc)%P+=ljW;0}p| zLo(enI1^j{dn|Lo%e-;es#OVFA-ev8><%!ECeO$&Qb`A(NtfFvXKo3v?=@YXwstcg zjTGK2u0{f{{p2*x`wZ@94b}gHv3CvD^9WmzHf|E3+mwkL^!J{HBj9h}G#!c&xgFGsa0os-Um6sjbnj;Xa>>-J8ii+IA<7 zCxt7EYqDK)w~9=vwvl}<-Ak9b_VR<3!r>qqHqxt zU)69W*m(bBc8OyJPe0`B7{`t4s>o&{ojs>8HG9rG_m!A^EYl^d>4IdQ5o+jU`>Ys4 z=QxDTJRVy?H=wxtfeP60H|DjN)e5Fwrz8x-qeZZ1sV@RNxw|*=*mtsY8FFw)1Qce@ zuLZt-?`B#g!UiXi&?~X)*^R#(t3E3~<=V!+0e^!V>{o!vjF@nK?-qwb4?qeK4Mlw-m?jH(W{Y0wD{k3E@M(X*~g zt3HPQOY-#a&_Q9=z3u8vptIxAdu!HO$!(^6tULdbZ5hc{SLy40>sT(-D@(Iu{DSh> z%NqTp#^>iN=@S52Fj=YvdDl(o#6T1V`^a*-uEA2>(y2^Yxl&~aQi|N3Ra~}2(Vof? zy5-uT>ued1Z5fXSO)B8TAUmI|T}8(_JFS!A-D6+n-aL z_Jrp%bG>vMfvXCwa@xRv1C>hSow{<~h=Gsi9+Yt)H1mzhK{gAHhEWL3qJe*@MK2~X zYwU!0Gj{LBqETcr)$}}zqnH%hA>w47Cq<1~x~F)2!A3v7-DutLeQiJ^rr%?B5S4(8 z_o!>ped)dGQKeMUL6rlubmYK}GmB$m`BEIk7KD!ElUrSu`lzWu&?|)-GA?%)L8hD( ze`l}#E|xs9MjsdU6ZBzZB#n_L0YTTFC&B=YzW*a{d2nDtRTTkl?~5v1>OxYriDs;R zqjmplx0rXD>tiB06uK>;arN2>9PM~UxB1UpZ13AcwvZUyE!>Vs3;X9B=$2>=>^;30 zr#$aNfh3BsOc`kN;wwt4pc}F68V~-(HU61;r;F0+aO$)*4i@dRbvR13MhSXK5IaaX zp@Wo2bWZ`HF45+3j*>C5NNK0_ut>PD-0p%%CtZ0h=9WplYmMR3BU)9UqTN2I`#QQ- z!*u|3i}t_^s#)~0Kfie!>LQA*+|o;T)fzCmE|lBmDaf0S&K@` z%1DT0sFl9n+*MVzRmSY2Pb=1Py_%^e9#7rntPHFT3_iJ+LjC;kuKpt!k(=ZpY@g~LIlD8>J?)X%I;HKYr$^I6 z@fGNHxN+O-`+YWQ%d?fHn=ssp|8ZQ?H7td866D~xL3>+)BYlt=S+tDaoT6+?fXV5O zf4cgo5?mVxO46t?r&+%xau}AHHrOkGgipbkl39I9v~fPo7Rj2lUSQ~$(50_y1F)Ql zDo(7)WBfpGno!6E2Xu*pkT)PpF=Gtsj_}e)fC;E#^leFkGfc^By}3n$nhk) z4C{h*z)B#6A&!1#1V@1%xG4KMv8AstHn9YC*!Wew=0-FoB^}ZPu`p%5zeWX?gss%< zsEDg+mf>TG7<=Q6e}9@*jNivSm}BjwInk(uikkL+fYQPgg(__ad+e0Jl4g`#m8~}y zOyFUz-e2CS;9+UzGjmGz+)tXpIeVK)j7(f>(|mU>EHuF?{CWO5XKGw@qPaoM^qSXs z)g4cvUfm>|9E7MOw{%RawIV7kMC28_}a608$jLn-IU~Rk0a{u3MT+nUo_m zTJ;23AyF1r$|@KXNes?~ne-bG*PhNY!$A34A#HCrry|=a%PP2k0XbTmG&CoS(kXp` z`$DJ6)k?1n_@(wZ{dAp)&=XT87nY9yvGr0uXJIr?N zhOJ`PPpX?((KmDkFpw4A$Fr7K(@7|SaoiTgDqhKhsOpvmk) z;unz4P?O%pg!eg|aU+=FaNJgN9kJ!~ygnLX_uB;zh^_<@5A6_Y&V#O&oU_9cEj4bY zHd@ER9yOO_#z332XdaW$LLGI$s?Ia$;uM&6NP4YrG(50{ywsaK(Fnf$HZ&ykGCBl3 zA&_`hhYoCx17$c&Ugb&pI22k{)7kZF#BNJ?o#pPQ^~Q%T?>N8p8zByWH=rii5&fm6J-VPiWI3M(swB0o!ewj_ zEsRjZH)QK$gez}~kU@+hFbABW*legpOoJTU9s=wvUGX1hL0EnCaI2$6Ynt@z0$iEI zmF!kXqr?^ehJIwMLUK|y?J-0-^>hP(;CsPH74N>Pxm!*Cx@C*Jq?~B%4`B^(`h{CK zkB4p!1yY4QVOA$Gf{f}AZ_v+_$u*?MBH?K`SAgt*xG7sO?4GY&#p*i4*c361s$~b3 zMn9@A6blaw#+yRo%VPj&J%E1g_EEBY_0IKXGakIf?{fc!?RGAnER5DF@Hh(x2AA92 z9n^7jk)n6;oPF4NbVzFLXlwPC!i@;A;D6Lm|2ntYAfy?zU?^NB49q*|lVwJ7zehT> z2pV7HOjbicI1L8%Srx*fTQDhMlcv^yG=rMW%n#Xsu7|6G;?-vL9?;SCeo0|8(SKey zy-1^~Xdfy!mGgFqxC1>aPX*AW9kZibHg^|@W7fzN?G(UO(k(QZTz*`lTC##m3sLn< z#(O=#_u!#jF|5S1rQdT0v$8WL;3-8zOlum+QZgJ?waiae7>vL2mokZ*mc}n-BuVj@ zRD_K&&no`xV1_Z=Mh4qNmTQLcEU&FvafzU|IskDP7ARus1)Kprr z9TG|c)3abEfJ*oWKnZS(BjG)$-?%0YL${n>v7)N!XY)@nPLDGs%6_l~wNgRhz)K!!Qiu zXlo@-?<@K~7kvtY)D9R_(=Zp(fzv4>l5vzIXlWz4IqgU1=xWTjJ+7vz!%b`c27ik{ zudcS-L^5mTXt_HZ@%}8+n8ple(0aQawJgwlUA5|n}Jy+m;zQjF9I(K z5?q;B_@^g*&NWIBjQ$0>%k1G)q(9zb%K}Dg*;{p)i|v7KJylyl@vOPof6qfjd$Zwn z9qjmw#fz$6EB9S0YWnx;l@>vrcKVg9&y^O6zl04wWe;uKs-fRksAhc%U4o>o2t=hF z_(zMcijXwe54C%e1`nIMpgR{SX9B5WmRIltCPp=U;;j z2S2j}G94s*eIWS&e%NqW`e}{xN+xO>57y^Ji- ze6YxA()20T#C8-y=7QQ-97g*%Cp7*5ien;8UKlV5nVzKCqrrv2Ok2kbY7=U?qM<*g zM>`RiCJEQ(62?5+0}`gmbzhwDQfe8}+SxxRSZN_zBbD_{Vj7;yy?9+mp_-B+$U{|| znRIom)Xhh!oDFOtX+!I|+Ygn%`R&+XC(75_k|~$XlJAfn6xwy+Dd;`z^c#*zmnLX0 z+R3ucx`NvlUC_8 zjmH1m&TnJH@n_?4Z}S$nUqKxy>3BawU=3nW_m*+^2O@+H2S;{Y6a8FHp$Tza$Pa6`^FP>=1Pk}iN4-s?V)zqu}2c2%UfeRIL zC{&sdRJEY&323ltA>qSb!UA`M(FdYDs-=<{Y=^2!(Ht02X$Rdm90jX7zOq@Aa*HWS zh5+YgkYHokkc&n>hf#}n%^YRXYy(vj*53vwlnk-ubRUqTCf=Gktfed#v3ywW#OBB^ z1M!&P`iHGg)C{5H8!3wFfDfxzV5sSQq}S~vRiW1Y>Hl-{SVq>Wns5ANtTCcn0xPO{Q=PPev`&Sm zU>4VX08#8Lud95YBj{LGao{X@8BWccC>Ti1o3bFPp<6mv)DyKpxP<=3O354w)Z-$l z86MSRiGp?Xpe<{Tz0~Q=r(y<|{P7dM@HYs5_Yw;B>n%oUL-y^p@n81S=u6v3t5-K) zU#mBCfg?!nS2P%m_nVQgUAXkemV)_giBHh{LDL}X=eKwchw@>v4Hc31`?qASuk_bm zGIjCg5K3mlm*1Q(o=s2HERHRYu!$bjS0CzU0Hr;M!r{EMX;sd=Hn#xXTZ2w4F33V2 z)$77fBl1HbsS7dSzzl(R&dh%?`YYKt!_;fWe* zl)R}2qKBxd7;u7-{nCGf94k1(W#jWtR3@G&>QhhT&vUarJ2rp?)zhX_P6aRz$SP90 zeG$y7N?FR!$l=ppgm-dy{WE=t4M}<%j1dCwr-EzAO;o!T_~xSvh`Y3@F=4wf1rD&D zlw973;2^YqcX%y=X8njEC(L7?gNPy|Tw{=$7e)8+zxYo)P_LwB(-2J&@<+sFa+ii2 zcfxbw^PgZ8Esy8l3LAtGE`4br=Mdj1C@~AxBpSIvSOL58qJfDHahHRApzqdW68!oE z))Z1nDTLDQl5@SjVxq*{wxtWt-$E-)jmKT)g|q=wz{)AdNsWM@?}}}7q9oy_cT_@` z0XpFd@S4E8i4Dk86$-!^&{*FU+sN%=eyIeM z#niU=$F6A?w!p*c1w9>+29$>MS@V`1Eaj0(mxO1?IR#0*5Y}u(XS-sBeSdIG!yIUK zH!GizRAvU7ZV4#+;mla1YvVgT$nnj+XO^bx973%q!fThFjE(M$XUMD%E6-r&A0f6D zp-*{-WyAO;4nG(Vr;_+r*2ss;Q$1$d>9JLaqZM+o@^%tmp3>J6J;BITpspuN)-T#U zQ{CUh>a#B(%|E5(H{~`pH(q8*1U#Nm?H&-B#8^R$yhRN!<$PSY_qMG;WUGzPD{V!yu_siI0TH0 zU_9^Zi?k9aO3Wg8FJ*$4C7CCcYBtAOkV>D28G!3Xn=$d^CyBZco^mTgl1LIUVj6Nq zYbsPM(=QGIvDgN3 z{*^PY3}4`IK-4FmvF|#hm@Yc8V7umo|>2a+Kxt5&rkJ z>Jfd88O0FI|F!0?PhVh;)veVOKB+fn;xy~Df)YjKoP?2%WYSH($NngsXA`}ZYUOox zdYlfkF~2h1k&#b4JXdaC^pY{rOw?iGKrVJZE4=5G6+55I5-U}Q2-j=~NtoL_f}wKU z7IF`#WLg#%O;s`suNssTIh42{0mj5z@Zs4``SDRMow;jBQZmgrXXObWA|JLNhP1A zV@!H4F>92FArnopcq_S}PHZ#WR(X-DJYC6yMd1TvHX;NFv_}65kuw6Q@J4+O4c~dCuJgvym-#%HAF; z`(_jP2+KS|BZ9<3W=fUsjr}BYV=b!f6lHQ|4QstF@o5vhp<-vHx)INXCN%wSCwqp5 z1$unHu}ACPT&IzF4~?xWXpiV<>$EI3$3LsWg6zv<_MYW1S?Yew?9g}Ga^SulEl)2 zAvq*Zl3pFiiONfZam{(bHa&HQqFZLvhNqi%T{6Ws|DijLa8-8J$eOyu)Uv#0OeMEq zQkHUbN?}z=%BrLqO)-4ch}wvvSttFo$$7%CNp4>lFZRrZlFqy`rKex)NM~VnR*m^v zMGN8rnu0W_mL)yDx8}4DvAm?BL{?)HKUw22@P1!gNWt8mn*l{GDAe%2->=C|kN+ad z`WjzWGJD>L*>>C`*orA$2RTKf%U^AS;*~(Id%-4+_T|TNbO-@0{r|a_UNo7AiW4$uT2^ixvU4 zt40VXc89MaAjZWYhQoy#0+06%2*ZE{APy|p5#og3K#;Xa-S^ark!f?t^*Abc{UM~m zhZ|&9G`Fl`LnOOOu8t&4Fe=l_tB7HJN(^!6Txm{^p@@+}+Mi$BQ!W1|R+E|v?~ehoiH?s0CysqUv=DPg zYYsAmM+%T=Va`tbOj@wNUnUnZlpqAqAqNF7T9hvgQ}ZI2NRBfoVNRa0hKP+9a^vBm zV7G_>HwZc>OepgdkLYzIt`etjN{$#C^#u1xY`|$(8@rW=2LOV74L)9C#|jlV0_F)W zN;ovLur&$}?jliK&-gc4DMJW;cc{9`J;0POgSZW`S_Y2aX7-6Cmrx!nP$8s{D=Y$; z0fPkz9~UPqlxT4tdQ#qh*q_}V1FAld=VcPBO`{~ZE=sbm_q@=3F7T( z)We|9u}|-h%L+O^Mwk+^eBO%$&pz=T7XFmFs|IB8_u!z=BPCT~p#S{Z%bGkh5;XWh zcy;no6_SRH>Q^4jlGHSz1P0M|)~5aJv0W_%jcPnvEpl4xumCBL%u~S`06S5zXNM&+ zc_~M0|C~TlVo?l$12Bj}o24Zo%$Ts3qAm~)YE@|~U)CBFBXSfV)g1X2?XYK`05~MM zK9<&k%gd{j00tCUqWv9?0e-yO?HJsgxOxm=Js^Kc(i6LkhIurSwhmn(jz|G9_m~H} zDc8R+_bs`K(zHxD2DX1u8V~$1SIT&qPswqIR8jodVd7_rE<;51ybe){{2`+Jc}9HB z>SrCMLF~2(%9N@=NU8yQ>Tq+0+I-e9GDDVYn$6p{m=KzJzHU!&mJ0g2uV$M#$@6dGl zKE26yJNYuzb-K;W6f-07{HU!Z?SMBjow;?k3Ch1?%hF$%hZMV+zh^UasZW2BB9acj zhWG(Y!h18)oQLRW7u13;cb7L{?Hdr==F>hjeE2Lcj0i7y6SKmj=6CWDvr69SlMHW| zg|A2BU{5A!hGSPwk9r&-4uy@HuOzgJ=fcC5Lw+BD{i$dIDrl|KI=JSHm4o}>K~x1E z@Attt^iiV=nJ*Fr#n%I`A#i8_gNwIpHLFx{1y%*0>@6#w3$blMbJE;L1&t62O5GUB z6JHjf6l2<1NTSmsc3mM~2qX@Ps%f$9CPR+&wC=`HkNvg)OLljNu#MCOb9gB6MRZDD~j?GS{_*|Kbi0so{#QdTn$xsT;BdTV8_M8M~ zSL9aa1Cd8&c3$PF!QrQT)WAKRkM8l*_{X<*Dwn%rTI&0ER?*kt<-x&M=Vo^D+r8cQ z(JCkP%TwwHdwzWK$94xR*M(>XQkxI9oIVZ3k>qoA|zu854gCqxaysGHHQQn^ETv$`Zeuf;$vX|Ci%Fm z+(qH|Wz*=UZN^l^32jM7XC{hK6g%0E$YQ4RFSDuAY;DPH`JwjQlKcmrF9?u*Rn=BQo+PF({#Kf)}6QSm{PrInuXKilc3n?B)C?B*%gU_sm zOmpdtRfN4*wKdbxs8RNkOQPiyZIxcPnsh_v{zOfo#jtrv@9*28S{L}(s?jAMjWzf& z9TO?MYl)KArB?v_fp;g*t90p5Hj!hfR2S!}MQYpXm5WW$1f$)xqokGh#eC%C>={5r`f~B{WH^?{B7w-9W=qnzrM<~3#yit1 zsl8e#SLEut(z@8Wf$m`Ay~E&E|6K-rk_-+b&Y%qAN60<0Y0SOS>07^EwpzenJ#*nk zr$|H#)G9)|Tu{qupGthU)MjY6Ru;&u1~|Z3byL4tjZ=TMNGV||TJ%_C4et3@t^(sC zhQ)DQN}%xD@YV9(yJHM$-*_58Iwti=*}7DJUHvdhO?}&aw~Xxmd+M%#t+}v6cd%%y zH3#?mx(G|KCV9CU&O(Q+>u;Y0@T;9--?ImA54nqRt)wlHfjKC?B5X8XTdk zNPPH@5ZssdH-DZT0A$tu%*@_)b9S=(_$K6fZb5A=eSXQYbl)1EFzgxFYl`NYNL6(y z=(+8-N}%!N(IvO+TyocWHM!tRDojjb+Pu`j2X>dnOQ_x-4IeQ&zIBy@OGAvGJYZge z(Fnt#ym&#|_bmH0R3p~M<(Z4J)8_q$dH(P)Ot~6qFfx!pb^3; zn9sEU;@~3vtB{F-(F+uJezP3J+qn_4_Jvo8dK0(d{N&sHWXbTB#|CRMzLvt8mcq;t zOuqGNt^+08!UduGB=QQanGT~Nccd4W0gCpt1byd_Ehg>$a)FYI26iZtCHh1nPjuvE zhW51lzFAzQ#?qQG&b4PD2#&=MymNh3!z~B(+KoAQN~!MO=@59@|BEaC1LgPs!<8%y zjI94f*JGgPVB`4jcs(9SJ>})*)1Fro36q3$X-27sKT}7>z66Oz4X`ldM#hj*tjxfK z$c+7de$?|F$f*FhXsMF+l?Ii^t1Y>yc`WLcmGW~IsFmryH`(cN z0L?!uD?hh5C)BT7jEVV^mOM%CiYJQVv01#U3xfAO31bZ)9MZ*_la!hYXH}4Ff)(((oUwk`wm_1;2%=` zzz00#G(0LVh)FZxbe>92x}SY6C7$ZN?#&0unLbEL9g;G4S$2pEc^adTg6vt##!Y>UyUSTmI4*PC z-#80`Y>K-I54SYfXH)&J-2e|{t+!rV)IeWXgq48^$m8U_ zWI}MS5L2HAVxPC5Thedt>R8wChr9cRtlfi#2!R+wf539l->BR6C-H<}e%$$aLvVFp zFn)9pUSz#WA_QOz{?|1OVgEB*i&d5&==-7eM5F~l6=cG08erpowmrN2LRgnwvI)wn zkI2l}j<(R7rZDmc?EksvKdShj*}Gdn(+|A0RM-J+JDvmJFiqY`*=KGqx`C?S zo6ASPh`!~+$pJ|A%udW1zG+z|g;74h(??&wNV#TYP6D|$SfhT1d(SRi75Qn<>)rx< z0ub+k#W^kkHXz8{(rQY$lAIDMe`@z2yJ zN4%|~i43=$$|=2XEo-`fjYTKVJoPqEsC26jsGD1+D}OrdyQ#JJ*QMdTNWkUJKi=zx z|I1?k_4fa1$NpcMJwB2=8ofLs1Lz zA#O6g$SsCWye3U}^jrfmL41HTX-IR(khy=WERW>MsGg?h=Y->0)NeH}@; z-6QEjg_BwUzhUzV=b@MiP#GVFkjBQ)wd3ZAQUph!>R}jHB9G(h1*-g_^3)+QHAUEr zyo9pAFxkQv2@Ffm{G+rFV8+_Cs{*3bhAqb4n$Lp0V%34)nT9mRepA%J-(AC=<9>nb z0UvzHSp|Q5!!uOuTE)m)O>;#Gbl4VLE+KO!9 z3gEy~z!7~%TWnG36Za16*FY1k$9NfHj7PI?Ezv*xLLLn(hUCS^&5CLHJ-{4U!w4uv zdO-@!O^Nit)I%Sm9c{x1EW+(+ukLp0e|I#aSN-k2_)4bon9}r>B{HKVuuCA-5d01VOv7gR6t^HR)NA-e|g4O{|mL~4;(ZR8yk+B#i z)LZi7NWws)V%mbClsGdXDr5+xo0eC$QlS#$pQaeURYY}7p?-0K#;MwqVz*Hf)yMnj zDF^C5ybZZ{YL5dtpdhI{D^()SrTaKBnd=T}QxFaX9 zq>W{$5MvK<%<^Ylbb{*YzFinpYH;qldT=gB_KTl^m1wsRjHLy{vT$q3HsB-JbV6J4YgYS34k+QwLa+IH@T4~H}(QJ&pAA+YjKDCF|h3-?)3$R zyvW+bi;hDDKxshWd(Ne^G9c|L+&>?b10b@y^wxgB)<7Y%!l9e|_QeO=7h(bxqiy;! z591m6b9XKGDt^-iiVo^f@PZ1f6d8AauBcFKOMx`6fk6lRt%XF@Pg0)&DdyZ|LkC<7 z`T_3#!tz{C6qTHalnvA%eDk<;Y&}QK4L7nqtp%!=wD=S$@@PLne(=k+=9WO-OFgTL zU2w8;g@_CXbqPo$B!e(ZwLQti!?Uibu9-7nY+0$f9NLX8bCM4e*X_>*!Xmwd%wVam zERfj8&|puFtOK^N?^I|1!_Kcy*xfkWM4t2#nJGW{y6j!-edtN8&?8Ow`I6v1OvrLh zha|u3t=Ow`PteB|e z8^J5aW>AxeuyW!JcI=mf%2eaRJ`-kk4=g)Rv0EU=7HlnXmyohHL2|}M>|?MrOUTgd zQ=f$+`FgqmI~r2OmLPhbI1iD=1RXnaVik+}(yx)PV+a1|oywQlrW>(I_5*hFwzc%z znr`Oi{q$ECEVNCRVtn%$VQCUv%*Z;{);CK?*!-1Ft(f0g#N=hKAQ3A*6US;a|FK+- z=Lubp_4K=G&%1|+p+S@*o8J+S%^=_=5FS>SXr+cT(+9r^r%maN+S4%?Iwjm@>7uLD z7tthEPfL$K$~V=M5{{I`f$PX^fpgc#L`&*PiLqOUn;a6j<22S1+iVJuR1iGjw$+sObK%NfAhXw(sSC+w~25i#e8q8J5rPd+60 z>~~7Zwc~C{q8dYz&`od_YqarZEq&yTZCB$NX$KGnT0?Rln7$waHbuK$$|+1?Ae3HG5*{qn=#U z+V0-|kRz#}snja1%)F(rhbg$L+*{CG%e1P-;mXMDRvzoP?9tA>ggS<9hO^kir3ouG zmTE{!A?_?IupgjXcCL>K4uQ1nqU9qAv_VcWWjsOX;;ck12JI=v#TU1REV^)MExdnF zyn!7Iyh{g52#b+h-xNGRQ8SdR3y#!`Q0Ce#9{!pgCjX#&H=xfBG8&q?%-OU^?;nk+l+xCTH6mDbpOdC6qZA!+`SAt3RD0ECsx=E zS#%@OIj>T3mZw})miKU0sVQ}fRtygU$D(oZkO%re!pn8_aPkxLdH~E#j~K6q3KDer zir(!wkY7|eBHVjKBzn7W1E1t=OGo%9&nka(aGtZDk)EE*uy;Blr;|Ws;oB=mC~6dNUj-I z%_tr;vMQm48WyfXEQYBM&3NtqF@IuzpoOgL_bD>vuyi5ATit)*ToO;7A32knR9+f2)UOVi(VEo(-v|}- zERw=G1c-(4YRS(8Nc86D zzP@^@81@3@+L^^rc7C~YGl*B#Qz+-E$74p*XmnJq&SJ1Ln0L znJ>)2v+!LGi()E>jhu3yW9QKzj8}AX51epEj^r^M7L9m9?4*DAA~$M`9LfLp!&OPE zR6yEkZiEUTT|sfYPDmV8jXf-xj}rJWtmFY2MV zGKQ>mAWM)YdlvR@vdXgM)7yn_$Ezr~2jbvI*hY7!+^tyFgN!-!H1HO~X(d}AX1F z2wX^^Pi(#?&{2LMy{^khuvKBHvEn$Q2{Y-&c zVm6I)DfxUV@1d2(Lw;eMz7`q_j4c#r#_~fSlFW((?5EbB(CFr=%IxkZRxz11xWWNW zuk}GOaYV8PX9LxGHIvSPW-(o2_0RRDa*Th(cBZ8|O_GK~u!gae zll#_Xj)>xN=lU@JY^cwES<&0b#(0hwf(LtLc0^R(2q=8fU_PEgu{ot}YFJ(7cN^WFSA4F8qf&u@sIxb2rbW|7N zU_IqEBve+hU>OB{du4SLR4;{mBFZMQ;FB_XHcDoZU=D?RZb}ppP*deJEL5lhK`rGu zVbEl@p`uqz@7Q@)OrDuD2GLkXkD&QhOrEK;%&4CJGXhcH$+OC+o~bkFs2F+=zxh&3 z?}&LaOz(jCQ4H^-d3{lQ{U@@h8$&0*`R=Hl!L#kC8xtq+!cENWkuz1%z$l;Wc^}bQ z<0q`5or-^BYN{J!XUS1I{b!7#ni$q5PH2VAQKX6%W#>p1dQb((^;q_R2Z}?`2yBEp zp>AXcIzwUzxdPID#b29m%4?&&@T){OqRI%Nh`A!%VQx4IkviIE%fbII3Ftk0h+-41 z$mRc*%<0u4b%nUW#DfDbP=qaqNg>{%5Z4xQ{%|Vr;{GII|2(bB!TWf8DG^M)?awvl z2j(9V=v&Kl#RU)IiGENY2n-zxrl`^3c)h(1;t+*o5cm7X;JT?}w8J&A{^1E5({H_R zqBgrF3b8UMLj;ATs*JZes+xLnNeeg=t`gPqYeP|httH?I!8ovaZMm<-ZBi%eev=|j z)wV&T>*RiJKUL^CvlLgY6=}EtB0jCH4?C@0Z{w|g9YA?3dQ>I++XE!wDi^V~z1T}j z;~aRr(4jm^5?0PKycKN+O$eSChbAB18QhuN3H!9=Vgv4q`|zhVc@xY7puN=?eHjjdMDuk-SLdc$3F>01|K}vmpsXlOVjH-GuPiB&DiH98`ulb3O-NW`bk_h zrNQbzng%mxMsEa z3NEmunp-SrGnnP%QFrBI=HQ_54LJMnYw{$sRprBsfT#nJ#3c|VQ`|VkXr3h7j1C4>q#a|ss*o~=7 z4;AedoN#(L2v;5KwYW8LXbRv0ZHMPA?CqV}*g3UusAyx*&_^R83x_=*HI4QSq($YF z;!5*NCB{g!!p6hQ!&HTF3(&ZWqNfU(h#rZ)s2$*n-Z0NsEtRuwTvGfL-0w% zEu_Z_A^OC14ZblPE&V{agBxBCp9c50xoueu3S&^y#z3^0hX@Y7etSi1N27h|3HW~s z3?Rb{?93PD<92ZF#N-9KADlHHy=F)Nyx*r}W96+p}TJJ<4<#Q%k z96);O>jEg1ML6Ifz_8L85e0fD2#bNhOUt@??jnh>PVJhSw9jG@YS=QqPft?1e@MyD z+3Sd;?){wCNs0p74rh;#+uUBy5WZfwBE7e0sytM)K|H+LARcMj92wspf)3wc+wL9H zux)t(qpuoYez>FC-b&KvJs!SJXC)l})Dj@wW((WwNE}6Qjj_2pG+3*-^lWxSVz{b$ zZr5HB!^b-)`n?8AM}UceVB*t)!OOEc+XacK@+ZT`w;RDVrZcrEkld0*N^sp!3CU2J zkDj*xi?PPjSlP1@l}3I(L+lFH7{a>#DLuY?d9FOVz~Whl4f+be(Mz5s8nqVBAp!?m zb~0uOBq6bxczIxk`Si)0Nmh>kGbzn@!ut+o2kxyHXkVtnEAeP)QvAev=FH24}eWvvj=j zAbH|p88a24*nsM7yIGUa3J&^yDUgga#NOi@mAcDSlCXPycy!na`i>DY;#pL*bj=gc zJ%7@vsWI54Z<40wk;b)cqxH7xlDNH=aA7;}Rr-PcNzbchP5h9|UO`nCSr|rVON{;5 zSYmZf_Fyt(S)Xc&@c6O)-T3)_{9RO^oAjD^C z$^M?RTcdFKF+egFJxFI7yrgQHEX1pTi5c^*C=Kq}i|*I^ty!QN7`K*5I`rJ0*T;TK zQi;Ehq`(G#pxX%iZ8L+*Fp^Q&8J`z|-Is z@_48pnG%DrL*NwhG*B3PS@@I&>F0oB|9$S!zqBv$cKq4MlaU7#uaj(>$ioV+arB76 z?SR_?{uU5^ck9Z6ETSATW5Y7pD4?ra)qY$?sH4mo^ zf^mTOta!$wyrk7NU?1}%@5Q%xh}$M@4Xgk;Chf_mhqW}ioz0?jEy+S_KnWHMLVNOL zMdQO&Nk%g7U&q!~=Spp%XoK`vf;yRvP8F$G=o1LozuVsv$Q9fL+y$fsyalucEWp1O`~!FutOoK4lohN7Mhj6L z%?y$m+yvADINYDfWC|Uw$5)1};`+%`v?5r~XxBmjq3Y_BYM<_z8ztqQOSAu50SkVY2#N3RLp8suCpKM$=Y48tk82jsM`ZxET?%Od6fQ&jP zBpriC++|R59pH;!fHm-yr^pkwm|8zIJNW2In1TklW!mGq3BLSx`JU77R+^g^# z=GAE1cHm_vFi{KO>M@_)({w2-Njov#qX`K$VfY;b^*6YfgNb@%yB&kc*7Dk{N0vJ{ z_2^Xxf;;>{u%RIZnMxg~+BcUQX;1ivMjO%!0(ef6TpyZ2pw#@2W?45R9k-^0XrC~SJMF1rUYyHuA9Vl7?-3$3VzBTuO!}2u z`sIJjspvW%v4Uz**QoK{q3tirt=VZe)qgV(zk++rxn21l(V5kZW#VVJ`#RC|9cf;E zsIPl5zhDcKceC!MHj};+y~P{@=)&yL+vzoB&eP512GfOYz&e6W0G z(eGm)L*HIOdh=AH%X(m6p@Z*O-cHJYf>;D&=LolGsF9#lIMj23Tve#DqFs~mZzmtm zUv*VhEhB=lRZPo)zC6E1D>CcXDY;)+_t&3bU$A#T+%U#TRk)4>0Z{}fnB5zv{zWl$ z0g?afM$=N$%%P%PKuHESIE*DmYLy%v31?Q9xX^}v%sH8W`YAL;%D95Yvn4PPfu&YV^_uZJITsBqH!a`=8 zTB4V;+peLKfv(d+^iWw$K=y|CIivFi%Uh}KnQk%|p6>@x76F21b@_>-0>?(_;~4Jt zX+haG%Uso>f=VhiZP3)j*r%1306Ic@c(-H zb>JpC$``~aX+=p+Qx>j?infL#MWx^%@LnSZ8D(?_4r4e$oQt3UoJ!i6EH(CyC2hSZ zC9>!j8;ovV3Di-i-LeU}uvQcF1e=B=Eg21!bk4}ami6>ix*+cK>^#&s{cBWODGYwq=`vzk`jm7>G(!fvp&V|VmLH{MUwhP?G0HMX12mHBCN zb?K3PqwaA%b@`>Qjlbm68Pu_Qs{FL%s-afWA+7%QVI!$#T7N@s5Gp)(3DH{W{~c)u zs~F1rRB&cEg4bBn%ENwI^O*0Z5*>Ir!KH4_4kHA^Uk~<;h!dgTBpr>yVwNsejA23R#-n8seTp4`g)_5>TF0{Kg_skHJdu-rev#- zOS1(1Vr*oH0L%_Ep;AO1Oor^)8RS)wbzYA;CjXi%#=<-X*i=~Lapq|diP9PAv(CH~@^)(XhS4vE{3&ZEzd|kH>izopn zsL^(&{!}@bJvWfDdX&x1+Z8SI({QT)1UX_pRd{loh#X~Fi`JE1mNup|)4k3cZ>E_r zZ->RKmz*fO)Rs%}p>ba_qEa-ecx%)rGU+$%*pRu>2!Tx&Q2lv_>Vn|--1@N*vXT^?| zp`zeMMhvH`Ww#JS`;kNoWH3(WjFc9e%9rqGKhH2}nsGt}P-*+c`zGd0E~K7u;ysFW ztM633T&OxyeH{uh=SXuq?gvxpH8;+sxyoBv`9k%(Iak;76Au<&&62(D|~+HYn~fOHwonji%K$tUVpcWA&az@U^F+DGpN@TnuZ)+ZI zD%a972^6H!r$y{X>^I1exuu|-m^mFBq>i75jIHp!p&Gdyu#vY-(jH`s;V7B2wG0x+ z5~#7mDT;b$++d))HtM;V<~+ z9I@%8@))fyv3c5AxoYzcTy|cd6E6*#(g61!nad%grOSEU;)V5?{dTjB2A2+AMiY3r zFnX+Z>QkD1)qX&W5_&|7G_Z2FUj4NP^KIASj8qQ^drYyJYQT*v5~RkNJFHM!#BZJ$Cgw>sU{Y;8P5li*e^EUr5o#NSy_#!=wp5!9^ zkt#NVL?$X+MW|M31IDEY-9?@-q^7w^%TvUD0f|aXbUiPE%thg)OrXLMPT?Y1TNSmY z6c4pI3B8rRTBHY}Zpfh}=34(Wt z-hh6t*w2%pOaVQLpg^`=jGc-8<6Q>?gZol=CjYZWD_#h1$WbWfd78C&)`Ce})kd-I z>WX<{=}k%b`$m~=(@RnLegs44l=uw6Ga>Z)S03p259ntBWNJjOG6kFpGQk4fTSvK5 zo_;8te`-fdz?dBQ=t~v0s?7@yO9xOJF^kRXGD*d4DK`4O6Q*zLB1j|s|vbC<%ouq0x%LK@1}JVxtp zeoY@mvO5p__?#QQj{MqTV(ez=#;kaPYWN&vR+7=Ba@qo4T} zC{H)h>ne#e7>XhskFmqasNiIHoU?apQ>&V-EX9i^+(E+?5%u!si|Y06~iPfK&$uzDU;fNeBnDTkR9i5b6yRELRHqsy5bHv9~Vn?%B@c#daSfd+fXKUE zp>AV~FhHSFSR@Q89-B)fT^Y4V4w5o*4Q`8kifTixllQta(a`CR`^YKhUq)qe@AwT& zS~;*HkTv+jkj}~}*~Kf7Wf&{X6xg(KI5CwnQ#kwe$wXucZTkYZ-(d0NM9i})!c5ll z+?bL5hr!1%H3*>QqTQ3h_x8v`e)^B|&*kmr+F8ULPVM7MDfr6cyYprIwq?(rUQZ?K ziQO5V<<`Az<(_fSa)8l)VvGtzD^R#hD7WIjrM##*&I>Ak;u6z{SCfU7iWr3qL}}&z zD*h9<&?u^q`cS7j4d>AKTk9mCCQa6Mb=Dfpa;Ng4UkV5k&=HBf@8fzyNo0$>h~!TJ$~HqnhPQ zwdCFs)i@06Wvr_eyN!(kp*m~Tu9+Gr9iz&0)2EFBwa*?!^o=3)vx5I;uyQkJ#kx_k zo){sl*A0B{E&N$0E9EMwn-ml)Z*B9i*kKTYJL&!Iha^Ct+AWFfD#px1jGa*$5mM(r zHIXGdYi?ma_?)GaQ|lZ8zS1=1xw~&;u3!sQ;tddoFymV2QWx&s$$X$#m(#e)5w-3zVC_THSFfoWZ}(bmVdCW0N3!^e}2Ma6o1Y>)8$k!TW6B zcA^K75C~dEUOF9QK!nZvL?G%CGxop5i7+PE>rAL0hpIjYy}FLoEV~!lX_rjbIEoDQ247*PH{OkEde-rd>a!5|ra+}7l_w>@ zk^1dyqp)HwNH)G|()AVSQ_1Y1mS2r~p<?JQk3-eDoTT;sp}!3 zWp~5>)JmU&k^Yqnu%RF&YeU{d1?)q(+7uobhL( z@Fn;UJWFPB6UMJsokDzl&JUbR;`w8p+=Ia_#c=^tBAaqQKUqUdjgQZqcL|y@(pZ_)0W{VsH6}#$U%C( z6sSxW2%OoPlby$nNkU59B`wSH2(c>@)ASd?%l`os0^HR660+w(XUK8H8XUQ_E$Lgh zrLwn#)1xocYqR^GleIf=qIvgf!0o&29fj}r&yh1G(Ucgi$4(rMxtI$hc@fw#9w^2C zotS}?8xg3>VkdWm%R(w3dfcQw$_>%XcS)VU9`FL7$@!h~@={Iku8npmT~EvGBsDp^j^7$Od&yp<&We-Ok0PmbB#M{pGiJy`np(u z2pCoJ=K1T;&VG-Vbejp*Y`(E0Pz1VC(mDq6o*bfpDLi8B8Bq}gF zG<-J*8Y!4bzEE^Ckzp9fpJ9cvSf#eJI&@`<^HL6&iD!lbXL3uJmV{xj$K)l+;ZCRS zy}0bUkHnz2psu%)bmC95;8eWCfl}5ydpc$iz3`2Ldn8<-!oSv zN#*7W+ABCo&&MBg;<6ryKP%CDaCncB``Jsjr5i=^3paxHP^myf092FhaZ^IiegDSU z!X3^nvJWIrJ&C%0QV`hkg@B>hyxqAi)8KiWGdRz$>!Ro65A%`PFiaqh1~n}0c1`v(pj7<4YopJ%h4 zXv*-AJwVw&DluhPBc1P_>^HBXH-fn4CKFo z=fT7k-6!-%pLfdV0}7i$vvE7Is#9>m#G^3s>2{rSNo_7(aQFVgXRut@KS>$noSE-M z>-Y-HnvuDHa+<6N0;e)YQZQN!(=;I#6p3OTc@bv(dn~>4C7VTVZ@xiu_=7QKmikv% zP(`!MnB%vpd7cNo<6FhY-FaAg(#!U)@-Vj}LN!P_3l%=%-EvLFRJDVM$R9K}E0ZQA z9yWEAIi_f4x^L#|xdN}eFGvM)Q(-B#xXf4Y1U@h)`&he3xv2O?Ex+vtD>4I>VkIhJ z25G9Ii*Wt;=szCse=@v$1?Y)&MB;8?z=wtHTInqEVYzSz1IVG!O|guSys^mfp^0-@ z`b3HN%0U25`cRRxJQ)B^&RfAD0O%qAGVQbi-E#_2zp2%oQ*-Ikw#0TvdumH5@_D$W zK_RfxIS%i|y~O*9bZ1IXXu3{J#I&9WoL{|*gRf8uadw`P2d5@KF#|LL3g6J)U_f{n z-?`yb`m|c4WT6^0-l{f`aMGlB{E>&VHXqd!9Q?|uOa0Ke$%3yBrBbf}W4FH&ieT}7 zRlIO$(~%gE2-=r&Zq40i1ukD#Us3C;Ud1EuKCwEH4F`|pMi8vA-*iYLEv_6O*L6MOZZvt~ z*5FLTt@(*@E1EeR6RU@C*qN+K6#jcLk+H^qx4qvNa>l~wl5MbUn%05p!V31D_~(fke5RS&Y9kjom8ZsGf^cdM3*lk3H*E$oYr)?g;Q~{`1_ZS%dT64lSj{JiT>ulD z&rzBe1)y3*m)@YDD>iPP9a@=m9Uh)u_@!^-JsIKR3-2nSLZ7s0l?B}9cL0cWKnuFR zenX29Nv-}IGTeQ3G>rLd1zU@GVR(#DM zs|2*+SFWIn{NbRP!9TRuF~e<9Omk-+&vc{D>wh@-oR6}7N;33spt;a`M(PP()U z^>qV-a8Clg?mqTjy{e5SC#R=M>Y;_;t}~ncS#vj%*pK(lggx#q!`|bKc>qO0=$B#P z#tKpYj+2<=)TCO_hGj~qOPzkkR(pr5#^i6Jjpdbg$1RF~;nubPaj3XkUtX?Vd?Nd6Dx1Kq6PFy^Ow>f3I5*}%LAcF`R~FoG}$3c3;F z-#n_V(p7u?^dAiyr)FA2EqW`*4=sATGd+#{sXP$RobQ*F^oLfw4U%j0 zTr$7g(~B3ib^D(u-PrCYf##c@9ipTUg_ER3Xd{za?*VG8RgTi82`9yb zaJdGKgX`^4>txxe-H>Xrpp59@N>J4}_FdCTc6POXc81EXqDz+!mj zhQw3~4`r-q{ydc>gFT)k^)htvTIO?ND6wAtRB`okbat^vW5K`oogwp@cw6^@&d~#> zHH7ziM+?WoPQxU%g;H0o;QYyT zjGF3oo#D0Nd2Nu^T0h(C`%sLbrI?~wHs|qsY4bHdlGbBnUW8}V2=%It7N5QBN%8y7 zO|_o}Q3&jY^!!RLqHNscI5+qC`$=@s`H0qBKDp5{a!A%aw5A~B;tnxsWChC7@Ttkq z%(p>sbQaUsL5tx&M21&vZ}9D1=D}n92ylnb&|QwSv{#7o4WV-PbjE5NFt$c#d*2cF8dcqKD(krxX8mK(B^;HM#y)gD6g4 zZTuzGMhpjleV(Mvge-CL$aPdoWTUOp=s~gl`q@FObSBmspvN*_Ko%qf1lJ(`K(VCg z!+h(Gb&@qU)c@Zleq21o@VG>uY_6LOyu1^73Uvc%u8miPLF(jXa8ueedKHW0IEC30 zzWQeUW1kYJq@u-lo~^f-PL6GzQq!-6XeN3Lt&Xn+=PS7F5;I=Dx0P2UB7-HE;3#;I znuG0)v77!G4`Bx%FBISF=DOc}!(=MS(5Uu=V4)o1O7?h!ecr>fvdJo$n*aD0t66Rq-Ey)&bFwU>SZxcSsl0;zW_eYhloN>ts3%`S8 z_O#Rl6o*h!>TFk8U<0acWMraR2)`u+2mJ&V_K2>-o^i)-V`ftLs6;Ha(X!~M2BOy& zaFK8g$*PhwqX`0ESXJ<0Wa%Y8Rdg1B8Z{e{Xj0Bx6`I}pRcpV=)srt}tr7jYG`5Vk zK@H){n{%0w*;mhiaP;jKhno?G#V?#nMkG!_xrk>CggPpXX-!;=NE3e7mU=r`aKK2< zZFhS9&!kRj>CNp}Wu6B5HPnXQp0#a7s<(}vs8HbgUepvi zp3=1_BI_lgL&LVXzUaYWBbb*K{>Cf*> zG;?xEb5yRwF+=tE$VoB=I0vq^E}O@sqyDW-a_+Nf`VnG>pmFK$PZqZ7C1y7;vsH36 zxL_ruv&$ZmSKj-|M)t6oyz|NuGdGgU0y1D^7yi(YrVQ+E77W|HCHx{<_iG(bwA43v zk0jjS-up+a?gL!#X+|`o0m}l9q&Ow>$+i)w((K2@NG&+fmZ~;ny2!athwCA@U{||GhwYM++Uv4 zByIR^(MdWJ71;T&?`Ouh&_M<1ryEz!97$~jCQv{MGU{-Q*|n1(YzJ_spkza zp&>PAFR3Z^T5TU^m0PPc(vN7oRE@FJHF{jN#7n+MCGi60J6YiOCS9~fmsieY${x9` z&0IPej!#Vn*WJ>`b$iEUtcRjFRH@@F(-e=@=kNl>a?!?YAx15b`~>S^Lp2K=0mK-v z`NT-I+||Ss!Iqo*s?o#<>VS=d%MQa45+B!x=IX`URT(@zg#`4=a$)x(IgnBbT6N2k1~+agOQ6EptdE7C z6H-wDB04nMlnaS$Ss*wEF%qaZok^I=7eXW5HbPOIS09zxJ>r;%Aw#LHL1dg+bb7li zsXY`LCMp}_pMV3($tln^kQxHVP~t|G<%zsdMBz{#XIiY5RpLs*R1E1cx)Mnl$bGaL zi7@TuiPx5_Hh#*cg>Nz4kS;WSeREau{?1}++r-JLQ1Xxd8(}BAWx-Zu_G`Zr0dnW{ z*tjrFwpzSu*QFfU1$ll;Z}gjDVy^p-GzL8OQyXUMO=)o!Zv?WMl}DPFl$^Mw#2zg) z&AJTR6LN*<6T~chpo-5nExKg9ev^aZ-us5pV#<#5O;i8h``=FYN(B!c8{(t~CVyfs z>m2?S?!q0H+4@wjWM zEMLgYWSY2niBaBq4-4y(YMaFs?h9mPP2GB@o)|@~FvSPb4-BFxQNyIyAH~0Bx%@I? z`w+5RGJyLJaxZSNaL>pl6xCd%;=z8V@K@=yxLGN}Z<^EhF&Mq&yTS)?ChOJNpXb`z z^X~dJwcURdA8yTB2Q#5heg8fp2A0?XD_hdo8(hkjHE9S}_bYF*Gv+OP?(fB{biFgR zrO8ZGnHW`KrGmf}8OjfllgiB8wg2u$RjJjRbY55@oT}a7o*^7rk;>6M zc(CNxKzZ?g1XFpdz7b>k<*f`H2IDleBo@37=^GENt%QIk{hFg~J$zc>r1?nFJ&xX* zG)odDX-Xu-8BO1pnQh96i|xK|ON;j;Y{I+Js2*8@j{0nnesW);)lFK!|5{$OdGdX} z1F3LyeYjSl(X+7@(e*GkgNtiObwMpBL#e30L;9+l@vw`Xy#&!bi?M7HOsYR`IJyZi zvvuc|zX>d$o&S+uueGDdN=Bv8P)ti&wW{fV3lyDtNG3?vfe=g;TOI&6=5$l{eHPHK zvM>7@TZy)=R{;J{Y z=Ds=`dogVr4%FGC>Ai@_Sma3=yN!wnZ)TFx@DHvDzDv*k99zBaYHe^5)nDG&X2(}A znL9IXLe|WS+xB)soU&7K7o`+u~@sCL|zP;*#>#``H=gxgp-PxwM*JSPy>CFCV(%6B;+%mLjK= z=qr|J!L+|hw^*4y&a99!Sq@XW$8r#cDI7dDgNmA!YQ58WIwM}G@9HYLNrU<;aIgRR zKZb_;kPY^n_&6?T!q8!SMrZJj%+GJ7Ve7|;OlaxBJsSR>5r`i4r0~`wEh1jgn}jvx zM`HX6>K#D}dLnSw=?vCSA`sRb4wkkRK!vLIgH{wZeG$I&;vk zTZ`}GsAihz%miG!ge4L#CNRFy){0!Jutw&dw%6L$h zi_h)jkrV^Mq#V#Kt43x;%|G94-ix1Nx$tG#Zx%ha9QNaM|2XV#JMz1PhhxZ5S4379 z&bQ=aI8fpFaw=iX;mk_&%NG`N7GZVyOAnXpAQA-3qMmd$5Bf~ta|mpLFs7TCK;pga zHqV!F=l_mSU?_ekE-{kUmp_^kk45XV`RR=H%|_vARJsS|NJb-B4YY|xcbLt|?6H6M;c)C=Tl@8C%&q*R@F*Q~I?--5 zVl?3zE~CC)q;fv|{4pfTRlJaNja;g(Y^K}+?F(WDCLc)Kq;+G3$My6m(5Sw%6ImFDDuWsIGX zw}gC_8`cL{fJ5P-xXn(b(rM${e{|Dzch3CK?u>mzPnrP;laJQ-k=eWJa>hJ&7Ldg%eEKKbnCbCg@Nh?A#)4*T|XPGo9S76It+@b zRk-`ji%pj`n@x-43?I*hnx(NkSTe%>-M5s|lok>m3pn zBeH}?g_a?s(pu{aN#hJGmgymJrWP4wc3DN~HpSU&v20DGlh!H7Qp$KovVy+7jS?yS zl8bL0-S$;KZr&*${67ynvz+&=V{A%tj}2FQOBEQE<&dlmye^3^vLl)8Kx zIp+>y6WkNZGH9!kYpWLQ9lxL5j}{5}rLe25h4bjWnyRYGlp|5kcdZ6SE6ut2!fsz@ z(`-`@WL^{^CUz?Ef0>%i2uPO`Y^9>cN#rNxmWgK-N1{0CRS2NW;o+dYKm0^$Z!dz( zdLvX(-BB**SM$#cEXHqIl(wQ$!OTh}I35?(Kbx6JTlF&U2EmOqmhDFaA5nzw2t~*R z5>Dt}+K-_Twko6TMN%!i74#{{B@^W@hrJpC$+{FL9M$QG5_pNOs?3z-Pl>61(uk^e z0q)f^_t>g?q_v8aN=1JvWbGZ)Fx+02OBh;$e@AU-O1?kT?bo+Ve|zz8Rj_U*CM_&# z=At!w8POs?^WkWDAQMY4)T#Vpoo18WI`!ME{U&5Ka!e)8vDx{!<9YLJXrg zo9mcQ%VSV&>`bLSW^1m0DNdmOkRIR==d|lEQ+Bs3eW26!^0Iq*_ehtmj=xMpUB5_H zd>0CjE23%CGD{?R(+zT+ zAwE09x>LJf#eX7=LDQfHPS8N|>^}bm>_w_nxruM?Yjb=@s=3Qm0 zy>+XUeAG|16&<=BNZAld!7b0N;-)&mD^ITy{q4i%&?v#^4R!Ct2R%r4`~> z=ZP-wOjiB&icy8lCA##YiIEa-g9*;^6(ZMKw|%`Ia1*z<7Gl!GHu^)pjBFANIdnzf z6WNkQDi@~caBGG|;wYKgx2YhB+?N7>p&D ztjhwWIpFzar-3A03td`XZDsk8^@htq_WXyAmJScjQW+Z^Ez`>r7R&=pU6+S8dzQAM z2~GXn)6&WG%SJIzGcj?lq>`O!Tan*6XKm~@0lt}&hKV?nMql??xqp}8BuqG$sq9|H zt|v*=Yj@8-?%aV%Lx0ku@1piuE@35ku>fG#OxbQ+&fr(HX`P)ZTB+3}b^bWaxpbF{ zE4y_(uK_!Fy)4xxgNu;*j1Jscgly%oB?kj}M_EMf$Tsx_|BX@6TZ-7JTCT6Wnv(v_ zbJyVf2W|_L%z90EJ8?-KIoRz_F+K@zJ@PTBa5^u+Bmng@axE|354Bp2(hEr~7uj1w zb#?QLk`46PpQ{>M1YA#nj=f(UYRzLL=uGjNbarHl2ODfP?Mwomo>u4n#3&Iz?u*Ad z|IZm>H}Un5hheM}{y0%`(Wk^nWI7AfOezMC*kPAjBFgk*ngSQ8aE_(mD=zPQPVm(A zspmU9xF1xY-rU;@e9LKV5o?LaY%lzFhq3Ct1v7D@U3HNx150g_l!vu%sh@eeY4U4zXVzPngX1eO&P^w-fN!6*dgs8qvy-|=kDzXEpDk^Pgm^$`A8u~~?a4m;aQ+Xax{HmkU+8PhTercsL8)VN|n zmqRBnRqe`@?mm&=oiTM9EPMnDDgRRg@Fgwvtj*|280}4E9E4xAH=C;auPU`m@_1%J zwOZYyr=jFV%V%LXk&{Z1Bd(c+F?@KWq*ia^gsNf! z-=g=;taSNd(I;KSGYB^M`|&Cl{v)GR@18&&W{Xo&iT}`!i?Y*5|cWY&C{-2hsszmK&?J3=MJMK2QSs|lmc z=8~b$P0aZX1qIF(;iyGp;Zsg)YweGk;GYX7EaxT22cJ$YFwTsfuwgG23n$C0Bi*t2 zhU^w1t2`a0drDX@Y+}NJC6di_V^k8<7PXpJI=yz|Xcy-T$Xk&s`i`Qik%fC=oReBj zuV(V=162c6QwbHH%aN-3Z$?cZ(+|bWqfPAyUtbi@L zpN%1+?i(4UFsdc5Gtw63B2PBa^Y~o#r`>US`}z#@SvaJ+*B|sSfyZ zK2v$jyyeM|ort|UZt>j__Xb6QdZWnP{xvK7>@0%mE4b4pDHeccvf7mu@^35LF$ZBN+QCW@jf^# zCBZMIXY}QC_#{a^ZK+(YP|t5;_G~Rc0xc-Ecn?#?U zv$o@W0CyzQ^^;Fq`iHQ)J{ElZdj}F8Fh{e>g9T>W``^paXkngCW!CD|M`Yh`nIf+i z#X;eR3}O&2C%$XMWzg90TN$MBIE?~SCP`5k<@=*|HB(av# zK&zVmzc2h=>qTbyTr-e9XSQ5R?L)J)UI6h!<$E=b<0IRB>fjH{g0MGw4j zP)J-BfR&>^)vi0Z0h0SXi#wUxpx^z`gMZ7x{1g}D-u>`nejUt(fo?PxnEi2cc)*$J z|G&!{(!2O}?f(Sy{~mg=yVxOq!w1~1f(h}fW}px7qhHA(e~}>5Us!6|D|o3jks77? z6jT$2-{TfklP2GD&8HkVpf=s0+u};5B80c(M2*Www)iKFW6!fCP$!ekvz^IK*cRB5 zStA#GlEfth>4&){ncGI0OG+qM&xf~&Ak##OY70N6Sc_;&A8TfaXvYjH&gl`aa~ZWf zMz-WMX^Dw!2rST`|32qE`Bh-Ma9!6$v2Lc6vq`=VMZ)@~Hs2yKOY&1_L7otjB>x|Z zBpWpE1KTRIJ>Y+Bla3rZvt83qQyc%^4Sf%;Y5J)v%Y6(83Yi}&--g7npnz2h1c*MT zeVjmyZ9g4hmTJBS{Yr6(cu2IR01vF^uS*&%C_ieb?C9sKdlFfiBeSoqF96QQY+BIcrR`^={{{936oHc{id zVNZokW{YzFJwY&<1NlHKVidEJt+))Ww5xznrAx6f^TO?(TykyDkQDy|jWa{FR^&8a z1?46smS>iG%{|H8}*ce7@k>&rHT@PIIyi!zqtMiB1qhGoPRr^Rh2jvhc% zN&*Q-Tquq~d7#^PQk88Dopq-IPi-)?H-;aZkQ+lVbC+hUF^l6gR7v6TR$C%-RVa5ZEJA3DzF#_r1cN#M7%e*;d{E^C%0IlsYQxdJ9IQs5Z4p&ezZp`SL*f zWkH9kL2XXU)Mg5tC~b#|k}O~XnAafIJXKbE+H`PG>-GK3c{-hJa?By<5BxtEqA~av z2N12{B5a0EM#RSnGACa^sL)zDj}FiY`IFgkM(;2i*VIyoNB#^WF0S>NZr(!fZnI|7 zQ%sY}APCzG4X;Ga>^%-n>3u@!rdzE{o^}Q=bF#gNA~+9=2TlnIq7QE7j%s*O55h6~ zQpCn+_&zsa4MvGmvBpxR&JEfu9k8Mu4WdlKFRJZwMqfl<05U>li6-BT*be89A|}ZU z*;dKTMAh#jH;3=UFk|(|NLMc_G(w`*)7MD}4iDwUG;kECHXA*_o%{b5YVa}Pa^vMA zM4&}@C^5LAJHW(lOo>6Hb=jfI4$7F*wP@c;#IEjBtQ2-yf5spgIUYw(j($~LMI^2b zHZ9V-7M|uDn>C7wgyd}BdBDOG1@I8r6=rDtjSO33hM7ISi|6ROxBr~Mh|ad?no}JO z`m#7yO@9I0I1HUxuNw#KUOLI@;wcjz7qS50N1Bk0)b`fWKiuOSc_uEgX5X4x+`&({ zhnq&*=*IzOsbwusL#MyvD#4w_j!H*%)n6DlGn3+g1` zGw9H;C2dAQk@pUFe9-0+$`)sbl%1?%rPVb-rRPb=wFotYO8v!rCSc-eReujJ$+P`Cgv&9Pd7~ zozmCe<=Z-LyQlm-KNf*dh)-hR)Y$`gRl1jt&%J8k)()E?*26ova=M+ojtP{<%1VZg zHT+G~2qk>i;3ePIjZ*jy;T*zTFNLjBgbH7MQ40cz&_KIYgCwDUwVq$!vgdI-{AG4{ zBZ~ra2QbDl)Kwv3I&nOQ?O+#`lLJw=Y20n9F0sIjs19%<<9`Bt%Ob5{(xiE62zzIb zOy&Q>e}>ItzP$g_jhD+k6p}AGE5;INS9cJcGrGB5ZAF3e_z{9*Fm&KjIryD-g5FCX zHSTztMJW|{KQ8JJ`={^ks|hMwyJ}P*YZ{D{8$`Y?#w*;Sa)by6>gzXHFgMN z*%W9F(29up5I%IJLW_Cd)p@BfpBXN~>n&_hSwbHe?%g|kXCP=zoHj0|E0`{*A!c?X z$2vd9c?qo1d^G_u`p1?^VcIcNK{Q&Pbn7bb{&Rn&fu)8+-2mu@Qpt*v@DS&ug#@N! zADV%b*-E~v;+FzLmO9*PK0L%hBqf;!k};K8`COgf61RjVlt($Y@PXjV?&*I7Gyeht zV?76D81421cKg(E)aI@drss{;!HO0_Pf3oI5QKW8{WWwegw%Dp5gPqFJ_>k{T3)HH^- zq&2lna2Q4|bI{>O?WWh(8oMw6>aNJJ{!c>PK_@2xaqkw@9dp_*?II6Q03$#Mx#qve zF~er8_$S#7^*QHw`zCNU*LhhG|f3=xz#M^&A1(i*?l?Bs}LqeS8Nr>P5!G38G5I$@E&gBGb?)OHL z8W5pd97{vwVd88&c0;CfT&H7THw1YHed6D7b%&HK@fL}jxLJ$8V|J5hCbh+>ICaf& zeqhZvM$eO}b6KuNKb42Z2c8@A)CVm-NMcL;1_V?Kix*?koUiq&U==g`Zgfb zo#xjSYDIO<6m0$LtnPmeKKB%GjXw89bNVem*Nx!Z3)LYXc#R-%B|G)~CDXCq?dW_G zSOe<3A?U_=S_82~I0qMaT`KsZH}^$$>I>nV3%sQta80RA{m}lH?tJv?gEbAd1wYq~ z=lqrD1#!9!*YVDz} z+oD;En4&>XDGEu5$V`)oVp)z{*p;htnu(DDrNXKhUp4!e&0F~9g?OywSmf^bsFURq zD4jyXX}g46co{Wb7|Juc20GF1HFRJBW5DzVIHz-W!A2hJ9cCgGBWq_M^BE1N+m!xl;)ty9wSLd(#f@pt}&XO z=;i!=50aoyhk>l`wC3h>jnPL<1iaT;*$JN6AgeNpkT~V}$Bxjo2jW|#8m2R1G}uaW zMtJxNc5$8P!8<41h-5jIpel{>JAG9h0MxP6?kiOD$K&fQTV<*3p;H3r=*~?-hKr1{ zk|DB4Ou{q=tMtvxf=3}`k_#a`yh3Abw$)KX@1%8%CY^>{&L&N5PiyZIkOt6iCDEkI zh)u|#%^FhV+FH+>ih%h%VIg%~I{S>ncMv3OTzW&(B?cUZdqzGTR_k~HpR!@NNP2=s zvBdR2I9N7K)GV<`E-gb(NREUuLESbMQl_|>oN}--*KZQ++kY3?q`^owDuP$>7NjeQ zftG{B6nG(lp3{0+(u9<({h>&Z9y91tN){Vsj38(PdENgJyAojsz=qJle@kcf$py%3 z>Gjx+dNJ--85sKI4F)wTne#>Zr=vu9RTq5@C3CzR(LMkEFQ^K4b7lx>i z38R(gS$d*o{k7K_kI<&s=T>XvVgd~XO(aVE(BYMRWH^RQkML%DZP#*wG|#93))p*> z1cj*KVH@|=($d$AC=C_^Qy;%lF*0&Jk^19EEdI{a=Dx5}2EiF}=`=%fj>NJATA)?U zcCFy-T5bM1UBjGx<0a&$Avjp%@adX=PBu%R&Q6?JX{cLAU^90hF&}uBfgA4Qc->h3 zb9;aHnmDFtqF9RsF_K;8TiG4v7~uTGXvMnWYR@*oNzun25l1{JZbl!CdGnAWk$db% zT_O8FXBm-swOGcXN#xna&goGNsm};8?%`#1j+7Vv9h&7!o6(H3@h=KIAsb})DISzL zl?QGZnxtcucp`1t%}rDzsnx~@p8M;enAw5z)CE7#vZ-;AO8VJ@K@E|O3Rb$Zk;!xp&H2A}D0 z-@=+{A}DN9Gw-Rf@Wby#*2iOV--&hn=l@`@rQXQRWeG>b^|77)r8tJe-fR9vJ_Zz| zEc`RS^6e%#PROx=Sg(Un68T8k)LGNm3$`iFokaJyW}Z$VM~}5-gPE}>3a!NPs5q?> zcRbe6r5xRIe!e72@5$JwtP^#?{j>9(LU)|-5#)!^wP(Z@P*rqIT0Ji(lo^}_Q{7S^~1Qg zyC8#m+6n!M$iHa!6|f&*eKROT*@PsJ0uNS=vV(j6N4hQ)g;l3fEbW%k(l3c-U9S#M zsnZ>e&GWbyFjdx8%(5ojtB(&x1vp=k5HzI4%U0M5nF($yiCGH}Vm?%RN zFCS{&Nehv?F?fJBhe5js)2+{pNhb<9h+bc5=;I$Kul>c*A~BJ72L^b{8Bl{y2NT={ ze3Us0-FKpQBN>s^bmZ7k8%**1&?x5{WEVIo5(`T zsr&1tgAcAjbkh;v!L9BiC2t8Tf-M{nW{9a8w?%-oRm!Uddy(1)&(B4y!jIsN8$gE9oUleh=z+Izof;T?XfhK7W zQeP4sxXvvUq+VI5x5OL4@csC#o^L!dXi#n?*HdmKe9on5J+MR5AJW6HTIlOa3f02- zKAR={mFDyKOY?8C-Ef(X+25QorM{vU2z;(aYcnfL&*7Yl{P1>P6Z+TSN+z8C3(5qsUP_}K zs;imj>FbbuB-kRb+7q&jH@N<;ej_1h_T|Mc+@y~{-1D9Z21l>=&RTK~DYX-r`HGS^ z3@0)lJgJ&M-6AuqPV_-pAWjfw2?sqwg}%pVR7t{6O;R< z$r=G(E?njGMVb3Z!}g|UBP5hS>vt}Kek^YE)4dCxpW zQgV`WNFyF^=6jH{AL}2P=A`(OeEz`9%N6A!6h11Rm9}!4nmdH47h0VEDR`#5QY4Z4 zZvR9ZOZ6q~k<+?Y|J^0}w+JPXu~_mSk!BKCag3ERR+5-Q4&Cl*e(tMJ9EiR*f&5M6RX`fQS&cdqt zmMP|bzMwwd;mPc{X@}eN94v_R5ue{r&51Rz&%9mUP*p4gkg*u*9O3IKo4n#NXm#r^ ziFs3MG`j_>n{nzt!PV2#vejg4BtCWaV@I{eMiS-XzSx#jWWR@w8@HtK>UoHGQ_KeX zfE41?L{`b`bQY;ay95{c6l~F-QboOc%J7j{iJ0zSlUzl9aB32b6gEVnSrf73^{z-N zlY`9U*2DHuXKV!plgM#VyxrvHW99YUiXh-*ZrP}1cU9cVpDdCt{#+UkXaj& ze8-A@;XyG8I0U^|$8Ds9{-u34z}2iNvqfrBn{Wv&tBZk+w-~@`K9Sc!I^aics!f$y zr50VK27Q(kBq?PHsy-b3_F2+Ot(hYy7saXiJp0A`xrm!y9AwG95*ru>BYHHk2800cn zBZsvt;-!0!Bm6x>zMtjgR+p%j1lqj6Kkhv;F3uWrT_*Fze@nhYG94s-=XU0he;Vk- zltGKY=4PLW_|HsZlcahdL-I~yi@zc47|+0my@yK;>x%wfLH1hBNB5k5bmVrjy{Ug$ zvlX~%+A-KM?^*E~{ciQ{|1QUMX@K@L#$a+_I%n2kio0UY8-Te@1oUCbtAIJB0oDra~Zdq9S5tj z8qJB$rWi?4ObC2(KtSf)r8JeA*50ih@E=57iF6yi5K{EkH-Js%=*b z@YVp}fZodvwTm5m8`-acvf6@Br_fqur@FV@?+LBH(~mAsU`uGF8KfwopdQ}5wuL!b3EmTb(5FP1E!8sITP^r_22kL+}pc^4rgK?(`qe~f+RFu;DBenZO zS}P@yci4+h{9)VE}Q>fh616c6fPTq#1SGw4k@ zDZv&P%T&Vd@md$m+X(_sOgCESl;~7_*){)qV&kw2rqgI3J{8?s&c3M6Tji`3>jj<*};5;7jNh(yX_oSg+o&&mS4p8P2S?{#c{RftzX#EysGWx0ZPaSc9fh zXBp5O2NjdG{>| z?;nIN`U`?DH|uLH3HM$1hJ!cIt_{AvpnHOIXJ|gxgicNO+CqXtq`9``=K;FdAK5Bx zF-*SdLatyvv7Xs+tlWYgRseFX{diz|EI2mG%vo4U9`3~AN3c6Yw#d(a-?%>5buI_j z!=Bjita#>G2nRJ`8kgwNH{lwWkutY?WQTJlOmntKtPc9fPFq2nb1X4HzBWQIEQG17 zeWjTKEs*XV5{FkN8oidxuU2%HXj*J9tTpChY-Vt54UU2h9NsLpw%bdcse^n|;F)V} zWp95T6d3QJ((lZ_?H{nGPBMvUZzs?+Bi93XTR`6`K);vgR~&?)4{h6ujZL8qdX5Ap z;?YKTfUs!eI*z(h9;)IRSesaDn%bKRn_8T`sULT^mfO2f-*$%haDp#H*H^SLY zTVNeG>U6jrBs_IIojt`pZMhv3xtFa%@tbXJcaZ5dKfa%Bn}|!B22wZlKU`kbxSck> z0l%1D-FGHEZJE+H*%N=$Uig6^5CMhcigsg7NhA5J|HW+wjPEHZ zmaHlkoHMS{D6gCNYxS=_Sy^N;Y_Z-((q0q>fk8zeJTI*5w1B99DB%9;{mGEo^SX`y zrkmY1!K|m-i^*{&%kjGHB&Wx7$6GG0s@>IDly%jRbx~yrVW;9mg}zLzdugJ4=u%0z zvnr(RU&y8=?1PRsLcVx~zimWO7Rsuug_(txg%DJM#JR_sD%3GIXhXI}jt4;#-;V9q1!S;!-; zxf*wo;K5nb?T+G^jCmYk7d>o-WbPkf*>e9@HAM|z;(vnlWtghWeOLcVx{ot5z&=A* zt*0bwNLXW+Sw09h9FD5o+rSDuVMPM5FjQ$(+L{ckn!bikAhHXZ%b&TM)I^tcuq%Oo zlsn3vWk0p{{Hw?MHuAdlpVT886g=ex=R7QW%7~q1webOA;yD=gVgHP38?m0jUaZU+ z!CZ&R4S(Ir#lBgJHAz>qTES4F3>BvaG5_JGHop7WDtp^)zIMhrBIc98l_e>btdIK(P&y4`*96l z&zR`lO+WYE`iStuo)=$M8V9jKyE9S1m%6^y`oaiTmeeyl4j*?v`2Lrc%>L15)=2Tl~yS7s-)983)TUQL{nOixdnEarPH_5K<;pA zES=-eK@I#Kw{8jZSc(l)oZvIH(gx@=_1uZd?kbxJxUM^8-ViEPiw`#A>O=nl_Kjn4 zKdO*SEVIHF&p1!lCs{loTtd-;|PF+4CJBlY_>r*TGxg(L@FJo!ubrhK!$$ zq00RBag4OFG{Qbk3AsN3Y$dKWB#q0QSP0woa=oTkH>*&HcG8h5V_wYXD5Se;^ zVa6#pY!AdNE7+_veWKLjfW3jNy z2sV=jIiJB#PkZks`BI-mCvMklap-yqsv1VUwxT3u5n@_TN~Hsh$vT-wW15D!A4|+M zZ0D8(GkU#G$+dmsv2@PEjhBE3|HPpyfUZxMX91QjT7!C!kQ)7Bp=Yz}IjS~u6X`#d zYO)gl9fo*x!YMr^HCvvR@}4jArvl)Q%fB@BbU-6~Nd2B@Je;zu`F|{hTLcE|eeq!s ze)XHwwMTC#fm>5k%><1o-_Zx=D34WRRxq%ie754iQTaU>q@dEo$&z+g9BVFS@E~W! zE=AW+Yvc~*NEvESTI(q2<ORTf7j2w8$1|f0a`c3=d86E0jwBcb)uGe zGRj~)3G4_*B0w%@P*LF$+Ee0>Tu|cWI*O@Jx+5y65-%D50qxZ3k%{z$6a%?5BUr;K@O$ptr_Wl{KYNNY6Vd_p_bKZh!PuF><| z#Ss?2NzL)K{34oa`+SY`Dt&;=ryxvpK1Rhq-+-X`k=wuEe1-(%g_i0C*r})Jk0-_K z`vsE^Z!kP$6x5{NkOnVR)A7F280N38<&++cjV&UZ(xfbwNk0RfNmF=Mt6O>Ewp&+4 z(>bpr&5F*NutB9qH!6pDxTDZyRip8wIu<_}?r!Mev`aXaI*?eiQdA{oRnhMeyk_J< zb6E-P%to=XSb+K~M~cdL@x^b`t4kqTrlmNNH=zo=2lR}KEzW1{VHAQeoS5m{4#UtA zLm3GTlR6pEnP8v;gH(3^Q=ctEgI;VSj87ZtnU+*G?ppJ~6?cc|T6Pu>6;uCTjZ9aQz-tSc@h0phQcH2|>b%Rd;lbVYhs@*P zX$yYDIUq~^??IXPQM0%6te)cP$tnosY~`Q~9qvq1)rxJ&xFx4V(Is`c&*b07ki&|z z9$j>IfSuukSe1qSAx%LL>iYKImE@w-jxu_l1P;lB>Wb-Mx^h{W5?K@Naie_N6sGTz zBuN!$3$|BT9Xxm{Lp&5hBE?ozBE)B+7v+=)sABw>sQvMYDtUF%r83pO=9ubYkg#Kz z5OvNJVpICFGkjf0yhlFomR&)|vYc^Ca9ot5`E8 zZ^8+AzAG2%vEn>f*#xXuHhp2c0`LZM4p4I@*d|;sknO;a8C46MWtCK}(&{>l;hyGf zW9Kw3-R#^kCongYP?lzwb! z-*A!Iib&= z}>4W!Jq!%4rh;r$w#}+B0SXd`m2hE+_wJNWi_?mTb?4uW((xfkMRN**3 z2FcE?B9oDM*oepuZyg=Qyn8!2R;qb_D%}0X^)<*rTpQe`X#epl$gg2mr@yRFNnMS{ z7QLtv(yp{=VxDI)0>`*I&lGm%HmI8ZNnCbi!5E3^w|@RJtqM*>caolnYJrFOh*Ot{ zWJO*-e&X& z-qU5}*cA~P!O7jGthH_ocU~nsv9DCqapjx%*d=4P$Y-;hd5yAH1=0KUqJ+Xgd9ouF zp+yvF+`ly0qi(iXC(0qY?aVZ|lrYS^7+fRQp0*3ol)Ep>sKg8w(VTIo>T_G#(pf6z zw)2#wl)=TT!B};Y#-8jy?M?npfK2~#&?uqQM>0hg8xG0(a|oRqIg^#`nSGSNW{+;n zwPfW4>+fJfP;l8n{@T%U`($yEb%5@mY>n4>@bO-NQ5D7C@E4i6W4;x7M8}j zAUc%6bY4hK(F1hubVS5OikOIuOIGz=^j;C!e{9Mg6S5ZYb3DLYck!0G)>eGOZOntr zdfFV-L_a+TV_#L3A}nWd>fioN%*CwWQTp<%G?aLg$eU!>d!k(SR-}M?>C6WZA8uc5 zl`6Yj9F*LY9&Nm=2UNKi4Bde4ah6U`C%($kjyVEOk?i~?2*Yc4B`fMU$tZ&B-d;np z0hPg%C^l&?jjW!@8$}J$t$&Niv}uZTl;s@9rTxK7c+25LU@g8mOhhlG02nbPZLO%& zp3*;Aub8!K=lUtiz1hrDXjO*aV9gYNgr0HPg~RVKu*x;H@HVcvfeY(p{iZqoO-0UY zUs90#t6H%gY1)}oCVr=cJWn?j*cEx|`iA^I1`AA*t`C`c+q&sJ}G_ zJJy+&VdHpeB3lM^bGnq^rZ zPZ|5?&*O^bL)&UEDxlq-wltf@m+iL6vhTyLiciduVmoH6WgA?Xa@0xD0acz)&PCip ziGb=)r1z(T{J*SHqHsNJJSzKe@fDQU7s&yhj(B5Uh_qV8BiQscx02u6gt1ECJfG@d zN*&VWK<6j%McIebYZ~xm8(nD^SK{X8kp(Fp467Yd^@b=Wi6d+zxE85hYoHY%Y(Cxh zao-U44KM77-N^jfyL!p~J%&kowruv|kuOt4e0HjEBhxRzLAa5ee8d`3;l452kT=Rb zhzc!s-gF8)Ygj!JXVR4gZWHKVhftAjZuft@2NhAPRv7Pgq7sl9J*0Ov0K}xcBl{ESo^M4*Tsi?0)f5|I;`LPtQoqrgzBDa|5XVQQmTQ?fvRpu|vSX>rut zHuon7V?%8~^@KgeYU6d#Hj_1zKl6(MN6^u?H<@YARfys`QDlqV6kk0iB{~grIA$MB zSGQu;#Ig@*?vD_rKEYuU26n+xY=W$Bp>2x^?Pc$sNUTz|jE5UfHJTu8WLQs;Azlbx z2>#XMHR2U1SjJw)E}G@Cz$In8NOO)t+0#@l`-1+E{cB;{;+n9{5Hs_KpDS6G81<3Q z10PdTbx!$E$TW{R4#qKrLwMBgg!F`zso&gneN1$k&lLY(6hE48RFt$2wK}XikH|Yl zX0)k3kw#S2E;V;l_8`kM*3}?eE<-K>=&_9>e0T=A7jTb z8#gi0eponbjEa~$FWU|Sx)%~*f!&-SNU_I9l4AW+^1JIMpx8ypW~mDixp?{Fb(B@a zOp|H|yu)y}(bh!pV{;1RP7(!mD$pnus+Eb=$wwFXVdyb_eo^M{&rF%TddBpvGDAa{Vl-5-bAqX%LgJg! zqN6k7H9kY&m7>Ig$B*Fk9T0{CE|0niObi(pHf)DU|9OrTOE|g<9|JTt9`k3g5OZI= zCZ~wi2(22ZEbhMBj-`w;M5^wt^E6IzF4&b=*J{oE{^v%swR(a1ej;c(xxj&ax%Q=9 zr%52+X)Mb|F0M-u@&!~eW55%TwrncU0cn;Cw*GVe1k*1IbcyL_4Yt|<^vv1Y3~1PeP%I0T{Ub_Hb3AzgBcZE_*5Ae*>yAJRi;O7ll+XHYZ>UV`y%M7pqTgwaJ z38}Att4GZV@#x~?Mbw-s;K|S!8umI{=F<1kV0ngu9=} zyIPv*;r#7-i3+TK6jc~594>1Q3k>(w}W!2n&;hI{ z`unG)@=8+$HQqgd<`~ z*avkbWGUKWz8f#^4iCFE&jJ8_k>+rgUx#ZCuk^G#lA?ReV2FeI;$}#DPfUBsVZDB} z0Yr8i5MI6DUpLEMJ1bv1i(W79ZvO#gPe<`(RTg@mRlcT<-6Sb3tQlL6N$=z?Z~|8! zb2aIj&au9O-g1_`;y~cTz#96P z0{BhI?AEil=Z$&$O&HY!W~Gm}+Fz8Q@F=bao%)h3TZ7t+V8W+kw|sH%ydBVBQ~5^) zIQPO&j`lVk-m4qd%Lm4*8h~$wny-e6Ph(QSOAlrEc-HvQjze_kceuF{Q=j^BN1}W} z^zJa*7Tt)a%)#G!+o#MSwI|^Lyk7YEBHZpEylM(FpXJ{Iyp!$rfWF#7f8yqUoGJME zntf;B0l$jN0{6QDeRA~jgYo48d@2I&U}wn40emt$67pic;eKtlVeVb!2S1|p$^m~u z`}soNA{k`J1;xw>?qQ$3^_tolfyO!joWc9D2egdZg4DSJKg;)aBh-dcUgkr2mVtZ1 z>%oIxBKmp9_v2O9hI-b*13e@3Rs&o@qdX%7^NQ#<(D0^peWmG>ga)7Q-cW%t`$6r& z7=}!_;`K{Bn;ar_fSKG`o9G_%3oJ23sH1-GSYce#1al{-7r*7=Z6cyou3a|vW+SIB zK?sXM)6Cn4( z_shsW&;eO*8vxso{u|6aT-dM#<=VKI9-?W!4d`Wy)M^Pu=G?zB6ns9;XOQD`If_Y+ z>vVY1ul43Peg=s)2mSgKW9>2x>f`N)f4ZE$`mcDzdB%y1 zQcK*!B=0HV2Rs*g?-CZu*v81w$-!9P`afuEU;zuo#KJ+qK=2>bBw)}aU}NRbCLmze zBw%7<_yvs29GV2ItV{$a3J98B!Lyv)r1Vb))2R#tWbR%Xust^ddW9}5TDfA~Lg4)*`CV`m{?WnuZx zj-Bnd&dl_Snf}*~o%8qlf91b6_Fr$sRwG7OsI5^jA>X6g4!bS|LjRl|Lu+wo8l{1ftF9nRru^H@+V zxUH^5WNqih>eE{ohi?>DnYnwr^t}0E3Bk`%7%3lC0vJdP@1eR^ZUT~Cr)a9yV$aR^ zaPqndB$WJd&mQ#*mYTd)q4L-UP?Ob+jTux zU%hO}nw;dO`+mReFjIr;2g$Q_N|zni}K={SnbXi?r4U}`|w9)KTjmwWP9q`0&3g{ zSU(O3==gY`nDu!y4&q0}RQoPI0zK-AgzezTcO_KhpJN6|Qt4eP$z#DjM9Sa;bt2vl z<>4eh_uNK6=O?EM^pKH&9x1|i`oIbmpCGi8FjtBdFjtL+$}f}pl953h+ zJ|f01O>VVaUa9_EWw=*tx1?wwy5sRVt+1H;KE5lF3N37%*+MkUP8Gc#`m2;>UyD%~ z@(VHZ|M4YeG~_8g8>OFH8jY9-IF^TV$Tv}Yk2%9S6-Gqcw>J_~S(qqE_0J?K6y?*I z3<{6r)$|ZSY?}!`*=|(Y50$Tyk38r=ZXgRX8!33HvYb6`gmT&~IQ;I%yQrDX=U>w4 zNB?p1{3_-N`1;A8+Di`~TJ_zP-WlT-BJ`^by7 zEmMW9s;s7>%3fKOlRA~YLQO-bd9ZGkj!vU>H(@^EZK%1RKj5=-Gs}HVJstDRT&2%| z?G8t58cy7_2ZR15Hgg;on_VToTQ~ra(m0Qwu3!GdDywx>Zf&gJvvzq zoUB^dgE4Lb{dQMVOJUcd%}s^FuzlvrUO4f{`)j9UM8Ntfo4u5#R^CP!6e9Q)GCa2~ z&IW&cAkSBFI$x+NSRo7i(Gh|fr3!ZSMsSEyg zV@Fq4>}ATzvM0A_3t;=zdqeT3ns^;i!u9IvmBHuk^7f)SxBJTz;2f3dO0y2P-PP$T zJrZN{(_ctG3OX0SM5Cy%F_08oT%)2N4aS^fwVT^m?G5;0D$K}2YsQcGgsE#oX4`@( z-2K&OolxHH=EXVkCS8YCfN1MT+^s`2_NknI4tUdJ#u6I2TrZzKf*OW^~>P-k_2)MTLNSTj@=C zEVrsRgs@hqElgrTTS`~%sRwSQ3VvWMGRymdJ(0`z06$^N=LWvREDFo#2E1b|isx^` zKk=2l2yMYXnUv|2t;lE0FwBRlJ%Cu^=}!$*x`(m8)RknjUZ^!>uu`iN*A7o&#juWE zg*+>l@rQU|oxA4e1b85wv*+_cKT#}}=Hmsula?`-bw@jcnuD6l93Z=;dL}Y_`!V>W zGWditR6`vA>U#-bqz2zr1l>^w-SO#ns;U`iTcK7#SEZ^+RSqo^S^BfiWEf60n`kUl zsZtGfiI= zuUP@j;0(Xk*wT`QUt;vT9WQfBJ~h|CqblpXqRgB-JCEduN7^AH?P~ifsXZnLhA$zbFmd;(=c16y?p3GyFnO6<7=PjV5oi!5A{~ z&0_{x1^3&r%~zf4IRNSei`_c`B#-R~zwdY1faM_1|BU-fXbcUfhidr>E$~1y;s`6C zeDv%9-p1h?aKl{1nA?1)o)HA_C3dvioC%GDWRY5cx4ITsEhTS!ggUub<;MMdP_rA@ zJ0QUWdBj^Cp$V-)el+nb!@BU;>^}NQkhGA3+ux-EJ9%(H;`)cKLn%oGoWNEO*;m^=SbaPBtx6>WB; zJIMk38;dU@7T9-Zg#Q@Lf3Xroz+?DmYLj=fVe_TUcXxYt+M(y@J6YTd%NO=$kN9)o z6ZsSV6+ewF11iP-#4l-$0a-kyP*`Fldsy@=NFAg?Vg_?ATM{qFv)Deq`cB%XVU7oHczYv;H- znisy&w7!$O;7_6Mz?-1@?4AVtBim#6JMvfNPm)#Ig~s*9;l_bqRYIR}r{zaBwFKse zVlU1*PK$ITs9+*}#w3e;l~Y8Z ze!4x#y~^8^r+B-2-04I$&rtthvXwqOfHM-O*ID2Di@4Ufc<>f-#?b z12-Y3CwqQ&ttXKD{U!K&H3Kb+FibPIBeyk(4l;7b(gjU7{Tblfeq$+peO z)w>sy`w8{;R8pkn8;RkWUu(!(1M%aMHb6V)E<|+3@#gyO`PAU1bd;KN7Um)b=Ause z$~Ll%b5@b<*IFEXRUGrHW?UhnyUz7%tgNhSSMt!zC1OU>`kV|^sBYywWH1Y)+Q>--k9I3MjH%Y zb0a;Bu+IEn+2PG{%bDW~ZP>@Aa#fRMdp3=!(%~HJIx#NOy0r!Q#^e-lluQ@)ngLxv1b|I4Xhor8Wtg0|KQ0W@lJcx zTS6z4H3Nf-kEBvl*ed~|6X7idYf;cvBdmBB{b4o#^vs%2BhkbR`7Mb&+S>Hb0vn<% zttfmAAW1I^;+Nn?PMnW+)cVEl%qcT`j^7xh?$|vklTDg~zF|wR&{1G^d>u@vprL6` z-}Upp@YuVbN_4KrZd~vEoQ2peMZ`*4uF(Gqmaf!->b_eJU3D9KSaYUWT3WvLO;o5X z>2kidXb$l55>`y8B-PoAdJI2?ZnntCC}Ll#RIDbl^|;(zXSy_B;czwC1Q$P-|4Y57 zBvb07=(M(S{ECs=Zgcdu79E-p#`Zl404I8$oy5G@LZC%0LsAw#tQL^b>smV1aaBI6 zKbpo$q=q*(Nu{f*tgfoijaM+SG}Bt!Y#%r1!<3<|nA*qFT+8X?$&4JF5Rw`OQibia zw9;7HOqi2zvT`@RC|^P&&yCL>#ve)T6Rn@lu6vxmJO`aNQ&x5vV6*|3bW~Un%=WmU zVa1Mw_|@x1s5n|rIM8bpQnUedpb>-RG=`0qnRFY(k|D8y3bRiMP=|`NQ}prSjkR92 zVm8dD(cOJ3e)9r=m-fABVqVx80Cvu_O|;=#zBRB~J8yJf>YJwj>3r+k=DleBjDS~J zLO+O}DA^g-UOvm++ulDjJ-1~0S$rxR>v@q{cj^2K$H2I+^5R+ab2S?i9OkuD&bF!EF?L=6#}O*H6PXts`j2v zQdKiTS}s2LAc&LP%LdILvO_aK4!>^5B#gCnIbDCr=1=jNy_sFYBEpAQ1)rhC!Yg~kR@j6>#HgvMm|{7D z?vQ!e7T`WHLSFk)l+J&~TJ`-J1nw7GBAcL#pii&Qd1)-l9Sear0piMSHmU*ezUP+n z#PFsGQ{V3_Ajsnbpt&q4nFzfDE0N`n;r`N zBXB&^x4IwwYfTdW=3@Y=%Q$%tIb7HHBJPfx4eZ8dQ6CQSxWze5y!d#vKG^OU$uKkU2HM$S8Z2CS3&U7!8rY2r@P391raKR(4ALtD_ z6BV7OY5=XVbvFqP8UwYnYCuIv z!L0WTv&*~y&Xhn`AqLL$&NH$AMV8!a`X{I#GiWBk3Cgr2>I7lii35MPGXV(-y=XUS zzDX8}{tu?E&~i#8QEd|iXU@Nyk5)BR#RUo*h0Y8t1@Hoc%<^DmnFuP2G7T+sh_H<$ zL0=Xkn?&OJW~pao+n0%bSyGnMKrBS?MFi=X(F~gR!!Ra{1n&ZJG8c16kbI8e!VHnDyHCQmY2XK}DBoCH#cyZ-h%vnGhh=4OVNmgqE|8XaC-Nv}3X%kHmHB`F5vI=qZ!+AL2k4yM z+9@p${-Hri4wPOpN}p5`r~_xEyj1P<ENCY+{cT?^PhD=+aj!7Y;KvMj{JLZRnWVGq=S(MlebFlCWWO%f9T zHKdb3)@b#j^wScGIk6lp?fC090%0e9RCZs_uS~#{Nm`6ZhZIR6+zv0jY^D&5m*Fb4 zOSpheJ;ES>3WGG6l9U1#Xa^F^2-0e5wQvKBK&w||7giAdRwPW6l{F9U@5P0g!)S%s zHh`NB#A1a63VbI6f#(?8pkWcg9Rm>zYNUpoA}`X@jU9jsfK?b=7+ILHK(QGByzt@& z?8vza>hVZa2z;8JcASMkVhuJKBNqcs!3I)8k(y{uJX*g-IJz91BiQJ2C=L7_@n3%yJp4xG3~GNFFPB!Tax%6xKy}fQH?Hv* zFmwd@GcX-z4iF)vWHJe>*kI*zbVgqmEF1eaF)^|7z+orW!7}P{*ue9F`bdp6R)gDX z$-m(+p#y*g@&SKopZ^WS$rz9j0x3d0z2?wrzW#ZQHhO+qP}nwrzXP ze966;`(tL3TAfwt{?jYzq*pyv^&(XfbJ>x;g>);_5#p3XNl;d#tO1~~04eOr?OO>; z7SZS?c(Q<;iU&7HCk5gfB!F<JtQ>rz=??>vhv?Z6 zX@WZg&D#bu3><@ZMBGTsPX_cv@ACF*|8ruLwhrk=(D!ss(~q0Cv^Ig*5ux`%4lBqa zY#ufi`0w)txCbBD1UUo7NtE!ABJMBC9YdWRUQ)nfeo)GzpZ5?}h)l~{D6Z7UYf`G9 zNtQ0}dDy_IOpN0flPmBb{6OF=as0qwfoW4JFA{Em(B~ry$X0MfTeu6~VtdhFnmN^y zPenSZAT-Gl6DA2Qkt$@ju6qjWTP4k4b0de@6`g%C&|p;(akidbW?t!5YcWzF?kA4P z65|!&P@R4J6Vdh;ZKe_8E4U<3Idw*1azK>poa4))*h)x|=i4RKmo!FS4v;>N>_7*h zK)YYn?=!+`n`?x~Rj`-`oT%0(Bb7?)A?i56)Ro9db6(?>&?--A>BlR?UU{y#_(>ST zEpb^SCu1m6usBz)Wpzn3br(o@!H=Gz*F(I)eAedyOaEDi8$$0=&Vc^@yXZW+p-clK z9~oJOT@bl8IA@U*lNe8+jtso3_?%^+$AFs#%hK_RpjU5ZPg-?Us7f&3BsKankAYX< z5>84kt{h63Okbciod&!39FirweJe&GeAk6v&$RDJq@3t4>`QA7ZZ?I{gO=x0c#eA> zh)5@%+60oQUSO%HUy!I!VNbTLmX9Vg(v5D1vggxs1JfBR{}U#S3&jwvyl90~;Ko}) zMMTC$mtY7f?1Ht@?b|X$loXI_0iA9@NfB%@BgN3&;Y`RZ^{(_( zd!7_+rdS@MM}a zak_406AP)B@la|ena@jKcKIm?JN88VoLkym)CBnLq^~gKAQbn2CcaNC>4?X%4W?w^ z%gU0jDF`S{_iTp8Q=0Z_;S?+odprQJ97GTuZ%Axmiv}EGoUkG}g1bK|G#dT&rz8hm z;)u@0rLHkNd$Pgj0CQ>WtZC-R)b%ipSzh~UF>r#MYpCHuzj##C{ldvI^9 z@-p;{FfMK@)nQdChj~bKM4PVM887++@Eb)x<5?j#adxq~KETaJy0;i{(&a+K75!Kw z-<_6qvS#R$SaLdy0REVb-(HDGaOKPbUbA#t7v!b4aBH-H3`}U3$TB4L>{j!e?Jh!>XOPyBwu{NI0 zfSI!ZpcTLxeF%nP`3a5J)4ACvrsIrvuwylm`cg97IMv5ie7Vz7R%eU?x#WH2PCgK7 zzbAHL=!TTIW$il3TrxeGFJTuq!$-DwXL4W(+n}+F(ft?cIa7o=9+LPwg?16Uy|77)Y5geFWezvO0{|%jji{Ul7c+z;-S}itCE2Urg?x3^($MN=0Hzc`4{wi9`>V zr63pdC-TgS*gjLb+xq=viAQ6wM~o7{7c)8!zdQSlR&aZ4**DE5aVgQ2JjFliuk#ON z8l`}R^z=z3%P@Etu{7EXsG)F4NK~zy%OmXkqIO4F(fFgoOZ85jtVLGE6WGK}{?+D8 zU5UV`oZQA;=?D2I4N;L6sl;{|g2*c4J>EbqS-e8Ud@=d^W<=IPVi{lQ&&I&bE7%B~ z9=NI!2=cS><HkL zOX(nGVYtVRFiM+?>hqPm5*`gaQA0K<6g&54iE(4jclM=7!Ot)0#awemgV)KspVHXk zYG02EIfO?FynfZpm}^Z&tJ!(InC=_I`)YVqZ>PDBi2JPhHafy_;f}{)*F*8LftGibDkQlNh#0?qKUfm`lI4X{k-$(nMqn^I%vPMTo$OD65#BKyTx?vQ1JF~ zG6a&J0L11$Q3MjrQLPJ+He^|t(Ro}9*jP~Hw#y>0{79CBFU^2n(j^Vc17yPlo+vu$ z8Si~G%Iy-m_O7yf($0R;o}n-0{u~bH}S+az`--;sVGLz;l$- zeW&xDz{nN~tjVx=&*EM=${x?U$mLXdk10m@M>Ig~O(En7#q62B8eNqF ze}J-z@u}c(G89VdMA$gL1{*ggsxb%>EQ3(&0j1S&Rfesx`I($yA{B>3AtG;Jf3gn=LJW1 zDw^*!D4$f*kDd%ZBpkMs3WDT@t=KYf-}W<`DqfK501Ab)e!R~$X`4f&mqgPqVeRO{ zr@(|I$tgEM33G}v0^=v2Dnrt@6ND9cf6S^QL2J&foyFLF+8GN?r6AyO0|Ze?NvR`@S8>~#&pTB0-xZYn7*@di`C9CJtAH9 zlGF-c0KOw@PPOKK1P;6Gaj$oPx`}%V`~HQbapz37mMx??3@+U;46!eKN=$`$YmXUk zrfTmkofP=X-kAA7xTj+Q;U6h}uxEozKI7Hw8D0&Uz#TZP4{pyL84_ae`8bjmIe^GK zHGbfrW$NbM6nwH=AGmR28>+bjC;L3hD;I}S7jcK}fCS?Lo#GvR zf7v$67E{N)T*vC3@-^Ko>z-_0s@${Uk}1sd8~CNNR@;A)4T<6DPC>HovexIe?Cm5{ z?f|=|KAULf9eC8J9ng)d2Iz z`m+i41IGFzE$ZQ=*};VZlG$Oo=Bds!B)2@Idim4w_nbaBei8Xjm=^#kKl0l=kVnrJ z94Y;T=#GTd`a^BfuYT5H@01XE5z!4m#m@Ou&4cRnfa72Y?D}oK0_zltf2z`;_1>t(3W^E41 zii>jZ_JM9dd1ycH&d@#NzM=X6?kUIR_n8F?!+eX(?SoabJ_lCg(wl>AjS?YU^f1^V7NE-Ok zq##|3A@lS4RG%k4R2uw?o+h`caQ!8Ev5eG>)H;W(2C96_rHsaS^SEr+fgU6%=C!`y z@~tIJxJRKI!v^0GhO|iz>;h)&Lij=(+6^-^%Lwd>+dUBR(_RuX54L^N`&7D9`jgS6 zqaZgZ)0?bwciG+&cAr&utQsjEAI7pJ_PZ}{9LZf|m5i|_5Wm-IU&rf|*HmDrkXbC> zvIhC7p0YIO7`K$kU=8~fk0HKTI?=HSPJB5cHfzQ0wo9KLt8|e5J}YXX`kT{>`};+l1D2 za7}d?PzPjg-LlG~^QZ9@3R<~97yhmKGaH~*#*@rDU-b%4MAB;n^+W6;h4Rf#I~ml4 zNO2(-yV~ZBvIDvfs4fv#Y%{zq)?_iVj-)ua3tq<-L-+2MgYRFwYmma?T@os8mf!1yfcTaZ8gUTeC%dB9xzoAlrMSwSLKEnfQ z$B0-D*VJB(AMG2sm0*xHV0C1gP&%l8*MW-8j)Ml>+rIEh>}-IiS$7AtV%P+f_Rb#T z^+4h8g!fu>7xWIE;2Zyf>tyg1j1js=E5 zDlQ)DMz?2V$l1GVKyelHua}}rL3Ot?Y9e2?;diV(^1Exy6hqQ z%`BGe0Y(`;0vkWxEp31Qpx!i+9q{vzHqERD&5S-*A8f21jg7IpgN}{{j3!$@vb)Ip zRja?{OXU*o)275P;H?opAAmy-q>H<6F&|OUC@Ab2=xan&ssLg29r=+oB)fLFMBVK+ z^Plg6dZl$w)R8S<%1+@j2of+Oy{&O(DG3|O=a8TpH8wSzE1&ataDf<7p`K#!RyYqf z5PVw(WT)hzSs?Vb3e?t%U~G0kGgYI*!Z(=L_N!;G+&%km7^|_a=(;cBvM9PPbbE;FOo@U z5li@rpKtZoT)^S?dr*8Iy97<%sdH%9Ni|az%fi;XOig0Ho}n+dcpC+v+(h%YL{gC= z1xt!QuP8`l1-@_-D~7d98v>c5;><|xuuav0Fn=MhKf>jIU`m@L^yNF%{1a^1ngG{L zsrKUR#kXaw{i8(ugvZvB`A1eqi2Ee@3lPayYgWRV?O<<}4`o$--Vby)4{NWFTc@_c zik2jHd4L!<(47EuTQIfW^lCb`nezM#QJs$`72bCMoOd!*p>V*)+JNvq2MYXMCe0dg zf758=0juxm-IjmHTqDfqY=O@l-(>-Qt_r>2?9S*{>>!M!;Fa09GR z=?1(G#cBUQ{1TyNk?#_UtIN^R3&q3;N{w$`y6nl?Wd?FlUGNFG0_5aLs4H;W5V#v= zi_yVfuoAJMJFA{$#hw#)-9p3!v&Jaxyi=3xVxw2R&< zLO;2 zEN6Gcr{>=>zXj8UgRH&y^sfBEctYlP&A0CLP=U7QmdvXb@BaD(4u z3VS2g426fZ_K?gfcBzBwR0w}kuqP(72jWEiDcj*&$$!%nS~2ybXUrXjVZaff#6-qd=p^-5t%e(I!GW2@L#*=arN zN~+A0N(HiDM`cru?odHnBol`ZdX58-G`b)4L-nggX(P|jJv?nk>^8Zl-P-VEc;r}P zn=Au%F135(_zj751jIVkRyQ35zRO)6c`BMkVCghXScY76v zZO&%LU91H7l^wmeju=G)Rxo!c%&FnkwBCG+_iO;*bCtP`c@QZQe zmk9pkdvD);?h;;}_p5?IQU|?{ldd>(4GQnwW{N$YH$bEd()-ugOPa6H1VZ)>eCuOX zXrmy%UX_2KupHi|Z&|(Di;4Vu#b=HH$-p1>;^xd0$7cBmR#Nv9uXm;zO*@&o3mD$J z_G_kGmReWiUY{3Yl#;0avA4;>={Iv}RNk>VQ^>;PcfHvc`EvD$>AjbK5zmcwcJ%yO zk!Sy`AO3nO@SOfhB+a&2=j!Mai+lMKHO+L)_B^6=>a0`=ir9v9x-@fH_A1qJq}0dk zmnR+g>|xZDVC+?;T?RPMrX$0==Gp1@_&`53@le8t{rC6$-M6HGtJlb&p3C(Pf3*+r z+wtT1e7n*#_GW#%fiYXV)2OJl*u|x2&3as7MK&Dr&*7ngVL>4w5%s=)K0&|0pDBMp zQf*}E^x&9$V^%rMbTK(c7`z;k#~25cq*e;@$2EE8rwLYEt#k{M&W2)a8q;RW^OqK< z))u44X_1;LX|4Rh6As0_I+lkddlKoYy7s9MT8_qHk3 zGt7>nik7-6fWc)@@MEqAs=x-ua$0hXalImL`E_PH7(8In%4SXIGIx` zD?7%IR~TvwEi1Hx3yM+xJ%r9?8rSmD-Dtwp8G3_O2F~W;p=ySbnOoso$*#W1F@hS3 zE``&J{R~42DxQXzF{Jq`LWimAm&iz4G9wz2P_8_4j*(#mzQ_jV-e!%TE|pn0t~NsMU@z07LH9D6P~b!ht;};suQ1 zmQ|1PFmn_|>1L&~#&G09zZx_r0W@eoJ*CUhLaSeZ{DE;!dwUv+w$zZ~EZX@QDc*~c zm*sEeJhNowR%;SOfFA8j)DQKNZxfT-ixj5pm9?zG_<6CQH&RmJ#=zdMUEKRDv9_6k zG3BP)kZgBEnUF5Wv#+V2!x%Lj=X8;o6jqkrEHyh*Ir_#ulh{Yyrp&8-_fyu&1}Xq? zW4?7OsJfp;ka0u~OOn>0EGNC1XefIKPpfCms~?NG72ZiS3+{@A3rZ~dla#cuC#5CA z#N>u`{R}SBqy0_niYfIsS<;!!uDZ&O zEO}yay4<{5>jbRugUOp=H?g!OB{pMw-8<=a!P%<~U3%YlZ)AMYl~J=T)%`8O!PqZzOy zbw}Eg>l#>kyH(YKgm>XrD`$dmv1(A=4<|NDJo6;NA0?Y3Gd$U#-poZH)+p^ep~fie zQ>t`I7N1r=c_q)Nod4C;3|Y4xFhUKPl*g`>$@`b*R2r>(uU?JtV$#40=8hS=B3kB_ z#40_!n$L}EkGLU1h+AIny1oH%1dRYMrZY0wl>ZDmzWrDcpBuyJ|8C?CxFYYzg6b#U zVD!fh{4R79i`^nA_hRtHD$lQjXROuNSQXex7|(Ob*j<-dQ=)aFzoFlvf2H51f2Y66 z#Pdp9ph(Tw@<c;@7A(wM27orexgQKaR3BU& zpk09`lB^?--k&|*zHYx}KNj}vv+WsRS%&V}FW${ai*&AN)50D$=V?RcP6S#sk z^);Y)#FHTI$hrNn;D=ett>S@9l`~cSEG~VEv-a}*S~*y6H;c1CB_XMjkeD1SPA3bq zm!&z;oc$QbkQ|4Q8rKk6hmaTNkQe)q7l#lR`;ZfnKK)$j{HFw{(6YKxC?#dHsD~|mnMLrTpjc5 zmoAd<44i$0g#g+i9g0(2<2rrK4l2So@l7ekiLzSH5X8ni5#FtCm-@M0v0B($3h+gNE;@_n~5^5#9Cag z6NLHJX;nmbTqG*A7f`P+z}BImFRomCGX*N9^QbnbdK#v!mQ7k}qfe|2Z5K)JsMl4n zJ@?itH;BJOSj&6YN?=*2LfL;)Lo>~YbE_tGX|szN#q>$)rW#EoRJxc|tz?pB$-I4( zHP@peC^1vjSRW+BjQz=W74#~x+rKV6W*szm78K;gCZQvxE>b$FpfAKa#Lze=pe3TYE-X_xofIeAq_bQjPjyulacq-e=wsfbbP{ zX=3h%84{z*wivjA8gxFHIfQJ%gxb7Q^`8n&tbK;h^rwVs!<9uN&tKIA zV66*@{!)U41CQ|hE1aiP_yFo2m!((6r0%*m`v%{TmU%+@Qw)E`WCC{zQ?vj2))t-t z-;Bd3ioq21t}I??PQ9GBGEtsIR$`{qq`mPuo!gSdl0fgmK$BnWL{+WyD|XNO9W7f= z8X#PsR(4$=j8){b-wVjR2`1SiV7fNd?GDiSF6$#oJ>PsH)OPP20SFpObzz%FlXsqL z#`dSc^$cU=OUJwYDy%SfOvxRz_T=*o@CTW1aP~oMfS7lV`I_~+_Ct+^EE@k1@sMIF zQ#^YNY?BSy)b7vBBZPPOxAU>|%&}{*l95GKD06Gm6JrQwWt3X<>$t$V85e|$4MB9l zxcW0=N8ro6?))o6w@mJ0FF#3iAUjf1U47u_BZy9v%GH5wyT;JLm&1@ufey}U)&`|Ck4J|fB?>Gc(m896X{RcjV*f;k>BRuZ466s* zAwIXG?q}~v>Jl}oP-Y>3SMEHnVY>@^+KrtiyHciUU`1^WQQV{g5m(|pfWiDSkJu`M zFFqd(FW6*Z_i_@SU`HL1Tu%|X!=>7yD&2V19)Wt2ec>y3hdtf!a*ve0V7pEM5P>;4 zM1tG2x9DENgbs?>OXFDqd8dJ{Rj+-lV_#xk;I|7*FSef*Jkoolb!`X}(GVpXy{tAtlozpSm7{o`P{}GCCr3NP^p6wu8K;4i@1yhnRZ<*z?976{8~X(A9=X0V`%+<4 z-hyF3P^6KY=)=c`We*VjfVJWO6c+bGpOrrcq$-4LZxwGxe{&aQukbDg;}*Wok)2gO ztx9K@mzXD-N1n%>J1?dJrubcYa~?E+^%r)N=&XQSvdzP}L1(-ayQ#Ig1-Fg)qN(~| zHfrqqMx(wP;9C`X?>)Gq{AnZU!_`BdH-e;2Gz<$BNnzEHTNE^l|8h=DBfLQ|ege5I zjWl3qw+?p^zCu`Rruh){rtgLKJv7c1CjS+7PZ|xhce$Mh%92lM(Ms*LB~8@mG|C_o zjP87*lNR(u_pn2NzNVMkf8UG|uh)B&*g*Sm8VIO$))6V#hK;di3#DTersNS2H# zL!=Xpvhtk0LWGiUD3J)84kT~3m}OfEV|zOMf|ddB^ReW0vDBYTCJnp?M{Z{)B(4U4ZcYa~|+l@vi$m*?z&T;hlWMQ}CyOQ4hi!HBJtbImCAXc@5+n4C|s%<^fw3AGR7A!s;lF zCt$p2GDuVakd!!Ql{tQnKt6?Mc4?mbWX0{&Y%;b+VY+5MCHHS3^|alC_B3rcPseLS zomkNZ(N&{!htVROjzi`d;rdfxTxo5T+z=UQ;>Qlx$R8iZw?;jEI2b}`F&fFfJG!<) zK?(x)7mZ0hI4mn~G#h1n@Edd@JFccXvj|sBpA46uEsn`{$D~Zp9fuqu!q3B6G1oE? z8vMTagp``%e*ueDwb`{aGnrsOxTFH{t~k;ILc&AgiZK`V4wVuvaM&A4U~j`m6fMC3 z8E!5s**?&cmofmAK#?JaBqV}a+VS$`uzc8>Ky@NXU z?4XgUTLdj(z=&c*Gs0fj`VniB^~6I`uqIGN%Hz)6RlP{5>_L;u3hTWfU_g%%9 zo$vSDW~U8p{Bl-idJVxKn?Wq*P8WH@AoD zo4)mx$eKWVHVSfLq;1d zxbLO~_QKnw9w6u9*j&8%<_aq5O3{1jx8b1@E7o+7(zL__<9HGVE?Nc#URn|ga#oVU z!KOUX8ndyw&>=#XO~tEu2^1upKjgYzLnN+s%i>fS90W|uI)?gEM77p-F4f_-M^noP zv!JK>8znS;5su@56Vu6J4sgDFg1b+>toEKxbPq$aAXFh&6stSo=Mr{^sCu)GyX8c2GjDj^Ix4Y>m)c0K4jefyc3M2F`!m3Z22f?Ep&f;Pj3@JfCOJ zc9(q1YfF2hJvxGtVeLD7W_?HK&f z=YE;Hx|=1^{Hw!RFhI~fwWvaOTJ8)CE%l)Z;DWURBkJqRNzx!`nLC2D=-$pYA9P8V zQx5iJAz|{~J{4e`u9qwC*ZqZ}XUkVY;pD9sY?ha{0(_UAKe2Qbt6y#kHCcMLdiPqf zA5XWt02|)1;-(wVNcP4zXt!R#9Vr*d*W3C!mOKKUrN7@IVgfSKy7>sVTuU#`{?7gToH zry76<`)W+NUUTq0v9vI{nDa2%T?^L?a?o%oa0|Ih+?L$Bp5|Wd418*c8FA`wc5mTV zs)fyR>P%<%CgiAx_ht!#EKrdi5d(RW$~)ht+BA7SzWicJ%f9RcPnNf|p) z&0lC(TTWh9XvaG4t|MFo1dOWuL>iEn8vRv5ZA)pftj`n9-WaFF8h3Yj(TYpgh{+i_% ze@PYJ|I4OALK}%{Sy0`O)H0{CF0O7${{K1ew&Z8cE4a*W-W+F{_+~Rh*lhFQs#glo zE9NMU8*ULV*cb!mOyitF;G(ey;+^~}&lI#xr$*a;gq8seMSD(S4K~8|^N)m=CMO>r z3LCb_c^T_Z1eeMY;nrXpr3x@sRO6i40qZmPmoR@Ycp}QL(Hd&x7+SaGR$$5dW#~gt z#4?o|Y(Vs8;+&a)JFcDIqLE-Y^NcrcNGk?kuQggc!!JJSc0s>i00seGI@1a|2r4@B zIuP}il5M0{Apama3x*13&k-n?p7kMc5?=(tg>&W$708~&l_CFgO-^EHrIp!M_IE)Z zR!E?hWt=~z^}C_*mT3rVwS~)UfG<|Glgex=fo(&d_?NDoKeFex7|M3w<_YauR{iZ4 z%RLF-%*%E_mo4SHu`7OIE<-rKurKBqm(SUjCmJFG6u!vWgGJ8aEW9LnMPP2iQ8+}v zewLCHBY>WT2X1QsoZV3Ud>{kv0Ew(3P*9=_L70KkRlM4g7azs3@1oA)sbJ>hw+v;S(*bV zq=y0l^yC55VdhW)I1xhQ6vYQ#0IR*`pv58qV=GA0^Kgm9;m%#($3;5&$Px3hfkpLd z0n7`Eqd;&uC@4b8Py!VQ63|;50B?}!)xtd@0Fxlh;efw2J^OAa{5RtB+!>2DbIf`$ z1i~mp&Q|G#&1xX-E1)CueNfN*Ka`j?>NMckYry`B_erD92@;Q&1|5-<2Xg}r{dodK zEP!pN6LvWH(eeTLCV`(zB$Tc`eSV{5(*aNoC`w>EU&u^|$y1hL1OtR3Nb*xvhrppg z!3FgZJpHvM#whGD~E(qnDTtbT5GK`EmFatz9wCZ+)=3d)(+9cZLLS<{_5;lewGQNfPbQh zXRC-m4wBhOH9}je+NvfY4Y9%VE``i04Zs{Pq8#7Gj`&t0@Y)h17IIMT~TK zkQ5hL(pQy_YX@|wY%W2A4+_FOtMy76D`Z??oL*~2BqV6A5?+@K;GHcXwT6C0-{^uh zjw3vm%xKzLs7xPY1X4zi_qlV9G5-UpL%u4=;VJJWfLMqFX^v7LO(?30>c?A_&kd0O z=aIx7&MLXJYy8Z52CafL+PwW;O*O=q5!sNo+K$-FUhg`ys~zA8(PhCS8l&1kkui|X z^HsN+R*AVC%P!5Gurl{7&^!o-L0wQmZa|AXwR>e+Ch z7Uk&1FApDFJzSd3@&N^~*ge=fd-exRi`iV<&nVO*F|J)lc%%YBkB-o=$bA)%LVS+0 zNU%rZ;mvz9fV1`(3%csMx{wG_)3}J{VQQ7}2b4F-o5U;!?PGI2dY!V<+^HbmG-Pn54CwX5}6M^uxr0;-S?m8#QH*6a1c#RITEGRO{jd zX&|JhXjp|@vPg#8?69Ml?)y=5S$iLn!dWdNg?GCu9I0ruz;`ibV;SIP)~Lv2h!ZDl z4t2q5MG8i6z5!1V{3Sh#56coN1x@r+6m z^k+MMJg^3G^r)ghw67+2l(Tafe77SvQ=@X2Cb(h1Hs+=gME17543Ld<^3h>=`lXO+ zH-KCayZ-k1q@FNQ<_{Tuh;flNWC2^CHnBuIJ5k~@387p%nS!ALYVkQKpvJIouF${8 zkh1T2c$NuuBx*Rq3X>XyX7+$T><&q=c8&GfCSk}vs=R>B zdbU_?r2y=>1+$`z$XlcYm~A2yD|I zksz*bT8;?5)E_NCF#W{%R7i1%X1qy=l9_&*(~5{G5yA_0b8MuBdbHR}Yhk-4n&ZTD zfB#s~IH&rLWadM>uN|=XlCSF0KNA`*e1UAtkKpVvMEHP480`g`4Hko&?jg-xrZ;musc z+&>Ph7yKnvOQjrAFZx>^M+IsT{`VxXzF0AeYJ5_ylD_R2Inqo&zQ-2cC5UambQDz_6 z8nvQ;Y_!m0| zfo3*Do~iDk)U}!#79($XS=j!gu6r+WaF71FpTdo zjlM`YHM~-Uibb(7g!8U6fUNDnGO~G}6i`{&u*jUeBxD|CLh4wNgMV4^3rJ9fU%wx_ z13%Q?$YrR#U_u5IXf1EK86(U^1lz=|L3meQ5`D7ZP@hL$+A!}#=rEVcu2VlW7jpg%p3p~>P)?{!+E+i69e0yoWr zija3o0jxvC#115RegP1YV?z-~gc7t}k@12k!~FOvyin?XoTV6GwNNezIzYrvpaGRb z`0qe4b1OwDJ>!&!cYef(%ta-L$RzI%1-)^IAp-S^U}^sj6CuY~Sy(Diy?nKEoe3Y< z3|&HA-=#oX8@?E?a8=@+08|h`;G4fdiP;N^gLpC>fZ}nOmT(Qfm^=w_ts<~#0sylA z9tqHQEegOP4K3Co$><%^+Ll?=;GkmL_<2^@8F>{`Ciq5nx;j`WUTW6JC;&)m_R#E5 zf+4+&A}QLeM1+CCyth)@JU4F2)G&KE1!R`l+^9r^w0PtJ@vs4+o{l1;x*9t^5}=|F zBN${t8T&kU7&Su%HYRw+6@)BMXzuus0s9wm7!w%2u_1*OZ7ytHkkd{Ta`ROiU zkw#Gm(zYzO3JbGB>if7{H7wdoGcY*+J! zIoGSrf9$80>lLhi{VR%s|1zk>8=A*4LW?`_-(y^GDjh-j=#3Tf?{}Slw zOlW$n#3qkEPeC5q0N91pO$Kv-zw0QI&+H-pcIFz@`%`)yc$-ubUev(da8pQlab7p0 z3gys;+^&cpxJqajokX>?r&*E2Sg&5(78f2fm8KrRPxHB&M=?Z4tpusV`6Eu?6N~nB zsqSydnR1EkjET+ml8w3Sr&@Sk2BOV~l|0eVH~kb179Cv}aSnr}5*q-&!gf<3XDrXs z&rDe;8U}4wA{#qtu&O|tq*F#*SVS#05fbTUt8S-C6$E4D?SX9xQ&37aiiJa6?yfdclrvhd87imQ_pxx+mZ zY$gF&M(Q_dbErHt!Bm-$YgsyL|tuinj4;sGzTYdXG zK)qih?;JdXx*@#s7wu=v{=;>|9(GwL;MsOJlPlM9$!jyt3WwIg zlO+3$Ol|7ZW8~;9UF~b7y8CfoflqufHe+RMyKY5q?D6Zl!|&KvC}zMDcm_*p@W0C$ zhr{k*MizRMC0Y~W)LhfO&k=a_TnZk}uAGj*nGFB+H3)@>%q5hWeUHGl&Bfc^e$*h3fnc0<=<>pQ>9bylTZ#kbnV3n{CAmT-Mub*qLK3H-2$Fu{W? z*;(oh3&&IOf+Wl3;!~Pp<#moK$&>nYbRU-SlIiwf-stc2_PT)cA6*6mJNE^60U%}< zBxQ>k6YfB|Vq2mYM_x!Jl9H0VB7@Z5Q`?r?D2~=cB)syPd`e1Gw{^iefKlx4mGk(y(;dW>SqwNa!rYSrTb~Cy3`rZ(=*}~ z)!fZ2RFEn!>aWArLilVqdR1ViI1gDT^pR}eDhZN!q;}x0U4QS>8rq6O)%Y~p7x{PJ z_eVa^)!@GF-?Rno&Xhi}(+gy>U*#%Vakkdp`!2?UD_gUsPPyg7DnH-w92k9Hh~G1m zUiPHgM0Eifb#)0ZF`=c~A%{jyG|4(2?tP_L?+5J(Gu_x?9giIVK>h_Xk|97X7)EGS zPbZU+oXwSXfLHan$Kc`n!n@GLnSu2m`EpW!6~MfVXeBA8HyzGqOo=210xp_w7asA% zv^gEyY#%C&g?z{(cI;`5G_Ms`;qittI^j$!dBvugyvTEWGSXR1ZtVuSc(v6UIyr5$ zap(?-Q8qBYRDECiKvw&gOIxC%YPD_M{uf_w0h37(rEB93AA>ss4DRmkKDfKPyAAH{ z?yiHoyL~XYySqDF_HH(tyZ66;y8Bd4RpnHt)9FrCPCf6*{xf_q(gJTu?j_pey{}Pk zRaD612d5po%Z)|Zays^-uawQw?CG8k`%_fg9aBid7E!9-q>0;`umvaf_>;#Pw;^cH zgI>4w@E=y)LOE7zP5anxQFq(Ki`frxa#yBlJd5l5$d?9%MSs}Ei6{GpEt(!jrvypu zvEYbhsEG@4f*N1G^1Mvl9zk)-4rAb*JvNrl$jYJ$fp`CypK@Q&ASq;9fBqcqH8b;i zBlb1Y%qZfz;#QdU+C|y1nvToAE%v)Or8x*KoPqfTEbE5t0gYe5(V4yJ7zkmeG`6#7 zZ=M|Z>zc-`AuT856$Esbsfl`on!KcMyC)Y0e&X0=!ChJSC4_JcrtE8kM*G z%E;^Mk`or5-UWaaz;*I^j@sUj8<__7%Ntiths=Q1Q>g8^kj81k+X6EujSO~mrky3;6e+Db|&aE>@K%`>{f`!jGs=( zzln`B5z+5~Ev~tcbl5BI%_OS7Fta)gX6!X24Wx#VU}d}7d4650*X50Fa{*5VBj5wT zz3gIjjT{>6FQecGx)j-EjuYFRWA2YtTll6A6I3v3F9;QY3RN{)ElSwb&d;sy{ksQ7 zxiyVZ8Prv4ztZ!*q$igRVhjL)maCcHkN$_V7YuKMn~$*K7kbuN?6-+tJZ1%xm(#cL z!u4k!#Y)tN>{(qn6>#1QXJ(&dw$^>!3vA5Os+v0K+3dY`x4C`j4@(i$htb>#$qEko zS1t_|V@@5s_lTLMyyyU?on@Ta&2bJI9Jl7pNkT*0 zdZOY?RCah=RfPX+oEWm0oa@u*8X!@Z-k?DQ6am-HR``?Idh+h82HL3KDyb32xsYNs z3-#>3-s5ozoJ=tYO)at_9HQs+>t06u*FHn%9^6`9x#W>q4{-HYiSSp#rkNIeL_o7x zT4dA@TQAG-FV}eD`y9>m0m4-Q-}1MY_w_Wd#-9sr)VnhL;-}n5SDV%S!)nfR*W^4> zX6=;JFo3eZ_$D6@k+zZAVw?kEsy~P}s7kb|1rQLE4gY%13FhvtvFTpRmFsbEUwk;k z4&HV-@y|qDM<@)eER7J}O|T)-qA7)nx*%Dw2OOZcx(Ufny;0S!B$^Fvv8HCbo;j7P z)A}*TWS+4q^4;J0Ct*KjZ{{u&df)pn@wU{T&S0)wo!&<~3CUX4Mt&!XLi=)vU2J(J z-HS@32J$OI&VQM{Jm1_SxgCfv=1@B~$8o zKS-@&=4Gl+a4k@5^t?KrZZ*blY@d*1S9Ewi*M2-k(6n!#p z#}nGEKV4JaW_o$+{I`sU@#B)jX*27M8qTEDS3wrXwWPoqL6*O?p4eyMhd3@j9?t~i zj=mRK*xrUufJPNf7Gs2%kB-vk*}q#Q_m`UQMAhVcl{pn{ys4e{FDJ&g`tBJEb69D<~Qs_Ie8v*D>SY`dmHQRM~_zAWNTqJy@ zu17ko2(hVMYoxyTNPY%7eQBo{ZrnWxnn^>Q6)DwEWR2s7v}_@<((}GU`RT2343}iM zbT2y2qQ$bpKijIQ(sL)bY;h^%UVReL^B5&|IDs^s_l8YIB<#@>s*N0{PfAd5w=U|d z6>rT8jV}jSZ6v0?;NKlBR-Rp$KcFu(5#F;=)D&OVu|2z3Ox=K~g#{t~;&?yFIx|NoK z>+jd8=d(SY(f{Kpwwc*7yz?S>$4iyA{hq~Pr(6Y`JZm|e8=LKsk2VbZ zzJ4#E>Fy9Z6b_KP>d~6NR|G9BH#vS&Pvu%sXt|C=HVgf5AWjNjLcr|m_M;|BDyj(q zd5bHx0A{5<%WL4V@u({!zvg5~7rvSCeK@LZuW^!TXy$bp04;Bq!+hW!SoM}mD3-x} zMIXV-L5)Co-T9T-nhjhyQvI4n)0R8QR_X36dg}$$8#RnSSg7@PYi}&@@zox#{;jz} zyAc|>7_kNJRC6{~+4p(wY@W!0(&~^Q|eJ#fJax@$hMkzN=kl=e|IvG;UpF1dyj>f~!C+To^&>`N1i7+0&m3eQh zzf~ScA&*2|@tx)nVG3mvQ-}JH-NLl>X6w3z7ku)s$ZW*UOS}C3jU!)u^Mb%jpqS^@ zC(1Fj#5!s=&%Z%bI;2ap^;2Ue%YEs5PcBBtP{S%K*)#u59wRCL4RvU`eF#v$W zoH=wfEdG4U40YD?tZ^y)}ws$g>%=A7k>=4-vmuRmMx;WeSD685>JGiaH z0_ilhPY2(KLpV9$TGGgTfT9Wi~m6xNH&G&`pQZK}M|=593o zhtfZ5aj8Ab=y<9nnymSUx^WU5!u`em}8B#0Qf3Fc)L#<*~fo8IIuIDmodu`1Ea z{k83n3iLLr3cf&2#*SRt505mr>s3^FF>(H|c>E`;Wp<3K)XC25hLicnHU5|$ZYSC% z;52Wb8mI9Q;_JmnV|mSmFu#$R^1zCdVT3$B4wn6fXMZqoqHc$TPe&Kor%>+1%jLOO zfxD)L;Kw}+#g2{IiqzSBsMo`>^r^}OYT&{G9Vkv@YKotAw2OE1?#?-3KT1svq5ZbX z0I7<(@ju_MxFD(3nlNv|i4h}3Bip4bI{QhK-zp<_7=YGe)*#olEd`J7T*=#BajU&Z zp|+F1KWB^1GY$&5?+L>yOI6kMR&#Fqj03h+;(YV=(v~ZiRu}v>oi`8cch-E@=RX(K zxG&Xn3)p2mmn*t%hhhm^L#gmeuFg!{7C4_Vg}F!S@~sNaHd|wG?Tan_yA&PwkLs(n zyfD`vHA;1+Y62I|nQW`Qc#1=ZdrQj8W1*JX=%`zx3xu5>%}X95VDI^iUWQU{w9T;J z52==7IhrL0zI6?|DZ}Xu?(MH-CWi-{6UoKL>xY>WGHZS5 zmwhYj7#lAZ1N<%;ZjmP`;wB!ZTbg-MUyV|qt+_TjS4HZxGtsYeesCr)cCc;k`u4w< z(c|w!^&*8MTs7-13CdoTG<(WcXTSg1>zxFhgJ%t{^KD37X#31|$z<6=TX`*J{la5Y z_+r2bTeQ(9_uM!gxJc>}UDx+&38UAN(Lg^pirQsnqqm3PS}Nh#&hZ{1-wqa^hYoBP zU5jkLhjo12hNbf9)zu0=^P|ii=8jsQr#`R#J{=_7XY?PL{ONRQ`z$+s(uo1L;0JO) zg^#^vS#TePjL|im)r7*hJ9tR!~ zsLb9-6>emfW8-xn*Prf6ES*zWnxxFl3pE5wchwwldU#wO6Yz^annC*-2sWymS8TO> zdf)E^fsWk)KQkDNrJ=UW3xjZ2cSA+N$}48wkCa?(%l7ZWKdh(2e#|{(xo_QFs&;fW zm3q+|700YJr8es|v`*%CZ3GdbM+2JQPY-zdil~mqV}bxqJy`s3?pN4pOAjS0&2Ncj zdaVba&n8DzLQq}a*$orJ0Tjd?~Hb?me&D&$-sAJp8-sJFz5V0+-FpsvxchmgX?;8$| zE5w~d%VWs4xwY`&*&+&Gqn714!6}SLp{BQd*;?Ih@V;pksmh`Y_x7Q*9T;;Na)%fz z(M3j^zv5!hz=FW6J-{Gz$@9T)HGM^Ja-36dS>|JJwqc~&fMI5%mtFK((8FAFeZWlE zktS?}#a}&s*XEvIAu?yxd=}K$e&aA(?*1Z<55c0R`eM}i4yx;mNxwDKI|(R#Yh!<` zl+sPcCDQ7!PrQj)JwC$DxUluXndG1F;@mlC_=MlxUW*9qw{x)9@%@+9bvQL2&>oG> z*|YIMI_4#xrtw}BfLiKfX40&=jfI0_qGI<(%BOnpnlqkpnz)e*GgTs^%^oNw?_j)K zovT|u83m)~P2R$3jTvY4)Lok>fqlweRi8DbpU!{u6FXEOUKKh$+R z;a_*%P-OR$Na$|a zL4q)!YDPd>bBg$AB86VFWoR)Joo2L|j;yti18>I9d1Z;Nb=;Gv+YKierA71Eaee!F z)uuoyXn-aWGPI-cmnk1F7Fpb9;^`NFq>|?$J@<^`Gf>ANK5tj+fUP{DNH-gi-xJW6q~d4Q5HQF=HdJC$dDyEaacC zZ@b2%uvkKDreNk|i8jLmyT7Ue#Ly0KS48T5~iD9Sx#4zzaT_9e0+M=nV&Wr-hqB!UqH@8$ZsJmFdm3`y;*hT${)W$ zh1f4bH#H_sOAcyxp16MW2hP~mRMJ;$#V>XtJH+k_eQR)b&All+1()XeK&)cduukXf z5#kXFnD0uaId#DgYgwbml3d#3M45FgK1oh1p?`(XAn-@gTV9>0-}#;n$ijp(5Onn5 zZ@clGZ$dxofdhe_3Rq##!^zr-Qv~>;U znNu0W{Z4!12UAJ&^bohV^vvq}QB4;%!1rim)`vRR@@LGA{%Ex43|He1 z8!`EUy<-SZY+#&JF+sWfD#e5JS`l{ntNIGpyKirsdZN+<)IUjIF57mQ zUMZ4t;k)G=-YqY;o;fa^E*+dfNoclFIuVxip><=~ceJi`+%bikE8YOUN8KHl>%Jow zYqn=S4=L4Jwws+6dm#^Juby4(56-nZb1sD=8!NM$i>HO*&Ry$qaIKS+3;=69mIB}uLZH~Y_)$J_ZzHg5Jr6)%+lj7Vvl)noKzxmg@H^gn8 zb;UnPZ&ksLf7+m?sBM`s4%X;V5cb8UF_omND3RsYKLKe5^+S%*;_E{}+}o!)1%KC> zX858!AB1C4T=z<=I3pi1F^Wv&fFDR=5Nw7@d636*_1(Tuyc!{k{bBJ@ok1K?@6K^L zd8BnwvbFUVHe8whk%zq)MQ0rMS%0$f297nrV}=hwdo`pxpdG&cOq&uErCFMc`u_Rl z^O4WDo%KibCzz+qbx0iqqU@s?BFyz1xd2+Cm8I|VCazN5Yl>C!`#tAz6uwuT`_eWn-Baj2-_1k!F4d*f@?Q+;qb7uSY` z5$za`j3ExddJ?e0Sz|mCbP&t{JXh-2kyUEyGsToznbfGQHp@LYQJ}C0GzN&%D}QJDHz29gs~&)WGHK)=DCAk7yq2YymEPr zDQR6qCMgoVeKY445Rgrf;1J?rvQ02b=ixM=90Z+QFv{3i<2fH>U32pn{#k+|u37Vu zhuNfPBQ*eb3UESSdT}x`D&fq?IXNAE9X4oRT>q&vw`gvxLqf?eeB%;xYXny|&Ml6J zE3}i@>ZX#`pcaT*TRA=I+xu6n3hjigEPOX?;%^TT2fNETz1wTP+-aB%1g|%{y zz&bIufuK2I)V+&YAAYnl_d(FmGhu+}&++j=n;_4md8jcOD5ooPY1#uv^+882DQCIs zHKPEDpU?&Ajg6eb{)QGCXd(2iZtPd>0wE<)-bx_hq#=Um=NCPH9+#1sk6A#zLGz+= zowAxe*e0=BZE!m;a2c99rv~lx1NLWw9yql?N5fPC(#ooQK#E1~H3f)U+4QBjX)bX0 z&PboJ67LVFPqSXOj->AO$zRPZ8+{QWdB^72wu4@}1*ASxx`rZdkf4czc8DRtW^*Dy zDxh<=2d6+b8T}~oNz%zDu1Qt6AH7~Dda8~_Labc7pu{zR9FGyfaM-MIkU=_&I1VnWygVbAK;G@K_Q>40(;uz zua-V$JqBD@Gr602Nj9#~V8qIV;$^u=Fk#f$VUM_(2&*_55#Vp9>0yIMxWN1a%~nOU z8AlrLF1Xw;VX!<+(W92H)KQ|_+e)tg+^=KMm;CtTDi z9V5kgxjOkN7uu9Or8t4D9S{YVzSfj=$)+mAqW+IHZbZO4jA~5JELb#X+!b@q5`6+` zklLXQGC2@1hMpAkKC0+H1}LG_NuBFsABfMif@g5+^R;{?S~#Y5YM;@625t4 zX=?({YK}d{NdHrdgq5{1X4REfQue_$S;PK!>e!=Q-MH>#&RKQ-4dO2{)(EmD<4H^$ zWdG&|!7;DhQ#T7&m$B}qwg^~usKV?uO&lN#9&Gq?()lZpd^6Z!O(XoZf}p?^=BX`e(;~#TyH~3N2c!4~}OtoyT|b=x@Z6<38XuGMxuOZ+pA7{AiBw z+OxxcBU}*YW36NgIoB#E3bm-DR~}bqhcxoIDcg1VP~W4-exz0X@dB)5S8tOcV)>LsWODh3t%BI~3cUccx|K4^?uRLoB27$XA;PArW51Rj})p2IEd zRU^+CihhhZAwk6!#|J8<#tut$s_N4#(1E5S`RCHNOa_z5M%x-S&|iS@i1Cc+B?dT8T7&_T`O_qv8>t-G7X z@B8G3$S*|{G`D5ba5r@5A#NK%2d~+#U3^i&n@31NhqZpMp*0Msq0euB(JFA4_AYRD zu}#onqBGC^dn;J0$8_dy$;!xJbVJ~7h=!oU$7Eh>%}Q>!zT9}B<0Hm9e{=8)+ z4(ao0K!nxZ7TVIj*HF!g?#=Lt;4Je;+HuYgG;Xs_N>>^9h>JE#LoMCk)>DWPHRXbT zN!{{~8=-~{DL-}*l>&AjlyHU?l;DO`mLP_bmzD=h#sp{MQPD0|1RX?Ge_Kx?L?EU| z8~Pj?|D8rbv!V_DIeQzGr%nPjWO5?-R}(H`N%mW4jT~x-6!mSWqA}ReMDw?{wr`iZ z?kass^6H?WR?jz$9<5eqA03mnF&rL~2JL9d1`Qq_W$^t(X$X6+a`2@5a9(9@^2Sit zwvgjtYCS}IAZT7?5msTBRf#M@NilGDU%4qQ(MM)-x(cO%>1}ATF{wx;CFvIEV9N@^uEGOKltVCAHVnueAdiY`h*2HwKj`G1Kv z4V*-p|rzr4DmceSN-wYg>1m}Mp?~mJfV*mh&N4@ zb_6?@^z3w)%3v4iZmg_SUvH57RPjCfVMl8>cf=88sV~5>u3W9Rn&4$=ba%J3%=o8C z%KA&vs5NW}k)JnW42?xqE78Y>sFsq+V<=QT@TdVEU?uE0h(t>V@Do=*vW@Qd82c2F zg(~hwi&n>MiBQv#;e0FB{rk6%igKG~wT{V;(UP2wu_bD^IK(l$EFtKb0fslk?Om*Edz@iEByAp84!MF{F#1>!dSD*r z%mm0C5&ey%cSu}`uPDc;USW-5OW9e|$k-Ow?`oL+r~TlQJaPhy-)Iq{s5W&icOvjq zv3UboYLSh)##1ea@(pqga=ANE)M3)O={adgb_AR66;8seoqlD9>ztdls~-7R^OUz} zn_Mn%4*PbbL2IDweLS-ml?xt?nnfre)jtcPb8-1ow=afHmcfFzvmyXH2;Rrmy@Z6< znXSxdJ6@Qi>ktxwf*~r2)zf5KH-=5G-kd@T^!89uH#=g+w7>im{$afl1L4Ph&I`YP6wajzxxeZSIoX5^J^@}az~IPyJDdUsFq zU0yE}x!X@yE6God;oPxmyVaGrSG3h|?{r}yK)UPHgsV)qaX-p_7K+sV-T}vTcdR}R@zlakutss94un|3@{AS89lvX@3!W?0W`3vorraJ-}iu;6&IcXvnyH&!@-;Fy0T;IL>v5~_IUm2_Z zev6uWk{T29=eC{1Bv;B7XY=QsSatX+H>_53D7syN$O2j7G;h&cy_yv$;L5Nr-aT_%}zi?Lx#)Ops5q-2t@oSf_9 zWWNSv1o}dFNzwj(QISYu#>C3K>s(Ni9hckX@?)tNf&0}I@6npu>Q(JoYk9@)L%IB7rcFCR{g!eOWf+np4YFd$aPzvcMzcu4^r+^A^5rsf~~x63SOf^ggtqH zF?+mpf=&sTz7A}^bMA{yuDc6?q~ur8D)_W|ny2Y=n9o9*E_XsRM@ZWpifMt0;a_L> z68IMi;IXg-XsrET3dSI1*m}rdmY2%gTi{>NG==&}Nl*o- z8-ohO?O%MeMgDkd94TUS-q)8`3j>ten=#RD`0jVmLmxw^HGT|5@x3!@$xD3AN1uI# zfu%-;@`GpLa$wj27#s|FW22VR6VoyZ|7hD_y-FWUB8+QyT-x9eLCsL ztrn|R92($zg(`xmDNZ1HYy6xE*|L!!zzEaBYnt&QYO2HLRetWFcby*Zb-s4xd-wyu z^-ix(Cd!e@&DYf`Ke04_Oj1mw7|Yy>;BKUq{k~Y}JIxaf$k`{9;8vw>DynBg>y4Il zRm#cM2<@RCbWK3TO7* zjZ<@w4?w-0lo7BZE)RJI8G0-2BRMKspgyye*6`KmfK^M^<))|UadlQITT6)6H%=U@QYeOdRqtZg0D6&~veNjY1_mN12M4D_4Q2&sDBBok zOF+Fk5?<_fSaMTas>HlDRSVC_mt>XM=_y;f*Iz0Keyhb}c&{=oVOM^=MXggm<#*qu$_NuTnX_hpsEXFE9D*U;iNB zf^qUl>SziV$ZsgAk~#Z~7Tr~52~?8Q!oI)rC~`CzVR%?6h|*w@cw!l2lFOW)t3jo< ze0h54NLj0CZ!PavZkw=Z72WPv{h01`rRYca9=E}JK~1qMwrLZ~y!YY;(3iV3{1l$P|?5W7Z(yo{c;$Ok`I>bDY#NUXZT=)*#3vdr_f z4VrtT!UCn3%(RtpWA|du`L$d(bk@MxE*E|s5*tU2AJbTzIiuSr9W$mD=O*v}E-F0?8$~Lu z$Exyp%J)t3^EuQ1>Y`k-p_kX}Hu=067%Hyyee#Dd!P>JZyjiV3nJd7Q)$O@Cfp$>{ z)O_f#@1%5?Bi~x_I|mJmcHE|wUyw4Q$6oYGj5B8`5J@CwoX&I zvjN6A1fx8)%{ev}o@3m#q%XB&Wca%RSu(@AJn2Dl8gxe#R$WrAh{yY80~6??yVc^W z>T%l5z6ZR3$Kx`49lKi}+xeGV18G{65u4~#OT?uf9zlK=2Gs@*rBviB%77iO}* z)=AcXaz~Jua4bFK_w+ApB~trNxwF~wuC()`2kQybsa#y~#?=(?vyLoUhflsszjIu! zaW}+^ql*T%ySqie#r@k0Uk_pHXPny2h`t*}WDRI1S^b$La4ajWh^c>bq|61EutW-c z@or3)L0s4^pdozeSIp+S@vn?9GBYwQ(}4m{ZL7vwcgoYhN8N5lKl2B?^u@!yZi6~Y zcU-sgIA zvpjxY{A|L#1$e5D@reGgnjM{VI^G`>26%tH0cdQkwGr5Xh`vYLk@N)b)7w55E-n}Q zWbGH=TN)r}EZYsHqxlZ2SoL5f?hxo3b0X9oRMgxmMFY_!=C_W7W`Lp{z%{ggV?uj- z!oSs3MLg7JrfX6>r&d77Tu7J@B}^|`}^N>_TYP-L@8o2saQjn9IRw^ z%9TW8;tpu=CL90yhO_MS@U*xLyp(ZSiDYw7X~MzeR_ndPgHJ0T6aNmsyR+UeL~o`+ z_MRuOO%K<*!?Vh-p{5(Nt52Spw_Tuo*3a~6DLzOFYQ`+P(H*e?t0u<3Q1mfB_5;@& z1Hir~1kx1Sv<+ii+5$#Jr%f%oen#YKAItfFzFa!P00<7`+i;yiZl64-&{HXukAjCX zqS!yR5*GJo;jrH!&@+B{lKFcY^`Dw#o<&(NV~i=n#xD*sM^jL1gh}sbeBC9ISCH{~ zt%Wav_vvl4zdcU5ZMCr5!|(_7SmAWf-ILRF&UBp=He5kN5w^b_UU*$CHv=%&ZrrYC z2bB(Yw%p@81MJ|(Y(jVg!FP>Rn*O8fW+3BQQrnBJ$g>|k#? z!o%K)yy@a1;dk_*6>6Uq&?W@SKpulo$#;0>~rjzljfjo}q(EJ>aqs$~E{#ml*E4xkY6kUHHNDv`~i>mwc z<3tsw%8;>eDh`^PAY5bN{ty8Om6#j#Za(ypBm3lEyjuC1LcGB9^POgtun}%A)>V%^ z;5~g|c_aN<*`YfSFA?tF;XES@7By=yJ*S0$YfLia!5&&6l!(5=TM`D-V+?+3n%;1J zv8N2if_b78H`w0XHa((ik@??bwV+4rRk}l^mnP?TYxB;;m>$`+;&+HoF)rVjce<>A zuYXnUz$H`Bk;~GY)vmMUzdCo+REP9cW!p+Q8$DO)rAX&~k2lH5=+V*W$<(lr=|=4_ z1Kmsnm5GTwP)+13+j0`!p@)#S3(zY&lRezd50Iz-YsYF{OLKXFUattG7qlZyl{=!;T z>mDpB?GNTgItu6+LnowxR7fM45X}(8BRPlabw6y;SrTq7HCacQJ!P@`))+3I~lC)3K3T3q==Lx~vkUaK|Hx=lQ1~i_b8eI&!D?VO#!PDa&eYH}T)}Vch4y zifkbyLc%QY+47yeS={|4?i=V%f3LvR>>UOsydd=VL~B2wr>Yn=4rGq zws0MM`h~LmnNk67rOLVS^ZIu#LGtuwYICs zNlN5bCc3WMP<>F(3vRMeDy1HrMk?A!3tjBotygi`p|0YhXcA_R$;f|wp53xzFi z-OsU!wbK?>F$y*cZdQ6rr97G?HbDo$lYn|TugFI_3a|WizyTx0NF&g~59DCv_h!&7 zGeyt5Z`p^;Te>Yu5*I~_u!qW1x-VVQ*)Yvn9uJSH$78Lc+?gMn?(l>=HvOJSXH@DJ z%0Z%?>am6$itfax9@PtG`MD@kqy&Ig_2^h0S3O&t%Q)!_>|dU8TaA$BuQ3-^6yz65 zFbwAzYth65E-};@xwh$itow59BLzxN!5aAE4CE*{2Hm(b%cOAfQ5VG35X>dJ#J& z(Ig?sMsua{ah-YOnkfUjC~)?oFkxTNCHQ#L1{5pCvh}Ist_slFlSE-CSjw~;ViBqS zT)hHs^)Sat()DoNB6Yemwls2Blx{l(wYIh7gnflg=CibcKF}oHdPg3!xv z=M7O(;s&(tvnx{G3nFaC+HqUn#tk?p?V0J~S3}+DEgf1wY>?nCiskocgnf8r;U*dx+kVm_!3xwbPX@tv8&8_C{4&i=~PGM)AV^2CUR zrP(qKaWfQKbSo-%E(`Am?OAaRI&Eq#vM8N!o>~m6*109*as=els z=kdHOrW;9w^h2`*5uegN2a5R4Gi}*ug$dN9v&&fNfRfn-BFE@7sr+z&Y+&192(5ET zqNXE`c@2tcJd-k_Dit^_RdX$@sGi+m#Sn){&ODj85p;BDQ~lMxqU5N#)}YisNsJB5G`q)9YLY^M=d;8%CGRQ9H`mzniFi)Nb4izaB(~q0@k#wJNybnpUo=2!4ySUP zHDV3~GYqyx*`^h`0nd{#?j$o!^P=Wxb#BiCbOy)fdS6P0K`%Od6KzU@ciEzg;?Eub z6l&t5dmW+(jp48;uw92qaMPJ8HAJV4A1ixjobkuqL%0S8WPw_n;cX@nze?j>B8Rf; z*M6#Ne4Z9F{l)8wI&BMV#^Nco-ymJZZ3CVrUtnUlbSVRN7J_a>s}=}uKfS5mT1q`1 zTydv#BD0j*g*M$d?clxsv83158RHsf2HVVVhxF8~1J99l3$v4eY_GZMT;d`*_1$&H z=h1OMSZ$ZNY!|Fe+*Lp3*kkx=gNUzhKGtZJbUm|{m#0aT+$kjOZ9A(cKH*8e_0x>> z%P;2=#Wltr!xwLogYxVe5}W$(47hRE6{Uj@1M1|8$m!E0ue4-zewc5;AR(*RRH>`t zwibG0J*C`N*Zctn4n=!BZ6*?4Y)=8q*Yy@Pb z{j7=mIcbx1iYrWQJ0$3otGo(UQSCb1~x(b)-> zG2%b7*k1CuZCl;%-KB_>UW2SZ_zKL;s;jcEbJnQOm}nLxv?Hp$gcs?GJXIbeti(^e zid=f+F0ZRbn@Yk=JLOin**2*?Wa+0YtZ7X>ByO%<@;|5&<3+D<;0n*d7yo^9sXcO- z=vWo!92PepBOWx$s_k60)i1Rj*D%}~ZwDk^YqoPWtZy;)k0h_->Vjf*_s9U_)1PlM z9%IxMu&Od2eLJ2Nc+3uAfNi&%hyQ#OTf8&coB`;Y?DxMBcC@ki?p&2iOtcs z5RTaUubyy{azPK~knT>j_?1C?uyQO-4F6!N6_06ya}fTNC5|wc6{`wl>uZPLP|$@G zV&p)yfJ>sah^!SgL2OroVy0__oF|E4>sJ=WHKDP;^tkRPsgMoCW0TIzf!HYOMU6h0 zMCr0l5?>WN6YK;#XaYVADoENYiqO!fYXVhiKm0tc8)59#6upDKv@0kTYmsg==$te~ zTtpa_=9mq@C#ecZSbx_BA2E4~8G9#5!rOr7Y7C7n|xJq$hTXB6g$pX^8Zu_$;GC;bvvR-CF> z(KHWdQhyn~m=f|{!6x)Xs!Tn|71X0xhU$wMYR!o?f135 zg1zW3Xa@4b9#moQXN?2+QUz8^8RKx#Vvp=UmhaPI?ialq)Xcf`+@NOUqPo#6*3&Ol zMXL>DB3nk0IKkgo==f-O$jF;l*`QC2jI#V!U-)-Q)7efr2TwFlS=HM=b34JFqzxmU2W`QVhvSK>s;MWHZKIiL1UbQ6&0mILrD6-4lr2ADf~Jw1 z&t{s=s|*wNyER?fi@R>=(Ccx_B_AgUbUr1Xf9UX~I!1e26I~z7A&;f6OSvb&`*rEA zr{mcipRW4SEcc657I{72b0jszwacULeUf99F6CywHXa8kyVNFIbnfon@%y$a@C`$c zZec!;Pi@mkDEU!Y*2h@Ib{1@|DEKk&VB@`swtN$@V|56^~A5OtZSVK8vCz*j>r#zW3{Z<$` z$hkhSKU+jjpm)M)g!KfyIxy?O+CO!+=c8f|e+j%#PO>sDO=>eUve!bbfv{!7n~)vm z5AvWP3GXnV=?eWNN7EC^3_ccE=c0ieECYAA3hTn(8A5@`0e!Y5x~n>F(gb^?6m_9>K)vJs0v~nO2Q3>{bMvtUl+nvT;C1CA+q-p<~-(S3vrko z`T6-^mfZ3REH`(b2f49}kSe*cC`zpaxj9+^v%^JH_w+TYsGRtXE?RxT=o`f?UqolD zp)O07c%s?tAX^5ODC(N|E}9P9=nmE?Wr$`J5xG&A@MLXYEQz!)sUnPO^v zA54zph%X%gNb99kx2w@QEnKfSyZ12^VBUP9Ut+@3u>z_N;$6!N>0W?b+jU*d@S6&jgQggKPrp ztdJj(3^(+jabTPhDON7%g5sQz39`|n&F^Ig`A)~LQu#&>QE4WoG0 zZ$k*V%!Twh62G-~ZG`7QD6T#H*LU5J$Tz5laF%?8*^K9f9dw$^8RVG}6p4)3jQEwT ze@o;!GfWosuLW^CS-%p_RWT7YqK1VP=m%%CdWnG@PS^hefIxr0WfJr6BcJZ0X70n5 z``}?R{bn+8nM@5$#?Q&r?PTh9GTcug*QbzsQ>gnX*fWJZo&s-E;B5-LO@X(m@HQ2{ zr;>M5nLCyInMTe`!{%w+H>Tm|G`OFJ{AtwaG;(MN>Me)jMq08SsluSekG$Hef* z%>OYw&g0rVIG+bU^XM`2$nBpX|0ne2`S>}X+?-DxFQ6a)l>YQnYT&2T?N71)QF_Ls z*!?K^`6wJd3WtxP^D%TjMxH)~50B9!9w$bR=8x&H(;_XM$jg4jPn z?4F*@*LymlrgpZ zJaV5W_kPX&;@5Eh8+5(Ey5GXVZ{h5>*zh7;y+}WK5xFno`%A?0CG2{Mxi1m>mstNY zec)wezKqOtbf;5iGB(NNgG`S?oUl<_HsWU^el}uZ#|Jy}Gl*3NK4+5CndrzwM;1D= z(2>R5ENU)`Jj+5?7PXc|u4IubS=hUfTv0j z-y&kY2##MNZm$rJSD5oEI$os?UZu`n4<%gD23RvY#BT$zn6R&xuE<$@nzJ{GU{g;x|b8*<-~V6`LP`TmXm+WsnzB1 zwVa;49KQZc&;K*}SK!MEY+V8WAL7f0?7LR7b|t-QCBFOxE>;o$kEoZA(6gG@{*~C} zU~>*Rkptgr;Cl`Ey$1f)V8dE+do6Q5CSO0MZ+=YPtfLOsQHSfO%XR2jM;zDD13tme zPw?{-?kk_*(|Yn{1G%$-{NF&FH_%TupmzguH{#bueAv2`PU zZG_`Z^wCY^)h6WZX)iR>6e?abu)HsCcc}=i7n*X7W&2(INk!kTgaWQ z%-f2MpTfgu3XuId@;>MN&*A@bY$ar38~kiz{x;-n!{@(|(|@C%Y{!S~mBIc0f#%_Vh1_413UhK?K`evwrbc(;$8O@WhkV+D?|a~C zFFx(17WR_wd#T@j#9|+O?Zdf!AK_~a3fych0_{n)ji+}h8Yd}{FkoE{)< z1@K-#zb&Ls6vEG!@bM*f9wcuMk=uu`=`gWAOgs+5$q{Tj0zXHo`J>qM6?PxvzIu$@ zKL*EN!_U{q|C+r+5$lVXUqsxB;GziqMb!B>L z_tdN8>{V*)Ds|X`o)&Vpg*ddpPYb=P1shw?*Gdm-B{y1$dn2V#y46YF*%g*_vra5G?D1hONPf0+|;3=r2&aN21+ z_)JKV9oq1&kUG!(4*{>88@-5nT}aX7Wb_w8iWvxA7E%}Tu?xI+MQ^ufh14Cr-O(G% zd$Ie36i1%+AfJ1XEAhcX>e;mokAN&d9DBusF<>4bKN2Q_!$RtfKZ*F7SS_SJ@OTfo zoJ72n;3XMulgotEZ)qFQ-|wi9`mX}y-T>AOfZGA+7(m_)fYX8K9f-_<s_ac7?F&ILOhG5H3Vl(s!Kn@Q@|1k1@7&$wP zH6!pP1shV3m4f^fo2q)YP>8fZCsi{Av3EJWnUy)6qMf z{Jfw3aX+%|hqoETX9jgYgZ?oSKW4(;O!8qCJ#QAa%|gZl$B*aX?AO^s`VIEJz}gqE^|x^UTlBq%zL(JVGWz}x`qI%SQ}Z(Y%Z3kjY|9`Q zGT}HA8?#uu5E%>6zX<)Wp#N2TdzD`O8aeR#U;rm?V9%S_^Ctejg}-m%@7wtQHsf~~ zzr*-l{Qn)ky@!t9W8eGO_W^xoG5Niidi?`+ums=!h|E7?-%{-R6Kns3jBI2rBetA* zq~+x9pW$Z({H(y&53zS8_O8U|KSuAK~*yj8`*W&G@g_pM(8tuzwBquf_h4 z(e*L*ufzUNu>TWutw-m2?A?IQ4U9K3-pF_p_HTx(&G5YizPG^HR>oTyf6Dk%#-B0% zjPd8#$~i*%ob}sSzm4^OWBqpg&&B^Q@c-}lzXSjOf&c%&|DE{%PyFA7O}p@aH~#No z?H*+8Mb_35jC-AQne@pS#!PvpL zjBy#`lZ;O?F2~k#)|a!sg7p=wKgIgf_+LqFRZ-hj)Up%Xo%nDDKF-3&IczB72OBj4v_1#JHAmE#o@Ib@*Dx`pc}p%z8KL-K?+Y z{RZA|VEz^6Ut!$HxRG%a<0i(XU=T0 zd)8@Lr)6EbsJCaP3mv&@d8}))bJ256*KV=Yv{f-AzD+~>T$#Cuymjv1mAU@*J715!MF#pZ+GX5s)t#?s zJy+84IP+U(%}{=xH&dHpT~=KYem0?&gH*ld&Ye3z99gkqMec#mRjSK!s@N)4i`DA4elHHn;-EeD?4`Q8 zx~j8b}QuT?FlCQolDJd>4u~(|e8`gC1grf+z7xW3_3ety0%_<8MB ze*Qh?icohzK!D`FaI*BCSc5z7z4zWLKUZ6N#=ginc?QNN2$KJ=ndzj7t6nrVW~f6G z6B8F@`KdI=_LIkDVid2;f6dKzspdO%o!e(|?-O0QVm+dXY5Eq+)1`)nS8lT2x5JSm z9mLHZyn06u*wX;AcKLF5?DXl=W8HjFT3U*#<;(5q2BK9U`VyBnLJ|{&6Q-SlFH9!L zhka%YA3nURII(l*&NsXgW04q(MEjjZ`YU-au8XzbS+4)-@bJ^(R@v7%Gv3Bo1~2a{ z6IV<(-PtTT7N_z@)-DlB-s@e7F6Hh9(fV?D)v?{XcRT7Y)igEMD_y{1aXQ;!m$g?LT@6OF%}`OalScg)(UPfOvc%H~ z7sz6PJ($Q*>1tlr8d$pOYQt68H{N7Yw+GFpX=o7fN%k9K_W;(6!x}$#MdkTXNqTq1 z>eZ_c*+RcwxpL)KqP4Z9#aVr+Nf?4H7E7?+uJPmFXuI4|Yn?xnx)~^{zAWS(peg!0 z1@z(SHJLhhMbW9+rY2d_RCiVQW>_tvt^cT$rgW_xskBB}QkiU0a)j(}Nlvy3wU58a zWF(DcQ;VUrAXh|2m6eI;QJzuKx&b_Er0J z?%et0BlG6T`gtcEj_NAsn>d?ExnMMO6Q<`*kxhL2=MFp)1MHoUgG2mEVLkN&_v+iPD8IwE5B_!jcm8F5t9Shm z9_()q3RJvP-{_kf->!RRw)?g_mLkTq#X|Wh7QQ#cVun-cgLbK)ulA5hDJHuVemcGV zED#cPLq5uFlcl}|%6y$x>lJa!y6?->tywZ4&(od761sr4EXvcFMITulx|Y*JU@@?B za{vDO_cwL!J7dNS(zwyCPD&~)%#`Bd?6M)mY(BMW)vA3(vc9NZnAfc{n`OzoK$aGG zdP_*Kr?+?##KWNS3cgZxBwTl;s<6<{@2vS~#94Dwp&T@J`w9M$+c*%1r-&Yvy7NM+v%*T zIHBCJo*W_Gmg1duZQSuLSMkk}BPLUzQKRfpat-56_H@n2 zkpsK=zbgIX9~uAop78c7%FmJU5kjN(c(0VCEG-e9TcIrVyH#V6qS4Z>k+T4}R%Pj$ zYEMaj-dPcmt}!b@q~49!LC z4a;44o5q#N%GuRwUBBLH<-}mM`ZixKKP{}?qx*7xbT}O6o12Wry3(&p_HEg+#h!t6 zl)2GnP`M6%ymsx{{nfHm?Y0?Of_hD2^V#2=5nEG}oLp05GS$}Bs!Tz?KEBQF3pE@g zyL9Ois@3`U`i6wZbnD)|yFDYOUq5kLX9^1oi;N8G92XbYEha3i(N$SldFoVUc~MbO zap`IA6OE2oYF2i++RdAt&dr-sTF100i-V<;{*ne3{MtE%kcW92_pRn^A}ymQsp zP0{4hke(u%MYEjJs%h1{u1+78kT61|8+RT#;&LSk289(vL8`S z@B;=|hu?SKeU$iB(;ZCGY~GZ6CQjDI1^EVQ#f=6AEnQi5;^@(%91Vh6op-cWJ#J8v z*{(ZR!9B6faIf}(Xir9axLRHA!;Wvmh7Bb}w<*^eKHu~y$~AF%-y;#f@T9>Ji4XLaiC35e! zul)aX7WqDRx4X;7@1x;vthm#Y%3GgHj^Wx+I&0U;>YADwNqVg&Z^P!zn@?0a9B0o} z3Nlkr7=pc@a(=hVCVfClfTrQ3Z8e#Ez1ic}AhNb z0q#&$Gp8@OTvzm!oW+aXZujZ)?pD2C-(t7>dCxUbqAZu!YhL*s zyeDv@k8)0C=Gdx{YE+V~Y?vo@6h1b|jk9l_yVWC{9Q6*^1~Q%2x0F>Khdd)QFG*m-Rqp)eVmlVeUIJV|E0s3(~9X5|iQ_enZ% z;J^iKqUXt0lQt$PX`wMOQ8@PO+2at2iL#2eCaXP^{}e(a}Mo63#MI_0`p{{Wtbt_i<&SB28oL zXz|m^k$vXPo0s}|CEVzZEsf{;-xFdi%+AjKXk98>7H6$p4s3G2@d0%0IH8XG%@e7S z7F&?y_rNTC9uaA7ssHo3Z6_{d$X%(ZD_Y^m%gZ|^l-rEf>K|dMYSdff1`HUG6dx9h zv(0wdUnNG3rp9`kT<1zFbs0eoBKK2@?JJkoV9=}28~ifrFlpymtd=FNwoQ#Idn$sF%1$X9~=9joi_c@p<-9=PEls_ z_JVkNL1Gk5&2vgtc^}rO{KCRk&Y2^OL1D^w-{}hr3s;b}57?x_q`&~RGE40}7&1A) ze9{c;M_Jf^Wm}OzMdk;>&iA`&2%gUmn zl#dtKkef3_zAW12cMy=(e5o%=a5KYv#?73+%f!h7hptc6D2}D8 z9Y^=)+PwZ53q`}ZW^wLIarb`yH}@Q4h39T3bS33fRDJ!3*5^Bwe6}(tC+A2>@$s+9 zPL?Qp31uj}$LTt|9PHgoG}N3b@$4o3%4Q-54ud)?Okr^*Wtohq-l`PP@8I#gI*v488j>}*AcO;p)+)1kzH=?atzXY+ zHeIB*{mnQ_SLKQp2IUC`({(OWgK(IvOr0=6mbPs1V#0*1yML*LOn_vwtCWpPp#WwPj;;roTlG13&{aD5SD8p&HOnVXREpR3L5j_rMSh-I0! z>Br7pO7F#m4?eI<@4lO%Dsv5%b$d)vO5?S&3zay_iNb|HkVpTmjuXt4V9)0gZ3U;_ zXBp`ETtZW}q{9N`@vL5bw$|?~f6~?cM1DW{2mS0U@|xd2^fhza^BR5Vklob}Ue&Bx zn4x?Ac`@SR#SwP>WvA7zL=xS&wtv4U3kWE)U*FxNvMRbhFd!hH`pe?8Zma3km+Rks z_uaz!%XMtgUH9Mba7dEFVV6}#A=v`z&ZbOZd)QkPWh*bcZr3gmw`*6NJw2p>vmb4= zUh8gY5*_>Y?Q0dyvN6z4?{o$R8jXR0c240L0UDoU`Rwi-qSHv_W!J^V3PWtHq0Oey zD9>j{*B_qWyW9Kle61{|t1Buxb$TsBJz;{_B8x5FXH~a6LtLReLtHD=t{zGSPV`Eh zBb4to7b0QUy;G)4iLYkc-*oykJzV2Y2j@_fI^^MbR*H9hetBISQ|8W38{Natp00be zeqX2mng57Q-CX?o?``IqGRMJ#2akT;A*xH4E+_VF+_*9Kc)d+kr}fE5I8)Zp(9q20 zN?4U&!)|K0%%=Bjl_T%q!6WAz1`i$_YYk{+N|~eV#HovRS)1fK&c;83;<1@^{vFxt zcaN`9UL9kZJuo@x)mwW+q>_EoclrLJNafTnef#$pU4Js-wBPzv<4&`#-ZtyIJw5Q) zq59W$Xxr_$#p3qo4AN~+bMD?6Z^byjL+ANd&-F98@)TEww}0|ruP(m+$-`YFmrBVl zZ~KWdnXM*2_1z|)rrvd_zQL~R5Z_NJ!;J5cjQ@sR0%f&l z-TKVz>NUpS;Mz+HcfkgKfB$ne&B3PRE|*=qKl$X7T_qQTgM-hH(`Xy{H&}Do-~V#) z7hil)-Na0FQ|$@m_1R}bhjs~c<>u;hk5xNMkCdLZ%hsBUR~)=bqGF&Ypehf3PSo#8 zO6n74SNEJbd$vuq+Esc#z0ItxY3>jeRbFmk0~an1)4X!@nv8T!4Ln`2`{QqPSC|WF zId|+>RYrW(v17-o6*_AW?>U#ZzpU2d$17`fR;$%ddGrvVp*J=NpA28c5XV(hG<1c_ zYW9&GWUb3l@ad?Ag5phQC+f`F^A077HENZhUXm>eZ`{iTGKwX1x;>s66sgdya;lO#coVm*{A15CaFscJMdZeQK-ru!74_q#Hj zD=A!wvM8_c$YFCIS3YZQI<#uls>4^6@6&qn;naub&gJ;HF!;jZ!zVjIS5I*a>M9}! z4~~|_808^xl(Uw6s6AVie~<*I(Z&$W&e~?aK3aH!oZyVfozSP*CjKvT-vSoJc{Tjb zZLciLzyiAh>vGMyDCh!O3Got)wQ8(JYf@@3O^LaDdGdVE|Mh9}^!uOh-fFQBHk=O0*@d1q(d zGv__;xxMF{QF1Y@Ep>HuU#VvSKIdd|Xc!n>bW9%tXdVJ+Wv(Y1rcIk{!Q;C)awHhu zs%YpyRu?K0X1R{Hctc1Li#-PCDbJ7UR=3@vvCH;T? z^NJPOMBDrCzu!&_hWq@wc%T<;jEbif##t*?aJpP60^*Dm0f88&J{Eg+B`+;r`z46j zkQf33<$yO-R20&%EU)b!=+iYdb)n_Um*3(){zuHEzgbq7{WE0s-z&W*Tb_oN??MX^ z9O3gLqoafVFZMP!H(w48^ozsc;GIS-K^aR$6m%H%UFewbEbzA*ODD)0TLjDGIc$Q- z#KuygexSDg5RJu#C?0@8O)M%ZN(_y`z^X?DK|eY=f`-OOkiu3;8{Qs248z^0(_L)B zL!Pl5Z(FC+Pv%359VpOr@4fe8iEuTH_U+rJiR(2&1MGdaw@x4eB|-w`-H(?9h~K>a zW_7LAT6?gU3JY<1DfS`i9K^PJ{ia}bXWgRgJU0>3oG<3G%uT8AtI_qXJ zhEtJq}9hO@REa00oHvZ!pv@!z{g7CmzNp_UXqcK&I*j% zJ)=%C_f4{$616_nDtTcGB(&;Yrr{#*WhyGhpZmn8n{Ec$-34a~K8KYjL4}hNAP$nF#jCzrr zJW*A}>)Oz(uf8*t2kD(xUlqs>F`c72*mQz3Mx98r&1Q2f>h*fPC!Hm>|1)q*487D0;|Cf@Aa2cLTCDLbbdfI&L_ARP+TR8fvs3 zt{>phm&PR#X&f{BKw7bptFv0nmsns{~8Pz+l1%j>coIX3hXu zz}6TI5(Xe@raSP}ho4^(VjCOVdI$P-sWS#q)2EG%95EvDO~ z9f)`9-4d?~NW_5dOu#a{II1Mof{V#v&R$*p=4&;d?{oWcFj;jqJTW~R;GqAnMlA)( zV&5&PcK6uk&bI)Aw~?+omn`YB;651^93?*GjWk$QLD8GVXrrND((SY&n!F*+cHmpy zEcMS~sUIs;-rVlFp?!*IdkcZS0WGn*i4+RlEv376pRuIbZ``NP4PQ8XfsR3Y&>l{) zVY6v$%(OWLJ6%K(|HV=)EiK#wv#%$t0mNzqC$V}pN3C9s-sfW8_xY|OJs3uMbk!H7 zfLo*0$2;T5J(5#L*_9@CrLkffN3KSzIrRR p{Nt>PhzOuwlqXmS;un8cj?HznSP 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 literal 0 HcmV?d00001 diff --git a/local/recipes/libs/lcms2/source/doc/LittleCMS2.19 tutorial.pdf b/local/recipes/libs/lcms2/source/doc/LittleCMS2.19 tutorial.pdf new file mode 100644 index 0000000000000000000000000000000000000000..1f55a25fa7b2ef7bf2ef662c0e748cc07ba55e4b GIT binary patch literal 641284 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

  • $bgTA2L;9=5 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

    Vau@I=_n-PuU0PGwu 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

    *Y=q9c2uUmE=|{zR$8U_|9gJDMt}{JN z8tt=A6BEI$**jh}FVWA~BeM&akCw2sJEj39pEhq}(|nCJZug_hm2K&kdA)hxQ+HD9 znVbC$;^Mkp(*gi6Y57yu*xscESMeXo2o>|<$BI3BNMlE^A#Jm3X3O+u&UCrN?hNAS znk8J$`#E4lAurDrku1`leIL(-Ly=!ODycz{3zi=qt*-EU0vE)7KEY)ZnxZm|N32N9 zizfX76Wl*=bxT&pK0HNX`SFW-;=_6*<@m&Q96&h8eJL@4RW&l3Q~CjFwDuXM``p=N z3Wg6D<>e?At5_ZFh_{M7;FiYw&ln-!PbzNEOgkD~RN}EfZ_^vQ@@3hIJ~d^>Sm7J-L~%IB2VzdnsgyDq`~`>0Yi>LKu3o1pVkZfH!Uk57by4mAD)PSO&-C} zyHaRhBJ%8m074Of!YN59O;iXhBA=q%5Lg>;h0eiG$;w)_iD_o!*FwQT4hBe?YEl*Q z;AR>k(&PSaY>KK8-dSszH!>V^Tv<;@s#H*A9RQsTcx17`9u_;%!W{Vcmt!-1@LdDQ zn5gv3G6A~-A4gB2W{ze&_dY+Yk{7gqp_}jdvsBOPs}XE=&?->W3dw`4HSJd_!Wz&X z#@HF{GE93 zA38v=_5<|1@B?IAN;Z0@B#`rFP2j_=925Ej^neI>(B*v4nk6U%cfkxuNEWEDYJQ8r z`o8aBK9;i)oXdVJx%V8(wE)0CWM9bw{cnJBqe~v~#h=O-M5n}x3ijspKId!Tv)o=z z*LMVv=ygqSB+r{>zlE!PvL$)(c%pmx;hXAPq4T|ToXy}b@jY@B%h<#DNjdkbDi4xlzVKZKITc0Tt4uRWS#8}%+RX*r2O8r0gk?zP%OXii`X0OE#4SD9|{j zK-rn7H<~NHo%W(ED@+ci6}GxJh|~VPuAt|ZLpDqKnGob0Ghi#KH4ROC6 zc2Gd?-WFC>o{3F~2Jcy~dLGDcvugATkc%q>dlyZ0wN3Sj+>%xPVk8NG7FDC{;0-KC zek+!7q3y-0s;X$g+2wIC4`V=j;vU3prC)(V*S#KyGVH zW)Zff3Bv;1y=|*VGak_&R~+YE%T5PwS-~HJsVNV!#`8${B_A$+VRv$Kc67xVMXij3 zkdYof?BEBtqm(GzUcNA7mC?|laUL2HC$6;3;K}X(0J)EjUNuP+Z?zd>o%t=dTdHo^ zVv`z`^5EQ8@WNcZ7>IZHB3Bn{nmc9T(c56L*b`qP$4g8@VwYefkq%LRxT3lIUi3x! zJpHeYyW`h5v{%h33Y`g4;_Br~D(H?#J z?{Dj#=g%@)>XhxExB}U>-WO5w1tHn5Iaj>N@<Swm|=sJS5BJE=4c7X2UmDMA!L;JbDraUgEzdm`m&Li90)PY5NHOboR=IvCB z<8fxW!Ny8M;;1Vc(j+b-42Z+(1u*jpZT^;9066JLY<#VsKVA?p52%Pu4O<^@jMP>X zIsaYn>hG{AZ&6IITP#}GV`RC2HrZ;rg?>3X(?*Cfp}kJ~ES4%}a-1P<&B59D%2D%U zzn-LWjLuAdB5S#i#akO4k+eAvEaz{O7O$~IYZhY$jKfKcbf4Dw&lJ7He}GbbzZ(BT zjQRzD2GIZS_xbM;Prf|>{aTHNk6++7O_wx)mJ}zn^W7@)MHLnD9`OC7!+%c!a3WcO z>M4>3%zEW~w<`<2Z>e(nQpz@9YP^4d@D+VqeUoJPuEe<9V|m<%k4RWi){^k%`p#qf z=#x(V*=HIZ%(t7z)4z(6=&(V>BKRcDxaIF$@|%1ee|>xyVvW2mxp%4_n}ZBo>RBsm zf7=#w8?J|TTfn4m;@DT8^QN)%kN_iYjc^?2v)yWWrR2IB#Oa%+QSxl9CDJiQ4`;mKvC?IPc}|zmE6PgWK1Vqgm9q8C^+BSr zL5)4KdP?0MCl$H(=r`SWZrZ%9o?wqC-e_f~?B85&s8#w5^%xrZW<(yI6a&iOxu%{g zS?(`_iTk=w_i4v(^a@#3ywHe7cO%R4AUR0E-r}*HGg(LymKB2W+VpnTu;XpWx2Lks z>FmG0r$X&h+C<-zU1#4#A0MjZR{VQ-i2#Yw$nf3K)ko_L=ggi|&z)JTzol;-_=8fl z*LE7#V|m$c#iWt8BH8_xL$zBo0ID=YpVJ25P(Y*^mTbBW7S>f@qzetWUj(T7;13;t z^<)}O0M2oF)>6+iMxA}-^+RV_=9}6^)?jo`lr34FhSrvhQIf;hL-q% znq~VW`+P;=?3>uEAXWrUDg+FH1MJ>Hv%|0Qz$(J|$n;Bndh`9@>|L?bu;{Hl=xZhu zaxByOEU0`3?h^1cGTXb0p>O$Ea&w(A?`g<2AkO7YqIvS_0e*IYe*2~obH^n z=EY#$Ikg%!eCcu01kJJcrgJ2*-5iVnprX<8BVK6uP=dX3S%LTnpFN@bxqE-bSA5jb zXWX=40n)3M7h8NcxTw^v?!5qvDek&R{3K-60*rRFtvdJy@_r4Q9OvTkmpM?vRKFDJ zVaOtOVlsRf-CY1#PT0CFHbeWO>H6hQ*uf8zc2#Va?SN!-C`qN}nKcF)h{vn>XK27CP)3 zjej$0+PX2h9W(Wim)r1QHNN{FdhAc!KYU|s7<2AQi|Ev*nYL;(aWhTv;%Z6@iO+W< zZ65%R6U#e6zJ~<#U(Woas*w0?&sX{YZ^IeJ)e|3k03fqx`vy4%;2-(smWa}^Xn!QA zm#AyjwMiR~??%P|cw2GC)LGOrog2>;zucR@c9;lPXNoP1n*2GENrNz0v6NvLfF99# z(c0DEKB5Su+U$Q1=U7ww{nH^7Cy3Hy6m_F0xh*p*neRJRvV>)(Pq)rz0*yU_aNs?& zv9h*h`zl_i1biwZ@W=wIML4jT;IkS}9%g*D92Rt=o?!{vQhk$1|Hd$6JxqfL(C`1i z_SCY*){ZfannQFu9bLd9CvrbPhG#jCh|K`gAfXxnbiWITqZW!4#Fdm07Y1m-$t7SIxnbmbA0!K3)Ya{kN)qF`y`F1QDK9dl&lnCE z6BtXdTu_SQPh((D<1kpD=9}w2!ZiVoLao6f*9cP86jYRb)1dhW;il^-SL#r1YxIvZg#ou;X_&}bps&|*iZ+#QCiLrO^qmrUlJR`^+i z+W3lzR7;EWC`F1^1wQubTB1VxD6znna%f$wVc4=)_Y3p0cNJ5l>N4=H6A_~`3Lw!Q z8=7K(X%DpE;0Un*ewLVe#@LTld`E)`s~h9Hdd$Pnpm!y7X?i&><3Qd8=nmn)7i~Z- zfkFnzgpvL*hW>~;REU>REKjxn{X5GGxMQCcnA`WHwmX-%eiNabyeXIFhJ$UON&d^+ z69oroA6n%8(-p{zpaK2=^aB1LWm!!BhlEMg+{($=fnL-~-^p0m*wEI*2dOg-y9M6RfZh&YfAQ(e3HDJD9+9Pd@08998FQxb>AETdVVV+uy=$_?p11 z+3xnb>tJ^v6HdNZ+vrH42Wy-#HBd>H5|Gc6Hknx4fHZrV%9&Ve_G2{F^r+a}V5isp zWXPfYHhq59)#-MFC;9%Ez~uklU#y;sOb=6lW}Ky%K?6!m+wA`d!e}6ovNno4GEqt8 zNjR!pR5vyeGFg@z>7f5yU6nDjD4}Vlt||^51N$>YwPDQ~O;+GkT+8e<8%XB2iX57_ zhO$g1$?4hgtzUhQ@BiH$)-(k`^X+Zf-S~QncygABD+Yo1e54!fTN{zn$`x8ewQ!TX zS~OSRx^+t5&N(z`t~%Yd`X<_KJXYU6dKvP^sdyoV2|aw4%NnVjvJI6cLZhM0E9KPx!s^rcIa=PaxY&O$ z?%qe&2CoUBeTjh5_@vbe>yQ^fX@oQxNT9MG^``EgOhaTsqwDuOv4B+M~@z zO$R~<-o+8FxcMWt+lJ6p=;u07laP=^w6`GwGB5uXDI6#}rOXrKw#l{^J9lp;k2el# z^B2CkHTf}gj&UU5#x78-+^3L_+6Z1L3>5GAdvr@dvHTT!uYc`AZbP30ArZ`NxDGVA z%*%HdnO2qOow<=r+-$I9$*FZYXu9zot@`dps+MQ3A8Eeh`OH%-)FB&rFku0R0z!nK zy5&V+t^)NGtKV8z`qE%WFU}zoD2Fwk=JQ9(amvwX*0j20Xpx_Y)ltwirgfG%r)X#Q zN&jH2%T_)@Xd0J?iRi1(Op=#Fl|i`+{xEpE$!%Wk7`QnA*bNQgG|X-Qb( zdaLsLRQS~la=o`Cqep#oCb{Gsbrpkcf!E46?d1JN%?{42H;}s#phEI>OcwL$iU0kKtZvPNUA!R@1;#Qq~q<7`iu}v-5IJUQR{W!RP zK6ri%9JK*6f|n!I8-%TbP7;3`?Ta{jz~#0Wk}-eA6=);57DuOk8++0@J67@b!fC-G z2j@*J{Kg64z)!XN2#?!4etlnhG76E)yRQ@-H5gy0rpj8I3$w}bugsu@Vf;zv;KPkF zX@WJaH427W3Zt?=(yXt?Xw~`pcdzJhr;2Hy-8LS+tW0f6ga;3YemlSRTfNePMvXttT;R11z9Q^$O^A~v z;-CJC{zFxtxfWSi^ry(2O{mIxfdGqbT>MNC;ay>4?hKoR(KQk=HggXHhNRI!TSi2j z-7oO2j+l0RAx9sQEaO&D3t}#?v4Zl&YxM#$HOO#-toWz_R_K1vRpoJH>wF0o-l(WY zNUTrWh~KjmYv`W!aV@k*NnqrfEj&y)h>1ZcW*l&Cts8rfthi70E!|0$GO*lS)>YmV zbi`s&tm^u~hozz_(fv`sBg=@XTdeaEMweDL$0&|}bd1c-aXkf0`#?O@BVkhL-5p5O z%^FEDqawGOP_4jZPbc=7#91j5K>nar-|>*#+gH zfIPGMp&xTCIh=tSgTja0EVBlv#4M}WD5>(F_0>OaLm%?fjyuB6i*7<{!OgAw>EfSLu>#4F$;`VnsaO+#z)v2?I=Q|m zIbfFib^C#RfBna7aLdM$^hMT1VMKq35N_CU?g52iVs3 zpkB4*J6B8Fj9h?~@`KwCiTs~VMS4A!b`8KhYpo!O+9ZC{sWxgRg zThX47M&W{J)>_1nuV~8+=zflVu0AaGr*!zHv|55(?Js0wMn1QhBx91zs&Fv@jg1k$ z5L6~`@^(Cn$0fEqX`Od6ZKWBeg4TI)ZQViK0MlEpp*7hI0ZYPB`*jQ%aqk?6J8bX{jE zRxGzNw^uf4PvEw`Pc!qBt=@gcaKn+%Fh~#+(y>_nm61@56rbn_Q=Lh#%%+7k{^g1-`f`^jy zuCs7lIK;UK-MzBYg*h6JfvYw|`g3n<9ED6H5C!W@rg-4G5E($^y<^}R8TWMeZfYV5 zH`pQ@4jAB^&pq(V>|{wXQ%hI8!Al!|j+bBJSWMU-nd_p+F{}5$-J#juiX|e(fc|7O z^8@RHlpb#W#&$2a&k|wPttx1!G*{z(sX${a4{CR&a+_s3UH2*D)i}-?00TE#VIy~d z%w~YEFboPjrQor>7%YncuPT6HuvwF(&G(|pqH=(1+}jLOTab$$V@LG}b&NpXMJ_Dx zCF$$mV`2oORZ@9^M=`4WB^=}G_V0J(+@LKI8e|&F-mS!ev#*Xt6^E+$$TqKh<>cIJu5-WysWbd^Y0w#dV4mg4p6E`UxDJVvN|d z`-*DBBgz!*3xinRuE&AooRfublA#^JQQuF{%3S>Viz>>tqgecw6jK*yEp&NIBVn;0 z@*x=P1}+}R=EdVo)bHFvb!?_gEen{v3J^jF)toUuXK1{NdN@l^S~+QUoE&k=seH^# zbBW~@wDp_O(t+{)CkuY1y->U8+{B$J{oAEn)D3rD{!c8wZbiME}8AslRxP_cHZ=KMRt}8fLy8|9JrWIdgj}-k0 zDPdgUZA{2I%s26;u{j7#8`3=s?^1D-^$Z#^8ag)9o zVLZ}6Ig34G!eld6D`+-btFJafoQi!eXK@m~uUf%uhqvhN(P3W$sNNEShb&6vl@XTj z9Lya`hRVnRHCWp+{*y{K2BUg)FC={dX(oS_i-^?Gc?S6^uSpITW!5aWu;&m!kueTc z#gKLaIXu3DFO1VfbG21|5$%#`hdIZ2K8J*iHcIP7r0LoiZQPtP`b#f0xyC9scAM4o zfiHDYYo*aS{1H-*_xLw}K{u=;V)am{FUSUeo6DWq z=u}@~v^H;=*X%h#*k8(zz84~Zo=p{WGLu_wP#{PJ&-%>oQ|Hx=NtQ^^C1!F}OPV7N zEiKWIS-MR6FK;(7n`VA^qk%8ExdJ$U$@edtLoF>SrC&xML8$ zGt=BkYwBwSIyahE7VOa+Tkc3?X)Esjs9Q7OH+OTx3L0(PYwG_py~Z*bkUC2eE3;bl z6CPMN+eo0FTgr{eLN3t<4G!R8DT;Cx9T@-dX!e1hXS&S&K?Uv5Mr@NSTPP+v0ebVZ zqfYm|O(O>7p^`q@sr0A(iu3;Y|TO9$e@-wCb&QGhiA@Klpb*tVnA zT!g2E0!FQOR*!RZG%8cvwgzQgOV^E3bb<=XeM2p-IxR=1YsnA7`FTHEVoES$lFgyx0~rI%n39KrYP4R% zV6u|F!cP4cWG^i$ybk{zFu@;r@^|pm2qXCh-NlX@+YgdfH=}?A*mIHB<#^K^1v0Kw zq4ZVZ64UT-Swgx2*UaB3P`cdq!Ma5fO>pSo_{o6ICJLQ*QSw+>g4?v-2sXXr*Zk7a zgB6&BKaBRe6*QhFXEVLugiU_Yk&->FZBC;S6S#{Dwc|wtx_e<9xJctTObB4Qj#P?Q z-`mYXTM?~z)EEzZ33o^uvoKOet%pq7xN|S=BnQWlv=Ke-du2J>tZ=68E(EpAL_mlI zYRB>;kr;G)!0Qbx=N2Jj^nCO!ajs7>6!-*2z7rD|Ah0(Pp4zY#L{p3g!dCNjznX{V zq4kW2xJAEu88$XST}o7p@e9~k7@eb|Mz}0!IOzd_aM&?IU)4#g$v&A zqGB9gwp{Ky#^?tu)Ta=|H4SNWYDEGe17-Fr-=(x}NA`b_xan4?Bi6rXdOg4H=BT@c z-%}(IlgCZG=@Xd)WWGV6D6QDq9r^C#A*56<<}a4_f;|nqH7CysCcf4JVdGJf2I9br zz9C`T6Xp8Emd1>#y$g(HtQ@>&wr2GV@efF>H?0g{#JfyB*IddC=oKT0f5ZAZS|5nr zt3x&yOnH`!f}07ROC@^SCjPWf1on%F2eqG!Mq;YrET--l5X&cFabC(ic72F~%xV_a zvlcB6QS)TvHJYeeSRJ8S zQ*{D$8mJQDw#N=CI_IaT&7%BP6F>>YJ%B&It&ePx%G)jkq1J#t)4S%hlTvc^+P|K; z7DaB#jpFU@8DMENI?$8M2&G-&ctZp2RJ|r1H$mnHMQ$uB&){&whK!|HoINQVuEetK zW5L5tlhf&Ecq6HUpk%~qR9N4xRX!1)KZ0wdc02C9Hn}{wyg3)s_!sR{~?c_ zt|M2mi;pIL27ZZXf?Afw(u*jm?Q4ndekVdJFk}C5{vlPc%;xGBZXN}+Hm~NADZ4uN zZ}`8X)IN6PttdvC_@BEUyG%WZ%~1m^Lc&YgcS`&Hp9(2|a%dcKAh@g7z2-_%MCvbf z>%?y=?!9SC7Q}4CL(0rSsK@tjXN#z<@ub;($HkemhL1PrT^aa0^NK${h z<0HjEi6APV(y7JfuIdakp@O!sNhqNlyIK+1?Ltg>5@h_@QR0serS-=a4Xf9&f=~^Q z5jGI~!oAvipal<`miSQexgXuGQYGK6Sq|$5kqvzm62{=~zLVOxT*BPRII`qojho+g zeK=c`o9ifN1T&-VH05nCekOf`M{{2`Ejzfk+|7UBmvNV+7E`puDuu3@%je1qF1b^e zy4%429*;iS0GB`Sm!Q-7lrv93{t1&r!AQg1 z`3qGvBQY^Gnvn-F4o@v%#?3Qd^3z%Nu6aEX!FZPa3Ci4w^7aQPiF0@Qf3Top{$F98 zEX?do|1Yc)*V6Hz_3C5#(sx$ujZ8%(Zn2>2PRiAD!^ZTZ)9HFZo1Y^3{?w*2)A)pK z;mnsF-)pQsaZ_}AaxhsW6bKjz3|Nl8$0v!5@>`iWVxA&oCVxEN`r&;EaYr~~rDi*` z$LA@-Rh?8gzWns_{D~Ua&YUz~fgHpJU6R}#J8K7clc0yb-~!=2vieNb*yro+se<6Z z?C$3DbEZbu8L^g3 zj#zw%TIx&t-&}>`-NAV#vggxJ4zQb=+{4(e$2dVzAw=^o7&=&)|%?tEIoxm+F* z-Qsc~pd}|>X|;a9({8^a8xMQE7)AdkBhedq`84RUsb{ZS$}8XDK^Jd$YXB7a2Js2H*jK5~JN}qm|6&@$eT{Uh#(eXmXpk{3;-rzfD66uAU{t6yS_+>m%Um?*DkI znu}ou1&^t|fUiL15qw{0`UE?(2v8dvz4;`Gtg?@(gFsIXz0zS1vBl31_Kolk|i0)e2fm_8sB$FDHdsx=v$^u!My-C0yMP>PdUxwnSRGY}x^vTEf0#?qphK*aaiT;eMtKmr)Gs_yahP`@v!`8dN zSmcBiR-eMYiS1}Xg7JwrewRI<(Cu{i9*M`7Rx*3t)xLL#4K;Z28SF*+MGoIz%V}*# zg%$UyLJanp0-5Y;X=&jp%aX?N#RQJ%zS{Xl0tI6gx!l{{6LX%LFj#m|mOo>3=Gz^H z87jK9^Xx}Xbc~ih3QNV++~Oq2yV-QA zvQ*=CpSo0-sFZTB&+OC@K#uJ75?4-7)D3t;DTJ$@g(BXQnmNIix6mv7#4()E$7C57 z)+k87vIdPXWG`@}q)sZ-HFR6{q6~WeK$`0y)Cl{)a1f(=hLqRd@VJp)_x=kUPq(>a zBDfjWVswef^X?tDW!kF!8)r)Fpx1ag>gkriT`_VY!!{Nf)({`U9FzDnRAqWz+A|fq z<%0@&35(m5rIM{l-R~=5)cxqIaUZC*JKl?*P(&^pWzBt|FR} z!&-dO0_s{4S+`|b_cGdApf?ZunrxSBNJ4IQMdr{CQCO4wCSbY~Z`3Ji)W9lm_;>w= zv4(3T&A6D+^@CojxdKqcM`V74&7J5G-!)YB&0V>dfVtpx$MU_c%!q=G zsjbq_HsAuLCoZSyuxPREo5|`UA#w#oHNiec>~uDj(-A_QLo(n=wREt&siwP>IA2o z2~bU0Kf-_^dwF0Q7wDyFC=|*dNou&Dyz`MoJOh|Nc;oNBS<*nVim~4La6T;gGK>X} zZ5*jtZM$o%7b`pVI=)!q((IVnw;jwFDGddP7Kcpv2G%5@!5gJ9c)pwt-~L$UH)MTbMFMtJU^@~KZ6cL^n$d$5L@@|6$zl6I!e zmLB1SeeLo0&Bg0$pBZtpl%(2_~cq`(Y6Yw%;7|;d#%(N zw$bdHya4y~^7NnR3-;$AVO=6sx<>qNSNPjl%RltmH7wIsfY>V1`8{21?}2#WSnH_f z&|kmSUEs9^VJnBo%`!%tAG&Srqp_>?h3Ce4ma>rmoM9A~kNHlTp~HiyHeM;mi~TFg z;i{4j6iKO!GPPSqB8dWT6%L-=REbKRw4LjBOW~mSVc}9Lgg%|P6K&TLVKW|ZIhpid zWA1ylf_Y_S_(8+GT2_Kx*xd4xszsK>1K_YVjWW5>WII^Bs97Soy>yUw=OTMlu7on- z(Hf+31rGY)(CLjJE-96j3s#+-4yWS3{&_2bXL~vZaJu(YXYu<(S@aIM_UHu3w9Ffyt-gYBiZmt2ej5aQ6_Yc^z^1+ZNGIp zfuoc*$=|l|+V)#HWAEV0?Yg46ImNz$Hg=O{io4u{xr@ogJ`Apmy>V7_R`~L|6dAm) zz;)YTnp|bXaG6^T!c~8=Y=?&LKTY+#>YP$_Rk%X%t8AMi30@l%3BBix+*|*qZ`9gJ z{;Xgn)1xNy7;q@W9lj}&e!g0#TR{JKG@-%xl(tYuy?}jU-Zp6LZ9Ps|Q0{$19p0dQ zf@RelGdobt$;RXSJT7=`%7f#FxFfj!L$yWQb%XrrrBr8tomHL>rX4MNys}8^YkIZe zYfc1*P|7)+h&cHr>u+y)x=voXhbHAat{)c1vzCY|5--Df_mi=O%NKMvw67l=6*1Bz z8)^zuOpk9zSj4l0LA{jv!b?=sd!FRs5y1-I&x7RG!3nH%epVWHMiGj0WX^>a9poTi zP>{hY_HvkPgEM~jFOa9b$Z_gGvmH8C_ZK}*)PWKD?IHDGL_H6`3eJ*If|T`=C62im@eobzMrpwp5Xm z8%Vh5TveC=?$X!wb6(vNJlCY=#%Ap-XUU26JGN~lC3))_QE4;#6cJMEbDLMEY}#&! z4p9)F6!`%jU;83;0)M3{0n(9dC%Et`liz_E7az}JYR*gbxZz4`zTQG`xnn$6B^=2& z=w2+BtF|1)-njH7g{{|6_Qdde4*b|WX4);|3KQQCYUu_4*45YmN%TwUt3=Mu(xb79qwl5xnK}j*X0nu-G)U|-&rKyC~fosL%uwM zipMxrf4M5J?ipR!eTme@Y`~juAHIAI1r1qs7ix|CLi)gx!{87DoUdF$>WmE0kz05t%wUq)RjZi4wVEyy*?FkZ(v28? zTM^NH6nRbPKtB)ZORK0QL@kGeZ*X1vPgDeiTQ@IusluH0;ovLT6I3I6j~#S%@_XfZ zkVgjiGpNS5FuE}B0>|u;y2u|YGgX#UbezImW$1EO{t_b}Z7=Przt%ea=jqK4bLgC`P&xC8DCy%s|I8_UQS`ejjykUuq2kmyVz zuRrcNoLE-gjK(M(&KOmubUO2N@pqN=FO3Rrs`8nSlMrA1jdMgv^zFsikuLkOt1k7` zlZxsI@a$tQzRbQgLzDN*-xDKsGwKvG=o2G%gtDeIV>JwRcDM_XL)%OVSRh=yC%1T- zhHePDb^+@ewtXY8O2gb-yK1xQhu4#MHsl?Kn7r>-2pPI8HpiYfOVhV@!M)o{omu`X zSM=Fe4hGGzS*L!Eenb~M(n--iJ;sWGu-pIjn|{tYG^e>zG%;vdUz4~Mw3goW|B+(B7ZENWs)5%|Z*_W=BTq(`HwS zz5JqP8|hwCtxnWL*s*KuFy91$xo|ik)?F@ovL&jm19~Y2?l8|S#i+VSLxkA1gt(-N zS@EW4VUAg2&wAXJ5iqqfi*vP=J8NTk?t({z?>Y+7onO3D!T#k*esc@qE@0V`VC_%F zHT!B7%8y0Pvh!gV?0baC$@UbcL#KE=CMWf>v8>#7clWL75i~K%jby?@LG3_O$}h82 z`Ii+h%NHU22lP&C3HW~iSXlm701Fe_|A$PLVQss~hBC7A>(+I)LsFy)l`<^gY(!a&l``VRFy$d6@^ zRJd^8OmWiKm4)xkOHRVYS652JS65G0QW%oE{O^c|FJ9nwV&t%DN8pt7^64ZQ4AorE z7kP5bU#HA%xw2JXk2bzHF)U->88qK*JueU*pDW+nx`GQTiLp|r3Zc;QaVfiUI+!p% zY)RraeNMC)ouvuIbPi>x+DFz|P-zwEHatIV7r&hIiM7k*N|Z(V{ro7^D_oSn8J3Kb zQrws~<>XVrM8)*v;z6-8W|`D8zvGe}&~ihttCe&v%m)hA7@pfHS)a=#535o`#Udl` z{x-UIpd(49oY90yCfY^AOh(034KY>B&*(BIRmVTMyT}DR1yFT$PY5UJ7(*Jjw|DVO z37c2<06$qT_wt*m@0e7zeNt5{0IJmeDR1V@o7O~YohH7Ko2d95Im+@*Gt?q%~VAvtKve;x>bV&9e=vC5qjTHZO~%9!XcP8gKVwb*C$p}xrprebevSdwfWit(_y z`dRlkEFNA)m?;9sHFLVeBK6oAln-P&EKiYCdu?Ay#?Fbm0_|;>h~8xzBeyH{-3N;j z5+^LRbU!jqTbk5O_6}IX&(_DaHTz}bZ0MNfOI9#vztP)u=7t=VwzUVE6x*Srs_zWr zDdV!~?A^s!pZ;vq_zEPjkeShrXwuCt4~2j7)UxZQ1>s*(TpXqRhN>RBp66`o`*7{l z*n8Gv4=1g_vCt?u-bcYDX5H#M4-mX3NJ}(Fh$l}KTCE{>2r5Pzb|SP$4d&)nd{l=& zfqCw4+5)ydFmZQ&U~PDKj7XaSmG2X$a<|epQW2Vl794*=IN6s7&k#yU*S_;QFVvA`pfLTo8J1B zjxx~BGJ%eM*2Bi+^KSVZgbsRVG>33-Hh(x6Lzkf_%z&WrGri%he)x8C4=z)lzxC5s zU=M_Eyl+2vujgFh&f^TD+s7|oow$I#wJ?^Q<uZFjaLTV1{IrkR19)#8-(b&f zT^9-~J0o z+xe0!62%LO=`S@pfWRHTvy4Tm~gQjwh zaw?>jWf?g&42bHvIWxF7F{*xC)C0l#3b_Y>zZc)mhPyf&f7yS#@xg#MHO&l>hl*?+ zzR$raL-S?G{Gx(wVLC$b9GfT}G(=dM2OfDnze8;!ZgL6Qb8PJo)GdET{yS2}Xt)GV zJvTcGI5(xHKoPs=}$Gv^8{@IC$Eb*2?!K8QsNY8AE%S7 zJ(F}6i)P2>-?8b@vRhx$8|T_V*i4j@p)KnZ`Qu4gZgOb*-QhN9WR*iMN+C8}z;A6; zXOoXvxmngzgfYsfVx$$YDA3f=8I~BsEg?6wUVOL5oWwYBmaKbF6Pb1BM$rl2X}{b_ zJ6oq34DBPZ+9vp?6ojX6MYg_t!o~aK4tZ{w3=H}h_QBvtyvb=uobg7WDqxvFWOeN$ zaZ!orcjxE06JOQSPGV=NQY`w3lF<#RM`6fe>zVG&KC|WrF4a_sMX&GW>MG@!M^j`;l_vyjq7+! zpdntIB%0s45er0vBc2AOCnm#yBbMnUoOkUfCMKSNSJOs9ro4Uv3r^A5eF6Vg^mqS; za{H`$3goAuBEJ6jF9BR0ut86Gzy|YC02>VU8q*Dy{AN!&rSe0$96C5Y@BQ` zG!FxuAK~ss%)EIWu)m(j6jvg(jr2lA-pKOnnDRy5Tf<4uopi!~w}z9Sg(q&@j*u=e zikoxJ;{K^q9R`Zw(k!b$VW?pE8(+#F1Q-|Nf&QHw)h51g@iXJ0R^@>T_?u7U5Dh0>`pN!z!QdYpv*ss*$gjsQ zrc-(RMwc|c;n44jL5-*U(@;;SLK4%6S>f(Nqk>H0N;$FoQ=HZ}zI8J+PVuSsgzr{2 z@Auw=$)I*t`rcy$){Vp>&Y7zhPpyLmRzdlpimP6$GdIC=!@rx7H!`>?=H>Pgb&lsn zf=j=Lm!tDFpe$5F6UkR=!bPtv_{Qpx{d)rILeZT)U%s7ClO#ujUXvMKy_Fc^1|@}; zlVJ*1i_6JD4-M|WmH_$7L4(sEMUHle{Asxz>5vrxmeJ1ktudaN=Am;^Mz%|7Xf1n|D~yU|ZP`GT{X zP(U3Tn8vojR&!oT(fUbyYmEtD5@r=lKJAW7iepWC(0Ash{bT4zMP=wv+kx(g5M&aO zA3pa_RKD`2@HBU&8CWQZDdqJNL;Od7t8eG$l!f~dQRzNCUO#QjyGH|?T!#+!-v>1N zMROAY$!x7rOPs%Zul%5w=7K=85!_u3Q5yF|u^x7@E_B)VGa7?Rd z$1Qf@h_>s?hFq$z-y%Nx|>W z6mS5Ih)uOhL^gEomg>D^VIt#u_I6_9`x+gY@Lv$83$~{ckN*Ls7?_LyA8J_E|5Xjk z!pOn#{~Qu7X0@`Y^tv_{uHWW>Hq;1*h-rDhG z40J;c+x1!BZ6`M=hK{5eZC!ULUL|8V0j4+p)% zo=szK=}9fdB*hT=v)vZ+fiXrb;w}$&Yj?zG(pZ8g2icyfy%!@todh_};N!}`XD^h$ z*S5|o)Vt%!Ji9^5xvEC_`qvsEp`!DeUS|E~Dj^}hm_AdI8HR)m#GKXFns|p=RrQDk zOTf-w5~4&nwqDHGM)bWYqs*94hifj9d>~%h(xk??jAhOCsb-yBZGzi!k@*;%)<|^4 zw*$;?J<~&VWV1k8E^(&Rp}P6~1e~bgxQ07@HmdK2_6)DkYTyl6APcVa%4*=zfI13; zDFL7uqr13zm`m)ijSha2MDC``?(T>x=ylMTIm5=4MxAXNiRl1Ri3dl$@W&_ z6($0QcBxvHi*$tC=~X2OjCDZMpAXs z@=`?IV6mcM|32a-zMEL72>j*5dq7*xxCAj{GHfT>Z=rw$SielrKqytsN`*!LUyQwD zlqk)THQcuQv~AnAZS%Bk+qP}nr)}G|-KXuZpL=Is%zEcr^RFs0vod05)ml|iJ9n5@ zOD4`4nK;pJHr1^h;xrbNNyu%x*Z^WA48l)NJ=WuiPwb8+_ zZphi5U6}t%DunSHF7yRPc!FX2KyPWyEPPe{RsYQ9e4xBT z#J``x2w8gre5S`4em%rojhNQzG>O8cx-*mUxts2Tp83HEXy*><=6y@1Kz<$a&&L2U zD<}E5KwJ*>Ig+t#%($#r(yF(uC_`1j^s%^yyT}1Nsavw3eq{$p4_9enANqWaIkgK9E6NZ&~!rk^d>Z+U!QjmO4EzE<#Bo{2yJC^Lc?c>te zXsyobj-kS&>cQfp%vhMowvL$*ZQ6dZG)QT8UzPbsjxMGcrap6sDRZb zL4aH>(WLulRq3Ir1a8g;Me4vWbI}3m)5Ij!t_}edD5e~;;bJU!p`zjZy+ zM9{^V5t+|Judiushb~qT>t!o5yC+#`8`PvW*}t0rFtyj?`22uRq2lI_WF>o~>$=$x z^$iqn7hSe!;`LHj4z3lqRsFL%=FIFwF{OcYb1}#Ox_Yz=U$R)?l51=~+AyT$(e5|w zn_cL$295ePDmsW+8{ZS35koF~1NK!!{8|UEn+OYv_da@MY6HsN7_ z(ToUA0iEEIJzr!`)`^gmQibJmfoNZ$?6Y@MY_J)wUw~kOrS4$-gM0^FD3Df0ijN5*AEPpr9!H~I?N>&+js*T^Nta>*NbLc(`2oS>SJwtgU`ssuM5<({(CQ+L7K*a6eI zYtEvH6vI>&TwQ^qEWswwlBD`l|#=&sPQHQjR{{*p(4RRzZHM*~!#TK1N zw-u{c3T<{e-?~Jt@mwzvAWzrIjj(zn%4l9SDMt>Z|Bvcag~`5CFl+=c(rFg9)@HcDqnAF z;46ps)<|-;sXan$3iaU*bqu>H#h*?4I>-X}pOCrqX#qt`gM+l0g2dyoHaalZg*Le` z8vK*0L;WJziRL1Emd#6)Huze|9%|*$2-LEf7hR6#h1Jyc1eK{2CQ3L=@IAuGrP3^9 zoE`ljW(u=JJrd~v`Z`nO11KwD`#VKlj+H(tkrmM#X(Lo6>R)l8VYjf^;W8M~DxbV> zQGL&osMyLprY+a`W)cxHLpOB5!w1^+#8*iB87+n>XWRiZ+<`ON<{rC=$J8P`#2gd) z#5A-0AAz!7vfUhk?jw#2$xy>O{LxnrMd3A*2gOS~P*4syjD`(tRh)v|u4ysXHuA{d z-c^g3()JMPjB_)Kfqh?d5qQFsAXS{mWhkTijBkEna}!QXNQzMe^${9m^Sk~80+b^X z_njPzCdx5nfgt_DH=Lu=%+vWP4ZiuED zqGWW0&%mPx57z9Rkkf8>Y&W7x;=5vOQckF)jnE)pA0mKy!Dr>m9Pmt9mF$yu0$y+* zU(s1QUi9cIf=0U(Z)@A@k}zN}n-&mtZug&H(y&M%+F>Oz?8$Y~*D&^!zumu<@M$My zsP?TYJO6S&arUF8_G(XGu)$!=`Ovnu^|UvEP3JW(Av_vj?hB z==P-pp@M;64i3Cs0BWXX+T=}@Pe#K<5i%JvJo& zRk;I&7CK{sXvLMquo8@^-HcX-gUBiR(C9-uEL`bs%Q+gAS(24_$I6}Db$~714mu4sKWm3 zA_l!+%7dG=C%*hw!X_9}8AtTo+H8&|Cem9C z)HyHXWsD~Idvfq9a%!+|w;G3#{e{2# zEJM*EMeK23kuJeha2>A^a+&p3PtJ_mC> zGwYA0I&kBCB5ZF?5cMj!BV6obe$Ot%DP5+|S;F?j)HOTYxYl6{w0?dNwRHEZA3U&Z z-#J+2+zl31=57+@yarbedhrvZfFou%S_kDO&k}PMXTZw%(r0DSGfX-6WVJ*q6-^`5 zde1JH7&N96$mmaW?rb`;RQGMh-85{5WsQPBgC^!!^JI zU_XSd1qBc)`Bm-7)6hiyix<{gpdA7A^|I zl*7-TeSdO*7+D*2T>I0wNP!(y2@9ZMiWoI(YyOlh9mFwMV0-0WQ#CXdw6AbO+dRs; zU`FaX^{#7M7@ncxxSEZDF{tmqH0Gb6Bs@`R=h1h(DS3j&!JJSCt2+@tl8g7?_pA?? zv9P7nCN)L}!;!@P$Q0K4ScWD@cr{X=%J&n4 z$O$3I)=bz3fZ>)naASDdfz>oPLqC5`d#M}{2*j0i%UyIfbmj*N$J?cZ;n*%dIrJ(T zMjb8UZf83if;A3S9y>PTpp*(j(Z_v$SX=XfVP*sVUfaQ;2QxqCS9X$jQR81^@cfu- z27m(x)+tcPG~k7`4XYZ>QpCc2;JMGN%8rRgI#ol&F*~QE+SB;mNqOq4q%UttDRpD# z7~g{v)yh7$gH%Sz9WzhWZ#~ry(7ZwI<=aaw$n4x07tRs?qo3UC`xM8c@Qr=k1z$Ok z-C8JC-n9vH`fWVzw9a=h_7Q{Hqp6?f8cUe>HyyL9P#^xvwymP3cR*!8%3$jyio*#j z_XZwaFRaAIOYq?SU`yE<^oyvy)WXwXyZTB6%6#Vb2>R{q8M)43LD?mzv;V}-}l1{!n$eCqRQK;3oDWx{Dxn#sGp{gS`vlB z1QX^QIVR^iBg^_fHG%1ej50_TS&10f4<9dEuOPB;N>d2gq6T0V)npx&`-tpFc9OZ< z%`FWm>3|h%$Z3w4ceZq7q2sulvX;&3>-D?nf;6pfsSP~Tj+kS_%HO7J3mr6%CeMbK zs`qf)2i=IPTsdrK;zHHx{AgsYnvHHTrOvw=+29wwUiWoUkZa!5cb2{P+-cQ7E$z9m z;^Jt~6X2eWVcW1rI3mR4IdVo{I4xbfJ35@u2+M;ZxK)0(c zlRI?3T3B&`qo=9MFK?z30+^lgNgYB-jI_`_Gx%Zdzlg`pyDV2RtHNPY(kH$E)Pnyql7@1Zq*o=?)04fER+59PSmm1VRfu&@?p#U_sKI}SDhi_NVu$gzv$?2 zyCo28F(&UyZxq)b)1iI}*757X!#koL@ePTjo`HJN!i=xZI4Jb>N~Vd4-S+0@<@{7N z%4*a$#;c8qW$!)0n4z3vXHJ%EEEwnY0c*SARbG3<+)me7$hLRg!NL1v9V_`B=lyzo zIi)xg=kCDHh>nOLGNRC<>ll@@)yiykOU8w%h(E%Rz)j zdo{G<_W7bD_!~$(K1yl_Om5P~qKyD5d>3sai@g#B!jG9jl}=6R0P-C)?Cs?$=|UnI zsi!7wk>O($0?BeD4A(SXiRFA~cxu3}bq1t3rdVG8AkHtt>7Wd2CpQ zgP9#v4=`J`mF=Enw#$wY|1ydWK|Qpz*b|)@OK)q%CdJ07;IJyGevZVbkemgXJLL2L zw#@Q?9cWtgNrRoN-&NonG&xvP^{ePSf&T#-Rxc-ZdFOrk?CF&O|l zS6&Wg;SD~G1k{H*Hex`YT>@PJyjFq1(#d?vzo{08VXGkY;hQnjfhj%SS{##snP;I{-R#2ZBheoWh$ zf6L=1j@=>LlF=1TQke&7Qr_*~>uHL8qQ+zPwOisKqKc@f*eIa62Ai`QwdrLKL;G7P z%)j$+jZJ>mX8K~=ATGlFz^4TMaQ2#wng^B`kEE%mK>e@zGZ#bCJ1dbF?{AnwI8M%~ z56}+X0JWWc7s-+Gl4-8!pT>0UPfd<;_&-v3;Xuwu%!vD)HG^c(Cz70gIh7Se6*bLVuoDVQO-R z52Ykji3bK;AsP;&)Mii*9pe_9nC))WD$q;!TF12LA_%-J3eCtAZcP;mtrX3cjatzi zXZJ60YiqjfIKdPAt;1;gXCv}7UbWiyBtRp*aj>=}B!v@#?#KR67fFOQBS?=zsJc~7 z!xHeIK-vrTM&goj&I2tEg(ZB(CT#O` z24}nAEoXnL{27$V>1hhojPPD&0wbVdS0e?!^pr*t4LiXmu|c<{{(Vs^;IYB)t7tw8 zT5~T7p1!!@I0FMihT z;oW{~SYE7Nf}w@tT)3`N%PJ_}^b5ufdd#4_t;!1nN%$eYGE)b$+xx90w2YSLwsKj&F0I+TB86YoXAW zidRA;EM%E1`5X&J*XD^R3Z#*TOl10VflueVOk}+^%5NM@rY9gKu_e&zI!-2Xt|l`w zYUX&#$(hm_cwEt|YV!|&Qo+Zp)V5bFB3N)ei#p&G}F zvo=P~XB{u7VzVp6LSEO_Q2>)`Mf3QsPzhzVqc8Fy6y|pIcBfnv$V*Uv{ zYG*ZXl5hB~c~M60`}I=z-L1EMqT=0dEtXXK7or#AuCgz|4)^lA&FVoQG9E-5ff+h2 z9>#SY56tUFlqDN#7|#Ml33b|jJco=$UXg+3Fv1!RW73NEI9~~~WJo!=gl)hLZ1Iyo z@xt|`q=q1f4C`BZqCZ3Z*lun4ZmmLwOMFU5a#>+;UcPysBt$N;5~UT9_h-L)Uxv&( zJIsdK%GbFmp>s%b?~En02On)uZE0Opb`E+JF#T+QWmliZ2X&vGZt4gV^vb&yZ7nepSv1A-UV3j_DIzH@r_@t9zR zFjxn?SE?w}?#tjy)f(R0I9e=z>wu0XQ)Lc+cCaV1OGeGN^BaYZMv!)aO{P`Eq|9d! z_$w{s4CjK2J!{zLA#IxNhat!*72x6(^MI_0ke7B|2kXLoK1Nb@GOK) z5@+i6$4gr~F#I5MaB0rMLB}ffo>6iU7pIa&(RKY#8bQrBr|_x>)gkaq?9X9il^EI~ zsh)?NSMTEr?88b)nDjO%jQslOQ+QZ(+6C`}I(hB3X=htc7VA(CWKN#or_Z*lo9*l_ z0PI6i+%2sPm*=6Vr_%XM-S|EXn$mT0o_^iU3-j{6sPqH)Yhk5z#+wSZ8jt3*-^}N7 zCrRoEC*Cp3NeWV=xSHhDm$CCZ8*vX$0E`+?)J^c|%eYOWuW9^-Ojl9&^C7U01>Poy z`Z8)^2!}xFzCHO|EO9EAc+nC_$Dgz ziFBW51ZI9Dw<6vQ&Lhd%7ARbuRSA>eHK7Y~c3tXlCUGtCD>_sG)dtR)+AmJw<-zsZ zMO>@E!o=L?{rM6jbtN#4e}>~|15UfDS!SbtkxD~o>oU`-+_2_qDe0tj7l*zZsD93| zuDmGi&oNxPbS~?*BV|wlR-!9?0b2bM>4QQRTAUCW`1u_x(k~rXmKHI;kMirJH(R_f z93m9bDz%d2MN;Xnwu(QvJUkx_I}qvxrf1|n0y#$ujzi5i-@g5 zgRU=TMN`PWpTeu=mI?5Wn>guZbXo0e6cgYLdGpdizdZ>Hkk1Y*9jcTm)JoC0z?-7~CgGA@1mC!RQL%z}1EJ9*CK z2LlJ1xhA&m3LdRbs9hI!yjFRtVojs69p<-o+h}=l`H;-x51MOjeh;X6ZvekJ%1_YQ z?ZH>s;^5YrHhp$!)NYl5`7`Ix>9tjNb-{Lx1y?Bl?&wxnBJb+SFEpQMVgF0j6fwQs ze6*D1LQA}ZY52>AGio-~r?qn%v!~_4Q?OB{kBMQ%HG-_a-%n2=pk{#I@LYcu6dV$t>J%7Y!!CsF?|>N z_q@C1x$|?TW{Uyb2{mfYFc_&hvHuk;h zrQ4vj_zaN1UX}pt$y_HU(p^X`4_O;BoR?92MiZHx{oW1XVmf`pU5`zi^i1E0k8wCI-L~eyT`;w{6(DEOzg3DF#q3t=d=AE z-}%b!cE)s~wl+?5O3sE(|D60|p{Elxa5VmxSx`t=Mnr^4z`@+Wibl}Z%1B0;PQ>O% z%F*1$lup9P*v84+$(=@=PT1J-x3P_pfsNBY!yNG$IM{!tQKVD0Rk8W0{9t5^&&c`@ z6GHKy+`&&rTSE(2sDF3**P+(W2#$Z+b$NnYr>Cd;X;gA|bTYP z%a1Ik=Mx{Df}& zV^DIov$Ha`{s9o5{{O_}-}C(ErT*9Y{BKYG6_BifwK3iQYi)kCHccJznHcFLoD8hY ze+$@{S{dWh(+T{uI!^c;^eq3eQcn0Zj0``a8`y~(o12i;o{k%j(8($nCdy8)kxiB9PUMAe_s|LQI%XzQkh zPxCYSUvvEfEd4*z=-~gW`9~bonDGb9f6`9>1zRSWwNd9*svZprS@n}fSH5F~=n;K|Zqbi`|=m->C8~YZ2A!?vp z**wLlZwtz@O~CfROF#z#i0tbl0kQ5gI%bYTs+(ge0g~nBkS|T{Ga#P^JkxcB$@!ZZOc;PbsG6Bf1}Q|3;w2 z2{{&t$v2SpWHdHEZV(eNU4&dfD!OHHTZAM<4JC+(eRm#IX)^;~rV*XR`LGRmHH^1y zMLc0;p5g1$h$?*uFR<1f*^1@R))J=Bg|GeZhQ6Z^8&hj?0%H^K9LRuCf4tGJ_2KQNBazw?1`N5;c5c|GAOZU=-J%` zxIr2&W1x~1ewh(zpjshwGJClJ#ZxcIF$U;?47{X_c6k&%cMh{`^htS3L7^$CvfemX z@Eo-Nb1r?jYw;y?)$;jXE*JqEb$xs?Hj5BW3Fi&5kS;@c>>ek0h=A*1&FG7!kLXVz7I{fP& zZ7NWNM>_)%^$yfX6VlDD5cINsPwwf++6^y#zU%Vw> zB9FE?d6#YQKymN>o=NZ6wPS_7v5J#n#X|auJMkTtP);~b(XpO`mw#z;PT8?MoPpHJ zeQLY=&jC9TDnf`_Kd)zZxM<(OI@}??zq+VG|6#_UaS~2gBN2eIUTA1 zo7F06@VoL_i1Wv#rj*P1$-vmS#8QhK&uwoHpnnzp74?PqXvD?g*~6;7=^jY&JM<*J zgxT%6DmQ*aRB*RP*~RyKrvU$z|A%1-qL~A)0sVr4;yRZD#7xB z&kngph;rXW?ibLq-3!okgk84~TMrQk=Mz+_3G0v*qDA6t4$=_qYQArE0F{-y{~3fw z5jCMK`N!$)U5jR^&1__Hu_C=FbpM5$54NVT)z$j!M+?9MAaO+(UHi8k?IeNP0=+MQ4K z27Y&_(ga5`)bi_-i0lko2wQBog!oAW$r-)YiDYG#RcTX(OKVeST1!)dQ-6k@!0zAW zkKa<3LMw_#en-F6B$W3Hbicqo;}h(8rRUZ>8kjDZmA0Su3 z&97mK?c4I$xdyH`2yU}W;9fJB3VnBTUFN~oWbBlKRa9+zyzMVH zq-X`IVUgTh4y)ic{i|%AK^XB$syP8~&WzyCk`5=OHEq}KI`9Zs0A`4Y`O0L_XVTJY z4w2|XkX;ML;Aibwn+g;19#D8I$8Hs1+w}c;(_A87wAxAzXpOsHB3r6kpSVi`9_=*x z9@*B4C2l7`1B0?@=(%=mT&p&Cu1^P=mOur5>I#cSGo{FMoINA?lJLu9dj8UjnGvv| zAHBbQ(^C{EroBQ^yQ!G#f}A@nvuDFUO$853%C4s4I#r!8)BZ8ws5`ctpE%q;-t}6Qn%pvWemBm$EIc06z)~n3SpBV#2S?f>sai) zt!pq`ADjQg^cg5m`CAyOTEPAVeM;Nf_Mi>%3m5-efWK!o6qYK24rxQq_1$5L zprdt*m^@-@f0td-kh#9gXU*l?+cbobM582Wb-n;_nk<~if&G5c%tZWpWg#(b=*83x zX(&EqXOVc0l8@(gL~icm;V`vwA(5{~if~$ky0Efi0U6H8ey~uQ0WMatJZ-w5k}U82 zkumamW!BV5&b6fN{qf=Oo*eU=s{QTi;gIIx<#{2oHd_cy7%~1%+O9j4+yn^SkaGDp zQxdmY-z>R^T2-OKFvUoLG+hBvE=~1ee@m{$w&))oLIiFDLq>b$=uSzz4&Q}UksMIMM=XaFk6$sh$Ch5fy7w)p6B5mb_2bh zAoQX}FkOI@e}dkKsY8nw`02!ce2J8SPw5a}RP3T~c z47^(%DzZBkKV|JVZWl(bzmsXD7Zf2&;n4ZJ)D-I^%?z{DgTW^5F5gdOz-e~P(VB=a zj+DZoWdj?|bhSM({s}~dpz1MFF=oYkqjNmE<%>~)7r@-(Ifr1jpdrq$f{nE{H`pNE zfOoEfWDj-WSf(~z+uf0vpe}AyoK>bv2mpeW=}t*n zGYfOF?0~i3zV|Xgf6Jw>P)T&i2e?q1fS3$Fr&t&Q%#kxJV+CcROfcYKn<9bX0~Ga< zBY7NhQNM#%rHB`3Vg<795aVV&+fo_4+krO&D_|V(FXg%$AXXp9cqsamJ|S2nhP1#O z>`>tbIi?+*S8u&`ZbO7l?}3lctgySI8O>o9UznL1rr}S$I%!lp_hCogEtr`96^TwWvtkC;iVN~x5}}-Lalo`#WM!Relv+6HcDeapfV=* z)y7Bchb`9q>Pz9*&h-l?p)RJEHQ|MI;|(N5@Hi7@IxvLrl0}5k!9j2FqA7v8B!h&( zS0vR}Wo+b&dAv5s;ATN{tVJXjNO-&{9X6sXw&PZZR8rFEUJWj9QbLnK!Y+;;1{=4L z)J{?Y+AJ%Qb9NXivQap3@+uLPvwUDWxrcQ_i|?HQ56eKV1EP<@g2}vB0r6F8f|t6O z&uFxAV&RpV%?!-+Cr8GeWYeqLXu|*85Ia3uxM82>BIYR#``E8$VQ=$#ITifnl&Y~u zJM%#P&G>bZ54MUBHj9tAO%qpmCv)DkT29f}8)Mm0XC{yDq$z$r8qOir*q4V4oxAKL zP&(Lqgw98j*ZIyNa-Mmm-d>i~?UPO3E=)Pd-w58Xa%?Ap{s|EcXvc$pCHDN6wnbND zRx!Q*@fAD1yL=xHk9%(g?UwJGQMBO;fMOxaeu?I|5YSu!Nwmn;*53$A1~zegFbx?# zNWz#hcLq-SE5Q5)h(Nd=;ltqaSHA3)jBWd&q<-((SdO#XCw%U(beA;eiKS$gKc4Z_ z^#lZ-8abxVI}q$C4db?fhMN}4z3G|@NYQ3U{H(b8ddd!DJPH&+O#*Q(b!V z{Nfa~j79~eKwdy7&pHN3rHQx!;JXB74A92<)dP!^3=3S;?``4&S;4*n`>v$?ytyTt zEJf^Oh2hg-{hV=oY#8nhamstJ=JwIX3gwXoB0Ga4S{VlUv{Pf1^^__#^QoY7s%lFL za4G}(j*CKUZW3^A4OttL7Xr5|YZFhX<50CA*rjoJL$|R0Ai=H7kO+ElE$*XkYycm; z&+Ef@LkAqnR72}t6!H=`m6QY>j)m5ZNzP~I(W3~;KCT~ngO~O%8vHHRLU)Zn zt-{@ZOR@hZeqIpyo-xSCA-!o|qHV^6K#39AlT0XQ)nCt{Ohk1K+jXmFBq=ltqyTQm zXr1E|V5ld|uPui`jVS-r0@?-qp^{QLolri;6jEnq!!JhLYl>UoX{AHuVNjMNmm6v} zk-x~bsxLhWEOVDKpYOA9);*`{WBTqcJr+aHY<~#IUYimNNtGVo!=u;g=*=|{i1uN8 z(OuI_N-7U0o#sr=nKidVglHIhvQJtRms{#8>DZG`S%!C;=udse)XY(eG5sl-&|%`#^i<88_2deC z(6C0)f{5B0zo^)}RPqgPMG`w^X2-(QX@YF#g~XD{i>1 zvRW83KvdGiRqr@xC(^2D(6l7o;g@_+YAYKF^+K{qdly{1_0c?L3$L5mk9&P-!&0?moc4u6&`w` zwH2Z=x`dXRgzAsc3`eUx=5yIs?`nzTAle}7jd|jF#Iog_?000Xq1U}%2zx$0ncf~@ zjg8)*w^Sw^L5+l1OY6`U3p_@ za&fNP3C3^{o+T52U7-w`($Q0L`=ew7VE3$25gBm>0 z_Gh6}!f(R39{Ww1M}_gG^$4OlwzdMgSTZ>7_N+!o{RcS-aoh1L(`%+3TEF0F#}G|$ z)>Bk$c9h|1v%`U`ggf~MAG>gvBnRjSRb4CWzpL=;ipRb!)lnK%4-nsIm1|k0r zk>QK`j7hKq4@VZns0T&mj_}buA0BpItWVi1*JO+ODHoHR$5lqjc$;G-2ia}~pPHv- z{-!xC&R8J~<4Z_2mlb}jpw5YZ3J+Z3@*KxUnigY*hAe6+MOcQ5)cme`qUW!Fp`&!g z?yAW(lD-}-`IHc&afRLdD28x?>^TXqbyfDTXzS=O0x(k%)t0T^AKkJ|YY=s0Xf+eK z&SoohZQGrCDNWg^NqxsjCb0RIez{dMG^{bFjZJYZW@QLhDQmGQ)m6!fwBpiL&us@G zd947u}r@F`hb_a`bxKfpNv)DWdZ2@SH)`T+FZt@|@9oqMFbe z1Mb07GGGLcOI+j3VSiFU_66c=Go!VUH|}yaeWF3%C%?mkeI1#DD?jmF|9*Iz{AR+H zvA%uf@_7N}6>9cX2r!D7%|2pa{st5%#w7x&Ie4MP4Li25KU+gmVa5HBQ1d|r@$#2u znnzFT?QdEw&ud$TSQ5XEHxP1L2-?p2eZppTJ#S@Jo~XA?)~-}5Kq{b?LlSf>mgo2N ziBIgQ0}9e5sLkgpA6Z*AT~;bZ?C`?tjKek@ML1@^1Bb8|Y>ul4jpf&bqYictOvD$8 z!ox7*^`eS~-x0KO-S-OO=}67ONim4)ti2^#STgcShRR#n)}d8QkxMx%PwO1XB{ePp*PVp? zp%CsP2Wa90`0w9$9PQ5o?eu@QY#6>T440~BFEKKAD|GuNz$F+307RYX>k>%zvy{MV z!SCeV5~%8`5PR9Ko47Fb0MVi)syH@JC3Z;|iNq(rE3}19xh-m=pa@m3W~JO;{2HYF zqvQ9m8K@lB7VqX|wKrGoEsWG=k*eC8VSX`z6~3+*nSs)Sn#;ljfCa@AZWY+7Gp@el zEv6qG;Vi>U#xKpGF{4CEwvcaO#827v7s~gzJ=9D( zC6BQRj^XtY7GLjAy``ew$1N+aPx6U|PVlW5cGIE~UR`q27<GO>>hs9R zRgPVD{_$Y@BP)lI`;n!Y-7!d7EmF7HLI&BiI^Ap2Bcm{qcVq#lHY>-YQJs3#@k{UP zy*s0sMOybRDmfPZek`EUR04WXKPF1J&4p)63!faRLqCMEZ&7}X2QnHTxoX_VUfhHM zM$pCVHO7U%l@7&4ynR*hSin4DK-CyL46F5T z^*F?k#ehjv{uO+J{$z0 z2VmhF;1t2S70|GILW<#En}8JvnJ*ZBU7(fGA&o+KX3td8 z@`_nk%9q3GSGLM!XHXu7seMpDb9sj&wdpR+-?8h!dL6TQB%>F>cgv>i2Bg&FlM^eP z6?N#N_6s>&{HKrk@Q@EkK#RJ08-E(~?}L3;tUK$aHM}A6sRfcJs$cv4KyTOT84TZw zgwC0BOK8JFli~ECaiGq6%X;hS&B2*2!GH=VL|7l1oYjtX%t9Vp=GAy@uV`*j-#8d_ zJgJHO`hiyxSE{EvH7ul`J?#^sIXaUk$2kYbxSX!T6Q-fb4nXa+FZsL2+>HF`G80pw zFAn8B-^Bv!y7O?wFC(~-Eh2U4u>U4qCY1v%p?nFtMHvc$xTx0Fq8L! zg$*-3(#jy%llu;IH-crAnH1TWIc^`wOt*Hga|~6qY~W)r*95i`+(^PB99B~_PF{_< zYYvN%vzdIYy&IzY3ycZ+#M<$!+`IJ%h-n zp8U(C-`1K>jddtQhAQ=d9>={U7vMU@9Jb{vWD=d{fK!k0-s29Hru{~KO*+LCGD^J^PDk?$Q({R&>Y+a))F{}X zN|&rkFn}%?nyb5wUZd=)yx<8#Q(2P+;i74dS8au?%w%l9Fnbp|?R6doNR_P(uJvU* zFxM-(l{tcQLL^M76cJG(2Sq@5UH%c{&@$8SI^((eK1M%3BK2Z$iy61z1fXFwq6+<) zK*Z+BOCB!D#IaRnFe-GzLOfFt93V43SPF+6z|0lLUSb$RHJE(HDT&~G%vNeLbz9xF z?|xVK$`%5lIETTXOEcWeEm9UM*)5VfwM_>zkN4POIQEH7BE1 zCfhWs@wj`|L3L)|>UDUFnyu5Hf-zm)L?oX_Ae&KMGbf!5IXEVT0Y3hG^U*ZLVM7nRmCcw?o855XQoRwZF1#nsq zjSESuj5W5y9g1FCv6hpxI$Tq?CQo<6>`}Pa%t6#qGa?q$SY}Z-F<6W08fAgTUuzEF zpGS#>P%?NU;U54H0`#@4yKLq9^Q7}_{zke1T&j9#lJpo-A*FSUnW=K-_wgA7BaW8J zhojVV+AWZ(@hImUU8hwK*2?rZP}&3lj?RFsREN-+v=67O6oEhl-J$)C&d+nv=OP=Y z<<=&Co_=aGEBeIze*H zbY_+1g%F_udtrcB;C7~b#%nTJ&PX6g{u@(f^FftB7!T`eWl}9$m!HJMBdf`ZgEjbv zvzws=m_;4{Vq@2T=`W=XxtM?nLi8?lUSZczh&y( zXY=~wL`Wlpc_nb;#oN;j%a?324^?<^9!vM~4POCGL**vzfI?GG2kyb58wdpv+sCKK zFz?Y*-XEI!$~;w_P1$A<)?gy@xSNh)-g8+u_1j5A#MY<3ln(J>$pfHMktL7gp^H;)^(rK(0g<0E=D@xkP{4PBM(m4_G0NTo@$?3OHl=(~0M9Wm}7(z!eG zE;&>|8dL)Urz@@?JG4o82&oj5$G)JthvkWHQ-VzyvNn9PZ&Wiz3eLXBTIt#B1>CO; zN?N*&BZ+;DS-m;R0Y~eU6_C%b0GIL9v3nND>!V`UIa}L#hreXq>)lcZ$@&oi#sxlJ zesU?AG-3wj&R1MTE|ED_;nKqjB)T?4HD)COrOG@vPUAZcgLb>d^ipmWK_0zKs;q=HTtQn!EvdFI7daIEplIFOHb7>K_)V%ZyWCd#|13 zPMe!6(U!zGgR;pRs-b+#hh~~a%}n$6NW(vsZu-~PE8G|G&3!6r3?@paMs~PuePN^0 zr83(-vc~)dh}s4pNFWY{@mB-W@W{?e8p=IIqyBli%^`5Z6xQn+MLaPAzf$S6KA5<&OaH;;hQ`)K3d(n0d_~vjTBj~UP;3TQ1+?qiP-Mrz($uv_4`$Sai zF~dQ$EX5=XsHm%<*a^whK|U=NH9JIJOuA}i*)E}n&T$-F>?o3L)QM*CGz`t%|ItZtX(;Cu}>)vj1LMwVN*TUeO#oI)o6IAO{O zBT2m-jo&GOiEeuGE?N-%S%h)cfX!Xd!|N%6WxZpVGASNY4@3@0B)4-uWj5!i{Cew) z*^^X!ZD0a_o2w^Ir1`=56kG3B2|;PQG`BC8HJ4hWbtK{+j?T&pcX{v=s?tOovUya2 z&XMtfpVGAPyRJ)m0S65TZA`fQO=G)X;vm~f419^+#fwOWb->o9_nI*@MRQVTz198q zzX6>}YE=F|*4{BlwrE|~EZerds%n+3Rpu(&wr$(CZQHhO+jdpg-Y3qDvu~f>eWGvw z$Uh@9BW8}AbBy@j@qF)_a%Ml7@IBSZc$#-}E=P=o6@=;qSZ6|LZu~}WC52eVgG@M( zxi!KY+I~GD6q@c2n4!+BEz9aj=mWP?Xpfs&i5uklg*f!}>%;p~t(ZY@)*G2G#h)s< zDI-Voi~$OS!BDA$&&BCaiRSg|_Aj5MC@SLb0fudP+4O3n2dJ||!)Maf6|QJ4ODvsv zKn46gRc9ObouZNsGStQyxSwXS)%wXdTRG1Ktm8V&O`$B{W*OdbEVg=HDMXpD~5e4|L@TD0440vFY=Xlb+j$6}IPw@tF8PJ2P?AFue#+ zKD>2`DNJn5J_C(G4xOIiOG52LY%}qA`o{0LN&2mAA1C%exq~AI&B+hF$iKUW0X-dp z0pIr3ymWziI;Ew;c@XvfLc;Rw`{|&M4|=ORivr^T;LCQgc99rpH8%#ky?w-s&?Q$a zAX6+}$5*!?m&y_~AnIBL)gzK&}845P>0VfvsOGmJcBqh~$4_1KbyIgVc*>qUKjHhHgynpiJmU99Pmw6~Y&-`Efckw-Xu)mW!1KRZXe-EjH-< zdge(XDdcSJYF%etjEO$nI>U*kyI|h4zW;d5qCB8K(gzjjBBxAKeAA~}3;0vxEwW|L zr6u+Ua<}7QY?1En>Jeu1@X0@?nRjIxeMtB0*_FW9!Q-Sjr&0<9$EJFx@F|s`(v_If1ak+)jl9VF?5-zz z;3M-YIGs?&pMN`5c{Zi>vwwUdf5wUGPt39Mh7R?>l?#_AwQng8vMv<9l6?= z>%>CG)wBY5_V@V^4gx;b!7gzdJ@YTIgOETi!kZ#&Jvq1<6Rnw2ir=YG&4I4EiA!%# zeTs*!bj@hgUGEik=x`UO00{8n`Hq=VVN5UV&0S?%cA=M@$ZS=xbdGx4e>%DdLD^6R zzlRE3hDh;RRix@zr}ghD_oN9180$vc`k7j*p`eHR4A*6#KFvFNCnoR6nE5WVO6z2+ ziIrb4m%6jc#r0}u(1{NOa=gh*)&s>-_5~?|CTfL5`t9<+0pqijUH*;g@n0RD{ui+K z{{U3}{THC}KR~_zAy&yi_fK5zzhafF|Kt+?6(Rgzt(@vV)ZIU6#s7*`{>RXNB8LAJ z_53$i_Wvhb`5##5{|&DEC;R#P2d-rO$LaR}#smK2JO6pP|A%npe+5ea*MIeI;L3k9 z8~-h0Nkh-@e*{_5v;UBk|KA}?W)`~tfGp`5+5a2JlJy@%<-blU{XZzz|D4o+AJops z#?JV!THQa|eb+}W|Dn~rToy$9XmupcZu_Y#k?Rg~EK(lvrzD>}q7V7T5>XWFkDqTq zE8t?cgu_~zj6YhP9=ggu#5#g*Ts#t6zi*~}S){_7bW^;_v3`H)>b$|--qW8K{*>#0 zO2){^-rbE4paxPcg)+UrNUDNunh3fx!1HmmtAk>1$}H-psr&PBzyEZ+$=mhGUUe|I zwa$Py9-hZ~=o*j^$dFyH3cL&wGy#Q@7*uzv!7P-_udKn)Fowhdu4p?V@U_B+Wt(CK5QH)=FP>~$dqar&$th8LD@y*1dn8bv7 zdz$kAs+A$(T9->;xG(8hr%EdeP%Ed@M{fHi6L%$AR`$rm3SToNIARIy$Z?*-<~D=Ay7;5l>o`y!nl!t zgY$?TQHYn7@30};1`JEUNU#lf28q9j83a7lOgEuB@849#ID3?mx-h;9P^q*mrNU$( z6qY#Gj+aW6ZJl5toG3jwaaLVv11Y3q9sC{T8b-PWhZHd%m0>3xrTZD=(Z&X_MmBbSKVtv;ZWoqz-!i zBFCS?BMPqH(9G->BX}m#2rC!ZS5%lUBG*A42p^n_pgD(NmFpnP&SX?X$stJXt*TGc zChW{TbSds>1co)#^c950DIdoli1K$&kzZElo8P8A^h5Gvh^U4!g zoA9#B;}&dP$AJ2VSu>l4>x0GOOe*s-$KQu5)ozuj$vn(g6Pi?1gl#LOZeTwo2C#WF z#2bvkEs}u4T1jwMAzHV%WA<0Y*mv;rX|hdocT5XzOp8Se^iUeYF1}e{duX{2TdK$& zEt;DqfMY(6?Hqo(d5AsoNr-V!4Mms6C_GWQ;^8z9$0+pbnV{*>ObvAHB5xQLiQaoQ z!}j7=y;4$kEHt%cE~0v30?Sw_LHY9Aq9|B`da?eft3Y|aE{uA4;!C49oT<4^r?OrG zdW+Ep?7Sv9HPcE?=)Ig8=1W%RtR>xWHlVqb+GUrHXpPx9BV2@VBZQ;jztR15xeWlv zHql$f{qex_oGw$c!_-Dg{t-$BJ0FN9^=dn>1w`NXd;Lu5A3$S)k|em+CpAcl>8lkL zCrnNTaDQ*?zpysuo$+^%BcILxXs_n*U5-`h%p6kXoKy9Xqv+|hsarJGRVIYEHj(2i zQlkE99PX@^Lp@gQY(}=(XlCh$L)h~LG`+Yci`hhYWb@koWJ|~&rSlvytV{>jT%wOj zvQs8NN?l79$SddpP}E6&1YW(oMt>P;0oNvT*~F+g@9FZLM2RhT|J(w_93gM%_(Q?L z%lYhUsE!u`0uC~h^KKL9xpM%2d^K6d^jGfCk3kvmQyY>tK(Af(Wsh5rL}wL5t$^-rm?Hyfi;;ipA_{Sunf99(BiDfJ9TJe!ME}QgMi+gAK2;#z)+wPiZ=- zt0<)ce(wzhcg*H1Mdk&5tzst5VMW~50tPB4JnwM_*f3(= z^2)S`L7vUEKx+|*HT2e03cIC8+%lQtK(}_CcODM)WvZJJ5~vm7Q5&Q@Su(>(d?TQv|ba zXThrrQ7rf3ZG;8-$Jhv9P+Fy3Ifz?20Q(~Y?0NF+G4w6frfi7f&cQrEUNuiSu-?{it2~WXAf$9_dBRu#pzGbesD! zPG|0+N2rL^F<4=nlGe&plY83VXcpwK<-lc2Qn;Aa^E13hFjI~>S8YmP>k~~aJ!Jql zfyvU|r61*8$X`0Agq;!72S4_QQ^#LcbH^|hP41zM%y(U@h7n4h3tfbD8`fzoH zG?|^a#Id4A=zT4EjGUU z7{DZ}*E@&Mnfh&x*oeZANzR9SzG_UshpmcxO%<8nA>z?lIp&iH*motL{Yku0LU@tD z{11Gf1lUZ1OO0gyOMTlEu&xx!Gre$3B9V5c-^t}jBV$+;Qk1B0SnlVxwHC@b7rx)E zA%@QISY#-T>`7ZH>vdIowT5+RMeY5^Qi}EV>7C6>J$-1z%H~p`OKR6h_7YUCb&v?^ z3}`b9zAQ=t84z8K0e(rD;3n8}2y%L72GYIwgz_*cm%m?#6|jyim=NoL15$MOhL8y# z+4MtWaAl&%`X76BBsY0*A}|9@L0>=|N{Z1rSZI0(m-PX=$Pf9qWN}<>%{e)513reo z^L<404&SC+yH%Pd>tKa_&!2WFZYU(xMcKkzx6)&7g07$ydXeh_MD!HL;fS1X?rL#w^tUd3B99o%+J@~g zIdibMZqjO}J>H%W@7ckSsgiqlZwQ@}3P5h^*gqCGIlN&2wA_kYG-QeVkK;K+jgin8 z%cw=tJy2>uv`AG-x%t#a)Z7CP6@XnVT9Cr{72VXE2ybeJ0TC~Z3EmGCj0V3q?G#Cy$H6SeuCHCV{7mTiwI#=NQ6sb&(75 zcQ?&l2$G6hDLtNqtD6c`5&gv)sSsj^q|50GLs|c{%VPYO^x$*e>kq|WxLf5Oh$epa zBQ|krh6W0%MV7wC&j)``%HtJMz9JQ0J)$9`PL2gc8@Al0>jD9K6TuyfKp$wyrmda9 zN=$;43ObAA^W*8W*J~6fv0codi!3Se8$NJjDmWF28KL;u@gd(?81o6o>|?fm?+ z7=~XfaAr#BmK;i8z0v&%g{0QUJSLxTjWDb-@3*U6%~CSm9OB;{luEvS3P5i9Mq- z^yYxzyU*U5>edQJTv`|kY&K}>+9zZ9ngmQ#fXX`pgHA(H^;1_z*3N_cF-$vz0(LNs zk7JzS^KsMsLO)dzamapsZ}x`58=lF@T(q+4bm2@H#EZ~hxa_x$_}QyXAYqg0b2(7B zU?|k%+Tr~!Le=@a>jYdQ{4r<`Y}canM`&SS8L@`x_L=%Hc4(c^hk=;$G3uZXLhu$9 z_GMtfN*2ti8Uv+R0Wyfzf@)iWeEC5cFu>EE-}*WP0s?DI!4Vf9SKeURD$!L)n4h(w zZnCBk55WO<+u%$_>h~MjQ~_?&8P& zz7EJ#6qp%}Ttch$ds_pT%SJ}3@2O4WoEjfS7t-i@1W2_~R=bLsUZ_sMDNiy>09n9< z67+T40cJTL)VtlbX2a_n0?x4|_jrfiDZlh~GM_H+%b01GVrgE>qckReC*i}3hE^h1 zoIiTeOg0Pn+~oB+F^Y7g(b(c9m!IMFu#Z6SIFvdk-v|dN0LdyOmU2QQzk-!#7zotE ztJ)UUAqqMqbPu;d=`m-dZ)}tv=m@8~T#09-i=-~_&E&f)H{fzstwxX52@O?79?LB z=jOm3bkOWC-p4m`>#Bf)H&r-WRZ6>idcuS-=1Z48+%q0*Ft9T~c-^BZ?JlzANdWTWq%_o<;%@xRxN=>H+y z{J&S=Obl$S|5|}};%eHj58Y}qzQMbI$YBn7?#T}wz{arIfX7&_)1Bgu+C>5Fm zp%nRi+}vyj<^vLGU-*+*$`1g3vE_BWwe>oGC=`qS(j9hNAjz%q?_=+@o0+e5aJb8NY`8MAR7+asSNWAW(a(Vz?Dh8+we+n31YKQUFKkgxv!wEU3gwswLl&AULB;Rfe z_#Lr`v*TPb!=?0f#OoMidqD>ON@Ur8feQVqEMhJ(durRFy$KdOk9eg|XNLLCphSQ@ zD%eG9boi#9w;F+~UVd@$^guQgD}*P}zlS;ewWh#6fm-3NQ-%+y9}e-pv`5k~7+S=K ztijxTPQyj=aJGqL+-7zo76p8H&P&bcG20oDO^Q|e!2R*@tLs(1gIz2of>OXfjDj2q zClCf`&0;xP0wIw-OkDqThI)p={myejg*|Y??;iVX*r?q@nZLsjDHBVOz_$)j1;Li*%zg=DsgXnpo(Jpapd9tuIaJ^7dpp=_NpMd#?d z=aJN2o>0;DTqGDTt=zWW+Em>T+)q(6s186!G>whm3s2AQW?QEq9 zxmez=7omO#%@d4@VPUzoSqZ^x8J$idd!FZ_j-&Ei!*(|IK?;QCK1L!p3&kU6-L{OV zRtbfeY@x;+09ct!dTa=>!X?n|djNTrjp?A+M6BVwg0C%JuwoC`rL$Y#y}Mx04cdkD z0%K&bFWSM#03JvyP|_K*``s5&h~E#p*i*q6!R^=R)kXUn1Rf=5E%(%=cgCN&HK(k* z*mVbD+}&;v*f9Z6DA1OV+;jH|fGXMQz?1LoQdB^?u)!T)_w>1`^ETi$LTAhvOLvdP0Feu-#Fq-N%t%dY94vu2qCbTrK$7UaJ+i42xyz# zd6*sEenB6IC~6x6CIZeitjw`Rc?{LvirBAGKqLW*%Fy%cLQe?}s%0kqw zrAJGQusD5*fTQaUTIIGRBD3@J*9bwlNZDmxZiN8iA8+EnJA0Tefy6-Uw5}f+9&A!w zV-On$#pBci<}US5bF%3iE|H#K$@vJWGBgSk222)HUL3aFMm4+d2Ni02s+Xvo^%4mIaHAOL&d}K z{q+2s|Mnh{5M3A{3Am?=s9hj2IObu(HsX{Ekfy^fi4mPN#S*eP< z)Y29uTh7Nrbb{;|KaY3Y@JThAyDAPquqge+gnPb%1_YfHO54r1{k^C-5YMZdVwV?m z`#65ZRa2+Y1OfCDLU{gF+DgN=vg=;K-Z?X5?waT5u-CkDy^qsc-zbIvoQTOk#SVOz zSDBDc6LYJLCGDs^WJWR7{t0Ow1VS+;tN&#g-ORSDDeM>r;&*Km-tQY^4&y^;1ila| z*2QJyo=MMJfHxQ|+rJVd_Z6Oe^rjZoB`Q|yuV((5+a|{3z{5$$bt8+VTmH;!ch0o@u8m-+d zvAx?2nTXgL3a0zRnyg*;s7>e2m5e^v4O^m$Un3a@i9HJRbp60WL)o+Jlm!DgbO7IH zA%dQ9Gj~_U=gzx##u01o)G*S+=6FC0f#>if!wB`D%9$1s0K{#97gnY-WxjTQK0Mn2gnqjO z^-4cgYW4(X^X}M*^aS2vIk%;W^ydA!&% z1Jr;=Nxz~sg^ci1YAIWPpNv5AUmL2qnMAJj-au8Wri_46173E5hElt0XliB7y^smtME>CoGIjh*~)bCsQ5({5oIf z?j-U`R?z417VJZ{9 zbG1r+_!KKZk{8O1Q!H=kis{f{A30K5R#py>4?!DJhA){>0MF%Vwsr;ju5no{A(mt{L%`(@>}5KR!Y zl?@FU-7LJj20&`0^yF|4bs2h0U=NlR0HL{#uT>I3b`4eMh4N`;oEdeBYrW*TrNXr! zrEb>LlFc+DPv9RU0zP6lwY9Gi-_D`Y3lpK3D>rDO5AAX%O^U6`tQ-y1oG@rk< z5OHcO)T_%V8xy!;MLDF*=1zDPmvb*B=@6?rk}_>V8hzOuCfM61LDL=tTb*af^zt}~ ze>7RKVrZ^$%5Y!MQh3f?si?9Zx#Pdz+WeokFh|^^*;E}=d}mJIB^#kF@<%*Ty)S0m z+DF*Z{bc!d5WjzAaPH@6E*WOvLs9UMIG9f1C-Gfup9mH0PH)$!+}qUm_@vT1#^mDK z2hd;fLWDv3KTjsQTLRqvAcpzAc+`SX0-FLe^-fZ7)oqF}W^tNqNSjS&-By?$WYB{q z6D79#Q*2Y#VSBjY%l5>uP0t`B#B38Cf`74#aYa#zY3Ex2M8m^#p^14`!CsAm(}?G` zA>mR+7j_I2ztWoCScpNM8zq)+zNMAc-R?t2XldDpp7u*bjL?Vk@}OcVjZP}qs@^~V zYM0e00T-4Xw7 zVZ(reW(|99Xby@PM&v%^cjcv?Ek5;-zJJ`3xgWe)7EIO_PQGCg4S3fjcrHDC^e9uf zbat16FYPU+c`tUF1-BdEig+S;jG>n|FQ2P)CdY@D>=kI%54+Wj!L4(_Ha#L%Ei`wO z8f3BXE?(3R5PhN4Rw3wU-|#4{pf-3|J*!3=O`8J)v2s#kc=kXmJMv}{%~RP+m((kJHrcOF@0{tnd9iKC`bSAS|o!K#ky{{5=>vs%sU> zTalw*ZpXh|H|mVcMV(vJgZmh`g()^KH^q4?Vt1-idptW<7k||$sGOk$-(p(2=+!kt z)jhQPz0o+;N$DH#o(d5U#2F&nCi^V_p>pvJ-(wDmw1Sp)V_2cEcemI;3_cx!`EUuP zLG@40#~L$$02!fA$ODYw=l#iDJTGk}3h!Vdq-Z{#8iY}fAbsk#-eGvbAreK+ zfC-q5H3_=am(lhLXT~)A%jes|goFVbpQ@oxAkRE+E;%|Y`Ij4gL`Rix{}0#h-Z%lD){ zT3^3S%!fK%j*w&0gqIvakea<>73!DmgCsE_m|K&D=W|DfhT`rsF`!450tbE17)A{Y z*y9C>yO4(609<{pQh>Y&$%(+}Kr?bHZFFaOf(3xYRFb*M-5tcSCrWexs8%>Dr%I0DUjPcFsDKf1ydYE)Nh9dACkLb zq(;%9gR%D)R#5Nw`9Q`5|A%wNAm*iKMiKiny&wa_0w)Oz$`z32MXRy*6gHZRakqgi zfEdAFUYgqxq7;TcD=wzqKpsp~o9bjo@jEZ^OsGMwGeoKE=Z#4lQ-^`WNRD^MAq?w)L84jW2u2`XBqg3EZMd2)(_5>T#Z9Th;w+*4s$-gWGvN8u z3@xwXeecC}F4bJ8vP3W|sorkP5;XupTOg23R&)x-HaA(dCuGq=r#Vls7VWTB~E@~aVTcsGCzmK)x5+3BgoH@Vhgv!fZ-|b!zDy#d-lJhhjp6Q1s zeA|J+Lbu74-^OE?hvP^H!l(I4BXYiKas3qd)OPD+87=8PXD_-h*&Vs<*gdeoSz2?> zNEdnUpBh^=4KywV$k$1uwz4?Ctwkt}f4Zj@o?`c4+1{npet6L$t6cQ0Y2o>uY;83$ zVT(N{^0D#8Xr;nEdxG*<0wTnto56)SQjuH~-Cn?-&Lv@iEoWp) zNE|Z=b-8_qcSW`qfdU@}qM0#mTmU-gxjl1u-s09!awdMCua&#{JQN1l(u-0`ZN6(f z`f8DA4qL;Wac(N=2`EoK3_<3!9RhiSG zA9qt}DNW%_yDQ8>!?qU==*!lE7>}+`)fe!a4QIJra&zS^r}y)u2HSGl#N>jkxoLZa znF!x<<04zmwSlmItl{b-tJ{WVhvT!s`F(v83>HAA`4?+}H0#yGRILBe-fC;yZs=Bg zy)Zu+P5|=!xh@%wT*Mcg)TKS$<(HU`k-@LEZvg*2!2doaje-7uX8FYUV`1sB8shS#@~hf#HhNGc=vBlqo-c?7<;E_ zfk7YASdA;|<66f0{!CAAHzFwCZ?jT{Sk)KRMJjiTztUcxMCw^t9`;^tcZb@FWQK&2 zPF{{~M7fzG21jH3eU)PgfsU)M+zszn=*gPSGsaGr)n_h`o2R4J_0-?WPG9?{qu3|6 z*Tv-5yimBF zwpadQZU0rbIIg&bZ3Y-hTXgD1oh*_|=imSFG`O{h8^H~g9G&uEIaP4#da*Pb@cEMs zZebzYX1n9d1f+#z+QTS})`;`dImDDdY&h0N=jN`VrJ0wM(cGF!ldjPZF+E{X>*ir) zM`^U_!=B9=CbuMHSt1)@cU*5AhLWQLTtQxNZv=<(`}>*_iS7}i2*tNcc4C>|gSeXm zN+L>EOugrW_@sTLFv~Mka4MSEI-*c+oL@df$V%3|pf|fLBXis5FLSh3bYJG6N9uF5 zKY&fbB*O{rMn?!0L}k{o^UN-kwZpD%cx3fWBQYt=c6&lrI(Sr~}d)&|gUwYAUwByruwWZMxI{`Rr4tfcgx5rRl(Mjk?p zTxb!vR9OhHqv9%UJ_s;LBG?C1@)*t@j-gOJloYqPJPF~jp3gbHYrBQP9KU-mQ`?p= zfVN9Vm)%P!^4mp1TKLX`+W~iWFk3liv}1jkGPs8zmuTAv}ym3QPud5@li7EG?ngd;Y8kbUo94J=;DB z;oH8iyt`$IxChZ>r|+%QF18q~LT*$H9nQSWL>cu0klE(Q2|XhH1Yeb6{TzqGW4Jn{ zf-U(a_p}@`uz~1Qo_@DkxL-A69Fj=u(JlC%fBPV;IkG%=IyARZ3lJm>uniMH0u`Y; zFnUj%|Cj@rdMGFcz*T;Kb9VsF+9VCE?@prl6(YVaSINa6TAKMOUotS8SKFa~afs+G z!Ncaaf=Sh;>CqGe*EN-l+2-K7SAI`Gs3o2Zua?T^pOrFU;qhR%g%kDqh(j4n3Wg16 zKroUDAkaYRQzq=|$9kgR-%8S;5{He+QYa74?SVeGoCCiVds;EUMb!jOrJ$=zd0 z^l+!l$^YrW!LPo|Zvm#LsnPMP<(oK=A4#mX5OYDju)wP8llH0WD`1`lN&OB7th*>8<>53)zDba4lS($z-P; z=O8HtvuoMh=KEHJ%_}Wx@={9yrqD1e5>iwsNb5Y}k1eWsT(Fz1qcV$2+Go^qrx-&a z4ei5?gVHR4?39BLgN&IlzM7M6cL!Exy8TTH4>^}V)OY-Ill50v;M&H(wUf(4P4Jw> zrp%@K$mizctSFMw#A`}bxnvMnDSOD^vbs5+taO0o6(m0(<;Qy`%lXH zgII{=+;Er?1Ox5aLja8sUSenG2RWV{iusgYbE60C$3xRUPwY4Az>BQLK2+xB zqwjL>0>ZrUGZe%gErQseKAi407Vz^id9s7sqAUi&XptP7hu`y1yoT| zV?f045{-*T1hS8hjVn=&i|5oBt4h$+66n8CpD(Oo02kV#9Pyc|!HW9Mv5noPR}2ZH z*rGJ?iH+q|nMB2!UVoCyAGeuH!NxHzTec<|lPp)>sNb?dIaj4G;ZJF>R`O=FTCuj8 zFin6yBIWgJH1DHLic$lAWuw3vSG9BK@VO9^%>ch6sRzNX0I}Y*)oWYV$V68Eg?q>; zsKI!iktig1BeG#Tm5mzGMTr|I(}Xg1$7jU{ABTcwfgIVlCl(<11qWbzH>37pB1n(; z`g}6}y2s-}I%wgQsuGTG@8q2E&M>iZ1qhAuvEG#}gZ6Upi|ccfcF|{vnOsb5!Q=)a z&a2m2p(_eSgfgRAR?_{r%V_~o z3NJ(*Flq{uY7K*Cm+?-2tfwRKB^MT$y_CE}3%3l*;H>jQ&#WH? z$6SuVJML*7zAURQP$ZSGfOC2k?)NnaEa)GcZI%X@vN^D$u}$e?|UQ$wtlhsP4&`^ zP`tf%vRZWw4pHlDj~H+v0zCu!Y`P?a*PEPAKaU2#L@RllT(!S`_G?~MsV^)2^7g2v9f^jq7WyfK2`EIs7{*GiQEr)!h1J}o)oV$&#dH&x$4 zZy~zAQaO?ySj;|w>UX6pb{+aG=Qc{U_%4RBd0=SBrMI>8f@P)ATFvhyg;c>-ae<#Z zICyRP(FY)cg=<2#C@zy8vI1#bgK9KPk1}BB3XII<4xM8S9B2}6sSO`<4uM*K1Y`(e zzkmf|Tjv3tYJRe>m*6&GOsy1Xw*CA7o=b1jEPpZuv9hl4=rX<^(=FYfB{Q?<8q&Y? zrwNR1N> ctoX8h)w#iHJW<2bs3h|^NsBnxZzd!Q)3wQNz9qffgf`i8Z(H3qf3`Y zK@Hs2I?`HEHE!sDtmR-wZ9OWHmd^KA^>~4F*JA*g)H+gs4q&!3lO?a)x^u=T^9~?{ zC)ZgeEZgoCCC-K|`gr8`I>{h>aruL0RUe7?(6mJd2-{U~Bu-pCmGSy;lZ9i0s0=*3 zdsUS+xAYS0M#N&ZFCwTW+#u={=}r z^m7Z)BAI6*>7S^=t47u`DU3w|uCT9}?JlE=Dwdx9IK5p=@)+KzK!7{OJw=^|L8@&W zMBon9<{#xgs%aCood}Y?sJ1h;Qp5YhA2~+`o7@q!94Hem)F$uuN3e^#y&0xjFNy?z zx((N#Yy8ZWMW~BIJy!MEY62Ys_-L9lmF~71=x$mrZ1xr)H}xiUkHB+Fxiy5GeTj5r z#J>8ORLLkpf{Qj3lg7q62^ZT%)Ci1`L~X5>(jqLYrl-}yFQ1^zTr7Mq0(m7i?C;Cf zG|x|#=&|zN2z?C(%c@0OZ=cWQ1W5e|bseJ?NVpC@MJUfwQ%OkN@Kp6S$6KB#$0}qZ zphdi=Gp@FxGV}3|sTo_?tu|#G0UXN5)Hun?QZYHNH*$rvG;OuCbeCr~2)|%0OqKOt zX^FW zYXO2t1xy{4x3FTF6J<38%cx1;+iRR%7O}~)Z;$0)5E5(s)5ISaSFV;f=j1AvXkl0$ zszCDsi2X?<7JyJzyS{0QGZ(X5J}^7`Re{HltSLr@3E|b-yUMhOurW%8etdVFdu)S( zRMB^OGUZ}4=f(?zM$vB(49{*sSfgo?X0IkFsS94p*0-*jrqnrU?Nlf-O+SVHnUg)R z_uZ<|`bLUu4Wj5n@|fO8SuUd4yy-301t77Ubw-m{RV^Y-n$i(kn+U`jkP||TLc5z# z+~UsFCI#Pamw_ieKP5drOlk?){;i=#EJSdg657Q%3}?;$Udt zX96}7v9;9XZjb?&q3sN8t8)=W^60f(h167Z4X~nDo68}_WxBvPvQ|ImFJON#YyM_# zHQn&Q23k!<_WHPmHIZo5QA`VyC*R~!m3*u8@CY>yI=l>^;%2V7gG0L#vItxh-+aM zHPb%H*it1=tsx3L!pEnWX^Dq1PqkT>I?F=h*vxb#;*rUfhR7^oVz98%iL~c)@K8$& zK8Q;9AmZ!Xcb`e3p_%I=Q8vDkyTgck_J!SoE|nWQJ?k~*C%A4c%y`rpK3nSyt!Spo zO*JXCx&o2Kz&k2?wgv%=#@uIQtMmsz(p8>-2e`@w#h0rN^-MSt9MbP5H_7_OA#D58ob!ePS-o-Mw~#4cqIMm^`PlQNJ&^|rWBv7S@Im=-QDV-i3z@CdDW4Uh9b?(;J zN(T=55{F|Y-4~oCdg?8VJZ?M5T!(QbP=CEf4xXk({;4u=UjYUUa`sC}ZX*Bz3<$z8 zdA{wb%PH?!dYov&WCYPLcMbauZ4Eg&1O@x#s%Ooe{s~58fW4{Wbv8+odVKfRXitMP zFi3j2ZMiQ{BAUachU*)v8Wfu(AiPE7nl&0Me64b5?ZdjnAnd+H%_pHt44roE~-Q&##FnjE@=!mI>|??Exs0&&7r-UwM(>dMt`BDNcl#x z<;%6t1T-Ul-ob)iK1fIosw-MjFspi(zj7ZLj&appg*}N{3wG-;uu90h<%qtmSPjqN zVP=0#LuNwh#6&b#H<*jEzKIigJYQ%BqOmqk#f};nm0X}KFO!19>K@TX9KL?wWprdB zVi;D|zKyc558`ShLHSJ5{c6{6vJazKl|<=L?_TDb(0RA z*fk~2-84;DF5+?~g(Vhyon><%HLT9gV(&EonR2WY$7%ELUeFn!7mlECr{U9=RW z04H0t7zq%2)LZ3R?T)#zqSI5c`Buask%TdM@E@EvBW0)d&hC! zGgBQe(L=E=(#z=1F;&!W+G+BJfSE>|+y%snUx-CJJC|cTfjAr2?>{O_1f&9re}A%ZpvPc9^lJ=2~^hd|Y3e9WeNt?@!{Z4*Ley zE)&WSCY-pT5+lk`67#A37b|nbX&zl+T}%ESw*)r%d*#GMmf8;M@G= z3VBpf`KV`JNop9ibOS!Is4sC0ZicI`INxKxtdP%@S1YHgZ~{)hLPU-;SyU2i5D7Ez z_@#f@d$i`5B77ng-2DD=3pwM~Ic!Ck6A!L38XaqFJg0?wGt1%H$ns*2DR&>$cvdjt z#8e(~uq&(tx#$13b(oFc_0ogCdz3Lk4;&U^0LH8@;_T#N zLT(rdKeh0sRzxXBWWS*BR!S*R)zdSJCyt|_xBoQaL+)>TCWDs!{rM1j;Bg~-fE2%X=VmSe@ty%88OdxqrN5~cExR>T2iqlfDq*Gn<{`P;_*@u-fm3N|d)*@v~TBNd*%KMi@rEAJARbga2tX}B)O z?i2|oJxUUmtooSjW3^=ypBX$c$u{A^F_D3eXsDkmx15*s8(V>JZgPvZ*b&*PtMg6Q^RKFM6dTQ1Kg>MK zjy>I3ZoH|{sY@#D{@#XE+!Z#jWusnmJ8|&Jx?p1ZZzoqzPmH^~^hjinT;JgWm)y3^ z-)x>0prFmItaz)odP=5bK?ea==x3MoSR@q413e(XhcrAfBrQGmRhb?iA9rz8$}}_2wl~cwX_e;aNaAg;pF( zS?WRCUiV4<_JiOpMaK_H%A+0<%hKh6Y;X5>1JezlW)A&oN~Ucws295zEV`=jjilcj zTj0NA3)9qz-S!0)I0mgv0E>At0_CxH;W|cWwQ6#}NepVJ3a(~u5Z^U)(sImCH?7wZ zdP5s+e&Q+4%A5gM{>%XlNnVhu`b&!}<|pIb(j&VHXVK>OdO+GyQF>g?;#kwKUUwkH z6WE%ZY3A(M2({5VHz;*!sTzld18VGbDiMwYfG9}-GIO#o8Wt6tD^Z&55x*YG(TP*W z_kOQuZzthjB%;HgA>z87J3llKGiemg#VsFDm!;hwm;h~sJ%*{mzu*9EZEhW2W$|~` zUOZv&@A=jm9Z_V2eiJMi>u8$Eec?*tF+kL)ObSGQ)2ct@HOPo-E&z^6+@`P`xeMjf zu{&h>zMx?oL+DtSm71!ws!ybWWOBTy#D|fQ!5i^~JSyAvP9*!DTx8rKrz)=TNKX6g zbJVf_CS)ed8m?pWNuoD92pW~sES5;(49<#>7NrGvzrR{cYt$JclIsVvvc{6r6|mx(LU0LjRU& zvq7$Vo6QXkCa8)ztokkh>O%CE7Ua5d4T2j!BVZN^FAR_Ug?w>TV!tKzFj{UO>zZqs zzRVdhhtATJbp}ztkn416h=dAn<#(&KM%O%R7LPJRXv0V>l;CKP1vGj+CA7D^4@GM_ zXhelA;abLEi@e90oYsDtu4c9gElFSON+K8DsPRB7AL;61 z)oj@Li;SGJ#&survW!$x{VW{Jp10_FGrn$^c6z79+4DDHjc?gwToiEt=eCsVYDGu_ z#`>7@95ue(`aaWMx`eGYo=k5?%HK~xjUA()<1{%qK_cPjg^Efx5{lSPhgRUakkHm)v1jj(8IFh(PhZ~V zQp~raI3QtbOA=vZ6oh08c?GMOd=*+Yns0S1tu%^ z|BW2+KXWr=WMpIc-{c4!P3sMoyG@^Of4oMai4YVavEY6{sd?xtp91GfU!I0%g6lDS z(T=qWrO?l7>mSEo@w|(MM2#Ht(Ep3GcL1^^`2Kuv+qP}nwr$(C&1u`VIc?iEX4eL-ubo)n{!NOM5F6!$Jz_Sgiln~*y53YYcq64Wsgx6o{Kr4~2k`pi z9}RRf3WKC)AMmR*gYmSUC@tDd4D(JD8#^DZa+HG1f(+sIK&SusOghZ4>G6!%jY<1H zKQ`uuUCXzE!|DTy{?*+x!KpQ3O7GF%rEvdxNqmF?SB%g*W+^`V7ppxxZ)_XR z>_Mm94ZuDC1O=*W)auEvN5JmBJ(uybzDI9VMt!oQ4aWI1o0bvb@4nQeXUYR;s%hx? zjZ_lG_iG3`$G0{wl_W|?`&YY_K#=6^hDUTC#95KN@8UkXS=|p=#Aai^e-E-qVgE|< z@>LQBAMF5Ntwda{=#B0?3T$w}t~ta2m~E(Q5?Eu`5`xo{Uoc62=2d}(gswkyipyS? zHnM_LfIH;$Jnm9xmbHT@rY5-v(4zD3MIPoagXj#+h`g$#kPe zoPInTwnnysOEdyp|CjHwl?tr`WYx4LyU_U=Wuf?!2~3eXnCKwZcECN_$!9t>^5M;| z*Lub}v|;p77cZDmWr-EFE#KhvrQCDKVGq|?O9=e2VFrq|@zJ(VDG6Hab!FU=DVnSj zlI)W%cl*ccs3OaOwgnv^g+BnivkQ)Wx|(!x3d~AGjjjUZ3E4s!t+WFL%fv}dVtvV9 z!R_kvMU42xVuaescsp-aiceBJ)|ogX+y(5o3K@)Skd+couJ<#Cl}|AsyB8l;GF%!w z^F!Tpx$L?b>y-qE+vxf3CH}SIw?-3~WSaa_DPkdo#>}}QEh6~OZy-z+12pk>sLzay zzL)TEZron&%vN?gy_>hrV7UV=tr?1+K#Kg`5>*2Sq*-6kBxx?}35-3_?1C0L`P$HC zR#+Tsw-S5*oRqmH^8ErbR#qz*(ZS6Zt5w)ri`jnf+{x@1XFW?_;L9>ceUcww8JMQxWe`rfu?*E6B(bB z@mV8n!1luKI1#dhf2QjP2n7Otr=sj&)ugdDah?>OAL#he9E8^qYn*Y7Dh2chuOXR* zvHwO>DmjCxrPidFXq9n+?~zlR5&kR@$E0f^6A{-53`s^jzl6oqG8j&$9B09{m7k)Y z`R3Tt=CPx3Z{W=jkZKsjKw1NtYKhJo8(c3#%A&Bjv|sADV_Ez!B5T=+m0W%<%@Z z&Q3^P=DytTcpmjrmQ)o!_DC!?-c&LWL!Sl!r|69@0Mf zTnmV?4dgfA1YDR7(Z%|0U4&as^ZE@!JyAz#kh`RnsPy{OZF?M8SJXM5j+Ck}61q(= zW9);;m`CaDwwC4`F&u6FRC7dE%y^kaPD|FR6CcH;mrkHy`u@<)ZF8G~%NKeK4o1!A zkCIsM+!%VF=TUux+{%%vCA{#5o&h$>Xs1-Y{1UZ1gw86C&AfS;mDV=kS2D_cAX80& zgAykM?D}VldC3zfxB~xAH(ud0vj<U|Ke$TUlci2i@{ zyl+7EJP5UB4S!5E`n3;&vwWNtrPt!iw(5fAAg|jiM)@GwnEZEY*zMDEDCeIHi4ZEN zil0ZRzi5zT<@5#{9Ccf4viHRgU^hqj5^0^&dJ`z154817Sv+?;cCGzF9cyXYBv4|! zv_^kV4gD&rC-u}ChV~F`LJg=n0Nh^DVbABGi`rSvwA1~$-KSl zL`vKsCkAQPhUxHriIC1%*8MOVW5B|Pd9|)yiDX8v$@C<0$Y;TBH{dF<UlijT4H>=g&q)0TKe4df z^(AbY8rZ%xB4Q$Q0zbcs%UM*E&`UBeMM_pO?#*LWofzC^PL9$fE}Y4ZFt8 zPi|FT3Rtryb;=y92_64Xwv6abd|J=WUGYdu`5`;hTnXc%Y(N+Nr9$x~jy5_lUbMim z0I*t;nq(L#+OfD>J})aDF6y=UU>LB~$#%G@-4e2BlzFdi7Xx@=nhMq1_B!vk07|WY zh@wJPFph1t(P?4KA=cP&ieg#Ml_0NLX{=KXgKs?IpoB;J#>NK`o+YF0@jv8fXo8JC zm+*q-GSf{It1RLn%t-tf$A1e!E!qbqXkA8<3|woA&5l6puXH> zhfOu3o;Mk%ErX4i&N7rCnu8o47>gQN!=4Ldfw-MARerX8o_1JOL5v&ubu^EfXv!>z zu&i}#+b47!j5ly`ZNA+Vb`jk&gEs-WSC8Na^=0!F{WSYNjUmExBXu z*5~`jg5*lWT=P5WT9JAlyG7k2t9~?E^{n*(7V%?3)z_uQRYBI_B*585rDm}b6#iW- z=)TQZjhP!Np`JXG)yOz23mhI7^Ts^)-+HS|A4+5=8}AAmXXGUs6T}wWMK#LJAw0k4 zBEwzIgza^%h9SK@tUz+twe^MVZ+A-9!v)Rr1v~rsQ$nXFj`DCHGx`9wzkYQn&yslo zjca(beZnXg(`S4Kzw|eN5qm7k?N&NSbA$aVUqhu*DYyKik1P@nitf}!Xc2}`0$Q&2!fNa@=xo}EfO;Oz8^$=-Y` zFp6XOoAS?gAC8g2V>&S?lBPDiT3_kxvcSXLuw{Y$*-Jsuf*S9yt|=J|6h@~@k}R@c zkKXNH_HqzkA@+lG4&1p3JEr|QLLIX87V4UcTu~n?ksx^8WQy801u2^ey=m2=7X+0a zV2{O*2@|dE@qEsWXuaq1xZj($i2b?}dNW}unoLB~OS3(#670VQZuI`^{G`|DEzV7Um^fFp*CmeUt$M@3qgV?nS;n;4#Hw(^VZtEP z^hf|<*-y|Q2s?!uvN`!jh|_-W>oj#uSB!XX$|AVb)1(Z|bvg`4FH_9zS05HK{>G$g z!FKD60vM`-m85yQ@CSDSjKF!Jy$r!?tN9qUDTHKT{fE@wOr0RSQ1b>7tG`JHXj^IbE-tF^QYq zz)4*|g3o4q4XT>>qG>RMT-BX@m!AOrmtA13U6lDhgP~8yZzyi;T*N!J91;dHnX(Q4 zzK#{;1htI^15xKk?aw`-_KW0CSe0R)zYSCf?&eB2icB+vX9C_Z>|=NS-P%K z80q+|&+}s2`)ryl7w;p2uGzI+PZz6{WT%pbFj-mG4Jh!WxeQhIJDY;PKr>{b%hHEO zetCr|%gK8@xCT-_#xu);2f!oU2Z#c)mi~)r*#C-G`>#P&%v}FFsHz8N!+u-*UN7(~ zD1L}=sKEgl5_DY{_i_;4ox|i(#GRl5>%4zc#G8{uC!kMl1;Sw@jf;se%2wS&ZB1|G zN+BJ?Drvtj=Z-R#^@E)&9{%WPq%R=yIUS>(BOODaXAj9lin@5_>Ie*^oz+;W3>jQR zyh_w!;h3cV^W6u1hpoZfRl=de=ik%)e!Lp$H^=73=lwp0=3Ra|M*bISE6C3r%q+MO zs(=+qP_alEt}oVf0Z5U?K1o$fycBA#NS3@K8dIUAD5_21wG}B&Di{TOkC_gtA;b`x zc1@(hi=B!HB`Db_n3SFA5MHEA)Mg!L%ClwTt1-!VxZp;F)~%??YM8`I(^tO){RdGs zu>mU33vQc7Kj20DK(ALqFE8_jG_@j9qwa?FYX!oyKb^0aRjE6z+880e>r}6MwR$N+ zvp$Y9TJRC8oM69IQ;i9w+HQKi$~FrkaO=;2XfTzN_FLmNfl0Hqxa@cD4pkaON6yv` z=~~|;uoQ#PhYEUz`47NKPHV{W)}X>WGSvdBa`$QLCEKBO)~gA#q2H8&9D@5Q&gTfEFj?1PtCa({)>Wq@!U^78NgF+Ww?HZ#AN zafp3MJUpas=s??!PilA(U;935DbZsr(VytTcQKPT{pAsn{_-kbex-lojc-ZnK>5v2 zp#hog+Bl)}w-4CIF*0!yU6as~#qVcFH58Gj2?I<#dzs&O+& zg)NEPM+P^;&54L0>Ck+8f9K=j_aQE%>oIMBr3Z1pie!sQ>u)69-PfZ5L75vR!cYv@wVqvj{1c-TEoYBNa zGEndJiyJ0z4_%gq4+`j4w8@i3*sT|+Fr6Ic*nO&KvSu;l@f_CylDgBS*d;_k1vj+C z`RnmAnn+`d!Yl7EGsami)r#Y--$_L)=oWmWLmQNYFH>xaaB0ldKy3rqwQ2Kh%S&>O ze0|Ag$u>_h*bw8QISRusbqx#M+YM}5j|p4^n8f~hx0al~I6Mb+{7KAo78#wV(Vz9#=6{lX{}zak^-hy{HF^f+~F~5oHK754KO(yC=~-Pg5zMF)AcGNoXO1P zC3lj49+Vm2rg7afBJcO+UlX10h5l*o#A%oEgc zGQLGyjF+dP&1o;=b=*>zXUOhNAtu9n2m0YZXk$Y|=@p{xM!x{x^jqZfP*eKSJ6JU; z!02piSZw^x-X23Av zrv@Gz@`629?}p|z5Z^b*L{?>5Ab&kCh@XOc2$3(?mv@HQ#&t`m;M*BP6vrR27nGb{ z;MJA4WOFmn^VcP-%988ZvD?2(73R=jkh1d-g2!~>^=fQQN#6D}!E~JQ)7)Jl5bzVJ zP&0C-324_%5DArc3N&8%#K54PU7+4y_Ev7UyHE1dE)#)2{lsO_w8#+xzXjWWlnsso zJ*>{AcKpDXP}LBPqbj32BTaQJBFJrhnS!(qfMB_z!(4W9UI{uB36rq0Wx&t=jbsV# zlxiGh097bFNWN@Pmb(pJx;RPJG4rL6;vVNp(AYuLJV+batyL4oBu7G44l2p!NEf zxV-KR28uUCQV?WW^SNi!?3b;R7Z5tT+{Tj^r!fmMu3fQKIdF^F0Q$p0u0Zs3X4n;h z@M=p!eP#v6vA%Bu>yYLd0yrX)(&jq%v~qfcH_DvBdDK1}A-B<-k&X1@)ktA~Yh2+E z(dSzwPU1@Bs|}}6Uo^7i))z&ageSVWZQwv9D_zldX*$?8;rt&XNLtu%pt?Ir*xW0s zeHJ&09#Y*=JK5r_*sRLon=CQpP8RcYMvRV8P{+KP-es^-n8}oF_{y(v21<^5F43NM z#^Fb!B`+^DluW5*P8+;7(3Un>U-rV#z&(E`AP}(wLu!k&muJ5O=m&PZ;P?Yl8@wt5 z-Q}-m_bOJp%gD2AO4x#?-`C`<2zXu*i~NcxElqxHI43%3C?4V*qUNt#<|W{~gw&jR z@O4r=6VwkwZ{aWhbt7Em9@C|)}?bMD^8}wYx=9>!Vs*`{-ne-8{BIfQ27Vdrc zp0!mg5;EY}D!~zg=QJu&bo9}u`Np3Zs?~xK&d_u_V~g_Gw?%9{@@KRf4%7i}7NIM< zQW-3qs?k9;37`?(k@ifn+)CIxY6!^e`Nrt!$#W{wM;a=NzjQ^)d~X+VW5$Th<}f}`ybV+XLvv?{fx9iF2n zduxc3XSE-p`t6QjJYT$TYStGqX%8XdMmnb93q5cxH8moWp5TcOyn855CMP8c*lZvw zmj*62|MqAH51TCn4j!9*7)Cs_${5Pmi$lS>{xC1t+Rs@S(*I>SaBTBM8k0+lyy-}L zv2OF>4Eu}w*COul&yD5w9N!!f>ez2(Xs37gF^SO zOBF_ENvm34-JH?=hOoBsQUdhSv*1?U*WdWmk6ff~#W_bpve}WM8i#tmXlB{6n*ZlsE)|@#To! zLe5$BlMJdyDjvb4d-mX#?46_~SQC4d?w>H866z^=6PtLJ4ret!7C0~V#ucEd$4bvS zn4n^%lV^$=aC!!;_G(*Eg~6Y)3rQ|%F-yz*Ag2v&OHg26W*N9m+dEqw4-0St^YeIO zV+Ut~a-g`^x}cH!&(dnYI~f#j@S!XXI_92&u4_w%d}tt56OnMCEgWc3X<*Xsy@*F( z9k?lef7Pw3taJRXpzQd8jP395OUn(8^+qLimK`{A_nLdIOy}{V5rxneId*Z9@(r<7 zD83=X=Z|`5dw=s7UJl^SrOEj8i)H)9;Y>B>n&CPeF@#g*Pk3We?k3@2A22=lo#o)g zZ^g4BRzY~$5+`W}$f zA}t(A6Evxl@-#}7?vmJaA-WnuZz7}i9K(n0)${i5%HfHJTwosV`g@WjiBpsV2Ld9N z{N>_KY1a8;&MEOQD(KH(lxYtq|N9fE7Cyn}+5PJ&LcQo9*OZ#`+umy=2)%-*G24M- zrD7IVwyr<;_8bQL+bgIaIl)+)9We4=^eqCgn@)ydO@h+w)8B7 zAXoBV#HEg)Kf-sWaAmEOnsv#-C$j6q)W@!aU@TeoACAgTv7B{~6ma`BN}#q_n894l zvCt7xG9#qBupE@oC}XFNu+q-pbECDA^fz_NrQSf?(+$kBTSh}Y3%AczL{HBt`_p$p zp5376&oY%cl|@$=3qLd-1LjM{{f!;)I)T9r=($s60ZShN5RU>N<8O;~E$pg77furJBC8xz;h5NMPT zh;#1Z6vVmQ8!vNtVg8`21y%~maBD7Dvx;F*vGeDN|KEYBO&W62(THa^d>$O@W}bF# zBYmYBo6qVa;&=^Yi43hi<4zJB3t2s=J>_u>3TOVWcH3bhe$a&D>fer!NXt^9+PW(; z#n`j3QZixAn_Nq5>LS$f#n@;Pt$F%u*k<1J>9wiv8ALQd!}eZ2p`;1-&O9r|3fXf; zBAe0NOSqf&&-C~yS_s_6QF7k_5;=y>0TO~18W$4CUnAz9p6Laf{C+|`bb`@0>QfGc z&*XXne8Oqa6`wCsd~;!L83|wOh~X2}v1VEEiEXM#aQAz!x>Q-K*lT5P!|FIQB{nIp zIyS~vkFULclIAk4R^AnCb{LXJ5eP1fOg5WCQCg@=S^{h(jx#E9xtUhuU9EAj=Nyxs z_|3#UW79GzUduc=(cj^ZrvjdGzGF6hB&hX9t7JS{Yc}I;p6@8Tk9Z7g^C;VppI$;0 zGnH)(gDJLW3~o(5Ys*4wk5PZ5gwP{5wyS2>$KOjjGKYZ{4v=^}v0s4@$Svf2IC*{< zcRnJ=Z5XqA2k~@l=j!VvL6Q#ha8^k0O*Wt>UF2ew&2uvRrt}WFn29%B)9i;gPbaux z>^gsj>@v=v?`k(wo*Si?{Jt1*3b+$y?(PU$+Irz^K$kI?ydjRl({+GRj5p{b=EI+# z4{x!&ds$?*6;97q0jNln4K;JLJav!ISEAek!8<54(#nEv-48XR%07Pz;(?AO-&iJO z{4@CQ%HPvlN>n}JQjeE7@Mo0bvl}F>-6A24HR>dtfopbVPdZNHYU7cjagQ1QgRpn* zD4}D@^Ms2>dc}UEHnEm;uL5l~ve4K-Fs<~1rjxjMhLkYLfR{*JYCp(`DxO4p{Rv$b z*UJ?^2u25vZf40dApiG(5w(g-%G z%nBiyJo+qYbn@9hfrX9Cq9)1#LL`TaV#Ny)k1LYg)!&I8SB(e+>zM(q_n0C0ZNVul53BbsFJR~Ec)Znu=zgwkB@47T?W(i5A-wyQN=D9|Lpwr>hO~|X(Ogduf z!kxqxdUp50SQr=!oS}~kBKtQp+5SaE=n|>?sY(dwmf6paLG00IHOa{6sw_G|>VpPd z5<$PEYAM6C-+MOrdW1U0LO;<+MU!^Z>nTe&AOEEG?aKF4xjbyFQ(gTDPx9RLPoBFo ze|W}P$agSWYuBXcTbT0r1Ly5UR&ODBmdadlRD8$d8kaIeAba-nXVL^Ct`q8zqZTx4 z(&Lkd_(z*N6VEWX(M{XvI}amNW54WIzl|rA+U~s<9XMJ>n6P5^20|ZDAyMk=;}Pk@ z&yeAj8CZ0{G_V(F%Xkp4(eV9?vUuap#Qz#{4E-XdmWnJlQ(i92wuqL71Kxe^Wqywx zKlSMzWcSij8`W2BwOr{i71^(}(W`K3Fu;u6A4qv1g;e>;Tk$7vW%wpXejPq_>)B!a zr}ZAn7a8;4rtqE-S2*^FjDp?a-0k$hKi)Uki8E#0%uoB;);pTC2;_O?!Wo`!KB1mW zvgw{p{SE@h#Cf1JKB&{34%MR=n%Ivs>O}01gQp@7$3Gaij~`I%AM@U!GbNq&q;=oe zZIonk_eZH|OHPF2JPVNwpP!t3esb~|Z1IR*TD2~1xQpGV&uW_)6G_)DQjW+{bN@XR z-Sw#knfNa^AOeBzt99d$TGHSmPW;7?+}l1hx>wGn;S?vt)oR>K2e_Q>UE1D!_gByh zul^(6Pfd+fpVS$tfk>()HETcBabKo>w?5Hzu%%Yjd%Rk&R%+^r20JGqsZfWNRUz1* ze`lW=C~|;hR$I_GZjz$+*Y$Ilzr_9S%VU3*Eq25&`~Ghsg3_YBVUDO_{#Gpw)AhhwwpF_;e$J-*CUWKT zbhNGdKRbynrc+HS67&s#MymU9o?X6|g!02B&y=61lC&5~*k-qxI!H59cc(ke71;6m z@}tELy%EgW1Sx%>uspgqc*bBFgC@w8l)5~DJ+@918Ko}#_U^Z=N`#v(Na0ED5xD##U7m8WZWS=P9#NAcl_#| z2LR3zWZTs@9IlYL=Sl9HX5~#!p zF6JXfyT12~_hn+iBORHBmfZ#s#1u?a=VEzVQzRu#{#|?u>{1gP=@RMZ2hpK3hX+ci zfdNLYqb2l=cH|;CMKYtzGrgZFgz%D~woPaqgvuF=Qeku^h%kyit7(XWra*vPw}Y7w z;s(q!zGrz7warZTuLhS%Eqs(|8x{f&q#8V=12~QtC%;}hTdtoN9=q69b|KMp1PXa~Kd9qOk-kVE z|9KUYMKqCr`$HlvuxL(5cwAzWqsd~I5bUw#!M2*omPD8?tIKQf-C3geot`L&Mv&?w z7MLiCu3j5Uh2v-k4~*9wnP{>OW3-b?Ih}Ym^0I+L;IC^4QV5#NR6iZeq@UHV^h=_v@kbi2hk`ZnC>>s zPFqlAD&VPtQK-Bzq97;gy&TOp!F2`^WQawq?SELlH~g4Ta>I5cwiNx>-E)^jR%)2!w)sWI+F%fR=~C^xwKgXEo2dMvq8xi*vA(0IbRgc9 z7x(#=VD!lss1C>9q1Uou5mDOBD0y}dR$*({7YuNay4vY*Z2>iPW(@ps?kyv0R9%jd z4tkxkJ*5<8;yRQha49)dsNY%AvV?EA>49>T@aRLe-A~v+e|X^x3DRj{bi+SYx0El& zy`Pi+P-!xNas#AoeXGl0{Yq{Trvq{z-}<9G32b4ks4|di-JET@WccK%*AH{#+3nhK zH5zM;v`a{Wyq_c6F*y7k76*;&*Y1vFe-VM?K>PY_5c~yJ2>k~}j+@8s$erKe!cEP{ zw-XrvBH{r>7#3CCM1SoFYo?LV;E4%{QdjZCYxxL-Iq`qzN_lpK?hQ`-(}1z@fItbp zZ!r$v%YOyABKmy3&bZ2+zRtP@ku=3Yw;(SzCH@Ju z;Ia@vp&6SfoDMvAxZ?jNeE51Jx?d)2%|SsSuRY5rBWW$Lz6nf+{dp7;kRnj|@7iC{ zzM&D7LC*EV>Prm2+J;I)3aOnu=j_TuKr92eYsOwmhWImQT<44Y1Rr?o$5t0QAR|f$-I&L+H%`b6*fiGE;C6`HD zP`RgPk@qN6NUXz7jW1mc+|=K#`6mLEXB47dy=y=dovyB`KMn_!0+tHH*EZ*Ac*Dpb zAaXL(xa!hj3ld|gz`jg2Mm`@qQMX0^tRT_;BcN%`0s1d2ga0)k(|?Piq^V$RZD!*7 zKZ0IK*%?`wF=$wsx>^!)vT`vKwHey${YZYlLJr#002k;7zhvm z>?Z~EvrB`3{I}zO(f}pI|DOKO7bPSB=+EK5|Bn1W)Bm{+02E#T05rybZvjLAa8S@N z(2#I2Ffa)4aEPcxXsF1@sFZm4m_&@!%uEc_^mME|GJ>p}5?plj!dk)-@`|czsw@I} zCc4VTGAgP{|H%Xh9svOr36%m3jY5f?o?Yqx^Y+~jK!OCEfGB|g5d(mcfIyIdzJ~z> zKX(fDQxg9vjQ?{30tNvE1BZb8x#^z^S`h)jKp-H%pdesipg(ef{C>^@K#{P$;c@vsi;}m*f}`4xJ5+8#3dx9 zq*YYa)HO7@OfD`hudJ@EZ*1=E9~>SXpPZhZ-`zhvK0Uv@zP5Mqla=#mDN((?qj5`oHMM(^R+KQVjhWL39_FOerDaz7__YDxV*4=M2 zQF1W8VwXZDWgw}dJfC)?$zADIq}71JX3gKG5Xg1X&TI9l7}xjOjyWV0pnQjx_E?wG zahb3CkSX0f#G0;whm5iK2Gpt&jHVggrro1G(M3Oe9_G1ZIVb11QoJcUn{Gc+cAFRv z9S0i*Yz%xAwLI=vk16#>O>&*#<}kf`uVoHKcnV9}#t`VYSDzsgFdzO^eQ3ep zt|SS*|C6Q!N(ogtV-kcNAwvC7HV!1AQSRp#c`8d(7I{%vt>Q_hi&zRODQaQC%VLo$ zDKJe@v9biREQ$tDSr!FCYg3Y`nni*vFZckISF{)kL;_{aVgu?KKeyBzskaYajJ->Hgn z1qXv<#3=!#BdCf%GGZchJKX~QO8G()C7U`yY-oA!RRN&10lP#txho$gv|vT8NY`Iq zENy2ON>{|s;5BY-80^neonA>ybGw`~rn;VO(qRqtq{Ud<)nga>PHq7%ZXB7cb0qks zaRGDp6(A^iC0UtjmogTG0fTl{`LECR0zbgG3$@U@v^-T5xH10dz5{(1ObZ?fQ24xW zz{ykfYGb&)6y|yPg>pGLP4jY1{gp%U9|y_+wd+15b(?7uIB-(o$*mwzH}KX=UnLLA zYc6sAy?-DoUUd zMKPY+qClKzd#XcaMG(jm;{0e~N?>NHQfqBts>ojst*Bp=1yEoV-rCZ8++ig*GMhny zfO2Rd8CkGW)R0;_0BXyGsicZe1IXK|+G-(bAGJB_rJ_X%AEsqKnBJ}c#p#mTznjqdh! z>v@W}42#i<$7zLJ&P63lymhmeTG@Hlyzh_C6+>~|PB$YI87%Pz`k8e{D2Ykwye9Rl zrJ-ql5ruzUzWk~heO(f-5(mnQ!F7#<_}974xvn``SxMw~7189c`F!GR#JM=)+CKuQ z$J%lZZ0qVy-)Nl>(JrM_rU?uURPObt#^!^CFdQvt8RwI-ko;0WQ|SwoLjVg@LziQvTlrM zmqg{^3Ps|fZ5O(Ox1rI6_0Uxw&C;llC~Gn>tUG}RB!dZ z$QyUT1`_9ww#5z(r@V}J^^}9sX=@oBc)H}gW$^xr%)9lItz?;YL`agX)lt%_OX^2Z zko)}Zg1?U!S{2^_Mo@aD<(TMZI~EB>)6rFmcxiSN4!UDdL!ad2rLCvRQWB73`_BtX z`9ck&&7oJF!skl;Gxpp+3=Jo&Tk}G0tdZ_p6}#L?#qsrTSNb7)zi!%27aEU>_>~-P z4B>5NV?w4#XvS;(=+9+vlp3E8uX&e3FDE4*6}0($*63{ZxiIj}@%%3I*R)&ngSX^t z%QD5|1gI$`q%fQrjjrU+)IlU4OGd3m1G(oxEXz%zd0Y#?7gZW8M;I~1h*009K}7`K z)2dRP4?bnoSTyjWjFsmp*#yZrp`{%Q0Lnpv7t)kKmIbO98csS4GgHq>tI6&fhVqiS zNrE7&72DQ{W$H-X@6SI?dev@byN&e5mcbN{x(#N4P=og3F{&uSdH5w+A@}C~8{q0l zjr>nsYJ|iv=D12$+KNqqOsq1YJxVSOqIVGWS@%`^93+Hkc>z}JQwdO^p5p1^<8-4J$Q#R)1DUTBkNT+2zx7iEkt zL~Bz5QBheIfG3Jmt(O#l?`KE*kpbAF4ThBjLyMwmA}>G$e}*(A8Nq@EwFyF??Ipxk z{p))kwZrR#M?o((^$SG-cYKyVxcRp=m&h_4wBA`Kl{)F7HjoDDGPL*dTP3!6Lk(pI zc~pSs@<+7cE$?Q(NOEB@jU?e{KWncX${L%CxE4|jEH6(%P7~ebnN*5atI>%p5#BgDrY)7b3!y6c;?exG=aUB;YqNYxr z5uGio$K{1vMGCbC%5xYuEX*kclv-)dIKiIZ7Vv~a@u$X0ZeR~$m_JyhV=<3{{)+GV z5V`#ZK-U>%u>YYKbC4^m7xC`*-SMk(a-0ja30rPlZBV|XXewsfzl?78- z!2!sq9}DJtsK%URjI1n+S_q}JDGR_#OR8Qlq!0-W8$QBl)?wf;urb`Bi#ym-oqU&) z8jp-WwF|N|+I`2JA*3zQMzniA*R#dZSK>ykYHHN;iZV$|*rqzn>=hqWuj?j*S(NqV z(G=Kb4fFxS7FkxVA~feJnf5@ue*?59Qsd-Vu7OVODoe9{kOguDx8rZ?+G*%y$?L{f z8n?<2^g~wjOhJxM*79;xp!z|p4)f&1$DFWc1wX27bm!6=i6^@qR4J|oWmgUX1)PyrBVuNbLHA)n0egZD5B1|&tvyt7fbZ>zV%b;r&_a(MgP;~nCl z%HII$eOfoKOY{5V$$Vk%H7%105zoMCz;5aWcC-YGoW1T(%M*ec!K<|5vkJ^Oh?aIE z&;|q_e2VxJ%vP#xVRR~8bN&R$+Vw4qSnM884PN#e}g6C5;5s$oTRnP2Yg03%bnQUo7Y*%ULn>oT#^av5r6Q49+Mw7(Q3s zS3}HbJEW-bLl_&Lj}<$q)GIJ5pt~mOQi@+RCHW1siwuwuNIg4RlW%F!c5(NY%1qKL?{V zK@N856v+Mt)Gz)Z&Z{eQ#~MYoCMdXO?8zSN0B+AUW=aw+o{M&aF{ zVsFOFXxp@XA_N=*upfU06Ae+C^1_r#X^LVcO>Biol8#~LJU<&hP3CKr1e-#h%y7yP zI&!K&W#t7~@GM!CN;m)qs`7$hWEdT*N_FG~a*8sxX;O_;N2j;lbnDsI&j&4XW-Y-O+9wH~+2!V)z96ILELOetae5D zFr)m0fP=B6GZA;hi>~=d;T(pSh=B6fRmH?|o_J_(=(_vX?SBEGYQu`)V2-O*yOFCo z-i`g{dA~x0LlRYBfo8etRE#BJ-B>sZgvw%nX}F9bfn%E!{k`3{w}J!R#F@vXyPihk|KnM^sMmDmYqg1%kSbANs6p zHD(-vBIS*NLLAo5k;&G$pO6-2%Gox|25UB*y&SUkh*5d1!;LTTN>WV`DnMj2Y>hoR9 zROIB9SArI`u#%*=9jO;36MR}vMJCVah(Fh94X^NIt6%-VovrP1oV0!~nqcz1;ax~` zR0Yc+kC(Mck!(;y=(qD#g>S`jeXM76bA4!Be6iJx#XKms`G-j!swX6eFjq>mVPw{p z*dXl?s*||cx*cld$zqS5vf4#%rH(mRpSS3#*_%L~9M?;y>f6mxmvVsHE-EkRfeS0U zmKJ4<+xH#p^dX#R?bq*o1ID_3desW(pY9Yrnu&x7TaRI~x*;$-$1 zTOfI%O2Grx)8)Sws7Z`4?f5jz(arqZ51KD)m^T_0>0aA4Wz5WwY{@>eE+QZliq4aM zuQg?SU z@}d@Y6{Yb7SOwrK*^+INm^lE;w1omO=KRb~%1gd;9d|Vz&*LHoIk-wO4tLA3uxc7| zI2E{{ELVrF@)KR=*x9KpC4R{p4ZFix1Z8jYreaP!>ScNm(>qNzbEPKm>i`x>#S`9T zM@i{G?{5HibC=@*TWe>LY)4JQ)|L1K#O<@dp0+l7=WSoI(^=?sF!TVq#y^9b@uzDIkE=!xy?G4L{Xb(1*~Bk6JySTxcs9DFSJw!E~M2*Ur*tK@e)7?(D>6&=6ZLAB4Ou zPj)YvD1rlu)D!&=4ZqmHpm?s76|AQ_{Ki0fwAj-5@_H`Q7^i8vUqw^vS;IIiC0 zIFgv=Rnjc?4NJo3T1}{=wcDJf^mka2m+(`?PsE#hl=q~WPW$cH>hH%nm9kuws$y%L zQC&wUCzVzS7kzSEcX85)U8ra-Th?1F`{L9c3P3(=+ALQl`fH|oxI(-V@-v(z%EG%yZt`V#U=#IC?KZR`L%WN#!KaZ`% zITG2rZN|p=+h=q!(e#;uo+_8`v}Dx1DOF?DHu?{j&(|x2-YN&~w0h*w!&>aU5BQ|2 zofshsAxbSsyjLpbaNS2tNcCn|lUbh)CA5oibDaMiD2I;|?icMhyf|cYvE^5ZgGOO%?)YC z{U3~dWl&pD+bu0ERvbccC{D2AuEkxF;4Ln}-HI1WaVNM14eruHi@QUy;#z32;`GZq z?{{bJpF4AZojH@4?7e5sUXQJ3J(q;_!|1R}cFkq}VdN`le0sL#Ns@}Gl1OUm>E$5d`aGSe>f9KgZ zwYCm}Vf)B;6@53?v#WzO30K+W3`x2Xu{?E9^Z#-t7m#xqW zh3ey^lr@s5dIVhm+E8T@n7ZxXK9_$l&ywC;3YaBkgz^T6Y}lW4hN88fu2-T$x4 z@8GNBBEi)rt7c27+owtBnAH2XZPnR!8KOY!>%Cfsc!?nk-QX@a?QbHL*$v{Z)7Q>M zv1nb~lJ%-*CD}f>C!!^KT5F->?wza0@}K)Pm2o_kA>nG?D|G?@|0Skouv8P z1X5o|8Vc#_=w$niVCwi?1S3UacyRMxnj>MC45S>>B|S{Z(YCHKWlBfRWN?4E17G!F z^akRTJ1Wa&C4v+wxxHH;Ewdg=ihU@7b?A9_h#vQvT$-{xy3kWUd~4zen{ruR|47n% z#L*ekS5A%^E}{DI;Jl1h-+V5$2~t968vI{e2j73;TKV(jmEF-4|IGpp^Xn?V_L4-q z5~!Zf@^DMz50oP~2Cc;ak6tsszMKpu6ZmF2nc3awR@>vDHwYwz(QQLhnvwPZ;~!)@3Jna-l}) zg)3sI7)P=rf1p;w;_oj*K8vT{*FkBzXX)aiR(R9CjF&ahlUa6(t-Rdi8lETf9!-J3 zF&qpmZGswL33_2wxhscQLgB#xI|uPutZv_D%1tHGDf^ySn>yK-F7I{_2>_ z1ggP0g^-NkSc}@h%gQ>op64}v&uWAwl0my3>fUQJc|i(J-2ou==Vh#LvmrIm)MwN+79g(_Zu{snjbTC zb5|n0#3??FZ&nqhG1)nT5bN|*uNpl&Jr}i0TV@_yr<*Bh3Lo|k=H20%tFN5cmzGr* z=G5OElB`TSF>7zIS?jULZB(WNIn^99+}DspSXZ(r-o0HF--dVN_Qp?*?fkVI#}|6G z{7IT8pYq{*ZCj1p;%}VOSnEWH`D6^bQ?vT_R@XC8>eV_>K_jsb}yx{sqGLk>F zDC5wAe{cbBtee$Qx&Dd+ubOb(K7_O~7~`>2472R{d3<}QxH^RzmaLEvEf(C(tEHcB zf#|-87C8@v)9Gg0F$&^mkb7NFRZ-7t=vvG;zOQ!WfQ&ycN|1$ZR{n~sKstYjwJcL@ zq>}*g;xv%DI^@jJglu<%vs&Vz9_bcZn)AB5b%FN0S@5(T7>1eOAmFo2nS-b_?{BTM zms9F2zL)|l<}E+4ske}auV7koBhSfguc~y;27^|?%jl7VP&y*3pVOgIKp8) zdU=X*82wE9)c9$JtTbAz07jLxTSfaKXNQl8YFqNS!g@uw;`>cBFFgK zburXUPdp0~1OMnA^d3j>J>KlU^td+keK=%RX!~r5v@w3q8BIR4MEz{qL6d0jjkv2@ zVxZkFV1mbZy`yN56}LY0YUe^TAp#S&a3+;!)$&?4*pGm9EnopxFH#5ga~o#sh0SeD z_FeD$pO>HuH!WhfMOYL`1)0xm(wAmKW07&y9FTxrk`o<54AzhwX-dqNMzgq=RI@kbhOZvyB<(sWrB@6$F=hqLX-WKT>J@}>mnb#8o!RUUMpjz6M7prnLu0mQ( z8YMADk&%INIGyKT`LzPkHJE_dw@MU+)|dr{I$fnf&i?aNr>}W_l()pParSr&S6nyc zyX#ST^`I??uPVFM!!E{&emZ9&wy=*IDwN8hj*RWM*2{zQiu?vaZ$9ttq2$fp}bwgRLDLq9UHosr_x&bN6UPkk(X< zQ=dCJII9xgv-dt8RStQq=P(U#GbU+onSKWTr~pTOoCojI4DFRpYVB%ID=d|A#H|5k zS*RLuijXI|82fqiDbb??&U_x1g96dFj(e4n{gQOCdxd?LSFC!JJjG!8!LzcpA%pU( z@^_YWGc7Q0(Xuldp2**0!Z`7R4z3Q}ajgY{yJY-+KCfVx-7MRa&5DyccM0blUt(+G zfv~Y|jWSBrAB3#i3gp*CndD=uV6fvLXYSJWAJSW^<=DVV{&T~!S;4*G1FuYY^(S$*%turr4b)N%hH-i0n>4u!myV^T zDH-xOUYmeAnlr<&W!q@C0pZ;B0wD}SLjTZ+DlEF6PZ;FMn5M?wlZ$TZRsGZ9!*W@T{4EG-?(u;+7;r9%dHp;*-qnd> z7c^R^R%2xq`?7Ifv83qsWr2Y9fT>(#Fk}2`AP_`YYR>_nppiOHl(av)B)v9!*dg>| zrG7$R$c#c4SRdq4HOZ#YiYS!|`WEzuq0>q{QMkNT^3Qe}im6od^z#uSi4Ev}UAPB< zBtFeUb~XoRkazR17W#@0jge#T`|a^>w>7`-2`XuOG$$a9V^8z+9_Rb5kCM$b9mHbC zdYHy56w8Wo2U<@iM>z6kp8{^P?~4JQj=vPK`d#N&4-riQ8{@__{2=5-B6MF;!3y?V z>b(Q-1UBY(>j1u`_-!aWLNFE_1;>b|>vPZOBC16~*;gpz=OZeT@2Z5g@f}R9MtBMV z)4EbSI@vxfl8XHO&sG>`3hePgwiTs6(+8U^M^wzISaSC^ECsbkn<7|K7M?p#5RN5qv_04A?I*sCxj!hHIH{T@|3;R zXx2zsmyf#cKwNh>wbUwfuzk_gM2X299bc38*aYvvVpbOp*nDRl*f?(3G*`kO!igZoT){R=-azVa3|=OwW&x)}O+R!5uq#M*74fbOA6tYJ zwt6+$?ZB2hcf?MqLo#=L2ubu`aP)BJhj&tU;d8*LdkRB4t;Swro5YS zbzP^`f+R>fIkCytbm?d_Gur)yqU2pB&H~`C!68hobLc!XsVy7u6Vc;S03#6AEz9-U zS+DQM$lCY%;lLFFt0tni-?)fAl|+nI1o!b)5SheU<(9-h{zEIZ!q`HtuW|Lmg2obhJ2VUZn=EV&pY#@rTjQ9W3X%uQm`-RW zwJzXw=Ftp~W4N}lIdmVsUm?m@MUxp^XL3T^mC(E8dsEZQV^QUoR;GHn%4kB2!O7n3 ze3w#)1-7UJekRT1Q4Xn2YQ_2qiM(r1cpk6m?+65!L+s-MT`i!8^~JN3ac?PryJeEc z1HiM%769^A43`nrM)9+&D#)?NNi84tU}o;E1owzLP|BGT-F+IwW~A9LWv}_&)3{&C z(l1*^q?NO1RSTM*8~WokNN_?Jd@T1|=`hq}Uh0K|`j4oHDxH=Eipsb7sj!9y?;1;o z*8@1G4@Ys|gtOb3%m+EgA{zH?O zj=HFkjK}jA0sGqkOtTuPdo#)lt(FJdP?|{zL;REKkP`&_V{(?ea(#hf-vw9vKgf)*ck5cE^GY# z*m7%AV?2Zty@DEjx$%k-8rSgR_9EG1${(!f#cCs+`|d*Ahbey|S})lrg*SC!$h41^ z!&qacwB!45s+Q(n>C9yT&ag1ok~d)bJE4h1dp&s?4ZV|U_PRX8NTbPsfnND^75*b~ zUS?B43GEt*m8OEzbv^En;Dc^{k)BCb2~C)yJlh*<2y|KcCu)XC{B6?q2UOdt1hW) z<84u;1$R4i#0A?IuO5_1a%#LdVAR$mt)Gq;npRjf}Z1ct8cpbn{d#5)YcQnBrh%@E#c;>hImHi?406{=&eW6 zlI?OyQXY0+Wv{_bEh{?h*Ic=415hbt`4xP8&X|Pf{_8eGpfjP_-g|bRxtKxUK_ zI-MPJyaqUQ&1gCny#ApPw*5sgPMl8OnT#n@IBOU*wU0qd&P4=OZ_nI#2gS!h@esvT z@vB<39~bfie{JrEr2ZVkec%Kbg)=8C-M1Gl(!VK}VKWQNJ=**CaHhOd~kJKqMJG9kq!3arTLXOX+}2H?epr- z(bgdkBQjTmfaw<{#HB#!uV&}a5~iH(SXh_mz3`iu+i`)xr;#h0}W8c z1Zn^m(_JPVeH~9ci(oY>8!v)m+NHOXUX7hBj#V* zevRVo;tb-iRDN5n5TC6j$eMzqqE3pJtugffq1m0?2FDpSG{s}3F=`k1L#kiJT6A^X zw5u$OF(R=037Q*Vf;dT)p-VU&T#1Fc&oE<&)UdSq{G`(CEeAM~Sh@|hq@`PU^fC{Rj4t>6BQ=s^E%1`7O+^&MVJugay!-EX_K8~E#|k7UIrw=Jny z&ic%BB=7n56rIncG#*1C*^GIksTE_9Y+z?yY%nQ-^jPDN0pO@Rkfu(!sjsv z9j-X(YgDc;;9RSJbf|RI(p4Mg84X{W9W9rH?udQVL9=!GCGK4@qWIMn`1sPp^n+Y6 z*;oiz-);jZc1TGC^T7dPkkpu$m!_$v;E~8X32nR0267fm=4Ya&XF_9lm#p>$P#iG+ zJY|3hF`jesfqX3urNCB8m^`hsQkf*M53-=*ICMnODeON;B0|0zET)*YWL7^|s>Rfq zwHi46Y3$>t=v8`Qr6xLUbd@hMBV?fzbu4k)D4exZnl}4tRE>=PZzIT<~$l%OW@$ zm+~ty#)}X|pj83`f*q-S8_%Qtr{!6I3OTLjFuv04a{DbqIyNPHVsR~4@W`E&wyoOK zMK%6zspk1mSCv2HPt8KIz^7kVB36mz=DoPQMl5@8yV6B)K+cm}971+GVUTzk@M0J{ zLh(ndhtuUGVC}V)jY4k7Ky8Lr4n7M-dUdHrs@AU~H^myTC@jVnBlC z+%L-$=Vf8NeNLS$cZ_G`61XVrUz2(|AOBRx2S86OaFXPIbbzbiZ$>hb?*xl2g+wXb zx)Y$Yhvq$sQ_e7pt3drBQAlIx!auZ5+!RHOOP4)K1^dOcgH{*w>Yi`vJefuB+Rh0| z{R@#K?Sl~N1exu1m}a0|C7(!{K0MKLWDFP-R^tKd79Wg!J8+@9Vp!? z+ivLT0Ey?n2pq!{OhAYV6>5RE&ujc@U1zeooo^qYJrvc)erO-u^ta8FFxoZ4jyx!6 zprZJ%DaPLp-#5mFpJ?Z>9ryDZ^qmPm_~!?o)d=h~dyD-;o3smF6AUjo+}g9`%s)!J zc$&VfeTT=4fYps5(>0N3;QICfBy zOta@P%qYkZw~w9zHf&I?63X@oz~S^(Txhpu(8gku23ocBgoi?AOYvpNtLjUvJX%{+ zSY*+Jk>;bX6n7|(Pt#NegZ=xuLWH#Zm*W(3v*K9^C_iU8TM~sE!8L03i0kga%3D9# zKIoagY^bEynQ}AIudw?;>qTj_mciAtim5u4P_Wggo#wU7=iom;c=j+l!7*I!<%oq- z^EB^0qmFp?8w`I-1$_eT;E`;^QVsye)aP`0<5NYqs!9q&M5Q8gK9oZL(lhl|n?i?O zoD9*vfGhgZ^6>tQG9pSpmRRE9TKPPkJ*B1Si%HfpIZt$IwUGILB-?nlTY!1|^QwByzTUI= z5d~e~T z+ddCx8!%k5Jg+I5S>WJM2$OOfC0Si8)~#h0bQ%+N9&9Ypi7tFDpwmG}Mba=t_{eXt)EeXOekzVGvPZ7u5it(FMQ z*v-Bvo$K`e0CAi4O!^6N_%YJLpcstvR;0Qc_%izK4JOkMT$A0+uoY>w4}ZF;ZIHpdZgj_<5)f4M30 z6W`|HLa_y&fRqAnb`p#UE7B7;!VP|r8#H<^t_>_E5?Re#pFf!8ce-`e>URIaA0m~* zBJD3U^x%tpJG)z+p=gKLY7%L;-iBEzb<1gLs8ICOI;0QngH6i3wX~G15Bfav2Z~VT z4LKpl7>+r5>iG&5ra26zD_ma+rbiqEm zf5E1x-tv-VIAYBjq5z1*P{^!I&Y-GhKmFUp^mXGSRwvq;Z#6MnILOY&T@6JTuWItt z1+CW<%iPcTX~Gola7w4v^z6)! zgGfi??ea=DO8|7PJ_8!hFlrL&u|?w)Ih_K-7X#T4o2_K z7fRRN3+bc{ob?$-5$dmZe zT4VVm9E?>ZGfb9ls|CzY4`Ll$wb{bse!$JMY0PU>E9WwBP}1;1`K=^d$pgW@f?-lG z__NB#inLBoL8BZ**K9MqBS+2-8@+t1Z3koFPI;yHTzYcXG&iSci-7CP`I*VzuVy13 z=cp@&s!N*d6n?}|9O@T-{Nq45vw>=G9|Qzpi}r3TQWwpNrSK#xy*LAx?Zo@iA=Q7M z&tqFJ%lxgFkKc6yXBA<=C=z4>rirTwIUPdd+sKDYFvoI89werDdyoqwELsr7G0=rh zV|e^L)z|TG9Z``UkxBn~`DG%y_SGEf0C*mSAsq!~3ovhs%8gMJjc6SKG2P5^CqVm$ z7NMsE()g6&N++oLq1mdRn~whMxBiR!DC)h!)I`nIy9Lu}QBgE>eHIDy$vH4pI%e!% z4jCe2s+0)Z4ZaW>`O>`8!p(?mCi$!Cay$G++d4ly3}DzNA7mqEQZ<2<7iLvPltI~CJFrTuaiNK+p&#^* z9ABoIc3Z+Htf>;#XfJogJKxlL5&K$x_nuOH@0)H~72f4capzgnH%F#@OLp|N&reWP zP{oj9xJBTq#s@{2Oh9?%HI}#V11$`kc1s zyURhxI?SFn6Tu%^?QD!A=v?>GQ6GCH^+L=jQry%mXu{4#|NMO|@@>Nx~ zUdB6jY!UJ*KjwGr)tM!|lhB!%^BfP8;oN5&G-a6ZGR994?ZfC772HfKDJO=DB+f6D z+%%k7WXt+vnA$u|QX=TRD{L$@gVWSPl7O+Uz}N|;nI@kUepn~<3<&@6d0x}Z+TaIh z0;lg)7C6GX*mrTGzn++H5(H!|uSv(w;8%s(jC} z2HM2G=?ynDM(GY&D*(6?Mtrxw1ajb?oUutqIE;O_wEFvdy`G1F^;k8p8u+6Z-r|gd z>krBOLKC(R+plI3mq7;DW7YUiHQI8_n^K{Q7HM-rn9xrALh43t-a#Gs_HUbxJQV=; zb9$^7?ocPnJxGRQ$-Y!tY`Gx5L)NKxiYBhFNi2xLrE>z0cPjw(5cCbvskG^eaR+50LmnV>F)Zk6Z7B0VtylV> z9DC8-RG@p^Z`|C>_jc&_2U&JQs0Y)h=H_Id<$^`aLSL|oq3!BQ8;&OXI`xcvG6u(a zc(Oy+?1t%m&o{Q^W}>cUQp8_{Dq}k*dLmh3#o~qHJi>S zK5ofCppsg0JVXEAiinQFm2rEyB^UqF%9ZA{{XEPOP0A9O#t4?+J}7~+##3R9ib!a8 zz)iIeRa~iDmyYHHld=A}tj_Ki7Ou<&6-Wyy`c`>p#jVeiQa26-oPl54 zu!uoMPE0%x!C6CBWtx4o;`55GsBVa~LGomYaMm1JULBUd^rvX}eyDJFmb~RxMGwuh z-%oxeipzc?lT7$Zw}(dkG`vQXLMdsE#3HA_J1MR8YP%n#LZI+P$)oYEel4aTK!ZQ& zbjgJ31;|!(62Pcx=n5>^$D51&Te1d=$@j=fR3s=>vfJRLy}S=khgOg{d8lyoO;lYc zb&_n=_DM9YckR^|B(}^10{iFthKZ~Fs8ESISAG+B#7cc?lkoODVIN_V{#M63EXE4* z8f@k~s*oB@{zFseJfvg|I5O}a1VU`Klq@yxZ{|xpLhYDVzw$~gReq)pv5qcd**r0H zm{Ux0MJfKgt*flycIUG{xZ+whce}=}m6)4jDHcokZPR&Q5hTYEGM6J&EKcw{$<$Xm zCP@<3R6y)1HdSe`0r`?)j$+rdGr=#Z>N6iXvo|ZXM*(2 z)9K!U1-d28VB%gM)}`0~0%nVcDLNPwtd_-Ryfjqi4|T9SRSU`6$JF(mA|QCoBp^= zPVAy!3>M-NE?^1lhWtDq5{j5Ve#EK=mJ)7SWO4c{t10*jROcTcpqv5tS| z_*CbpDMY4{4rm5KbHC%BEr&g|Q_m5%C>gcMjp?PO0LOyduBy^captj6{-e_yOu#JL zI%@__dikP<`>W8zxZVoL1er%p>V%vvtQ4D^MzV5;IML07U*jXoUMdIm$ARZ(%LtVr zR&$C<4qit4tC2*{$A7wnO#s_Y-as?~NZf zj}6|xnHePzWB$%V4{N5bj;GOLEJuP-)t|*Vh~S$*`P_KQncpc?aW!JFnbx)?SARXh zaq3fk+4CVW%Hh`TH?jP9$@m4=HNaH=zQfqlxX}#UEIq@`aP?wId?*Ev5RW7YuRe@-Fw&`yvp3=*K0G%& zLHe=~?fk9rW@YQSgUokEYTMP~moba33kgz+oIV#}db>@3u3(Jnx{nD0-8SY9B5mdF zrA~pDJ}=N@YNb9dGyn&pa$ci*Ye92Ncrm?s4J&(c`@;1wZUZ@9@vb&8F+W!J1c}X) zkCa#7c6n8})n#+4ynWvOmB@qw>=b(clRuEd$UaQbBrmMa3X*4&c2|$AJG*Yrmt*B% z6nmxV4|z%{ZHg_xx0}7ZhRa55b#hS2H^%sm=7n{WuNTjK)9h;z3VWe!LC1T1VqCAt z5Tor~`B&Rdt-Ia33cQdO+cT@dj(`_t1u>xv2w?KR2ISkK*Ou1pvsDy3B>3`;370)y z>~7nJn?5JEM3zu~+q|-F_!1nUQd((%oWqNFkz``*GP{3Xf@u?^8xWvxZ|T+Mr%M|E zmb6um-^Jz#b4V}cE9M}t*BG*{%5xveb;x%U$`=}z<+Y8xtYX-X8*!Jcf`M}0M;__3 zIbMRt8(J*lx?%%DK-2JhWBQ&+5*;bS_RiFQ<4rbht{JRw`k3VR%tE z5fGf0=IXz+fJgY6$!s>s9Xq_$6?h_(Q)%Gr0uaL#m+0QP(RaBC!27P(r))=5joc6 z3lXjSCVLEXP)S-SEyVrWd0yZrW~R@))73!6nv(3`pzR?M_BIGCG52=mwOM();EJrf z(s&Y!lC@>~04Ci;r^ah_W6z77_W?LjiZfw6Sv)wB4y6sP7dsF}B39XB)28kD%;D8` z#7df$=-}9zWW;-c@KTJH7Xq^yBD2^978Wp#^>45ju8yLID!OfZ#SC2+b^J1nWl&Xi z+-?U?y=&d`vci%%E;54{oi^~>wFK2hyitV+%XR|)465iImtQ3LC`-lyD7)I6 zB&Pz${gCIb6Gb6|Ej*+TrEW3*9Y<;0gJpV}0st4J#&7CDLwDUdOMzt#1lVNP`7gv| z56I((2q_)wIHMwLaG9o!r|73o}Ue!1`#&lI*{MVpostG58ree1xkrz;%cz@dDg>$p{_a<*Pae3emN zp;(x(DV^&fhC92ga3w5%^IP*ZYAR)5^J@uU=oP|mk%ZPH^hE7w?fWu!?9Q`+@cra2?$oKs)S)kUx+qFR~ueHwL)J+Za;DP-0YdD8vpVf;sF21{u^f>80| zV^Yo1KQuj~g()VEW+lmSCoF^h1~mh+7dXXvd(}8*WjF`&@hEiH5I{={t;Jnuee`%j zv`#p@GNwCJdD=h$JIT^eX(>Z;78=zIBGM+JwM=uXpg;&;0S(%k;YGH46rj(6Jd{0` zS>7(BhRo?^PV7j7t2iyXK4VfXlwHt2$gtLd9c9;ZV>`oF3`PN<*^<`jv znuc#OT=#SQZHZ`tWS^`LA&eWFS>>eOAdqnCC zrJ0TI=O>vA^v9o%So$~$K0)*-ycYaF4u9QVQ)Hi-TdGa`B^V{2v17Iw_0EXwnuG7w z{m-{X_M;zzB9d`x`e^gjfVqcujJEqsmIe#bJ^nj=AHa~ynug&rB9G=30!vZ}X|`!z zW*IF3pPzAdjbwaaWjw3QX!-K)p&)b>Y`0eII^wFpt^^kn(A-y7HctZYB%t~+w3pXn zUW?xCA)P1RnP>=HQF;S2A;nhIPA7-`MrKgrcIW&wU7KkuV|@gc;4AL+ye@E2$aQ&1 z0{w=^Z+$Wc3WFLg8vB|h(hI8n(syD>y~wm|>RszXl6sbGP5Nz?Y@-~fH5fj=f+1|5 z28twwYq?bzEJSYD-hm5+{HmFgG72k_Poi}42kO$OetqDxS;~*K$^RScQ?1oXD0TR7 zhzw*u3^feE=pT#Qbmbi`XZmu19Z##J@x9ct0KWO>S0C+sH^SbzS99j2pe%z)4wJn=g$HzuQW7JlJvQ@98 zsN!`x*0m+$tVc_ZAhF)XL{F2_rL5#y;DR|g56Pse14%rGgsI73UlMh~dmy;W2A!8O z!DhM%%HYwFeWZ-QUQ57E@TVT>*_4$^HB39vG1^FXw2fb)2FX*SxrO!{p<`ze*49b_ zU&Wd=5G5_fH#dEFN1-vi8k&K(kli#_<}Gz9d8X2!_)BZ1sqI$L&uS*RTWfb*+#w!c zL5-AOxrc$@V@Z3-oiMXg7uhMSy4o^*$|QaCH^G0gd5Te+(q@7~+U|~|aCGJHT(t*S zFEu}9zl@$EQSj`*!I}J|;MP3BjW!I)q^Byw3cbULTx|smnT2tf5ewq~)O`8AwaL#w z0)Yto!8k}!1rtFOy*XnTXw%WdiG#{6G|ADjf6K%ZmjGkAA>c+X2n}?cfdvfb*N>A& z4kinbN`6%Jr~Oewu$^yd*b6}f%UvjDC=UZVDeJ@SskPCS%F8hKMVHr`W|g5b4UL$l zDLfyH#^yZPPM`VuS}s>d4r1;B7#i^{J_a{HP4ocqwExhQ^OkZ3LyxtM*G8eeC@t}Y z&g*>N6)!BtMS$F~Tz!|`?pwJ)k&=5gkRT)F`WZ7F2Tpw_L#4@$(cN0>%9pc~1r)8n zZ(wfAE{3+mqJ3Avh0LA;p2fIaB%a`3L30`PTh8NZT(5u+(5c~Lo*pzs`s(1$a(8cu%8?X(P+C_-m z2IOpR*t9;v-`saV1aZq8va!FA2ic578wkMFQ`O9s4+#=1;z@&XMR{o6i)~BHD6&|7 z8fHC125@m7dFq;*1s)mO=_arza>+_q?UhCLq{Nb#g3F=|60OZJ3y_}!rADUkpFt(} zZ1y^+2XYH0c}*&`10Bj6XEqwOjVUf^pj&=%=Y83j$B@D%w9_DzqjLJrDM^Vs<^vP5zc9CTa(8yP`B6f;ZDVw*+OhU4%n~Oq z-$FY@hbI?uN9ytnCu?Woa@`L zFCeL%MLnk?V;Nyp*=xb#*XiL-UGE;ZXR6W~h50$Ore3JhnihZ2aFQ#OQuF+W7D}Y6 z;J{SIm&c(u0-Q+WM)#}#GsX(P@YL(4C!u6@P6ULIJY*t zaMaSiV>I@WKRo)zEej`$ak54fsl_v+8%*i?DR|Q6;jpT3t(g5Iw^;KK`T-F1XSc|# z>sK)4EMeg>Bi%qwU7xt^vF5LjGwduGhM~ zK<1zjo=v^dmhJoRoyWSBbCpfMI9|9G{jE}Fj|N%;l*z9EK$rzANkNCPUqbJt1Q=~| zAxBKl4)Nwk2@6aW4bSH29e=`ga0QaGFo>V+ADVZL4`~a(DU=N0lwRm{S;fzhq`?SJ zONZOzM#Jm@+@d8M%JNLQ7NrbuNN61K+l_~BDUKRL%v8&{E!i!JG3X}rR0d-AbCJ8o zyYT11xbv=92g+rbK{wJykhW?LqeFd)HR6hgO8z1Pkr8G6vkISz`)Qa)VqQq?rtU^2 zR9=7-tw9|NK-z(p7~9bzW;I_(Y#W31prNuGKa)QZFE8H6@kG?_vx|u9j@~MwC3=}~ zCs#WKS^6w#&3IOZmC;olOiAjfo0C2ucBA=2`KSBf0d&kCBa3h}Y{wryO{kQUthEIN z$Ma5O?t(|~JpxthWv$Wr-qvn3+pFb~y~XTSuSB)q7=0`utmb=ro3lOT2C-;WIMD=G zr0Uh7ykj$*GzCEg<)U)Sg%Tq(0DZwr(mT7-0!+`+l5wuLgqJ0(FumW(_MvKq`)Zki zDCVrnLdTl%lWb!UiZ%Q8*yy_jbGt@*F(cB*y4(;N{f2QFuAr>Q-V~BRIs?>|rj%pH zjUp|~(!$775OzX)!~6B;hk-P};-h-|UjZk?NeLONaTeH($?#71ZC!p0swYlI2gB{* zL#}jiCAtcVmta2Q`Geqe;%6b^ADX$Gv7^VnAUA_^1x$-uYD{Tg@7L7Tn-qB_z=hIR zk;=)zmzC@E96P_};?am)sa6y$LC*n>D*n!j0cg(I;bz`m=uo z1j#0JYRD4rvd%?d(H(8}Yf-8%?Ym5YMw)?0flms6%6+ck>%AH!%34|Fure9@Sa(>i zm>#KT1xTCsSQp3Qvf?E=HTyR>yFJ?JT)RMODw<7l{9I(_D+SigyJ;D6PLc8~yP~d( z>WGYH`B4Q@+_>~iMYf{EXT_vC|IuY*D+(bYEww93#BK>`(viVmQENs0fRC;9N`dql z15y$KV-E##sTRT5o`a3jP;Z4K^c5f-1zuvLa+40|&9|JFqALAu*(!}wxL}UWR9vLstR%iU^){4VkPSO(;g@gTqgES8D?w?y(XXhqz}V1MG*?hB z&p(yDEP`Q3a7l2H>JibKfMBTo3AQ)RwChGASbp+os7+V1*4obe}d4}`^ zj6EbWb_XRz2$~n2-F-lPR8HwI4m(F%1{R~3bQtiH{HRWn0x6dL#{&?CoDgZ zs)&1)zaoq6Zi}{WqtpU|+J?S`BV;;o*7m0yuH=Je@zCZ~6SJP*zRa zo4%jljd;-}kgNm7!q%{Uk7cUxn-1;tKELXqCY-le+`npk3%H-Wh%W^a4R4Uk%eh-r{j`%oRf=Mc6AaXlju`!wD!4G7Tx>jU$|6`Je^ zVYeCuoj5It0*pypm640xc9iU7?;uLdxR#@;uoHJt;g?0*&PqviD;)`q%e9Vs@%Bo9 z?|Wup(SJ=bV_SjlDg7rb!&}x=%z$9gnE(dsk3EY4)R@^F&mdo&ZzHM|a<#aENs%9z zEP8xzQ=>~u%MJTN3f)MP(kR@!Yhr#zA^*J{dLi$WBJqS3+g6g@W4j}CV36z(^mf+e>>ZI$Ct0rx zNfwp%Q-{}fVAG7-pk!iAwpoGKu}lVMoaQN^>L9_*lG!$fzFX8E0!_|GO6hI+`-IjQ z)8XfD^qGD(o%03BW#RqpSd|J%E!#sHp0?6_@y7DTcyN$ZJfI~r`x^D--0x4O?<;Xf zB83+-W34iVq|d9D`<}b(<&+a!3kpt))93ae&%D2eF2>U(wG4?Up9u03G`?);ArW93 z)hPci>{A}wUbb2BCU(YaE!IR* z#s$uPwmG_*xSn<|qeRRWw7yp6jaMRqpA%?^UkD6Jp4P}8rXe^sM-u~DoGO7NVBY3& z{tZ2QTg9-L3Dyce=4X`o-kK^eM-A1-FD4F_ZWhU7g6_GK#GVA*a>6B?Q`wxQk4}ft z>ZqNx`)TROHn2c%SOw$x8A2?1%xx(enAcb7ef;*Y#kQk_{KGjFolOR#e{N)s{*B9x zQGXsN7dO+v`>1S%5=L%>6_X5CQ^Uhua;wco8Z!4U76+BciPZv=sjbUxL?L@VXiM)aoEk&OaouX*Ww5AMAi zFLBCi6E}PUo5XS{LXB5gZOE37_#S4O=YGKHeIG=51NgF8JW|-aFvI|0=A96A{MHJA zrNaX*FVOH%_BXPaSEc=Bh=@PV{wed80g9cgjo00c&qM28IULsUJN*^N)o17 z7oE0k+p4y0o71*!YudK$p0;gU)3$9+YlEE|M3?Ks^z}m$Rny(x_htpE z>ES#$h*k}7@ohyW%u-<0mF)xY``6982J?!YNVFLO6rM_n8WpyBN%w z&DX+oQd2qtFI!r^!>;!JaN2r*Y7dLuTN?s_YTZ8fqbiX5O$F{jn=^&aZ`=ccYnJL% z=X=CV(pl%1S66{M*F7l*xR2Es@l#_KDdz;t?cpqJCIoOZ!Fb{a^%A*g=Lr!#wQ8S& zV=j&K2Y0g5pfm;?`}|QXSbn^d@4j|ivWlFV=y~-&SJ%}cb!wyskKpI-P#huis*K$@ z>~8WJ*_+s6aC1N1Ya2hhyPN!elMV1~Zem%VIib|II!xBlh4n<-i!o;5vW24T+XM-A z3VKfc;7-^R#+lsBK2Dg8&I?wE`!c&%uno5HYn+^v)5+1&z0kL^8i^HyhXnEpJ7FxK9r?r9`l9`KB2mTG14E*cZS#dVMvFDnNJP zY^r0{2hasmL!f;0^2M^H1n{C3T8&ew1_2fvDjSY<|JG)rYS|p)`aEq*YQ>byRM}av z38oTyhRpC4lV4nZB&VC?yp7FewPWy$TA-Zb0&&QS2eZZ3lCh zdHJom`A&aFoWq=Y97tq?J`_(Aa&asc@e1gM*yCCKpWL*#2VtW@mR39RwT=BS)*_0>t@9wNwa; zNIbrH_SX8-DhGpQA9;F&X(9UyZYf*#;mPUp2S-8|M&{4l-SXc8cz@S#7EiRzcFJ!( z-grcf`RJGB!sAekF~?339H;O(?f1pPhMu1*LGTS4kIHQLe3Yp3&(m)oU@ujv7YU`f zQ7*-gxj-&Qj!zf5b*cc|vZy-kv$*nNT;d)I)yYtl_glV+B}Gm4DRaLO$5)hBAq_P-mtS&)92b6vn^Xv|2k?GuyAe@Zb{h zTN5x6l*&kbvP3YIV#Z-klcDA+)Z75cE$oJeF36?e*qCChfTkCod&j&i2S=@Y zqf<`AF&+&cs!WNhNh(gVA)qrF{F_mO{eF9*sshpSA0oDR z6~h>U=np}iVXUhzZc-kQ5R+XAyqqpxueFs+Y$s@@+#CinhpiV!xu@)iin4&miuS;5 zE`~6g39TeRMTL~2zCf{vBv>dI%Ua-Kje2fHpv5F`UHU;ljxH5w?xdQ*tJGmquq4ci zT8!7k1oo4;`j-h|7$}HgoISLPG4#yt2gk#si-M^v_<3UqO4dGy%MXD~aee*jeIH!WX8wEv}IGD`$l-tDJTzc~95lx`w zaCe7=)Ev4Bi<)NQ!@(`LUQZ%|AR1>J>%Z|7*3}+s(-t<(dLpZ<1m~y?H-ujh5MSJI zdS^wJDAD{5@G-~^X=)jh#j^|hE2k0Pir5pVIk8W3ur~_G7qTr;DpN1*fv6Na3v_$m ztLVu<31=_Cn)CGyLC6IK3 zSb`APN{PiPTZ2EiRIVZl#6%nsS`yVc@AC#y(f1>#-GfnphZwJH#*e;iSCzMc6EH6^ z)A!AwB2;NZWoXxCZq1NdGD@E5#%2Jsa$VA}_!d}HYhU?T=n~EUJYfI(iE%{O-BO-ar%F=G zC>XFWiDvrSg!k7HmVCt>@xbECphyWmx|`*#<>?-^F>6bp1?5bix<)m(((+}5yNZdD z|IcSRqD+`(5kqKi-<`0L&NgEE6M+De0r44Ap6cMX29PHBKMe@Ea!OibGJk^dDV#29 zg0v5_tL(X2gW?k9cg zg%I{-EBrLMP-$g&qlWs{j9S*K#>$`2v`Sr)P4DrpL&St|bEABvF*VYp$Oo$#@}Wwm za0Bb4*d#!d+#(V=;o5jM79R7bcRNS;Z+LP=j?mPGWOn8k^Lx)+n`wW!p=sCJk2=35 z#QiNp)W{K5BYXb|du;&b7)nO{`Sgp0#r%6SRXA(dY!k}1U1lTju5#3fuyN|k(z_Mi z&~_6ojVN*5IzRQ0hE~ZoFmy9KXQsBKMV%X36uGWFdW>H8>xC*|vs56FGGDX9I5<&8 zN@j?9wx?0obM6;%#kY}8?Ic5FJ3oYO!%RC*Ij*deU{*Y(3Z5L@6xD*}WJNelw#_Va zQt>t1qQ%oXM8Hu8GN&fGl>8|O?c3d{qZ?^$iPo@{GhrVR9==iphL+uYg(BTn=P`^& z19jE<4%Zyz8=W;smrND$UCVb9*!Aiv9eV|q-p+8ZH0df zmHm=7b(5b&mfD{t3}yExFE&ezwUn!{4L#V~<1HY<{BA~|I4o-?b9VhhM|7xNayYxU z6VJH62v)Vn+z%>Rl$-&DK_j7&4P}F_PA9E{kbJ+y@O3#4xZj|O4q|*CAmKLGY^LQ6 zjf8c&Rs4N964gPG+*w(0rN8)D6ja(FGNcdbac#06S>br|`$8bpd7I$vYWpzs0<<4> zbfVVZA0fP`#v<%9iw8g*1w#p_iKw7}t&+}=;P&9T5uXMGNe;KDEZymm1=`4jjZoDHJwgXs^-Ip%NfMX48wzGWxc<3TmDc*r&W~BorH)J(3O8y)}9#a z*1Xiy-4O|~UG$rT*}{}KaS&MJ;?ouA0{Hprfi%YOU7i_#Fd(p}{HU**gZK3~Qs2q* z?(y|>?0Eamzm77c?{(=E3Z$JwUob@kmamv8Tm?OA8)Vb1$GFc0$_9M-q2zMit(3w} zUGSx5=bfRHq9%W+CpV`v^I{DdOk|j;PXj>_7fPQ}$`H&?c`OjmIs1ksB9TybFU(Ak zoFp4GN}M`BLY+Z-U1EfE4(gY4dV+|?d0wncCEHSM8Zr?{KyrQ{DI;SNyl_6K8GtS2 zc8ABWBf&ykV8n%1HOcq`&#lqm&54@zLvoCG%JbkBwcemRIOOd2G)CW0!GUVp?`F4r zEgLsM_Y$?#mK$%h9Lf7q$aIa%e wtS64QAE>{1A%KIqe|ZHEko{?@(YPajwh57 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 z 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�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⪻D>ivjlz6y!}_*UfQ8rc;X?$WB_T_! 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

    9#UQ*s!K3=|2fv*s%(68{WNUk_v(NpoF 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 +#include "lcms2_plugin.h" + +CMSAPI cmsPipeline* CMSEXPORT _cmsReadInputLUT(cmsHPROFILE hProfile, cmsUInt32Number Intent); +CMSAPI cmsPipeline* CMSEXPORT _cmsReadOutputLUT(cmsHPROFILE hProfile, cmsUInt32Number Intent); +CMSAPI cmsPipeline* CMSEXPORT _cmsReadDevicelinkLUT(cmsHPROFILE hProfile, cmsUInt32Number Intent); + +// Read and decode all tags on a profile +static +void ReadAllTags(cmsHPROFILE h) +{ + cmsInt32Number i, n; + cmsTagSignature sig; + + n = cmsGetTagCount(h); + for (i = 0; i < n; i++) { + + sig = cmsGetTagSignature(h, i); + if (cmsReadTag(h, sig) == NULL) return; + } +} + + +// Read all raw tags on a profile +static +void ReadAllRAWTags(cmsHPROFILE h) +{ + cmsInt32Number i, n; + cmsTagSignature sig; + cmsInt32Number len; + + n = cmsGetTagCount(h); + for (i = 0; i < n; i++) { + + sig = cmsGetTagSignature(h, i); + len = cmsReadRawTag(h, sig, NULL, 0); + } +} + +// Read and decode information +static +void FetchInfo(cmsHPROFILE h, cmsInfoType Info) +{ + wchar_t* text; + cmsInt32Number len; + cmsContext id = 0; + + len = cmsGetProfileInfo(h, Info, "en", "US", NULL, 0); + if (len == 0) return; + + text = (wchar_t*)_cmsMalloc(id, len); + if (text != NULL) { + cmsGetProfileInfo(h, Info, "en", "US", text, len); + _cmsFree(id, text); + } +} + +// Get all information +static +void FetchAllInfos(cmsHPROFILE h) +{ + FetchInfo(h, cmsInfoDescription); + FetchInfo(h, cmsInfoManufacturer); + FetchInfo(h, cmsInfoModel); + FetchInfo(h, cmsInfoCopyright); +} + +// Read all LUTs, which some may be missing +static +void ReadAllLUTS(cmsHPROFILE h) +{ + cmsPipeline* a; + cmsCIEXYZ Black; + + a = _cmsReadInputLUT(h, INTENT_PERCEPTUAL); + if (a) cmsPipelineFree(a); + + a = _cmsReadInputLUT(h, INTENT_RELATIVE_COLORIMETRIC); + if (a) cmsPipelineFree(a); + + a = _cmsReadInputLUT(h, INTENT_SATURATION); + if (a) cmsPipelineFree(a); + + a = _cmsReadInputLUT(h, INTENT_ABSOLUTE_COLORIMETRIC); + if (a) cmsPipelineFree(a); + + + a = _cmsReadOutputLUT(h, INTENT_PERCEPTUAL); + if (a) cmsPipelineFree(a); + + a = _cmsReadOutputLUT(h, INTENT_RELATIVE_COLORIMETRIC); + if (a) cmsPipelineFree(a); + + a = _cmsReadOutputLUT(h, INTENT_SATURATION); + if (a) cmsPipelineFree(a); + + a = _cmsReadOutputLUT(h, INTENT_ABSOLUTE_COLORIMETRIC); + if (a) cmsPipelineFree(a); + + + a = _cmsReadDevicelinkLUT(h, INTENT_PERCEPTUAL); + if (a) cmsPipelineFree(a); + + a = _cmsReadDevicelinkLUT(h, INTENT_RELATIVE_COLORIMETRIC); + if (a) cmsPipelineFree(a); + + a = _cmsReadDevicelinkLUT(h, INTENT_SATURATION); + if (a) cmsPipelineFree(a); + + a = _cmsReadDevicelinkLUT(h, INTENT_ABSOLUTE_COLORIMETRIC); + if (a) cmsPipelineFree(a); + + + cmsDetectDestinationBlackPoint(&Black, h, INTENT_PERCEPTUAL, 0); + cmsDetectDestinationBlackPoint(&Black, h, INTENT_RELATIVE_COLORIMETRIC, 0); + cmsDetectDestinationBlackPoint(&Black, h, INTENT_SATURATION, 0); + cmsDetectDestinationBlackPoint(&Black, h, INTENT_ABSOLUTE_COLORIMETRIC, 0); + + cmsDetectTAC(h); +} + + +// Create PostScript resources +static +void GenerateCSA(cmsHPROFILE hProfile) +{ + cmsUInt32Number n; + char* Buffer; + + n = cmsGetPostScriptCSA(0, hProfile, 0, 0, NULL, 0); + if (n == 0) return; + + Buffer = (char*)_cmsMalloc(0, n); + cmsGetPostScriptCSA(0, hProfile, 0, 0, Buffer, n); + _cmsFree(0, Buffer); +} + + +static +void GenerateCRD(cmsHPROFILE hProfile) +{ + cmsUInt32Number n; + char* Buffer; + cmsUInt32Number dwFlags = 0; + + n = cmsGetPostScriptCRD(0, hProfile, 0, dwFlags, NULL, 0); + if (n == 0) return; + + Buffer = (char*)_cmsMalloc(0, n); + cmsGetPostScriptCRD(0, hProfile, 0, dwFlags, Buffer, n); + _cmsFree(0, Buffer); +} + + +// The fuzzer entry +int LLVMFuzzerTestOneInput(const uint8_t* Data, size_t size) +{ + cmsHPROFILE hProfile = cmsOpenProfileFromMem(Data, (cmsUInt32Number)size); + if (hProfile == NULL) + return 0; + + ReadAllTags(hProfile); + ReadAllRAWTags(hProfile); + FetchAllInfos(hProfile); + ReadAllLUTS(hProfile); + GenerateCSA(hProfile); + GenerateCRD(hProfile); + + cmsCloseProfile(hProfile); + + return 0; +} + diff --git a/local/recipes/libs/lcms2/source/fuzzers/fuzzers.exp b/local/recipes/libs/lcms2/source/fuzzers/fuzzers.exp new file mode 100644 index 0000000000000000000000000000000000000000..d5e2df32b209e19a52e30043ea3b979de0cd1c28 GIT binary patch literal 5140 zcmeHLO>Em_7=GJyTle4W|9=_lU>z(Zj@x=;V-cOkCeksj+cbe8xQ^GFHE~Fsc8nc% z7!wj4IP6dfkPrfi14tYY8VCUg4m)rFfe;6fCc%LNNPsx(fPm+H9jBe$FXhfY#g899 z@8j?L{P(_gN>@ASA2e$jQJ#X9c1o6SH8-$&u8XLI^-Zj~9l(;uFI{p*8)LmAta0mG zKx8Zmc!+uGd5AfW5o#SETbfI#{Xfu5b~ppCSNHq*Jr#fwg@o^~!cR4AMoJ|f%04d3!-3nv?u!!>u(sZp_5w<@mh zVy~j@O%{z&*9U1-d~{QE5sF!=wj$uyEZZsCOq?x^=}8n9~9gK})_R++c|O54$SWIS7h=Z)~x zamGP{0!slG3hM=O!b;F?Aa5mT8rUuDKHx54uL2hf%K+~d_BwEhFdcZ0us4BAg&9EZ zGeK_yc@_!Dn|;FG0WKGo2ksH}9&m-Q!@zrmy$@U|>?n}ulc4Ls9$^LGUSS^tlfq5_ z)51Ojt`c?%c)zgEfvbg`1@f^Z=mv0&FcX*+_62aQu&02UurGn@gq46fVc!7P3mXUO z!oCA;5H3h)78e*(7)djWVr*ezg6*h|2J!u|s85cV?gL1Bb4b(gSfz(c~ipzRD8@OLa* zaZBx_4nFymPMg86nXt{7#9hS&J&@#-&!;hHD{$ejTqPQI?V4Bj&iSd`C;L)`W5*w% zkLX~M?5PqB?Ke-?k+jXSRr6i*uxB^QPQ|aA54--+#;93veSgB)J2X6Eo~U_GJ2paR zhO~^Pg@Y4U4RnL>Sj{S@j<^#}-JBWoj9YJ56R8ouQF1*~_8jucectX*?hTNP{v4E&%+`)ZY|EUvYY>27B+kQR(2Ck{m~VHwJb zk+aD>Moo;IV&*aGVq7-A(U8O7WHfh=QVIEdac)vt3`)VmscLQuS4O^YJxT{EhQ=dGmY$C&8od!wa`b6L(dlMH>8B3l{8{tS254JE8KitfG3d#b!gmTbS`7z` z#?N!u0)=1D!WJlna1-l5!EM-TfpWRE9eQ4gDIdg?uVTs{F=aI$bh8Cx=`rPWOsU3{ z7h}p>G3Aq(@TC#gwU-G96Psj49v7lv^=n9qyg5by5yncRrf& c1s}d^-1%tcKQ!)qG`IdCnt6voz2=hrFIwuxlK=n! literal 0 HcmV?d00001 diff --git a/local/recipes/libs/lcms2/source/include/Makefile.am b/local/recipes/libs/lcms2/source/include/Makefile.am new file mode 100644 index 0000000000..7dbe0e43bd --- /dev/null +++ b/local/recipes/libs/lcms2/source/include/Makefile.am @@ -0,0 +1,7 @@ +# +# Makefile for include directory +# Based on a work by Bob Friesenhahn + +include_HEADERS = lcms2.h lcms2_plugin.h + +EXTRA_DIST = lcms2.h lcms2_plugin.h diff --git a/local/recipes/libs/lcms2/source/include/Makefile.in b/local/recipes/libs/lcms2/source/include/Makefile.in new file mode 100644 index 0000000000..308cbdc462 --- /dev/null +++ b/local/recipes/libs/lcms2/source/include/Makefile.in @@ -0,0 +1,607 @@ +# Makefile.in generated by automake 1.18.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2025 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# +# Makefile for include directory +# Based on a work by Bob Friesenhahn + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +am__rm_f = rm -f $(am__rm_f_notfound) +am__rm_rf = rm -rf $(am__rm_f_notfound) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = include +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_append_compile_flags.m4 \ + $(top_srcdir)/m4/ax_append_flag.m4 \ + $(top_srcdir)/m4/ax_check_compile_flag.m4 \ + $(top_srcdir)/m4/ax_gcc_func_attribute.m4 \ + $(top_srcdir)/m4/ax_pthread.m4 \ + $(top_srcdir)/m4/ax_require_defined.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(include_HEADERS) \ + $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && echo $$files | $(am__xargs_n) 40 $(am__rm_f); }; \ + } +am__installdirs = "$(DESTDIR)$(includedir)" +HEADERS = $(include_HEADERS) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +am__DIST_COMMON = $(srcdir)/Makefile.in +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ETAGS = @ETAGS@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FILECMD = @FILECMD@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +JPEGICC_DEPLIBS = @JPEGICC_DEPLIBS@ +LCMS_LIB_DEPLIBS = @LCMS_LIB_DEPLIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBRARY_AGE = @LIBRARY_AGE@ +LIBRARY_CURRENT = @LIBRARY_CURRENT@ +LIBRARY_REVISION = @LIBRARY_REVISION@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_DEPS = @LIBTOOL_DEPS@ +LIB_JPEG = @LIB_JPEG@ +LIB_MATH = @LIB_MATH@ +LIB_PLUGINS = @LIB_PLUGINS@ +LIB_THREAD = @LIB_THREAD@ +LIB_TIFF = @LIB_TIFF@ +LIB_ZLIB = @LIB_ZLIB@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_CXX = @PTHREAD_CXX@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +TIFFICC_DEPLIBS = @TIFFICC_DEPLIBS@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__rm_f_notfound = @am__rm_f_notfound@ +am__tar = @am__tar@ +am__untar = @am__untar@ +am__xargs_n = @am__xargs_n@ +ax_pthread_config = @ax_pthread_config@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +inline = @inline@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +include_HEADERS = lcms2.h lcms2_plugin.h +EXTRA_DIST = lcms2.h lcms2_plugin.h +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign include/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign include/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-includeHEADERS: $(include_HEADERS) + @$(NORMAL_INSTALL) + @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \ + done + +uninstall-includeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(includedir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -$(am__rm_f) $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || $(am__rm_f) $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-includeHEADERS + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-includeHEADERS + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool cscopelist-am ctags ctags-am distclean \ + distclean-generic distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-includeHEADERS install-info install-info-am \ + install-man install-pdf install-pdf-am install-ps \ + install-ps-am install-strip installcheck installcheck-am \ + installdirs maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ + ps ps-am tags tags-am uninstall uninstall-am \ + uninstall-includeHEADERS + +.PRECIOUS: Makefile + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: + +# Tell GNU make to disable its built-in pattern rules. +%:: %,v +%:: RCS/%,v +%:: RCS/% +%:: s.% +%:: SCCS/s.% diff --git a/local/recipes/libs/lcms2/source/include/lcms2.h b/local/recipes/libs/lcms2/source/include/lcms2.h new file mode 100644 index 0000000000..7aa5d45bf7 --- /dev/null +++ b/local/recipes/libs/lcms2/source/include/lcms2.h @@ -0,0 +1,2029 @@ +//--------------------------------------------------------------------------------- +// +// Little Color Management System +// Copyright (c) 1998-2026 Marti Maria Saguer +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//--------------------------------------------------------------------------------- +// +// Version 2.19 +// + +#ifndef _lcms2_H + +// ********** Configuration toggles **************************************** + +// Uncomment this one if you are using big endian machines +// #define CMS_USE_BIG_ENDIAN 1 + +// Uncomment this one if your compiler/machine does NOT support the +// "long long" type. +// #define CMS_DONT_USE_INT64 1 + +// Uncomment this one to enable large file support on file/stream I/O. +// LittleCMS is still limited by ICC 32-bit offsets and sizes, so the +// practical maximum remains 4 GiB minus profile overhead. Be careful +// because such huge profiles have to be loaded into memory and that's +// usually a very bad idea. +// #define CMS_LARGE_FILE_SUPPORT 1 + +// Uncomment this if your compiler doesn't work with fast floor function +// #define CMS_DONT_USE_FAST_FLOOR 1 + +// Uncomment this line if you want lcms to use the black point tag in profile, +// if commented, lcms will compute the black point by its own. +// It is safer to leave it commented out +// #define CMS_USE_PROFILE_BLACK_POINT_TAG 1 + +// Uncomment this line if you are compiling as C++ and want a C++ API +// #define CMS_USE_CPP_API + +// Uncomment this line if you need strict CGATS syntax. Makes CGATS files to +// require "KEYWORD" on undefined identifiers, keep it commented out unless needed +// #define CMS_STRICT_CGATS 1 + +// Uncomment to get rid of the tables for "half" float support +// #define CMS_NO_HALF_SUPPORT 1 + +// Uncomment to get rid of pthreads/windows dependency +// #define CMS_NO_PTHREADS 1 + +// Uncomment this for special windows mutex initialization (see lcms2_internal.h) +// #define CMS_RELY_ON_WINDOWS_STATIC_MUTEX_INIT + +// Uncomment this to remove the "register" storage class +// #define CMS_NO_REGISTER_KEYWORD 1 + +// Uncomment this to remove visibility attribute when building shared objects +// #define CMS_NO_VISIBILITY 1 + +// ********** End of configuration toggles ****************************** + +// Needed for streams +#include + +// Needed for portability (C99 per 7.1.2) +#include +#include +#include + +#ifndef CMS_USE_CPP_API +# ifdef __cplusplus +# if __cplusplus >= 201703L +# define CMS_NO_REGISTER_KEYWORD 1 +# endif +extern "C" { +# endif +#endif + +// Version/release +#define LCMS_VERSION 2190 + +// I will give the chance of redefining basic types for compilers that are not fully C99 compliant +#ifndef CMS_BASIC_TYPES_ALREADY_DEFINED + +// Base types +typedef unsigned char cmsUInt8Number; // That is guaranteed by the C99 spec +typedef signed char cmsInt8Number; // That is guaranteed by the C99 spec + +#if CHAR_BIT != 8 +# error "Unable to find 8 bit type, unsupported compiler" +#endif + +// IEEE float storage numbers +typedef float cmsFloat32Number; +typedef double cmsFloat64Number; + +// 16-bit base types +#if (USHRT_MAX == 65535U) + typedef unsigned short cmsUInt16Number; +#elif (UINT_MAX == 65535U) + typedef unsigned int cmsUInt16Number; +#else +# error "Unable to find 16 bits unsigned type, unsupported compiler" +#endif + +#if (SHRT_MAX == 32767) + typedef short cmsInt16Number; +#elif (INT_MAX == 32767) + typedef int cmsInt16Number; +#else +# error "Unable to find 16 bits signed type, unsupported compiler" +#endif + +// 32-bit base type +#if (UINT_MAX == 4294967295U) + typedef unsigned int cmsUInt32Number; +#elif (ULONG_MAX == 4294967295U) + typedef unsigned long cmsUInt32Number; +#else +# error "Unable to find 32 bit unsigned type, unsupported compiler" +#endif + +#if (INT_MAX == +2147483647) + typedef int cmsInt32Number; +#elif (LONG_MAX == +2147483647) + typedef long cmsInt32Number; +#else +# error "Unable to find 32 bit signed type, unsupported compiler" +#endif + +// 64-bit base types +#ifndef CMS_DONT_USE_INT64 +# if (ULONG_MAX == 18446744073709551615U) + typedef unsigned long cmsUInt64Number; +# elif (ULLONG_MAX == 18446744073709551615U) + typedef unsigned long long cmsUInt64Number; +# else +# define CMS_DONT_USE_INT64 1 +# endif +# if (LONG_MAX == +9223372036854775807) + typedef long cmsInt64Number; +# elif (LLONG_MAX == +9223372036854775807) + typedef long long cmsInt64Number; +# else +# define CMS_DONT_USE_INT64 1 +# endif +#endif +#endif + +// Handle "register" keyword +#if defined(CMS_NO_REGISTER_KEYWORD) +# define CMSREGISTER +#else +# define CMSREGISTER register +#endif + +// In the case 64 bit numbers are not supported by the compiler +#ifdef CMS_DONT_USE_INT64 + typedef cmsUInt32Number cmsUInt64Number[2]; + typedef cmsInt32Number cmsInt64Number[2]; +# if defined(CMS_LARGE_FILE_SUPPORT) +# error "You need int64 for large file support" +# endif +#endif + +// Derivative types +typedef cmsUInt32Number cmsSignature; +typedef cmsUInt16Number cmsU8Fixed8Number; +typedef cmsInt32Number cmsS15Fixed16Number; +typedef cmsUInt32Number cmsU16Fixed16Number; + +// Boolean type, which will be using the native integer +typedef int cmsBool; + +// Try to detect windows +#if defined (_WIN32) || defined(_WIN64) || defined(WIN32) || defined(_WIN32_) +# define CMS_IS_WINDOWS_ 1 +#endif + +#ifdef _MSC_VER +# define CMS_IS_WINDOWS_ 1 +#endif + +#ifdef __BORLANDC__ +# define CMS_IS_WINDOWS_ 1 +#endif + +// Try to detect big endian platforms. This list can be endless, so primarily rely on the configure script +// on Unix-like systems, and allow it to be set on the compiler command line using +// -DCMS_USE_BIG_ENDIAN or something similar +#ifdef CMS_USE_BIG_ENDIAN // set at compiler command line takes overall precedence + +# if CMS_USE_BIG_ENDIAN == 0 +# undef CMS_USE_BIG_ENDIAN +# endif + +#else // CMS_USE_BIG_ENDIAN + +# ifdef WORDS_BIGENDIAN // set by configure (or explicitly on compiler command line) +# define CMS_USE_BIG_ENDIAN 1 +# else // WORDS_BIGENDIAN +// Fall back to platform/compiler specific tests +# if defined(__sgi__) || defined(__sgi) || defined(sparc) +# define CMS_USE_BIG_ENDIAN 1 +# endif + +# if defined(__s390__) || defined(__s390x__) +# define CMS_USE_BIG_ENDIAN 1 +# endif + +# ifdef macintosh +# ifdef __BIG_ENDIAN__ +# define CMS_USE_BIG_ENDIAN 1 +# endif +# ifdef __LITTLE_ENDIAN__ +# undef CMS_USE_BIG_ENDIAN +# endif +# endif +# endif // WORDS_BIGENDIAN + +# if defined(_HOST_BIG_ENDIAN) || defined(__BIG_ENDIAN__) +# define CMS_USE_BIG_ENDIAN 1 +# endif + +#endif // CMS_USE_BIG_ENDIAN + + +// Calling convention -- this is hardly platform and compiler dependent +#if defined(CMS_IS_WINDOWS_) && !defined(__GNUC__) +# if defined(CMS_DLL) || defined(CMS_DLL_BUILD) +# ifdef __BORLANDC__ +# define CMSEXPORT __stdcall _export +# define CMSAPI +# else +# define CMSEXPORT __stdcall +# ifdef CMS_DLL_BUILD +# define CMSAPI __declspec(dllexport) +# else +# define CMSAPI __declspec(dllimport) +# endif +# endif +# else +# define CMSEXPORT +# define CMSAPI +# endif +#else // not Windows +# if defined(HAVE_FUNC_ATTRIBUTE_VISIBILITY) && !defined(CMS_NO_VISIBILITY) +# define CMSEXPORT +# define CMSAPI __attribute__((visibility("default"))) +# else +# define CMSEXPORT +# define CMSAPI +# endif +#endif // CMS_IS_WINDOWS_ + +#ifdef HasTHREADS +# if HasTHREADS == 1 +# undef CMS_NO_PTHREADS +# else +# define CMS_NO_PTHREADS 1 +# endif +#endif + +// Some common definitions +#define cmsMAX_PATH 256 + +#ifndef FALSE +# define FALSE 0 +#endif +#ifndef TRUE +# define TRUE 1 +#endif + +// D50 XYZ normalized to Y=1.0 +#define cmsD50X 0.9642 +#define cmsD50Y 1.0 +#define cmsD50Z 0.8249 + +// V4 perceptual black +#define cmsPERCEPTUAL_BLACK_X 0.00336 +#define cmsPERCEPTUAL_BLACK_Y 0.0034731 +#define cmsPERCEPTUAL_BLACK_Z 0.00287 + +// Definitions in ICC spec +#define cmsMagicNumber 0x61637370 // 'acsp' +#define lcmsSignature 0x6c636d73 // 'lcms' + + +// Base ICC type definitions +typedef enum { + cmsSigChromaticityType = 0x6368726D, // 'chrm' + cmsSigcicpType = 0x63696370, // 'cicp' + cmsSigColorantOrderType = 0x636C726F, // 'clro' + cmsSigColorantTableType = 0x636C7274, // 'clrt' + cmsSigCrdInfoType = 0x63726469, // 'crdi' + cmsSigCurveType = 0x63757276, // 'curv' + cmsSigDataType = 0x64617461, // 'data' + cmsSigDictType = 0x64696374, // 'dict' + cmsSigDateTimeType = 0x6474696D, // 'dtim' + cmsSigDeviceSettingsType = 0x64657673, // 'devs' + cmsSigLut16Type = 0x6d667432, // 'mft2' + cmsSigLut8Type = 0x6d667431, // 'mft1' + cmsSigLutAtoBType = 0x6d414220, // 'mAB ' + cmsSigLutBtoAType = 0x6d424120, // 'mBA ' + cmsSigMeasurementType = 0x6D656173, // 'meas' + cmsSigMultiLocalizedUnicodeType = 0x6D6C7563, // 'mluc' + cmsSigMultiProcessElementType = 0x6D706574, // 'mpet' + cmsSigNamedColorType = 0x6E636f6C, // 'ncol' -- DEPRECATED! + cmsSigNamedColor2Type = 0x6E636C32, // 'ncl2' + cmsSigParametricCurveType = 0x70617261, // 'para' + cmsSigProfileSequenceDescType = 0x70736571, // 'pseq' + cmsSigProfileSequenceIdType = 0x70736964, // 'psid' + cmsSigResponseCurveSet16Type = 0x72637332, // 'rcs2' + cmsSigS15Fixed16ArrayType = 0x73663332, // 'sf32' + cmsSigScreeningType = 0x7363726E, // 'scrn' + cmsSigSignatureType = 0x73696720, // 'sig ' + cmsSigTextType = 0x74657874, // 'text' + cmsSigTextDescriptionType = 0x64657363, // 'desc' + cmsSigU16Fixed16ArrayType = 0x75663332, // 'uf32' + cmsSigUcrBgType = 0x62666420, // 'bfd ' + cmsSigUInt16ArrayType = 0x75693136, // 'ui16' + cmsSigUInt32ArrayType = 0x75693332, // 'ui32' + cmsSigUInt64ArrayType = 0x75693634, // 'ui64' + cmsSigUInt8ArrayType = 0x75693038, // 'ui08' + cmsSigVcgtType = 0x76636774, // 'vcgt' + cmsSigViewingConditionsType = 0x76696577, // 'view' + cmsSigXYZType = 0x58595A20, // 'XYZ ' + cmsSigMHC2Type = 0x4D484332 // 'MHC2' + + +} cmsTagTypeSignature; + +// Base ICC tag definitions +typedef enum { + cmsSigAToB0Tag = 0x41324230, // 'A2B0' + cmsSigAToB1Tag = 0x41324231, // 'A2B1' + cmsSigAToB2Tag = 0x41324232, // 'A2B2' + cmsSigBlueColorantTag = 0x6258595A, // 'bXYZ' + cmsSigBlueMatrixColumnTag = 0x6258595A, // 'bXYZ' + cmsSigBlueTRCTag = 0x62545243, // 'bTRC' + cmsSigBToA0Tag = 0x42324130, // 'B2A0' + cmsSigBToA1Tag = 0x42324131, // 'B2A1' + cmsSigBToA2Tag = 0x42324132, // 'B2A2' + cmsSigCalibrationDateTimeTag = 0x63616C74, // 'calt' + cmsSigCharTargetTag = 0x74617267, // 'targ' + cmsSigChromaticAdaptationTag = 0x63686164, // 'chad' + cmsSigChromaticityTag = 0x6368726D, // 'chrm' + cmsSigColorantOrderTag = 0x636C726F, // 'clro' + cmsSigColorantTableTag = 0x636C7274, // 'clrt' + cmsSigColorantTableOutTag = 0x636C6F74, // 'clot' + cmsSigColorimetricIntentImageStateTag = 0x63696973, // 'ciis' + cmsSigCopyrightTag = 0x63707274, // 'cprt' + cmsSigCrdInfoTag = 0x63726469, // 'crdi' + cmsSigDataTag = 0x64617461, // 'data' + cmsSigDateTimeTag = 0x6474696D, // 'dtim' + cmsSigDeviceMfgDescTag = 0x646D6E64, // 'dmnd' + cmsSigDeviceModelDescTag = 0x646D6464, // 'dmdd' + cmsSigDeviceSettingsTag = 0x64657673, // 'devs' + cmsSigDToB0Tag = 0x44324230, // 'D2B0' + cmsSigDToB1Tag = 0x44324231, // 'D2B1' + cmsSigDToB2Tag = 0x44324232, // 'D2B2' + cmsSigDToB3Tag = 0x44324233, // 'D2B3' + cmsSigBToD0Tag = 0x42324430, // 'B2D0' + cmsSigBToD1Tag = 0x42324431, // 'B2D1' + cmsSigBToD2Tag = 0x42324432, // 'B2D2' + cmsSigBToD3Tag = 0x42324433, // 'B2D3' + cmsSigGamutTag = 0x67616D74, // 'gamt' + cmsSigGrayTRCTag = 0x6b545243, // 'kTRC' + cmsSigGreenColorantTag = 0x6758595A, // 'gXYZ' + cmsSigGreenMatrixColumnTag = 0x6758595A, // 'gXYZ' + cmsSigGreenTRCTag = 0x67545243, // 'gTRC' + cmsSigLuminanceTag = 0x6C756d69, // 'lumi' + cmsSigMeasurementTag = 0x6D656173, // 'meas' + cmsSigMediaBlackPointTag = 0x626B7074, // 'bkpt' + cmsSigMediaWhitePointTag = 0x77747074, // 'wtpt' + cmsSigNamedColorTag = 0x6E636f6C, // 'ncol' // Deprecated by the ICC + cmsSigNamedColor2Tag = 0x6E636C32, // 'ncl2' + cmsSigOutputResponseTag = 0x72657370, // 'resp' + cmsSigPerceptualRenderingIntentGamutTag = 0x72696730, // 'rig0' + cmsSigPreview0Tag = 0x70726530, // 'pre0' + cmsSigPreview1Tag = 0x70726531, // 'pre1' + cmsSigPreview2Tag = 0x70726532, // 'pre2' + cmsSigProfileDescriptionTag = 0x64657363, // 'desc' + cmsSigProfileDescriptionMLTag = 0x6473636d, // 'dscm' + cmsSigProfileSequenceDescTag = 0x70736571, // 'pseq' + cmsSigProfileSequenceIdTag = 0x70736964, // 'psid' + cmsSigPs2CRD0Tag = 0x70736430, // 'psd0' + cmsSigPs2CRD1Tag = 0x70736431, // 'psd1' + cmsSigPs2CRD2Tag = 0x70736432, // 'psd2' + cmsSigPs2CRD3Tag = 0x70736433, // 'psd3' + cmsSigPs2CSATag = 0x70733273, // 'ps2s' + cmsSigPs2RenderingIntentTag = 0x70733269, // 'ps2i' + cmsSigRedColorantTag = 0x7258595A, // 'rXYZ' + cmsSigRedMatrixColumnTag = 0x7258595A, // 'rXYZ' + cmsSigRedTRCTag = 0x72545243, // 'rTRC' + cmsSigSaturationRenderingIntentGamutTag = 0x72696732, // 'rig2' + cmsSigScreeningDescTag = 0x73637264, // 'scrd' + cmsSigScreeningTag = 0x7363726E, // 'scrn' + cmsSigTechnologyTag = 0x74656368, // 'tech' + cmsSigUcrBgTag = 0x62666420, // 'bfd ' + cmsSigViewingCondDescTag = 0x76756564, // 'vued' + cmsSigViewingConditionsTag = 0x76696577, // 'view' + cmsSigVcgtTag = 0x76636774, // 'vcgt' + cmsSigMetaTag = 0x6D657461, // 'meta' + cmsSigcicpTag = 0x63696370, // 'cicp' + cmsSigArgyllArtsTag = 0x61727473, // 'arts' + cmsSigMHC2Tag = 0x4D484332 // 'MHC2' + +} cmsTagSignature; + + +// ICC Technology tag +typedef enum { + cmsSigDigitalCamera = 0x6463616D, // 'dcam' + cmsSigFilmScanner = 0x6673636E, // 'fscn' + cmsSigReflectiveScanner = 0x7273636E, // 'rscn' + cmsSigInkJetPrinter = 0x696A6574, // 'ijet' + cmsSigThermalWaxPrinter = 0x74776178, // 'twax' + cmsSigElectrophotographicPrinter = 0x6570686F, // 'epho' + cmsSigElectrostaticPrinter = 0x65737461, // 'esta' + cmsSigDyeSublimationPrinter = 0x64737562, // 'dsub' + cmsSigPhotographicPaperPrinter = 0x7270686F, // 'rpho' + cmsSigFilmWriter = 0x6670726E, // 'fprn' + cmsSigVideoMonitor = 0x7669646D, // 'vidm' + cmsSigVideoCamera = 0x76696463, // 'vidc' + cmsSigProjectionTelevision = 0x706A7476, // 'pjtv' + cmsSigCRTDisplay = 0x43525420, // 'CRT ' + cmsSigPMDisplay = 0x504D4420, // 'PMD ' + cmsSigAMDisplay = 0x414D4420, // 'AMD ' + cmsSigPhotoCD = 0x4B504344, // 'KPCD' + cmsSigPhotoImageSetter = 0x696D6773, // 'imgs' + cmsSigGravure = 0x67726176, // 'grav' + cmsSigOffsetLithography = 0x6F666673, // 'offs' + cmsSigSilkscreen = 0x73696C6B, // 'silk' + cmsSigFlexography = 0x666C6578, // 'flex' + cmsSigMotionPictureFilmScanner = 0x6D706673, // 'mpfs' + cmsSigMotionPictureFilmRecorder = 0x6D706672, // 'mpfr' + cmsSigDigitalMotionPictureCamera = 0x646D7063, // 'dmpc' + cmsSigDigitalCinemaProjector = 0x64636A70 // 'dcpj' + +} cmsTechnologySignature; + + +// ICC Color spaces +typedef enum { + cmsSigXYZData = 0x58595A20, // 'XYZ ' + cmsSigLabData = 0x4C616220, // 'Lab ' + cmsSigLuvData = 0x4C757620, // 'Luv ' + cmsSigYCbCrData = 0x59436272, // 'YCbr' + cmsSigYxyData = 0x59787920, // 'Yxy ' + cmsSigRgbData = 0x52474220, // 'RGB ' + cmsSigGrayData = 0x47524159, // 'GRAY' + cmsSigHsvData = 0x48535620, // 'HSV ' + cmsSigHlsData = 0x484C5320, // 'HLS ' + cmsSigCmykData = 0x434D594B, // 'CMYK' + cmsSigCmyData = 0x434D5920, // 'CMY ' + cmsSigMCH1Data = 0x4D434831, // 'MCH1' + cmsSigMCH2Data = 0x4D434832, // 'MCH2' + cmsSigMCH3Data = 0x4D434833, // 'MCH3' + cmsSigMCH4Data = 0x4D434834, // 'MCH4' + cmsSigMCH5Data = 0x4D434835, // 'MCH5' + cmsSigMCH6Data = 0x4D434836, // 'MCH6' + cmsSigMCH7Data = 0x4D434837, // 'MCH7' + cmsSigMCH8Data = 0x4D434838, // 'MCH8' + cmsSigMCH9Data = 0x4D434839, // 'MCH9' + cmsSigMCHAData = 0x4D434841, // 'MCHA' + cmsSigMCHBData = 0x4D434842, // 'MCHB' + cmsSigMCHCData = 0x4D434843, // 'MCHC' + cmsSigMCHDData = 0x4D434844, // 'MCHD' + cmsSigMCHEData = 0x4D434845, // 'MCHE' + cmsSigMCHFData = 0x4D434846, // 'MCHF' + cmsSigNamedData = 0x6e6d636c, // 'nmcl' + cmsSig1colorData = 0x31434C52, // '1CLR' + cmsSig2colorData = 0x32434C52, // '2CLR' + cmsSig3colorData = 0x33434C52, // '3CLR' + cmsSig4colorData = 0x34434C52, // '4CLR' + cmsSig5colorData = 0x35434C52, // '5CLR' + cmsSig6colorData = 0x36434C52, // '6CLR' + cmsSig7colorData = 0x37434C52, // '7CLR' + cmsSig8colorData = 0x38434C52, // '8CLR' + cmsSig9colorData = 0x39434C52, // '9CLR' + cmsSig10colorData = 0x41434C52, // 'ACLR' + cmsSig11colorData = 0x42434C52, // 'BCLR' + cmsSig12colorData = 0x43434C52, // 'CCLR' + cmsSig13colorData = 0x44434C52, // 'DCLR' + cmsSig14colorData = 0x45434C52, // 'ECLR' + cmsSig15colorData = 0x46434C52, // 'FCLR' + cmsSigLuvKData = 0x4C75764B // 'LuvK' + +} cmsColorSpaceSignature; + +// ICC Profile Class +typedef enum { + cmsSigInputClass = 0x73636E72, // 'scnr' + cmsSigDisplayClass = 0x6D6E7472, // 'mntr' + cmsSigOutputClass = 0x70727472, // 'prtr' + cmsSigLinkClass = 0x6C696E6B, // 'link' + cmsSigAbstractClass = 0x61627374, // 'abst' + cmsSigColorSpaceClass = 0x73706163, // 'spac' + cmsSigNamedColorClass = 0x6e6d636c, // 'nmcl' + + // iccMAX only + cmsSigColorEncodingSpaceClass = 0x63656E63, // 'cenc' + cmsSigMultiplexIdentificationClass = 0x6D696420, // 'mid ' + cmsSigMultiplexLinkClass = 0x6d6c6e6b, // 'mlnk' + cmsSigMultiplexVisualizationClass = 0x6d766973 // 'mvis' + +} cmsProfileClassSignature; + +// ICC Platforms +typedef enum { + cmsSigMacintosh = 0x4150504C, // 'APPL' + cmsSigMicrosoft = 0x4D534654, // 'MSFT' + cmsSigSolaris = 0x53554E57, // 'SUNW' + cmsSigSGI = 0x53474920, // 'SGI ' + cmsSigTaligent = 0x54474E54, // 'TGNT' + cmsSigUnices = 0x2A6E6978 // '*nix' // From argyll -- Not official + +} cmsPlatformSignature; + +// Reference gamut +#define cmsSigPerceptualReferenceMediumGamut 0x70726d67 //'prmg' + +// For cmsSigColorimetricIntentImageStateTag +#define cmsSigSceneColorimetryEstimates 0x73636F65 //'scoe' +#define cmsSigSceneAppearanceEstimates 0x73617065 //'sape' +#define cmsSigFocalPlaneColorimetryEstimates 0x66706365 //'fpce' +#define cmsSigReflectionHardcopyOriginalColorimetry 0x72686F63 //'rhoc' +#define cmsSigReflectionPrintOutputColorimetry 0x72706F63 //'rpoc' + +// Multi process elements types +typedef enum { + cmsSigCurveSetElemType = 0x63767374, //'cvst' + cmsSigMatrixElemType = 0x6D617466, //'matf' + cmsSigCLutElemType = 0x636C7574, //'clut' + + cmsSigBAcsElemType = 0x62414353, // 'bACS' + cmsSigEAcsElemType = 0x65414353, // 'eACS' + + // Custom from here, not in the ICC Spec + cmsSigXYZ2LabElemType = 0x6C327820, // 'l2x ' + cmsSigLab2XYZElemType = 0x78326C20, // 'x2l ' + cmsSigNamedColorElemType = 0x6E636C20, // 'ncl ' + cmsSigLabV2toV4 = 0x32203420, // '2 4 ' + cmsSigLabV4toV2 = 0x34203220, // '4 2 ' + + // Identities + cmsSigIdentityElemType = 0x69646E20, // 'idn ' + + // Float to floatPCS + cmsSigLab2FloatPCS = 0x64326C20, // 'd2l ' + cmsSigFloatPCS2Lab = 0x6C326420, // 'l2d ' + cmsSigXYZ2FloatPCS = 0x64327820, // 'd2x ' + cmsSigFloatPCS2XYZ = 0x78326420, // 'x2d ' + cmsSigClipNegativesElemType = 0x636c7020 // 'clp ' + +} cmsStageSignature; + +// Types of CurveElements +typedef enum { + + cmsSigFormulaCurveSeg = 0x70617266, // 'parf' + cmsSigSampledCurveSeg = 0x73616D66, // 'samf' + cmsSigSegmentedCurve = 0x63757266 // 'curf' + +} cmsCurveSegSignature; + +// Used in ResponseCurveType +#define cmsSigStatusA 0x53746141 //'StaA' +#define cmsSigStatusE 0x53746145 //'StaE' +#define cmsSigStatusI 0x53746149 //'StaI' +#define cmsSigStatusT 0x53746154 //'StaT' +#define cmsSigStatusM 0x5374614D //'StaM' +#define cmsSigDN 0x444E2020 //'DN ' +#define cmsSigDNP 0x444E2050 //'DN P' +#define cmsSigDNN 0x444E4E20 //'DNN ' +#define cmsSigDNNP 0x444E4E50 //'DNNP' + +// Device attributes, currently defined values correspond to the low 4 bytes +// of the 8 byte attribute quantity +#define cmsReflective 0 +#define cmsTransparency 1 +#define cmsGlossy 0 +#define cmsMatte 2 + +// Common structures in ICC tags +typedef struct { + cmsUInt32Number len; + cmsUInt32Number flag; + cmsUInt8Number data[1]; + +} cmsICCData; + +// ICC date time +typedef struct { + cmsUInt16Number year; + cmsUInt16Number month; + cmsUInt16Number day; + cmsUInt16Number hours; + cmsUInt16Number minutes; + cmsUInt16Number seconds; + +} cmsDateTimeNumber; + +// ICC XYZ +typedef struct { + cmsS15Fixed16Number X; + cmsS15Fixed16Number Y; + cmsS15Fixed16Number Z; + +} cmsEncodedXYZNumber; + + +// Profile ID as computed by MD5 algorithm +typedef union { + cmsUInt8Number ID8[16]; + cmsUInt16Number ID16[8]; + cmsUInt32Number ID32[4]; + +} cmsProfileID; + + +// ---------------------------------------------------------------------------------------------- +// ICC profile internal base types. Strictly, shouldn't be declared in this header, but maybe +// somebody want to use this info for accessing profile header directly, so here it is. + +// Profile header -- it is 32-bit aligned, so no issues are expected on alignment +typedef struct { + cmsUInt32Number size; // Profile size in bytes + cmsSignature cmmId; // CMM for this profile + cmsUInt32Number version; // Format version number + cmsProfileClassSignature deviceClass; // Type of profile + cmsColorSpaceSignature colorSpace; // Color space of data + cmsColorSpaceSignature pcs; // PCS, XYZ or Lab only + cmsDateTimeNumber date; // Date profile was created + cmsSignature magic; // Magic Number to identify an ICC profile + cmsPlatformSignature platform; // Primary Platform + cmsUInt32Number flags; // Various bit settings + cmsSignature manufacturer; // Device manufacturer + cmsUInt32Number model; // Device model number + cmsUInt64Number attributes; // Device attributes + cmsUInt32Number renderingIntent;// Rendering intent + cmsEncodedXYZNumber illuminant; // Profile illuminant + cmsSignature creator; // Profile creator + cmsProfileID profileID; // Profile ID using MD5 + cmsInt8Number reserved[28]; // Reserved for future use + +} cmsICCHeader; + +// ICC base tag +typedef struct { + cmsTagTypeSignature sig; + cmsInt8Number reserved[4]; + +} cmsTagBase; + +// A tag entry in directory +typedef struct { + cmsTagSignature sig; // The tag signature + cmsUInt32Number offset; // Start of tag + cmsUInt32Number size; // Size in bytes + +} cmsTagEntry; + +// ---------------------------------------------------------------------------------------------- + +// Little CMS specific typedefs + +typedef void* cmsHANDLE ; // Generic handle +typedef void* cmsHPROFILE; // Opaque typedefs to hide internals +typedef void* cmsHTRANSFORM; + +#define cmsMAXCHANNELS 16 // Maximum number of channels in ICC profiles + +// Format of pixel is defined by one cmsUInt32Number, using bit fields as follows +// +// 2 1 0 +// 4 3 2 10987 6 5 4 3 2 1 098 7654 321 +// M A O TTTTT U Y F P X S EEE CCCC BBB +// +// M: Premultiplied alpha (only works when extra samples is 1) +// A: Floating point -- With this flag we can differentiate 16 bits as float and as int +// O: Optimized -- previous optimization already returns the final 8-bit value +// T: Pixeltype +// F: Flavor 0=MinIsBlack(Chocolate) 1=MinIsWhite(Vanilla) +// P: Planar? 0=Chunky, 1=Planar +// X: swap 16 bps endianness? +// S: Do swap? ie, BGR, KYMC +// E: Extra samples +// C: Channels (Samples per pixel) +// B: bytes per sample +// Y: Swap first - changes ABGR to BGRA and KCMY to CMYK + +#define PREMUL_SH(m) ((m) << 23) +#define FLOAT_SH(a) ((a) << 22) +#define OPTIMIZED_SH(s) ((s) << 21) +#define COLORSPACE_SH(s) ((s) << 16) +#define SWAPFIRST_SH(s) ((s) << 14) +#define FLAVOR_SH(s) ((s) << 13) +#define PLANAR_SH(p) ((p) << 12) +#define ENDIAN16_SH(e) ((e) << 11) +#define DOSWAP_SH(e) ((e) << 10) +#define EXTRA_SH(e) ((e) << 7) +#define CHANNELS_SH(c) ((c) << 3) +#define BYTES_SH(b) (b) + +// These macros unpack format specifiers into integers +#define T_PREMUL(m) (((m)>>23)&1) +#define T_FLOAT(a) (((a)>>22)&1) +#define T_OPTIMIZED(o) (((o)>>21)&1) +#define T_COLORSPACE(s) (((s)>>16)&31) +#define T_SWAPFIRST(s) (((s)>>14)&1) +#define T_FLAVOR(s) (((s)>>13)&1) +#define T_PLANAR(p) (((p)>>12)&1) +#define T_ENDIAN16(e) (((e)>>11)&1) +#define T_DOSWAP(e) (((e)>>10)&1) +#define T_EXTRA(e) (((e)>>7)&7) +#define T_CHANNELS(c) (((c)>>3)&15) +#define T_BYTES(b) ((b)&7) + + +// Pixel types +#define PT_ANY 0 // Don't check colorspace + // 1 & 2 are reserved +#define PT_GRAY 3 +#define PT_RGB 4 +#define PT_CMY 5 +#define PT_CMYK 6 +#define PT_YCbCr 7 +#define PT_YUV 8 // Lu'v' +#define PT_XYZ 9 +#define PT_Lab 10 +#define PT_YUVK 11 // Lu'v'K +#define PT_HSV 12 +#define PT_HLS 13 +#define PT_Yxy 14 +#define PT_MCH1 15 +#define PT_MCH2 16 +#define PT_MCH3 17 +#define PT_MCH4 18 +#define PT_MCH5 19 +#define PT_MCH6 20 +#define PT_MCH7 21 +#define PT_MCH8 22 +#define PT_MCH9 23 +#define PT_MCH10 24 +#define PT_MCH11 25 +#define PT_MCH12 26 +#define PT_MCH13 27 +#define PT_MCH14 28 +#define PT_MCH15 29 +#define PT_LabV2 30 // Identical to PT_Lab, but using the V2 old encoding + +// Some (not all!) representations + +#ifndef TYPE_RGB_8 // TYPE_RGB_8 is a very common identifier, so don't include ours + // if user has it already defined. + +#define TYPE_GRAY_8 (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(1)) +#define TYPE_GRAY_8_REV (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(1)|FLAVOR_SH(1)) +#define TYPE_GRAY_16 (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(2)) +#define TYPE_GRAY_16_REV (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(2)|FLAVOR_SH(1)) +#define TYPE_GRAY_16_SE (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(2)|ENDIAN16_SH(1)) +#define TYPE_GRAYA_8 (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(1)) +#define TYPE_GRAYA_8_PREMUL (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(1)|PREMUL_SH(1)) +#define TYPE_GRAYA_16 (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(2)) +#define TYPE_GRAYA_16_PREMUL (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(2)|PREMUL_SH(1)) +#define TYPE_GRAYA_16_SE (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(2)|ENDIAN16_SH(1)) +#define TYPE_GRAYA_8_PLANAR (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(1)|PLANAR_SH(1)) +#define TYPE_GRAYA_16_PLANAR (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(2)|PLANAR_SH(1)) + +#define TYPE_RGB_8 (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(1)) +#define TYPE_RGB_8_PLANAR (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1)) +#define TYPE_BGR_8 (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)) +#define TYPE_BGR_8_PLANAR (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|PLANAR_SH(1)) +#define TYPE_RGB_16 (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)) +#define TYPE_RGB_16_PLANAR (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1)) +#define TYPE_RGB_16_SE (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1)) +#define TYPE_BGR_16 (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)) +#define TYPE_BGR_16_PLANAR (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|PLANAR_SH(1)) +#define TYPE_BGR_16_SE (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1)) + +#define TYPE_RGBA_8 (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)) +#define TYPE_RGBA_8_PREMUL (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|PREMUL_SH(1)) +#define TYPE_RGBA_8_PLANAR (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1)) +#define TYPE_RGBA_16 (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)) +#define TYPE_RGBA_16_PREMUL (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|PREMUL_SH(1)) +#define TYPE_RGBA_16_PLANAR (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1)) +#define TYPE_RGBA_16_SE (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1)) + +#define TYPE_ARGB_8 (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|SWAPFIRST_SH(1)) +#define TYPE_ARGB_8_PREMUL (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|SWAPFIRST_SH(1)|PREMUL_SH(1)) +#define TYPE_ARGB_8_PLANAR (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|SWAPFIRST_SH(1)|PLANAR_SH(1)) +#define TYPE_ARGB_16 (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|SWAPFIRST_SH(1)) +#define TYPE_ARGB_16_PREMUL (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|SWAPFIRST_SH(1)|PREMUL_SH(1)) + +#define TYPE_ABGR_8 (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)) +#define TYPE_ABGR_8_PREMUL (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|PREMUL_SH(1)) +#define TYPE_ABGR_8_PLANAR (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|PLANAR_SH(1)) +#define TYPE_ABGR_16 (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)) +#define TYPE_ABGR_16_PREMUL (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|PREMUL_SH(1)) +#define TYPE_ABGR_16_PLANAR (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|PLANAR_SH(1)) +#define TYPE_ABGR_16_SE (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1)) + +#define TYPE_BGRA_8 (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1)) +#define TYPE_BGRA_8_PREMUL (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1)|PREMUL_SH(1)) +#define TYPE_BGRA_8_PLANAR (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1)|PLANAR_SH(1)) +#define TYPE_BGRA_16 (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|SWAPFIRST_SH(1)) +#define TYPE_BGRA_16_PREMUL (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|SWAPFIRST_SH(1)|PREMUL_SH(1)) +#define TYPE_BGRA_16_SE (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1)) + +#define TYPE_CMY_8 (COLORSPACE_SH(PT_CMY)|CHANNELS_SH(3)|BYTES_SH(1)) +#define TYPE_CMY_8_PLANAR (COLORSPACE_SH(PT_CMY)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1)) +#define TYPE_CMY_16 (COLORSPACE_SH(PT_CMY)|CHANNELS_SH(3)|BYTES_SH(2)) +#define TYPE_CMY_16_PLANAR (COLORSPACE_SH(PT_CMY)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1)) +#define TYPE_CMY_16_SE (COLORSPACE_SH(PT_CMY)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1)) + +#define TYPE_CMYK_8 (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1)) +#define TYPE_CMYKA_8 (COLORSPACE_SH(PT_CMYK)|EXTRA_SH(1)|CHANNELS_SH(4)|BYTES_SH(1)) +#define TYPE_CMYK_8_REV (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1)|FLAVOR_SH(1)) +#define TYPE_YUVK_8 TYPE_CMYK_8_REV +#define TYPE_CMYK_8_PLANAR (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1)|PLANAR_SH(1)) +#define TYPE_CMYK_16 (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)) +#define TYPE_CMYK_16_REV (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|FLAVOR_SH(1)) +#define TYPE_YUVK_16 TYPE_CMYK_16_REV +#define TYPE_CMYK_16_PLANAR (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|PLANAR_SH(1)) +#define TYPE_CMYK_16_SE (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|ENDIAN16_SH(1)) + +#define TYPE_KYMC_8 (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1)|DOSWAP_SH(1)) +#define TYPE_KYMC_16 (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|DOSWAP_SH(1)) +#define TYPE_KYMC_16_SE (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1)) + +#define TYPE_KCMY_8 (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1)|SWAPFIRST_SH(1)) +#define TYPE_KCMY_8_REV (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1)|FLAVOR_SH(1)|SWAPFIRST_SH(1)) +#define TYPE_KCMY_16 (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|SWAPFIRST_SH(1)) +#define TYPE_KCMY_16_REV (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|FLAVOR_SH(1)|SWAPFIRST_SH(1)) +#define TYPE_KCMY_16_SE (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|ENDIAN16_SH(1)|SWAPFIRST_SH(1)) + +#define TYPE_CMYK5_8 (COLORSPACE_SH(PT_MCH5)|CHANNELS_SH(5)|BYTES_SH(1)) +#define TYPE_CMYK5_16 (COLORSPACE_SH(PT_MCH5)|CHANNELS_SH(5)|BYTES_SH(2)) +#define TYPE_CMYK5_16_SE (COLORSPACE_SH(PT_MCH5)|CHANNELS_SH(5)|BYTES_SH(2)|ENDIAN16_SH(1)) +#define TYPE_KYMC5_8 (COLORSPACE_SH(PT_MCH5)|CHANNELS_SH(5)|BYTES_SH(1)|DOSWAP_SH(1)) +#define TYPE_KYMC5_16 (COLORSPACE_SH(PT_MCH5)|CHANNELS_SH(5)|BYTES_SH(2)|DOSWAP_SH(1)) +#define TYPE_KYMC5_16_SE (COLORSPACE_SH(PT_MCH5)|CHANNELS_SH(5)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1)) +#define TYPE_CMYK6_8 (COLORSPACE_SH(PT_MCH6)|CHANNELS_SH(6)|BYTES_SH(1)) +#define TYPE_CMYK6_8_PLANAR (COLORSPACE_SH(PT_MCH6)|CHANNELS_SH(6)|BYTES_SH(1)|PLANAR_SH(1)) +#define TYPE_CMYK6_16 (COLORSPACE_SH(PT_MCH6)|CHANNELS_SH(6)|BYTES_SH(2)) +#define TYPE_CMYK6_16_PLANAR (COLORSPACE_SH(PT_MCH6)|CHANNELS_SH(6)|BYTES_SH(2)|PLANAR_SH(1)) +#define TYPE_CMYK6_16_SE (COLORSPACE_SH(PT_MCH6)|CHANNELS_SH(6)|BYTES_SH(2)|ENDIAN16_SH(1)) +#define TYPE_CMYK7_8 (COLORSPACE_SH(PT_MCH7)|CHANNELS_SH(7)|BYTES_SH(1)) +#define TYPE_CMYK7_16 (COLORSPACE_SH(PT_MCH7)|CHANNELS_SH(7)|BYTES_SH(2)) +#define TYPE_CMYK7_16_SE (COLORSPACE_SH(PT_MCH7)|CHANNELS_SH(7)|BYTES_SH(2)|ENDIAN16_SH(1)) +#define TYPE_KYMC7_8 (COLORSPACE_SH(PT_MCH7)|CHANNELS_SH(7)|BYTES_SH(1)|DOSWAP_SH(1)) +#define TYPE_KYMC7_16 (COLORSPACE_SH(PT_MCH7)|CHANNELS_SH(7)|BYTES_SH(2)|DOSWAP_SH(1)) +#define TYPE_KYMC7_16_SE (COLORSPACE_SH(PT_MCH7)|CHANNELS_SH(7)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1)) +#define TYPE_CMYK8_8 (COLORSPACE_SH(PT_MCH8)|CHANNELS_SH(8)|BYTES_SH(1)) +#define TYPE_CMYK8_16 (COLORSPACE_SH(PT_MCH8)|CHANNELS_SH(8)|BYTES_SH(2)) +#define TYPE_CMYK8_16_SE (COLORSPACE_SH(PT_MCH8)|CHANNELS_SH(8)|BYTES_SH(2)|ENDIAN16_SH(1)) +#define TYPE_KYMC8_8 (COLORSPACE_SH(PT_MCH8)|CHANNELS_SH(8)|BYTES_SH(1)|DOSWAP_SH(1)) +#define TYPE_KYMC8_16 (COLORSPACE_SH(PT_MCH8)|CHANNELS_SH(8)|BYTES_SH(2)|DOSWAP_SH(1)) +#define TYPE_KYMC8_16_SE (COLORSPACE_SH(PT_MCH8)|CHANNELS_SH(8)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1)) +#define TYPE_CMYK9_8 (COLORSPACE_SH(PT_MCH9)|CHANNELS_SH(9)|BYTES_SH(1)) +#define TYPE_CMYK9_16 (COLORSPACE_SH(PT_MCH9)|CHANNELS_SH(9)|BYTES_SH(2)) +#define TYPE_CMYK9_16_SE (COLORSPACE_SH(PT_MCH9)|CHANNELS_SH(9)|BYTES_SH(2)|ENDIAN16_SH(1)) +#define TYPE_KYMC9_8 (COLORSPACE_SH(PT_MCH9)|CHANNELS_SH(9)|BYTES_SH(1)|DOSWAP_SH(1)) +#define TYPE_KYMC9_16 (COLORSPACE_SH(PT_MCH9)|CHANNELS_SH(9)|BYTES_SH(2)|DOSWAP_SH(1)) +#define TYPE_KYMC9_16_SE (COLORSPACE_SH(PT_MCH9)|CHANNELS_SH(9)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1)) +#define TYPE_CMYK10_8 (COLORSPACE_SH(PT_MCH10)|CHANNELS_SH(10)|BYTES_SH(1)) +#define TYPE_CMYK10_16 (COLORSPACE_SH(PT_MCH10)|CHANNELS_SH(10)|BYTES_SH(2)) +#define TYPE_CMYK10_16_SE (COLORSPACE_SH(PT_MCH10)|CHANNELS_SH(10)|BYTES_SH(2)|ENDIAN16_SH(1)) +#define TYPE_KYMC10_8 (COLORSPACE_SH(PT_MCH10)|CHANNELS_SH(10)|BYTES_SH(1)|DOSWAP_SH(1)) +#define TYPE_KYMC10_16 (COLORSPACE_SH(PT_MCH10)|CHANNELS_SH(10)|BYTES_SH(2)|DOSWAP_SH(1)) +#define TYPE_KYMC10_16_SE (COLORSPACE_SH(PT_MCH10)|CHANNELS_SH(10)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1)) +#define TYPE_CMYK11_8 (COLORSPACE_SH(PT_MCH11)|CHANNELS_SH(11)|BYTES_SH(1)) +#define TYPE_CMYK11_16 (COLORSPACE_SH(PT_MCH11)|CHANNELS_SH(11)|BYTES_SH(2)) +#define TYPE_CMYK11_16_SE (COLORSPACE_SH(PT_MCH11)|CHANNELS_SH(11)|BYTES_SH(2)|ENDIAN16_SH(1)) +#define TYPE_KYMC11_8 (COLORSPACE_SH(PT_MCH11)|CHANNELS_SH(11)|BYTES_SH(1)|DOSWAP_SH(1)) +#define TYPE_KYMC11_16 (COLORSPACE_SH(PT_MCH11)|CHANNELS_SH(11)|BYTES_SH(2)|DOSWAP_SH(1)) +#define TYPE_KYMC11_16_SE (COLORSPACE_SH(PT_MCH11)|CHANNELS_SH(11)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1)) +#define TYPE_CMYK12_8 (COLORSPACE_SH(PT_MCH12)|CHANNELS_SH(12)|BYTES_SH(1)) +#define TYPE_CMYK12_16 (COLORSPACE_SH(PT_MCH12)|CHANNELS_SH(12)|BYTES_SH(2)) +#define TYPE_CMYK12_16_SE (COLORSPACE_SH(PT_MCH12)|CHANNELS_SH(12)|BYTES_SH(2)|ENDIAN16_SH(1)) +#define TYPE_KYMC12_8 (COLORSPACE_SH(PT_MCH12)|CHANNELS_SH(12)|BYTES_SH(1)|DOSWAP_SH(1)) +#define TYPE_KYMC12_16 (COLORSPACE_SH(PT_MCH12)|CHANNELS_SH(12)|BYTES_SH(2)|DOSWAP_SH(1)) +#define TYPE_KYMC12_16_SE (COLORSPACE_SH(PT_MCH12)|CHANNELS_SH(12)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1)) + +// Colorimetric +#define TYPE_XYZ_16 (COLORSPACE_SH(PT_XYZ)|CHANNELS_SH(3)|BYTES_SH(2)) +#define TYPE_Lab_8 (COLORSPACE_SH(PT_Lab)|CHANNELS_SH(3)|BYTES_SH(1)) +#define TYPE_LabV2_8 (COLORSPACE_SH(PT_LabV2)|CHANNELS_SH(3)|BYTES_SH(1)) + +#define TYPE_ALab_8 (COLORSPACE_SH(PT_Lab)|CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1)|SWAPFIRST_SH(1)) +#define TYPE_ALabV2_8 (COLORSPACE_SH(PT_LabV2)|CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1)|SWAPFIRST_SH(1)) +#define TYPE_Lab_16 (COLORSPACE_SH(PT_Lab)|CHANNELS_SH(3)|BYTES_SH(2)) +#define TYPE_LabV2_16 (COLORSPACE_SH(PT_LabV2)|CHANNELS_SH(3)|BYTES_SH(2)) +#define TYPE_Yxy_16 (COLORSPACE_SH(PT_Yxy)|CHANNELS_SH(3)|BYTES_SH(2)) + +// YCbCr +#define TYPE_YCbCr_8 (COLORSPACE_SH(PT_YCbCr)|CHANNELS_SH(3)|BYTES_SH(1)) +#define TYPE_YCbCr_8_PLANAR (COLORSPACE_SH(PT_YCbCr)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1)) +#define TYPE_YCbCr_16 (COLORSPACE_SH(PT_YCbCr)|CHANNELS_SH(3)|BYTES_SH(2)) +#define TYPE_YCbCr_16_PLANAR (COLORSPACE_SH(PT_YCbCr)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1)) +#define TYPE_YCbCr_16_SE (COLORSPACE_SH(PT_YCbCr)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1)) + +// YUV +#define TYPE_YUV_8 (COLORSPACE_SH(PT_YUV)|CHANNELS_SH(3)|BYTES_SH(1)) +#define TYPE_YUV_8_PLANAR (COLORSPACE_SH(PT_YUV)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1)) +#define TYPE_YUV_16 (COLORSPACE_SH(PT_YUV)|CHANNELS_SH(3)|BYTES_SH(2)) +#define TYPE_YUV_16_PLANAR (COLORSPACE_SH(PT_YUV)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1)) +#define TYPE_YUV_16_SE (COLORSPACE_SH(PT_YUV)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1)) + +// HLS +#define TYPE_HLS_8 (COLORSPACE_SH(PT_HLS)|CHANNELS_SH(3)|BYTES_SH(1)) +#define TYPE_HLS_8_PLANAR (COLORSPACE_SH(PT_HLS)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1)) +#define TYPE_HLS_16 (COLORSPACE_SH(PT_HLS)|CHANNELS_SH(3)|BYTES_SH(2)) +#define TYPE_HLS_16_PLANAR (COLORSPACE_SH(PT_HLS)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1)) +#define TYPE_HLS_16_SE (COLORSPACE_SH(PT_HLS)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1)) + +// HSV +#define TYPE_HSV_8 (COLORSPACE_SH(PT_HSV)|CHANNELS_SH(3)|BYTES_SH(1)) +#define TYPE_HSV_8_PLANAR (COLORSPACE_SH(PT_HSV)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1)) +#define TYPE_HSV_16 (COLORSPACE_SH(PT_HSV)|CHANNELS_SH(3)|BYTES_SH(2)) +#define TYPE_HSV_16_PLANAR (COLORSPACE_SH(PT_HSV)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1)) +#define TYPE_HSV_16_SE (COLORSPACE_SH(PT_HSV)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1)) + +// Named color index. Only 16 bits is allowed (don't check colorspace) +#define TYPE_NAMED_COLOR_INDEX (CHANNELS_SH(1)|BYTES_SH(2)) + +// Float formatters. +#define TYPE_XYZ_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_XYZ)|CHANNELS_SH(3)|BYTES_SH(4)) +#define TYPE_Lab_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_Lab)|CHANNELS_SH(3)|BYTES_SH(4)) +#define TYPE_LabA_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_Lab)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(4)) +#define TYPE_GRAY_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(4)) +#define TYPE_GRAYA_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(4)|EXTRA_SH(1)) +#define TYPE_GRAYA_FLT_PREMUL (FLOAT_SH(1)|COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(4)|EXTRA_SH(1)|PREMUL_SH(1)) +#define TYPE_RGB_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(4)) + +#define TYPE_RGBA_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(4)) +#define TYPE_RGBA_FLT_PREMUL (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(4)|PREMUL_SH(1)) +#define TYPE_ARGB_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(4)|SWAPFIRST_SH(1)) +#define TYPE_ARGB_FLT_PREMUL (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(4)|SWAPFIRST_SH(1)|PREMUL_SH(1)) +#define TYPE_BGR_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(4)|DOSWAP_SH(1)) +#define TYPE_BGRA_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(4)|DOSWAP_SH(1)|SWAPFIRST_SH(1)) +#define TYPE_BGRA_FLT_PREMUL (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(4)|DOSWAP_SH(1)|SWAPFIRST_SH(1)|PREMUL_SH(1)) +#define TYPE_ABGR_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(4)|DOSWAP_SH(1)) +#define TYPE_ABGR_FLT_PREMUL (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(4)|DOSWAP_SH(1)|PREMUL_SH(1)) + +#define TYPE_CMYK_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(4)) + +// Floating point formatters. +// NOTE THAT 'BYTES' FIELD IS SET TO ZERO ON DLB because 8 bytes overflows the bitfield +#define TYPE_XYZ_DBL (FLOAT_SH(1)|COLORSPACE_SH(PT_XYZ)|CHANNELS_SH(3)|BYTES_SH(0)) +#define TYPE_Lab_DBL (FLOAT_SH(1)|COLORSPACE_SH(PT_Lab)|CHANNELS_SH(3)|BYTES_SH(0)) +#define TYPE_GRAY_DBL (FLOAT_SH(1)|COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(0)) +#define TYPE_RGB_DBL (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(0)) +#define TYPE_BGR_DBL (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(0)|DOSWAP_SH(1)) +#define TYPE_CMYK_DBL (FLOAT_SH(1)|COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(0)) +#define TYPE_OKLAB_DBL (FLOAT_SH(1)|COLORSPACE_SH(PT_MCH3)|CHANNELS_SH(3)|BYTES_SH(0)) + +// IEEE 754-2008 "half" +#define TYPE_GRAY_HALF_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(2)) +#define TYPE_RGB_HALF_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)) +#define TYPE_CMYK_HALF_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)) + +#define TYPE_RGBA_HALF_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)) +#define TYPE_ARGB_HALF_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|SWAPFIRST_SH(1)) +#define TYPE_BGR_HALF_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)) +#define TYPE_BGRA_HALF_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|SWAPFIRST_SH(1)) +#define TYPE_ABGR_HALF_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)) + +#endif + +// Colorspaces +typedef struct { + cmsFloat64Number X; + cmsFloat64Number Y; + cmsFloat64Number Z; + + } cmsCIEXYZ; + +typedef struct { + cmsFloat64Number x; + cmsFloat64Number y; + cmsFloat64Number Y; + + } cmsCIExyY; + +typedef struct { + cmsFloat64Number L; + cmsFloat64Number a; + cmsFloat64Number b; + + } cmsCIELab; + +typedef struct { + cmsFloat64Number L; + cmsFloat64Number C; + cmsFloat64Number h; + + } cmsCIELCh; + +typedef struct { + cmsFloat64Number J; + cmsFloat64Number C; + cmsFloat64Number h; + + } cmsJCh; + +typedef struct { + cmsCIEXYZ Red; + cmsCIEXYZ Green; + cmsCIEXYZ Blue; + + } cmsCIEXYZTRIPLE; + +typedef struct { + cmsCIExyY Red; + cmsCIExyY Green; + cmsCIExyY Blue; + + } cmsCIExyYTRIPLE; + +// Illuminant types for structs below +#define cmsILLUMINANT_TYPE_UNKNOWN 0x0000000 +#define cmsILLUMINANT_TYPE_D50 0x0000001 +#define cmsILLUMINANT_TYPE_D65 0x0000002 +#define cmsILLUMINANT_TYPE_D93 0x0000003 +#define cmsILLUMINANT_TYPE_F2 0x0000004 +#define cmsILLUMINANT_TYPE_D55 0x0000005 +#define cmsILLUMINANT_TYPE_A 0x0000006 +#define cmsILLUMINANT_TYPE_E 0x0000007 +#define cmsILLUMINANT_TYPE_F8 0x0000008 + +typedef struct { + cmsUInt32Number Observer; // 0 = unknown, 1=CIE 1931, 2=CIE 1964 + cmsCIEXYZ Backing; // Value of backing + cmsUInt32Number Geometry; // 0=unknown, 1=45/0, 0/45 2=0d, d/0 + cmsFloat64Number Flare; // 0..1.0 + cmsUInt32Number IlluminantType; + + } cmsICCMeasurementConditions; + +typedef struct { + cmsCIEXYZ IlluminantXYZ; // Not the same struct as CAM02, + cmsCIEXYZ SurroundXYZ; // This is for storing the tag + cmsUInt32Number IlluminantType; // viewing condition + + } cmsICCViewingConditions; + +typedef struct { + cmsUInt8Number ColourPrimaries; // Recommendation ITU-T H.273 + cmsUInt8Number TransferCharacteristics; // (ISO/IEC 23091-2) + cmsUInt8Number MatrixCoefficients; + cmsUInt8Number VideoFullRangeFlag; + +} cmsVideoSignalType; + +typedef struct { + cmsUInt32Number CurveEntries; + cmsFloat64Number* RedCurve; + cmsFloat64Number* GreenCurve; + cmsFloat64Number* BlueCurve; + + cmsFloat64Number MinLuminance; // ST.2086 min luminance in nits + cmsFloat64Number PeakLuminance; // ST.2086 peak luminance in nits + + cmsFloat64Number XYZ2XYZmatrix[3][4]; + +} cmsMHC2Type; + + + +// Get LittleCMS version (for shared objects) ----------------------------------------------------------------------------- + +CMSAPI int CMSEXPORT cmsGetEncodedCMMversion(void); + +// Support of non-standard functions -------------------------------------------------------------------------------------- + +CMSAPI int CMSEXPORT cmsstrcasecmp(const char* s1, const char* s2); + +#ifdef CMS_LARGE_FILE_SUPPORT +CMSAPI long long int CMSEXPORT cmsfilelength(FILE* f); +#else +CMSAPI long int CMSEXPORT cmsfilelength(FILE* f); +#endif + +// Context handling -------------------------------------------------------------------------------------------------------- + +// Each context holds its owns globals and its own plug-ins. There is a global context with the id = 0 for lecacy compatibility +// though using the global context is not recommended. Proper context handling makes lcms more thread-safe. + +typedef struct _cmsContext_struct* cmsContext; + +CMSAPI cmsContext CMSEXPORT cmsCreateContext(void* Plugin, void* UserData); +CMSAPI void CMSEXPORT cmsDeleteContext(cmsContext ContextID); +CMSAPI cmsContext CMSEXPORT cmsDupContext(cmsContext ContextID, void* NewUserData); +CMSAPI void* CMSEXPORT cmsGetContextUserData(cmsContext ContextID); + +// Plug-In registering -------------------------------------------------------------------------------------------------- + +CMSAPI cmsBool CMSEXPORT cmsPlugin(void* Plugin); +CMSAPI cmsBool CMSEXPORT cmsPluginTHR(cmsContext ContextID, void* Plugin); +CMSAPI void CMSEXPORT cmsUnregisterPlugins(void); +CMSAPI void CMSEXPORT cmsUnregisterPluginsTHR(cmsContext ContextID); + +// Error logging ---------------------------------------------------------------------------------------------------------- + +// There is no error handling at all. When a function fails, it returns proper value. +// For example, all create functions does return NULL on failure. Other may return FALSE. +// It may be interesting, for the developer, to know why the function is failing. +// for that reason, lcms2 does offer a logging function. This function will get +// an ENGLISH string with some clues on what is going wrong. You can show this +// info to the end user if you wish, or just create some sort of log on disk. +// The logging function should NOT terminate the program, as this obviously can leave +// unfreed resources. It is the programmer's responsibility to check each function +// return code to make sure it didn't fail. + +#define cmsERROR_UNDEFINED 0 +#define cmsERROR_FILE 1 +#define cmsERROR_RANGE 2 +#define cmsERROR_INTERNAL 3 +#define cmsERROR_NULL 4 +#define cmsERROR_READ 5 +#define cmsERROR_SEEK 6 +#define cmsERROR_WRITE 7 +#define cmsERROR_UNKNOWN_EXTENSION 8 +#define cmsERROR_COLORSPACE_CHECK 9 +#define cmsERROR_ALREADY_DEFINED 10 +#define cmsERROR_BAD_SIGNATURE 11 +#define cmsERROR_CORRUPTION_DETECTED 12 +#define cmsERROR_NOT_SUITABLE 13 + +// Error logger is called with the ContextID when a message is raised. This gives the +// chance to know which thread is responsible of the warning and any environment associated +// with it. Non-multithreading applications may safely ignore this parameter. +// Note that under certain special circumstances, ContextID may be NULL. +typedef void (* cmsLogErrorHandlerFunction)(cmsContext ContextID, cmsUInt32Number ErrorCode, const char *Text); + +// Allows user to set any specific logger +CMSAPI void CMSEXPORT cmsSetLogErrorHandler(cmsLogErrorHandlerFunction Fn); +CMSAPI void CMSEXPORT cmsSetLogErrorHandlerTHR(cmsContext ContextID, cmsLogErrorHandlerFunction Fn); + +// Conversions -------------------------------------------------------------------------------------------------------------- + +// Returns pointers to constant structs +CMSAPI const cmsCIEXYZ* CMSEXPORT cmsD50_XYZ(void); +CMSAPI const cmsCIExyY* CMSEXPORT cmsD50_xyY(void); + +// Colorimetric space conversions +CMSAPI void CMSEXPORT cmsXYZ2xyY(cmsCIExyY* Dest, const cmsCIEXYZ* Source); +CMSAPI void CMSEXPORT cmsxyY2XYZ(cmsCIEXYZ* Dest, const cmsCIExyY* Source); +CMSAPI void CMSEXPORT cmsXYZ2Lab(const cmsCIEXYZ* WhitePoint, cmsCIELab* Lab, const cmsCIEXYZ* xyz); +CMSAPI void CMSEXPORT cmsLab2XYZ(const cmsCIEXYZ* WhitePoint, cmsCIEXYZ* xyz, const cmsCIELab* Lab); +CMSAPI void CMSEXPORT cmsLab2LCh(cmsCIELCh*LCh, const cmsCIELab* Lab); +CMSAPI void CMSEXPORT cmsLCh2Lab(cmsCIELab* Lab, const cmsCIELCh* LCh); + +// Encoding /Decoding on PCS +CMSAPI void CMSEXPORT cmsLabEncoded2Float(cmsCIELab* Lab, const cmsUInt16Number wLab[3]); +CMSAPI void CMSEXPORT cmsLabEncoded2FloatV2(cmsCIELab* Lab, const cmsUInt16Number wLab[3]); +CMSAPI void CMSEXPORT cmsFloat2LabEncoded(cmsUInt16Number wLab[3], const cmsCIELab* Lab); +CMSAPI void CMSEXPORT cmsFloat2LabEncodedV2(cmsUInt16Number wLab[3], const cmsCIELab* Lab); +CMSAPI void CMSEXPORT cmsXYZEncoded2Float(cmsCIEXYZ* fxyz, const cmsUInt16Number XYZ[3]); +CMSAPI void CMSEXPORT cmsFloat2XYZEncoded(cmsUInt16Number XYZ[3], const cmsCIEXYZ* fXYZ); + +// DeltaE metrics +CMSAPI cmsFloat64Number CMSEXPORT cmsDeltaE(const cmsCIELab* Lab1, const cmsCIELab* Lab2); +CMSAPI cmsFloat64Number CMSEXPORT cmsCIE94DeltaE(const cmsCIELab* Lab1, const cmsCIELab* Lab2); +CMSAPI cmsFloat64Number CMSEXPORT cmsBFDdeltaE(const cmsCIELab* Lab1, const cmsCIELab* Lab2); +CMSAPI cmsFloat64Number CMSEXPORT cmsCMCdeltaE(const cmsCIELab* Lab1, const cmsCIELab* Lab2, cmsFloat64Number l, cmsFloat64Number c); +CMSAPI cmsFloat64Number CMSEXPORT cmsCIE2000DeltaE(const cmsCIELab* Lab1, const cmsCIELab* Lab2, cmsFloat64Number Kl, cmsFloat64Number Kc, cmsFloat64Number Kh); + +// Temperature <-> Chromaticity (Black body) +CMSAPI cmsBool CMSEXPORT cmsWhitePointFromTemp(cmsCIExyY* WhitePoint, cmsFloat64Number TempK); +CMSAPI cmsBool CMSEXPORT cmsTempFromWhitePoint(cmsFloat64Number* TempK, const cmsCIExyY* WhitePoint); + +// Chromatic adaptation +CMSAPI cmsBool CMSEXPORT cmsAdaptToIlluminant(cmsCIEXYZ* Result, const cmsCIEXYZ* SourceWhitePt, + const cmsCIEXYZ* Illuminant, + const cmsCIEXYZ* Value); + +// CIECAM02 --------------------------------------------------------------------------------------------------- + +// Viewing conditions. Please note those are CAM model viewing conditions, and not the ICC tag viewing +// conditions, which I'm naming cmsICCViewingConditions to make differences evident. Unfortunately, the tag +// cannot deal with surround La, Yb and D value so is basically useless to store CAM02 viewing conditions. + + +#define AVG_SURROUND 1 +#define DIM_SURROUND 2 +#define DARK_SURROUND 3 +#define CUTSHEET_SURROUND 4 + +#define D_CALCULATE (-1) + +typedef struct { + cmsCIEXYZ whitePoint; + cmsFloat64Number Yb; + cmsFloat64Number La; + cmsUInt32Number surround; + cmsFloat64Number D_value; + + } cmsViewingConditions; + +CMSAPI cmsHANDLE CMSEXPORT cmsCIECAM02Init(cmsContext ContextID, const cmsViewingConditions* pVC); +CMSAPI void CMSEXPORT cmsCIECAM02Done(cmsHANDLE hModel); +CMSAPI void CMSEXPORT cmsCIECAM02Forward(cmsHANDLE hModel, const cmsCIEXYZ* pIn, cmsJCh* pOut); +CMSAPI void CMSEXPORT cmsCIECAM02Reverse(cmsHANDLE hModel, const cmsJCh* pIn, cmsCIEXYZ* pOut); + + +// Tone curves ----------------------------------------------------------------------------------------- + +// This describes a curve segment. For a table of supported types, see the manual. User can increase the number of +// available types by using a proper plug-in. Parametric segments allow 10 parameters at most + +typedef struct { + cmsFloat32Number x0, x1; // Domain; for x0 < x <= x1 + cmsInt32Number Type; // Parametric type, Type == 0 means sampled segment. Negative values are reserved + cmsFloat64Number Params[10]; // Parameters if Type != 0 + cmsUInt32Number nGridPoints; // Number of grid points if Type == 0 + cmsFloat32Number* SampledPoints; // Points to an array of floats if Type == 0 + +} cmsCurveSegment; + +// The internal representation is none of your business. +typedef struct _cms_curve_struct cmsToneCurve; + +CMSAPI cmsToneCurve* CMSEXPORT cmsBuildSegmentedToneCurve(cmsContext ContextID, cmsUInt32Number nSegments, const cmsCurveSegment Segments[]); +CMSAPI cmsToneCurve* CMSEXPORT cmsBuildParametricToneCurve(cmsContext ContextID, cmsInt32Number Type, const cmsFloat64Number Params[]); +CMSAPI cmsToneCurve* CMSEXPORT cmsBuildGamma(cmsContext ContextID, cmsFloat64Number Gamma); +CMSAPI cmsToneCurve* CMSEXPORT cmsBuildTabulatedToneCurve16(cmsContext ContextID, cmsUInt32Number nEntries, const cmsUInt16Number values[]); +CMSAPI cmsToneCurve* CMSEXPORT cmsBuildTabulatedToneCurveFloat(cmsContext ContextID, cmsUInt32Number nEntries, const cmsFloat32Number values[]); +CMSAPI void CMSEXPORT cmsFreeToneCurve(cmsToneCurve* Curve); +CMSAPI void CMSEXPORT cmsFreeToneCurveTriple(cmsToneCurve* Curve[3]); +CMSAPI cmsToneCurve* CMSEXPORT cmsDupToneCurve(const cmsToneCurve* Src); +CMSAPI cmsToneCurve* CMSEXPORT cmsReverseToneCurve(const cmsToneCurve* InGamma); +CMSAPI cmsToneCurve* CMSEXPORT cmsReverseToneCurveEx(cmsUInt32Number nResultSamples, const cmsToneCurve* InGamma); +CMSAPI cmsToneCurve* CMSEXPORT cmsJoinToneCurve(cmsContext ContextID, const cmsToneCurve* X, const cmsToneCurve* Y, cmsUInt32Number nPoints); +CMSAPI cmsBool CMSEXPORT cmsSmoothToneCurve(cmsToneCurve* Tab, cmsFloat64Number lambda); +CMSAPI cmsFloat32Number CMSEXPORT cmsEvalToneCurveFloat(const cmsToneCurve* Curve, cmsFloat32Number v); +CMSAPI cmsUInt16Number CMSEXPORT cmsEvalToneCurve16(const cmsToneCurve* Curve, cmsUInt16Number v); +CMSAPI cmsBool CMSEXPORT cmsIsToneCurveMultisegment(const cmsToneCurve* InGamma); +CMSAPI cmsBool CMSEXPORT cmsIsToneCurveLinear(const cmsToneCurve* Curve); +CMSAPI cmsBool CMSEXPORT cmsIsToneCurveMonotonic(const cmsToneCurve* t); +CMSAPI cmsBool CMSEXPORT cmsIsToneCurveDescending(const cmsToneCurve* t); +CMSAPI cmsInt32Number CMSEXPORT cmsGetToneCurveParametricType(const cmsToneCurve* t); +CMSAPI cmsFloat64Number CMSEXPORT cmsEstimateGamma(const cmsToneCurve* t, cmsFloat64Number Precision); + +CMSAPI const cmsCurveSegment* CMSEXPORT cmsGetToneCurveSegment(cmsInt32Number n, const cmsToneCurve* t); + +// Tone curve tabular estimation +CMSAPI cmsUInt32Number CMSEXPORT cmsGetToneCurveEstimatedTableEntries(const cmsToneCurve* t); +CMSAPI const cmsUInt16Number* CMSEXPORT cmsGetToneCurveEstimatedTable(const cmsToneCurve* t); + + +// Implements pipelines of multi-processing elements ------------------------------------------------------------- + +// Nothing to see here, move along +typedef struct _cmsPipeline_struct cmsPipeline; +typedef struct _cmsStage_struct cmsStage; + +// Those are hi-level pipelines +CMSAPI cmsPipeline* CMSEXPORT cmsPipelineAlloc(cmsContext ContextID, cmsUInt32Number InputChannels, cmsUInt32Number OutputChannels); +CMSAPI void CMSEXPORT cmsPipelineFree(cmsPipeline* lut); +CMSAPI cmsPipeline* CMSEXPORT cmsPipelineDup(const cmsPipeline* Orig); + +CMSAPI cmsContext CMSEXPORT cmsGetPipelineContextID(const cmsPipeline* lut); +CMSAPI cmsUInt32Number CMSEXPORT cmsPipelineInputChannels(const cmsPipeline* lut); +CMSAPI cmsUInt32Number CMSEXPORT cmsPipelineOutputChannels(const cmsPipeline* lut); + +CMSAPI cmsUInt32Number CMSEXPORT cmsPipelineStageCount(const cmsPipeline* lut); +CMSAPI cmsStage* CMSEXPORT cmsPipelineGetPtrToFirstStage(const cmsPipeline* lut); +CMSAPI cmsStage* CMSEXPORT cmsPipelineGetPtrToLastStage(const cmsPipeline* lut); + +CMSAPI void CMSEXPORT cmsPipelineEval16(const cmsUInt16Number In[], cmsUInt16Number Out[], const cmsPipeline* lut); +CMSAPI void CMSEXPORT cmsPipelineEvalFloat(const cmsFloat32Number In[], cmsFloat32Number Out[], const cmsPipeline* lut); +CMSAPI cmsBool CMSEXPORT cmsPipelineEvalReverseFloat(cmsFloat32Number Target[], cmsFloat32Number Result[], cmsFloat32Number Hint[], const cmsPipeline* lut); +CMSAPI cmsBool CMSEXPORT cmsPipelineCat(cmsPipeline* l1, const cmsPipeline* l2); +CMSAPI cmsBool CMSEXPORT cmsPipelineSetSaveAs8bitsFlag(cmsPipeline* lut, cmsBool On); + +// Where to place/locate the stages in the pipeline chain +typedef enum { cmsAT_BEGIN, cmsAT_END } cmsStageLoc; + +CMSAPI cmsBool CMSEXPORT cmsPipelineInsertStage(cmsPipeline* lut, cmsStageLoc loc, cmsStage* mpe); +CMSAPI void CMSEXPORT cmsPipelineUnlinkStage(cmsPipeline* lut, cmsStageLoc loc, cmsStage** mpe); + +// This function is quite useful to analyze the structure of a Pipeline and retrieve the Stage elements +// that conform the Pipeline. It should be called with the Pipeline, the number of expected elements and +// then a list of expected types followed with a list of double pointers to Stage elements. If +// the function founds a match with current pipeline, it fills the pointers and returns TRUE +// if not, returns FALSE without touching anything. +CMSAPI cmsBool CMSEXPORT cmsPipelineCheckAndRetreiveStages(const cmsPipeline* Lut, cmsUInt32Number n, ...); + +// Matrix has double precision and CLUT has only float precision. That is because an ICC profile can encode +// matrices with far more precision that CLUTS +CMSAPI cmsStage* CMSEXPORT cmsStageAllocIdentity(cmsContext ContextID, cmsUInt32Number nChannels); +CMSAPI cmsStage* CMSEXPORT cmsStageAllocToneCurves(cmsContext ContextID, cmsUInt32Number nChannels, cmsToneCurve* const Curves[]); +CMSAPI cmsStage* CMSEXPORT cmsStageAllocMatrix(cmsContext ContextID, cmsUInt32Number Rows, cmsUInt32Number Cols, const cmsFloat64Number* Matrix, const cmsFloat64Number* Offset); + +CMSAPI cmsStage* CMSEXPORT cmsStageAllocCLut16bit(cmsContext ContextID, cmsUInt32Number nGridPoints, cmsUInt32Number inputChan, cmsUInt32Number outputChan, const cmsUInt16Number* Table); +CMSAPI cmsStage* CMSEXPORT cmsStageAllocCLutFloat(cmsContext ContextID, cmsUInt32Number nGridPoints, cmsUInt32Number inputChan, cmsUInt32Number outputChan, const cmsFloat32Number* Table); + +CMSAPI cmsStage* CMSEXPORT cmsStageAllocCLut16bitGranular(cmsContext ContextID, const cmsUInt32Number clutPoints[], cmsUInt32Number inputChan, cmsUInt32Number outputChan, const cmsUInt16Number* Table); +CMSAPI cmsStage* CMSEXPORT cmsStageAllocCLutFloatGranular(cmsContext ContextID, const cmsUInt32Number clutPoints[], cmsUInt32Number inputChan, cmsUInt32Number outputChan, const cmsFloat32Number* Table); + +CMSAPI cmsStage* CMSEXPORT cmsStageDup(cmsStage* mpe); +CMSAPI void CMSEXPORT cmsStageFree(cmsStage* mpe); +CMSAPI cmsStage* CMSEXPORT cmsStageNext(const cmsStage* mpe); + +CMSAPI cmsUInt32Number CMSEXPORT cmsStageInputChannels(const cmsStage* mpe); +CMSAPI cmsUInt32Number CMSEXPORT cmsStageOutputChannels(const cmsStage* mpe); +CMSAPI cmsStageSignature CMSEXPORT cmsStageType(const cmsStage* mpe); +CMSAPI void* CMSEXPORT cmsStageData(const cmsStage* mpe); +CMSAPI cmsContext CMSEXPORT cmsGetStageContextID(const cmsStage* mpe); + +// Sampling +typedef cmsInt32Number (* cmsSAMPLER16) (CMSREGISTER const cmsUInt16Number In[], + CMSREGISTER cmsUInt16Number Out[], + CMSREGISTER void * Cargo); + +typedef cmsInt32Number (* cmsSAMPLERFLOAT)(CMSREGISTER const cmsFloat32Number In[], + CMSREGISTER cmsFloat32Number Out[], + CMSREGISTER void * Cargo); + +// Use this flag to prevent changes being written to destination +#define SAMPLER_INSPECT 0x01000000 + +// For CLUT only +CMSAPI cmsBool CMSEXPORT cmsStageSampleCLut16bit(cmsStage* mpe, cmsSAMPLER16 Sampler, void* Cargo, cmsUInt32Number dwFlags); +CMSAPI cmsBool CMSEXPORT cmsStageSampleCLutFloat(cmsStage* mpe, cmsSAMPLERFLOAT Sampler, void* Cargo, cmsUInt32Number dwFlags); + +// Slicers +CMSAPI cmsBool CMSEXPORT cmsSliceSpace16(cmsUInt32Number nInputs, const cmsUInt32Number clutPoints[], + cmsSAMPLER16 Sampler, void * Cargo); + +CMSAPI cmsBool CMSEXPORT cmsSliceSpaceFloat(cmsUInt32Number nInputs, const cmsUInt32Number clutPoints[], + cmsSAMPLERFLOAT Sampler, void * Cargo); + +// Multilocalized Unicode management --------------------------------------------------------------------------------------- + +typedef struct _cms_MLU_struct cmsMLU; + +#define cmsNoLanguage "\0\0" +#define cmsNoCountry "\0\0" + +// Special language/country to retrieve unicode field for description in V2 profiles. Use with care. +#define cmsV2Unicode "\xff\xff" + +CMSAPI cmsMLU* CMSEXPORT cmsMLUalloc(cmsContext ContextID, cmsUInt32Number nItems); +CMSAPI void CMSEXPORT cmsMLUfree(cmsMLU* mlu); +CMSAPI cmsMLU* CMSEXPORT cmsMLUdup(const cmsMLU* mlu); + +CMSAPI cmsBool CMSEXPORT cmsMLUsetASCII(cmsMLU* mlu, + const char LanguageCode[3], const char CountryCode[3], + const char* ASCIIString); +CMSAPI cmsBool CMSEXPORT cmsMLUsetWide(cmsMLU* mlu, + const char LanguageCode[3], const char CountryCode[3], + const wchar_t* WideString); +CMSAPI cmsBool CMSEXPORT cmsMLUsetUTF8(cmsMLU* mlu, + const char LanguageCode[3], const char CountryCode[3], + const char* UTF8String); + +CMSAPI cmsUInt32Number CMSEXPORT cmsMLUgetASCII(const cmsMLU* mlu, + const char LanguageCode[3], const char CountryCode[3], + char* Buffer, cmsUInt32Number BufferSize); + +CMSAPI cmsUInt32Number CMSEXPORT cmsMLUgetWide(const cmsMLU* mlu, + const char LanguageCode[3], const char CountryCode[3], + wchar_t* Buffer, cmsUInt32Number BufferSize); +CMSAPI cmsUInt32Number CMSEXPORT cmsMLUgetUTF8(const cmsMLU* mlu, + const char LanguageCode[3], const char CountryCode[3], + char* Buffer, cmsUInt32Number BufferSize); + + +CMSAPI cmsBool CMSEXPORT cmsMLUgetTranslation(const cmsMLU* mlu, + const char LanguageCode[3], const char CountryCode[3], + char ObtainedLanguage[3], char ObtainedCountry[3]); + +CMSAPI cmsUInt32Number CMSEXPORT cmsMLUtranslationsCount(const cmsMLU* mlu); + +CMSAPI cmsBool CMSEXPORT cmsMLUtranslationsCodes(const cmsMLU* mlu, + cmsUInt32Number idx, + char LanguageCode[3], + char CountryCode[3]); + +// Undercolorremoval & black generation ------------------------------------------------------------------------------------- + +typedef struct { + cmsToneCurve* Ucr; + cmsToneCurve* Bg; + cmsMLU* Desc; + +} cmsUcrBg; + +// Screening ---------------------------------------------------------------------------------------------------------------- + +#define cmsPRINTER_DEFAULT_SCREENS 0x0001 +#define cmsFREQUENCE_UNITS_LINES_CM 0x0000 +#define cmsFREQUENCE_UNITS_LINES_INCH 0x0002 + +#define cmsSPOT_UNKNOWN 0 +#define cmsSPOT_PRINTER_DEFAULT 1 +#define cmsSPOT_ROUND 2 +#define cmsSPOT_DIAMOND 3 +#define cmsSPOT_ELLIPSE 4 +#define cmsSPOT_LINE 5 +#define cmsSPOT_SQUARE 6 +#define cmsSPOT_CROSS 7 + +typedef struct { + cmsFloat64Number Frequency; + cmsFloat64Number ScreenAngle; + cmsUInt32Number SpotShape; + +} cmsScreeningChannel; + +typedef struct { + cmsUInt32Number Flag; + cmsUInt32Number nChannels; + cmsScreeningChannel Channels[cmsMAXCHANNELS]; + +} cmsScreening; + + +// Named color ----------------------------------------------------------------------------------------------------------------- + +typedef struct _cms_NAMEDCOLORLIST_struct cmsNAMEDCOLORLIST; + +CMSAPI cmsNAMEDCOLORLIST* CMSEXPORT cmsAllocNamedColorList(cmsContext ContextID, + cmsUInt32Number n, + cmsUInt32Number ColorantCount, + const char* Prefix, const char* Suffix); + +CMSAPI void CMSEXPORT cmsFreeNamedColorList(cmsNAMEDCOLORLIST* v); +CMSAPI cmsNAMEDCOLORLIST* CMSEXPORT cmsDupNamedColorList(const cmsNAMEDCOLORLIST* v); +CMSAPI cmsBool CMSEXPORT cmsAppendNamedColor(cmsNAMEDCOLORLIST* v, const char* Name, + cmsUInt16Number PCS[3], + cmsUInt16Number Colorant[cmsMAXCHANNELS]); + +CMSAPI cmsUInt32Number CMSEXPORT cmsNamedColorCount(const cmsNAMEDCOLORLIST* v); +CMSAPI cmsInt32Number CMSEXPORT cmsNamedColorIndex(const cmsNAMEDCOLORLIST* v, const char* Name); + +CMSAPI cmsBool CMSEXPORT cmsNamedColorInfo(const cmsNAMEDCOLORLIST* NamedColorList, cmsUInt32Number nColor, + char* Name, + char* Prefix, + char* Suffix, + cmsUInt16Number* PCS, + cmsUInt16Number* Colorant); + +// Retrieve named color list from transform +CMSAPI cmsNAMEDCOLORLIST* CMSEXPORT cmsGetNamedColorList(cmsHTRANSFORM xform); + +// Profile sequence ----------------------------------------------------------------------------------------------------- + +// Profile sequence descriptor. Some fields come from profile sequence descriptor tag, others +// come from Profile Sequence Identifier Tag +typedef struct { + + cmsSignature deviceMfg; + cmsSignature deviceModel; + cmsUInt64Number attributes; + cmsTechnologySignature technology; + cmsProfileID ProfileID; + cmsMLU* Manufacturer; + cmsMLU* Model; + cmsMLU* Description; + +} cmsPSEQDESC; + +typedef struct { + + cmsUInt32Number n; + cmsContext ContextID; + cmsPSEQDESC* seq; + +} cmsSEQ; + +CMSAPI cmsSEQ* CMSEXPORT cmsAllocProfileSequenceDescription(cmsContext ContextID, cmsUInt32Number n); +CMSAPI cmsSEQ* CMSEXPORT cmsDupProfileSequenceDescription(const cmsSEQ* pseq); +CMSAPI void CMSEXPORT cmsFreeProfileSequenceDescription(cmsSEQ* pseq); + +// Dictionaries -------------------------------------------------------------------------------------------------------- + +typedef struct _cmsDICTentry_struct { + + struct _cmsDICTentry_struct* Next; + + cmsMLU *DisplayName; + cmsMLU *DisplayValue; + wchar_t* Name; + wchar_t* Value; + +} cmsDICTentry; + +CMSAPI cmsHANDLE CMSEXPORT cmsDictAlloc(cmsContext ContextID); +CMSAPI void CMSEXPORT cmsDictFree(cmsHANDLE hDict); +CMSAPI cmsHANDLE CMSEXPORT cmsDictDup(cmsHANDLE hDict); + +CMSAPI cmsBool CMSEXPORT cmsDictAddEntry(cmsHANDLE hDict, const wchar_t* Name, const wchar_t* Value, const cmsMLU *DisplayName, const cmsMLU *DisplayValue); +CMSAPI const cmsDICTentry* CMSEXPORT cmsDictGetEntryList(cmsHANDLE hDict); +CMSAPI const cmsDICTentry* CMSEXPORT cmsDictNextEntry(const cmsDICTentry* e); + +// Access to Profile data ---------------------------------------------------------------------------------------------- +CMSAPI cmsHPROFILE CMSEXPORT cmsCreateProfilePlaceholder(cmsContext ContextID); + +CMSAPI cmsContext CMSEXPORT cmsGetProfileContextID(cmsHPROFILE hProfile); +CMSAPI cmsInt32Number CMSEXPORT cmsGetTagCount(cmsHPROFILE hProfile); +CMSAPI cmsTagSignature CMSEXPORT cmsGetTagSignature(cmsHPROFILE hProfile, cmsUInt32Number n); +CMSAPI cmsBool CMSEXPORT cmsGetTagOffsetAndSize(cmsHPROFILE hProfile, cmsUInt32Number n, cmsUInt32Number* offset, cmsUInt32Number* size); +CMSAPI cmsBool CMSEXPORT cmsIsTag(cmsHPROFILE hProfile, cmsTagSignature sig); + +// Read and write pre-formatted data +CMSAPI void* CMSEXPORT cmsReadTag(cmsHPROFILE hProfile, cmsTagSignature sig); +CMSAPI cmsBool CMSEXPORT cmsWriteTag(cmsHPROFILE hProfile, cmsTagSignature sig, const void* data); +CMSAPI cmsBool CMSEXPORT cmsLinkTag(cmsHPROFILE hProfile, cmsTagSignature sig, cmsTagSignature dest); +CMSAPI cmsTagSignature CMSEXPORT cmsTagLinkedTo(cmsHPROFILE hProfile, cmsTagSignature sig); + +// Read and write raw data +CMSAPI cmsUInt32Number CMSEXPORT cmsReadRawTag(cmsHPROFILE hProfile, cmsTagSignature sig, void* Buffer, cmsUInt32Number BufferSize); +CMSAPI cmsBool CMSEXPORT cmsWriteRawTag(cmsHPROFILE hProfile, cmsTagSignature sig, const void* data, cmsUInt32Number Size); + +// Access header data +#define cmsEmbeddedProfileFalse 0x00000000 +#define cmsEmbeddedProfileTrue 0x00000001 +#define cmsUseAnywhere 0x00000000 +#define cmsUseWithEmbeddedDataOnly 0x00000002 + +CMSAPI cmsUInt32Number CMSEXPORT cmsGetHeaderFlags(cmsHPROFILE hProfile); +CMSAPI void CMSEXPORT cmsGetHeaderAttributes(cmsHPROFILE hProfile, cmsUInt64Number* Flags); +CMSAPI void CMSEXPORT cmsGetHeaderProfileID(cmsHPROFILE hProfile, cmsUInt8Number* ProfileID); +CMSAPI cmsBool CMSEXPORT cmsGetHeaderCreationDateTime(cmsHPROFILE hProfile, struct tm *Dest); +CMSAPI cmsUInt32Number CMSEXPORT cmsGetHeaderRenderingIntent(cmsHPROFILE hProfile); +CMSAPI cmsUInt32Number CMSEXPORT cmsGetHeaderCMM(cmsHPROFILE hProfile); + + +CMSAPI void CMSEXPORT cmsSetHeaderFlags(cmsHPROFILE hProfile, cmsUInt32Number Flags); +CMSAPI cmsUInt32Number CMSEXPORT cmsGetHeaderManufacturer(cmsHPROFILE hProfile); +CMSAPI void CMSEXPORT cmsSetHeaderManufacturer(cmsHPROFILE hProfile, cmsUInt32Number manufacturer); +CMSAPI cmsUInt32Number CMSEXPORT cmsGetHeaderCreator(cmsHPROFILE hProfile); +CMSAPI cmsUInt32Number CMSEXPORT cmsGetHeaderModel(cmsHPROFILE hProfile); +CMSAPI void CMSEXPORT cmsSetHeaderModel(cmsHPROFILE hProfile, cmsUInt32Number model); +CMSAPI void CMSEXPORT cmsSetHeaderAttributes(cmsHPROFILE hProfile, cmsUInt64Number Flags); +CMSAPI void CMSEXPORT cmsSetHeaderProfileID(cmsHPROFILE hProfile, cmsUInt8Number* ProfileID); +CMSAPI void CMSEXPORT cmsSetHeaderRenderingIntent(cmsHPROFILE hProfile, cmsUInt32Number RenderingIntent); + +CMSAPI cmsColorSpaceSignature + CMSEXPORT cmsGetPCS(cmsHPROFILE hProfile); +CMSAPI void CMSEXPORT cmsSetPCS(cmsHPROFILE hProfile, cmsColorSpaceSignature pcs); +CMSAPI cmsColorSpaceSignature + CMSEXPORT cmsGetColorSpace(cmsHPROFILE hProfile); +CMSAPI void CMSEXPORT cmsSetColorSpace(cmsHPROFILE hProfile, cmsColorSpaceSignature sig); +CMSAPI cmsProfileClassSignature + CMSEXPORT cmsGetDeviceClass(cmsHPROFILE hProfile); +CMSAPI void CMSEXPORT cmsSetDeviceClass(cmsHPROFILE hProfile, cmsProfileClassSignature sig); +CMSAPI void CMSEXPORT cmsSetProfileVersion(cmsHPROFILE hProfile, cmsFloat64Number Version); +CMSAPI cmsFloat64Number CMSEXPORT cmsGetProfileVersion(cmsHPROFILE hProfile); + +CMSAPI cmsUInt32Number CMSEXPORT cmsGetEncodedICCversion(cmsHPROFILE hProfile); +CMSAPI void CMSEXPORT cmsSetEncodedICCversion(cmsHPROFILE hProfile, cmsUInt32Number Version); + +// How profiles may be used +#define LCMS_USED_AS_INPUT 0 +#define LCMS_USED_AS_OUTPUT 1 +#define LCMS_USED_AS_PROOF 2 + +CMSAPI cmsBool CMSEXPORT cmsIsIntentSupported(cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number UsedDirection); +CMSAPI cmsBool CMSEXPORT cmsIsMatrixShaper(cmsHPROFILE hProfile); +CMSAPI cmsBool CMSEXPORT cmsIsCLUT(cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number UsedDirection); + +// Translate form/to our notation to ICC +CMSAPI cmsColorSpaceSignature CMSEXPORT _cmsICCcolorSpace(int OurNotation); +CMSAPI int CMSEXPORT _cmsLCMScolorSpace(cmsColorSpaceSignature ProfileSpace); + +// Deprecated, use cmsChannelsOfColorSpace instead +CMSAPI cmsUInt32Number CMSEXPORT cmsChannelsOf(cmsColorSpaceSignature ColorSpace); + +// Get number of channels of color space or -1 if color space is not listed/supported +CMSAPI cmsInt32Number CMSEXPORT cmsChannelsOfColorSpace(cmsColorSpaceSignature ColorSpace); + +// Build a suitable formatter for the colorspace of this profile. nBytes=1 means 8 bits, nBytes=2 means 16 bits. +CMSAPI cmsUInt32Number CMSEXPORT cmsFormatterForColorspaceOfProfile(cmsHPROFILE hProfile, cmsUInt32Number nBytes, cmsBool lIsFloat); +CMSAPI cmsUInt32Number CMSEXPORT cmsFormatterForPCSOfProfile(cmsHPROFILE hProfile, cmsUInt32Number nBytes, cmsBool lIsFloat); + + +// Localized info +typedef enum { + cmsInfoDescription = 0, + cmsInfoManufacturer = 1, + cmsInfoModel = 2, + cmsInfoCopyright = 3 +} cmsInfoType; + +CMSAPI cmsUInt32Number CMSEXPORT cmsGetProfileInfo(cmsHPROFILE hProfile, cmsInfoType Info, + const char LanguageCode[3], const char CountryCode[3], + wchar_t* Buffer, cmsUInt32Number BufferSize); + +CMSAPI cmsUInt32Number CMSEXPORT cmsGetProfileInfoASCII(cmsHPROFILE hProfile, cmsInfoType Info, + const char LanguageCode[3], const char CountryCode[3], + char* Buffer, cmsUInt32Number BufferSize); + +CMSAPI cmsUInt32Number CMSEXPORT cmsGetProfileInfoUTF8(cmsHPROFILE hProfile, cmsInfoType Info, + const char LanguageCode[3], const char CountryCode[3], + char* Buffer, cmsUInt32Number BufferSize); + +// IO handlers ---------------------------------------------------------------------------------------------------------- + +typedef struct _cms_io_handler cmsIOHANDLER; + +CMSAPI cmsIOHANDLER* CMSEXPORT cmsOpenIOhandlerFromFile(cmsContext ContextID, const char* FileName, const char* AccessMode); +CMSAPI cmsIOHANDLER* CMSEXPORT cmsOpenIOhandlerFromStream(cmsContext ContextID, FILE* Stream); +CMSAPI cmsIOHANDLER* CMSEXPORT cmsOpenIOhandlerFromMem(cmsContext ContextID, void *Buffer, cmsUInt32Number size, const char* AccessMode); +CMSAPI cmsIOHANDLER* CMSEXPORT cmsOpenIOhandlerFromNULL(cmsContext ContextID); +CMSAPI cmsIOHANDLER* CMSEXPORT cmsGetProfileIOhandler(cmsHPROFILE hProfile); +CMSAPI cmsBool CMSEXPORT cmsCloseIOhandler(cmsIOHANDLER* io); + +// MD5 message digest -------------------------------------------------------------------------------------------------- + +CMSAPI cmsBool CMSEXPORT cmsMD5computeID(cmsHPROFILE hProfile); + +// Profile high level functions ------------------------------------------------------------------------------------------ + +CMSAPI cmsHPROFILE CMSEXPORT cmsOpenProfileFromFile(const char *ICCProfile, const char *sAccess); +CMSAPI cmsHPROFILE CMSEXPORT cmsOpenProfileFromFileTHR(cmsContext ContextID, const char *ICCProfile, const char *sAccess); +CMSAPI cmsHPROFILE CMSEXPORT cmsOpenProfileFromStream(FILE* ICCProfile, const char* sAccess); +CMSAPI cmsHPROFILE CMSEXPORT cmsOpenProfileFromStreamTHR(cmsContext ContextID, FILE* ICCProfile, const char* sAccess); +CMSAPI cmsHPROFILE CMSEXPORT cmsOpenProfileFromMem(const void * MemPtr, cmsUInt32Number dwSize); +CMSAPI cmsHPROFILE CMSEXPORT cmsOpenProfileFromMemTHR(cmsContext ContextID, const void * MemPtr, cmsUInt32Number dwSize); +CMSAPI cmsHPROFILE CMSEXPORT cmsOpenProfileFromIOhandlerTHR(cmsContext ContextID, cmsIOHANDLER* io); +CMSAPI cmsHPROFILE CMSEXPORT cmsOpenProfileFromIOhandler2THR(cmsContext ContextID, cmsIOHANDLER* io, cmsBool write); +CMSAPI cmsBool CMSEXPORT cmsCloseProfile(cmsHPROFILE hProfile); + +CMSAPI cmsBool CMSEXPORT cmsSaveProfileToFile(cmsHPROFILE hProfile, const char* FileName); +CMSAPI cmsBool CMSEXPORT cmsSaveProfileToStream(cmsHPROFILE hProfile, FILE* Stream); +CMSAPI cmsBool CMSEXPORT cmsSaveProfileToMem(cmsHPROFILE hProfile, void *MemPtr, cmsUInt32Number* BytesNeeded); +CMSAPI cmsUInt32Number CMSEXPORT cmsSaveProfileToIOhandler(cmsHPROFILE hProfile, cmsIOHANDLER* io); + +// Predefined virtual profiles ------------------------------------------------------------------------------------------ + +CMSAPI cmsHPROFILE CMSEXPORT cmsCreateRGBProfileTHR(cmsContext ContextID, + const cmsCIExyY* WhitePoint, + const cmsCIExyYTRIPLE* Primaries, + cmsToneCurve* const TransferFunction[3]); + +CMSAPI cmsHPROFILE CMSEXPORT cmsCreateRGBProfile(const cmsCIExyY* WhitePoint, + const cmsCIExyYTRIPLE* Primaries, + cmsToneCurve* const TransferFunction[3]); + +CMSAPI cmsHPROFILE CMSEXPORT cmsCreateGrayProfileTHR(cmsContext ContextID, + const cmsCIExyY* WhitePoint, + const cmsToneCurve* TransferFunction); + +CMSAPI cmsHPROFILE CMSEXPORT cmsCreateGrayProfile(const cmsCIExyY* WhitePoint, + const cmsToneCurve* TransferFunction); + +CMSAPI cmsHPROFILE CMSEXPORT cmsCreateLinearizationDeviceLinkTHR(cmsContext ContextID, + cmsColorSpaceSignature ColorSpace, + cmsToneCurve* const TransferFunctions[]); + +CMSAPI cmsHPROFILE CMSEXPORT cmsCreateLinearizationDeviceLink(cmsColorSpaceSignature ColorSpace, + cmsToneCurve* const TransferFunctions[]); + +CMSAPI cmsHPROFILE CMSEXPORT cmsCreateInkLimitingDeviceLinkTHR(cmsContext ContextID, + cmsColorSpaceSignature ColorSpace, cmsFloat64Number Limit); + +CMSAPI cmsHPROFILE CMSEXPORT cmsCreateInkLimitingDeviceLink(cmsColorSpaceSignature ColorSpace, cmsFloat64Number Limit); + +CMSAPI cmsHPROFILE CMSEXPORT cmsCreateDeviceLinkFromCubeFile(const char* cFileName); + +CMSAPI cmsHPROFILE CMSEXPORT cmsCreateDeviceLinkFromCubeFileTHR(cmsContext ContextID, const char* cFileName); + +CMSAPI cmsHPROFILE CMSEXPORT cmsCreateLab2ProfileTHR(cmsContext ContextID, const cmsCIExyY* WhitePoint); +CMSAPI cmsHPROFILE CMSEXPORT cmsCreateLab2Profile(const cmsCIExyY* WhitePoint); +CMSAPI cmsHPROFILE CMSEXPORT cmsCreateLab4ProfileTHR(cmsContext ContextID, const cmsCIExyY* WhitePoint); +CMSAPI cmsHPROFILE CMSEXPORT cmsCreateLab4Profile(const cmsCIExyY* WhitePoint); + +CMSAPI cmsHPROFILE CMSEXPORT cmsCreateXYZProfileTHR(cmsContext ContextID); +CMSAPI cmsHPROFILE CMSEXPORT cmsCreateXYZProfile(void); + +CMSAPI cmsHPROFILE CMSEXPORT cmsCreate_sRGBProfileTHR(cmsContext ContextID); +CMSAPI cmsHPROFILE CMSEXPORT cmsCreate_sRGBProfile(void); + +CMSAPI cmsHPROFILE CMSEXPORT cmsCreate_OkLabProfile(cmsContext ctx); + +CMSAPI cmsHPROFILE CMSEXPORT cmsCreateBCHSWabstractProfileTHR(cmsContext ContextID, + cmsUInt32Number nLUTPoints, + cmsFloat64Number Bright, + cmsFloat64Number Contrast, + cmsFloat64Number Hue, + cmsFloat64Number Saturation, + cmsUInt32Number TempSrc, + cmsUInt32Number TempDest); + +CMSAPI cmsHPROFILE CMSEXPORT cmsCreateBCHSWabstractProfile(cmsUInt32Number nLUTPoints, + cmsFloat64Number Bright, + cmsFloat64Number Contrast, + cmsFloat64Number Hue, + cmsFloat64Number Saturation, + cmsUInt32Number TempSrc, + cmsUInt32Number TempDest); + +CMSAPI cmsHPROFILE CMSEXPORT cmsCreateNULLProfileTHR(cmsContext ContextID); +CMSAPI cmsHPROFILE CMSEXPORT cmsCreateNULLProfile(void); + +// Converts a transform to a devicelink profile +CMSAPI cmsHPROFILE CMSEXPORT cmsTransform2DeviceLink(cmsHTRANSFORM hTransform, cmsFloat64Number Version, cmsUInt32Number dwFlags); + +// Intents ---------------------------------------------------------------------------------------------- + +// ICC Intents +#define INTENT_PERCEPTUAL 0 +#define INTENT_RELATIVE_COLORIMETRIC 1 +#define INTENT_SATURATION 2 +#define INTENT_ABSOLUTE_COLORIMETRIC 3 + +// Non-ICC intents +#define INTENT_PRESERVE_K_ONLY_PERCEPTUAL 10 +#define INTENT_PRESERVE_K_ONLY_RELATIVE_COLORIMETRIC 11 +#define INTENT_PRESERVE_K_ONLY_SATURATION 12 +#define INTENT_PRESERVE_K_PLANE_PERCEPTUAL 13 +#define INTENT_PRESERVE_K_PLANE_RELATIVE_COLORIMETRIC 14 +#define INTENT_PRESERVE_K_PLANE_SATURATION 15 + +// Call with NULL as parameters to get the intent count +CMSAPI cmsUInt32Number CMSEXPORT cmsGetSupportedIntents(cmsUInt32Number nMax, cmsUInt32Number* Codes, char** Descriptions); +CMSAPI cmsUInt32Number CMSEXPORT cmsGetSupportedIntentsTHR(cmsContext ContextID, cmsUInt32Number nMax, cmsUInt32Number* Codes, char** Descriptions); + +// Flags + +#define cmsFLAGS_NOCACHE 0x0040 // Inhibit 1-pixel cache +#define cmsFLAGS_NOOPTIMIZE 0x0100 // Inhibit optimizations +#define cmsFLAGS_NULLTRANSFORM 0x0200 // Don't transform anyway + +// Proofing flags +#define cmsFLAGS_GAMUTCHECK 0x1000 // Out of Gamut alarm +#define cmsFLAGS_SOFTPROOFING 0x4000 // Do softproofing + +// Misc +#define cmsFLAGS_BLACKPOINTCOMPENSATION 0x2000 +#define cmsFLAGS_NOWHITEONWHITEFIXUP 0x0004 // Don't fix scum dot +#define cmsFLAGS_HIGHRESPRECALC 0x0400 // Use more memory to give better accuracy +#define cmsFLAGS_LOWRESPRECALC 0x0800 // Use less memory to minimize resources + +// For devicelink creation +#define cmsFLAGS_8BITS_DEVICELINK 0x0008 // Create 8 bits devicelinks +#define cmsFLAGS_GUESSDEVICECLASS 0x0020 // Guess device class (for transform2devicelink) +#define cmsFLAGS_KEEP_SEQUENCE 0x0080 // Keep profile sequence for devicelink creation + +// Specific to a particular optimizations +#define cmsFLAGS_FORCE_CLUT 0x0002 // Force CLUT optimization +#define cmsFLAGS_CLUT_POST_LINEARIZATION 0x0001 // create postlinearization tables if possible +#define cmsFLAGS_CLUT_PRE_LINEARIZATION 0x0010 // create prelinearization tables if possible + +// Specific to unbounded mode +#define cmsFLAGS_NONEGATIVES 0x8000 // Prevent negative numbers in floating point transforms + +// Copy alpha channels when transforming +#define cmsFLAGS_COPY_ALPHA 0x04000000 // Alpha channels are copied on cmsDoTransform() + +// Fine-tune control over number of gridpoints +#define cmsFLAGS_GRIDPOINTS(n) (((n) & 0xFF) << 16) + +// CRD special +#define cmsFLAGS_NODEFAULTRESOURCEDEF 0x01000000 + +// Transforms --------------------------------------------------------------------------------------------------- + +CMSAPI cmsHTRANSFORM CMSEXPORT cmsCreateTransformTHR(cmsContext ContextID, + cmsHPROFILE Input, + cmsUInt32Number InputFormat, + cmsHPROFILE Output, + cmsUInt32Number OutputFormat, + cmsUInt32Number Intent, + cmsUInt32Number dwFlags); + +CMSAPI cmsHTRANSFORM CMSEXPORT cmsCreateTransform(cmsHPROFILE Input, + cmsUInt32Number InputFormat, + cmsHPROFILE Output, + cmsUInt32Number OutputFormat, + cmsUInt32Number Intent, + cmsUInt32Number dwFlags); + +CMSAPI cmsHTRANSFORM CMSEXPORT cmsCreateProofingTransformTHR(cmsContext ContextID, + cmsHPROFILE Input, + cmsUInt32Number InputFormat, + cmsHPROFILE Output, + cmsUInt32Number OutputFormat, + cmsHPROFILE Proofing, + cmsUInt32Number Intent, + cmsUInt32Number ProofingIntent, + cmsUInt32Number dwFlags); + +CMSAPI cmsHTRANSFORM CMSEXPORT cmsCreateProofingTransform(cmsHPROFILE Input, + cmsUInt32Number InputFormat, + cmsHPROFILE Output, + cmsUInt32Number OutputFormat, + cmsHPROFILE Proofing, + cmsUInt32Number Intent, + cmsUInt32Number ProofingIntent, + cmsUInt32Number dwFlags); + +CMSAPI cmsHTRANSFORM CMSEXPORT cmsCreateMultiprofileTransformTHR(cmsContext ContextID, + cmsHPROFILE hProfiles[], + cmsUInt32Number nProfiles, + cmsUInt32Number InputFormat, + cmsUInt32Number OutputFormat, + cmsUInt32Number Intent, + cmsUInt32Number dwFlags); + + +CMSAPI cmsHTRANSFORM CMSEXPORT cmsCreateMultiprofileTransform(cmsHPROFILE hProfiles[], + cmsUInt32Number nProfiles, + cmsUInt32Number InputFormat, + cmsUInt32Number OutputFormat, + cmsUInt32Number Intent, + cmsUInt32Number dwFlags); + + +CMSAPI cmsHTRANSFORM CMSEXPORT cmsCreateExtendedTransform(cmsContext ContextID, + cmsUInt32Number nProfiles, cmsHPROFILE hProfiles[], + cmsBool BPC[], + cmsUInt32Number Intents[], + cmsFloat64Number AdaptationStates[], + cmsHPROFILE hGamutProfile, + cmsUInt32Number nGamutPCSposition, + cmsUInt32Number InputFormat, + cmsUInt32Number OutputFormat, + cmsUInt32Number dwFlags); + +CMSAPI void CMSEXPORT cmsDeleteTransform(cmsHTRANSFORM hTransform); + +CMSAPI void CMSEXPORT cmsDoTransform(cmsHTRANSFORM Transform, + const void * InputBuffer, + void * OutputBuffer, + cmsUInt32Number Size); + +CMSAPI void CMSEXPORT cmsDoTransformStride(cmsHTRANSFORM Transform, // Deprecated + const void * InputBuffer, + void * OutputBuffer, + cmsUInt32Number Size, + cmsUInt32Number Stride); + +CMSAPI void CMSEXPORT cmsDoTransformLineStride(cmsHTRANSFORM Transform, + const void* InputBuffer, + void* OutputBuffer, + cmsUInt32Number PixelsPerLine, + cmsUInt32Number LineCount, + cmsUInt32Number BytesPerLineIn, + cmsUInt32Number BytesPerLineOut, + cmsUInt32Number BytesPerPlaneIn, + cmsUInt32Number BytesPerPlaneOut); + + +CMSAPI void CMSEXPORT cmsSetAlarmCodes(const cmsUInt16Number NewAlarm[cmsMAXCHANNELS]); +CMSAPI void CMSEXPORT cmsGetAlarmCodes(cmsUInt16Number NewAlarm[cmsMAXCHANNELS]); + + +CMSAPI void CMSEXPORT cmsSetAlarmCodesTHR(cmsContext ContextID, + const cmsUInt16Number AlarmCodes[cmsMAXCHANNELS]); +CMSAPI void CMSEXPORT cmsGetAlarmCodesTHR(cmsContext ContextID, + cmsUInt16Number AlarmCodes[cmsMAXCHANNELS]); + + + +// Adaptation state for absolute colorimetric intent +CMSAPI cmsFloat64Number CMSEXPORT cmsSetAdaptationState(cmsFloat64Number d); +CMSAPI cmsFloat64Number CMSEXPORT cmsSetAdaptationStateTHR(cmsContext ContextID, cmsFloat64Number d); + + + +// Grab the ContextID from an open transform. Returns NULL if a NULL transform is passed +CMSAPI cmsContext CMSEXPORT cmsGetTransformContextID(cmsHTRANSFORM hTransform); + +// Grab the input/output formats +CMSAPI cmsUInt32Number CMSEXPORT cmsGetTransformInputFormat(cmsHTRANSFORM hTransform); +CMSAPI cmsUInt32Number CMSEXPORT cmsGetTransformOutputFormat(cmsHTRANSFORM hTransform); + +// Access the optimized pipeline and gamut-check pipeline inside a transform. +CMSAPI cmsPipeline* CMSEXPORT cmsGetTransformPipeline(cmsHTRANSFORM hTransform); +CMSAPI cmsPipeline* CMSEXPORT cmsGetTransformGamutCheckPipeline(cmsHTRANSFORM hTransform); +// Grab colorants +CMSAPI cmsNAMEDCOLORLIST* CMSEXPORT cmsGetTransformInputColorants(cmsHTRANSFORM hTransform); +CMSAPI cmsNAMEDCOLORLIST* CMSEXPORT cmsGetTransformOutputColorants(cmsHTRANSFORM hTransform); + +// For backwards compatibility +CMSAPI cmsBool CMSEXPORT cmsChangeBuffersFormat(cmsHTRANSFORM hTransform, + cmsUInt32Number InputFormat, + cmsUInt32Number OutputFormat); + + + +// PostScript ColorRenderingDictionary and ColorSpaceArray ---------------------------------------------------- + +typedef enum { cmsPS_RESOURCE_CSA, cmsPS_RESOURCE_CRD } cmsPSResourceType; + +// lcms2 unified method to access postscript color resources +CMSAPI cmsUInt32Number CMSEXPORT cmsGetPostScriptColorResource(cmsContext ContextID, + cmsPSResourceType Type, + cmsHPROFILE hProfile, + cmsUInt32Number Intent, + cmsUInt32Number dwFlags, + cmsIOHANDLER* io); + +CMSAPI cmsUInt32Number CMSEXPORT cmsGetPostScriptCSA(cmsContext ContextID, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number dwFlags, void* Buffer, cmsUInt32Number dwBufferLen); +CMSAPI cmsUInt32Number CMSEXPORT cmsGetPostScriptCRD(cmsContext ContextID, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number dwFlags, void* Buffer, cmsUInt32Number dwBufferLen); + + +// IT8.7 / CGATS.17-200x handling ----------------------------------------------------------------------------- + +CMSAPI cmsHANDLE CMSEXPORT cmsIT8Alloc(cmsContext ContextID); +CMSAPI void CMSEXPORT cmsIT8Free(cmsHANDLE hIT8); + +// Tables +CMSAPI cmsUInt32Number CMSEXPORT cmsIT8TableCount(cmsHANDLE hIT8); +CMSAPI cmsInt32Number CMSEXPORT cmsIT8SetTable(cmsHANDLE hIT8, cmsUInt32Number nTable); + +// Persistence +CMSAPI cmsHANDLE CMSEXPORT cmsIT8LoadFromFile(cmsContext ContextID, const char* cFileName); +CMSAPI cmsHANDLE CMSEXPORT cmsIT8LoadFromMem(cmsContext ContextID, const void *Ptr, cmsUInt32Number len); +// CMSAPI cmsHANDLE CMSEXPORT cmsIT8LoadFromIOhandler(cmsContext ContextID, cmsIOHANDLER* io); + +CMSAPI cmsBool CMSEXPORT cmsIT8SaveToFile(cmsHANDLE hIT8, const char* cFileName); +CMSAPI cmsBool CMSEXPORT cmsIT8SaveToMem(cmsHANDLE hIT8, void *MemPtr, cmsUInt32Number* BytesNeeded); + +// Properties +CMSAPI const char* CMSEXPORT cmsIT8GetSheetType(cmsHANDLE hIT8); +CMSAPI cmsBool CMSEXPORT cmsIT8SetSheetType(cmsHANDLE hIT8, const char* Type); + +CMSAPI cmsBool CMSEXPORT cmsIT8SetComment(cmsHANDLE hIT8, const char* cComment); + +CMSAPI cmsBool CMSEXPORT cmsIT8SetPropertyStr(cmsHANDLE hIT8, const char* cProp, const char *Str); +CMSAPI cmsBool CMSEXPORT cmsIT8SetPropertyDbl(cmsHANDLE hIT8, const char* cProp, cmsFloat64Number Val); +CMSAPI cmsBool CMSEXPORT cmsIT8SetPropertyHex(cmsHANDLE hIT8, const char* cProp, cmsUInt32Number Val); +CMSAPI cmsBool CMSEXPORT cmsIT8SetPropertyMulti(cmsHANDLE hIT8, const char* Key, const char* SubKey, const char *Buffer); +CMSAPI cmsBool CMSEXPORT cmsIT8SetPropertyUncooked(cmsHANDLE hIT8, const char* Key, const char* Buffer); + + +CMSAPI const char* CMSEXPORT cmsIT8GetProperty(cmsHANDLE hIT8, const char* cProp); +CMSAPI cmsFloat64Number CMSEXPORT cmsIT8GetPropertyDbl(cmsHANDLE hIT8, const char* cProp); +CMSAPI const char* CMSEXPORT cmsIT8GetPropertyMulti(cmsHANDLE hIT8, const char* Key, const char *SubKey); +CMSAPI cmsUInt32Number CMSEXPORT cmsIT8EnumProperties(cmsHANDLE hIT8, char ***PropertyNames); +CMSAPI cmsUInt32Number CMSEXPORT cmsIT8EnumPropertyMulti(cmsHANDLE hIT8, const char* cProp, const char ***SubpropertyNames); + +// Datasets +CMSAPI const char* CMSEXPORT cmsIT8GetDataRowCol(cmsHANDLE hIT8, int row, int col); +CMSAPI cmsFloat64Number CMSEXPORT cmsIT8GetDataRowColDbl(cmsHANDLE hIT8, int row, int col); + +CMSAPI cmsBool CMSEXPORT cmsIT8SetDataRowCol(cmsHANDLE hIT8, int row, int col, + const char* Val); + +CMSAPI cmsBool CMSEXPORT cmsIT8SetDataRowColDbl(cmsHANDLE hIT8, int row, int col, + cmsFloat64Number Val); + +CMSAPI const char* CMSEXPORT cmsIT8GetData(cmsHANDLE hIT8, const char* cPatch, const char* cSample); + + +CMSAPI cmsFloat64Number CMSEXPORT cmsIT8GetDataDbl(cmsHANDLE hIT8, const char* cPatch, const char* cSample); + +CMSAPI cmsBool CMSEXPORT cmsIT8SetData(cmsHANDLE hIT8, const char* cPatch, + const char* cSample, + const char *Val); + +CMSAPI cmsBool CMSEXPORT cmsIT8SetDataDbl(cmsHANDLE hIT8, const char* cPatch, + const char* cSample, + cmsFloat64Number Val); + +CMSAPI int CMSEXPORT cmsIT8FindDataFormat(cmsHANDLE hIT8, const char* cSample); +CMSAPI cmsBool CMSEXPORT cmsIT8SetDataFormat(cmsHANDLE hIT8, int n, const char *Sample); +CMSAPI int CMSEXPORT cmsIT8EnumDataFormat(cmsHANDLE hIT8, char ***SampleNames); + +CMSAPI const char* CMSEXPORT cmsIT8GetPatchName(cmsHANDLE hIT8, int nPatch, char* buffer); +CMSAPI int CMSEXPORT cmsIT8GetPatchByName(cmsHANDLE hIT8, const char *cPatch); + +// The LABEL extension +CMSAPI int CMSEXPORT cmsIT8SetTableByLabel(cmsHANDLE hIT8, const char* cSet, const char* cField, const char* ExpectedType); + +CMSAPI cmsBool CMSEXPORT cmsIT8SetIndexColumn(cmsHANDLE hIT8, const char* cSample); + +// Formatter for double +CMSAPI void CMSEXPORT cmsIT8DefineDblFormat(cmsHANDLE hIT8, const char* Formatter); + +// Gamut boundary description routines ------------------------------------------------------------------------------ + +CMSAPI cmsHANDLE CMSEXPORT cmsGBDAlloc(cmsContext ContextID); +CMSAPI void CMSEXPORT cmsGBDFree(cmsHANDLE hGBD); +CMSAPI cmsBool CMSEXPORT cmsGDBAddPoint(cmsHANDLE hGBD, const cmsCIELab* Lab); +CMSAPI cmsBool CMSEXPORT cmsGDBCompute(cmsHANDLE hGDB, cmsUInt32Number dwFlags); +CMSAPI cmsBool CMSEXPORT cmsGDBCheckPoint(cmsHANDLE hGBD, const cmsCIELab* Lab); + +// Feature detection ---------------------------------------------------------------------------------------------- + +// Estimate the black point +CMSAPI cmsBool CMSEXPORT cmsDetectBlackPoint(cmsCIEXYZ* BlackPoint, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number dwFlags); +CMSAPI cmsBool CMSEXPORT cmsDetectDestinationBlackPoint(cmsCIEXYZ* BlackPoint, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number dwFlags); + +// Estimate total area coverage +CMSAPI cmsFloat64Number CMSEXPORT cmsDetectTAC(cmsHPROFILE hProfile); + +// Estimate gamma space, always positive. Returns -1 on error. +CMSAPI cmsFloat64Number CMSEXPORT cmsDetectRGBProfileGamma(cmsHPROFILE hProfile, cmsFloat64Number threshold); + +// Poor man's gamut mapping +CMSAPI cmsBool CMSEXPORT cmsDesaturateLab(cmsCIELab* Lab, + double amax, double amin, + double bmax, double bmin); + +#ifndef CMS_USE_CPP_API +# ifdef __cplusplus + } +# endif +#endif + +#define _lcms2_H +#endif diff --git a/local/recipes/libs/lcms2/source/include/lcms2_plugin.h b/local/recipes/libs/lcms2/source/include/lcms2_plugin.h new file mode 100644 index 0000000000..fc9b11f02d --- /dev/null +++ b/local/recipes/libs/lcms2/source/include/lcms2_plugin.h @@ -0,0 +1,700 @@ +//--------------------------------------------------------------------------------- +// +// Little Color Management System +// Copyright (c) 1998-2026 Marti Maria Saguer +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//--------------------------------------------------------------------------------- +// +// This is the plug-in header file. Normal LittleCMS clients should not use it. +// It is provided for plug-in writers that may want to access the support +// functions to do low level operations. All plug-in related structures +// are defined here. Including this file forces to include the standard API too. + +#ifndef _lcms_plugin_H + +// Deal with Microsoft's attempt at deprecating C standard runtime functions +#ifdef _MSC_VER +# if (_MSC_VER >= 1400) +# ifndef _CRT_SECURE_NO_DEPRECATE +# define _CRT_SECURE_NO_DEPRECATE +# endif +# ifndef _CRT_SECURE_NO_WARNINGS +# define _CRT_SECURE_NO_WARNINGS +# endif +# endif +#endif + +#ifndef _lcms2_H +#include "lcms2.h" +#endif + +// We need some standard C functions. +#include +#include +#include +#include +#include + + +#ifndef CMS_USE_CPP_API +# ifdef __cplusplus +extern "C" { +# endif +#endif + +// Vector & Matrix operations ----------------------------------------------------------------------- + +// Axis of the matrix/array. No specific meaning at all. +#define VX 0 +#define VY 1 +#define VZ 2 + +// Vectors +typedef struct { + cmsFloat64Number n[3]; + + } cmsVEC3; + +// 3x3 Matrix +typedef struct { + cmsVEC3 v[3]; + + } cmsMAT3; + +CMSAPI void CMSEXPORT _cmsVEC3init(cmsVEC3* r, cmsFloat64Number x, cmsFloat64Number y, cmsFloat64Number z); +CMSAPI void CMSEXPORT _cmsVEC3minus(cmsVEC3* r, const cmsVEC3* a, const cmsVEC3* b); +CMSAPI void CMSEXPORT _cmsVEC3cross(cmsVEC3* r, const cmsVEC3* u, const cmsVEC3* v); +CMSAPI cmsFloat64Number CMSEXPORT _cmsVEC3dot(const cmsVEC3* u, const cmsVEC3* v); +CMSAPI cmsFloat64Number CMSEXPORT _cmsVEC3length(const cmsVEC3* a); +CMSAPI cmsFloat64Number CMSEXPORT _cmsVEC3distance(const cmsVEC3* a, const cmsVEC3* b); + +CMSAPI void CMSEXPORT _cmsMAT3identity(cmsMAT3* a); +CMSAPI cmsBool CMSEXPORT _cmsMAT3isIdentity(const cmsMAT3* a); +CMSAPI void CMSEXPORT _cmsMAT3per(cmsMAT3* r, const cmsMAT3* a, const cmsMAT3* b); +CMSAPI cmsBool CMSEXPORT _cmsMAT3inverse(const cmsMAT3* a, cmsMAT3* b); +CMSAPI cmsBool CMSEXPORT _cmsMAT3solve(cmsVEC3* x, cmsMAT3* a, cmsVEC3* b); +CMSAPI void CMSEXPORT _cmsMAT3eval(cmsVEC3* r, const cmsMAT3* a, const cmsVEC3* v); + + +// MD5 low level ------------------------------------------------------------------------------------- + +CMSAPI cmsHANDLE CMSEXPORT cmsMD5alloc(cmsContext ContextID); +CMSAPI void CMSEXPORT cmsMD5add(cmsHANDLE Handle, const cmsUInt8Number* buf, cmsUInt32Number len); +CMSAPI void CMSEXPORT cmsMD5finish(cmsProfileID* ProfileID, cmsHANDLE Handle); + +// Error logging ------------------------------------------------------------------------------------- + +CMSAPI void CMSEXPORT cmsSignalError(cmsContext ContextID, cmsUInt32Number ErrorCode, const char *ErrorText, ...); + +// Memory management ---------------------------------------------------------------------------------- + +CMSAPI void* CMSEXPORT _cmsMalloc(cmsContext ContextID, cmsUInt32Number size); +CMSAPI void* CMSEXPORT _cmsMallocZero(cmsContext ContextID, cmsUInt32Number size); +CMSAPI void* CMSEXPORT _cmsCalloc(cmsContext ContextID, cmsUInt32Number num, cmsUInt32Number size); +CMSAPI void* CMSEXPORT _cmsRealloc(cmsContext ContextID, void* Ptr, cmsUInt32Number NewSize); +CMSAPI void CMSEXPORT _cmsFree(cmsContext ContextID, void* Ptr); +CMSAPI void* CMSEXPORT _cmsDupMem(cmsContext ContextID, const void* Org, cmsUInt32Number size); + +// I/O handler ---------------------------------------------------------------------------------- + +struct _cms_io_handler { + + void* stream; // Associated stream, which is implemented differently depending on media. + + cmsContext ContextID; + cmsUInt32Number UsedSpace; + cmsUInt32Number ReportedSize; + char PhysicalFile[cmsMAX_PATH]; + + cmsUInt32Number (* Read)(struct _cms_io_handler* iohandler, void *Buffer, + cmsUInt32Number size, + cmsUInt32Number count); + cmsBool (* Seek)(struct _cms_io_handler* iohandler, cmsUInt32Number offset); + cmsBool (* Close)(struct _cms_io_handler* iohandler); + cmsUInt32Number (* Tell)(struct _cms_io_handler* iohandler); + cmsBool (* Write)(struct _cms_io_handler* iohandler, cmsUInt32Number size, + const void* Buffer); +}; + +// Endianness adjust functions +CMSAPI cmsUInt16Number CMSEXPORT _cmsAdjustEndianess16(cmsUInt16Number Word); +CMSAPI cmsUInt32Number CMSEXPORT _cmsAdjustEndianess32(cmsUInt32Number Value); +CMSAPI void CMSEXPORT _cmsAdjustEndianess64(cmsUInt64Number* Result, cmsUInt64Number* QWord); + +// Helper IO functions +CMSAPI cmsBool CMSEXPORT _cmsReadUInt8Number(cmsIOHANDLER* io, cmsUInt8Number* n); +CMSAPI cmsBool CMSEXPORT _cmsReadUInt16Number(cmsIOHANDLER* io, cmsUInt16Number* n); +CMSAPI cmsBool CMSEXPORT _cmsReadUInt32Number(cmsIOHANDLER* io, cmsUInt32Number* n); +CMSAPI cmsBool CMSEXPORT _cmsReadFloat32Number(cmsIOHANDLER* io, cmsFloat32Number* n); +CMSAPI cmsBool CMSEXPORT _cmsReadUInt64Number(cmsIOHANDLER* io, cmsUInt64Number* n); +CMSAPI cmsBool CMSEXPORT _cmsRead15Fixed16Number(cmsIOHANDLER* io, cmsFloat64Number* n); +CMSAPI cmsBool CMSEXPORT _cmsReadXYZNumber(cmsIOHANDLER* io, cmsCIEXYZ* XYZ); +CMSAPI cmsBool CMSEXPORT _cmsReadUInt16Array(cmsIOHANDLER* io, cmsUInt32Number n, cmsUInt16Number* Array); + +CMSAPI cmsBool CMSEXPORT _cmsWriteUInt8Number(cmsIOHANDLER* io, cmsUInt8Number n); +CMSAPI cmsBool CMSEXPORT _cmsWriteUInt16Number(cmsIOHANDLER* io, cmsUInt16Number n); +CMSAPI cmsBool CMSEXPORT _cmsWriteUInt32Number(cmsIOHANDLER* io, cmsUInt32Number n); +CMSAPI cmsBool CMSEXPORT _cmsWriteFloat32Number(cmsIOHANDLER* io, cmsFloat32Number n); +CMSAPI cmsBool CMSEXPORT _cmsWriteUInt64Number(cmsIOHANDLER* io, cmsUInt64Number* n); +CMSAPI cmsBool CMSEXPORT _cmsWrite15Fixed16Number(cmsIOHANDLER* io, cmsFloat64Number n); +CMSAPI cmsBool CMSEXPORT _cmsWriteXYZNumber(cmsIOHANDLER* io, const cmsCIEXYZ* XYZ); +CMSAPI cmsBool CMSEXPORT _cmsWriteUInt16Array(cmsIOHANDLER* io, cmsUInt32Number n, const cmsUInt16Number* Array); + +// ICC base tag +typedef struct { + cmsTagTypeSignature sig; + cmsInt8Number reserved[4]; + +} _cmsTagBase; + +// Type base helper functions +CMSAPI cmsTagTypeSignature CMSEXPORT _cmsReadTypeBase(cmsIOHANDLER* io); +CMSAPI cmsBool CMSEXPORT _cmsWriteTypeBase(cmsIOHANDLER* io, cmsTagTypeSignature sig); + +// Alignment functions +CMSAPI cmsBool CMSEXPORT _cmsReadAlignment(cmsIOHANDLER* io); +CMSAPI cmsBool CMSEXPORT _cmsWriteAlignment(cmsIOHANDLER* io); + +// To deal with text streams. 2K at most +CMSAPI cmsBool CMSEXPORT _cmsIOPrintf(cmsIOHANDLER* io, const char* frm, ...); + +// Fixed point helper functions +CMSAPI cmsFloat64Number CMSEXPORT _cms8Fixed8toDouble(cmsUInt16Number fixed8); +CMSAPI cmsUInt16Number CMSEXPORT _cmsDoubleTo8Fixed8(cmsFloat64Number val); + +CMSAPI cmsFloat64Number CMSEXPORT _cms15Fixed16toDouble(cmsS15Fixed16Number fix32); +CMSAPI cmsS15Fixed16Number CMSEXPORT _cmsDoubleTo15Fixed16(cmsFloat64Number v); + +// Date/time helper functions +CMSAPI void CMSEXPORT _cmsEncodeDateTimeNumber(cmsDateTimeNumber *Dest, const struct tm *Source); +CMSAPI void CMSEXPORT _cmsDecodeDateTimeNumber(const cmsDateTimeNumber *Source, struct tm *Dest); + +//---------------------------------------------------------------------------------------------------------- + +// Shared callbacks for user data +typedef void (* _cmsFreeUserDataFn)(cmsContext ContextID, void* Data); +typedef void* (* _cmsDupUserDataFn)(cmsContext ContextID, const void* Data); + +//---------------------------------------------------------------------------------------------------------- + +// Plug-in foundation +#define cmsPluginMagicNumber 0x61637070 // 'acpp' + +#define cmsPluginMemHandlerSig 0x6D656D48 // 'memH' +#define cmsPluginInterpolationSig 0x696E7048 // 'inpH' +#define cmsPluginParametricCurveSig 0x70617248 // 'parH' +#define cmsPluginFormattersSig 0x66726D48 // 'frmH +#define cmsPluginTagTypeSig 0x74797048 // 'typH' +#define cmsPluginTagSig 0x74616748 // 'tagH' +#define cmsPluginRenderingIntentSig 0x696E7448 // 'intH' +#define cmsPluginMultiProcessElementSig 0x6D706548 // 'mpeH' +#define cmsPluginOptimizationSig 0x6F707448 // 'optH' +#define cmsPluginTransformSig 0x7A666D48 // 'xfmH' +#define cmsPluginMutexSig 0x6D747A48 // 'mtxH' +#define cmsPluginParalellizationSig 0x70726C48 // 'prlH + +typedef struct _cmsPluginBaseStruct { + + cmsUInt32Number Magic; // 'acpp' signature + cmsUInt32Number ExpectedVersion; // Expected version of LittleCMS + cmsUInt32Number Type; // Type of plug-in + struct _cmsPluginBaseStruct* Next; // For multiple plugin definition. NULL for end of list. + +} cmsPluginBase; + +// Maximum number of types in a plugin array +#define MAX_TYPES_IN_LCMS_PLUGIN 20 + +//---------------------------------------------------------------------------------------------------------- + +// Memory handler. Each new plug-in type replaces current behaviour + +typedef void* (* _cmsMallocFnPtrType)(cmsContext ContextID, cmsUInt32Number size); +typedef void (* _cmsFreeFnPtrType)(cmsContext ContextID, void *Ptr); +typedef void* (* _cmsReallocFnPtrType)(cmsContext ContextID, void* Ptr, cmsUInt32Number NewSize); + +typedef void* (* _cmsMalloZerocFnPtrType)(cmsContext ContextID, cmsUInt32Number size); +typedef void* (* _cmsCallocFnPtrType)(cmsContext ContextID, cmsUInt32Number num, cmsUInt32Number size); +typedef void* (* _cmsDupFnPtrType)(cmsContext ContextID, const void* Org, cmsUInt32Number size); + +typedef struct { + + cmsPluginBase base; + + // Required + _cmsMallocFnPtrType MallocPtr; + _cmsFreeFnPtrType FreePtr; + _cmsReallocFnPtrType ReallocPtr; + + // Optional + _cmsMalloZerocFnPtrType MallocZeroPtr; + _cmsCallocFnPtrType CallocPtr; + _cmsDupFnPtrType DupPtr; + +} cmsPluginMemHandler; + + +// ------------------------------------------------------------------------------------------------------------------ + +// Interpolation. 16 bits and floating point versions. +struct _cms_interp_struc; + +// Interpolation callbacks + +// 16 bits forward interpolation. This function performs precision-limited linear interpolation +// and is supposed to be quite fast. Implementation may be tetrahedral or trilinear, and plug-ins may +// choose to implement any other interpolation algorithm. +typedef void (* _cmsInterpFn16)(CMSREGISTER const cmsUInt16Number Input[], + CMSREGISTER cmsUInt16Number Output[], + CMSREGISTER const struct _cms_interp_struc* p); + +// Floating point forward interpolation. Full precision interpolation using floats. This is not a +// time critical function. Implementation may be tetrahedral or trilinear, and plug-ins may +// choose to implement any other interpolation algorithm. +typedef void (* _cmsInterpFnFloat)(cmsFloat32Number const Input[], + cmsFloat32Number Output[], + const struct _cms_interp_struc* p); + + + +// This type holds a pointer to an interpolator that can be either 16 bits or float +typedef union { + _cmsInterpFn16 Lerp16; // Forward interpolation in 16 bits + _cmsInterpFnFloat LerpFloat; // Forward interpolation in floating point +} cmsInterpFunction; + +// Flags for interpolator selection +#define CMS_LERP_FLAGS_16BITS 0x0000 // The default +#define CMS_LERP_FLAGS_FLOAT 0x0001 // Requires different implementation +#define CMS_LERP_FLAGS_TRILINEAR 0x0100 // Hint only + + +#define MAX_INPUT_DIMENSIONS 15 + +typedef struct _cms_interp_struc { // Used on all interpolations. Supplied by lcms2 when calling the interpolation function + + cmsContext ContextID; // The calling thread + + cmsUInt32Number dwFlags; // Keep original flags + cmsUInt32Number nInputs; // != 1 only in 3D interpolation + cmsUInt32Number nOutputs; // != 1 only in 3D interpolation + + cmsUInt32Number nSamples[MAX_INPUT_DIMENSIONS]; // Valid on all kinds of tables + cmsUInt32Number Domain[MAX_INPUT_DIMENSIONS]; // Domain = nSamples - 1 + + cmsUInt32Number opta[MAX_INPUT_DIMENSIONS]; // Optimization for 3D CLUT. This is the number of nodes premultiplied for each + // dimension. For example, in 7 nodes, 7, 7^2 , 7^3, 7^4, etc. On non-regular + // Samplings may vary according of the number of nodes for each dimension. + + const void *Table; // Points to the actual interpolation table + cmsInterpFunction Interpolation; // Points to the function to do the interpolation + + } cmsInterpParams; + +// Interpolators factory +typedef cmsInterpFunction (* cmsInterpFnFactory)(cmsUInt32Number nInputChannels, cmsUInt32Number nOutputChannels, cmsUInt32Number dwFlags); + +// The plug-in +typedef struct { + cmsPluginBase base; + + // Points to a user-supplied function which implements the factory + cmsInterpFnFactory InterpolatorsFactory; + +} cmsPluginInterpolation; + +//---------------------------------------------------------------------------------------------------------- + +// Parametric curves. A negative type means same function but analytically inverted. Max. number of params is 10 + +// Evaluator callback for user-supplied parametric curves. May implement more than one type +typedef cmsFloat64Number (* cmsParametricCurveEvaluator)(cmsInt32Number Type, const cmsFloat64Number Params[10], cmsFloat64Number R); + +// Plug-in may implement an arbitrary number of parametric curves +typedef struct { + cmsPluginBase base; + + cmsUInt32Number nFunctions; // Number of supported functions + cmsUInt32Number FunctionTypes[MAX_TYPES_IN_LCMS_PLUGIN]; // The identification types + cmsUInt32Number ParameterCount[MAX_TYPES_IN_LCMS_PLUGIN]; // Number of parameters for each function + + cmsParametricCurveEvaluator Evaluator; // The evaluator + +} cmsPluginParametricCurves; +//---------------------------------------------------------------------------------------------------------- + +// Formatters. This plug-in adds new handlers, replacing them if they already exist. Formatters dealing with +// cmsFloat32Number (bps = 4) or double (bps = 0) types are requested via FormatterFloat callback. Others come across +// Formatter16 callback + +struct _cmstransform_struct; + +typedef cmsUInt8Number* (* cmsFormatter16)(CMSREGISTER struct _cmstransform_struct* CMMcargo, + CMSREGISTER cmsUInt16Number Values[], + CMSREGISTER cmsUInt8Number* Buffer, + CMSREGISTER cmsUInt32Number Stride); + +typedef cmsUInt8Number* (* cmsFormatterFloat)(struct _cmstransform_struct* CMMcargo, + cmsFloat32Number Values[], + cmsUInt8Number* Buffer, + cmsUInt32Number Stride); + +// This type holds a pointer to a formatter that can be either 16 bits or cmsFloat32Number +typedef union { + cmsFormatter16 Fmt16; + cmsFormatterFloat FmtFloat; + +} cmsFormatter; + +#define CMS_PACK_FLAGS_16BITS 0x0000 +#define CMS_PACK_FLAGS_FLOAT 0x0001 + +typedef enum { cmsFormatterInput=0, cmsFormatterOutput=1 } cmsFormatterDirection; + +typedef cmsFormatter (* cmsFormatterFactory)(cmsUInt32Number Type, // Specific type, i.e. TYPE_RGB_8 + cmsFormatterDirection Dir, + cmsUInt32Number dwFlags); // precision + +// Plug-in may implement an arbitrary number of formatters +typedef struct { + cmsPluginBase base; + cmsFormatterFactory FormattersFactory; + +} cmsPluginFormatters; + +//---------------------------------------------------------------------------------------------------------- + +// Tag type handler. Each type is free to return anything it wants, and it is up to the caller to +// know in advance what is the type contained in the tag. +typedef struct _cms_typehandler_struct { + + cmsTagTypeSignature Signature; // The signature of the type + + // Allocates and reads items + void * (* ReadPtr)(struct _cms_typehandler_struct* self, + cmsIOHANDLER* io, + cmsUInt32Number* nItems, + cmsUInt32Number SizeOfTag); + + // Writes n Items + cmsBool (* WritePtr)(struct _cms_typehandler_struct* self, + cmsIOHANDLER* io, + void* Ptr, + cmsUInt32Number nItems); + + // Duplicate an item or array of items + void* (* DupPtr)(struct _cms_typehandler_struct* self, + const void *Ptr, + cmsUInt32Number n); + + // Free all resources + void (* FreePtr)(struct _cms_typehandler_struct* self, + void *Ptr); + + // Additional parameters used by the calling thread + cmsContext ContextID; + cmsUInt32Number ICCVersion; + +} cmsTagTypeHandler; + +// Each plug-in implements a single type +typedef struct { + cmsPluginBase base; + cmsTagTypeHandler Handler; + +} cmsPluginTagType; + +//---------------------------------------------------------------------------------------------------------- + +// This is the tag plugin, which identifies tags. For writing, a pointer to function is provided. +// This function should return the desired type for this tag, given the version of profile +// and the data being serialized. +typedef struct { + + cmsUInt32Number ElemCount; // If this tag needs an array, how many elements should keep + + // For reading. + cmsUInt32Number nSupportedTypes; // In how many types this tag can come (MAX_TYPES_IN_LCMS_PLUGIN maximum) + cmsTagTypeSignature SupportedTypes[MAX_TYPES_IN_LCMS_PLUGIN]; + + // For writing + cmsTagTypeSignature (* DecideType)(cmsFloat64Number ICCVersion, const void *Data); + +} cmsTagDescriptor; + +// Plug-in implements a single tag +typedef struct { + cmsPluginBase base; + + cmsTagSignature Signature; + cmsTagDescriptor Descriptor; + +} cmsPluginTag; + +//---------------------------------------------------------------------------------------------------------- + +// Custom intents. This function should join all profiles specified in the array in +// a single LUT. Any custom intent in the chain redirects to custom function. If more than +// one custom intent is found, the one located first is invoked. Usually users should use only one +// custom intent, so mixing custom intents in same multiprofile transform is not supported. + +typedef cmsPipeline* (* cmsIntentFn)( cmsContext ContextID, + cmsUInt32Number nProfiles, + cmsUInt32Number Intents[], + cmsHPROFILE hProfiles[], + cmsBool BPC[], + cmsFloat64Number AdaptationStates[], + cmsUInt32Number dwFlags); + + +// Each plug-in defines a single intent number. +typedef struct { + cmsPluginBase base; + cmsUInt32Number Intent; + cmsIntentFn Link; + char Description[256]; + +} cmsPluginRenderingIntent; + + +// The default ICC intents (perceptual, saturation, rel.col and abs.col) +CMSAPI cmsPipeline* CMSEXPORT _cmsDefaultICCintents(cmsContext ContextID, + cmsUInt32Number nProfiles, + cmsUInt32Number Intents[], + cmsHPROFILE hProfiles[], + cmsBool BPC[], + cmsFloat64Number AdaptationStates[], + cmsUInt32Number dwFlags); + + +//---------------------------------------------------------------------------------------------------------- + +// Pipelines, Multi Process Elements. + +typedef void (* _cmsStageEvalFn) (const cmsFloat32Number In[], cmsFloat32Number Out[], const cmsStage* mpe); +typedef void*(* _cmsStageDupElemFn) (cmsStage* mpe); +typedef void (* _cmsStageFreeElemFn) (cmsStage* mpe); + + +// This function allocates a generic MPE +CMSAPI cmsStage* CMSEXPORT _cmsStageAllocPlaceholder(cmsContext ContextID, + cmsStageSignature Type, + cmsUInt32Number InputChannels, + cmsUInt32Number OutputChannels, + _cmsStageEvalFn EvalPtr, // Points to fn that evaluates the element (always in floating point) + _cmsStageDupElemFn DupElemPtr, // Points to a fn that duplicates the stage + _cmsStageFreeElemFn FreePtr, // Points to a fn that sets the element free + void* Data); // A generic pointer to whatever memory needed by the element +typedef struct { + cmsPluginBase base; + cmsTagTypeHandler Handler; + +} cmsPluginMultiProcessElement; + + +// Data kept in "Element" member of cmsStage + +// Curves +typedef struct { + cmsUInt32Number nCurves; + cmsToneCurve** TheCurves; + +} _cmsStageToneCurvesData; + +// Matrix +typedef struct { + cmsFloat64Number* Double; // floating point for the matrix + cmsFloat64Number* Offset; // The offset + +} _cmsStageMatrixData; + +// CLUT +typedef struct { + + union { // Can have only one of both representations at same time + cmsUInt16Number* T; // Points to the table 16 bits table + cmsFloat32Number* TFloat; // Points to the cmsFloat32Number table + + } Tab; + + cmsInterpParams* Params; + cmsUInt32Number nEntries; + cmsBool HasFloatValues; + +} _cmsStageCLutData; + + +//---------------------------------------------------------------------------------------------------------- +// Optimization. Using this plug-in, additional optimization strategies may be implemented. +// The function should return TRUE if any optimization is done on the LUT, this terminates +// the optimization search. Or FALSE if it is unable to optimize and want to give a chance +// to the rest of optimizers. + +typedef cmsBool (* _cmsOPToptimizeFn)(cmsPipeline** Lut, + cmsUInt32Number Intent, + cmsUInt32Number* InputFormat, + cmsUInt32Number* OutputFormat, + cmsUInt32Number* dwFlags); + +// Pipeline Evaluator (in 16 bits) +typedef void (* _cmsPipelineEval16Fn)(CMSREGISTER const cmsUInt16Number In[], + CMSREGISTER cmsUInt16Number Out[], + const void* Data); + +// Pipeline Evaluator (in floating point) +typedef void (* _cmsPipelineEvalFloatFn)(const cmsFloat32Number In[], + cmsFloat32Number Out[], + const void* Data); + + +// This function may be used to set the optional evaluator and a block of private data. If private data is being used, an optional +// duplicator and free functions should also be specified in order to duplicate the LUT construct. Use NULL to inhibit such functionality. + +CMSAPI void CMSEXPORT _cmsPipelineSetOptimizationParameters(cmsPipeline* Lut, + _cmsPipelineEval16Fn Eval16, + void* PrivateData, + _cmsFreeUserDataFn FreePrivateDataFn, + _cmsDupUserDataFn DupPrivateDataFn); + +typedef struct { + cmsPluginBase base; + + // Optimize entry point + _cmsOPToptimizeFn OptimizePtr; + +} cmsPluginOptimization; + +//---------------------------------------------------------------------------------------------------------- +// Full xform + +typedef struct { + cmsUInt32Number BytesPerLineIn; + cmsUInt32Number BytesPerLineOut; + cmsUInt32Number BytesPerPlaneIn; + cmsUInt32Number BytesPerPlaneOut; + +} cmsStride; + +typedef void (* _cmsTransformFn)(struct _cmstransform_struct *CMMcargo, // Legacy function, handles just ONE scanline. + const void* InputBuffer, + void* OutputBuffer, + cmsUInt32Number Size, + cmsUInt32Number Stride); // Stride in bytes to the next plane in planar formats + + +typedef void (*_cmsTransform2Fn)(struct _cmstransform_struct *CMMcargo, + const void* InputBuffer, + void* OutputBuffer, + cmsUInt32Number PixelsPerLine, + cmsUInt32Number LineCount, + const cmsStride* Stride); + +typedef cmsBool (* _cmsTransformFactory)(_cmsTransformFn* xform, + void** UserData, + _cmsFreeUserDataFn* FreePrivateDataFn, + cmsPipeline** Lut, + cmsUInt32Number* InputFormat, + cmsUInt32Number* OutputFormat, + cmsUInt32Number* dwFlags); + +typedef cmsBool (* _cmsTransform2Factory)(_cmsTransform2Fn* xform, + void** UserData, + _cmsFreeUserDataFn* FreePrivateDataFn, + cmsPipeline** Lut, + cmsUInt32Number* InputFormat, + cmsUInt32Number* OutputFormat, + cmsUInt32Number* dwFlags); + + +// Retrieve user data as specified by the factory +CMSAPI void CMSEXPORT _cmsSetTransformUserData(struct _cmstransform_struct *CMMcargo, void* ptr, _cmsFreeUserDataFn FreePrivateDataFn); +CMSAPI void * CMSEXPORT _cmsGetTransformUserData(struct _cmstransform_struct *CMMcargo); + + +// Retrieve formatters +CMSAPI void CMSEXPORT _cmsGetTransformFormatters16 (struct _cmstransform_struct *CMMcargo, cmsFormatter16* FromInput, cmsFormatter16* ToOutput); +CMSAPI void CMSEXPORT _cmsGetTransformFormattersFloat(struct _cmstransform_struct *CMMcargo, cmsFormatterFloat* FromInput, cmsFormatterFloat* ToOutput); + +// Retrieve original flags +CMSAPI cmsUInt32Number CMSEXPORT _cmsGetTransformFlags(struct _cmstransform_struct* CMMcargo); + +typedef struct { + cmsPluginBase base; + + // Transform entry point + union { + _cmsTransformFactory legacy_xform; + _cmsTransform2Factory xform; + } factories; + +} cmsPluginTransform; + +//---------------------------------------------------------------------------------------------------------- +// Mutex + +typedef void* (* _cmsCreateMutexFnPtrType)(cmsContext ContextID); +typedef void (* _cmsDestroyMutexFnPtrType)(cmsContext ContextID, void* mtx); +typedef cmsBool (* _cmsLockMutexFnPtrType)(cmsContext ContextID, void* mtx); +typedef void (* _cmsUnlockMutexFnPtrType)(cmsContext ContextID, void* mtx); + +typedef struct { + cmsPluginBase base; + + _cmsCreateMutexFnPtrType CreateMutexPtr; + _cmsDestroyMutexFnPtrType DestroyMutexPtr; + _cmsLockMutexFnPtrType LockMutexPtr; + _cmsUnlockMutexFnPtrType UnlockMutexPtr; + +} cmsPluginMutex; + +CMSAPI void* CMSEXPORT _cmsCreateMutex(cmsContext ContextID); +CMSAPI void CMSEXPORT _cmsDestroyMutex(cmsContext ContextID, void* mtx); +CMSAPI cmsBool CMSEXPORT _cmsLockMutex(cmsContext ContextID, void* mtx); +CMSAPI void CMSEXPORT _cmsUnlockMutex(cmsContext ContextID, void* mtx); + +//---------------------------------------------------------------------------------------------------------- +// Parallelization + +CMSAPI _cmsTransform2Fn CMSEXPORT _cmsGetTransformWorker(struct _cmstransform_struct* CMMcargo); +CMSAPI cmsInt32Number CMSEXPORT _cmsGetTransformMaxWorkers(struct _cmstransform_struct* CMMcargo); +CMSAPI cmsUInt32Number CMSEXPORT _cmsGetTransformWorkerFlags(struct _cmstransform_struct* CMMcargo); + +// Let's plug-in to guess the best number of workers +#define CMS_GUESS_MAX_WORKERS -1 + +typedef struct { + cmsPluginBase base; + + cmsInt32Number MaxWorkers; // Number of starts to do as maximum + cmsUInt32Number WorkerFlags; // Reserved + _cmsTransform2Fn SchedulerFn; // callback to setup functions + +} cmsPluginParalellization; + + +#ifndef CMS_USE_CPP_API +# ifdef __cplusplus + } +# endif +#endif + +#define _lcms_plugin_H +#endif diff --git a/local/recipes/libs/lcms2/source/include/meson.build b/local/recipes/libs/lcms2/source/include/meson.build new file mode 100644 index 0000000000..3d6fa1ccd9 --- /dev/null +++ b/local/recipes/libs/lcms2/source/include/meson.build @@ -0,0 +1,8 @@ +lcms2_headers = files( + 'lcms2.h', + 'lcms2_plugin.h', +) + +install_headers(lcms2_headers) + +inc_dirs = include_directories('.') diff --git a/local/recipes/libs/lcms2/source/install-sh b/local/recipes/libs/lcms2/source/install-sh new file mode 100755 index 0000000000..8175c640fe --- /dev/null +++ b/local/recipes/libs/lcms2/source/install-sh @@ -0,0 +1,518 @@ +#!/bin/sh +# install - install a program, script, or datafile + +scriptversion=2018-03-11.20; # UTC + +# This originates from X11R5 (mit/util/scripts/install.sh), which was +# later released in X11R6 (xc/config/util/install.sh) with the +# following copyright and license. +# +# Copyright (C) 1994 X Consortium +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to +# deal in the Software without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- +# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name of the X Consortium shall not +# be used in advertising or otherwise to promote the sale, use or other deal- +# ings in this Software without prior written authorization from the X Consor- +# tium. +# +# +# FSF changes to this file are in the public domain. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# 'make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. + +tab=' ' +nl=' +' +IFS=" $tab$nl" + +# Set DOITPROG to "echo" to test this script. + +doit=${DOITPROG-} +doit_exec=${doit:-exec} + +# Put in absolute file names if you don't have them in your path; +# or use environment vars. + +chgrpprog=${CHGRPPROG-chgrp} +chmodprog=${CHMODPROG-chmod} +chownprog=${CHOWNPROG-chown} +cmpprog=${CMPPROG-cmp} +cpprog=${CPPROG-cp} +mkdirprog=${MKDIRPROG-mkdir} +mvprog=${MVPROG-mv} +rmprog=${RMPROG-rm} +stripprog=${STRIPPROG-strip} + +posix_mkdir= + +# Desired mode of installed file. +mode=0755 + +chgrpcmd= +chmodcmd=$chmodprog +chowncmd= +mvcmd=$mvprog +rmcmd="$rmprog -f" +stripcmd= + +src= +dst= +dir_arg= +dst_arg= + +copy_on_change=false +is_target_a_directory=possibly + +usage="\ +Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE + or: $0 [OPTION]... SRCFILES... DIRECTORY + or: $0 [OPTION]... -t DIRECTORY SRCFILES... + or: $0 [OPTION]... -d DIRECTORIES... + +In the 1st form, copy SRCFILE to DSTFILE. +In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. +In the 4th, create DIRECTORIES. + +Options: + --help display this help and exit. + --version display version info and exit. + + -c (ignored) + -C install only if different (preserve the last data modification time) + -d create directories instead of installing files. + -g GROUP $chgrpprog installed files to GROUP. + -m MODE $chmodprog installed files to MODE. + -o USER $chownprog installed files to USER. + -s $stripprog installed files. + -t DIRECTORY install into DIRECTORY. + -T report an error if DSTFILE is a directory. + +Environment variables override the default commands: + CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG + RMPROG STRIPPROG +" + +while test $# -ne 0; do + case $1 in + -c) ;; + + -C) copy_on_change=true;; + + -d) dir_arg=true;; + + -g) chgrpcmd="$chgrpprog $2" + shift;; + + --help) echo "$usage"; exit $?;; + + -m) mode=$2 + case $mode in + *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) + echo "$0: invalid mode: $mode" >&2 + exit 1;; + esac + shift;; + + -o) chowncmd="$chownprog $2" + shift;; + + -s) stripcmd=$stripprog;; + + -t) + is_target_a_directory=always + dst_arg=$2 + # Protect names problematic for 'test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac + shift;; + + -T) is_target_a_directory=never;; + + --version) echo "$0 $scriptversion"; exit $?;; + + --) shift + break;; + + -*) echo "$0: invalid option: $1" >&2 + exit 1;; + + *) break;; + esac + shift +done + +# We allow the use of options -d and -T together, by making -d +# take the precedence; this is for compatibility with GNU install. + +if test -n "$dir_arg"; then + if test -n "$dst_arg"; then + echo "$0: target directory not allowed when installing a directory." >&2 + exit 1 + fi +fi + +if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then + # When -d is used, all remaining arguments are directories to create. + # When -t is used, the destination is already specified. + # Otherwise, the last argument is the destination. Remove it from $@. + for arg + do + if test -n "$dst_arg"; then + # $@ is not empty: it contains at least $arg. + set fnord "$@" "$dst_arg" + shift # fnord + fi + shift # arg + dst_arg=$arg + # Protect names problematic for 'test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac + done +fi + +if test $# -eq 0; then + if test -z "$dir_arg"; then + echo "$0: no input file specified." >&2 + exit 1 + fi + # It's OK to call 'install-sh -d' without argument. + # This can happen when creating conditional directories. + exit 0 +fi + +if test -z "$dir_arg"; then + if test $# -gt 1 || test "$is_target_a_directory" = always; then + if test ! -d "$dst_arg"; then + echo "$0: $dst_arg: Is not a directory." >&2 + exit 1 + fi + fi +fi + +if test -z "$dir_arg"; then + do_exit='(exit $ret); exit $ret' + trap "ret=129; $do_exit" 1 + trap "ret=130; $do_exit" 2 + trap "ret=141; $do_exit" 13 + trap "ret=143; $do_exit" 15 + + # Set umask so as not to create temps with too-generous modes. + # However, 'strip' requires both read and write access to temps. + case $mode in + # Optimize common cases. + *644) cp_umask=133;; + *755) cp_umask=22;; + + *[0-7]) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw='% 200' + fi + cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; + *) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw=,u+rw + fi + cp_umask=$mode$u_plus_rw;; + esac +fi + +for src +do + # Protect names problematic for 'test' and other utilities. + case $src in + -* | [=\(\)!]) src=./$src;; + esac + + if test -n "$dir_arg"; then + dst=$src + dstdir=$dst + test -d "$dstdir" + dstdir_status=$? + else + + # Waiting for this to be detected by the "$cpprog $src $dsttmp" command + # might cause directories to be created, which would be especially bad + # if $src (and thus $dsttmp) contains '*'. + if test ! -f "$src" && test ! -d "$src"; then + echo "$0: $src does not exist." >&2 + exit 1 + fi + + if test -z "$dst_arg"; then + echo "$0: no destination specified." >&2 + exit 1 + fi + dst=$dst_arg + + # If destination is a directory, append the input filename. + if test -d "$dst"; then + if test "$is_target_a_directory" = never; then + echo "$0: $dst_arg: Is a directory" >&2 + exit 1 + fi + dstdir=$dst + dstbase=`basename "$src"` + case $dst in + */) dst=$dst$dstbase;; + *) dst=$dst/$dstbase;; + esac + dstdir_status=0 + else + dstdir=`dirname "$dst"` + test -d "$dstdir" + dstdir_status=$? + fi + fi + + case $dstdir in + */) dstdirslash=$dstdir;; + *) dstdirslash=$dstdir/;; + esac + + obsolete_mkdir_used=false + + if test $dstdir_status != 0; then + case $posix_mkdir in + '') + # Create intermediate dirs using mode 755 as modified by the umask. + # This is like FreeBSD 'install' as of 1997-10-28. + umask=`umask` + case $stripcmd.$umask in + # Optimize common cases. + *[2367][2367]) mkdir_umask=$umask;; + .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; + + *[0-7]) + mkdir_umask=`expr $umask + 22 \ + - $umask % 100 % 40 + $umask % 20 \ + - $umask % 10 % 4 + $umask % 2 + `;; + *) mkdir_umask=$umask,go-w;; + esac + + # With -d, create the new directory with the user-specified mode. + # Otherwise, rely on $mkdir_umask. + if test -n "$dir_arg"; then + mkdir_mode=-m$mode + else + mkdir_mode= + fi + + posix_mkdir=false + case $umask in + *[123567][0-7][0-7]) + # POSIX mkdir -p sets u+wx bits regardless of umask, which + # is incompatible with FreeBSD 'install' when (umask & 300) != 0. + ;; + *) + # Note that $RANDOM variable is not portable (e.g. dash); Use it + # here however when possible just to lower collision chance. + tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ + + trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0 + + # Because "mkdir -p" follows existing symlinks and we likely work + # directly in world-writeable /tmp, make sure that the '$tmpdir' + # directory is successfully created first before we actually test + # 'mkdir -p' feature. + if (umask $mkdir_umask && + $mkdirprog $mkdir_mode "$tmpdir" && + exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 + then + if test -z "$dir_arg" || { + # Check for POSIX incompatibilities with -m. + # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or + # other-writable bit of parent directory when it shouldn't. + # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. + test_tmpdir="$tmpdir/a" + ls_ld_tmpdir=`ls -ld "$test_tmpdir"` + case $ls_ld_tmpdir in + d????-?r-*) different_mode=700;; + d????-?--*) different_mode=755;; + *) false;; + esac && + $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { + ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` + test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" + } + } + then posix_mkdir=: + fi + rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" + else + # Remove any dirs left behind by ancient mkdir implementations. + rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null + fi + trap '' 0;; + esac;; + esac + + if + $posix_mkdir && ( + umask $mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" + ) + then : + else + + # The umask is ridiculous, or mkdir does not conform to POSIX, + # or it failed possibly due to a race condition. Create the + # directory the slow way, step by step, checking for races as we go. + + case $dstdir in + /*) prefix='/';; + [-=\(\)!]*) prefix='./';; + *) prefix='';; + esac + + oIFS=$IFS + IFS=/ + set -f + set fnord $dstdir + shift + set +f + IFS=$oIFS + + prefixes= + + for d + do + test X"$d" = X && continue + + prefix=$prefix$d + if test -d "$prefix"; then + prefixes= + else + if $posix_mkdir; then + (umask=$mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break + # Don't fail if two instances are running concurrently. + test -d "$prefix" || exit 1 + else + case $prefix in + *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; + *) qprefix=$prefix;; + esac + prefixes="$prefixes '$qprefix'" + fi + fi + prefix=$prefix/ + done + + if test -n "$prefixes"; then + # Don't fail if two instances are running concurrently. + (umask $mkdir_umask && + eval "\$doit_exec \$mkdirprog $prefixes") || + test -d "$dstdir" || exit 1 + obsolete_mkdir_used=true + fi + fi + fi + + if test -n "$dir_arg"; then + { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && + { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || + test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 + else + + # Make a couple of temp file names in the proper directory. + dsttmp=${dstdirslash}_inst.$$_ + rmtmp=${dstdirslash}_rm.$$_ + + # Trap to clean up those temp files at exit. + trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 + + # Copy the file name to the temp name. + (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && + + # and set any options; do chmod last to preserve setuid bits. + # + # If any of these fail, we abort the whole thing. If we want to + # ignore errors from any of these, just make sure not to ignore + # errors from the above "$doit $cpprog $src $dsttmp" command. + # + { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && + { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && + { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && + + # If -C, don't bother to copy if it wouldn't change the file. + if $copy_on_change && + old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && + new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && + set -f && + set X $old && old=:$2:$4:$5:$6 && + set X $new && new=:$2:$4:$5:$6 && + set +f && + test "$old" = "$new" && + $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 + then + rm -f "$dsttmp" + else + # Rename the file to the real destination. + $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || + + # The rename failed, perhaps because mv can't rename something else + # to itself, or perhaps because mv is so ancient that it does not + # support -f. + { + # Now remove or move aside any old file at destination location. + # We try this two ways since rm can't unlink itself on some + # systems and the destination file might be busy for other + # reasons. In this case, the final cleanup might fail but the new + # file should still install successfully. + { + test ! -f "$dst" || + $doit $rmcmd -f "$dst" 2>/dev/null || + { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && + { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } + } || + { echo "$0: cannot unlink or rename $dst" >&2 + (exit 1); exit 1 + } + } && + + # Now rename the file to the real destination. + $doit $mvcmd "$dsttmp" "$dst" + } + fi || exit 1 + + trap '' 0 + fi +done + +# Local variables: +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/local/recipes/libs/lcms2/source/lcms2.pc.in b/local/recipes/libs/lcms2/source/lcms2.pc.in new file mode 100644 index 0000000000..a2839830c0 --- /dev/null +++ b/local/recipes/libs/lcms2/source/lcms2.pc.in @@ -0,0 +1,11 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: @PACKAGE@ +Description: LCMS Color Management Library +Version: @VERSION@ +Libs: -L${libdir} -llcms2 @LIB_PLUGINS@ +Libs.private: @LIB_MATH@ @LIB_THREAD@ +Cflags: -I${includedir} diff --git a/local/recipes/libs/lcms2/source/ltmain.sh b/local/recipes/libs/lcms2/source/ltmain.sh new file mode 100644 index 0000000000..ff2d73a658 --- /dev/null +++ b/local/recipes/libs/lcms2/source/ltmain.sh @@ -0,0 +1,11517 @@ +#! /usr/bin/env sh +## DO NOT EDIT - This file generated from ./build-aux/ltmain.in +## by inline-source v2019-02-19.15 + +# libtool (GNU libtool) 2.5.4 +# Provide generalized library-building support services. +# Written by Gordon Matzigkeit , 1996 + +# Copyright (C) 1996-2019, 2021-2024 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + + +PROGRAM=libtool +PACKAGE=libtool +VERSION=2.5.4 +package_revision=2.5.4 + + +## ------ ## +## Usage. ## +## ------ ## + +# Run './libtool --help' for help with using this script from the +# command line. + + +## ------------------------------- ## +## User overridable command paths. ## +## ------------------------------- ## + +# After configure completes, it has a better idea of some of the +# shell tools we need than the defaults used by the functions shared +# with bootstrap, so set those here where they can still be over- +# ridden by the user, but otherwise take precedence. + +: ${AUTOCONF="autoconf"} +: ${AUTOMAKE="automake"} + + +## -------------------------- ## +## Source external libraries. ## +## -------------------------- ## + +# Much of our low-level functionality needs to be sourced from external +# libraries, which are installed to $pkgauxdir. + +# Set a version string for this script. +scriptversion=2019-02-19.15; # UTC + +# General shell script boiler plate, and helper functions. +# Written by Gary V. Vaughan, 2004 + +# This is free software. There is NO warranty; not even for +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# +# Copyright (C) 2004-2019, 2021, 2023-2024 Bootstrap Authors +# +# This file is dual licensed under the terms of the MIT license +# , and GPL version 2 or later +# . You must apply one of +# these licenses when using or redistributing this software or any of +# the files within it. See the URLs above, or the file `LICENSE` +# included in the Bootstrap distribution for the full license texts. + +# Please report bugs or propose patches to: +# + + +## ------ ## +## Usage. ## +## ------ ## + +# Evaluate this file near the top of your script to gain access to +# the functions and variables defined here: +# +# . `echo "$0" | ${SED-sed} 's|[^/]*$||'`/build-aux/funclib.sh +# +# If you need to override any of the default environment variable +# settings, do that before evaluating this file. + + +## -------------------- ## +## Shell normalisation. ## +## -------------------- ## + +# Some shells need a little help to be as Bourne compatible as possible. +# Before doing anything else, make sure all that help has been provided! + +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac +fi + +# NLS nuisances: We save the old values in case they are required later. +_G_user_locale= +_G_safe_locale= +for _G_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES +do + eval "if test set = \"\${$_G_var+set}\"; then + save_$_G_var=\$$_G_var + $_G_var=C + export $_G_var + _G_user_locale=\"$_G_var=\\\$save_\$_G_var; \$_G_user_locale\" + _G_safe_locale=\"$_G_var=C; \$_G_safe_locale\" + fi" +done +# These NLS vars are set unconditionally (bootstrap issue #24). Unset those +# in case the environment reset is needed later and the $save_* variant is not +# defined (see the code above). +LC_ALL=C +LANGUAGE=C +export LANGUAGE LC_ALL + +# Make sure IFS has a sensible default +sp=' ' +nl=' +' +IFS="$sp $nl" + +# There are apparently some systems that use ';' as a PATH separator! +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# func_unset VAR +# -------------- +# Portably unset VAR. +# In some shells, an 'unset VAR' statement leaves a non-zero return +# status if VAR is already unset, which might be problematic if the +# statement is used at the end of a function (thus poisoning its return +# value) or when 'set -e' is active (causing even a spurious abort of +# the script in this case). +func_unset () +{ + { eval $1=; (eval unset $1) >/dev/null 2>&1 && eval unset $1 || : ; } +} + + +# Make sure CDPATH doesn't cause `cd` commands to output the target dir. +func_unset CDPATH + +# Make sure ${,E,F}GREP behave sanely. +func_unset GREP_OPTIONS + + +## ------------------------- ## +## Locate command utilities. ## +## ------------------------- ## + + +# func_executable_p FILE +# ---------------------- +# Check that FILE is an executable regular file. +func_executable_p () +{ + test -f "$1" && test -x "$1" +} + + +# func_path_progs PROGS_LIST CHECK_FUNC [PATH] +# -------------------------------------------- +# Search for either a program that responds to --version with output +# containing "GNU", or else returned by CHECK_FUNC otherwise, by +# trying all the directories in PATH with each of the elements of +# PROGS_LIST. +# +# CHECK_FUNC should accept the path to a candidate program, and +# set $func_check_prog_result if it truncates its output less than +# $_G_path_prog_max characters. +func_path_progs () +{ + _G_progs_list=$1 + _G_check_func=$2 + _G_PATH=${3-"$PATH"} + + _G_path_prog_max=0 + _G_path_prog_found=false + _G_save_IFS=$IFS; IFS=${PATH_SEPARATOR-:} + for _G_dir in $_G_PATH; do + IFS=$_G_save_IFS + test -z "$_G_dir" && _G_dir=. + for _G_prog_name in $_G_progs_list; do + for _exeext in '' .EXE; do + _G_path_prog=$_G_dir/$_G_prog_name$_exeext + func_executable_p "$_G_path_prog" || continue + case `"$_G_path_prog" --version 2>&1` in + *GNU*) func_path_progs_result=$_G_path_prog _G_path_prog_found=: ;; + *) $_G_check_func $_G_path_prog + func_path_progs_result=$func_check_prog_result + ;; + esac + $_G_path_prog_found && break 3 + done + done + done + IFS=$_G_save_IFS + test -z "$func_path_progs_result" && { + echo "no acceptable sed could be found in \$PATH" >&2 + exit 1 + } +} + + +# We want to be able to use the functions in this file before configure +# has figured out where the best binaries are kept, which means we have +# to search for them ourselves - except when the results are already set +# where we skip the searches. + +# Unless the user overrides by setting SED, search the path for either GNU +# sed, or the sed that truncates its output the least. +test -z "$SED" && { + _G_sed_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for _G_i in 1 2 3 4 5 6 7; do + _G_sed_script=$_G_sed_script$nl$_G_sed_script + done + echo "$_G_sed_script" 2>/dev/null | sed 99q >conftest.sed + _G_sed_script= + + func_check_prog_sed () + { + _G_path_prog=$1 + + _G_count=0 + printf 0123456789 >conftest.in + while : + do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo '' >> conftest.nl + "$_G_path_prog" -f conftest.sed conftest.out 2>/dev/null || break + diff conftest.out conftest.nl >/dev/null 2>&1 || break + _G_count=`expr $_G_count + 1` + if test "$_G_count" -gt "$_G_path_prog_max"; then + # Best one so far, save it but keep looking for a better one + func_check_prog_result=$_G_path_prog + _G_path_prog_max=$_G_count + fi + # 10*(2^10) chars as input seems more than enough + test 10 -lt "$_G_count" && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out + } + + func_path_progs "sed gsed" func_check_prog_sed "$PATH:/usr/xpg4/bin" + rm -f conftest.sed + SED=$func_path_progs_result +} + + +# Unless the user overrides by setting GREP, search the path for either GNU +# grep, or the grep that truncates its output the least. +test -z "$GREP" && { + func_check_prog_grep () + { + _G_path_prog=$1 + + _G_count=0 + _G_path_prog_max=0 + printf 0123456789 >conftest.in + while : + do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo 'GREP' >> conftest.nl + "$_G_path_prog" -e 'GREP$' -e '-(cannot match)-' conftest.out 2>/dev/null || break + diff conftest.out conftest.nl >/dev/null 2>&1 || break + _G_count=`expr $_G_count + 1` + if test "$_G_count" -gt "$_G_path_prog_max"; then + # Best one so far, save it but keep looking for a better one + func_check_prog_result=$_G_path_prog + _G_path_prog_max=$_G_count + fi + # 10*(2^10) chars as input seems more than enough + test 10 -lt "$_G_count" && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out + } + + func_path_progs "grep ggrep" func_check_prog_grep "$PATH:/usr/xpg4/bin" + GREP=$func_path_progs_result +} + + +## ------------------------------- ## +## User overridable command paths. ## +## ------------------------------- ## + +# All uppercase variable names are used for environment variables. These +# variables can be overridden by the user before calling a script that +# uses them if a suitable command of that name is not already available +# in the command search PATH. + +: ${CP="cp -f"} +: ${ECHO="printf %s\n"} +: ${EGREP="$GREP -E"} +: ${FGREP="$GREP -F"} +: ${LN_S="ln -s"} +: ${MAKE="make"} +: ${MKDIR="mkdir"} +: ${MV="mv -f"} +: ${RM="rm -f"} +: ${SHELL="${CONFIG_SHELL-/bin/sh}"} + + +## -------------------- ## +## Useful sed snippets. ## +## -------------------- ## + +sed_dirname='s|/[^/]*$||' +sed_basename='s|^.*/||' + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +sed_quote_subst='s|\([`"$\\]\)|\\\1|g' + +# Same as above, but do not quote variable references. +sed_double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Sed substitution that turns a string into a regex matching for the +# string literally. +sed_make_literal_regex='s|[].[^$\\*\/]|\\&|g' + +# Sed substitution that converts a w32 file name or path +# that contains forward slashes, into one that contains +# (escaped) backslashes. A very naive implementation. +sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' + +# Re-'\' parameter expansions in output of sed_double_quote_subst that +# were '\'-ed in input to the same. If an odd number of '\' preceded a +# '$' in input to sed_double_quote_subst, that '$' was protected from +# expansion. Since each input '\' is now two '\'s, look for any number +# of runs of four '\'s followed by two '\'s and then a '$'. '\' that '$'. +_G_bs='\\' +_G_bs2='\\\\' +_G_bs4='\\\\\\\\' +_G_dollar='\$' +sed_double_backslash="\ + s/$_G_bs4/&\\ +/g + s/^$_G_bs2$_G_dollar/$_G_bs&/ + s/\\([^$_G_bs]\\)$_G_bs2$_G_dollar/\\1$_G_bs2$_G_bs$_G_dollar/g + s/\n//g" + +# require_check_ifs_backslash +# --------------------------- +# Check if we can use backslash as IFS='\' separator, and set +# $check_ifs_backshlash_broken to ':' or 'false'. +require_check_ifs_backslash=func_require_check_ifs_backslash +func_require_check_ifs_backslash () +{ + _G_save_IFS=$IFS + IFS='\' + _G_check_ifs_backshlash='a\\b' + for _G_i in $_G_check_ifs_backshlash + do + case $_G_i in + a) + check_ifs_backshlash_broken=false + ;; + '') + break + ;; + *) + check_ifs_backshlash_broken=: + break + ;; + esac + done + IFS=$_G_save_IFS + require_check_ifs_backslash=: +} + + +## ----------------- ## +## Global variables. ## +## ----------------- ## + +# Except for the global variables explicitly listed below, the following +# functions in the '^func_' namespace, and the '^require_' namespace +# variables initialised in the 'Resource management' section, sourcing +# this file will not pollute your global namespace with anything +# else. There's no portable way to scope variables in Bourne shell +# though, so actually running these functions will sometimes place +# results into a variable named after the function, and often use +# temporary variables in the '^_G_' namespace. If you are careful to +# avoid using those namespaces casually in your sourcing script, things +# should continue to work as you expect. And, of course, you can freely +# overwrite any of the functions or variables defined here before +# calling anything to customize them. + +EXIT_SUCCESS=0 +EXIT_FAILURE=1 +EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. +EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. + +# Allow overriding, eg assuming that you follow the convention of +# putting '$debug_cmd' at the start of all your functions, you can get +# bash to show function call trace with: +# +# debug_cmd='eval echo "${FUNCNAME[0]} $*" >&2' bash your-script-name +debug_cmd=${debug_cmd-":"} +exit_cmd=: + +# By convention, finish your script with: +# +# exit $exit_status +# +# so that you can set exit_status to non-zero if you want to indicate +# something went wrong during execution without actually bailing out at +# the point of failure. +exit_status=$EXIT_SUCCESS + +# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh +# is ksh but when the shell is invoked as "sh" and the current value of +# the _XPG environment variable is not equal to 1 (one), the special +# positional parameter $0, within a function call, is the name of the +# function. +progpath=$0 + +# The name of this program. +progname=`$ECHO "$progpath" |$SED "$sed_basename"` + +# Make sure we have an absolute progpath for reexecution: +case $progpath in + [\\/]*|[A-Za-z]:\\*) ;; + *[\\/]*) + progdir=`$ECHO "$progpath" |$SED "$sed_dirname"` + progdir=`cd "$progdir" && pwd` + progpath=$progdir/$progname + ;; + *) + _G_IFS=$IFS + IFS=${PATH_SEPARATOR-:} + for progdir in $PATH; do + IFS=$_G_IFS + test -x "$progdir/$progname" && break + done + IFS=$_G_IFS + test -n "$progdir" || progdir=`pwd` + progpath=$progdir/$progname + ;; +esac + + +## ----------------- ## +## Standard options. ## +## ----------------- ## + +# The following options affect the operation of the functions defined +# below, and should be set appropriately depending on run-time para- +# meters passed on the command line. + +opt_dry_run=false +opt_quiet=false +opt_verbose=false + +# Categories 'all' and 'none' are always available. Append any others +# you will pass as the first argument to func_warning from your own +# code. +warning_categories= + +# By default, display warnings according to 'opt_warning_types'. Set +# 'warning_func' to ':' to elide all warnings, or func_fatal_error to +# treat the next displayed warning as a fatal error. +warning_func=func_warn_and_continue + +# Set to 'all' to display all warnings, 'none' to suppress all +# warnings, or a space delimited list of some subset of +# 'warning_categories' to display only the listed warnings. +opt_warning_types=all + + +## -------------------- ## +## Resource management. ## +## -------------------- ## + +# This section contains definitions for functions that each ensure a +# particular resource (a file, or a non-empty configuration variable for +# example) is available, and if appropriate to extract default values +# from pertinent package files. Call them using their associated +# 'require_*' variable to ensure that they are executed, at most, once. +# +# It's entirely deliberate that calling these functions can set +# variables that don't obey the namespace limitations obeyed by the rest +# of this file, in order that that they be as useful as possible to +# callers. + + +# require_term_colors +# ------------------- +# Allow display of bold text on terminals that support it. +require_term_colors=func_require_term_colors +func_require_term_colors () +{ + $debug_cmd + + test -t 1 && { + # COLORTERM and USE_ANSI_COLORS environment variables take + # precedence, because most terminfo databases neglect to describe + # whether color sequences are supported. + test -n "${COLORTERM+set}" && : ${USE_ANSI_COLORS="1"} + + if test 1 = "$USE_ANSI_COLORS"; then + # Standard ANSI escape sequences + tc_reset='' + tc_bold=''; tc_standout='' + tc_red=''; tc_green='' + tc_blue=''; tc_cyan='' + else + # Otherwise trust the terminfo database after all. + test -n "`tput sgr0 2>/dev/null`" && { + tc_reset=`tput sgr0` + test -n "`tput bold 2>/dev/null`" && tc_bold=`tput bold` + tc_standout=$tc_bold + test -n "`tput smso 2>/dev/null`" && tc_standout=`tput smso` + test -n "`tput setaf 1 2>/dev/null`" && tc_red=`tput setaf 1` + test -n "`tput setaf 2 2>/dev/null`" && tc_green=`tput setaf 2` + test -n "`tput setaf 4 2>/dev/null`" && tc_blue=`tput setaf 4` + test -n "`tput setaf 5 2>/dev/null`" && tc_cyan=`tput setaf 5` + } + fi + } + + require_term_colors=: +} + + +## ----------------- ## +## Function library. ## +## ----------------- ## + +# This section contains a variety of useful functions to call in your +# scripts. Take note of the portable wrappers for features provided by +# some modern shells, which will fall back to slower equivalents on +# less featureful shells. + + +# func_append VAR VALUE +# --------------------- +# Append VALUE onto the existing contents of VAR. + + # We should try to minimise forks, especially on Windows where they are + # unreasonably slow, so skip the feature probes when bash or zsh are + # being used: + if test set = "${BASH_VERSION+set}${ZSH_VERSION+set}"; then + : ${_G_HAVE_ARITH_OP="yes"} + : ${_G_HAVE_XSI_OPS="yes"} + # The += operator was introduced in bash 3.1 + case $BASH_VERSION in + [12].* | 3.0 | 3.0*) ;; + *) + : ${_G_HAVE_PLUSEQ_OP="yes"} + ;; + esac + fi + + # _G_HAVE_PLUSEQ_OP + # Can be empty, in which case the shell is probed, "yes" if += is + # usable or anything else if it does not work. + test -z "$_G_HAVE_PLUSEQ_OP" \ + && (eval 'x=a; x+=" b"; test "a b" = "$x"') 2>/dev/null \ + && _G_HAVE_PLUSEQ_OP=yes + +if test yes = "$_G_HAVE_PLUSEQ_OP" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_append () + { + $debug_cmd + + eval "$1+=\$2" + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_append () + { + $debug_cmd + + eval "$1=\$$1\$2" + } +fi + + +# func_append_quoted VAR VALUE +# ---------------------------- +# Quote VALUE and append to the end of shell variable VAR, separated +# by a space. +if test yes = "$_G_HAVE_PLUSEQ_OP"; then + eval 'func_append_quoted () + { + $debug_cmd + + func_quote_arg pretty "$2" + eval "$1+=\\ \$func_quote_arg_result" + }' +else + func_append_quoted () + { + $debug_cmd + + func_quote_arg pretty "$2" + eval "$1=\$$1\\ \$func_quote_arg_result" + } +fi + + +# func_append_uniq VAR VALUE +# -------------------------- +# Append unique VALUE onto the existing contents of VAR, assuming +# entries are delimited by the first character of VALUE. For example: +# +# func_append_uniq options " --another-option option-argument" +# +# will only append to $options if " --another-option option-argument " +# is not already present somewhere in $options already (note spaces at +# each end implied by leading space in second argument). +func_append_uniq () +{ + $debug_cmd + + eval _G_current_value='`$ECHO $'$1'`' + _G_delim=`expr "$2" : '\(.\)'` + + case $_G_delim$_G_current_value$_G_delim in + *"$2$_G_delim"*) ;; + *) func_append "$@" ;; + esac +} + + +# func_arith TERM... +# ------------------ +# Set func_arith_result to the result of evaluating TERMs. + test -z "$_G_HAVE_ARITH_OP" \ + && (eval 'test 2 = $(( 1 + 1 ))') 2>/dev/null \ + && _G_HAVE_ARITH_OP=yes + +if test yes = "$_G_HAVE_ARITH_OP"; then + eval 'func_arith () + { + $debug_cmd + + func_arith_result=$(( $* )) + }' +else + func_arith () + { + $debug_cmd + + func_arith_result=`expr "$@"` + } +fi + + +# func_basename FILE +# ------------------ +# Set func_basename_result to FILE with everything up to and including +# the last / stripped. +if test yes = "$_G_HAVE_XSI_OPS"; then + # If this shell supports suffix pattern removal, then use it to avoid + # forking. Hide the definitions single quotes in case the shell chokes + # on unsupported syntax... + _b='func_basename_result=${1##*/}' + _d='case $1 in + */*) func_dirname_result=${1%/*}$2 ;; + * ) func_dirname_result=$3 ;; + esac' + +else + # ...otherwise fall back to using sed. + _b='func_basename_result=`$ECHO "$1" |$SED "$sed_basename"`' + _d='func_dirname_result=`$ECHO "$1" |$SED "$sed_dirname"` + if test "X$func_dirname_result" = "X$1"; then + func_dirname_result=$3 + else + func_append func_dirname_result "$2" + fi' +fi + +eval 'func_basename () +{ + $debug_cmd + + '"$_b"' +}' + + +# func_dirname FILE APPEND NONDIR_REPLACEMENT +# ------------------------------------------- +# Compute the dirname of FILE. If nonempty, add APPEND to the result, +# otherwise set result to NONDIR_REPLACEMENT. +eval 'func_dirname () +{ + $debug_cmd + + '"$_d"' +}' + + +# func_dirname_and_basename FILE APPEND NONDIR_REPLACEMENT +# -------------------------------------------------------- +# Perform func_basename and func_dirname in a single function +# call: +# dirname: Compute the dirname of FILE. If nonempty, +# add APPEND to the result, otherwise set result +# to NONDIR_REPLACEMENT. +# value returned in "$func_dirname_result" +# basename: Compute filename of FILE. +# value returned in "$func_basename_result" +# For efficiency, we do not delegate to the functions above but instead +# duplicate the functionality here. +eval 'func_dirname_and_basename () +{ + $debug_cmd + + '"$_b"' + '"$_d"' +}' + + +# func_echo ARG... +# ---------------- +# Echo program name prefixed message. +func_echo () +{ + $debug_cmd + + _G_message=$* + + func_echo_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_IFS + $ECHO "$progname: $_G_line" + done + IFS=$func_echo_IFS +} + + +# func_echo_all ARG... +# -------------------- +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "$*" +} + + +# func_echo_infix_1 INFIX ARG... +# ------------------------------ +# Echo program name, followed by INFIX on the first line, with any +# additional lines not showing INFIX. +func_echo_infix_1 () +{ + $debug_cmd + + $require_term_colors + + _G_infix=$1; shift + _G_indent=$_G_infix + _G_prefix="$progname: $_G_infix: " + _G_message=$* + + # Strip color escape sequences before counting printable length + for _G_tc in "$tc_reset" "$tc_bold" "$tc_standout" "$tc_red" "$tc_green" "$tc_blue" "$tc_cyan" + do + test -n "$_G_tc" && { + _G_esc_tc=`$ECHO "$_G_tc" | $SED "$sed_make_literal_regex"` + _G_indent=`$ECHO "$_G_indent" | $SED "s|$_G_esc_tc||g"` + } + done + _G_indent="$progname: "`echo "$_G_indent" | $SED 's|.| |g'`" " ## exclude from sc_prohibit_nested_quotes + + func_echo_infix_1_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_infix_1_IFS + $ECHO "$_G_prefix$tc_bold$_G_line$tc_reset" >&2 + _G_prefix=$_G_indent + done + IFS=$func_echo_infix_1_IFS +} + + +# func_error ARG... +# ----------------- +# Echo program name prefixed message to standard error. +func_error () +{ + $debug_cmd + + $require_term_colors + + func_echo_infix_1 " $tc_standout${tc_red}error$tc_reset" "$*" >&2 +} + + +# func_fatal_error ARG... +# ----------------------- +# Echo program name prefixed message to standard error, and exit. +func_fatal_error () +{ + $debug_cmd + + func_error "$*" + exit $EXIT_FAILURE +} + + +# func_grep EXPRESSION FILENAME +# ----------------------------- +# Check whether EXPRESSION matches any line of FILENAME, without output. +func_grep () +{ + $debug_cmd + + $GREP "$1" "$2" >/dev/null 2>&1 +} + + +# func_len STRING +# --------------- +# Set func_len_result to the length of STRING. STRING may not +# start with a hyphen. + test -z "$_G_HAVE_XSI_OPS" \ + && (eval 'x=a/b/c; + test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ + && _G_HAVE_XSI_OPS=yes + +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_len () + { + $debug_cmd + + func_len_result=${#1} + }' +else + func_len () + { + $debug_cmd + + func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len` + } +fi + + +# func_mkdir_p DIRECTORY-PATH +# --------------------------- +# Make sure the entire path to DIRECTORY-PATH is available. +func_mkdir_p () +{ + $debug_cmd + + _G_directory_path=$1 + _G_dir_list= + + if test -n "$_G_directory_path" && test : != "$opt_dry_run"; then + + # Protect directory names starting with '-' + case $_G_directory_path in + -*) _G_directory_path=./$_G_directory_path ;; + esac + + # While some portion of DIR does not yet exist... + while test ! -d "$_G_directory_path"; do + # ...make a list in topmost first order. Use a colon delimited + # list in case some portion of path contains whitespace. + _G_dir_list=$_G_directory_path:$_G_dir_list + + # If the last portion added has no slash in it, the list is done + case $_G_directory_path in */*) ;; *) break ;; esac + + # ...otherwise throw away the child directory and loop + _G_directory_path=`$ECHO "$_G_directory_path" | $SED -e "$sed_dirname"` + done + _G_dir_list=`$ECHO "$_G_dir_list" | $SED 's|:*$||'` + + func_mkdir_p_IFS=$IFS; IFS=: + for _G_dir in $_G_dir_list; do + IFS=$func_mkdir_p_IFS + # mkdir can fail with a 'File exist' error if two processes + # try to create one of the directories concurrently. Don't + # stop in that case! + $MKDIR "$_G_dir" 2>/dev/null || : + done + IFS=$func_mkdir_p_IFS + + # Bail out if we (or some other process) failed to create a directory. + test -d "$_G_directory_path" || \ + func_fatal_error "Failed to create '$1'" + fi +} + + +# func_mktempdir [BASENAME] +# ------------------------- +# Make a temporary directory that won't clash with other running +# libtool processes, and avoids race conditions if possible. If +# given, BASENAME is the basename for that directory. +func_mktempdir () +{ + $debug_cmd + + _G_template=${TMPDIR-/tmp}/${1-$progname} + + if test : = "$opt_dry_run"; then + # Return a directory name, but don't create it in dry-run mode + _G_tmpdir=$_G_template-$$ + else + + # If mktemp works, use that first and foremost + _G_tmpdir=`mktemp -d "$_G_template-XXXXXXXX" 2>/dev/null` + + if test ! -d "$_G_tmpdir"; then + # Failing that, at least try and use $RANDOM to avoid a race + _G_tmpdir=$_G_template-${RANDOM-0}$$ + + func_mktempdir_umask=`umask` + umask 0077 + $MKDIR "$_G_tmpdir" + umask $func_mktempdir_umask + fi + + # If we're not in dry-run mode, bomb out on failure + test -d "$_G_tmpdir" || \ + func_fatal_error "cannot create temporary directory '$_G_tmpdir'" + fi + + $ECHO "$_G_tmpdir" +} + + +# func_normal_abspath PATH +# ------------------------ +# Remove doubled-up and trailing slashes, "." path components, +# and cancel out any ".." path components in PATH after making +# it an absolute path. +func_normal_abspath () +{ + $debug_cmd + + # These SED scripts presuppose an absolute path with a trailing slash. + _G_pathcar='s|^/\([^/]*\).*$|\1|' + _G_pathcdr='s|^/[^/]*||' + _G_removedotparts=':dotsl + s|/\./|/|g + t dotsl + s|/\.$|/|' + _G_collapseslashes='s|/\{1,\}|/|g' + _G_finalslash='s|/*$|/|' + + # Start from root dir and reassemble the path. + func_normal_abspath_result= + func_normal_abspath_tpath=$1 + func_normal_abspath_altnamespace= + case $func_normal_abspath_tpath in + "") + # Empty path, that just means $cwd. + func_stripname '' '/' "`pwd`" + func_normal_abspath_result=$func_stripname_result + return + ;; + # The next three entries are used to spot a run of precisely + # two leading slashes without using negated character classes; + # we take advantage of case's first-match behaviour. + ///*) + # Unusual form of absolute path, do nothing. + ;; + //*) + # Not necessarily an ordinary path; POSIX reserves leading '//' + # and for example Cygwin uses it to access remote file shares + # over CIFS/SMB, so we conserve a leading double slash if found. + func_normal_abspath_altnamespace=/ + ;; + /*) + # Absolute path, do nothing. + ;; + *) + # Relative path, prepend $cwd. + func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath + ;; + esac + + # Cancel out all the simple stuff to save iterations. We also want + # the path to end with a slash for ease of parsing, so make sure + # there is one (and only one) here. + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_removedotparts" -e "$_G_collapseslashes" -e "$_G_finalslash"` + while :; do + # Processed it all yet? + if test / = "$func_normal_abspath_tpath"; then + # If we ascended to the root using ".." the result may be empty now. + if test -z "$func_normal_abspath_result"; then + func_normal_abspath_result=/ + fi + break + fi + func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_pathcar"` + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_pathcdr"` + # Figure out what to do with it + case $func_normal_abspath_tcomponent in + "") + # Trailing empty path component, ignore it. + ;; + ..) + # Parent dir; strip last assembled component from result. + func_dirname "$func_normal_abspath_result" + func_normal_abspath_result=$func_dirname_result + ;; + *) + # Actual path component, append it. + func_append func_normal_abspath_result "/$func_normal_abspath_tcomponent" + ;; + esac + done + # Restore leading double-slash if one was found on entry. + func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result +} + + +# func_notquiet ARG... +# -------------------- +# Echo program name prefixed message only when not in quiet mode. +func_notquiet () +{ + $debug_cmd + + $opt_quiet || func_echo ${1+"$@"} + + # A bug in bash halts the script if the last line of a function + # fails when set -e is in force, so we need another command to + # work around that: + : +} + + +# func_relative_path SRCDIR DSTDIR +# -------------------------------- +# Set func_relative_path_result to the relative path from SRCDIR to DSTDIR. +func_relative_path () +{ + $debug_cmd + + func_relative_path_result= + func_normal_abspath "$1" + func_relative_path_tlibdir=$func_normal_abspath_result + func_normal_abspath "$2" + func_relative_path_tbindir=$func_normal_abspath_result + + # Ascend the tree starting from libdir + while :; do + # check if we have found a prefix of bindir + case $func_relative_path_tbindir in + $func_relative_path_tlibdir) + # found an exact match + func_relative_path_tcancelled= + break + ;; + $func_relative_path_tlibdir*) + # found a matching prefix + func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" + func_relative_path_tcancelled=$func_stripname_result + if test -z "$func_relative_path_result"; then + func_relative_path_result=. + fi + break + ;; + *) + func_dirname $func_relative_path_tlibdir + func_relative_path_tlibdir=$func_dirname_result + if test -z "$func_relative_path_tlibdir"; then + # Have to descend all the way to the root! + func_relative_path_result=../$func_relative_path_result + func_relative_path_tcancelled=$func_relative_path_tbindir + break + fi + func_relative_path_result=../$func_relative_path_result + ;; + esac + done + + # Now calculate path; take care to avoid doubling-up slashes. + func_stripname '' '/' "$func_relative_path_result" + func_relative_path_result=$func_stripname_result + func_stripname '/' '/' "$func_relative_path_tcancelled" + if test -n "$func_stripname_result"; then + func_append func_relative_path_result "/$func_stripname_result" + fi + + # Normalisation. If bindir is libdir, return '.' else relative path. + if test -n "$func_relative_path_result"; then + func_stripname './' '' "$func_relative_path_result" + func_relative_path_result=$func_stripname_result + fi + + test -n "$func_relative_path_result" || func_relative_path_result=. + + : +} + + +# func_quote_portable EVAL ARG +# ---------------------------- +# Internal function to portably implement func_quote_arg. Note that we still +# keep attention to performance here so we as much as possible try to avoid +# calling sed binary (so far O(N) complexity as long as func_append is O(1)). +func_quote_portable () +{ + $debug_cmd + + $require_check_ifs_backslash + + func_quote_portable_result=$2 + + # one-time-loop (easy break) + while true + do + if $1; then + func_quote_portable_result=`$ECHO "$2" | $SED \ + -e "$sed_double_quote_subst" -e "$sed_double_backslash"` + break + fi + + # Quote for eval. + case $func_quote_portable_result in + *[\\\`\"\$]*) + # Fallback to sed for $func_check_bs_ifs_broken=:, or when the string + # contains the shell wildcard characters. + case $check_ifs_backshlash_broken$func_quote_portable_result in + :*|*[\[\*\?]*) + func_quote_portable_result=`$ECHO "$func_quote_portable_result" \ + | $SED "$sed_quote_subst"` + break + ;; + esac + + func_quote_portable_old_IFS=$IFS + for _G_char in '\' '`' '"' '$' + do + # STATE($1) PREV($2) SEPARATOR($3) + set start "" "" + func_quote_portable_result=dummy"$_G_char$func_quote_portable_result$_G_char"dummy + IFS=$_G_char + for _G_part in $func_quote_portable_result + do + case $1 in + quote) + func_append func_quote_portable_result "$3$2" + set quote "$_G_part" "\\$_G_char" + ;; + start) + set first "" "" + func_quote_portable_result= + ;; + first) + set quote "$_G_part" "" + ;; + esac + done + done + IFS=$func_quote_portable_old_IFS + ;; + *) ;; + esac + break + done + + func_quote_portable_unquoted_result=$func_quote_portable_result + case $func_quote_portable_result in + # double-quote args containing shell metacharacters to delay + # word splitting, command substitution and variable expansion + # for a subsequent eval. + # many bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + func_quote_portable_result=\"$func_quote_portable_result\" + ;; + esac +} + + +# func_quotefast_eval ARG +# ----------------------- +# Quote one ARG (internal). This is equivalent to 'func_quote_arg eval ARG', +# but optimized for speed. Result is stored in $func_quotefast_eval. +if test xyes = `(x=; printf -v x %q yes; echo x"$x") 2>/dev/null`; then + printf -v _GL_test_printf_tilde %q '~' + if test '\~' = "$_GL_test_printf_tilde"; then + func_quotefast_eval () + { + printf -v func_quotefast_eval_result %q "$1" + } + else + # Broken older Bash implementations. Make those faster too if possible. + func_quotefast_eval () + { + case $1 in + '~'*) + func_quote_portable false "$1" + func_quotefast_eval_result=$func_quote_portable_result + ;; + *) + printf -v func_quotefast_eval_result %q "$1" + ;; + esac + } + fi +else + func_quotefast_eval () + { + func_quote_portable false "$1" + func_quotefast_eval_result=$func_quote_portable_result + } +fi + + +# func_quote_arg MODEs ARG +# ------------------------ +# Quote one ARG to be evaled later. MODEs argument may contain zero or more +# specifiers listed below separated by ',' character. This function returns two +# values: +# i) func_quote_arg_result +# double-quoted (when needed), suitable for a subsequent eval +# ii) func_quote_arg_unquoted_result +# has all characters that are still active within double +# quotes backslashified. Available only if 'unquoted' is specified. +# +# Available modes: +# ---------------- +# 'eval' (default) +# - escape shell special characters +# 'expand' +# - the same as 'eval'; but do not quote variable references +# 'pretty' +# - request aesthetic output, i.e. '"a b"' instead of 'a\ b'. This might +# be used later in func_quote to get output like: 'echo "a b"' instead +# of 'echo a\ b'. This is slower than default on some shells. +# 'unquoted' +# - produce also $func_quote_arg_unquoted_result which does not contain +# wrapping double-quotes. +# +# Examples for 'func_quote_arg pretty,unquoted string': +# +# string | *_result | *_unquoted_result +# ------------+-----------------------+------------------- +# " | \" | \" +# a b | "a b" | a b +# "a b" | "\"a b\"" | \"a b\" +# * | "*" | * +# z="${x-$y}" | "z=\"\${x-\$y}\"" | z=\"\${x-\$y}\" +# +# Examples for 'func_quote_arg pretty,unquoted,expand string': +# +# string | *_result | *_unquoted_result +# --------------+---------------------+-------------------- +# z="${x-$y}" | "z=\"${x-$y}\"" | z=\"${x-$y}\" +func_quote_arg () +{ + _G_quote_expand=false + case ,$1, in + *,expand,*) + _G_quote_expand=: + ;; + esac + + case ,$1, in + *,pretty,*|*,expand,*|*,unquoted,*) + func_quote_portable $_G_quote_expand "$2" + func_quote_arg_result=$func_quote_portable_result + func_quote_arg_unquoted_result=$func_quote_portable_unquoted_result + ;; + *) + # Faster quote-for-eval for some shells. + func_quotefast_eval "$2" + func_quote_arg_result=$func_quotefast_eval_result + ;; + esac +} + + +# func_quote MODEs ARGs... +# ------------------------ +# Quote all ARGs to be evaled later and join them into single command. See +# func_quote_arg's description for more info. +func_quote () +{ + $debug_cmd + _G_func_quote_mode=$1 ; shift + func_quote_result= + while test 0 -lt $#; do + func_quote_arg "$_G_func_quote_mode" "$1" + if test -n "$func_quote_result"; then + func_append func_quote_result " $func_quote_arg_result" + else + func_append func_quote_result "$func_quote_arg_result" + fi + shift + done +} + + +# func_stripname PREFIX SUFFIX NAME +# --------------------------------- +# strip PREFIX and SUFFIX from NAME, and store in func_stripname_result. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_stripname () + { + $debug_cmd + + # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are + # positional parameters, so assign one to ordinary variable first. + func_stripname_result=$3 + func_stripname_result=${func_stripname_result#"$1"} + func_stripname_result=${func_stripname_result%"$2"} + }' +else + func_stripname () + { + $debug_cmd + + case $2 in + .*) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%\\\\$2\$%%"`;; + *) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%$2\$%%"`;; + esac + } +fi + + +# func_show_eval CMD [FAIL_EXP] +# ----------------------------- +# Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. +func_show_eval () +{ + $debug_cmd + + _G_cmd=$1 + _G_fail_exp=${2-':'} + + func_quote_arg pretty,expand "$_G_cmd" + eval "func_notquiet $func_quote_arg_result" + + $opt_dry_run || { + eval "$_G_cmd" + _G_status=$? + if test 0 -ne "$_G_status"; then + eval "(exit $_G_status); $_G_fail_exp" + fi + } +} + + +# func_show_eval_locale CMD [FAIL_EXP] +# ------------------------------------ +# Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. Use the saved locale for evaluation. +func_show_eval_locale () +{ + $debug_cmd + + _G_cmd=$1 + _G_fail_exp=${2-':'} + + $opt_quiet || { + func_quote_arg expand,pretty "$_G_cmd" + eval "func_echo $func_quote_arg_result" + } + + $opt_dry_run || { + eval "$_G_user_locale + $_G_cmd" + _G_status=$? + eval "$_G_safe_locale" + if test 0 -ne "$_G_status"; then + eval "(exit $_G_status); $_G_fail_exp" + fi + } +} + + +# func_tr_sh +# ---------- +# Turn $1 into a string suitable for a shell variable name. +# Result is stored in $func_tr_sh_result. All characters +# not in the set a-zA-Z0-9_ are replaced with '_'. Further, +# if $1 begins with a digit, a '_' is prepended as well. +func_tr_sh () +{ + $debug_cmd + + case $1 in + [0-9]* | *[!a-zA-Z0-9_]*) + func_tr_sh_result=`$ECHO "$1" | $SED -e 's/^\([0-9]\)/_\1/' -e 's/[^a-zA-Z0-9_]/_/g'` + ;; + * ) + func_tr_sh_result=$1 + ;; + esac +} + + +# func_verbose ARG... +# ------------------- +# Echo program name prefixed message in verbose mode only. +func_verbose () +{ + $debug_cmd + + $opt_verbose && func_echo "$*" + + : +} + + +# func_warn_and_continue ARG... +# ----------------------------- +# Echo program name prefixed warning message to standard error. +func_warn_and_continue () +{ + $debug_cmd + + $require_term_colors + + func_echo_infix_1 "${tc_red}warning$tc_reset" "$*" >&2 +} + + +# func_warning CATEGORY ARG... +# ---------------------------- +# Echo program name prefixed warning message to standard error. Warning +# messages can be filtered according to CATEGORY, where this function +# elides messages where CATEGORY is not listed in the global variable +# 'opt_warning_types'. +func_warning () +{ + $debug_cmd + + # CATEGORY must be in the warning_categories list! + case " $warning_categories " in + *" $1 "*) ;; + *) func_internal_error "invalid warning category '$1'" ;; + esac + + _G_category=$1 + shift + + case " $opt_warning_types " in + *" $_G_category "*) $warning_func ${1+"$@"} ;; + esac +} + + +# func_sort_ver VER1 VER2 +# ----------------------- +# 'sort -V' is not generally available. +# Note this deviates from the version comparison in automake +# in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a +# but this should suffice as we won't be specifying old +# version formats or redundant trailing .0 in bootstrap.conf. +# If we did want full compatibility then we should probably +# use m4_version_compare from autoconf. +func_sort_ver () +{ + $debug_cmd + + printf '%s\n%s\n' "$1" "$2" \ + | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n -k 6,6n -k 7,7n -k 8,8n -k 9,9n +} + +# func_lt_ver PREV CURR +# --------------------- +# Return true if PREV and CURR are in the correct order according to +# func_sort_ver, otherwise false. Use it like this: +# +# func_lt_ver "$prev_ver" "$proposed_ver" || func_fatal_error "..." +func_lt_ver () +{ + $debug_cmd + + test "x$1" = x`func_sort_ver "$1" "$2" | $SED 1q` +} + + +# Local variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" +# time-stamp-time-zone: "UTC" +# End: +#! /bin/sh + +# A portable, pluggable option parser for Bourne shell. +# Written by Gary V. Vaughan, 2010 + +# This is free software. There is NO warranty; not even for +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# +# Copyright (C) 2010-2019, 2021, 2023-2024 Bootstrap Authors +# +# This file is dual licensed under the terms of the MIT license +# , and GPL version 2 or later +# . You must apply one of +# these licenses when using or redistributing this software or any of +# the files within it. See the URLs above, or the file `LICENSE` +# included in the Bootstrap distribution for the full license texts. + +# Please report bugs or propose patches to: +# + +# Set a version string for this script. +scriptversion=2019-02-19.15; # UTC + + +## ------ ## +## Usage. ## +## ------ ## + +# This file is a library for parsing options in your shell scripts along +# with assorted other useful supporting features that you can make use +# of too. +# +# For the simplest scripts you might need only: +# +# #!/bin/sh +# . relative/path/to/funclib.sh +# . relative/path/to/options-parser +# scriptversion=1.0 +# func_options ${1+"$@"} +# eval set dummy "$func_options_result"; shift +# ...rest of your script... +# +# In order for the '--version' option to work, you will need to have a +# suitably formatted comment like the one at the top of this file +# starting with '# Written by ' and ending with '# Copyright'. +# +# For '-h' and '--help' to work, you will also need a one line +# description of your script's purpose in a comment directly above the +# '# Written by ' line, like the one at the top of this file. +# +# The default options also support '--debug', which will turn on shell +# execution tracing (see the comment above debug_cmd below for another +# use), and '--verbose' and the func_verbose function to allow your script +# to display verbose messages only when your user has specified +# '--verbose'. +# +# After sourcing this file, you can plug in processing for additional +# options by amending the variables from the 'Configuration' section +# below, and following the instructions in the 'Option parsing' +# section further down. + +## -------------- ## +## Configuration. ## +## -------------- ## + +# You should override these variables in your script after sourcing this +# file so that they reflect the customisations you have added to the +# option parser. + +# The usage line for option parsing errors and the start of '-h' and +# '--help' output messages. You can embed shell variables for delayed +# expansion at the time the message is displayed, but you will need to +# quote other shell meta-characters carefully to prevent them being +# expanded when the contents are evaled. +usage='$progpath [OPTION]...' + +# Short help message in response to '-h' and '--help'. Add to this or +# override it after sourcing this library to reflect the full set of +# options your script accepts. +usage_message="\ + --debug enable verbose shell tracing + -W, --warnings=CATEGORY + report the warnings falling in CATEGORY [all] + -v, --verbose verbosely report processing + --version print version information and exit + -h, --help print short or long help message and exit +" + +# Additional text appended to 'usage_message' in response to '--help'. +long_help_message=" +Warning categories include: + 'all' show all warnings + 'none' turn off all the warnings + 'error' warnings are treated as fatal errors" + +# Help message printed before fatal option parsing errors. +fatal_help="Try '\$progname --help' for more information." + + + +## ------------------------- ## +## Hook function management. ## +## ------------------------- ## + +# This section contains functions for adding, removing, and running hooks +# in the main code. A hook is just a list of function names that can be +# run in order later on. + +# func_hookable FUNC_NAME +# ----------------------- +# Declare that FUNC_NAME will run hooks added with +# 'func_add_hook FUNC_NAME ...'. +func_hookable () +{ + $debug_cmd + + func_append hookable_fns " $1" +} + + +# func_add_hook FUNC_NAME HOOK_FUNC +# --------------------------------- +# Request that FUNC_NAME call HOOK_FUNC before it returns. FUNC_NAME must +# first have been declared "hookable" by a call to 'func_hookable'. +func_add_hook () +{ + $debug_cmd + + case " $hookable_fns " in + *" $1 "*) ;; + *) func_fatal_error "'$1' does not accept hook functions." ;; + esac + + eval func_append ${1}_hooks '" $2"' +} + + +# func_remove_hook FUNC_NAME HOOK_FUNC +# ------------------------------------ +# Remove HOOK_FUNC from the list of hook functions to be called by +# FUNC_NAME. +func_remove_hook () +{ + $debug_cmd + + eval ${1}_hooks='`$ECHO "\$'$1'_hooks" |$SED "s| '$2'||"`' +} + + +# func_propagate_result FUNC_NAME_A FUNC_NAME_B +# --------------------------------------------- +# If the *_result variable of FUNC_NAME_A _is set_, assign its value to +# *_result variable of FUNC_NAME_B. +func_propagate_result () +{ + $debug_cmd + + func_propagate_result_result=: + if eval "test \"\${${1}_result+set}\" = set" + then + eval "${2}_result=\$${1}_result" + else + func_propagate_result_result=false + fi +} + + +# func_run_hooks FUNC_NAME [ARG]... +# --------------------------------- +# Run all hook functions registered to FUNC_NAME. +# It's assumed that the list of hook functions contains nothing more +# than a whitespace-delimited list of legal shell function names, and +# no effort is wasted trying to catch shell meta-characters or preserve +# whitespace. +func_run_hooks () +{ + $debug_cmd + + case " $hookable_fns " in + *" $1 "*) ;; + *) func_fatal_error "'$1' does not support hook functions." ;; + esac + + eval _G_hook_fns=\$$1_hooks; shift + + for _G_hook in $_G_hook_fns; do + func_unset "${_G_hook}_result" + eval $_G_hook '${1+"$@"}' + func_propagate_result $_G_hook func_run_hooks + if $func_propagate_result_result; then + eval set dummy "$func_run_hooks_result"; shift + fi + done +} + + + +## --------------- ## +## Option parsing. ## +## --------------- ## + +# In order to add your own option parsing hooks, you must accept the +# full positional parameter list from your hook function. You may remove +# or edit any options that you action, and then pass back the remaining +# unprocessed options in '_result', escaped +# suitably for 'eval'. +# +# The '_result' variable is automatically unset +# before your hook gets called; for best performance, only set the +# *_result variable when necessary (i.e. don't call the 'func_quote' +# function unnecessarily because it can be an expensive operation on some +# machines). +# +# Like this: +# +# my_options_prep () +# { +# $debug_cmd +# +# # Extend the existing usage message. +# usage_message=$usage_message' +# -s, --silent don'\''t print informational messages +# ' +# # No change in '$@' (ignored completely by this hook). Leave +# # my_options_prep_result variable intact. +# } +# func_add_hook func_options_prep my_options_prep +# +# +# my_silent_option () +# { +# $debug_cmd +# +# args_changed=false +# +# # Note that, for efficiency, we parse as many options as we can +# # recognise in a loop before passing the remainder back to the +# # caller on the first unrecognised argument we encounter. +# while test $# -gt 0; do +# opt=$1; shift +# case $opt in +# --silent|-s) opt_silent=: +# args_changed=: +# ;; +# # Separate non-argument short options: +# -s*) func_split_short_opt "$_G_opt" +# set dummy "$func_split_short_opt_name" \ +# "-$func_split_short_opt_arg" ${1+"$@"} +# shift +# args_changed=: +# ;; +# *) # Make sure the first unrecognised option "$_G_opt" +# # is added back to "$@" in case we need it later, +# # if $args_changed was set to 'true'. +# set dummy "$_G_opt" ${1+"$@"}; shift; break ;; +# esac +# done +# +# # Only call 'func_quote' here if we processed at least one argument. +# if $args_changed; then +# func_quote eval ${1+"$@"} +# my_silent_option_result=$func_quote_result +# fi +# } +# func_add_hook func_parse_options my_silent_option +# +# +# my_option_validation () +# { +# $debug_cmd +# +# $opt_silent && $opt_verbose && func_fatal_help "\ +# '--silent' and '--verbose' options are mutually exclusive." +# } +# func_add_hook func_validate_options my_option_validation +# +# You'll also need to manually amend $usage_message to reflect the extra +# options you parse. It's preferable to append if you can, so that +# multiple option parsing hooks can be added safely. + + +# func_options_finish [ARG]... +# ---------------------------- +# Finishing the option parse loop (call 'func_options' hooks ATM). +func_options_finish () +{ + $debug_cmd + + func_run_hooks func_options ${1+"$@"} + func_propagate_result func_run_hooks func_options_finish +} + + +# func_options [ARG]... +# --------------------- +# All the functions called inside func_options are hookable. See the +# individual implementations for details. +func_hookable func_options +func_options () +{ + $debug_cmd + + _G_options_quoted=false + + for my_func in options_prep parse_options validate_options options_finish + do + func_unset func_${my_func}_result + func_unset func_run_hooks_result + eval func_$my_func '${1+"$@"}' + func_propagate_result func_$my_func func_options + if $func_propagate_result_result; then + eval set dummy "$func_options_result"; shift + _G_options_quoted=: + fi + done + + $_G_options_quoted || { + # As we (func_options) are top-level options-parser function and + # nobody quoted "$@" for us yet, we need to do it explicitly for + # caller. + func_quote eval ${1+"$@"} + func_options_result=$func_quote_result + } +} + + +# func_options_prep [ARG]... +# -------------------------- +# All initialisations required before starting the option parse loop. +# Note that when calling hook functions, we pass through the list of +# positional parameters. If a hook function modifies that list, and +# needs to propagate that back to rest of this script, then the complete +# modified list must be put in 'func_run_hooks_result' before returning. +func_hookable func_options_prep +func_options_prep () +{ + $debug_cmd + + # Option defaults: + opt_verbose=false + opt_warning_types= + + func_run_hooks func_options_prep ${1+"$@"} + func_propagate_result func_run_hooks func_options_prep +} + + +# func_parse_options [ARG]... +# --------------------------- +# The main option parsing loop. +func_hookable func_parse_options +func_parse_options () +{ + $debug_cmd + + _G_parse_options_requote=false + # this just eases exit handling + while test $# -gt 0; do + # Defer to hook functions for initial option parsing, so they + # get priority in the event of reusing an option name. + func_run_hooks func_parse_options ${1+"$@"} + func_propagate_result func_run_hooks func_parse_options + if $func_propagate_result_result; then + eval set dummy "$func_parse_options_result"; shift + # Even though we may have changed "$@", we passed the "$@" array + # down into the hook and it quoted it for us (because we are in + # this if-branch). No need to quote it again. + _G_parse_options_requote=false + fi + + # Break out of the loop if we already parsed every option. + test $# -gt 0 || break + + # We expect that one of the options parsed in this function matches + # and thus we remove _G_opt from "$@" and need to re-quote. + _G_match_parse_options=: + _G_opt=$1 + shift + case $_G_opt in + --debug|-x) debug_cmd='set -x' + func_echo "enabling shell trace mode" >&2 + $debug_cmd + ;; + + --no-warnings|--no-warning|--no-warn) + set dummy --warnings none ${1+"$@"} + shift + ;; + + --warnings|--warning|-W) + if test $# = 0 && func_missing_arg $_G_opt; then + _G_parse_options_requote=: + break + fi + case " $warning_categories $1" in + *" $1 "*) + # trailing space prevents matching last $1 above + func_append_uniq opt_warning_types " $1" + ;; + *all) + opt_warning_types=$warning_categories + ;; + *none) + opt_warning_types=none + warning_func=: + ;; + *error) + opt_warning_types=$warning_categories + warning_func=func_fatal_error + ;; + *) + func_fatal_error \ + "unsupported warning category: '$1'" + ;; + esac + shift + ;; + + --verbose|-v) opt_verbose=: ;; + --version) func_version ;; + -\?|-h) func_usage ;; + --help) func_help ;; + + # Separate optargs to long options (plugins may need this): + --*=*) func_split_equals "$_G_opt" + set dummy "$func_split_equals_lhs" \ + "$func_split_equals_rhs" ${1+"$@"} + shift + ;; + + # Separate optargs to short options: + -W*) + func_split_short_opt "$_G_opt" + set dummy "$func_split_short_opt_name" \ + "$func_split_short_opt_arg" ${1+"$@"} + shift + ;; + + # Separate non-argument short options: + -\?*|-h*|-v*|-x*) + func_split_short_opt "$_G_opt" + set dummy "$func_split_short_opt_name" \ + "-$func_split_short_opt_arg" ${1+"$@"} + shift + ;; + + --) _G_parse_options_requote=: ; break ;; + -*) func_fatal_help "unrecognised option: '$_G_opt'" ;; + *) set dummy "$_G_opt" ${1+"$@"}; shift + _G_match_parse_options=false + break + ;; + esac + + if $_G_match_parse_options; then + _G_parse_options_requote=: + fi + done + + if $_G_parse_options_requote; then + # save modified positional parameters for caller + func_quote eval ${1+"$@"} + func_parse_options_result=$func_quote_result + fi +} + + +# func_validate_options [ARG]... +# ------------------------------ +# Perform any sanity checks on option settings and/or unconsumed +# arguments. +func_hookable func_validate_options +func_validate_options () +{ + $debug_cmd + + # Display all warnings if -W was not given. + test -n "$opt_warning_types" || opt_warning_types=" $warning_categories" + + func_run_hooks func_validate_options ${1+"$@"} + func_propagate_result func_run_hooks func_validate_options + + # Bail if the options were screwed! + $exit_cmd $EXIT_FAILURE +} + + + +## ----------------- ## +## Helper functions. ## +## ----------------- ## + +# This section contains the helper functions used by the rest of the +# hookable option parser framework in ascii-betical order. + + +# func_fatal_help ARG... +# ---------------------- +# Echo program name prefixed message to standard error, followed by +# a help hint, and exit. +func_fatal_help () +{ + $debug_cmd + + eval \$ECHO \""Usage: $usage"\" + eval \$ECHO \""$fatal_help"\" + func_error ${1+"$@"} + exit $EXIT_FAILURE +} + + +# func_help +# --------- +# Echo long help message to standard output and exit. +func_help () +{ + $debug_cmd + + func_usage_message + $ECHO "$long_help_message" + exit 0 +} + + +# func_missing_arg ARGNAME +# ------------------------ +# Echo program name prefixed message to standard error and set global +# exit_cmd. +func_missing_arg () +{ + $debug_cmd + + func_error "Missing argument for '$1'." + exit_cmd=exit +} + + +# func_split_equals STRING +# ------------------------ +# Set func_split_equals_lhs and func_split_equals_rhs shell variables +# after splitting STRING at the '=' sign. +test -z "$_G_HAVE_XSI_OPS" \ + && (eval 'x=a/b/c; + test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ + && _G_HAVE_XSI_OPS=yes + +if test yes = "$_G_HAVE_XSI_OPS" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_split_equals () + { + $debug_cmd + + func_split_equals_lhs=${1%%=*} + func_split_equals_rhs=${1#*=} + if test "x$func_split_equals_lhs" = "x$1"; then + func_split_equals_rhs= + fi + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_split_equals () + { + $debug_cmd + + func_split_equals_lhs=`expr "x$1" : 'x\([^=]*\)'` + func_split_equals_rhs= + test "x$func_split_equals_lhs=" = "x$1" \ + || func_split_equals_rhs=`expr "x$1" : 'x[^=]*=\(.*\)$'` + } +fi #func_split_equals + + +# func_split_short_opt SHORTOPT +# ----------------------------- +# Set func_split_short_opt_name and func_split_short_opt_arg shell +# variables after splitting SHORTOPT after the 2nd character. +if test yes = "$_G_HAVE_XSI_OPS" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_split_short_opt () + { + $debug_cmd + + func_split_short_opt_arg=${1#??} + func_split_short_opt_name=${1%"$func_split_short_opt_arg"} + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_split_short_opt () + { + $debug_cmd + + func_split_short_opt_name=`expr "x$1" : 'x\(-.\)'` + func_split_short_opt_arg=`expr "x$1" : 'x-.\(.*\)$'` + } +fi #func_split_short_opt + + +# func_usage +# ---------- +# Echo short help message to standard output and exit. +func_usage () +{ + $debug_cmd + + func_usage_message + $ECHO "Run '$progname --help |${PAGER-more}' for full usage" + exit 0 +} + + +# func_usage_message +# ------------------ +# Echo short help message to standard output. +func_usage_message () +{ + $debug_cmd + + eval \$ECHO \""Usage: $usage"\" + echo + $SED -n 's|^# || + /^Written by/{ + x;p;x + } + h + /^Written by/q' < "$progpath" + echo + eval \$ECHO \""$usage_message"\" +} + + +# func_version +# ------------ +# Echo version message to standard output and exit. +# The version message is extracted from the calling file's header +# comments, with leading '# ' stripped: +# 1. First display the progname and version +# 2. Followed by the header comment line matching /^# Written by / +# 3. Then a blank line followed by the first following line matching +# /^# Copyright / +# 4. Immediately followed by any lines between the previous matches, +# except lines preceding the intervening completely blank line. +# For example, see the header comments of this file. +func_version () +{ + $debug_cmd + + printf '%s\n' "$progname $scriptversion" + $SED -n ' + /^# Written by /!b + s|^# ||; p; n + + :fwd2blnk + /./ { + n + b fwd2blnk + } + p; n + + :holdwrnt + s|^# || + s|^# *$|| + /^Copyright /!{ + /./H + n + b holdwrnt + } + + s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2| + G + s|\(\n\)\n*|\1|g + p; q' < "$progpath" + + exit $? +} + + +# Local variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-pattern: "30/scriptversion=%:y-%02m-%02d.%02H; # UTC" +# time-stamp-time-zone: "UTC" +# End: + +# Set a version string. +scriptversion='(GNU libtool) 2.5.4' + +# func_version +# ------------ +# Echo version message to standard output and exit. +func_version () +{ + $debug_cmd + + year=`date +%Y` + + cat < +This is free software: you are free to change and redistribute it. +There is NO WARRANTY, to the extent permitted by law. + +Originally written by Gordon Matzigkeit, 1996 +(See AUTHORS for complete contributor listing) +EOF + + exit $? +} + + +# func_echo ARG... +# ---------------- +# Libtool also displays the current mode in messages, so override +# funclib.sh func_echo with this custom definition. +func_echo () +{ + $debug_cmd + + _G_message=$* + + func_echo_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_IFS + $ECHO "$progname${opt_mode+: $opt_mode}: $_G_line" + done + IFS=$func_echo_IFS +} + + +## ---------------- ## +## Options parsing. ## +## ---------------- ## + +# Hook in the functions to make sure our own options are parsed during +# the option parsing loop. + +usage='$progpath [OPTION]... [MODE-ARG]...' + +# Short help message in response to '-h'. +usage_message="Options: + --config show all configuration variables + --debug enable verbose shell tracing + -n, --dry-run display commands without modifying any files + --features display basic configuration information + --finish use operation '--mode=finish' + --mode=MODE use operation mode MODE + --no-finish don't update shared library cache + --no-quiet, --no-silent print default informational messages + --no-warnings equivalent to '-Wnone' + --preserve-dup-deps don't remove duplicate dependency libraries + --quiet, --silent don't print informational messages + --reorder-cache=DIRS reorder shared library cache for preferred DIRS + --tag=TAG use configuration variables from tag TAG + -v, --verbose print more informational messages than default + --version print version information + -W, --warnings=CATEGORY report the warnings falling in CATEGORY [all] + -h, --help, --help-all print short, long, or detailed help message +" + +# Additional text appended to 'usage_message' in response to '--help'. +func_help () +{ + $debug_cmd + + func_usage_message + $ECHO "$long_help_message + +MODE must be one of the following: + + clean remove files from the build directory + compile compile a source file into a libtool object + execute automatically set library path, then run a program + finish complete the installation of libtool libraries + install install libraries or executables + link create a library or an executable + uninstall remove libraries from an installed directory + +MODE-ARGS vary depending on the MODE. When passed as first option, +'--mode=MODE' may be abbreviated as 'MODE' or a unique abbreviation of that. +Try '$progname --help --mode=MODE' for a more detailed description of MODE. + +When reporting a bug, please describe a test case to reproduce it and +include the following information: + + host-triplet: $host + shell: $SHELL + compiler: $LTCC + compiler flags: $LTCFLAGS + linker: $LD (gnu? $with_gnu_ld) + version: $progname $scriptversion + automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q` + autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q` + +Report bugs to . +GNU libtool home page: . +General help using GNU software: ." + exit 0 +} + + +# func_lo2o OBJECT-NAME +# --------------------- +# Transform OBJECT-NAME from a '.lo' suffix to the platform specific +# object suffix. + +lo2o=s/\\.lo\$/.$objext/ +o2lo=s/\\.$objext\$/.lo/ + +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_lo2o () + { + case $1 in + *.lo) func_lo2o_result=${1%.lo}.$objext ;; + * ) func_lo2o_result=$1 ;; + esac + }' + + # func_xform LIBOBJ-OR-SOURCE + # --------------------------- + # Transform LIBOBJ-OR-SOURCE from a '.o' or '.c' (or otherwise) + # suffix to a '.lo' libtool-object suffix. + eval 'func_xform () + { + func_xform_result=${1%.*}.lo + }' +else + # ...otherwise fall back to using sed. + func_lo2o () + { + func_lo2o_result=`$ECHO "$1" | $SED "$lo2o"` + } + + func_xform () + { + func_xform_result=`$ECHO "$1" | $SED 's|\.[^.]*$|.lo|'` + } +fi + + +# func_fatal_configuration ARG... +# ------------------------------- +# Echo program name prefixed message to standard error, followed by +# a configuration failure hint, and exit. +func_fatal_configuration () +{ + func_fatal_error ${1+"$@"} \ + "See the $PACKAGE documentation for more information." \ + "Fatal configuration error." +} + + +# func_config +# ----------- +# Display the configuration for all the tags in this script. +func_config () +{ + re_begincf='^# ### BEGIN LIBTOOL' + re_endcf='^# ### END LIBTOOL' + + # Default configuration. + $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" + + # Now print the configurations for the tags. + for tagname in $taglist; do + $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" + done + + exit $? +} + + +# func_features +# ------------- +# Display the features supported by this script. +func_features () +{ + echo "host: $host" + if test yes = "$build_libtool_libs"; then + echo "enable shared libraries" + else + echo "disable shared libraries" + fi + if test yes = "$build_old_libs"; then + echo "enable static libraries" + else + echo "disable static libraries" + fi + + exit $? +} + + +# func_enable_tag TAGNAME +# ----------------------- +# Verify that TAGNAME is valid, and either flag an error and exit, or +# enable the TAGNAME tag. We also add TAGNAME to the global $taglist +# variable here. +func_enable_tag () +{ + # Global variable: + tagname=$1 + + re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" + re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" + sed_extractcf=/$re_begincf/,/$re_endcf/p + + # Validate tagname. + case $tagname in + *[!-_A-Za-z0-9,/]*) + func_fatal_error "invalid tag name: $tagname" + ;; + esac + + # Don't test for the "default" C tag, as we know it's + # there but not specially marked. + case $tagname in + CC) ;; + *) + if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then + taglist="$taglist $tagname" + + # Evaluate the configuration. Be careful to quote the path + # and the sed script, to avoid splitting on whitespace, but + # also don't use non-portable quotes within backquotes within + # quotes we have to do it in 2 steps: + extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` + eval "$extractedcf" + else + func_error "ignoring unknown tag $tagname" + fi + ;; + esac +} + + +# func_check_version_match +# ------------------------ +# Ensure that we are using m4 macros, and libtool script from the same +# release of libtool. +func_check_version_match () +{ + if test "$package_revision" != "$macro_revision"; then + if test "$VERSION" != "$macro_version"; then + if test -z "$macro_version"; then + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from an older release. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from $PACKAGE $macro_version. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + fi + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, +$progname: but the definition of this LT_INIT comes from revision $macro_revision. +$progname: You should recreate aclocal.m4 with macros from revision $package_revision +$progname: of $PACKAGE $VERSION and run autoconf again. +_LT_EOF + fi + + exit $EXIT_MISMATCH + fi +} + + +# libtool_options_prep [ARG]... +# ----------------------------- +# Preparation for options parsed by libtool. +libtool_options_prep () +{ + $debug_mode + + # Option defaults: + opt_config=false + opt_dlopen= + opt_dry_run=false + opt_help=false + opt_mode= + opt_reorder_cache=false + opt_preserve_dup_deps=false + opt_quiet=false + opt_finishing=true + opt_warning= + + nonopt= + preserve_args= + + _G_rc_lt_options_prep=: + + # Shorthand for --mode=foo, only valid as the first argument + case $1 in + clean|clea|cle|cl) + shift; set dummy --mode clean ${1+"$@"}; shift + ;; + compile|compil|compi|comp|com|co|c) + shift; set dummy --mode compile ${1+"$@"}; shift + ;; + execute|execut|execu|exec|exe|ex|e) + shift; set dummy --mode execute ${1+"$@"}; shift + ;; + finish|finis|fini|fin|fi|f) + shift; set dummy --mode finish ${1+"$@"}; shift + ;; + install|instal|insta|inst|ins|in|i) + shift; set dummy --mode install ${1+"$@"}; shift + ;; + link|lin|li|l) + shift; set dummy --mode link ${1+"$@"}; shift + ;; + uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) + shift; set dummy --mode uninstall ${1+"$@"}; shift + ;; + *) + _G_rc_lt_options_prep=false + ;; + esac + + if $_G_rc_lt_options_prep; then + # Pass back the list of options. + func_quote eval ${1+"$@"} + libtool_options_prep_result=$func_quote_result + fi +} +func_add_hook func_options_prep libtool_options_prep + + +# libtool_parse_options [ARG]... +# --------------------------------- +# Provide handling for libtool specific options. +libtool_parse_options () +{ + $debug_cmd + + _G_rc_lt_parse_options=false + + # Perform our own loop to consume as many options as possible in + # each iteration. + while test $# -gt 0; do + _G_match_lt_parse_options=: + _G_opt=$1 + shift + case $_G_opt in + --dry-run|--dryrun|-n) + opt_dry_run=: + ;; + + --config) func_config ;; + + --dlopen|-dlopen) + opt_dlopen="${opt_dlopen+$opt_dlopen +}$1" + shift + ;; + + --preserve-dup-deps) + opt_preserve_dup_deps=: ;; + + --features) func_features ;; + + --finish) set dummy --mode finish ${1+"$@"}; shift ;; + + --help) opt_help=: ;; + + --help-all) opt_help=': help-all' ;; + + --mode) test $# = 0 && func_missing_arg $_G_opt && break + opt_mode=$1 + case $1 in + # Valid mode arguments: + clean|compile|execute|finish|install|link|relink|uninstall) ;; + + # Catch anything else as an error + *) func_error "invalid argument '$1' for $_G_opt" + exit_cmd=exit + ;; + esac + shift + ;; + + --no-finish) + opt_finishing=false + func_append preserve_args " $_G_opt" + ;; + + --no-silent|--no-quiet) + opt_quiet=false + func_append preserve_args " $_G_opt" + ;; + + --no-warnings|--no-warning|--no-warn) + opt_warning=false + func_append preserve_args " $_G_opt" + ;; + + --no-verbose) + opt_verbose=false + func_append preserve_args " $_G_opt" + ;; + + --reorder-cache) + opt_reorder_cache=true + shared_lib_dirs=$1 + if test -n "$shared_lib_dirs"; then + case $1 in + # Must begin with /: + /*) ;; + + # Catch anything else as an error (relative paths) + *) func_error "invalid argument '$1' for $_G_opt" + func_error "absolute paths are required for $_G_opt" + exit_cmd=exit + ;; + esac + fi + shift + ;; + + --silent|--quiet) + opt_quiet=: + opt_verbose=false + func_append preserve_args " $_G_opt" + ;; + + --tag) test $# = 0 && func_missing_arg $_G_opt && break + opt_tag=$1 + func_append preserve_args " $_G_opt $1" + func_enable_tag "$1" + shift + ;; + + --verbose|-v) opt_quiet=false + opt_verbose=: + func_append preserve_args " $_G_opt" + ;; + + # An option not handled by this hook function: + *) set dummy "$_G_opt" ${1+"$@"} ; shift + _G_match_lt_parse_options=false + break + ;; + esac + $_G_match_lt_parse_options && _G_rc_lt_parse_options=: + done + + if $_G_rc_lt_parse_options; then + # save modified positional parameters for caller + func_quote eval ${1+"$@"} + libtool_parse_options_result=$func_quote_result + fi +} +func_add_hook func_parse_options libtool_parse_options + + +# func_warning ARG... +# ------------------- +# Libtool warnings are not categorized, so override funclib.sh +# func_warning with this simpler definition. +func_warning () +{ + if $opt_warning; then + $debug_cmd + $warning_func ${1+"$@"} + fi +} + + +# libtool_validate_options [ARG]... +# --------------------------------- +# Perform any sanity checks on option settings and/or unconsumed +# arguments. +libtool_validate_options () +{ + # save first non-option argument + if test 0 -lt $#; then + nonopt=$1 + shift + fi + + # preserve --debug + test : = "$debug_cmd" || func_append preserve_args " --debug" + + # Keeping compiler generated duplicates in $postdeps and $predeps is not + # harmful, and is necessary in a majority of systems that use it to satisfy + # symbol dependencies. + opt_duplicate_compiler_generated_deps=: + + $opt_help || { + # Sanity checks first: + func_check_version_match + + test yes != "$build_libtool_libs" \ + && test yes != "$build_old_libs" \ + && func_fatal_configuration "not configured to build any kind of library" + + # Darwin sucks + eval std_shrext=\"$shrext_cmds\" + + # Only execute mode is allowed to have -dlopen flags. + if test -n "$opt_dlopen" && test execute != "$opt_mode"; then + func_error "unrecognized option '-dlopen'" + $ECHO "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Change the help message to a mode-specific one. + generic_help=$help + help="Try '$progname --help --mode=$opt_mode' for more information." + } + + # Pass back the unparsed argument list + func_quote eval ${1+"$@"} + libtool_validate_options_result=$func_quote_result +} +func_add_hook func_validate_options libtool_validate_options + + +# Process options as early as possible so that --help and --version +# can return quickly. +func_options ${1+"$@"} +eval set dummy "$func_options_result"; shift + + + +## ----------- ## +## Main. ## +## ----------- ## + +magic='%%%MAGIC variable%%%' +magic_exe='%%%MAGIC EXE variable%%%' + +# Global variables. +extracted_archives= +extracted_serial=0 + +# If this variable is set in any of the actions, the command in it +# will be execed at the end. This prevents here-documents from being +# left over by shells. +exec_cmd= + + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' +} + +# func_generated_by_libtool +# True iff stdin has been generated by Libtool. This function is only +# a basic sanity check; it will hardly flush out determined imposters. +func_generated_by_libtool_p () +{ + $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 +} + +# func_lalib_p file +# True iff FILE is a libtool '.la' library or '.lo' object file. +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_lalib_p () +{ + test -f "$1" && + $SED -e 4q "$1" 2>/dev/null | func_generated_by_libtool_p +} + +# func_lalib_unsafe_p file +# True iff FILE is a libtool '.la' library or '.lo' object file. +# This function implements the same check as func_lalib_p without +# resorting to external programs. To this end, it redirects stdin and +# closes it afterwards, without saving the original file descriptor. +# As a safety measure, use it only where a negative result would be +# fatal anyway. Works if 'file' does not exist. +func_lalib_unsafe_p () +{ + lalib_p=no + if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then + for lalib_p_l in 1 2 3 4 + do + read lalib_p_line + case $lalib_p_line in + \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; + esac + done + exec 0<&5 5<&- + fi + test yes = "$lalib_p" +} + +# func_ltwrapper_script_p file +# True iff FILE is a libtool wrapper script +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_script_p () +{ + test -f "$1" && + $lt_truncate_bin < "$1" 2>/dev/null | func_generated_by_libtool_p +} + +# func_ltwrapper_executable_p file +# True iff FILE is a libtool wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_executable_p () +{ + func_ltwrapper_exec_suffix= + case $1 in + *.exe) ;; + *) func_ltwrapper_exec_suffix=.exe ;; + esac + $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 +} + +# func_ltwrapper_scriptname file +# Assumes file is an ltwrapper_executable +# uses $file to determine the appropriate filename for a +# temporary ltwrapper_script. +func_ltwrapper_scriptname () +{ + func_dirname_and_basename "$1" "" "." + func_stripname '' '.exe' "$func_basename_result" + func_ltwrapper_scriptname_result=$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper +} + +# func_ltwrapper_p file +# True iff FILE is a libtool wrapper script or wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_p () +{ + func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" +} + + +# func_execute_cmds commands fail_cmd +# Execute tilde-delimited COMMANDS. +# If FAIL_CMD is given, eval that upon failure. +# FAIL_CMD may read-access the current command in variable CMD! +func_execute_cmds () +{ + $debug_cmd + + save_ifs=$IFS; IFS='~' + for cmd in $1; do + IFS=$sp$nl + eval cmd=\"$cmd\" + IFS=$save_ifs + func_show_eval "$cmd" "${2-:}" + done + IFS=$save_ifs +} + + +# func_source file +# Source FILE, adding directory component if necessary. +# Note that it is not necessary on cygwin/mingw to append a dot to +# FILE even if both FILE and FILE.exe exist: automatic-append-.exe +# behavior happens only for exec(3), not for open(2)! Also, sourcing +# 'FILE.' does not work on cygwin managed mounts. +func_source () +{ + $debug_cmd + + case $1 in + */* | *\\*) . "$1" ;; + *) . "./$1" ;; + esac +} + + +# func_resolve_sysroot PATH +# Replace a leading = in PATH with a sysroot. Store the result into +# func_resolve_sysroot_result +func_resolve_sysroot () +{ + func_resolve_sysroot_result=$1 + case $func_resolve_sysroot_result in + =*) + func_stripname '=' '' "$func_resolve_sysroot_result" + func_resolve_sysroot_result=$lt_sysroot$func_stripname_result + ;; + esac +} + +# func_replace_sysroot PATH +# If PATH begins with the sysroot, replace it with = and +# store the result into func_replace_sysroot_result. +func_replace_sysroot () +{ + case $lt_sysroot:$1 in + ?*:"$lt_sysroot"*) + func_stripname "$lt_sysroot" '' "$1" + func_replace_sysroot_result='='$func_stripname_result + ;; + *) + # Including no sysroot. + func_replace_sysroot_result=$1 + ;; + esac +} + +# func_infer_tag arg +# Infer tagged configuration to use if any are available and +# if one wasn't chosen via the "--tag" command line option. +# Only attempt this if the compiler in the base compile +# command doesn't match the default compiler. +# arg is usually of the form 'gcc ...' +func_infer_tag () +{ + $debug_cmd + + if test -n "$available_tags" && test -z "$tagname"; then + CC_quoted= + for arg in $CC; do + func_append_quoted CC_quoted "$arg" + done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` + case $@ in + # Blanks in the command may have been stripped by the calling shell, + # but not from the CC environment variable when configure was run. + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; + # Blanks at the start of $base_compile will cause this to fail + # if we don't check for them as well. + *) + for z in $available_tags; do + if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then + # Evaluate the configuration. + eval "`$SED -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" + CC_quoted= + for arg in $CC; do + # Double-quote args containing other shell metacharacters. + func_append_quoted CC_quoted "$arg" + done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` + case "$@ " in + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) + # The compiler in the base compile command matches + # the one in the tagged configuration. + # Assume this is the tagged configuration we want. + tagname=$z + break + ;; + esac + fi + done + # If $tagname still isn't set, then no tagged configuration + # was found and let the user know that the "--tag" command + # line option must be used. + if test -z "$tagname"; then + func_echo "unable to infer tagged configuration" + func_fatal_error "specify a tag with '--tag'" +# else +# func_verbose "using $tagname tagged configuration" + fi + ;; + esac + fi +} + + + +# func_write_libtool_object output_name pic_name nonpic_name +# Create a libtool object file (analogous to a ".la" file), +# but don't create it if we're doing a dry run. +func_write_libtool_object () +{ + write_libobj=$1 + if test yes = "$build_libtool_libs"; then + write_lobj=\'$2\' + else + write_lobj=none + fi + + if test yes = "$build_old_libs"; then + write_oldobj=\'$3\' + else + write_oldobj=none + fi + + $opt_dry_run || { + cat >${write_libobj}T </dev/null` + if test "$?" -eq 0 && test -n "$func_convert_core_file_wine_to_w32_tmp"; then + func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | + $SED -e "$sed_naive_backslashify"` + else + func_convert_core_file_wine_to_w32_result= + fi + fi +} +# end: func_convert_core_file_wine_to_w32 + + +# func_convert_core_path_wine_to_w32 ARG +# Helper function used by path conversion functions when $build is *nix, and +# $host is mingw, windows, cygwin, or some other w32 environment. Relies on a +# correctly configured wine environment available, with the winepath program +# in $build's $PATH. Assumes ARG has no leading or trailing path separator +# characters. +# +# ARG is path to be converted from $build format to win32. +# Result is available in $func_convert_core_path_wine_to_w32_result. +# Unconvertible file (directory) names in ARG are skipped; if no directory names +# are convertible, then the result may be empty. +func_convert_core_path_wine_to_w32 () +{ + $debug_cmd + + # unfortunately, winepath doesn't convert paths, only file names + func_convert_core_path_wine_to_w32_result= + if test -n "$1"; then + oldIFS=$IFS + IFS=: + for func_convert_core_path_wine_to_w32_f in $1; do + IFS=$oldIFS + func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" + if test -n "$func_convert_core_file_wine_to_w32_result"; then + if test -z "$func_convert_core_path_wine_to_w32_result"; then + func_convert_core_path_wine_to_w32_result=$func_convert_core_file_wine_to_w32_result + else + func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" + fi + fi + done + IFS=$oldIFS + fi +} +# end: func_convert_core_path_wine_to_w32 + + +# func_cygpath ARGS... +# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when +# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) +# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or +# (2), returns the Cygwin file name or path in func_cygpath_result (input +# file name or path is assumed to be in w32 format, as previously converted +# from $build's *nix or MSYS format). In case (3), returns the w32 file name +# or path in func_cygpath_result (input file name or path is assumed to be in +# Cygwin format). Returns an empty string on error. +# +# ARGS are passed to cygpath, with the last one being the file name or path to +# be converted. +# +# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH +# environment variable; do not put it in $PATH. +func_cygpath () +{ + $debug_cmd + + if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then + func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` + if test "$?" -ne 0; then + # on failure, ensure result is empty + func_cygpath_result= + fi + else + func_cygpath_result= + func_error "LT_CYGPATH is empty or specifies non-existent file: '$LT_CYGPATH'" + fi +} +#end: func_cygpath + + +# func_convert_core_msys_to_w32 ARG +# Convert file name or path ARG from MSYS format to w32 format. Return +# result in func_convert_core_msys_to_w32_result. +func_convert_core_msys_to_w32 () +{ + $debug_cmd + + # awkward: cmd appends spaces to result + func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | + $SED -e 's/[ ]*$//' -e "$sed_naive_backslashify"` +} +#end: func_convert_core_msys_to_w32 + + +# func_convert_file_check ARG1 ARG2 +# Verify that ARG1 (a file name in $build format) was converted to $host +# format in ARG2. Otherwise, emit an error message, but continue (resetting +# func_to_host_file_result to ARG1). +func_convert_file_check () +{ + $debug_cmd + + if test -z "$2" && test -n "$1"; then + func_error "Could not determine host file name corresponding to" + func_error " '$1'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback: + func_to_host_file_result=$1 + fi +} +# end func_convert_file_check + + +# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH +# Verify that FROM_PATH (a path in $build format) was converted to $host +# format in TO_PATH. Otherwise, emit an error message, but continue, resetting +# func_to_host_file_result to a simplistic fallback value (see below). +func_convert_path_check () +{ + $debug_cmd + + if test -z "$4" && test -n "$3"; then + func_error "Could not determine the host path corresponding to" + func_error " '$3'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback. This is a deliberately simplistic "conversion" and + # should not be "improved". See libtool.info. + if test "x$1" != "x$2"; then + lt_replace_pathsep_chars="s|$1|$2|g" + func_to_host_path_result=`echo "$3" | + $SED -e "$lt_replace_pathsep_chars"` + else + func_to_host_path_result=$3 + fi + fi +} +# end func_convert_path_check + + +# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG +# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT +# and appending REPL if ORIG matches BACKPAT. +func_convert_path_front_back_pathsep () +{ + $debug_cmd + + case $4 in + $1 ) func_to_host_path_result=$3$func_to_host_path_result + ;; + esac + case $4 in + $2 ) func_append func_to_host_path_result "$3" + ;; + esac +} +# end func_convert_path_front_back_pathsep + + +# func_convert_delimited_path PATH ORIG_DELIMITER NEW_DELIMITER +# Replaces a delimiter for a given path. +func_convert_delimited_path () +{ + converted_path=`$ECHO "$1" | $SED "s#$2#$3#g"` +} +# end func_convert_delimited_path + + +################################################## +# $build to $host FILE NAME CONVERSION FUNCTIONS # +################################################## +# invoked via '$to_host_file_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# Result will be available in $func_to_host_file_result. + + +# func_to_host_file ARG +# Converts the file name ARG from $build format to $host format. Return result +# in func_to_host_file_result. +func_to_host_file () +{ + $debug_cmd + + $to_host_file_cmd "$1" +} +# end func_to_host_file + + +# func_to_tool_file ARG LAZY +# converts the file name ARG from $build format to toolchain format. Return +# result in func_to_tool_file_result. If the conversion in use is listed +# in (the comma separated) LAZY, no conversion takes place. +func_to_tool_file () +{ + $debug_cmd + + case ,$2, in + *,"$to_tool_file_cmd",*) + func_to_tool_file_result=$1 + ;; + *) + $to_tool_file_cmd "$1" + func_to_tool_file_result=$func_to_host_file_result + ;; + esac +} +# end func_to_tool_file + + +# func_convert_file_noop ARG +# Copy ARG to func_to_host_file_result. +func_convert_file_noop () +{ + func_to_host_file_result=$1 +} +# end func_convert_file_noop + + +# func_convert_file_msys_to_w32 ARG +# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_file_result. +func_convert_file_msys_to_w32 () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_to_host_file_result=$func_convert_core_msys_to_w32_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_w32 + + +# func_convert_file_cygwin_to_w32 ARG +# Convert file name ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_file_cygwin_to_w32 () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + # because $build is cygwin, we call "the" cygpath in $PATH; no need to use + # LT_CYGPATH in this case. + func_to_host_file_result=`cygpath -m "$1"` + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_cygwin_to_w32 + + +# func_convert_file_nix_to_w32 ARG +# Convert file name ARG from *nix to w32 format. Requires a wine environment +# and a working winepath. Returns result in func_to_host_file_result. +func_convert_file_nix_to_w32 () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + func_convert_core_file_wine_to_w32 "$1" + func_to_host_file_result=$func_convert_core_file_wine_to_w32_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_w32 + + +# func_convert_file_msys_to_cygwin ARG +# Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_file_msys_to_cygwin () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_cygpath -u "$func_convert_core_msys_to_w32_result" + func_to_host_file_result=$func_cygpath_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_cygwin + + +# func_convert_file_nix_to_cygwin ARG +# Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed +# in a wine environment, working winepath, and LT_CYGPATH set. Returns result +# in func_to_host_file_result. +func_convert_file_nix_to_cygwin () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. + func_convert_core_file_wine_to_w32 "$1" + func_cygpath -u "$func_convert_core_file_wine_to_w32_result" + func_to_host_file_result=$func_cygpath_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_cygwin + + +############################################# +# $build to $host PATH CONVERSION FUNCTIONS # +############################################# +# invoked via '$to_host_path_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# The result will be available in $func_to_host_path_result. +# +# Path separators are also converted from $build format to $host format. If +# ARG begins or ends with a path separator character, it is preserved (but +# converted to $host format) on output. +# +# All path conversion functions are named using the following convention: +# file name conversion function : func_convert_file_X_to_Y () +# path conversion function : func_convert_path_X_to_Y () +# where, for any given $build/$host combination the 'X_to_Y' value is the +# same. If conversion functions are added for new $build/$host combinations, +# the two new functions must follow this pattern, or func_init_to_host_path_cmd +# will break. + + +# func_init_to_host_path_cmd +# Ensures that function "pointer" variable $to_host_path_cmd is set to the +# appropriate value, based on the value of $to_host_file_cmd. +to_host_path_cmd= +func_init_to_host_path_cmd () +{ + $debug_cmd + + if test -z "$to_host_path_cmd"; then + func_stripname 'func_convert_file_' '' "$to_host_file_cmd" + to_host_path_cmd=func_convert_path_$func_stripname_result + fi +} + + +# func_to_host_path ARG +# Converts the path ARG from $build format to $host format. Return result +# in func_to_host_path_result. +func_to_host_path () +{ + $debug_cmd + + func_init_to_host_path_cmd + $to_host_path_cmd "$1" +} +# end func_to_host_path + + +# func_convert_path_noop ARG +# Copy ARG to func_to_host_path_result. +func_convert_path_noop () +{ + func_to_host_path_result=$1 +} +# end func_convert_path_noop + + +# func_convert_path_msys_to_w32 ARG +# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_path_result. +func_convert_path_msys_to_w32 () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # Remove leading and trailing path separator characters from ARG. MSYS + # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; + # and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result=$func_convert_core_msys_to_w32_result + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_msys_to_w32 + + +# func_convert_path_cygwin_to_w32 ARG +# Convert path ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_path_cygwin_to_w32 () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_cygwin_to_w32 + + +# func_convert_path_nix_to_w32 ARG +# Convert path ARG from *nix to w32 format. Requires a wine environment and +# a working winepath. Returns result in func_to_host_file_result. +func_convert_path_nix_to_w32 () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result=$func_convert_core_path_wine_to_w32_result + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_nix_to_w32 + + +# func_convert_path_msys_to_cygwin ARG +# Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_path_msys_to_cygwin () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_msys_to_w32_result" + func_to_host_path_result=$func_cygpath_result + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_msys_to_cygwin + + +# func_convert_path_nix_to_cygwin ARG +# Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a +# a wine environment, working winepath, and LT_CYGPATH set. Returns result in +# func_to_host_file_result. +func_convert_path_nix_to_cygwin () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # Remove leading and trailing path separator characters from + # ARG. msys behavior is inconsistent here, cygpath turns them + # into '.;' and ';.', and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" + func_to_host_path_result=$func_cygpath_result + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_nix_to_cygwin + + +# func_dll_def_p FILE +# True iff FILE is a Windows DLL '.def' file. +# Keep in sync with _LT_DLL_DEF_P in libtool.m4 +func_dll_def_p () +{ + $debug_cmd + + func_dll_def_p_tmp=`$SED -n \ + -e 's/^[ ]*//' \ + -e '/^\(;.*\)*$/d' \ + -e 's/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p' \ + -e q \ + "$1"` + test DEF = "$func_dll_def_p_tmp" +} + + +# func_reorder_shared_lib_cache DIRS +# Reorder the shared library cache by unconfiguring previous shared library cache +# and configuring preferred search directories before previous search directories. +# Previous shared library cache: /usr/lib /usr/local/lib +# Preferred search directories: /tmp/testing +# Reordered shared library cache: /tmp/testing /usr/lib /usr/local/lib +func_reorder_shared_lib_cache () +{ + $debug_cmd + + case $host_os in + openbsd*) + get_search_directories=`PATH="$PATH:/sbin" ldconfig -r | $GREP "search directories" | $SED "s#.*search directories:\ ##g"` + func_convert_delimited_path "$get_search_directories" ':' '\ ' + save_search_directories=$converted_path + func_convert_delimited_path "$1" ':' '\ ' + + # Ensure directories exist + for dir in $converted_path; do + # Ensure each directory is an absolute path + case $dir in + /*) ;; + *) func_error "Directory '$dir' is not an absolute path" + exit $EXIT_FAILURE ;; + esac + # Ensure no trailing slashes + func_stripname '' '/' "$dir" + dir=$func_stripname_result + if test -d "$dir"; then + if test -n "$preferred_search_directories"; then + preferred_search_directories="$preferred_search_directories $dir" + else + preferred_search_directories=$dir + fi + else + func_error "Directory '$dir' does not exist" + exit $EXIT_FAILURE + fi + done + + PATH="$PATH:/sbin" ldconfig -U $save_search_directories + PATH="$PATH:/sbin" ldconfig -m $preferred_search_directories $save_search_directories + get_search_directories=`PATH="$PATH:/sbin" ldconfig -r | $GREP "search directories" | $SED "s#.*search directories:\ ##g"` + func_convert_delimited_path "$get_search_directories" ':' '\ ' + reordered_search_directories=$converted_path + + $ECHO "Original: $save_search_directories" + $ECHO "Reordered: $reordered_search_directories" + exit $EXIT_SUCCESS + ;; + *) + func_error "--reorder-cache is not supported for host_os=$host_os." + exit $EXIT_FAILURE + ;; + esac +} +# end func_reorder_shared_lib_cache + + +# func_mode_compile arg... +func_mode_compile () +{ + $debug_cmd + + # Get the compilation command and the source file. + base_compile= + srcfile=$nonopt # always keep a non-empty value in "srcfile" + suppress_opt=yes + suppress_output= + arg_mode=normal + libobj= + later= + pie_flag= + + for arg + do + case $arg_mode in + arg ) + # do not "continue". Instead, add this to base_compile + lastarg=$arg + arg_mode=normal + ;; + + target ) + libobj=$arg + arg_mode=normal + continue + ;; + + normal ) + # Accept any command-line options. + case $arg in + -o) + test -n "$libobj" && \ + func_fatal_error "you cannot specify '-o' more than once" + arg_mode=target + continue + ;; + + -pie | -fpie | -fPIE) + func_append pie_flag " $arg" + continue + ;; + + -shared | -static | -prefer-pic | -prefer-non-pic) + func_append later " $arg" + continue + ;; + + -no-suppress) + suppress_opt=no + continue + ;; + + -Xcompiler) + arg_mode=arg # the next one goes into the "base_compile" arg list + continue # The current "srcfile" will either be retained or + ;; # replaced later. I would guess that would be a bug. + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + lastarg= + save_ifs=$IFS; IFS=, + for arg in $args; do + IFS=$save_ifs + func_append_quoted lastarg "$arg" + done + IFS=$save_ifs + func_stripname ' ' '' "$lastarg" + lastarg=$func_stripname_result + + # Add the arguments to base_compile. + func_append base_compile " $lastarg" + continue + ;; + + *) + # Accept the current argument as the source file. + # The previous "srcfile" becomes the current argument. + # + lastarg=$srcfile + srcfile=$arg + ;; + esac # case $arg + ;; + esac # case $arg_mode + + # Aesthetically quote the previous argument. + func_append_quoted base_compile "$lastarg" + done # for arg + + case $arg_mode in + arg) + func_fatal_error "you must specify an argument for -Xcompile" + ;; + target) + func_fatal_error "you must specify a target with '-o'" + ;; + *) + # Get the name of the library object. + test -z "$libobj" && { + func_basename "$srcfile" + libobj=$func_basename_result + } + ;; + esac + + # Recognize several different file suffixes. + # If the user specifies -o file.o, it is replaced with file.lo + case $libobj in + *.[cCFSifmso] | \ + *.ada | *.adb | *.ads | *.asm | \ + *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ + *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) + func_xform "$libobj" + libobj=$func_xform_result + ;; + esac + + case $libobj in + *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; + *) + func_fatal_error "cannot determine name of library object from '$libobj'" + ;; + esac + + func_infer_tag $base_compile + + for arg in $later; do + case $arg in + -shared) + test yes = "$build_libtool_libs" \ + || func_fatal_configuration "cannot build a shared library" + build_old_libs=no + continue + ;; + + -static) + build_libtool_libs=no + build_old_libs=yes + continue + ;; + + -prefer-pic) + pic_mode=yes + continue + ;; + + -prefer-non-pic) + pic_mode=no + continue + ;; + esac + done + + func_quote_arg pretty "$libobj" + test "X$libobj" != "X$func_quote_arg_result" \ + && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ + && func_warning "libobj name '$libobj' may not contain shell special characters." + func_dirname_and_basename "$obj" "/" "" + objname=$func_basename_result + xdir=$func_dirname_result + lobj=$xdir$objdir/$objname + + test -z "$base_compile" && \ + func_fatal_help "you must specify a compilation command" + + # Delete any leftover library objects. + if test yes = "$build_old_libs"; then + removelist="$obj $lobj $libobj ${libobj}T" + else + removelist="$lobj $libobj ${libobj}T" + fi + + # On Cygwin there's no "real" PIC flag so we must build both object types + case $host_os in + cygwin* | mingw* | windows* | pw32* | os2* | cegcc*) + pic_mode=default + ;; + esac + if test no = "$pic_mode" && test pass_all != "$deplibs_check_method"; then + # non-PIC code in shared libraries is not supported + pic_mode=default + fi + + # Calculate the filename of the output object if compiler does + # not support -o with -c + if test no = "$compiler_c_o"; then + output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.$objext + lockfile=$output_obj.lock + else + output_obj= + need_locks=no + lockfile= + fi + + # Lock this critical section if it is needed + # We use this script file to make the link, it avoids creating a new file + if test yes = "$need_locks"; then + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + elif test warn = "$need_locks"; then + if test -f "$lockfile"; then + $ECHO "\ +*** ERROR, $lockfile exists and contains: +`cat $lockfile 2>/dev/null` + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support '-c' and '-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + func_append removelist " $output_obj" + $ECHO "$srcfile" > "$lockfile" + fi + + $opt_dry_run || $RM $removelist + func_append removelist " $lockfile" + trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 + + func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 + srcfile=$func_to_tool_file_result + func_quote_arg pretty "$srcfile" + qsrcfile=$func_quote_arg_result + + # Only build a PIC object if we are building libtool libraries. + if test yes = "$build_libtool_libs"; then + # Without this assignment, base_compile gets emptied. + fbsd_hideous_sh_bug=$base_compile + + if test no != "$pic_mode"; then + command="$base_compile $qsrcfile $pic_flag" + else + # Don't build PIC code + command="$base_compile $qsrcfile" + fi + + func_mkdir_p "$xdir$objdir" + + if test -z "$output_obj"; then + # Place PIC objects in $objdir + func_append command " -o $lobj" + fi + + func_show_eval_locale "$command" \ + 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' + + if test warn = "$need_locks" && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support '-c' and '-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed, then go on to compile the next one + if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then + func_show_eval '$MV "$output_obj" "$lobj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + + # Allow error messages only from the first compilation. + if test yes = "$suppress_opt"; then + suppress_output=' >/dev/null 2>&1' + fi + fi + + # Only build a position-dependent object if we build old libraries. + if test yes = "$build_old_libs"; then + if test yes != "$pic_mode"; then + # Don't build PIC code + command="$base_compile $qsrcfile$pie_flag" + else + command="$base_compile $qsrcfile $pic_flag" + fi + if test yes = "$compiler_c_o"; then + func_append command " -o $obj" + fi + + # Suppress compiler output if we already did a PIC compilation. + func_append command "$suppress_output" + func_show_eval_locale "$command" \ + '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' + + if test warn = "$need_locks" && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support '-c' and '-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed + if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then + func_show_eval '$MV "$output_obj" "$obj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + fi + + $opt_dry_run || { + func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" + + # Unlock the critical section if it was locked + if test no != "$need_locks"; then + removelist=$lockfile + $RM "$lockfile" + fi + } + + exit $EXIT_SUCCESS +} + +$opt_help || { + test compile = "$opt_mode" && func_mode_compile ${1+"$@"} +} + +func_mode_help () +{ + # We need to display help for each of the modes. + case $opt_mode in + "") + # Generic help is extracted from the usage comments + # at the start of this file. + func_help + ;; + + clean) + $ECHO \ +"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... + +Remove files from the build directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed +to RM. + +If FILE is a libtool library, object or program, all the files associated +with it are deleted. Otherwise, only FILE itself is deleted using RM." + ;; + + compile) + $ECHO \ +"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE + +Compile a source file into a libtool library object. + +This mode accepts the following additional options: + + -o OUTPUT-FILE set the output file name to OUTPUT-FILE + -no-suppress do not suppress compiler output for multiple passes + -prefer-pic try to build PIC objects only + -prefer-non-pic try to build non-PIC objects only + -shared do not build a '.o' file suitable for static linking + -static only build a '.o' file suitable for static linking + -Wc,FLAG + -Xcompiler FLAG pass FLAG directly to the compiler + +COMPILE-COMMAND is a command to be used in creating a 'standard' object file +from the given SOURCEFILE. + +The output file name is determined by removing the directory component from +SOURCEFILE, then substituting the C source code suffix '.c' with the +library object suffix, '.lo'." + ;; + + execute) + $ECHO \ +"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... + +Automatically set library path, then run a program. + +This mode accepts the following additional options: + + -dlopen FILE add the directory containing FILE to the library path + +This mode sets the library path environment variable according to '-dlopen' +flags. + +If any of the ARGS are libtool executable wrappers, then they are translated +into their corresponding uninstalled binary, and any of their required library +directories are added to the library path. + +Then, COMMAND is executed, with ARGS as arguments." + ;; + + finish) + $ECHO \ +"Usage: $progname [OPTION]... --mode=finish [LIBDIR]... + +Complete the installation of libtool libraries. + +Each LIBDIR is a directory that contains libtool libraries. + +The commands that this mode executes may require superuser privileges. Use +the '--dry-run' option if you just want to see what would be executed." + ;; + + install) + $ECHO \ +"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... + +Install executables or libraries. + +INSTALL-COMMAND is the installation command. The first component should be +either the 'install' or 'cp' program. + +The following components of INSTALL-COMMAND are treated specially: + + -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation + +The rest of the components are interpreted as arguments to that command (only +BSD-compatible install options are recognized)." + ;; + + link) + $ECHO \ +"Usage: $progname [OPTION]... --mode=link LINK-COMMAND... + +Link object files or libraries together to form another library, or to +create an executable program. + +LINK-COMMAND is a command using the C compiler that you would use to create +a program from several object files. + +The following components of LINK-COMMAND are treated specially: + + -all-static do not do any dynamic linking at all + -avoid-version do not add a version suffix if possible + -bindir BINDIR specify path to binaries directory (for systems where + libraries must be found in the PATH setting at runtime) + -dlopen FILE '-dlpreopen' FILE if it cannot be dlopened at runtime + -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols + -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) + -export-symbols SYMFILE + try to export only the symbols listed in SYMFILE + -export-symbols-regex REGEX + try to export only the symbols matching REGEX + -LLIBDIR search LIBDIR for required installed libraries + -lNAME OUTPUT-FILE requires the installed library libNAME + -module build a library that can dlopened + -no-fast-install disable the fast-install mode + -no-install link a not-installable executable + -no-undefined declare that a library does not refer to external symbols + -o OUTPUT-FILE create OUTPUT-FILE from the specified objects + -objectlist FILE use a list of object files found in FILE to specify objects + -os2dllname NAME force a short DLL name on OS/2 (no effect on other OSes) + -precious-files-regex REGEX + don't remove output files matching REGEX + -release RELEASE specify package release information + -rpath LIBDIR the created library will eventually be installed in LIBDIR + -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries + -shared only do dynamic linking of libtool libraries + -shrext SUFFIX override the standard shared library file extension + -static do not do any dynamic linking of uninstalled libtool libraries + -static-libtool-libs + do not do any dynamic linking of libtool libraries + -version-info CURRENT[:REVISION[:AGE]] + specify library version info [each variable defaults to 0] + -weak LIBNAME declare that the target provides the LIBNAME interface + -Wc,FLAG + -Xcompiler FLAG pass linker-specific FLAG directly to the compiler + -Wa,FLAG + -Xassembler FLAG pass linker-specific FLAG directly to the assembler + -Wl,FLAG + -Xlinker FLAG pass linker-specific FLAG directly to the linker + -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) + +All other options (arguments beginning with '-') are ignored. + +Every other argument is treated as a filename. Files ending in '.la' are +treated as uninstalled libtool libraries, other files are standard or library +object files. + +If the OUTPUT-FILE ends in '.la', then a libtool library is created, +only library objects ('.lo' files) may be specified, and '-rpath' is +required, except when creating a convenience library. + +If OUTPUT-FILE ends in '.a' or '.lib', then a standard library is created +using 'ar' and 'ranlib', or on Windows using 'lib'. + +If OUTPUT-FILE ends in '.lo' or '.$objext', then a reloadable object file +is created, otherwise an executable program is created." + ;; + + uninstall) + $ECHO \ +"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... + +Remove libraries from an installation directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed +to RM. + +If FILE is a libtool library, all the files associated with it are deleted. +Otherwise, only FILE itself is deleted using RM." + ;; + + *) + func_fatal_help "invalid operation mode '$opt_mode'" + ;; + esac + + echo + $ECHO "Try '$progname --help' for more information about other modes." +} + +# Now that we've collected a possible --mode arg, show help if necessary +if $opt_help; then + if test : = "$opt_help"; then + func_mode_help + else + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + func_mode_help + done + } | $SED -n '1p; 2,$s/^Usage:/ or: /p' + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + echo + func_mode_help + done + } | + $SED '1d + /^When reporting/,/^Report/{ + H + d + } + $x + /information about other modes/d + /more detailed .*MODE/d + s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' + fi + exit $? +fi + + +# If option '--reorder-cache', reorder the shared library cache and exit. +if $opt_reorder_cache; then + func_reorder_shared_lib_cache $shared_lib_dirs +fi + + +# func_mode_execute arg... +func_mode_execute () +{ + $debug_cmd + + # The first argument is the command name. + cmd=$nonopt + test -z "$cmd" && \ + func_fatal_help "you must specify a COMMAND" + + # Handle -dlopen flags immediately. + for file in $opt_dlopen; do + test -f "$file" \ + || func_fatal_help "'$file' is not a file" + + dir= + case $file in + *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "'$lib' is not a valid libtool archive" + + # Read the libtool library. + dlname= + library_names= + func_source "$file" + + # Skip this library if it cannot be dlopened. + if test -z "$dlname"; then + # Warn if it was a shared library. + test -n "$library_names" && \ + func_warning "'$file' was not linked with '-export-dynamic'" + continue + fi + + func_dirname "$file" "" "." + dir=$func_dirname_result + + if test -f "$dir/$objdir/$dlname"; then + func_append dir "/$objdir" + else + if test ! -f "$dir/$dlname"; then + func_fatal_error "cannot find '$dlname' in '$dir' or '$dir/$objdir'" + fi + fi + ;; + + *.lo) + # Just add the directory containing the .lo file. + func_dirname "$file" "" "." + dir=$func_dirname_result + ;; + + *) + func_warning "'-dlopen' is ignored for non-libtool libraries and objects" + continue + ;; + esac + + # Get the absolute pathname. + absdir=`cd "$dir" && pwd` + test -n "$absdir" && dir=$absdir + + # Now add the directory to shlibpath_var. + if eval "test -z \"\$$shlibpath_var\""; then + eval "$shlibpath_var=\"\$dir\"" + else + eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" + fi + done + + # This variable tells wrapper scripts just to set shlibpath_var + # rather than running their programs. + libtool_execute_magic=$magic + + # Check if any of the arguments is a wrapper script. + args= + for file + do + case $file in + -* | *.la | *.lo ) ;; + *) + # Do a test to see if this is really a libtool program. + if func_ltwrapper_script_p "$file"; then + func_source "$file" + # Transform arg to wrapped name. + file=$progdir/$program + elif func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + func_source "$func_ltwrapper_scriptname_result" + # Transform arg to wrapped name. + file=$progdir/$program + fi + ;; + esac + # Quote arguments (to preserve shell metacharacters). + func_append_quoted args "$file" + done + + if $opt_dry_run; then + # Display what would be done. + if test -n "$shlibpath_var"; then + eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" + echo "export $shlibpath_var" + fi + $ECHO "$cmd$args" + exit $EXIT_SUCCESS + else + if test -n "$shlibpath_var"; then + # Export the shlibpath_var. + eval "export $shlibpath_var" + fi + + # Restore saved environment variables + for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES + do + eval "if test \"\${save_$lt_var+set}\" = set; then + $lt_var=\$save_$lt_var; export $lt_var + else + $lt_unset $lt_var + fi" + done + + # Now prepare to actually exec the command. + exec_cmd=\$cmd$args + fi +} + +test execute = "$opt_mode" && func_mode_execute ${1+"$@"} + + +# func_mode_finish arg... +func_mode_finish () +{ + $debug_cmd + + libs= + libdirs= + admincmds= + + for opt in "$nonopt" ${1+"$@"} + do + if test -d "$opt"; then + func_append libdirs " $opt" + + elif test -f "$opt"; then + if func_lalib_unsafe_p "$opt"; then + func_append libs " $opt" + else + func_warning "'$opt' is not a valid libtool archive" + fi + + else + func_fatal_error "invalid argument '$opt'" + fi + done + + if test -n "$libs"; then + if test -n "$lt_sysroot"; then + sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` + sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" + else + sysroot_cmd= + fi + + # Remove sysroot references + if $opt_dry_run; then + for lib in $libs; do + echo "removing references to $lt_sysroot and '=' prefixes from $lib" + done + else + tmpdir=`func_mktempdir` + for lib in $libs; do + $SED -e "$sysroot_cmd s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ + > $tmpdir/tmp-la + mv -f $tmpdir/tmp-la $lib + done + ${RM}r "$tmpdir" + fi + fi + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs" && $opt_finishing; then + for libdir in $libdirs; do + if test -n "$finish_cmds"; then + # Do each command in the finish commands. + func_execute_cmds "$finish_cmds" 'admincmds="$admincmds +'"$cmd"'"' + fi + if test -n "$finish_eval"; then + # Do the single finish_eval. + eval cmds=\"$finish_eval\" + $opt_dry_run || eval "$cmds" || func_append admincmds " + $cmds" + fi + done + fi + + # Exit here if they wanted silent mode. + $opt_quiet && exit $EXIT_SUCCESS + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + echo "----------------------------------------------------------------------" + echo "Libraries have been installed in:" + for libdir in $libdirs; do + $ECHO " $libdir" + done + if test "false" = "$opt_finishing"; then + echo + echo "NOTE: finish_cmds were not executed during testing, so you must" + echo "manually run ldconfig to add a given test directory, LIBDIR, to" + echo "the search path for generated executables." + fi + echo + echo "If you ever happen to want to link against installed libraries" + echo "in a given directory, LIBDIR, you must either use libtool, and" + echo "specify the full pathname of the library, or use the '-LLIBDIR'" + echo "flag during linking and do at least one of the following:" + if test -n "$shlibpath_var"; then + echo " - add LIBDIR to the '$shlibpath_var' environment variable" + echo " during execution" + fi + if test -n "$runpath_var"; then + echo " - add LIBDIR to the '$runpath_var' environment variable" + echo " during linking" + fi + if test -n "$hardcode_libdir_flag_spec"; then + libdir=LIBDIR + eval flag=\"$hardcode_libdir_flag_spec\" + + $ECHO " - use the '$flag' linker flag" + fi + if test -n "$admincmds"; then + $ECHO " - have your system administrator run these commands:$admincmds" + fi + if test -f /etc/ld.so.conf; then + echo " - have your system administrator add LIBDIR to '/etc/ld.so.conf'" + fi + echo + + echo "See any operating system documentation about shared libraries for" + case $host in + solaris2.[6789]|solaris2.1[0-9]) + echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" + echo "pages." + ;; + *) + echo "more information, such as the ld(1) and ld.so(8) manual pages." + ;; + esac + echo "----------------------------------------------------------------------" + fi + exit $EXIT_SUCCESS +} + +test finish = "$opt_mode" && func_mode_finish ${1+"$@"} + + +# func_mode_install arg... +func_mode_install () +{ + $debug_cmd + + # There may be an optional sh(1) argument at the beginning of + # install_prog (especially on Windows NT). + if test "$SHELL" = "$nonopt" || test /bin/sh = "$nonopt" || + # Allow the use of GNU shtool's install command. + case $nonopt in *shtool*) :;; *) false;; esac + then + # Aesthetically quote it. + func_quote_arg pretty "$nonopt" + install_prog="$func_quote_arg_result " + arg=$1 + shift + else + install_prog= + arg=$nonopt + fi + + # The real first argument should be the name of the installation program. + # Aesthetically quote it. + func_quote_arg pretty "$arg" + func_append install_prog "$func_quote_arg_result" + install_shared_prog=$install_prog + case " $install_prog " in + *[\\\ /]cp\ *) install_cp=: ;; + *) install_cp=false ;; + esac + + # We need to accept at least all the BSD install flags. + dest= + files= + opts= + prev= + install_type= + isdir=false + stripme= + no_mode=: + for arg + do + arg2= + if test -n "$dest"; then + func_append files " $dest" + dest=$arg + continue + fi + + case $arg in + -d) isdir=: ;; + -f) + if $install_cp; then :; else + prev=$arg + fi + ;; + -g | -m | -o) + prev=$arg + ;; + -s) + stripme=" -s" + continue + ;; + -*) + ;; + *) + # If the previous option needed an argument, then skip it. + if test -n "$prev"; then + if test X-m = "X$prev" && test -n "$install_override_mode"; then + arg2=$install_override_mode + no_mode=false + fi + prev= + else + dest=$arg + continue + fi + ;; + esac + + # Aesthetically quote the argument. + func_quote_arg pretty "$arg" + func_append install_prog " $func_quote_arg_result" + if test -n "$arg2"; then + func_quote_arg pretty "$arg2" + fi + func_append install_shared_prog " $func_quote_arg_result" + done + + test -z "$install_prog" && \ + func_fatal_help "you must specify an install program" + + test -n "$prev" && \ + func_fatal_help "the '$prev' option requires an argument" + + if test -n "$install_override_mode" && $no_mode; then + if $install_cp; then :; else + func_quote_arg pretty "$install_override_mode" + func_append install_shared_prog " -m $func_quote_arg_result" + fi + fi + + if test -z "$files"; then + if test -z "$dest"; then + func_fatal_help "no file or destination specified" + else + func_fatal_help "you must specify a destination" + fi + fi + + # Strip any trailing slash from the destination. + func_stripname '' '/' "$dest" + dest=$func_stripname_result + + # Check to see that the destination is a directory. + test -d "$dest" && isdir=: + if $isdir; then + destdir=$dest + destname= + else + func_dirname_and_basename "$dest" "" "." + destdir=$func_dirname_result + destname=$func_basename_result + + # Not a directory, so check to see that there is only one file specified. + set dummy $files; shift + test "$#" -gt 1 && \ + func_fatal_help "'$dest' is not a directory" + fi + case $destdir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + for file in $files; do + case $file in + *.lo) ;; + *) + func_fatal_help "'$destdir' must be an absolute directory name" + ;; + esac + done + ;; + esac + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic=$magic + + staticlibs= + future_libdirs= + current_libdirs= + for file in $files; do + + # Do each installation. + case $file in + *.$libext) + # Do the static libraries later. + func_append staticlibs " $file" + ;; + + *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "'$file' is not a valid libtool archive" + + library_names= + old_library= + relink_command= + func_source "$file" + + # Add the libdir to current_libdirs if it is the destination. + if test "X$destdir" = "X$libdir"; then + case "$current_libdirs " in + *" $libdir "*) ;; + *) func_append current_libdirs " $libdir" ;; + esac + else + # Note the libdir as a future libdir. + case "$future_libdirs " in + *" $libdir "*) ;; + *) func_append future_libdirs " $libdir" ;; + esac + fi + + func_dirname "$file" "/" "" + dir=$func_dirname_result + func_append dir "$objdir" + + if test -n "$relink_command"; then + # Strip any trailing slash from the destination. + func_stripname '' '/' "$libdir" + destlibdir=$func_stripname_result + + func_stripname '' '/' "$destdir" + s_destdir=$func_stripname_result + + # Determine the prefix the user has applied to our future dir. + inst_prefix_dir=`$ECHO "X$s_destdir" | $Xsed -e "s%$destlibdir\$%%"` + + # Don't allow the user to place us outside of our expected + # location b/c this prevents finding dependent libraries that + # are installed to the same prefix. + # At present, this check doesn't affect windows .dll's that + # are installed into $libdir/../bin (currently, that works fine) + # but it's something to keep an eye on. + test "$inst_prefix_dir" = "$destdir" && \ + func_fatal_error "error: cannot install '$file' to a directory not ending in $libdir" + + if test -n "$inst_prefix_dir"; then + # Stick the inst_prefix_dir data into the link command. + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` + else + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` + fi + + func_warning "relinking '$file'" + func_show_eval "$relink_command" \ + 'func_fatal_error "error: relink '\''$file'\'' with the above command before installing it"' + fi + + # See the names of the shared library. + set dummy $library_names; shift + if test -n "$1"; then + realname=$1 + shift + + srcname=$realname + test -n "$relink_command" && srcname=${realname}T + + # Install the shared library and build the symlinks. + func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ + 'exit $?' + tstripme=$stripme + case $host_os in + cygwin* | mingw* | windows* | pw32* | cegcc*) + case $realname in + *.dll.a) + tstripme= + ;; + esac + ;; + os2*) + case $realname in + *_dll.a) + tstripme= + ;; + esac + ;; + esac + if test -n "$tstripme" && test -n "$striplib"; then + func_show_eval "$striplib $destdir/$realname" 'exit $?' + fi + + if test "$#" -gt 0; then + # Delete the old symlinks, and create new ones. + # Try 'ln -sf' first, because the 'ln' binary might depend on + # the symlink we replace! Solaris /bin/ln does not understand -f, + # so we also need to try rm && ln -s. + for linkname + do + test "$linkname" != "$realname" \ + && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" + done + fi + + # Do each command in the postinstall commands. + lib=$destdir/$realname + func_execute_cmds "$postinstall_cmds" 'exit $?' + fi + + # Install the pseudo-library for information purposes. + func_basename "$file" + name=$func_basename_result + instname=$dir/${name}i + func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' + + # Maybe install the static library, too. + test -n "$old_library" && func_append staticlibs " $dir/$old_library" + ;; + + *.lo) + # Install (i.e. copy) a libtool object. + + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile=$destdir/$destname + else + func_basename "$file" + destfile=$func_basename_result + destfile=$destdir/$destfile + fi + + # Deduce the name of the destination old-style object file. + case $destfile in + *.lo) + func_lo2o "$destfile" + staticdest=$func_lo2o_result + ;; + *.$objext) + staticdest=$destfile + destfile= + ;; + *) + func_fatal_help "cannot copy a libtool object to '$destfile'" + ;; + esac + + # Install the libtool object if requested. + test -n "$destfile" && \ + func_show_eval "$install_prog $file $destfile" 'exit $?' + + # Install the old object if enabled. + if test yes = "$build_old_libs"; then + # Deduce the name of the old-style object file. + func_lo2o "$file" + staticobj=$func_lo2o_result + func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' + fi + exit $EXIT_SUCCESS + ;; + + *) + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile=$destdir/$destname + else + func_basename "$file" + destfile=$func_basename_result + destfile=$destdir/$destfile + fi + + # If the file is missing, and there is a .exe on the end, strip it + # because it is most likely a libtool script we actually want to + # install + stripped_ext= + case $file in + *.exe) + if test ! -f "$file"; then + func_stripname '' '.exe' "$file" + file=$func_stripname_result + stripped_ext=.exe + fi + ;; + esac + + # Do a test to see if this is really a libtool program. + case $host in + *cygwin* | *mingw* | *windows*) + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + wrapper=$func_ltwrapper_scriptname_result + else + func_stripname '' '.exe' "$file" + wrapper=$func_stripname_result + fi + ;; + *) + wrapper=$file + ;; + esac + if func_ltwrapper_script_p "$wrapper"; then + notinst_deplibs= + relink_command= + + func_source "$wrapper" + + # Check the variables that should have been set. + test -z "$generated_by_libtool_version" && \ + func_fatal_error "invalid libtool wrapper script '$wrapper'" + + finalize=: + for lib in $notinst_deplibs; do + # Check to see that each library is installed. + libdir= + if test -f "$lib"; then + func_source "$lib" + fi + libfile=$libdir/`$ECHO "$lib" | $SED 's%^.*/%%g'` + if test -n "$libdir" && test ! -f "$libfile"; then + func_warning "'$lib' has not been installed in '$libdir'" + finalize=false + fi + done + + relink_command= + func_source "$wrapper" + + outputname= + if test no = "$fast_install" && test -n "$relink_command"; then + $opt_dry_run || { + if $finalize; then + tmpdir=`func_mktempdir` + func_basename "$file$stripped_ext" + file=$func_basename_result + outputname=$tmpdir/$file + # Replace the output file specification. + relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` + + $opt_quiet || { + func_quote_arg expand,pretty "$relink_command" + eval "func_echo $func_quote_arg_result" + } + if eval "$relink_command"; then : + else + func_error "error: relink '$file' with the above command before installing it" + $opt_dry_run || ${RM}r "$tmpdir" + continue + fi + file=$outputname + else + func_warning "cannot relink '$file'" + fi + } + else + # Install the binary that we compiled earlier. + file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` + fi + fi + + # remove .exe since cygwin /usr/bin/install will append another + # one anyway + case $install_prog,$host in + */usr/bin/install*,*cygwin*) + case $file:$destfile in + *.exe:*.exe) + # this is ok + ;; + *.exe:*) + destfile=$destfile.exe + ;; + *:*.exe) + func_stripname '' '.exe' "$destfile" + destfile=$func_stripname_result + ;; + esac + ;; + esac + func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' + $opt_dry_run || if test -n "$outputname"; then + ${RM}r "$tmpdir" + fi + ;; + esac + done + + for file in $staticlibs; do + func_basename "$file" + name=$func_basename_result + + # Set up the ranlib parameters. + oldlib=$destdir/$name + func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 + tool_oldlib=$func_to_tool_file_result + + func_show_eval "$install_prog \$file \$oldlib" 'exit $?' + + if test -n "$stripme" && test -n "$old_striplib"; then + func_show_eval "$old_striplib $tool_oldlib" 'exit $?' + fi + + # Do each command in the postinstall commands. + func_execute_cmds "$old_postinstall_cmds" 'exit $?' + done + + test -n "$future_libdirs" && \ + func_warning "remember to run '$progname --finish$future_libdirs'" + + if test -n "$current_libdirs"; then + # Maybe just do a dry run. + $opt_dry_run && current_libdirs=" -n$current_libdirs" + exec_cmd='$SHELL "$progpath" $preserve_args --finish$current_libdirs' + else + exit $EXIT_SUCCESS + fi +} + +test install = "$opt_mode" && func_mode_install ${1+"$@"} + + +# func_generate_dlsyms outputname originator pic_p +# Extract symbols from dlprefiles and create ${outputname}S.o with +# a dlpreopen symbol table. +func_generate_dlsyms () +{ + $debug_cmd + + my_outputname=$1 + my_originator=$2 + my_pic_p=${3-false} + my_prefix=`$ECHO "$my_originator" | $SED 's%[^a-zA-Z0-9]%_%g'` + my_dlsyms= + + if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then + if test -n "$NM" && test -n "$global_symbol_pipe"; then + my_dlsyms=${my_outputname}S.c + else + func_error "not configured to extract global symbols from dlpreopened files" + fi + fi + + if test -n "$my_dlsyms"; then + case $my_dlsyms in + "") ;; + *.c) + # Discover the nlist of each of the dlfiles. + nlist=$output_objdir/$my_outputname.nm + + func_show_eval "$RM $nlist ${nlist}S ${nlist}T" + + # Parse the name list into a source file. + func_verbose "creating $output_objdir/$my_dlsyms" + + $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ +/* $my_dlsyms - symbol resolution table for '$my_outputname' dlsym emulation. */ +/* Generated by $PROGRAM (GNU $PACKAGE) $VERSION */ + +#ifdef __cplusplus +extern \"C\" { +#endif + +#if defined __GNUC__ && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) +#pragma GCC diagnostic ignored \"-Wstrict-prototypes\" +#endif + +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE +/* DATA imports from DLLs on WIN32 can't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT_DLSYM_CONST +#elif defined __osf__ +/* This system does not cope well with relocations in const data. */ +# define LT_DLSYM_CONST +#else +# define LT_DLSYM_CONST const +#endif + +#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) + +/* External symbol declarations for the compiler. */\ +" + + if test yes = "$dlself"; then + func_verbose "generating symbol list for '$output'" + + $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" + + # Add our own program objects to the symbol list. + progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` + for progfile in $progfiles; do + func_to_tool_file "$progfile" func_convert_file_msys_to_w32 + func_verbose "extracting global C symbols from '$func_to_tool_file_result'" + $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" + done + + if test -n "$exclude_expsyms"; then + $opt_dry_run || { + eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + if test -n "$export_symbols_regex"; then + $opt_dry_run || { + eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + export_symbols=$output_objdir/$outputname.exp + $opt_dry_run || { + $RM $export_symbols + eval "$SED -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' + case $host in + *cygwin* | *mingw* | *windows* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' + ;; + esac + } + else + $opt_dry_run || { + eval "$SED -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' + eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + case $host in + *cygwin* | *mingw* | *windows* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' + ;; + esac + } + fi + fi + + for dlprefile in $dlprefiles; do + func_verbose "extracting global C symbols from '$dlprefile'" + func_basename "$dlprefile" + name=$func_basename_result + case $host in + *cygwin* | *mingw* | *windows* | *cegcc* ) + # if an import library, we need to obtain dlname + if func_win32_import_lib_p "$dlprefile"; then + func_tr_sh "$dlprefile" + eval "curr_lafile=\$libfile_$func_tr_sh_result" + dlprefile_dlbasename= + if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then + # Use subshell, to avoid clobbering current variable values + dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` + if test -n "$dlprefile_dlname"; then + func_basename "$dlprefile_dlname" + dlprefile_dlbasename=$func_basename_result + else + # no lafile. user explicitly requested -dlpreopen . + $sharedlib_from_linklib_cmd "$dlprefile" + dlprefile_dlbasename=$sharedlib_from_linklib_result + fi + fi + $opt_dry_run || { + if test -n "$dlprefile_dlbasename"; then + eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' + else + func_warning "Could not compute DLL name from $name" + eval '$ECHO ": $name " >> "$nlist"' + fi + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + case $host in + i[3456]86-*-mingw32*) + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | + $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" + ;; + *) + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | + $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/__nm_//' >> '$nlist'" + ;; + esac + } + else # not an import lib + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + fi + ;; + *) + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + ;; + esac + done + + $opt_dry_run || { + # Make sure we have at least an empty file. + test -f "$nlist" || : > "$nlist" + + if test -n "$exclude_expsyms"; then + $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T + $MV "$nlist"T "$nlist" + fi + + # Try sorting and uniquifying the output. + if $GREP -v "^: " < "$nlist" | + if sort -k 3 /dev/null 2>&1; then + sort -k 3 + else + sort +2 + fi | + uniq > "$nlist"S; then + : + else + $GREP -v "^: " < "$nlist" > "$nlist"S + fi + + if test -f "$nlist"S; then + eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' + else + echo '/* NONE */' >> "$output_objdir/$my_dlsyms" + fi + + func_show_eval '$RM "${nlist}I"' + if test -n "$global_symbol_to_import"; then + eval "$global_symbol_to_import"' < "$nlist"S > "$nlist"I' + fi + + echo >> "$output_objdir/$my_dlsyms" "\ + +/* The mapping between symbol names and symbols. */ +typedef struct { + const char *name; + void *address; +} lt_dlsymlist; +extern LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[];\ +" + + if test -s "$nlist"I; then + echo >> "$output_objdir/$my_dlsyms" "\ +static void lt_syminit(void) +{ + LT_DLSYM_CONST lt_dlsymlist *symbol = lt_${my_prefix}_LTX_preloaded_symbols; + for (; symbol->name; ++symbol) + {" + $SED 's/.*/ if (STREQ (symbol->name, \"&\")) symbol->address = (void *) \&&;/' < "$nlist"I >> "$output_objdir/$my_dlsyms" + echo >> "$output_objdir/$my_dlsyms" "\ + } +}" + fi + echo >> "$output_objdir/$my_dlsyms" "\ +LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[] = +{ {\"$my_originator\", (void *) 0}," + + if test -s "$nlist"I; then + echo >> "$output_objdir/$my_dlsyms" "\ + {\"@INIT@\", (void *) <_syminit}," + fi + + case $need_lib_prefix in + no) + eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + *) + eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + esac + echo >> "$output_objdir/$my_dlsyms" "\ + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt_${my_prefix}_LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif\ +" + } # !$opt_dry_run + + pic_flag_for_symtable= + case "$compile_command " in + *" -static "*) ;; + *) + case $host in + # compiling the symbol table file with pic_flag works around + # a FreeBSD bug that causes programs to crash when -lm is + # linked before any other PIC object. But we must not use + # pic_flag when linking with -static. The problem exists in + # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. + *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) + pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; + *-*-hpux*) + pic_flag_for_symtable=" $pic_flag" ;; + *) + $my_pic_p && pic_flag_for_symtable=" $pic_flag" + ;; + esac + ;; + esac + symtab_cflags= + for arg in $LTCFLAGS; do + case $arg in + -pie | -fpie | -fPIE) ;; + *) func_append symtab_cflags " $arg" ;; + esac + done + + # Now compile the dynamic symbol file. + func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' + + # Clean up the generated files. + func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T" "${nlist}I"' + + # Transform the symbol file into the correct name. + symfileobj=$output_objdir/${my_outputname}S.$objext + case $host in + *cygwin* | *mingw* | *windows* | *cegcc* ) + if test -f "$output_objdir/$my_outputname.def"; then + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + else + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + fi + ;; + *) + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + ;; + esac + ;; + *) + func_fatal_error "unknown suffix for '$my_dlsyms'" + ;; + esac + else + # We keep going just in case the user didn't refer to + # lt_preloaded_symbols. The linker will fail if global_symbol_pipe + # really was required. + + # Nullify the symbol file. + compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` + fi +} + +# func_cygming_gnu_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is a GNU/binutils-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_gnu_implib_p () +{ + $debug_cmd + + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` + test -n "$func_cygming_gnu_implib_tmp" +} + +# func_cygming_ms_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is an MS-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_ms_implib_p () +{ + $debug_cmd + + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` + test -n "$func_cygming_ms_implib_tmp" +} + +# func_win32_libid arg +# return the library type of file 'arg' +# +# Need a lot of goo to handle *both* DLLs and import libs +# Has to be a shell function in order to 'eat' the argument +# that is supplied when $file_magic_command is called. +# Despite the name, also deal with 64 bit binaries. +func_win32_libid () +{ + $debug_cmd + + win32_libid_type=unknown + win32_fileres=`file -L $1 2>/dev/null` + case $win32_fileres in + *ar\ archive\ import\ library*) # definitely import + win32_libid_type="x86 archive import" + ;; + *ar\ archive*) # could be an import, or static + # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. + if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | + $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64|pe-aarch64)' >/dev/null; then + case $nm_interface in + "MS dumpbin") + if func_cygming_ms_implib_p "$1" || + func_cygming_gnu_implib_p "$1" + then + win32_nmres=import + else + win32_nmres= + fi + ;; + *) + func_to_tool_file "$1" func_convert_file_msys_to_w32 + win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | + $SED -n -e ' + 1,100{ + / I /{ + s|.*|import| + p + q + } + }'` + ;; + esac + case $win32_nmres in + import*) win32_libid_type="x86 archive import";; + *) win32_libid_type="x86 archive static";; + esac + fi + ;; + *DLL*) + win32_libid_type="x86 DLL" + ;; + *executable*) # but shell scripts are "executable" too... + case $win32_fileres in + *MS\ Windows\ PE\ Intel*) + win32_libid_type="x86 DLL" + ;; + esac + ;; + esac + $ECHO "$win32_libid_type" +} + +# func_cygming_dll_for_implib ARG +# +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib () +{ + $debug_cmd + + sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` +} + +# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs +# +# The is the core of a fallback implementation of a +# platform-specific function to extract the name of the +# DLL associated with the specified import library LIBNAME. +# +# SECTION_NAME is either .idata$6 or .idata$7, depending +# on the platform and compiler that created the implib. +# +# Echos the name of the DLL associated with the +# specified import library. +func_cygming_dll_for_implib_fallback_core () +{ + $debug_cmd + + match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` + $OBJDUMP -s --section "$1" "$2" 2>/dev/null | + $SED '/^Contents of section '"$match_literal"':/{ + # Place marker at beginning of archive member dllname section + s/.*/====MARK====/ + p + d + } + # These lines can sometimes be longer than 43 characters, but + # are always uninteresting + /:[ ]*file format pe[i]\{,1\}-/d + /^In archive [^:]*:/d + # Ensure marker is printed + /^====MARK====/p + # Remove all lines with less than 43 characters + /^.\{43\}/!d + # From remaining lines, remove first 43 characters + s/^.\{43\}//' | + $SED -n ' + # Join marker and all lines until next marker into a single line + /^====MARK====/ b para + H + $ b para + b + :para + x + s/\n//g + # Remove the marker + s/^====MARK====// + # Remove trailing dots and whitespace + s/[\. \t]*$// + # Print + /./p' | + # we now have a list, one entry per line, of the stringified + # contents of the appropriate section of all members of the + # archive that possess that section. Heuristic: eliminate + # all those that have a first or second character that is + # a '.' (that is, objdump's representation of an unprintable + # character.) This should work for all archives with less than + # 0x302f exports -- but will fail for DLLs whose name actually + # begins with a literal '.' or a single character followed by + # a '.'. + # + # Of those that remain, print the first one. + $SED -e '/^\./d;/^.\./d;q' +} + +# func_cygming_dll_for_implib_fallback ARG +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# +# This fallback implementation is for use when $DLLTOOL +# does not support the --identify-strict option. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib_fallback () +{ + $debug_cmd + + if func_cygming_gnu_implib_p "$1"; then + # binutils import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` + elif func_cygming_ms_implib_p "$1"; then + # ms-generated import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` + else + # unknown + sharedlib_from_linklib_result= + fi +} + + +# func_extract_an_archive dir oldlib +func_extract_an_archive () +{ + $debug_cmd + + f_ex_an_ar_dir=$1; shift + f_ex_an_ar_oldlib=$1 + if test yes = "$lock_old_archive_extraction"; then + lockfile=$f_ex_an_ar_oldlib.lock + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + fi + func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ + 'stat=$?; rm -f "$lockfile"; exit $stat' + if test yes = "$lock_old_archive_extraction"; then + $opt_dry_run || rm -f "$lockfile" + fi + if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then + : + else + func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" + fi +} + + +# func_extract_archives gentop oldlib ... +func_extract_archives () +{ + $debug_cmd + + my_gentop=$1; shift + my_oldlibs=${1+"$@"} + my_oldobjs= + my_xlib= + my_xabs= + my_xdir= + + for my_xlib in $my_oldlibs; do + # Extract the objects. + case $my_xlib in + [\\/]* | [A-Za-z]:[\\/]*) my_xabs=$my_xlib ;; + *) my_xabs=`pwd`"/$my_xlib" ;; + esac + func_basename "$my_xlib" + my_xlib=$func_basename_result + my_xlib_u=$my_xlib + while :; do + case " $extracted_archives " in + *" $my_xlib_u "*) + func_arith $extracted_serial + 1 + extracted_serial=$func_arith_result + my_xlib_u=lt$extracted_serial-$my_xlib ;; + *) break ;; + esac + done + extracted_archives="$extracted_archives $my_xlib_u" + my_xdir=$my_gentop/$my_xlib_u + + func_mkdir_p "$my_xdir" + + case $host in + *-darwin*) + func_verbose "Extracting $my_xabs" + # Do not bother doing anything if just a dry run + $opt_dry_run || { + darwin_orig_dir=`pwd` + cd $my_xdir || exit $? + darwin_archive=$my_xabs + darwin_curdir=`pwd` + func_basename "$darwin_archive" + darwin_base_archive=$func_basename_result + darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` + if test -n "$darwin_arches"; then + darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` + darwin_arch= + func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" + for darwin_arch in $darwin_arches; do + func_mkdir_p "unfat-$$/$darwin_base_archive-$darwin_arch" + $LIPO -thin $darwin_arch -output "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" "$darwin_archive" + cd "unfat-$$/$darwin_base_archive-$darwin_arch" + func_extract_an_archive "`pwd`" "$darwin_base_archive" + cd "$darwin_curdir" + $RM "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" + done # $darwin_arches + ## Okay now we've a bunch of thin objects, gotta fatten them up :) + darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$sed_basename" | sort -u` + darwin_file= + darwin_files= + for darwin_file in $darwin_filelist; do + darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` + $LIPO -create -output "$darwin_file" $darwin_files + done # $darwin_filelist + $RM -rf unfat-$$ + cd "$darwin_orig_dir" + else + cd $darwin_orig_dir + func_extract_an_archive "$my_xdir" "$my_xabs" + fi # $darwin_arches + } # !$opt_dry_run + ;; + *) + func_extract_an_archive "$my_xdir" "$my_xabs" + ;; + esac + my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` + done + + func_extract_archives_result=$my_oldobjs +} + + +# func_emit_wrapper [arg=no] +# +# Emit a libtool wrapper script on stdout. +# Don't directly open a file because we may want to +# incorporate the script contents within a cygwin/mingw/windows +# wrapper executable. Must ONLY be called from within +# func_mode_link because it depends on a number of variables +# set therein. +# +# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR +# variable will take. If 'yes', then the emitted script +# will assume that the directory where it is stored is +# the $objdir directory. This is a cygwin/mingw/windows-specific +# behavior. +func_emit_wrapper () +{ + func_emit_wrapper_arg1=${1-no} + + $ECHO "\ +#! $SHELL + +# $output - temporary wrapper script for $objdir/$outputname +# Generated by $PROGRAM (GNU $PACKAGE) $VERSION +# +# The $output program cannot be directly executed until all the libtool +# libraries that it depends on are installed. +# +# This wrapper script should never be moved out of the build directory. +# If it is, it will not operate correctly. + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +sed_quote_subst='$sed_quote_subst' + +# Be Bourne compatible +if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +relink_command=\"$relink_command\" + +# This environment variable determines our operation mode. +if test \"\$libtool_install_magic\" = \"$magic\"; then + # install mode needs the following variables: + generated_by_libtool_version='$macro_version' + notinst_deplibs='$notinst_deplibs' +else + # When we are sourced in execute mode, \$file and \$ECHO are already set. + if test \"\$libtool_execute_magic\" != \"$magic\"; then + file=\"\$0\"" + + func_quote_arg pretty "$ECHO" + qECHO=$func_quote_arg_result + $ECHO "\ + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$1 +_LTECHO_EOF' +} + ECHO=$qECHO + fi + +# Very basic option parsing. These options are (a) specific to +# the libtool wrapper, (b) are identical between the wrapper +# /script/ and the wrapper /executable/ that is used only on +# windows platforms, and (c) all begin with the string "--lt-" +# (application programs are unlikely to have options that match +# this pattern). +# +# There are only two supported options: --lt-debug and +# --lt-dump-script. There is, deliberately, no --lt-help. +# +# The first argument to this parsing function should be the +# script's $0 value, followed by "$@". +lt_option_debug= +func_parse_lt_options () +{ + lt_script_arg0=\$0 + shift + for lt_opt + do + case \"\$lt_opt\" in + --lt-debug) lt_option_debug=1 ;; + --lt-dump-script) + lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` + test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. + lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` + cat \"\$lt_dump_D/\$lt_dump_F\" + exit 0 + ;; + --lt-*) + \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 + exit 1 + ;; + esac + done + + # Print the debug banner immediately: + if test -n \"\$lt_option_debug\"; then + echo \"$outputname:$output:\$LINENO: libtool wrapper (GNU $PACKAGE) $VERSION\" 1>&2 + fi +} + +# Used when --lt-debug. Prints its arguments to stdout +# (redirection is the responsibility of the caller) +func_lt_dump_args () +{ + lt_dump_args_N=1; + for lt_arg + do + \$ECHO \"$outputname:$output:\$LINENO: newargv[\$lt_dump_args_N]: \$lt_arg\" + lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` + done +} + +# Core function for launching the target application +func_exec_program_core () +{ +" + case $host in + # Backslashes separate directories on plain windows + *-*-mingw* | *-*-windows* | *-*-os2* | *-cegcc*) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir\\\\\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} +" + ;; + + *) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir/\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir/\$program\" \${1+\"\$@\"} +" + ;; + esac + $ECHO "\ + \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 + exit 1 +} + +# A function to encapsulate launching the target application +# Strips options in the --lt-* namespace from \$@ and +# launches target application with the remaining arguments. +func_exec_program () +{ + case \" \$* \" in + *\\ --lt-*) + for lt_wr_arg + do + case \$lt_wr_arg in + --lt-*) ;; + *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; + esac + shift + done ;; + esac + func_exec_program_core \${1+\"\$@\"} +} + + # Parse options + func_parse_lt_options \"\$0\" \${1+\"\$@\"} + + # Find the directory that this script lives in. + thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` + test \"x\$thisdir\" = \"x\$file\" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` + while test -n \"\$file\"; do + destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` + + # If there was a directory component, then change thisdir. + if test \"x\$destdir\" != \"x\$file\"; then + case \"\$destdir\" in + [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; + *) thisdir=\"\$thisdir/\$destdir\" ;; + esac + fi + + file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` + file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` + done + + # Usually 'no', except on cygwin/mingw/windows when embedded into + # the cwrapper. + WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 + if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then + # special case for '.' + if test \"\$thisdir\" = \".\"; then + thisdir=\`pwd\` + fi + # remove .libs from thisdir + case \"\$thisdir\" in + *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; + $objdir ) thisdir=. ;; + esac + fi + + # Try to get the absolute directory name. + absdir=\`cd \"\$thisdir\" && pwd\` + test -n \"\$absdir\" && thisdir=\"\$absdir\" +" + + if test yes = "$fast_install"; then + $ECHO "\ + program=lt-'$outputname'$exeext + progdir=\"\$thisdir/$objdir\" + + if test ! -f \"\$progdir/\$program\" || + { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | $SED 1q\`; \\ + test \"X\$file\" != \"X\$progdir/\$program\"; }; then + + file=\"\$\$-\$program\" + + if test ! -d \"\$progdir\"; then + $MKDIR \"\$progdir\" + else + $RM \"\$progdir/\$file\" + fi" + + $ECHO "\ + + # relink executable if necessary + if test -n \"\$relink_command\"; then + if relink_command_output=\`eval \$relink_command 2>&1\`; then : + else + \$ECHO \"\$relink_command_output\" >&2 + $RM \"\$progdir/\$file\" + exit 1 + fi + fi + + $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || + { $RM \"\$progdir/\$program\"; + $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } + $RM \"\$progdir/\$file\" + fi" + else + $ECHO "\ + program='$outputname' + progdir=\"\$thisdir/$objdir\" +" + fi + + $ECHO "\ + + if test -f \"\$progdir/\$program\"; then" + + # fixup the dll searchpath if we need to. + # + # Fix the DLL searchpath if we need to. Do this before prepending + # to shlibpath, because on Windows, both are PATH and uninstalled + # libraries must come first. + if test -n "$dllsearchpath"; then + $ECHO "\ + # Add the dll search path components to the executable PATH + PATH=$dllsearchpath:\$PATH +" + fi + + # Export our shlibpath_var if we have one. + if test yes = "$shlibpath_overrides_runpath" && test -n "$shlibpath_var" && test -n "$temp_rpath"; then + $ECHO "\ + # Add our own library path to $shlibpath_var + $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" + + # Some systems cannot cope with colon-terminated $shlibpath_var + # The second colon is a workaround for a bug in BeOS R4 sed + $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` + + export $shlibpath_var +" + fi + + $ECHO "\ + if test \"\$libtool_execute_magic\" != \"$magic\"; then + # Run the actual program with our arguments. + func_exec_program \${1+\"\$@\"} + fi + else + # The program doesn't exist. + \$ECHO \"\$0: error: '\$progdir/\$program' does not exist\" 1>&2 + \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 + \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 + exit 1 + fi +fi\ +" +} + + +# func_emit_cwrapperexe_src +# emit the source code for a wrapper executable on stdout +# Must ONLY be called from within func_mode_link because +# it depends on a number of variable set therein. +func_emit_cwrapperexe_src () +{ + cat < +#include +#if defined _WIN32 && !defined __GNUC__ +# include +# include +# include +#else +# include +# include +# ifdef __CYGWIN__ +# include +# endif +#endif +#include +#include +#include +#include +#include +#include +#include +#include + +#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) + +/* declarations of non-ANSI functions */ +#if defined __MINGW32__ +# ifdef __STRICT_ANSI__ +_CRTIMP int __cdecl _putenv (const char *); +# endif +#elif defined __CYGWIN__ +# ifdef __STRICT_ANSI__ +char *realpath (const char *, char *); +int putenv (char *); +int setenv (const char *, const char *, int); +# endif +/* #elif defined other_platform || defined ... */ +#endif + +/* portability defines, excluding path handling macros */ +#if defined _MSC_VER +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +# define S_IXUSR _S_IEXEC +#elif defined __MINGW32__ +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +#elif defined __CYGWIN__ +# define HAVE_SETENV +# define FOPEN_WB "wb" +/* #elif defined other platforms ... */ +#endif + +#if defined PATH_MAX +# define LT_PATHMAX PATH_MAX +#elif defined MAXPATHLEN +# define LT_PATHMAX MAXPATHLEN +#else +# define LT_PATHMAX 1024 +#endif + +#ifndef S_IXOTH +# define S_IXOTH 0 +#endif +#ifndef S_IXGRP +# define S_IXGRP 0 +#endif + +/* path handling portability macros */ +#ifndef DIR_SEPARATOR +# define DIR_SEPARATOR '/' +# define PATH_SEPARATOR ':' +#endif + +#if defined _WIN32 || defined __MSDOS__ || defined __DJGPP__ || \ + defined __OS2__ +# define HAVE_DOS_BASED_FILE_SYSTEM +# define FOPEN_WB "wb" +# ifndef DIR_SEPARATOR_2 +# define DIR_SEPARATOR_2 '\\' +# endif +# ifndef PATH_SEPARATOR_2 +# define PATH_SEPARATOR_2 ';' +# endif +#endif + +#ifndef DIR_SEPARATOR_2 +# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) +#else /* DIR_SEPARATOR_2 */ +# define IS_DIR_SEPARATOR(ch) \ + (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) +#endif /* DIR_SEPARATOR_2 */ + +#ifndef PATH_SEPARATOR_2 +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) +#else /* PATH_SEPARATOR_2 */ +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) +#endif /* PATH_SEPARATOR_2 */ + +#ifndef FOPEN_WB +# define FOPEN_WB "w" +#endif +#ifndef _O_BINARY +# define _O_BINARY 0 +#endif + +#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) +#define XFREE(stale) do { \ + if (stale) { free (stale); stale = 0; } \ +} while (0) + +#if defined LT_DEBUGWRAPPER +static int lt_debug = 1; +#else +static int lt_debug = 0; +#endif + +const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ + +void *xmalloc (size_t num); +char *xstrdup (const char *string); +const char *base_name (const char *name); +char *find_executable (const char *wrapper); +char *chase_symlinks (const char *pathspec); +int make_executable (const char *path); +int check_executable (const char *path); +char *strendzap (char *str, const char *pat); +void lt_debugprintf (const char *file, int line, const char *fmt, ...); +void lt_fatal (const char *file, int line, const char *message, ...); +static const char *nonnull (const char *s); +static const char *nonempty (const char *s); +void lt_setenv (const char *name, const char *value); +char *lt_extend_str (const char *orig_value, const char *add, int to_end); +void lt_update_exe_path (const char *name, const char *value); +void lt_update_lib_path (const char *name, const char *value); +char **prepare_spawn (char **argv); +void lt_dump_script (FILE *f); +EOF + + cat <= 0) + && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) + return 1; + else + return 0; +} + +int +make_executable (const char *path) +{ + int rval = 0; + struct stat st; + + lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", + nonempty (path)); + if ((!path) || (!*path)) + return 0; + + if (stat (path, &st) >= 0) + { + rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); + } + return rval; +} + +/* Searches for the full path of the wrapper. Returns + newly allocated full path name if found, NULL otherwise + Does not chase symlinks, even on platforms that support them. +*/ +char * +find_executable (const char *wrapper) +{ + int has_slash = 0; + const char *p; + const char *p_next; + /* static buffer for getcwd */ + char tmp[LT_PATHMAX + 1]; + size_t tmp_len; + char *concat_name; + + lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", + nonempty (wrapper)); + + if ((wrapper == NULL) || (*wrapper == '\0')) + return NULL; + + /* Absolute path? */ +#if defined HAVE_DOS_BASED_FILE_SYSTEM + if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + else + { +#endif + if (IS_DIR_SEPARATOR (wrapper[0])) + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } +#if defined HAVE_DOS_BASED_FILE_SYSTEM + } +#endif + + for (p = wrapper; *p; p++) + if (*p == '/') + { + has_slash = 1; + break; + } + if (!has_slash) + { + /* no slashes; search PATH */ + const char *path = getenv ("PATH"); + if (path != NULL) + { + for (p = path; *p; p = p_next) + { + const char *q; + size_t p_len; + for (q = p; *q; q++) + if (IS_PATH_SEPARATOR (*q)) + break; + p_len = (size_t) (q - p); + p_next = (*q == '\0' ? q : q + 1); + if (p_len == 0) + { + /* empty path: current directory */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); + tmp_len = strlen (tmp); + concat_name = + XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + } + else + { + concat_name = + XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, p, p_len); + concat_name[p_len] = '/'; + strcpy (concat_name + p_len + 1, wrapper); + } + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + } + /* not found in PATH; assume curdir */ + } + /* Relative path | not found in path: prepend cwd */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); + tmp_len = strlen (tmp); + concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + return NULL; +} + +char * +chase_symlinks (const char *pathspec) +{ +#ifndef S_ISLNK + return xstrdup (pathspec); +#else + char buf[LT_PATHMAX]; + struct stat s; + char *tmp_pathspec = xstrdup (pathspec); + char *p; + int has_symlinks = 0; + while (strlen (tmp_pathspec) && !has_symlinks) + { + lt_debugprintf (__FILE__, __LINE__, + "checking path component for symlinks: %s\n", + tmp_pathspec); + if (lstat (tmp_pathspec, &s) == 0) + { + if (S_ISLNK (s.st_mode) != 0) + { + has_symlinks = 1; + break; + } + + /* search backwards for last DIR_SEPARATOR */ + p = tmp_pathspec + strlen (tmp_pathspec) - 1; + while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + p--; + if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + { + /* no more DIR_SEPARATORS left */ + break; + } + *p = '\0'; + } + else + { + lt_fatal (__FILE__, __LINE__, + "error accessing file \"%s\": %s", + tmp_pathspec, nonnull (strerror (errno))); + } + } + XFREE (tmp_pathspec); + + if (!has_symlinks) + { + return xstrdup (pathspec); + } + + tmp_pathspec = realpath (pathspec, buf); + if (tmp_pathspec == 0) + { + lt_fatal (__FILE__, __LINE__, + "could not follow symlinks for %s", pathspec); + } + return xstrdup (tmp_pathspec); +#endif +} + +char * +strendzap (char *str, const char *pat) +{ + size_t len, patlen; + + assert (str != NULL); + assert (pat != NULL); + + len = strlen (str); + patlen = strlen (pat); + + if (patlen <= len) + { + str += len - patlen; + if (STREQ (str, pat)) + *str = '\0'; + } + return str; +} + +void +lt_debugprintf (const char *file, int line, const char *fmt, ...) +{ + va_list args; + if (lt_debug) + { + (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); + va_start (args, fmt); + (void) vfprintf (stderr, fmt, args); + va_end (args); + } +} + +static void +lt_error_core (int exit_status, const char *file, + int line, const char *mode, + const char *message, va_list ap) +{ + fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); + vfprintf (stderr, message, ap); + fprintf (stderr, ".\n"); + + if (exit_status >= 0) + exit (exit_status); +} + +void +lt_fatal (const char *file, int line, const char *message, ...) +{ + va_list ap; + va_start (ap, message); + lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); + va_end (ap); +} + +static const char * +nonnull (const char *s) +{ + return s ? s : "(null)"; +} + +static const char * +nonempty (const char *s) +{ + return (s && !*s) ? "(empty)" : nonnull (s); +} + +void +lt_setenv (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_setenv) setting '%s' to '%s'\n", + nonnull (name), nonnull (value)); + { +#ifdef HAVE_SETENV + /* always make a copy, for consistency with !HAVE_SETENV */ + char *str = xstrdup (value); + setenv (name, str, 1); +#else + size_t len = strlen (name) + 1 + strlen (value) + 1; + char *str = XMALLOC (char, len); + sprintf (str, "%s=%s", name, value); + if (putenv (str) != EXIT_SUCCESS) + { + XFREE (str); + } +#endif + } +} + +char * +lt_extend_str (const char *orig_value, const char *add, int to_end) +{ + char *new_value; + if (orig_value && *orig_value) + { + size_t orig_value_len = strlen (orig_value); + size_t add_len = strlen (add); + new_value = XMALLOC (char, add_len + orig_value_len + 1); + if (to_end) + { + strcpy (new_value, orig_value); + strcpy (new_value + orig_value_len, add); + } + else + { + strcpy (new_value, add); + strcpy (new_value + add_len, orig_value); + } + } + else + { + new_value = xstrdup (add); + } + return new_value; +} + +void +lt_update_exe_path (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + /* some systems can't cope with a ':'-terminated path #' */ + size_t len = strlen (new_value); + while ((len > 0) && IS_PATH_SEPARATOR (new_value[len-1])) + { + new_value[--len] = '\0'; + } + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +void +lt_update_lib_path (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +EOF + case $host_os in + mingw* | windows*) + cat <<"EOF" + +/* Prepares an argument vector before calling spawn(). + Note that spawn() does not by itself call the command interpreter + (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : + ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + GetVersionEx(&v); + v.dwPlatformId == VER_PLATFORM_WIN32_NT; + }) ? "cmd.exe" : "command.com"). + Instead it simply concatenates the arguments, separated by ' ', and calls + CreateProcess(). We must quote the arguments since Win32 CreateProcess() + interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a + special way: + - Space and tab are interpreted as delimiters. They are not treated as + delimiters if they are surrounded by double quotes: "...". + - Unescaped double quotes are removed from the input. Their only effect is + that within double quotes, space and tab are treated like normal + characters. + - Backslashes not followed by double quotes are not special. + - But 2*n+1 backslashes followed by a double quote become + n backslashes followed by a double quote (n >= 0): + \" -> " + \\\" -> \" + \\\\\" -> \\" + */ +#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" +#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" +char ** +prepare_spawn (char **argv) +{ + size_t argc; + char **new_argv; + size_t i; + + /* Count number of arguments. */ + for (argc = 0; argv[argc] != NULL; argc++) + ; + + /* Allocate new argument vector. */ + new_argv = XMALLOC (char *, argc + 1); + + /* Put quoted arguments into the new argument vector. */ + for (i = 0; i < argc; i++) + { + const char *string = argv[i]; + + if (string[0] == '\0') + new_argv[i] = xstrdup ("\"\""); + else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) + { + int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); + size_t length; + unsigned int backslashes; + const char *s; + char *quoted_string; + char *p; + + length = 0; + backslashes = 0; + if (quote_around) + length++; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + length += backslashes + 1; + length++; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + length += backslashes + 1; + + quoted_string = XMALLOC (char, length + 1); + + p = quoted_string; + backslashes = 0; + if (quote_around) + *p++ = '"'; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + { + unsigned int j; + for (j = backslashes + 1; j > 0; j--) + *p++ = '\\'; + } + *p++ = c; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + { + unsigned int j; + for (j = backslashes; j > 0; j--) + *p++ = '\\'; + *p++ = '"'; + } + *p = '\0'; + + new_argv[i] = quoted_string; + } + else + new_argv[i] = (char *) string; + } + new_argv[argc] = NULL; + + return new_argv; +} +EOF + ;; + esac + + cat <<"EOF" +void lt_dump_script (FILE* f) +{ +EOF + func_emit_wrapper yes | + $SED -n -e ' +s/^\(.\{79\}\)\(..*\)/\1\ +\2/ +h +s/\([\\"]\)/\\\1/g +s/$/\\n/ +s/\([^\n]*\).*/ fputs ("\1", f);/p +g +D' + cat <<"EOF" +} +EOF +} +# end: func_emit_cwrapperexe_src + +# func_win32_import_lib_p ARG +# True if ARG is an import lib, as indicated by $file_magic_cmd +func_win32_import_lib_p () +{ + $debug_cmd + + case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in + *import*) : ;; + *) false ;; + esac +} + +# func_suncc_cstd_abi +# !!ONLY CALL THIS FOR SUN CC AFTER $compile_command IS FULLY EXPANDED!! +# Several compiler flags select an ABI that is incompatible with the +# Cstd library. Avoid specifying it if any are in CXXFLAGS. +func_suncc_cstd_abi () +{ + $debug_cmd + + case " $compile_command " in + *" -compat=g "*|*\ -std=c++[0-9][0-9]\ *|*" -library=stdcxx4 "*|*" -library=stlport4 "*) + suncc_use_cstd_abi=no + ;; + *) + suncc_use_cstd_abi=yes + ;; + esac +} + +# func_mode_link arg... +func_mode_link () +{ + $debug_cmd + + case $host in + *-*-cygwin* | *-*-mingw* | *-*-windows* | *-*-pw32* | *-*-os2* | *-cegcc*) + # It is impossible to link a dll without this setting, and + # we shouldn't force the makefile maintainer to figure out + # what system we are compiling for in order to pass an extra + # flag for every libtool invocation. + # allow_undefined=no + + # FIXME: Unfortunately, there are problems with the above when trying + # to make a dll that has undefined symbols, in which case not + # even a static library is built. For now, we need to specify + # -no-undefined on the libtool link line when we can be certain + # that all symbols are satisfied, otherwise we get a static library. + allow_undefined=yes + ;; + *) + allow_undefined=yes + ;; + esac + libtool_args=$nonopt + base_compile="$nonopt $@" + compile_command=$nonopt + finalize_command=$nonopt + + compile_rpath= + compile_rpath_tail= + finalize_rpath= + compile_shlibpath= + finalize_shlibpath= + convenience= + old_convenience= + deplibs= + old_deplibs= + compiler_flags= + linker_flags= + dllsearchpath= + lib_search_path=`pwd` + inst_prefix_dir= + new_inherited_linker_flags= + + avoid_version=no + bindir= + dlfiles= + dlprefiles= + dlself=no + export_dynamic=no + export_symbols= + export_symbols_regex= + generated= + libobjs= + ltlibs= + module=no + no_install=no + objs= + os2dllname= + non_pic_objects= + precious_files_regex= + prefer_static_libs=no + preload=false + prev= + prevarg= + release= + rpath= + xrpath= + perm_rpath= + temp_rpath= + temp_rpath_tail= + thread_safe=no + vinfo= + vinfo_number=no + weak_libs= + rpath_arg= + single_module=$wl-single_module + func_infer_tag $base_compile + + # We need to know -static, to get the right output filenames. + for arg + do + case $arg in + -shared) + test yes != "$build_libtool_libs" \ + && func_fatal_configuration "cannot build a shared library" + build_old_libs=no + break + ;; + -all-static | -static | -static-libtool-libs) + case $arg in + -all-static) + if test yes = "$build_libtool_libs" && test -z "$link_static_flag"; then + func_warning "complete static linking is impossible in this configuration" + fi + if test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + -static) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=built + ;; + -static-libtool-libs) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + esac + build_libtool_libs=no + build_old_libs=yes + break + ;; + esac + done + + # See if our shared archives depend on static archives. + test -n "$old_archive_from_new_cmds" && build_old_libs=yes + + # Go through the arguments, transforming them on the way. + while test "$#" -gt 0; do + arg=$1 + shift + func_quote_arg pretty,unquoted "$arg" + qarg=$func_quote_arg_unquoted_result + func_append libtool_args " $func_quote_arg_result" + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + output) + func_append compile_command " @OUTPUT@" + func_append finalize_command " @OUTPUT@" + ;; + esac + + case $prev in + bindir) + bindir=$arg + prev= + continue + ;; + dlfiles|dlprefiles) + $preload || { + # Add the symbol object into the linking commands. + func_append compile_command " @SYMFILE@" + func_append finalize_command " @SYMFILE@" + preload=: + } + case $arg in + *.la | *.lo) ;; # We handle these cases below. + force) + if test no = "$dlself"; then + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + self) + if test dlprefiles = "$prev"; then + dlself=yes + elif test dlfiles = "$prev" && test yes != "$dlopen_self"; then + dlself=yes + else + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + *) + if test dlfiles = "$prev"; then + func_append dlfiles " $arg" + else + func_append dlprefiles " $arg" + fi + prev= + continue + ;; + esac + ;; + expsyms) + export_symbols=$arg + test -f "$arg" \ + || func_fatal_error "symbol file '$arg' does not exist" + prev= + continue + ;; + expsyms_regex) + export_symbols_regex=$arg + prev= + continue + ;; + framework) + case $host in + *-*-darwin*) + case "$deplibs " in + *" $qarg.ltframework "*) ;; + *) func_append deplibs " $qarg.ltframework" # this is fixed later + ;; + esac + ;; + esac + prev= + continue + ;; + inst_prefix) + inst_prefix_dir=$arg + prev= + continue + ;; + mllvm) + # Clang does not use LLVM to link, so we can simply discard any + # '-mllvm $arg' options when doing the link step. + prev= + continue + ;; + objectlist) + if test -f "$arg"; then + save_arg=$arg + moreargs= + for fil in `cat "$save_arg"` + do +# func_append moreargs " $fil" + arg=$fil + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test none = "$pic_object" && + test none = "$non_pic_object"; then + func_fatal_error "cannot find name of object for '$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + if test none != "$pic_object"; then + # Prepend the subdirectory the object is found in. + pic_object=$xdir$pic_object + + if test dlfiles = "$prev"; then + if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then + func_append dlfiles " $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test dlprefiles = "$prev"; then + # Preload the old-style object. + func_append dlprefiles " $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg=$pic_object + fi + + # Non-PIC object. + if test none != "$non_pic_object"; then + # Prepend the subdirectory the object is found in. + non_pic_object=$xdir$non_pic_object + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test none = "$pic_object"; then + arg=$non_pic_object + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object=$pic_object + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "'$arg' is not a valid libtool object" + fi + fi + done + else + func_fatal_error "link input file '$arg' does not exist" + fi + arg=$save_arg + prev= + continue + ;; + os2dllname) + os2dllname=$arg + prev= + continue + ;; + precious_regex) + precious_files_regex=$arg + prev= + continue + ;; + release) + release=-$arg + prev= + continue + ;; + rpath | xrpath) + # We need an absolute path. + case $arg in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + func_fatal_error "argument to -rpath is not absolute: $arg" + ;; + esac + if test rpath = "$prev"; then + case "$rpath " in + *" $arg "*) ;; + *) func_append rpath " $arg" ;; + esac + else + case "$xrpath " in + *" $arg "*) ;; + *) func_append xrpath " $arg" ;; + esac + fi + prev= + continue + ;; + shrext) + shrext_cmds=$arg + prev= + continue + ;; + weak) + func_append weak_libs " $arg" + prev= + continue + ;; + xassembler) + func_append compiler_flags " -Xassembler $qarg" + prev= + func_append compile_command " -Xassembler $qarg" + func_append finalize_command " -Xassembler $qarg" + continue + ;; + xcclinker) + func_append linker_flags " $qarg" + func_append compiler_flags " $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xcompiler) + func_append compiler_flags " $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xlinker) + func_append linker_flags " $qarg" + func_append compiler_flags " $wl$qarg" + prev= + func_append compile_command " $wl$qarg" + func_append finalize_command " $wl$qarg" + continue + ;; + *) + eval "$prev=\"\$arg\"" + prev= + continue + ;; + esac + fi # test -n "$prev" + + prevarg=$arg + + case $arg in + -all-static) + if test -n "$link_static_flag"; then + # See comment for -static flag below, for more details. + func_append compile_command " $link_static_flag" + func_append finalize_command " $link_static_flag" + fi + continue + ;; + + -allow-undefined) + # FIXME: remove this flag sometime in the future. + func_fatal_error "'-allow-undefined' must not be used because it is the default" + ;; + + -avoid-version) + avoid_version=yes + continue + ;; + + -bindir) + prev=bindir + continue + ;; + + -dlopen) + prev=dlfiles + continue + ;; + + -dlpreopen) + prev=dlprefiles + continue + ;; + + -export-dynamic) + export_dynamic=yes + continue + ;; + + -export-symbols | -export-symbols-regex) + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + func_fatal_error "more than one -exported-symbols argument is not allowed" + fi + if test X-export-symbols = "X$arg"; then + prev=expsyms + else + prev=expsyms_regex + fi + continue + ;; + + -framework) + prev=framework + continue + ;; + + -inst-prefix-dir) + prev=inst_prefix + continue + ;; + + # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* + # so, if we see these flags be careful not to treat them like -L + -L[A-Z][A-Z]*:*) + case $with_gcc/$host in + no/*-*-irix* | /*-*-irix*) + func_append compile_command " $arg" + func_append finalize_command " $arg" + ;; + esac + continue + ;; + + -L*) + func_stripname "-L" '' "$arg" + if test -z "$func_stripname_result"; then + if test "$#" -gt 0; then + func_fatal_error "require no space between '-L' and '$1'" + else + func_fatal_error "need path for '-L' option" + fi + fi + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + absdir=`cd "$dir" && pwd` + test -z "$absdir" && \ + func_fatal_error "cannot determine absolute directory name of '$dir'" + dir=$absdir + ;; + esac + case "$deplibs " in + *" -L$dir "* | *" $arg "*) + # Will only happen for absolute or sysroot arguments + ;; + *) + # Preserve sysroot, but never include relative directories + case $dir in + [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; + *) func_append deplibs " -L$dir" ;; + esac + func_append lib_search_path " $dir" + ;; + esac + case $host in + *-*-cygwin* | *-*-mingw* | *-*-windows* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$dir:"*) ;; + ::) dllsearchpath=$dir;; + *) func_append dllsearchpath ":$dir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) func_append dllsearchpath ":$testbindir";; + esac + ;; + esac + continue + ;; + + -l*) + if test X-lc = "X$arg" || test X-lm = "X$arg"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-windows* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) + # These systems don't actually have a C or math library (as such) + continue + ;; + *-*-os2*) + # These systems don't actually have a C library (as such) + test X-lc = "X$arg" && continue + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-midnightbsd*) + # Do not include libc due to us having libc/libc_r. + test X-lc = "X$arg" && continue + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C and math libraries are in the System framework + func_append deplibs " System.ltframework" + continue + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + test X-lc = "X$arg" && continue + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + test X-lc = "X$arg" && continue + ;; + esac + elif test X-lc_r = "X$arg"; then + case $host in + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-midnightbsd*) + # Do not include libc_r directly, use -pthread flag. + continue + ;; + esac + fi + func_append deplibs " $arg" + continue + ;; + + -mllvm) + prev=mllvm + continue + ;; + + -module) + module=yes + continue + ;; + + # Tru64 UNIX uses -model [arg] to determine the layout of C++ + # classes, name mangling, and exception handling. + # Darwin uses the -arch flag to determine output architecture. + # -q

    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%0DIC>Z4J1rhj9a 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 z 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

    wV(_WV$PG-R^%N^+{lO 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 NKb&zGSO3cR{{zFmPRRfO literal 0 HcmV?d00001 diff --git a/local/recipes/libs/lcms2/source/plugins/fast_float/include/Makefile.am b/local/recipes/libs/lcms2/source/plugins/fast_float/include/Makefile.am new file mode 100644 index 0000000000..bcb9b793fe --- /dev/null +++ b/local/recipes/libs/lcms2/source/plugins/fast_float/include/Makefile.am @@ -0,0 +1,6 @@ +# +# Makefile for include directory + +include_HEADERS = lcms2_fast_float.h + +EXTRA_DIST = lcms2_fast_float.h diff --git a/local/recipes/libs/lcms2/source/plugins/fast_float/include/Makefile.in b/local/recipes/libs/lcms2/source/plugins/fast_float/include/Makefile.in new file mode 100644 index 0000000000..5f781841ce --- /dev/null +++ b/local/recipes/libs/lcms2/source/plugins/fast_float/include/Makefile.in @@ -0,0 +1,606 @@ +# Makefile.in generated by automake 1.18.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2025 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# +# Makefile for include directory + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +am__rm_f = rm -f $(am__rm_f_notfound) +am__rm_rf = rm -rf $(am__rm_f_notfound) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = plugins/fast_float/include +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_append_compile_flags.m4 \ + $(top_srcdir)/m4/ax_append_flag.m4 \ + $(top_srcdir)/m4/ax_check_compile_flag.m4 \ + $(top_srcdir)/m4/ax_gcc_func_attribute.m4 \ + $(top_srcdir)/m4/ax_pthread.m4 \ + $(top_srcdir)/m4/ax_require_defined.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(include_HEADERS) \ + $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && echo $$files | $(am__xargs_n) 40 $(am__rm_f); }; \ + } +am__installdirs = "$(DESTDIR)$(includedir)" +HEADERS = $(include_HEADERS) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +am__DIST_COMMON = $(srcdir)/Makefile.in +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ETAGS = @ETAGS@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FILECMD = @FILECMD@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +JPEGICC_DEPLIBS = @JPEGICC_DEPLIBS@ +LCMS_LIB_DEPLIBS = @LCMS_LIB_DEPLIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBRARY_AGE = @LIBRARY_AGE@ +LIBRARY_CURRENT = @LIBRARY_CURRENT@ +LIBRARY_REVISION = @LIBRARY_REVISION@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_DEPS = @LIBTOOL_DEPS@ +LIB_JPEG = @LIB_JPEG@ +LIB_MATH = @LIB_MATH@ +LIB_PLUGINS = @LIB_PLUGINS@ +LIB_THREAD = @LIB_THREAD@ +LIB_TIFF = @LIB_TIFF@ +LIB_ZLIB = @LIB_ZLIB@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_CXX = @PTHREAD_CXX@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +TIFFICC_DEPLIBS = @TIFFICC_DEPLIBS@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__rm_f_notfound = @am__rm_f_notfound@ +am__tar = @am__tar@ +am__untar = @am__untar@ +am__xargs_n = @am__xargs_n@ +ax_pthread_config = @ax_pthread_config@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +inline = @inline@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +include_HEADERS = lcms2_fast_float.h +EXTRA_DIST = lcms2_fast_float.h +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign plugins/fast_float/include/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign plugins/fast_float/include/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-includeHEADERS: $(include_HEADERS) + @$(NORMAL_INSTALL) + @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \ + done + +uninstall-includeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(includedir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -$(am__rm_f) $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || $(am__rm_f) $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-includeHEADERS + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-includeHEADERS + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool cscopelist-am ctags ctags-am distclean \ + distclean-generic distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-includeHEADERS install-info install-info-am \ + install-man install-pdf install-pdf-am install-ps \ + install-ps-am install-strip installcheck installcheck-am \ + installdirs maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ + ps ps-am tags tags-am uninstall uninstall-am \ + uninstall-includeHEADERS + +.PRECIOUS: Makefile + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: + +# Tell GNU make to disable its built-in pattern rules. +%:: %,v +%:: RCS/%,v +%:: RCS/% +%:: s.% +%:: SCCS/s.% diff --git a/local/recipes/libs/lcms2/source/plugins/fast_float/include/lcms2_fast_float.h b/local/recipes/libs/lcms2/source/plugins/fast_float/include/lcms2_fast_float.h new file mode 100644 index 0000000000..e9d9b4b916 --- /dev/null +++ b/local/recipes/libs/lcms2/source/plugins/fast_float/include/lcms2_fast_float.h @@ -0,0 +1,150 @@ +//--------------------------------------------------------------------------------- +// +// Little Color Management System, fast floating point extensions +// Copyright (c) 1998-2026 Marti Maria Saguer, all rights reserved +// +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +//--------------------------------------------------------------------------------- + +#ifndef _LCMS2_FAST_FLOAT_H +#define _LCMS2_FAST_FLOAT_H + +#include "lcms2_plugin.h" + +#ifndef CMS_USE_CPP_API +# ifdef __cplusplus +extern "C" { +# endif +#endif + +#define LCMS2_FAST_FLOAT_VERSION LCMS_VERSION + +// Configuration toggles + +// Uncomment this if you want to avoid SSE2 entirely. +// Default is commented out. There are two kernels, one is vectorized and the other is not. +// On initialization, there is a SSE2 detection. If the SSE2 detection succeeds, then the vectorized code is selected. +// If the CPU is old and does not support SSE2, then the non-vectorized code is used. +// If you define the toggle, there is no detection and the non-vectorized kernel is always used. + +// #define CMS_DONT_USE_SSE2 1 + + +// The one and only plug-in entry point. To install this plugin in your code +// you need to place this in some initialization place: +// +// cmsPlugin(cmsFastFloatExtensions()); +// + +CMSAPI void* CMSEXPORT cmsFastFloatExtensions(void); + + +// New encodings that the plug-in implements + +#define BIT15_SH(a) ((a) << 26) +#define T_BIT15(a) (((a)>>26)&1) +#define DITHER_SH(a) ((a) << 27) +#define T_DITHER(a) (((a)>>27)&1) + +#define TYPE_GRAY_15 (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(2)|BIT15_SH(1)) +#define TYPE_GRAY_15_REV (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(2)|FLAVOR_SH(1)|BIT15_SH(1)) +#define TYPE_GRAY_15_SE (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(2)|ENDIAN16_SH(1)|BIT15_SH(1)) +#define TYPE_GRAYA_15 (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(2)|BIT15_SH(1)) +#define TYPE_GRAYA_15_SE (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(2)|ENDIAN16_SH(1)|BIT15_SH(1)) +#define TYPE_GRAYA_15_PLANAR (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(2)|PLANAR_SH(1)|BIT15_SH(1)) + +#define TYPE_RGB_15 (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|BIT15_SH(1)) +#define TYPE_RGB_15_PLANAR (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1)|BIT15_SH(1)) +#define TYPE_RGB_15_SE (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1)|BIT15_SH(1)) + +#define TYPE_BGR_15 (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|BIT15_SH(1)) +#define TYPE_BGR_15_PLANAR (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|PLANAR_SH(1)|BIT15_SH(1)) +#define TYPE_BGR_15_SE (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1)|BIT15_SH(1)) + +#define TYPE_RGBA_15 (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|BIT15_SH(1)) +#define TYPE_RGBA_15_PLANAR (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1)|BIT15_SH(1)) +#define TYPE_RGBA_15_SE (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1)|BIT15_SH(1)) + +#define TYPE_ARGB_15 (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|SWAPFIRST_SH(1)|BIT15_SH(1)) + +#define TYPE_ABGR_15 (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|BIT15_SH(1)) +#define TYPE_ABGR_15_PLANAR (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|PLANAR_SH(1)|BIT15_SH(1)) +#define TYPE_ABGR_15_SE (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1)|BIT15_SH(1)) + +#define TYPE_BGRA_15 (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|SWAPFIRST_SH(1)|BIT15_SH(1)) +#define TYPE_BGRA_15_SE (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1)|BIT15_SH(1)) + +#define TYPE_CMY_15 (COLORSPACE_SH(PT_CMY)|CHANNELS_SH(3)|BYTES_SH(2)|BIT15_SH(1)) +#define TYPE_YMC_15 (COLORSPACE_SH(PT_CMY)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|BIT15_SH(1)) +#define TYPE_CMY_15_PLANAR (COLORSPACE_SH(PT_CMY)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1)|BIT15_SH(1)) +#define TYPE_CMY_15_SE (COLORSPACE_SH(PT_CMY)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1)|BIT15_SH(1)) + +#define TYPE_CMYK_15 (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|BIT15_SH(1)) +#define TYPE_CMYK_15_REV (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|FLAVOR_SH(1)|BIT15_SH(1)) +#define TYPE_CMYK_15_PLANAR (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|PLANAR_SH(1)|BIT15_SH(1)) +#define TYPE_CMYK_15_SE (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|ENDIAN16_SH(1)|BIT15_SH(1)) + +#define TYPE_KYMC_15 (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|DOSWAP_SH(1)|BIT15_SH(1)) +#define TYPE_KYMC_15_SE (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1)|BIT15_SH(1)) + +#define TYPE_KCMY_15 (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|SWAPFIRST_SH(1)|BIT15_SH(1)) +#define TYPE_KCMY_15_REV (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|FLAVOR_SH(1)|SWAPFIRST_SH(1)|BIT15_SH(1)) +#define TYPE_KCMY_15_SE (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|ENDIAN16_SH(1)|SWAPFIRST_SH(1)|BIT15_SH(1)) + +#define TYPE_GRAY_8_DITHER (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(1)|DITHER_SH(1)) +#define TYPE_RGB_8_DITHER (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(1)|DITHER_SH(1)) +#define TYPE_RGBA_8_DITHER (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1)|DITHER_SH(1)) +#define TYPE_BGR_8_DITHER (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|DITHER_SH(1)) +#define TYPE_ABGR_8_DITHER (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|EXTRA_SH(1)|DITHER_SH(1)) +#define TYPE_CMYK_8_DITHER (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1)|DITHER_SH(1)) +#define TYPE_KYMC_8_DITHER (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1)|DOSWAP_SH(1)|DITHER_SH(1)) + + +#define TYPE_AGRAY_8 (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|DOSWAP_SH(1)|BYTES_SH(1)) +#define TYPE_AGRAY_16 (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|DOSWAP_SH(1)|BYTES_SH(2)) +#define TYPE_AGRAY_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|DOSWAP_SH(1)|BYTES_SH(4)) +#define TYPE_AGRAY_DBL (FLOAT_SH(1)|COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|DOSWAP_SH(1)|BYTES_SH(0)) + +#define TYPE_ACMYK_8 (COLORSPACE_SH(PT_CMYK)|EXTRA_SH(1)|CHANNELS_SH(4)|BYTES_SH(1)|SWAPFIRST_SH(1)) +#define TYPE_KYMCA_8 (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|EXTRA_SH(1)|BYTES_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1)) +#define TYPE_AKYMC_8 (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|EXTRA_SH(1)|BYTES_SH(1)|DOSWAP_SH(1)) + +#define TYPE_CMYKA_16 (COLORSPACE_SH(PT_CMYK)|EXTRA_SH(1)|CHANNELS_SH(4)|BYTES_SH(2)) +#define TYPE_ACMYK_16 (COLORSPACE_SH(PT_CMYK)|EXTRA_SH(1)|CHANNELS_SH(4)|BYTES_SH(2)|SWAPFIRST_SH(1)) +#define TYPE_KYMCA_16 (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|EXTRA_SH(1)|BYTES_SH(2)|DOSWAP_SH(1)|SWAPFIRST_SH(1)) +#define TYPE_AKYMC_16 (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|EXTRA_SH(1)|BYTES_SH(2)|DOSWAP_SH(1)) + + +#define TYPE_AGRAY_8_PLANAR (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(1)|PLANAR_SH(1)|SWAPFIRST_SH(1)) +#define TYPE_AGRAY_16_PLANAR (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(2)|PLANAR_SH(1)|SWAPFIRST_SH(1)) + +#define TYPE_GRAYA_FLT_PLANAR (FLOAT_SH(1)|COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(4)|PLANAR_SH(1)) +#define TYPE_AGRAY_FLT_PLANAR (FLOAT_SH(1)|COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(4)|PLANAR_SH(1)|SWAPFIRST_SH(1)) + +#define TYPE_GRAYA_DBL_PLANAR (FLOAT_SH(1)|COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(0)|PLANAR_SH(1)) +#define TYPE_AGRAY_DBL_PLANAR (FLOAT_SH(1)|COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(0)|PLANAR_SH(1)|SWAPFIRST_SH(1)) + +#define TYPE_ARGB_16_PLANAR (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|SWAPFIRST_SH(1)|PLANAR_SH(1)) +#define TYPE_BGRA_16_PLANAR (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|SWAPFIRST_SH(1)|DOSWAP_SH(1)|PLANAR_SH(1)) + +#ifndef CMS_USE_CPP_API +# ifdef __cplusplus + } +# endif +#endif + +#endif + diff --git a/local/recipes/libs/lcms2/source/plugins/fast_float/include/meson.build b/local/recipes/libs/lcms2/source/plugins/fast_float/include/meson.build new file mode 100644 index 0000000000..4527b4ad62 --- /dev/null +++ b/local/recipes/libs/lcms2/source/plugins/fast_float/include/meson.build @@ -0,0 +1 @@ +install_headers('lcms2_fast_float.h') diff --git a/local/recipes/libs/lcms2/source/plugins/fast_float/meson.build b/local/recipes/libs/lcms2/source/plugins/fast_float/meson.build new file mode 100644 index 0000000000..8f0114e963 --- /dev/null +++ b/local/recipes/libs/lcms2/source/plugins/fast_float/meson.build @@ -0,0 +1,3 @@ +subdir('include') +subdir('src') +subdir('testbed') diff --git a/local/recipes/libs/lcms2/source/plugins/fast_float/src/Makefile.am b/local/recipes/libs/lcms2/source/plugins/fast_float/src/Makefile.am new file mode 100644 index 0000000000..ec37310006 --- /dev/null +++ b/local/recipes/libs/lcms2/source/plugins/fast_float/src/Makefile.am @@ -0,0 +1,27 @@ +# +# Makefile for building lcms2_fast_float library +# + +# Don't require all the GNU mandated files +AUTOMAKE_OPTIONS = 1.7 foreign + +includedir = ${prefix}/include + +# Shared libraries built in this directory +lib_LTLIBRARIES = liblcms2_fast_float.la + +LIBRARY_CURRENT = @LIBRARY_CURRENT@ +LIBRARY_REVISION = @LIBRARY_REVISION@ +LIBRARY_AGE = @LIBRARY_AGE@ + +AM_CPPFLAGS = -Ofast -I$(top_builddir)/include -I$(top_srcdir)/include -I$(srcdir)/../include -I$(builddir)/../include + +liblcms2_fast_float_la_LDFLAGS = -no-undefined \ + -version-info $(LIBRARY_CURRENT):$(LIBRARY_REVISION):$(LIBRARY_AGE) + +liblcms2_fast_float_la_LIBADD = $(LCMS_LIB_DEPLIBS) $(top_builddir)/src/liblcms2.la + +liblcms2_fast_float_la_SOURCES = fast_8_curves.c fast_8_matsh_sse.c fast_8_matsh.c fast_8_tethra.c \ + fast_16_tethra.c fast_float_15bits.c fast_float_15mats.c fast_float_cmyk.c fast_float_curves.c fast_float_matsh.c \ + fast_float_separate.c fast_float_sup.c fast_float_tethra.c fast_float_lab.c fast_float_internal.h + diff --git a/local/recipes/libs/lcms2/source/plugins/fast_float/src/Makefile.in b/local/recipes/libs/lcms2/source/plugins/fast_float/src/Makefile.in new file mode 100644 index 0000000000..bb685d3171 --- /dev/null +++ b/local/recipes/libs/lcms2/source/plugins/fast_float/src/Makefile.in @@ -0,0 +1,769 @@ +# Makefile.in generated by automake 1.18.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2025 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# +# Makefile for building lcms2_fast_float library +# + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +am__rm_f = rm -f $(am__rm_f_notfound) +am__rm_rf = rm -rf $(am__rm_f_notfound) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = plugins/fast_float/src +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_append_compile_flags.m4 \ + $(top_srcdir)/m4/ax_append_flag.m4 \ + $(top_srcdir)/m4/ax_check_compile_flag.m4 \ + $(top_srcdir)/m4/ax_gcc_func_attribute.m4 \ + $(top_srcdir)/m4/ax_pthread.m4 \ + $(top_srcdir)/m4/ax_require_defined.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && echo $$files | $(am__xargs_n) 40 $(am__rm_f); }; \ + } +am__installdirs = "$(DESTDIR)$(libdir)" +LTLIBRARIES = $(lib_LTLIBRARIES) +am__DEPENDENCIES_1 = +liblcms2_fast_float_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(top_builddir)/src/liblcms2.la +am_liblcms2_fast_float_la_OBJECTS = fast_8_curves.lo \ + fast_8_matsh_sse.lo fast_8_matsh.lo fast_8_tethra.lo \ + fast_16_tethra.lo fast_float_15bits.lo fast_float_15mats.lo \ + fast_float_cmyk.lo fast_float_curves.lo fast_float_matsh.lo \ + fast_float_separate.lo fast_float_sup.lo fast_float_tethra.lo \ + fast_float_lab.lo +liblcms2_fast_float_la_OBJECTS = $(am_liblcms2_fast_float_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +liblcms2_fast_float_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(liblcms2_fast_float_la_LDFLAGS) \ + $(LDFLAGS) -o $@ +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = ./$(DEPDIR)/fast_16_tethra.Plo \ + ./$(DEPDIR)/fast_8_curves.Plo ./$(DEPDIR)/fast_8_matsh.Plo \ + ./$(DEPDIR)/fast_8_matsh_sse.Plo ./$(DEPDIR)/fast_8_tethra.Plo \ + ./$(DEPDIR)/fast_float_15bits.Plo \ + ./$(DEPDIR)/fast_float_15mats.Plo \ + ./$(DEPDIR)/fast_float_cmyk.Plo \ + ./$(DEPDIR)/fast_float_curves.Plo \ + ./$(DEPDIR)/fast_float_lab.Plo \ + ./$(DEPDIR)/fast_float_matsh.Plo \ + ./$(DEPDIR)/fast_float_separate.Plo \ + ./$(DEPDIR)/fast_float_sup.Plo \ + ./$(DEPDIR)/fast_float_tethra.Plo +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(liblcms2_fast_float_la_SOURCES) +DIST_SOURCES = $(liblcms2_fast_float_la_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ETAGS = @ETAGS@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FILECMD = @FILECMD@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +JPEGICC_DEPLIBS = @JPEGICC_DEPLIBS@ +LCMS_LIB_DEPLIBS = @LCMS_LIB_DEPLIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBRARY_AGE = @LIBRARY_AGE@ +LIBRARY_CURRENT = @LIBRARY_CURRENT@ +LIBRARY_REVISION = @LIBRARY_REVISION@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_DEPS = @LIBTOOL_DEPS@ +LIB_JPEG = @LIB_JPEG@ +LIB_MATH = @LIB_MATH@ +LIB_PLUGINS = @LIB_PLUGINS@ +LIB_THREAD = @LIB_THREAD@ +LIB_TIFF = @LIB_TIFF@ +LIB_ZLIB = @LIB_ZLIB@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_CXX = @PTHREAD_CXX@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +TIFFICC_DEPLIBS = @TIFFICC_DEPLIBS@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__rm_f_notfound = @am__rm_f_notfound@ +am__tar = @am__tar@ +am__untar = @am__untar@ +am__xargs_n = @am__xargs_n@ +ax_pthread_config = @ax_pthread_config@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = ${prefix}/include +infodir = @infodir@ +inline = @inline@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +# Don't require all the GNU mandated files +AUTOMAKE_OPTIONS = 1.7 foreign + +# Shared libraries built in this directory +lib_LTLIBRARIES = liblcms2_fast_float.la +AM_CPPFLAGS = -Ofast -I$(top_builddir)/include -I$(top_srcdir)/include -I$(srcdir)/../include -I$(builddir)/../include +liblcms2_fast_float_la_LDFLAGS = -no-undefined \ + -version-info $(LIBRARY_CURRENT):$(LIBRARY_REVISION):$(LIBRARY_AGE) + +liblcms2_fast_float_la_LIBADD = $(LCMS_LIB_DEPLIBS) $(top_builddir)/src/liblcms2.la +liblcms2_fast_float_la_SOURCES = fast_8_curves.c fast_8_matsh_sse.c fast_8_matsh.c fast_8_tethra.c \ + fast_16_tethra.c fast_float_15bits.c fast_float_15mats.c fast_float_cmyk.c fast_float_curves.c fast_float_matsh.c \ + fast_float_separate.c fast_float_sup.c fast_float_tethra.c fast_float_lab.c fast_float_internal.h + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign plugins/fast_float/src/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign plugins/fast_float/src/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +install-libLTLIBRARIES: $(lib_LTLIBRARIES) + @$(NORMAL_INSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ + } + +uninstall-libLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ + done + +clean-libLTLIBRARIES: + -$(am__rm_f) $(lib_LTLIBRARIES) + @list='$(lib_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + echo rm -f $${locs}; \ + $(am__rm_f) $${locs} + +liblcms2_fast_float.la: $(liblcms2_fast_float_la_OBJECTS) $(liblcms2_fast_float_la_DEPENDENCIES) $(EXTRA_liblcms2_fast_float_la_DEPENDENCIES) + $(AM_V_CCLD)$(liblcms2_fast_float_la_LINK) -rpath $(libdir) $(liblcms2_fast_float_la_OBJECTS) $(liblcms2_fast_float_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fast_16_tethra.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fast_8_curves.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fast_8_matsh.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fast_8_matsh_sse.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fast_8_tethra.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fast_float_15bits.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fast_float_15mats.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fast_float_cmyk.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fast_float_curves.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fast_float_lab.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fast_float_matsh.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fast_float_separate.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fast_float_sup.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fast_float_tethra.Plo@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @: >>$@ + +am--depfiles: $(am__depfiles_remade) + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(libdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -$(am__rm_f) $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || $(am__rm_f) $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ + mostlyclean-am + +distclean: distclean-am + -rm -f ./$(DEPDIR)/fast_16_tethra.Plo + -rm -f ./$(DEPDIR)/fast_8_curves.Plo + -rm -f ./$(DEPDIR)/fast_8_matsh.Plo + -rm -f ./$(DEPDIR)/fast_8_matsh_sse.Plo + -rm -f ./$(DEPDIR)/fast_8_tethra.Plo + -rm -f ./$(DEPDIR)/fast_float_15bits.Plo + -rm -f ./$(DEPDIR)/fast_float_15mats.Plo + -rm -f ./$(DEPDIR)/fast_float_cmyk.Plo + -rm -f ./$(DEPDIR)/fast_float_curves.Plo + -rm -f ./$(DEPDIR)/fast_float_lab.Plo + -rm -f ./$(DEPDIR)/fast_float_matsh.Plo + -rm -f ./$(DEPDIR)/fast_float_separate.Plo + -rm -f ./$(DEPDIR)/fast_float_sup.Plo + -rm -f ./$(DEPDIR)/fast_float_tethra.Plo + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-libLTLIBRARIES + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f ./$(DEPDIR)/fast_16_tethra.Plo + -rm -f ./$(DEPDIR)/fast_8_curves.Plo + -rm -f ./$(DEPDIR)/fast_8_matsh.Plo + -rm -f ./$(DEPDIR)/fast_8_matsh_sse.Plo + -rm -f ./$(DEPDIR)/fast_8_tethra.Plo + -rm -f ./$(DEPDIR)/fast_float_15bits.Plo + -rm -f ./$(DEPDIR)/fast_float_15mats.Plo + -rm -f ./$(DEPDIR)/fast_float_cmyk.Plo + -rm -f ./$(DEPDIR)/fast_float_curves.Plo + -rm -f ./$(DEPDIR)/fast_float_lab.Plo + -rm -f ./$(DEPDIR)/fast_float_matsh.Plo + -rm -f ./$(DEPDIR)/fast_float_separate.Plo + -rm -f ./$(DEPDIR)/fast_float_sup.Plo + -rm -f ./$(DEPDIR)/fast_float_tethra.Plo + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-libLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ + clean-generic clean-libLTLIBRARIES clean-libtool cscopelist-am \ + ctags ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-libLTLIBRARIES install-man install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am uninstall-libLTLIBRARIES + +.PRECIOUS: Makefile + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: + +# Tell GNU make to disable its built-in pattern rules. +%:: %,v +%:: RCS/%,v +%:: RCS/% +%:: s.% +%:: SCCS/s.% diff --git a/local/recipes/libs/lcms2/source/plugins/fast_float/src/fast_16_tethra.c b/local/recipes/libs/lcms2/source/plugins/fast_float/src/fast_16_tethra.c new file mode 100644 index 0000000000..cac85b697f --- /dev/null +++ b/local/recipes/libs/lcms2/source/plugins/fast_float/src/fast_16_tethra.c @@ -0,0 +1,385 @@ +//--------------------------------------------------------------------------------- +// +// Little Color Management System, fast floating point extensions +// Copyright (c) 1998-2026 Marti Maria Saguer, all rights reserved +// +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +//--------------------------------------------------------------------------------- + +#include "fast_float_internal.h" + +// lcms internal +CMSAPI cmsBool CMSEXPORT _cmsOptimizePipeline(cmsContext ContextID, + cmsPipeline** Lut, + cmsUInt32Number Intent, + cmsUInt32Number* InputFormat, + cmsUInt32Number* OutputFormat, + cmsUInt32Number* dwFlags); + + +// Optimization for 16 bits, 3 inputs only +typedef struct { + + cmsContext ContextID; + + const cmsInterpParams* p; // Tetrahedrical interpolation parameters. This is a not-owned pointer. + +} Performance16Data; + + +// Precomputes tables for 16-bit on input devicelink. +static +Performance16Data* Performance16alloc(cmsContext ContextID, const cmsInterpParams* p) +{ + Performance16Data* p16; + + p16 = (Performance16Data*) _cmsMallocZero(ContextID, sizeof(Performance16Data)); + if (p16 == NULL) return NULL; + + p16 ->ContextID = ContextID; + p16 ->p = p; + + return p16; +} + +static +void Performance16free(cmsContext ContextID, void* ptr) +{ + _cmsFree(ContextID, ptr); +} + +/** +* Because cmsChangeBuffersFormat, we have to allow this code to output data in either 8 or 16 bits. +* The increments are already computed correctly, but the data may change. So, we use a macro to +* increase xput +*/ +#define TO_OUTPUT_16(d,v) do { *(cmsUInt16Number*) (d) = v; } while(0) +#define TO_OUTPUT_8(d,v) do { *(cmsUInt8Number*) (d) = FROM_16_TO_8(v); } while(0) + +#define TO_OUTPUT(d,v) do { if (out16) TO_OUTPUT_16(d,v); else TO_OUTPUT_8(d,v); } while(0) + +#define FROM_INPUT(v) (in16 ? (*((const cmsUInt16Number*)(v))) : FROM_8_TO_16(*((const cmsUInt8Number*)(v)))) + +static +void PerformanceEval16(struct _cmstransform_struct *CMMcargo, + const void* Input, + void* Output, + cmsUInt32Number PixelsPerLine, + cmsUInt32Number LineCount, + const cmsStride* Stride) +{ + + cmsUInt16Number r, g, b; + int x0, y0, z0; + cmsS15Fixed16Number rx, ry, rz; + cmsS15Fixed16Number fx, fy, fz; + cmsS15Fixed16Number c0, c1, c2, c3, Rest; + cmsUInt32Number OutChan, TotalPlusAlpha; + cmsS15Fixed16Number X0, X1, Y0, Y1, Z0, Z1; + Performance16Data* p16 = (Performance16Data*)_cmsGetTransformUserData(CMMcargo); + const cmsInterpParams* p = p16->p; + cmsUInt32Number TotalOut = p->nOutputs; + const cmsUInt16Number* BaseTable = (const cmsUInt16Number*)p->Table; + const cmsUInt16Number* LutTable; + + cmsUInt8Number* out[cmsMAXCHANNELS]; + cmsUInt16Number res16; + + cmsUInt32Number i, ii; + + cmsUInt32Number SourceStartingOrder[cmsMAXCHANNELS]; + cmsUInt32Number SourceIncrements[cmsMAXCHANNELS]; + cmsUInt32Number DestStartingOrder[cmsMAXCHANNELS]; + cmsUInt32Number DestIncrements[cmsMAXCHANNELS]; + + const cmsUInt8Number* rin; + const cmsUInt8Number* gin; + const cmsUInt8Number* bin; + const cmsUInt8Number* ain = NULL; + + int in16, out16; // Used by macros! + + cmsUInt32Number nalpha; + size_t strideIn, strideOut; + + cmsUInt32Number dwInFormat = cmsGetTransformInputFormat((cmsHTRANSFORM)CMMcargo); + cmsUInt32Number dwOutFormat = cmsGetTransformOutputFormat((cmsHTRANSFORM)CMMcargo); + + _cmsComputeComponentIncrements(dwInFormat, Stride->BytesPerPlaneIn, NULL, &nalpha, SourceStartingOrder, SourceIncrements); + _cmsComputeComponentIncrements(dwOutFormat, Stride->BytesPerPlaneOut, NULL, &nalpha, DestStartingOrder, DestIncrements); + + in16 = (T_BYTES(dwInFormat) == 2); + out16 = (T_BYTES(dwOutFormat) == 2); + + if (!(_cmsGetTransformFlags((cmsHTRANSFORM)CMMcargo) & cmsFLAGS_COPY_ALPHA)) + nalpha = 0; + + strideIn = strideOut = 0; + for (i = 0; i < LineCount; i++) { + + rin = (const cmsUInt8Number*)Input + SourceStartingOrder[0] + strideIn; + gin = (const cmsUInt8Number*)Input + SourceStartingOrder[1] + strideIn; + bin = (const cmsUInt8Number*)Input + SourceStartingOrder[2] + strideIn; + if (nalpha) + ain = (const cmsUInt8Number*)Input + SourceStartingOrder[3] + strideIn; + + TotalPlusAlpha = TotalOut; + if (ain) TotalPlusAlpha++; + + for (OutChan = 0; OutChan < TotalPlusAlpha; OutChan++) { + out[OutChan] = (cmsUInt8Number*)Output + DestStartingOrder[OutChan] + strideOut; + } + + + for (ii = 0; ii < PixelsPerLine; ii++) { + + r = FROM_INPUT(rin); + g = FROM_INPUT(gin); + b = FROM_INPUT(bin); + + rin += SourceIncrements[0]; + gin += SourceIncrements[1]; + bin += SourceIncrements[2]; + + fx = _cmsToFixedDomain((int)r * p->Domain[0]); + fy = _cmsToFixedDomain((int)g * p->Domain[1]); + fz = _cmsToFixedDomain((int)b * p->Domain[2]); + + x0 = FIXED_TO_INT(fx); + y0 = FIXED_TO_INT(fy); + z0 = FIXED_TO_INT(fz); + + rx = FIXED_REST_TO_INT(fx); + ry = FIXED_REST_TO_INT(fy); + rz = FIXED_REST_TO_INT(fz); + + X0 = p->opta[2] * x0; + X1 = (r == 0xFFFFU ? 0 : p->opta[2]); + + Y0 = p->opta[1] * y0; + Y1 = (g == 0xFFFFU ? 0 : p->opta[1]); + + Z0 = p->opta[0] * z0; + Z1 = (b == 0xFFFFU ? 0 : p->opta[0]); + + + LutTable = &BaseTable[X0 + Y0 + Z0]; + + // Output should be computed as x = ROUND_FIXED_TO_INT(_cmsToFixedDomain(Rest)) + // which expands as: x = (Rest + ((Rest+0x7fff)/0xFFFF) + 0x8000)>>16 + // This can be replaced by: t = Rest+0x8001, x = (t + (t>>16))>>16 + // at the cost of being off by one at 7fff and 17ffe. + + if (rx >= ry) { + if (ry >= rz) { + Y1 += X1; + Z1 += Y1; + for (OutChan = 0; OutChan < TotalOut; OutChan++) { + c1 = LutTable[X1]; + c2 = LutTable[Y1]; + c3 = LutTable[Z1]; + c0 = *LutTable++; + c3 -= c2; + c2 -= c1; + c1 -= c0; + Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001; + res16 = (cmsUInt16Number)c0 + ((Rest + (Rest >> 16)) >> 16); + TO_OUTPUT(out[OutChan], res16); + out[OutChan] += DestIncrements[OutChan]; + } + } + else if (rz >= rx) { + X1 += Z1; + Y1 += X1; + for (OutChan = 0; OutChan < TotalOut; OutChan++) { + c1 = LutTable[X1]; + c2 = LutTable[Y1]; + c3 = LutTable[Z1]; + c0 = *LutTable++; + c2 -= c1; + c1 -= c3; + c3 -= c0; + Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001; + res16 = (cmsUInt16Number)c0 + ((Rest + (Rest >> 16)) >> 16); + TO_OUTPUT(out[OutChan], res16); + out[OutChan] += DestIncrements[OutChan]; + } + } + else { + Z1 += X1; + Y1 += Z1; + for (OutChan = 0; OutChan < TotalOut; OutChan++) { + c1 = LutTable[X1]; + c2 = LutTable[Y1]; + c3 = LutTable[Z1]; + c0 = *LutTable++; + c2 -= c3; + c3 -= c1; + c1 -= c0; + Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001; + res16 = (cmsUInt16Number)c0 + ((Rest + (Rest >> 16)) >> 16); + TO_OUTPUT(out[OutChan], res16); + out[OutChan] += DestIncrements[OutChan]; + } + } + } + else { + if (rx >= rz) { + X1 += Y1; + Z1 += X1; + for (OutChan = 0; OutChan < TotalOut; OutChan++) { + c1 = LutTable[X1]; + c2 = LutTable[Y1]; + c3 = LutTable[Z1]; + c0 = *LutTable++; + c3 -= c1; + c1 -= c2; + c2 -= c0; + Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001; + res16 = (cmsUInt16Number)c0 + ((Rest + (Rest >> 16)) >> 16); + TO_OUTPUT(out[OutChan], res16); + out[OutChan] += DestIncrements[OutChan]; + } + } + else if (ry >= rz) { + Z1 += Y1; + X1 += Z1; + for (OutChan = 0; OutChan < TotalOut; OutChan++) { + c1 = LutTable[X1]; + c2 = LutTable[Y1]; + c3 = LutTable[Z1]; + c0 = *LutTable++; + c1 -= c3; + c3 -= c2; + c2 -= c0; + Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001; + res16 = (cmsUInt16Number)c0 + ((Rest + (Rest >> 16)) >> 16); + TO_OUTPUT(out[OutChan], res16); + out[OutChan] += DestIncrements[OutChan]; + } + } + else { + Y1 += Z1; + X1 += Y1; + for (OutChan = 0; OutChan < TotalOut; OutChan++) { + c1 = LutTable[X1]; + c2 = LutTable[Y1]; + c3 = LutTable[Z1]; + c0 = *LutTable++; + c1 -= c2; + c2 -= c3; + c3 -= c0; + Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001; + res16 = (cmsUInt16Number)c0 + ((Rest + (Rest >> 16)) >> 16); + TO_OUTPUT(out[OutChan], res16); + out[OutChan] += DestIncrements[OutChan]; + } + } + } + + if (ain) + { + res16 = *(const cmsUInt16Number*)ain; + TO_OUTPUT(out[TotalOut], res16); + ain += SourceIncrements[3]; + out[TotalOut] += DestIncrements[TotalOut]; + } + + } + + strideIn += Stride->BytesPerLineIn; + strideOut += Stride->BytesPerLineOut; + } +} + +#undef DENS + + + +// -------------------------------------------------------------------------------------------------------------- + +cmsBool Optimize16BitRGBTransform(_cmsTransform2Fn* TransformFn, + void** UserData, + _cmsFreeUserDataFn* FreeDataFn, + cmsPipeline** Lut, + cmsUInt32Number* InputFormat, + cmsUInt32Number* OutputFormat, + cmsUInt32Number* dwFlags) +{ + Performance16Data* p16; + cmsContext ContextID; + _cmsStageCLutData* data; + cmsUInt32Number newFlags; + cmsStage* OptimizedCLUTmpe; + + + // For empty transforms, do nothing + if (*Lut == NULL) return FALSE; + + // This is a lossy optimization! does not apply in floating-point cases + if (T_FLOAT(*InputFormat) || T_FLOAT(*OutputFormat)) return FALSE; + + // Only on 16-bit + if (T_BYTES(*InputFormat) != 2 || T_BYTES(*OutputFormat) != 2) return FALSE; + + // Only real 16 bits + if (T_BIT15(*InputFormat) != 0 || T_BIT15(*OutputFormat) != 0) return FALSE; + + // Swap endian is not supported + if (T_ENDIAN16(*InputFormat) != 0 || T_ENDIAN16(*OutputFormat) != 0) return FALSE; + + // Only on input RGB + if (T_COLORSPACE(*InputFormat) != PT_RGB) return FALSE; + + + // If this is a matrix-shaper, the default does already a good job + if (cmsPipelineCheckAndRetreiveStages(*Lut, 4, + cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType, + NULL, NULL, NULL, NULL)) return FALSE; + + if (cmsPipelineCheckAndRetreiveStages(*Lut, 2, + cmsSigCurveSetElemType, cmsSigCurveSetElemType, + NULL, NULL)) return FALSE; + + + ContextID = cmsGetPipelineContextID(*Lut); + newFlags = *dwFlags | cmsFLAGS_FORCE_CLUT; + + if (!_cmsOptimizePipeline(ContextID, + Lut, + INTENT_PERCEPTUAL, // Dont care + InputFormat, + OutputFormat, + &newFlags)) return FALSE; + + OptimizedCLUTmpe = cmsPipelineGetPtrToFirstStage(*Lut); + + // Set the evaluator + data = (_cmsStageCLutData*)cmsStageData(OptimizedCLUTmpe); + + p16 = Performance16alloc(ContextID, data->Params); + if (p16 == NULL) return FALSE; + + *TransformFn = PerformanceEval16; + *UserData = p16; + *FreeDataFn = Performance16free; + *InputFormat |= 0x02000000; + *OutputFormat |= 0x02000000; + *dwFlags |= cmsFLAGS_CAN_CHANGE_FORMATTER; + + return TRUE; +} + diff --git a/local/recipes/libs/lcms2/source/plugins/fast_float/src/fast_8_curves.c b/local/recipes/libs/lcms2/source/plugins/fast_float/src/fast_8_curves.c new file mode 100644 index 0000000000..b5e94ad1a6 --- /dev/null +++ b/local/recipes/libs/lcms2/source/plugins/fast_float/src/fast_8_curves.c @@ -0,0 +1,422 @@ +//--------------------------------------------------------------------------------- +// +// Little Color Management System, fast floating point extensions +// Copyright (c) 1998-2026 Marti Maria Saguer, all rights reserved +// +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +//--------------------------------------------------------------------------------- + +#include "fast_float_internal.h" + +// Curves, optimization is valid for 8 bits only +typedef struct { + + cmsContext ContextID; + int nCurves; + cmsUInt8Number Curves[cmsMAXCHANNELS][256]; + +} Curves8Data; + + +// Evaluator for RGB 8-bit curves. This are just 1D tables +static void FastEvaluateRGBCurves8(struct _cmstransform_struct *CMMcargo, + const void* Input, + void* Output, + cmsUInt32Number PixelsPerLine, + cmsUInt32Number LineCount, + const cmsStride* Stride) +{ + cmsUInt32Number i, ii; + + cmsUInt32Number SourceStartingOrder[cmsMAXCHANNELS]; + cmsUInt32Number SourceIncrements[cmsMAXCHANNELS]; + cmsUInt32Number DestStartingOrder[cmsMAXCHANNELS]; + cmsUInt32Number DestIncrements[cmsMAXCHANNELS]; + + const cmsUInt8Number* rin; + const cmsUInt8Number* gin; + const cmsUInt8Number* bin; + const cmsUInt8Number* ain = NULL; + + cmsUInt8Number* rout; + cmsUInt8Number* gout; + cmsUInt8Number* bout; + cmsUInt8Number* aout = NULL; + + cmsUInt32Number nalpha; + size_t strideIn, strideOut; + + Curves8Data* Data = (Curves8Data*)_cmsGetTransformUserData(CMMcargo); + + _cmsComputeComponentIncrements(cmsGetTransformInputFormat((cmsHTRANSFORM)CMMcargo), Stride->BytesPerPlaneIn, NULL, &nalpha, SourceStartingOrder, SourceIncrements); + _cmsComputeComponentIncrements(cmsGetTransformOutputFormat((cmsHTRANSFORM)CMMcargo), Stride->BytesPerPlaneOut, NULL, &nalpha, DestStartingOrder, DestIncrements); + + if (!(_cmsGetTransformFlags(CMMcargo) & cmsFLAGS_COPY_ALPHA)) + nalpha = 0; + + strideIn = strideOut = 0; + for (i = 0; i < LineCount; i++) { + + rin = (const cmsUInt8Number*)Input + SourceStartingOrder[0] + strideIn; + gin = (const cmsUInt8Number*)Input + SourceStartingOrder[1] + strideIn; + bin = (const cmsUInt8Number*)Input + SourceStartingOrder[2] + strideIn; + if (nalpha) + ain = (const cmsUInt8Number*)Input + SourceStartingOrder[3] + strideIn; + + rout = (cmsUInt8Number*)Output + DestStartingOrder[0] + strideOut; + gout = (cmsUInt8Number*)Output + DestStartingOrder[1] + strideOut; + bout = (cmsUInt8Number*)Output + DestStartingOrder[2] + strideOut; + if (nalpha) + aout = (cmsUInt8Number*)Output + DestStartingOrder[3] + strideOut; + + for (ii = 0; ii < PixelsPerLine; ii++) { + + + *rout = Data->Curves[0][*rin]; + *gout = Data->Curves[1][*gin]; + *bout = Data->Curves[2][*bin]; + + // Handle alpha + if (ain) { + *aout = *ain; + } + + rin += SourceIncrements[0]; + gin += SourceIncrements[1]; + bin += SourceIncrements[2]; + if (ain) ain += SourceIncrements[3]; + + rout += DestIncrements[0]; + gout += DestIncrements[1]; + bout += DestIncrements[2]; + if (aout) aout += DestIncrements[3]; + } + + strideIn += Stride->BytesPerLineIn; + strideOut += Stride->BytesPerLineOut; + } +} + + +// Do nothing but arrange the format. RGB +static void FastRGBIdentity8(struct _cmstransform_struct *CMMcargo, + const void* Input, + void* Output, + cmsUInt32Number PixelsPerLine, + cmsUInt32Number LineCount, + const cmsStride* Stride) +{ + cmsUInt32Number i, ii; + + cmsUInt32Number SourceStartingOrder[cmsMAXCHANNELS]; + cmsUInt32Number SourceIncrements[cmsMAXCHANNELS]; + cmsUInt32Number DestStartingOrder[cmsMAXCHANNELS]; + cmsUInt32Number DestIncrements[cmsMAXCHANNELS]; + + const cmsUInt8Number* rin; + const cmsUInt8Number* gin; + const cmsUInt8Number* bin; + const cmsUInt8Number* ain = NULL; + + cmsUInt8Number* rout; + cmsUInt8Number* gout; + cmsUInt8Number* bout; + cmsUInt8Number* aout = NULL; + + cmsUInt32Number nalpha; + size_t strideIn, strideOut; + + _cmsComputeComponentIncrements(cmsGetTransformInputFormat((cmsHTRANSFORM)CMMcargo), Stride->BytesPerPlaneIn, NULL, &nalpha, SourceStartingOrder, SourceIncrements); + _cmsComputeComponentIncrements(cmsGetTransformOutputFormat((cmsHTRANSFORM)CMMcargo), Stride->BytesPerPlaneOut, NULL, &nalpha, DestStartingOrder, DestIncrements); + + if (!(_cmsGetTransformFlags(CMMcargo) & cmsFLAGS_COPY_ALPHA)) + nalpha = 0; + + strideIn = strideOut = 0; + for (i = 0; i < LineCount; i++) { + + rin = (const cmsUInt8Number*)Input + SourceStartingOrder[0] + strideIn; + gin = (const cmsUInt8Number*)Input + SourceStartingOrder[1] + strideIn; + bin = (const cmsUInt8Number*)Input + SourceStartingOrder[2] + strideIn; + if (nalpha) + ain = (const cmsUInt8Number*)Input + SourceStartingOrder[3] + strideIn; + + rout = (cmsUInt8Number*)Output + DestStartingOrder[0] + strideOut; + gout = (cmsUInt8Number*)Output + DestStartingOrder[1] + strideOut; + bout = (cmsUInt8Number*)Output + DestStartingOrder[2] + strideOut; + if (nalpha) + aout = (cmsUInt8Number*)Output + DestStartingOrder[3] + strideOut; + + for (ii = 0; ii < PixelsPerLine; ii++) { + + + *rout = *rin; + *gout = *gin; + *bout = *bin; + + // Handle alpha + if (ain) { + *aout = *ain; + } + + rin += SourceIncrements[0]; + gin += SourceIncrements[1]; + bin += SourceIncrements[2]; + if (ain) ain += SourceIncrements[3]; + + rout += DestIncrements[0]; + gout += DestIncrements[1]; + bout += DestIncrements[2]; + if (aout) aout += DestIncrements[3]; + } + + strideIn += Stride->BytesPerLineIn; + strideOut += Stride->BytesPerLineOut; + } +} + + + +// Evaluate 1 channel only +static void FastEvaluateGrayCurves8(struct _cmstransform_struct *CMMcargo, + const void* Input, + void* Output, + cmsUInt32Number PixelsPerLine, + cmsUInt32Number LineCount, + const cmsStride* Stride) +{ + cmsUInt32Number i, ii; + + cmsUInt32Number SourceStartingOrder[cmsMAXCHANNELS]; + cmsUInt32Number SourceIncrements[cmsMAXCHANNELS]; + cmsUInt32Number DestStartingOrder[cmsMAXCHANNELS]; + cmsUInt32Number DestIncrements[cmsMAXCHANNELS]; + + const cmsUInt8Number* gin; + const cmsUInt8Number* ain = NULL; + + cmsUInt8Number* gout; + cmsUInt8Number* aout = NULL; + + cmsUInt32Number nalpha; + size_t strideIn, strideOut; + + Curves8Data* Data = (Curves8Data*)_cmsGetTransformUserData(CMMcargo); + + _cmsComputeComponentIncrements(cmsGetTransformInputFormat((cmsHTRANSFORM)CMMcargo), Stride->BytesPerPlaneIn, NULL, &nalpha, SourceStartingOrder, SourceIncrements); + _cmsComputeComponentIncrements(cmsGetTransformOutputFormat((cmsHTRANSFORM)CMMcargo), Stride->BytesPerPlaneOut, NULL, &nalpha, DestStartingOrder, DestIncrements); + + if (!(_cmsGetTransformFlags(CMMcargo) & cmsFLAGS_COPY_ALPHA)) + nalpha = 0; + + strideIn = strideOut = 0; + for (i = 0; i < LineCount; i++) { + + gin = (const cmsUInt8Number*)Input + SourceStartingOrder[0] + strideIn; + if (nalpha) + ain = (const cmsUInt8Number*)Input + SourceStartingOrder[1] + strideIn; + + gout = (cmsUInt8Number*)Output + DestStartingOrder[0] + strideOut; + if (nalpha) + aout = (cmsUInt8Number*)Output + DestStartingOrder[1] + strideOut; + + for (ii = 0; ii < PixelsPerLine; ii++) { + + *gout = Data->Curves[0][*gin]; + + // Handle alpha + if (ain) { + *aout = *ain; + } + + gin += SourceIncrements[0]; + + if (ain) ain += SourceIncrements[1]; + + gout += DestIncrements[0]; + + if (aout) aout += DestIncrements[1]; + } + + strideIn += Stride->BytesPerLineIn; + strideOut += Stride->BytesPerLineOut; + } +} + + +static void FastGrayIdentity8(struct _cmstransform_struct *CMMcargo, + const void* Input, + void* Output, + cmsUInt32Number PixelsPerLine, + cmsUInt32Number LineCount, + const cmsStride* Stride) +{ + cmsUInt32Number i, ii; + + cmsUInt32Number SourceStartingOrder[cmsMAXCHANNELS]; + cmsUInt32Number SourceIncrements[cmsMAXCHANNELS]; + cmsUInt32Number DestStartingOrder[cmsMAXCHANNELS]; + cmsUInt32Number DestIncrements[cmsMAXCHANNELS]; + + const cmsUInt8Number* gin; + const cmsUInt8Number* ain = NULL; + + cmsUInt8Number* gout; + cmsUInt8Number* aout = NULL; + + cmsUInt32Number nalpha; + size_t strideIn, strideOut; + + _cmsComputeComponentIncrements(cmsGetTransformInputFormat((cmsHTRANSFORM)CMMcargo), Stride->BytesPerPlaneIn, NULL, &nalpha, SourceStartingOrder, SourceIncrements); + _cmsComputeComponentIncrements(cmsGetTransformOutputFormat((cmsHTRANSFORM)CMMcargo), Stride->BytesPerPlaneOut, NULL, &nalpha, DestStartingOrder, DestIncrements); + + if (!(_cmsGetTransformFlags(CMMcargo) & cmsFLAGS_COPY_ALPHA)) + nalpha = 0; + + strideIn = strideOut = 0; + for (i = 0; i < LineCount; i++) { + + gin = (const cmsUInt8Number*)Input + SourceStartingOrder[0] + strideIn; + if (nalpha) + ain = (const cmsUInt8Number*)Input + SourceStartingOrder[1] + strideIn; + + gout = (cmsUInt8Number*)Output + DestStartingOrder[0] + strideOut; + if (nalpha) + aout = (cmsUInt8Number*)Output + DestStartingOrder[1] + strideOut; + + for (ii = 0; ii < PixelsPerLine; ii++) { + + *gout = *gin; + + // Handle alpha + if (ain) { + *aout = *ain; + } + + gin += SourceIncrements[0]; + + if (ain) ain += SourceIncrements[1]; + + gout += DestIncrements[0]; + + if (aout) aout += DestIncrements[1]; + } + + strideIn += Stride->BytesPerLineIn; + strideOut += Stride->BytesPerLineOut; + } +} + + + + + +// Try to see if the curves are linear +static +cmsBool AllCurvesAreLinear(Curves8Data* data) +{ + int i, j; + + for (i=0; i < 3; i++) { + for (j = 0; j < 256; j++) { + if (data ->Curves[i][j] != j) return FALSE; + } + } + + return TRUE; +} + + +static +Curves8Data* ComputeCompositeCurves(cmsUInt32Number nChan, cmsPipeline* Src) +{ + cmsUInt32Number i, j; + cmsFloat32Number InFloat[3], OutFloat[3]; + + Curves8Data* Data = (Curves8Data*) _cmsMallocZero(cmsGetPipelineContextID(Src), sizeof(Curves8Data)); + if (Data == NULL) return NULL; + + // Create target curves + for (i=0; i < 256; i++) { + + for (j=0; j Curves[j][i] = FROM_16_TO_8(_cmsSaturateWord(OutFloat[j] * 65535.0)); + } + + return Data; +} + + +// If the target LUT holds only curves, the optimization procedure is to join all those +// curves together. That only works on curves and does not work on matrices. +// Any number of channels up to 16 +cmsBool Optimize8ByJoiningCurves(_cmsTransform2Fn* TransformFn, + void** UserData, + _cmsFreeUserDataFn* FreeUserData, + cmsPipeline** Lut, + cmsUInt32Number* InputFormat, + cmsUInt32Number* OutputFormat, + cmsUInt32Number* dwFlags) +{ + + cmsPipeline* Src = *Lut; + cmsStage* mpe; + Curves8Data* Data; + cmsUInt32Number nChans; + + // This is a lossy optimization! does not apply in floating-point cases + if (T_FLOAT(*InputFormat) || T_FLOAT(*OutputFormat)) return FALSE; + + // Only on 8-bit + if (T_BYTES(*InputFormat) != 1 || T_BYTES(*OutputFormat) != 1) return FALSE; + + // Curves need same channels on input and output (despite extra channels may differ) + nChans = T_CHANNELS(*InputFormat); + if (nChans != T_CHANNELS(*OutputFormat)) return FALSE; + + // gray and RGB + if (nChans != 1 && nChans != 3) return FALSE; + + // Only curves in this LUT? + for (mpe = cmsPipelineGetPtrToFirstStage(Src); + mpe != NULL; + mpe = cmsStageNext(mpe)) { + + if (cmsStageType(mpe) != cmsSigCurveSetElemType) return FALSE; + } + + Data = ComputeCompositeCurves(nChans, Src); + + *dwFlags |= cmsFLAGS_NOCACHE; + *dwFlags &= ~cmsFLAGS_CAN_CHANGE_FORMATTER; + *UserData = Data; + *FreeUserData = _fast_float_free_user_data; + + // Maybe the curves are linear at the end + if (nChans == 1) + *TransformFn = (AllCurvesAreLinear(Data) ? FastGrayIdentity8 : FastEvaluateGrayCurves8); + else + *TransformFn = (AllCurvesAreLinear(Data) ? FastRGBIdentity8 : FastEvaluateRGBCurves8); + + return TRUE; + +} + diff --git a/local/recipes/libs/lcms2/source/plugins/fast_float/src/fast_8_matsh.c b/local/recipes/libs/lcms2/source/plugins/fast_float/src/fast_8_matsh.c new file mode 100644 index 0000000000..fe0b37a896 --- /dev/null +++ b/local/recipes/libs/lcms2/source/plugins/fast_float/src/fast_8_matsh.c @@ -0,0 +1,384 @@ +//--------------------------------------------------------------------------------- +// +// Little Color Management System, fast floating point extensions +// Copyright (c) 1998-2026 Marti Maria Saguer, all rights reserved +// +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +//--------------------------------------------------------------------------------- + +// Optimization for matrix-shaper in 8 bits. Numbers are operated in n.14 signed, tables are stored in 1.14 fixed + +#include "fast_float_internal.h" + +typedef cmsInt32Number cmsS1Fixed14Number; // Note that this may hold more than 16 bits! + +#define DOUBLE_TO_1FIXED14(x) ((cmsS1Fixed14Number) floor((x) * 16384.0 + 0.5)) + +// This is the private data container used by this optimization +typedef struct { + + // Alignment makes it faster + + cmsS1Fixed14Number Mat[4][4]; // n.14 to n.14 (needs a saturation after that) + + void * real_ptr; + + cmsContext ContextID; + + cmsS1Fixed14Number Shaper1R[256]; // from 0..255 to 1.14 (0.0...1.0) + cmsS1Fixed14Number Shaper1G[256]; + cmsS1Fixed14Number Shaper1B[256]; + + cmsUInt8Number Shaper2R[0x4001]; // 1.14 to 0..255 + cmsUInt8Number Shaper2G[0x4001]; + cmsUInt8Number Shaper2B[0x4001]; + +} XMatShaper8Data; + + +static +XMatShaper8Data* malloc_aligned(cmsContext ContextID) +{ + cmsUInt8Number* real_ptr = (cmsUInt8Number*) _cmsMallocZero(ContextID, sizeof(XMatShaper8Data) + 32); + cmsUInt8Number* aligned = (cmsUInt8Number*) (((uintptr_t)real_ptr + 16) & ~0xf); + XMatShaper8Data* p = (XMatShaper8Data*) aligned; + + p ->real_ptr = real_ptr; + return p; +} + +static +void free_aligned(XMatShaper8Data* a) +{ + _cmsFree(a->ContextID, a->real_ptr); +} + + +// Free the private data container +static +void FreeMatShaper(cmsContext ContextID, void* Data) +{ + UNUSED_PARAMETER(ContextID); + + if (Data != NULL) free_aligned((XMatShaper8Data*) Data); +} + + +// This table converts from 8 bits to 1.14 after applying the curve +static +void FillFirstShaper(cmsS1Fixed14Number* Table, cmsToneCurve* Curve) +{ + int i; + cmsFloat32Number R, y; + + for (i=0; i < 256; i++) { + + R = (cmsFloat32Number) (i / 255.0); + y = cmsEvalToneCurveFloat(Curve, R); + + Table[i] = DOUBLE_TO_1FIXED14(y); + } +} + + +// This table converts form 1.14 (being 0x4000 the last entry) to 8 bits after applying the curve +static +void FillSecondShaper(cmsUInt8Number* Table, cmsToneCurve* Curve) +{ + int i; + cmsFloat32Number R, Val; + cmsInt32Number w; + + for (i=0; i < 0x4001; i++) { + + R = (cmsFloat32Number) (i / 16384.0f); + Val = cmsEvalToneCurveFloat(Curve, R); + w = (cmsInt32Number) (Val * 255.0f + 0.5f); + if (w < 0) w = 0; + if (w > 255) w = 255; + + Table[i] = (cmsInt8Number) w; + + } +} + +// Compute the matrix-shaper structure +static +XMatShaper8Data* SetMatShaper(cmsContext ContextID, cmsToneCurve* Curve1[3], cmsMAT3* Mat, cmsVEC3* Off, cmsToneCurve* Curve2[3]) +{ + XMatShaper8Data* p; + int i, j; + + // Allocate a big chuck of memory to store precomputed tables + p = malloc_aligned(ContextID); + if (p == NULL) return FALSE; + + p -> ContextID = ContextID; + + // Precompute tables + FillFirstShaper(p ->Shaper1R, Curve1[0]); + FillFirstShaper(p ->Shaper1G, Curve1[1]); + FillFirstShaper(p ->Shaper1B, Curve1[2]); + + FillSecondShaper(p ->Shaper2R, Curve2[0]); + FillSecondShaper(p ->Shaper2G, Curve2[1]); + FillSecondShaper(p ->Shaper2B, Curve2[2]); + + + // Convert matrix to nFixed14. Note that those values may take more than 16 bits as + for (i=0; i < 3; i++) { + for (j=0; j < 3; j++) { + p ->Mat[j][i] = DOUBLE_TO_1FIXED14(Mat->v[i].n[j]); + } + } + + for (i=0; i < 3; i++) { + + if (Off == NULL) { + + p->Mat[3][i] = DOUBLE_TO_1FIXED14(0.5); + } + else { + p->Mat[3][i] = DOUBLE_TO_1FIXED14(Off->n[i] + 0.5); + } + } + + + return p; +} + +// A fast matrix-shaper evaluator for 8 bits. This is a bit tricky since I'm using 1.14 signed fixed point +// to accomplish some performance. Actually it takes 256x3 16 bits tables and 16385 x 3 tables of 8 bits, +// in total about 50K, and the performance boost is huge! + +static +void MatShaperXform8(struct _cmstransform_struct *CMMcargo, + const void* Input, + void* Output, + cmsUInt32Number PixelsPerLine, + cmsUInt32Number LineCount, + const cmsStride* Stride) +{ + XMatShaper8Data* p = (XMatShaper8Data*) _cmsGetTransformUserData(CMMcargo); + + cmsS1Fixed14Number l1, l2, l3; + cmsS1Fixed14Number r, g, b; + cmsUInt32Number ri, gi, bi; + cmsUInt32Number i, ii; + + cmsUInt32Number SourceStartingOrder[cmsMAXCHANNELS]; + cmsUInt32Number SourceIncrements[cmsMAXCHANNELS]; + cmsUInt32Number DestStartingOrder[cmsMAXCHANNELS]; + cmsUInt32Number DestIncrements[cmsMAXCHANNELS]; + + const cmsUInt8Number* rin; + const cmsUInt8Number* gin; + const cmsUInt8Number* bin; + const cmsUInt8Number* ain = NULL; + + cmsUInt8Number* rout; + cmsUInt8Number* gout; + cmsUInt8Number* bout; + cmsUInt8Number* aout = NULL; + + cmsUInt32Number nalpha; + size_t strideIn, strideOut; + + _cmsComputeComponentIncrements(cmsGetTransformInputFormat((cmsHTRANSFORM)CMMcargo), Stride->BytesPerPlaneIn, NULL, &nalpha, SourceStartingOrder, SourceIncrements); + _cmsComputeComponentIncrements(cmsGetTransformOutputFormat((cmsHTRANSFORM)CMMcargo), Stride->BytesPerPlaneOut, NULL, &nalpha, DestStartingOrder, DestIncrements); + + if (!(_cmsGetTransformFlags(CMMcargo) & cmsFLAGS_COPY_ALPHA)) + nalpha = 0; + + strideIn = strideOut = 0; + for (i = 0; i < LineCount; i++) { + + rin = (const cmsUInt8Number*)Input + SourceStartingOrder[0] + strideIn; + gin = (const cmsUInt8Number*)Input + SourceStartingOrder[1] + strideIn; + bin = (const cmsUInt8Number*)Input + SourceStartingOrder[2] + strideIn; + if (nalpha) + ain = (const cmsUInt8Number*)Input + SourceStartingOrder[3] + strideIn; + + + rout = (cmsUInt8Number*)Output + DestStartingOrder[0] + strideOut; + gout = (cmsUInt8Number*)Output + DestStartingOrder[1] + strideOut; + bout = (cmsUInt8Number*)Output + DestStartingOrder[2] + strideOut; + if (nalpha) + aout = (cmsUInt8Number*)Output + DestStartingOrder[3] + strideOut; + + for (ii = 0; ii < PixelsPerLine; ii++) { + + // Across first shaper, which also converts to 1.14 fixed point. 16 bits guaranteed. + r = p->Shaper1R[*rin]; + g = p->Shaper1G[*gin]; + b = p->Shaper1B[*bin]; + + // Evaluate the matrix in 1.14 fixed point + l1 = (p->Mat[0][0] * r + p->Mat[1][0] * g + p->Mat[2][0] * b + p->Mat[3][0]) >> 14; + l2 = (p->Mat[0][1] * r + p->Mat[1][1] * g + p->Mat[2][1] * b + p->Mat[3][1]) >> 14; + l3 = (p->Mat[0][2] * r + p->Mat[1][2] * g + p->Mat[2][2] * b + p->Mat[3][2]) >> 14; + + + // Now we have to clip to 0..1.0 range + ri = (l1 < 0) ? 0 : ((l1 > 0x4000) ? 0x4000 : l1); + gi = (l2 < 0) ? 0 : ((l2 > 0x4000) ? 0x4000 : l2); + bi = (l3 < 0) ? 0 : ((l3 > 0x4000) ? 0x4000 : l3); + + + // And across second shaper, + *rout = p->Shaper2R[ri]; + *gout = p->Shaper2G[gi]; + *bout = p->Shaper2B[bi]; + + // Handle alpha + if (ain) { + *aout = *ain; + } + + rin += SourceIncrements[0]; + gin += SourceIncrements[1]; + bin += SourceIncrements[2]; + if (ain) ain += SourceIncrements[3]; + + rout += DestIncrements[0]; + gout += DestIncrements[1]; + bout += DestIncrements[2]; + if (aout) aout += DestIncrements[3]; + } + + strideIn += Stride->BytesPerLineIn; + strideOut += Stride->BytesPerLineOut; + } +} + + +// 8 bits on input allows matrix-shaper boost up a little bit +cmsBool Optimize8MatrixShaper(_cmsTransform2Fn* TransformFn, + void** UserData, + _cmsFreeUserDataFn* FreeUserData, + cmsPipeline** Lut, + cmsUInt32Number* InputFormat, + cmsUInt32Number* OutputFormat, + cmsUInt32Number* dwFlags) +{ + cmsStage* Curve1, *Curve2; + cmsStage* Matrix1, *Matrix2; + _cmsStageMatrixData* Data1; + _cmsStageMatrixData* Data2; + cmsMAT3 res; + cmsBool IdentityMat = FALSE; + cmsPipeline* Dest, *Src; + cmsContext ContextID; + cmsUInt32Number nChans; + cmsFloat64Number factor = 1.0; + + // Only works on RGB to RGB and gray to gray + + if ( !( (T_CHANNELS(*InputFormat) == 3 && T_CHANNELS(*OutputFormat) == 3) || + (T_CHANNELS(*InputFormat) == 1 && T_CHANNELS(*OutputFormat) == 1) )) return FALSE; + + // Only works on 8 bit input + if (T_BYTES(*InputFormat) != 1 || T_BYTES(*OutputFormat) != 1) return FALSE; + + // Seems suitable, proceed + Src = *Lut; + + // Check for shaper-matrix-matrix-shaper structure, that is what this optimizer stands for + if (!cmsPipelineCheckAndRetreiveStages(Src, 4, + cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType, + &Curve1, &Matrix1, &Matrix2, &Curve2)) return FALSE; + + ContextID = cmsGetPipelineContextID(Src); + nChans = T_CHANNELS(*InputFormat); + + // Get both matrices, which are 3x3 + Data1 = (_cmsStageMatrixData*) cmsStageData(Matrix1); + Data2 = (_cmsStageMatrixData*) cmsStageData(Matrix2); + + // Input offset should be zero + if (Data1 ->Offset != NULL) return FALSE; + + if (cmsStageInputChannels(Matrix1) == 1 && cmsStageOutputChannels(Matrix2) == 1) + { + // This is a gray to gray. Just multiply + factor = Data1->Double[0]*Data2->Double[0] + + Data1->Double[1]*Data2->Double[1] + + Data1->Double[2]*Data2->Double[2]; + + if (fabs(1 - factor) < (1.0 / 65535.0)) IdentityMat = TRUE; + } + else + { + // Multiply both matrices to get the result + _cmsMAT3per(&res, (cmsMAT3*) Data2 ->Double, (cmsMAT3*) Data1 ->Double); + + // Now the result is in res + Data2 -> Offset. Maybe is a plain identity? + IdentityMat = FALSE; + if (_cmsMAT3isIdentity(&res) && Data2 ->Offset == NULL) { + + // We can get rid of full matrix + IdentityMat = TRUE; + } + } + + // Allocate an empty LUT + Dest = cmsPipelineAlloc(ContextID, nChans, nChans); + if (!Dest) return FALSE; + + // Assemble the new LUT + cmsPipelineInsertStage(Dest, cmsAT_BEGIN, cmsStageDup(Curve1)); + + if (!IdentityMat) { + + if (nChans == 1) + cmsPipelineInsertStage(Dest, cmsAT_END, + cmsStageAllocMatrix(ContextID, 1, 1, (const cmsFloat64Number*) &factor, Data2->Offset)); + else + cmsPipelineInsertStage(Dest, cmsAT_END, + cmsStageAllocMatrix(ContextID, 3, 3, (const cmsFloat64Number*) &res, Data2 ->Offset)); + } + + + cmsPipelineInsertStage(Dest, cmsAT_END, cmsStageDup(Curve2)); + + // If identity on matrix, we can further optimize the curves, so call the join curves routine + if (IdentityMat) { + + Optimize8ByJoiningCurves(TransformFn, UserData, FreeUserData, &Dest, InputFormat, OutputFormat, dwFlags); + } + else { + _cmsStageToneCurvesData* mpeC1 = (_cmsStageToneCurvesData*) cmsStageData(Curve1); + _cmsStageToneCurvesData* mpeC2 = (_cmsStageToneCurvesData*) cmsStageData(Curve2); + + // In this particular optimization, cache does not help as it takes more time to deal with + // the cache than with the pixel handling + *dwFlags |= cmsFLAGS_NOCACHE; + + + // Setup the optimization routines + *UserData = SetMatShaper(ContextID, mpeC1 ->TheCurves, &res, (cmsVEC3*) Data2 ->Offset, mpeC2->TheCurves); + *FreeUserData = FreeMatShaper; + + *TransformFn = MatShaperXform8; + } + + *dwFlags &= ~cmsFLAGS_CAN_CHANGE_FORMATTER; + cmsPipelineFree(Src); + *Lut = Dest; + return TRUE; +} + + diff --git a/local/recipes/libs/lcms2/source/plugins/fast_float/src/fast_8_matsh_sse.c b/local/recipes/libs/lcms2/source/plugins/fast_float/src/fast_8_matsh_sse.c new file mode 100644 index 0000000000..ee194764fe --- /dev/null +++ b/local/recipes/libs/lcms2/source/plugins/fast_float/src/fast_8_matsh_sse.c @@ -0,0 +1,426 @@ +//--------------------------------------------------------------------------------- +// +// Little Color Management System, fast floating point extensions +// Copyright (c) 1998-2026 Marti Maria Saguer, all rights reserved +// +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +//--------------------------------------------------------------------------------- + +// Optimization for matrix-shaper in 8 bits using SSE2 intrinsics + +#include "fast_float_internal.h" + + +#ifndef CMS_DONT_USE_SSE2 + +#ifdef _MSC_VER +#include +#else +#include +#include +#endif + +#include + + +// This is the private data container used by this optimization +typedef struct { + + // This is for SSE, MUST be aligned at 16 bit boundary + + cmsFloat32Number Mat[4][4]; // n.14 to n.14 (needs a saturation after that) + + void * real_ptr; + + cmsContext ContextID; + + cmsFloat32Number Shaper1R[256]; // from 0..255 to 1.14 (0.0...1.0) + cmsFloat32Number Shaper1G[256]; + cmsFloat32Number Shaper1B[256]; + + cmsUInt8Number Shaper2R[0x4001]; // 1.14 to 0..255 + cmsUInt8Number Shaper2G[0x4001]; + cmsUInt8Number Shaper2B[0x4001]; + +} XMatShaper8Data; + + +static +XMatShaper8Data* malloc_aligned(cmsContext ContextID) +{ + cmsUInt8Number* real_ptr = (cmsUInt8Number*) _cmsMallocZero(ContextID, sizeof(XMatShaper8Data) + 32); + cmsUInt8Number* aligned = (cmsUInt8Number*) (((uintptr_t)real_ptr + 16) & ~0xf); + XMatShaper8Data* p = (XMatShaper8Data*) aligned; + + p ->real_ptr = real_ptr; + return p; +} + +static +void free_aligned(XMatShaper8Data* a) +{ + _cmsFree(a->ContextID, a->real_ptr); +} + + +// Free the private data container +static +void FreeMatShaper(cmsContext ContextID, void* Data) +{ + UNUSED_PARAMETER(ContextID); + + if (Data != NULL) free_aligned((XMatShaper8Data*) Data); +} + + +// This table converts from 8 bits to 1.14 after applying the curve +static +void FillFirstShaper(cmsFloat32Number* Table, cmsToneCurve* Curve) +{ + cmsInt32Number i; + cmsFloat32Number R; + + for (i = 0; i < 256; i++) { + + R = (cmsFloat32Number)(i / 255.0); + Table[i] = cmsEvalToneCurveFloat(Curve, R); + } +} + + +// This table converts form 1.14 (being 0x4000 the last entry) to 8 bits after applying the curve +static +void FillSecondShaper(cmsUInt8Number* Table, cmsToneCurve* Curve) +{ + int i; + cmsFloat32Number R, Val; + cmsInt32Number w; + + for (i=0; i < 0x4001; i++) { + + R = (cmsFloat32Number) (i / 16384.0f); + Val = cmsEvalToneCurveFloat(Curve, R); + w = (cmsInt32Number) (Val * 255.0f + 0.5f); + if (w < 0) w = 0; + if (w > 255) w = 255; + + Table[i] = (cmsInt8Number) w; + + } +} + +// Compute the matrix-shaper structure +static +XMatShaper8Data* SetMatShaper(cmsContext ContextID, cmsToneCurve* Curve1[3], cmsMAT3* Mat, cmsVEC3* Off, cmsToneCurve* Curve2[3]) +{ + XMatShaper8Data* p; + int i, j; + + // Allocate a big chuck of memory to store precomputed tables + p = malloc_aligned(ContextID); + if (p == NULL) return FALSE; + + p -> ContextID = ContextID; + + // Precompute tables + FillFirstShaper(p ->Shaper1R, Curve1[0]); + FillFirstShaper(p ->Shaper1G, Curve1[1]); + FillFirstShaper(p ->Shaper1B, Curve1[2]); + + FillSecondShaper(p ->Shaper2R, Curve2[0]); + FillSecondShaper(p ->Shaper2G, Curve2[1]); + FillSecondShaper(p ->Shaper2B, Curve2[2]); + + + // Convert matrix to float + for (i=0; i < 3; i++) { + for (j=0; j < 3; j++) { + p ->Mat[j][i] = (cmsFloat32Number) Mat->v[i].n[j]; + } + } + + // Roundoff + for (i=0; i < 3; i++) { + + if (Off == NULL) { + + p->Mat[3][i] = 0.0f; + } + else { + p->Mat[3][i] = (cmsFloat32Number)Off->n[i]; + } + } + + + return p; +} + + +// A fast matrix-shaper evaluator for 8 bits. +static +void MatShaperXform8SSE(struct _cmstransform_struct *CMMcargo, + const void* Input, + void* Output, + cmsUInt32Number PixelsPerLine, + cmsUInt32Number LineCount, + const cmsStride* Stride) +{ + XMatShaper8Data* p = (XMatShaper8Data*) _cmsGetTransformUserData(CMMcargo); + + cmsUInt32Number i, ii; + + cmsUInt32Number SourceStartingOrder[cmsMAXCHANNELS]; + cmsUInt32Number SourceIncrements[cmsMAXCHANNELS]; + cmsUInt32Number DestStartingOrder[cmsMAXCHANNELS]; + cmsUInt32Number DestIncrements[cmsMAXCHANNELS]; + + const cmsUInt8Number* rin; + const cmsUInt8Number* gin; + const cmsUInt8Number* bin; + const cmsUInt8Number* ain = NULL; + + cmsUInt8Number* rout; + cmsUInt8Number* gout; + cmsUInt8Number* bout; + cmsUInt8Number* aout = NULL; + + cmsUInt32Number nalpha; + size_t strideIn, strideOut; + + + __m128 mat0 = _mm_load_ps(p->Mat[0]); + __m128 mat1 = _mm_load_ps(p->Mat[1]); + __m128 mat2 = _mm_load_ps(p->Mat[2]); + __m128 mat3 = _mm_load_ps(p->Mat[3]); + + __m128 zero = _mm_setzero_ps(); + __m128 one = _mm_set1_ps(1.0f); + __m128 scale = _mm_set1_ps((cmsFloat32Number)0x4000); + + cmsUInt8Number buffer[32]; + cmsUInt32Number* output_index = (cmsUInt32Number*)(((uintptr_t)buffer + 16) & ~0xf); + + + _cmsComputeComponentIncrements(cmsGetTransformInputFormat((cmsHTRANSFORM)CMMcargo), Stride->BytesPerPlaneIn, NULL, &nalpha, SourceStartingOrder, SourceIncrements); + _cmsComputeComponentIncrements(cmsGetTransformOutputFormat((cmsHTRANSFORM)CMMcargo), Stride->BytesPerPlaneOut, NULL, &nalpha, DestStartingOrder, DestIncrements); + + if (!(_cmsGetTransformFlags(CMMcargo) & cmsFLAGS_COPY_ALPHA)) + nalpha = 0; + + strideIn = strideOut = 0; + for (i = 0; i < LineCount; i++) { + + rin = (const cmsUInt8Number*)Input + SourceStartingOrder[0] + strideIn; + gin = (const cmsUInt8Number*)Input + SourceStartingOrder[1] + strideIn; + bin = (const cmsUInt8Number*)Input + SourceStartingOrder[2] + strideIn; + if (nalpha) + ain = (const cmsUInt8Number*)Input + SourceStartingOrder[3] + strideIn; + + + rout = (cmsUInt8Number*)Output + DestStartingOrder[0] + strideOut; + gout = (cmsUInt8Number*)Output + DestStartingOrder[1] + strideOut; + bout = (cmsUInt8Number*)Output + DestStartingOrder[2] + strideOut; + if (nalpha) + aout = (cmsUInt8Number*)Output + DestStartingOrder[3] + strideOut; + + /** + * Prefetch + */ + __m128 rvector = _mm_set1_ps(p->Shaper1R[*rin]); + __m128 gvector = _mm_set1_ps(p->Shaper1G[*gin]); + __m128 bvector = _mm_set1_ps(p->Shaper1B[*bin]); + + for (ii = 0; ii < PixelsPerLine; ii++) { + + __m128 el1 = _mm_mul_ps(rvector, mat0); + __m128 el2 = _mm_mul_ps(gvector, mat1); + __m128 el3 = _mm_mul_ps(bvector, mat2); + + __m128 sum = _mm_add_ps(el1, _mm_add_ps(el2, _mm_add_ps(el3, mat3))); + + __m128 out = _mm_min_ps(_mm_max_ps(sum, zero), one); + + out = _mm_mul_ps(out, scale); + + /** + * Rounding and converting to index. + * Actually this is a costly instruction that may be blocking performance + */ + _mm_store_si128((__m128i*)output_index, _mm_cvtps_epi32(out)); + + + // Handle alpha + if (ain) { + *aout = *ain; + } + + rin += SourceIncrements[0]; + gin += SourceIncrements[1]; + bin += SourceIncrements[2]; + if (ain) ain += SourceIncrements[3]; + + /** + * Take next value whilst store is being performed + */ + if (ii < PixelsPerLine - 1) + { + rvector = _mm_set1_ps(p->Shaper1R[*rin]); + gvector = _mm_set1_ps(p->Shaper1G[*gin]); + bvector = _mm_set1_ps(p->Shaper1B[*bin]); + } + + *rout = p->Shaper2R[output_index[0]]; + *gout = p->Shaper2G[output_index[1]]; + *bout = p->Shaper2B[output_index[2]]; + + rout += DestIncrements[0]; + gout += DestIncrements[1]; + bout += DestIncrements[2]; + if (aout) aout += DestIncrements[3]; + } + + strideIn += Stride->BytesPerLineIn; + strideOut += Stride->BytesPerLineOut; + } +} + + +static +cmsBool IsSSE2Available(void) +{ +#ifdef _MSC_VER + int cpuinfo[4]; + + __cpuid(cpuinfo, 1); + if (!(cpuinfo[3] & (1 << 26))) return FALSE; + return TRUE; + +#else + unsigned int level = 1u; + unsigned int eax, ebx, ecx, edx; + unsigned int bits = (1u << 26); + unsigned int max = __get_cpuid_max(0, NULL); + if (level > max) { + return FALSE; + } + __cpuid_count(level, 0, eax, ebx, ecx, edx); + return (edx & bits) == bits; +#endif +} + + +// 8 bits on input allows matrix-shaper boost up a little bit +cmsBool Optimize8MatrixShaperSSE(_cmsTransform2Fn* TransformFn, + void** UserData, + _cmsFreeUserDataFn* FreeUserData, + cmsPipeline** Lut, + cmsUInt32Number* InputFormat, + cmsUInt32Number* OutputFormat, + cmsUInt32Number* dwFlags) +{ + cmsStage* Curve1, *Curve2; + cmsStage* Matrix1, *Matrix2; + _cmsStageMatrixData* Data1; + _cmsStageMatrixData* Data2; + cmsMAT3 res; + cmsBool IdentityMat = FALSE; + cmsPipeline* Dest, *Src; + cmsContext ContextID; + cmsUInt32Number nChans; + + // Check for SSE2 support + if (!(IsSSE2Available())) return FALSE; + + // Only works on 3 to 3, probably RGB + if ( !( (T_CHANNELS(*InputFormat) == 3 && T_CHANNELS(*OutputFormat) == 3) ) ) return FALSE; + + // Only works on 8 bit input + if (T_BYTES(*InputFormat) != 1 || T_BYTES(*OutputFormat) != 1) return FALSE; + + // Seems suitable, proceed + Src = *Lut; + + // Check for shaper-matrix-matrix-shaper structure, that is what this optimizer stands for + if (!cmsPipelineCheckAndRetreiveStages(Src, 4, + cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType, + &Curve1, &Matrix1, &Matrix2, &Curve2)) return FALSE; + + ContextID = cmsGetPipelineContextID(Src); + nChans = T_CHANNELS(*InputFormat); + + // Get both matrices, which are 3x3 + Data1 = (_cmsStageMatrixData*) cmsStageData(Matrix1); + Data2 = (_cmsStageMatrixData*) cmsStageData(Matrix2); + + // Input offset should be zero + if (Data1->Offset != NULL) return FALSE; + + // Multiply both matrices to get the result + _cmsMAT3per(&res, (cmsMAT3*)Data2->Double, (cmsMAT3*)Data1->Double); + + // Now the result is in res + Data2 -> Offset. Maybe is a plain identity? + IdentityMat = FALSE; + if (_cmsMAT3isIdentity(&res) && Data2->Offset == NULL) { + + // We can get rid of full matrix + IdentityMat = TRUE; + } + + // Allocate an empty LUT + Dest = cmsPipelineAlloc(ContextID, nChans, nChans); + if (!Dest) return FALSE; + + // Assamble the new LUT + cmsPipelineInsertStage(Dest, cmsAT_BEGIN, cmsStageDup(Curve1)); + + if (!IdentityMat) { + + cmsPipelineInsertStage(Dest, cmsAT_END, + cmsStageAllocMatrix(ContextID, 3, 3, (const cmsFloat64Number*) &res, Data2 ->Offset)); + } + + + cmsPipelineInsertStage(Dest, cmsAT_END, cmsStageDup(Curve2)); + + // If identity on matrix, we can further optimize the curves, so call the join curves routine + if (IdentityMat) { + + Optimize8ByJoiningCurves(TransformFn, UserData, FreeUserData, &Dest, InputFormat, OutputFormat, dwFlags); + } + else { + _cmsStageToneCurvesData* mpeC1 = (_cmsStageToneCurvesData*) cmsStageData(Curve1); + _cmsStageToneCurvesData* mpeC2 = (_cmsStageToneCurvesData*) cmsStageData(Curve2); + + // In this particular optimization, cache does not help as it takes more time to deal with + // the cache than with the pixel handling + *dwFlags |= cmsFLAGS_NOCACHE; + + + // Setup the optimizarion routines + *UserData = SetMatShaper(ContextID, mpeC1 ->TheCurves, &res, (cmsVEC3*) Data2 ->Offset, mpeC2->TheCurves); + *FreeUserData = FreeMatShaper; + + *TransformFn = MatShaperXform8SSE; + } + + *dwFlags &= ~cmsFLAGS_CAN_CHANGE_FORMATTER; + cmsPipelineFree(Src); + *Lut = Dest; + return TRUE; +} + +#endif + diff --git a/local/recipes/libs/lcms2/source/plugins/fast_float/src/fast_8_tethra.c b/local/recipes/libs/lcms2/source/plugins/fast_float/src/fast_8_tethra.c new file mode 100644 index 0000000000..83876c675b --- /dev/null +++ b/local/recipes/libs/lcms2/source/plugins/fast_float/src/fast_8_tethra.c @@ -0,0 +1,494 @@ +//--------------------------------------------------------------------------------- +// +// Little Color Management System, fast floating point extensions +// Copyright (c) 1998-2026 Marti Maria Saguer, all rights reserved +// +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +//--------------------------------------------------------------------------------- + +#include "fast_float_internal.h" + +#define PRELINEARIZATION_POINTS 4096 + +// Optimization for 8 bits, 3 inputs only +typedef struct { + + cmsContext ContextID; + + const cmsInterpParams* p; // Tetrahedrical interpolation parameters. This is a not-owned pointer. + + cmsUInt16Number rx[256], ry[256], rz[256]; + cmsUInt32Number X0[256], Y0[256], Z0[256]; // Precomputed nodes and offsets for 8-bit input data + + +} Performance8Data; + + +// Precomputes tables for 8-bit on input devicelink. +static +Performance8Data* Performance8alloc(cmsContext ContextID, const cmsInterpParams* p, cmsToneCurve* G[3]) +{ + int i; + cmsUInt16Number Input[3]; + cmsS15Fixed16Number v1, v2, v3; + Performance8Data* p8; + + p8 = (Performance8Data*) _cmsMallocZero(ContextID, sizeof(Performance8Data)); + if (p8 == NULL) return NULL; + + // Since this only works for 8 bit input, values comes always as x * 257, + // we can safely take msb byte (x << 8 + x) + for (i=0; i < 256; i++) { + + if (G != NULL) { + + // Get 16-bit representation + Input[0] = cmsEvalToneCurve16(G[0], FROM_8_TO_16(i)); + Input[1] = cmsEvalToneCurve16(G[1], FROM_8_TO_16(i)); + Input[2] = cmsEvalToneCurve16(G[2], FROM_8_TO_16(i)); + } + else { + Input[0] = FROM_8_TO_16(i); + Input[1] = FROM_8_TO_16(i); + Input[2] = FROM_8_TO_16(i); + } + + // Move to 0..1.0 in fixed domain + v1 = _cmsToFixedDomain(Input[0] * p -> Domain[0]); + v2 = _cmsToFixedDomain(Input[1] * p -> Domain[1]); + v3 = _cmsToFixedDomain(Input[2] * p -> Domain[2]); + + // Store the precalculated table of nodes + p8 ->X0[i] = (p->opta[2] * FIXED_TO_INT(v1)); + p8 ->Y0[i] = (p->opta[1] * FIXED_TO_INT(v2)); + p8 ->Z0[i] = (p->opta[0] * FIXED_TO_INT(v3)); + + // Store the precalculated table of offsets + p8 ->rx[i] = (cmsUInt16Number) FIXED_REST_TO_INT(v1); + p8 ->ry[i] = (cmsUInt16Number) FIXED_REST_TO_INT(v2); + p8 ->rz[i] = (cmsUInt16Number) FIXED_REST_TO_INT(v3); + } + + + p8 ->ContextID = ContextID; + p8 ->p = p; + + return p8; +} + +static +void Performance8free(cmsContext ContextID, void* ptr) +{ + _cmsFree(ContextID, ptr); +} + + +// Sampler implemented by another LUT. This is a clean way to precalculate the devicelink 3D CLUT for +// almost any transform. We use floating point precision and then convert from floating point to 16 bits. +static +int XFormSampler16(CMSREGISTER const cmsUInt16Number In[], CMSREGISTER cmsUInt16Number Out[], CMSREGISTER void* Cargo) +{ + // Evaluate in 16 bits + cmsPipelineEval16(In, Out, (cmsPipeline*) Cargo); + + // Always succeed + return TRUE; +} + + +// A optimized interpolation for 8-bit input. +#define DENS(i,j,k) (LutTable[(i)+(j)+(k)+OutChan]) + +static +void PerformanceEval8(struct _cmstransform_struct *CMMcargo, + const void* Input, + void* Output, + cmsUInt32Number PixelsPerLine, + cmsUInt32Number LineCount, + const cmsStride* Stride) +{ + + cmsUInt8Number r, g, b; + cmsS15Fixed16Number rx, ry, rz; + cmsS15Fixed16Number c0, c1, c2, c3, Rest; + cmsUInt32Number OutChan, TotalPlusAlpha; + cmsS15Fixed16Number X0, X1, Y0, Y1, Z0, Z1; + Performance8Data* p8 = (Performance8Data*)_cmsGetTransformUserData(CMMcargo); + const cmsInterpParams* p = p8->p; + cmsUInt32Number TotalOut = p->nOutputs; + const cmsUInt16Number* LutTable = (const cmsUInt16Number*)p->Table; + + cmsUInt8Number* out[cmsMAXCHANNELS]; + cmsUInt16Number res16; + + cmsUInt32Number i, ii; + + cmsUInt32Number SourceStartingOrder[cmsMAXCHANNELS]; + cmsUInt32Number SourceIncrements[cmsMAXCHANNELS]; + cmsUInt32Number DestStartingOrder[cmsMAXCHANNELS]; + cmsUInt32Number DestIncrements[cmsMAXCHANNELS]; + + const cmsUInt8Number* rin; + const cmsUInt8Number* gin; + const cmsUInt8Number* bin; + const cmsUInt8Number* ain = NULL; + + cmsUInt32Number nalpha; + size_t strideIn, strideOut; + + _cmsComputeComponentIncrements(cmsGetTransformInputFormat((cmsHTRANSFORM)CMMcargo), Stride->BytesPerPlaneIn, NULL, &nalpha, SourceStartingOrder, SourceIncrements); + _cmsComputeComponentIncrements(cmsGetTransformOutputFormat((cmsHTRANSFORM)CMMcargo), Stride->BytesPerPlaneOut, NULL, &nalpha, DestStartingOrder, DestIncrements); + + if (!(_cmsGetTransformFlags(CMMcargo) & cmsFLAGS_COPY_ALPHA)) + nalpha = 0; + + strideIn = strideOut = 0; + for (i = 0; i < LineCount; i++) { + + rin = (const cmsUInt8Number*)Input + SourceStartingOrder[0] + strideIn; + gin = (const cmsUInt8Number*)Input + SourceStartingOrder[1] + strideIn; + bin = (const cmsUInt8Number*)Input + SourceStartingOrder[2] + strideIn; + if (nalpha) + ain = (const cmsUInt8Number*)Input + SourceStartingOrder[3] + strideIn; + + TotalPlusAlpha = TotalOut; + if (ain) TotalPlusAlpha++; + + for (OutChan = 0; OutChan < TotalPlusAlpha; OutChan++) { + out[OutChan] = (cmsUInt8Number*)Output + DestStartingOrder[OutChan] + strideOut; + } + + + for (ii = 0; ii < PixelsPerLine; ii++) { + + r = *rin; g = *gin; b = *bin; + + rin += SourceIncrements[0]; + gin += SourceIncrements[1]; + bin += SourceIncrements[2]; + + X0 = X1 = p8->X0[r]; + Y0 = Y1 = p8->Y0[g]; + Z0 = Z1 = p8->Z0[b]; + + rx = p8->rx[r]; + ry = p8->ry[g]; + rz = p8->rz[b]; + + X1 = X0 + ((rx == 0) ? 0 : p->opta[2]); + Y1 = Y0 + ((ry == 0) ? 0 : p->opta[1]); + Z1 = Z0 + ((rz == 0) ? 0 : p->opta[0]); + + + // These are the 6 Tetrahedral + for (OutChan = 0; OutChan < TotalOut; OutChan++) { + + c0 = DENS(X0, Y0, Z0); + + if (rx >= ry && ry >= rz) + { + c1 = DENS(X1, Y0, Z0) - c0; + c2 = DENS(X1, Y1, Z0) - DENS(X1, Y0, Z0); + c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0); + } + else + if (rx >= rz && rz >= ry) + { + c1 = DENS(X1, Y0, Z0) - c0; + c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1); + c3 = DENS(X1, Y0, Z1) - DENS(X1, Y0, Z0); + } + else + if (rz >= rx && rx >= ry) + { + c1 = DENS(X1, Y0, Z1) - DENS(X0, Y0, Z1); + c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1); + c3 = DENS(X0, Y0, Z1) - c0; + } + else + if (ry >= rx && rx >= rz) + { + c1 = DENS(X1, Y1, Z0) - DENS(X0, Y1, Z0); + c2 = DENS(X0, Y1, Z0) - c0; + c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0); + } + else + if (ry >= rz && rz >= rx) + { + c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1); + c2 = DENS(X0, Y1, Z0) - c0; + c3 = DENS(X0, Y1, Z1) - DENS(X0, Y1, Z0); + } + else + if (rz >= ry && ry >= rx) + { + c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1); + c2 = DENS(X0, Y1, Z1) - DENS(X0, Y0, Z1); + c3 = DENS(X0, Y0, Z1) - c0; + } + else { + c1 = c2 = c3 = 0; + } + + + Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001; + res16 = (cmsUInt16Number)c0 + ((Rest + (Rest >> 16)) >> 16); + + *out[OutChan] = FROM_16_TO_8(res16); + out[OutChan] += DestIncrements[OutChan]; + + } + + if (ain) { + *out[TotalOut] = *ain; + ain += SourceIncrements[3]; + out[TotalOut] += DestIncrements[TotalOut]; + } + + } + + strideIn += Stride->BytesPerLineIn; + strideOut += Stride->BytesPerLineOut; + } +} + +#undef DENS + + +// Curves that contain wide empty areas are not optimizeable +static +cmsBool IsDegenerated(const cmsToneCurve* g) +{ + int i, Zeros = 0, Poles = 0; + int nEntries = cmsGetToneCurveEstimatedTableEntries(g); + const cmsUInt16Number* Table16 = cmsGetToneCurveEstimatedTable(g); + + for (i=0; i < nEntries; i++) { + + if (Table16[i] == 0x0000) Zeros++; + if (Table16[i] == 0xffff) Poles++; + } + + if (Zeros == 1 && Poles == 1) return FALSE; // For linear tables + if (Zeros > (nEntries / 4)) return TRUE; // Degenerated, mostly zeros + if (Poles > (nEntries / 4)) return TRUE; // Degenerated, mostly poles + + return FALSE; +} + + + +// Normalize endpoints by slope limiting max and min. This assures endpoints as well. +// Descending curves are handled as well. +static +void SlopeLimiting(cmsUInt16Number* Table16, int nEntries) +{ + int BeginVal, EndVal; + + int AtBegin = (int) floor((cmsFloat64Number)nEntries * 0.02 + 0.5); // Cutoff at 2% + int AtEnd = nEntries - AtBegin - 1; // And 98% + cmsFloat64Number Val, Slope, beta; + int i; + + + if (Table16[0] > Table16[nEntries-1]) { + BeginVal = 0xffff; EndVal = 0; + } + else { + BeginVal = 0; EndVal = 0xffff; + } + + // Compute slope and offset for begin of curve + Val = Table16[AtBegin]; + Slope = (Val - BeginVal) / AtBegin; + beta = Val - Slope * AtBegin; + + for (i=0; i < AtBegin; i++) + Table16[i] = _cmsSaturateWord(i * Slope + beta); + + // Compute slope and offset for the end + Val = Table16[AtEnd]; + Slope = (EndVal - Val) / AtBegin; // AtBegin holds the X interval, which is same in both cases + beta = Val - Slope * AtEnd; + + for (i = AtEnd; i < (int) nEntries; i++) + Table16[i] = _cmsSaturateWord(i * Slope + beta); +} + + +// -------------------------------------------------------------------------------------------------------------- + +cmsBool Optimize8BitRGBTransform(_cmsTransform2Fn* TransformFn, + void** UserData, + _cmsFreeUserDataFn* FreeDataFn, + cmsPipeline** Lut, + cmsUInt32Number* InputFormat, + cmsUInt32Number* OutputFormat, + cmsUInt32Number* dwFlags) +{ + cmsPipeline* OriginalLut; + int nGridPoints; + cmsToneCurve *Trans[cmsMAXCHANNELS], *TransReverse[cmsMAXCHANNELS]; + cmsUInt32Number t, i, j; + cmsFloat32Number v, In[cmsMAXCHANNELS], Out[cmsMAXCHANNELS]; + cmsBool lIsSuitable; + cmsPipeline* OptimizedLUT = NULL, *LutPlusCurves = NULL; + cmsStage* OptimizedCLUTmpe; + cmsStage* OptimizedPrelinMpe; + Performance8Data* p8; + cmsUInt16Number* MyTable[3]; + cmsContext ContextID; + _cmsStageCLutData* data; + + // For empty transforms, do nothing + if (*Lut == NULL) return FALSE; + + // This is a lossy optimization! does not apply in floating-point cases + if (T_FLOAT(*InputFormat) || T_FLOAT(*OutputFormat)) return FALSE; + + // Only on 8-bit + if (T_BYTES(*InputFormat) != 1 || T_BYTES(*OutputFormat) != 1) return FALSE; + + // Only on RGB + if (T_COLORSPACE(*InputFormat) != PT_RGB) return FALSE; + + // This optimization only works on RGB8->RGB8 + if (T_COLORSPACE(*OutputFormat) != PT_RGB) return FALSE; + + OriginalLut = *Lut; + + ContextID = cmsGetPipelineContextID(OriginalLut); + nGridPoints = _cmsReasonableGridpointsByColorspace(cmsSigRgbData, *dwFlags); + + // Empty gamma containers + memset(Trans, 0, sizeof(Trans)); + memset(TransReverse, 0, sizeof(TransReverse)); + + MyTable[0] = (cmsUInt16Number*) _cmsMallocZero(ContextID, sizeof(cmsUInt16Number) * PRELINEARIZATION_POINTS); + MyTable[1] = (cmsUInt16Number*) _cmsMallocZero(ContextID, sizeof(cmsUInt16Number) * PRELINEARIZATION_POINTS); + MyTable[2] = (cmsUInt16Number*) _cmsMallocZero(ContextID, sizeof(cmsUInt16Number) * PRELINEARIZATION_POINTS); + + if (MyTable[0] == NULL || MyTable[1] == NULL || MyTable[2] == NULL) goto Error; + + // Populate the curves + + for (i=0; i < PRELINEARIZATION_POINTS; i++) { + + v = (cmsFloat32Number) ((cmsFloat64Number) i / (PRELINEARIZATION_POINTS - 1)); + + // Feed input with a gray ramp + for (j=0; j < 3; j++) + In[j] = v; + + // Evaluate the gray value + cmsPipelineEvalFloat(In, Out, OriginalLut); + + // Store result in curve + for (j=0; j < 3; j++) + MyTable[j][i] = _cmsSaturateWord(Out[j] * 65535.0); + } + + for (t=0; t < 3; t++) { + + SlopeLimiting(MyTable[t], PRELINEARIZATION_POINTS); + + Trans[t] = cmsBuildTabulatedToneCurve16(ContextID, PRELINEARIZATION_POINTS, MyTable[t]); + if (Trans[t] == NULL) goto Error; + + _cmsFree(cmsGetPipelineContextID(OriginalLut), MyTable[t]); + } + + // Check for validity + lIsSuitable = TRUE; + for (t=0; (lIsSuitable && (t < 3)); t++) { + + if (IsDegenerated(Trans[t])) + lIsSuitable = FALSE; + } + + // If it is not suitable, just quit + if (!lIsSuitable) goto Error; + + // Invert curves if possible + for (t = 0; t < cmsPipelineInputChannels(OriginalLut); t++) { + TransReverse[t] = cmsReverseToneCurveEx(PRELINEARIZATION_POINTS, Trans[t]); + if (TransReverse[t] == NULL) goto Error; + } + + // Now insert the reversed curves at the begin of transform + LutPlusCurves = cmsPipelineDup(OriginalLut); + if (LutPlusCurves == NULL) goto Error; + + cmsPipelineInsertStage(LutPlusCurves, cmsAT_BEGIN, cmsStageAllocToneCurves(ContextID, 3, TransReverse)); + + // Create the result LUT + OptimizedLUT = cmsPipelineAlloc(cmsGetPipelineContextID(OriginalLut), 3, cmsPipelineOutputChannels(OriginalLut)); + if (OptimizedLUT == NULL) goto Error; + + OptimizedPrelinMpe = cmsStageAllocToneCurves(ContextID, 3, Trans); + + // Create and insert the curves at the beginning + cmsPipelineInsertStage(OptimizedLUT, cmsAT_BEGIN, OptimizedPrelinMpe); + + // Allocate the CLUT for result + OptimizedCLUTmpe = cmsStageAllocCLut16bit(ContextID, nGridPoints, 3, cmsPipelineOutputChannels(OriginalLut), NULL); + + // Add the CLUT to the destination LUT + cmsPipelineInsertStage(OptimizedLUT, cmsAT_END, OptimizedCLUTmpe); + + // Resample the LUT + if (!cmsStageSampleCLut16bit(OptimizedCLUTmpe, XFormSampler16, (void*) LutPlusCurves, 0)) goto Error; + + // Set the evaluator + data = (_cmsStageCLutData*) cmsStageData(OptimizedCLUTmpe); + + p8 = Performance8alloc(ContextID, data ->Params, Trans); + if (p8 == NULL) return FALSE; + + // Free resources + for (t = 0; t <3; t++) { + + if (Trans[t]) cmsFreeToneCurve(Trans[t]); + if (TransReverse[t]) cmsFreeToneCurve(TransReverse[t]); + } + + cmsPipelineFree(LutPlusCurves); + + // And return the obtained LUT + cmsPipelineFree(OriginalLut); + + *dwFlags &= ~cmsFLAGS_CAN_CHANGE_FORMATTER; + *Lut = OptimizedLUT; + *TransformFn = PerformanceEval8; + *UserData = p8; + *FreeDataFn = Performance8free; + + return TRUE; + +Error: + + for (t = 0; t < 3; t++) { + + if (Trans[t]) cmsFreeToneCurve(Trans[t]); + if (TransReverse[t]) cmsFreeToneCurve(TransReverse[t]); + } + + if (LutPlusCurves != NULL) cmsPipelineFree(LutPlusCurves); + if (OptimizedLUT != NULL) cmsPipelineFree(OptimizedLUT); + + return FALSE; +} + diff --git a/local/recipes/libs/lcms2/source/plugins/fast_float/src/fast_float_15bits.c b/local/recipes/libs/lcms2/source/plugins/fast_float/src/fast_float_15bits.c new file mode 100644 index 0000000000..f754277e0d --- /dev/null +++ b/local/recipes/libs/lcms2/source/plugins/fast_float/src/fast_float_15bits.c @@ -0,0 +1,568 @@ +//--------------------------------------------------------------------------------- +// +// Little Color Management System, fast floating point extensions +// Copyright (c) 1998-2026 Marti Maria Saguer, all rights reserved +// +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +//--------------------------------------------------------------------------------- + +#include "fast_float_internal.h" + + +//--------------------------------------------------------------------------------- + +// The internal photoshop 16 bit format range is 1.15 fixed point, which goes 0..32768 +// (NOT 32767) that means: +// +// 16 bits encoding 15 bit Photoshop encoding +// ================ ========================= +// +// 0x0000 0x0000 +// 0xFFFF 0x8000 +// +// A nice (and fast) way to implement conversions is by using 64 bit values, which are +// native CPU word size in most today architectures. +// In CMYK, internal Photoshop format comes inverted, and this inversion happens after +// the resizing, so values 32769 to 65535 are never used in PhotoShop. + +//--------------------------------------------------------------------------------- + +// This macro converts 16 bits to 15 bits by using a 64 bits value +cmsINLINE cmsUInt16Number From16To15(cmsUInt16Number x16) +{ + cmsUInt64Number r64 = (((cmsUInt64Number)x16 << 15)) / 0xFFFFL; + return (cmsUInt16Number)r64; +} + +// This macro converts 15 bits to 16 bits by using a 64 bit value. It is based in fixed 1.15 math +cmsINLINE cmsUInt16Number From15To16(cmsUInt16Number x15) +{ + cmsUInt64Number r64 = ((cmsUInt64Number) x15 * 0xFFFF + 0x4000L) >> 15; + return (cmsUInt16Number)r64; +} + +// Specialized 1-channel formatters +static +cmsUInt8Number* Unroll15bitsGray(CMSREGISTER struct _cmstransform_struct* CMMcargo, + CMSREGISTER cmsUInt16Number Values[], + CMSREGISTER cmsUInt8Number* Buffer, + CMSREGISTER cmsUInt32Number Stride) +{ + UNUSED_PARAMETER(CMMcargo); + UNUSED_PARAMETER(Stride); + + Values[0] = From15To16(*(cmsUInt16Number*)Buffer); + + return Buffer + 2; +} + + +static +cmsUInt8Number* Pack15bitsGray(CMSREGISTER struct _cmstransform_struct* CMMcargo, + CMSREGISTER cmsUInt16Number Values[], + CMSREGISTER cmsUInt8Number* Buffer, + CMSREGISTER cmsUInt32Number Stride) +{ + UNUSED_PARAMETER(CMMcargo); + UNUSED_PARAMETER(Stride); + + *(cmsUInt16Number*)Buffer = From16To15(Values[0]); + return Buffer + 2; +} + +// Specialized 3-channels formatters +static +cmsUInt8Number* Unroll15bitsRGB(CMSREGISTER struct _cmstransform_struct* CMMcargo, + CMSREGISTER cmsUInt16Number Values[], + CMSREGISTER cmsUInt8Number* Buffer, + CMSREGISTER cmsUInt32Number Stride) +{ + UNUSED_PARAMETER(CMMcargo); + UNUSED_PARAMETER(Stride); + + Values[0] = From15To16(*(cmsUInt16Number*)Buffer); + Buffer += 2; + Values[1] = From15To16(*(cmsUInt16Number*)Buffer); + Buffer += 2; + Values[2] = From15To16(*(cmsUInt16Number*)Buffer); + + return Buffer + 2; +} + + +static +cmsUInt8Number* Pack15bitsRGB(CMSREGISTER struct _cmstransform_struct* CMMcargo, + CMSREGISTER cmsUInt16Number Values[], + CMSREGISTER cmsUInt8Number* Buffer, + CMSREGISTER cmsUInt32Number Stride) +{ + UNUSED_PARAMETER(CMMcargo); + UNUSED_PARAMETER(Stride); + + *(cmsUInt16Number*)Buffer = From16To15(Values[0]); + Buffer += 2; + *(cmsUInt16Number*)Buffer = From16To15(Values[1]); + Buffer += 2; + *(cmsUInt16Number*)Buffer = From16To15(Values[2]); + + return Buffer + 2; +} + + +static +cmsUInt8Number* Unroll15bitsRGBA(CMSREGISTER struct _cmstransform_struct* CMMcargo, + CMSREGISTER cmsUInt16Number Values[], + CMSREGISTER cmsUInt8Number* Buffer, + CMSREGISTER cmsUInt32Number Stride) +{ + UNUSED_PARAMETER(CMMcargo); + UNUSED_PARAMETER(Stride); + + Values[0] = From15To16(*(cmsUInt16Number*)Buffer); + Buffer += 2; + Values[1] = From15To16(*(cmsUInt16Number*)Buffer); + Buffer += 2; + Values[2] = From15To16(*(cmsUInt16Number*)Buffer); + + return Buffer + 4; +} + + +static +cmsUInt8Number* Pack15bitsRGBA(CMSREGISTER struct _cmstransform_struct* CMMcargo, + CMSREGISTER cmsUInt16Number Values[], + CMSREGISTER cmsUInt8Number* Buffer, + CMSREGISTER cmsUInt32Number Stride) +{ + UNUSED_PARAMETER(CMMcargo); + UNUSED_PARAMETER(Stride); + + *(cmsUInt16Number*)Buffer = From16To15(Values[0]); + Buffer += 2; + *(cmsUInt16Number*)Buffer = From16To15(Values[1]); + Buffer += 2; + *(cmsUInt16Number*)Buffer = From16To15(Values[2]); + + return Buffer + 4; +} + + +// Specialized 3 channels reversed formatters +static +cmsUInt8Number* Unroll15bitsBGR(CMSREGISTER struct _cmstransform_struct* CMMcargo, + CMSREGISTER cmsUInt16Number Values[], + CMSREGISTER cmsUInt8Number* Buffer, + CMSREGISTER cmsUInt32Number Stride) +{ + UNUSED_PARAMETER(CMMcargo); + UNUSED_PARAMETER(Stride); + + Values[2] = From15To16(*(cmsUInt16Number*)Buffer); + Buffer += 2; + Values[1] = From15To16(*(cmsUInt16Number*)Buffer); + Buffer += 2; + Values[0] = From15To16(*(cmsUInt16Number*)Buffer); + + return Buffer + 2; +} + + +static +cmsUInt8Number* Pack15bitsBGR(CMSREGISTER struct _cmstransform_struct* CMMcargo, + CMSREGISTER cmsUInt16Number Values[], + CMSREGISTER cmsUInt8Number* Buffer, + CMSREGISTER cmsUInt32Number Stride) +{ + UNUSED_PARAMETER(CMMcargo); + UNUSED_PARAMETER(Stride); + + *(cmsUInt16Number*)Buffer = From16To15(Values[2]); + Buffer += 2; + *(cmsUInt16Number*)Buffer = From16To15(Values[1]); + Buffer += 2; + *(cmsUInt16Number*)Buffer = From16To15(Values[0]); + + return Buffer+2; +} + +// Specialized 4 channels CMYK formatters. Note Photoshop stores CMYK reversed +static +cmsUInt8Number* Unroll15bitsCMYK(CMSREGISTER struct _cmstransform_struct* CMMcargo, + CMSREGISTER cmsUInt16Number Values[], + CMSREGISTER cmsUInt8Number* Buffer, + CMSREGISTER cmsUInt32Number Stride) +{ + UNUSED_PARAMETER(CMMcargo); + UNUSED_PARAMETER(Stride); + + Values[0] = From15To16(0x8000 - *(cmsUInt16Number*)Buffer); + Buffer += 2; + Values[1] = From15To16(0x8000 - *(cmsUInt16Number*)Buffer); + Buffer += 2; + Values[2] = From15To16(0x8000 - *(cmsUInt16Number*)Buffer); + Buffer += 2; + Values[3] = From15To16(0x8000 - *(cmsUInt16Number*)Buffer); + + return Buffer + 2; +} + +static +cmsUInt8Number* Pack15bitsCMYK(CMSREGISTER struct _cmstransform_struct* CMMcargo, + CMSREGISTER cmsUInt16Number Values[], + CMSREGISTER cmsUInt8Number* Buffer, + CMSREGISTER cmsUInt32Number Stride) +{ + UNUSED_PARAMETER(CMMcargo); + UNUSED_PARAMETER(Stride); + + *(cmsUInt16Number*)Buffer = 0x8000U - From16To15(Values[0]); + Buffer += 2; + *(cmsUInt16Number*)Buffer = 0x8000U - From16To15(Values[1]); + Buffer += 2; + *(cmsUInt16Number*)Buffer = 0x8000U - From16To15(Values[2]); + Buffer += 2; + *(cmsUInt16Number*)Buffer = 0x8000U - From16To15(Values[3]); + + return Buffer + 2; +} + + +// This macros does all handling for fallthrough cases +cmsINLINE cmsUInt16Number UnrollOne(cmsUInt16Number x, cmsBool Reverse, cmsBool SwapEndian) +{ + if (SwapEndian) + x = (x << 8) | (x >> 8); + + if (Reverse) + x = 0xffff - x; + + return From15To16(x); +} + +cmsINLINE cmsUInt16Number PackOne(cmsUInt16Number x, cmsBool Reverse, cmsBool SwapEndian) +{ + x = From16To15(x); + + if (Reverse) + x = 0xffff - x; + + if (SwapEndian) + x = (x << 8) | (x >> 8); + + return x; +} + +// Generic planar support +static +cmsUInt8Number* Unroll15bitsPlanar(CMSREGISTER struct _cmstransform_struct* CMMcargo, + CMSREGISTER cmsUInt16Number wIn[], + CMSREGISTER cmsUInt8Number* accum, + CMSREGISTER cmsUInt32Number Stride) +{ + _xform_head* head = (_xform_head*) CMMcargo; + int nChan = T_CHANNELS(head->InputFormat); + int DoSwap = T_DOSWAP(head->InputFormat); + int Reverse = T_FLAVOR(head->InputFormat); + int SwapEndian = T_ENDIAN16(head->InputFormat); + int i; + cmsUInt8Number* Init = accum; + + UNUSED_PARAMETER(Stride); + + if (DoSwap) { + accum += T_EXTRA(head->InputFormat) * Stride * 2; + } + + for (i = 0; i < nChan; i++) { + + int index = DoSwap ? (nChan - i - 1) : i; + + wIn[index] = UnrollOne(*(cmsUInt16Number*)accum, Reverse, SwapEndian); + + accum += Stride * 2; + } + + return (Init + 2); +} + + +static +cmsUInt8Number* Pack15bitsPlanar(CMSREGISTER struct _cmstransform_struct* CMMcargo, + CMSREGISTER cmsUInt16Number wOut[], + CMSREGISTER cmsUInt8Number* output, + CMSREGISTER cmsUInt32Number Stride) +{ + _xform_head* head = (_xform_head*)CMMcargo; + int nChan = T_CHANNELS(head->OutputFormat); + int DoSwap = T_DOSWAP(head->OutputFormat); + int Reverse = T_FLAVOR(head->OutputFormat); + int SwapEndian = T_ENDIAN16(head->OutputFormat); + CMSREGISTER int i; + cmsUInt8Number* Init = output; + + + if (DoSwap) { + output += T_EXTRA(head->OutputFormat) * Stride * 2; + } + + for (i = 0; i < nChan; i++) { + + int index = DoSwap ? (nChan - i - 1) : i; + + *(cmsUInt16Number*)output = PackOne(wOut[index], Reverse, SwapEndian); + output += (Stride * sizeof(cmsUInt16Number)); + } + + return (Init + sizeof(cmsUInt16Number)); +} + + + +// Generic fallthrough +static +cmsUInt8Number* Unroll15bitsChunky(CMSREGISTER struct _cmstransform_struct* CMMcargo, + CMSREGISTER cmsUInt16Number Values[], + CMSREGISTER cmsUInt8Number* Buffer, + CMSREGISTER cmsUInt32Number Stride) +{ + _xform_head* head = (_xform_head*) CMMcargo; + + int nChan = T_CHANNELS(head->InputFormat); + int DoSwap = T_DOSWAP(head->InputFormat); + int Reverse = T_FLAVOR(head->InputFormat); + int SwapEndian = T_ENDIAN16(head->InputFormat); + + CMSREGISTER int i; + + UNUSED_PARAMETER(Stride); + + if (DoSwap) { + Buffer += T_EXTRA(head->OutputFormat) * 2; + } + + for (i = 0; i < nChan; i++) { + + int index = DoSwap ? (nChan - i - 1) : i; + + Values[index] = UnrollOne(*(cmsUInt16Number*)Buffer, Reverse, SwapEndian); + + Buffer += 2; + } + + + return Buffer; +} + + +static +cmsUInt8Number* Pack15bitsChunky(CMSREGISTER struct _cmstransform_struct* CMMcargo, + CMSREGISTER cmsUInt16Number Values[], + CMSREGISTER cmsUInt8Number* Buffer, + CMSREGISTER cmsUInt32Number Stride) +{ + _xform_head* head = (_xform_head*)CMMcargo; + + int nChan = T_CHANNELS(head->OutputFormat); + int DoSwap = T_DOSWAP(head->OutputFormat); + int Reverse = T_FLAVOR(head->OutputFormat); + int SwapEndian = T_ENDIAN16(head->OutputFormat); + + CMSREGISTER int i; + + UNUSED_PARAMETER(Stride); + + if (DoSwap) { + Buffer += T_EXTRA(head->OutputFormat) * 2; + } + + for (i = 0; i < nChan; i++) { + + int index = DoSwap ? (nChan - i - 1) : i; + + *(cmsUInt16Number*)Buffer = PackOne(Values[index], Reverse, SwapEndian); + + Buffer += 2; + } + + return Buffer; +} + + + +// Generic N-bytes plus dither 16-to-8 conversion. +static int err[cmsMAXCHANNELS]; + +static +cmsUInt8Number* PackNBytesDither(CMSREGISTER struct _cmstransform_struct* CMMcargo, + CMSREGISTER cmsUInt16Number Values[], + CMSREGISTER cmsUInt8Number* Buffer, + CMSREGISTER cmsUInt32Number Stride) +{ + _xform_head* info = (_xform_head*)CMMcargo; + + int nChan = T_CHANNELS(info->OutputFormat); + CMSREGISTER int i; + unsigned int n, pe, pf; + + UNUSED_PARAMETER(Stride); + + for (i = 0; i < nChan; i++) { + + n = Values[i] + err[i]; // Value + + pe = (n / 257); // Whole part + pf = (n % 257); // Fractional part + + err[i] = pf; // Store it for next pixel + + *Buffer++ = (cmsUInt8Number) pe; + } + + return Buffer + T_EXTRA(info->OutputFormat); +} + + +static +cmsUInt8Number* PackNBytesSwapDither(CMSREGISTER struct _cmstransform_struct* CMMcargo, + CMSREGISTER cmsUInt16Number Values[], + CMSREGISTER cmsUInt8Number* Buffer, + CMSREGISTER cmsUInt32Number Stride) +{ + _xform_head* info = (_xform_head*)CMMcargo; + + int nChan = T_CHANNELS(info->OutputFormat); + CMSREGISTER int i; + unsigned int n, pe, pf; + + UNUSED_PARAMETER(Stride); + + for (i = nChan - 1; i >= 0; --i) { + + n = Values[i] + err[i]; // Value + + pe = (n / 257); // Whole part + pf = (n % 257); // Fractional part + + err[i] = pf; // Store it for next pixel + + *Buffer++ = (cmsUInt8Number)pe; + } + + + return Buffer + T_EXTRA(info->OutputFormat); +} + + +// The factory for 15 bits. This function returns a pointer to specialized function +// that would deal with the asked format. It return a pointer to NULL if the format +// is not supported. This is the basis of formatter plug-in for 15 bit formats. +CMSCHECKPOINT cmsFormatter CMSEXPORT Formatter_15Bit_Factory(cmsUInt32Number Type, + cmsFormatterDirection Dir, + cmsUInt32Number dwFlags) +{ + cmsFormatter Result = { NULL }; + + UNUSED_PARAMETER(dwFlags); + + switch (Type) { + + // Simple Gray + case TYPE_GRAY_15: + Result.Fmt16 = (Dir == cmsFormatterInput) ? Unroll15bitsGray : Pack15bitsGray; + break; + + // 3 channels + case TYPE_CMY_15: + case TYPE_RGB_15: + Result.Fmt16 = (Dir == cmsFormatterInput) ? Unroll15bitsRGB : Pack15bitsRGB; + break; + + // 3 channels reversed + case TYPE_YMC_15: + case TYPE_BGR_15: + Result.Fmt16 = (Dir == cmsFormatterInput) ? Unroll15bitsBGR : Pack15bitsBGR; + break; + + // 3 Channels plus one alpha + case TYPE_RGBA_15: + Result.Fmt16 = (Dir == cmsFormatterInput) ? Unroll15bitsRGBA : Pack15bitsRGBA; + break; + + // 4 channels + case TYPE_CMYK_15: + Result.Fmt16 = (Dir == cmsFormatterInput) ? Unroll15bitsCMYK : Pack15bitsCMYK; + break; + + // Planar versions + case TYPE_GRAYA_15_PLANAR: + case TYPE_RGB_15_PLANAR: + case TYPE_BGR_15_PLANAR: + case TYPE_RGBA_15_PLANAR: + case TYPE_ABGR_15_PLANAR: + case TYPE_CMY_15_PLANAR: + case TYPE_CMYK_15_PLANAR: + Result.Fmt16 = (Dir == cmsFormatterInput) ? Unroll15bitsPlanar : Pack15bitsPlanar; + break; + + // Fallthrough for remaining (corner) cases + case TYPE_GRAY_15_REV: + case TYPE_GRAY_15_SE: + case TYPE_GRAYA_15: + case TYPE_GRAYA_15_SE: + case TYPE_RGB_15_SE: + case TYPE_BGR_15_SE: + case TYPE_RGBA_15_SE: + case TYPE_ARGB_15: + case TYPE_ABGR_15: + case TYPE_ABGR_15_SE: + case TYPE_BGRA_15: + case TYPE_BGRA_15_SE: + case TYPE_CMY_15_SE: + case TYPE_CMYK_15_REV: + case TYPE_CMYK_15_SE: + case TYPE_KYMC_15: + case TYPE_KYMC_15_SE: + case TYPE_KCMY_15: + case TYPE_KCMY_15_REV: + case TYPE_KCMY_15_SE: + Result.Fmt16 = (Dir == cmsFormatterInput) ? Unroll15bitsChunky : Pack15bitsChunky; + break; + + case TYPE_GRAY_8_DITHER: + case TYPE_RGB_8_DITHER: + case TYPE_RGBA_8_DITHER: + case TYPE_CMYK_8_DITHER: + if (Dir == cmsFormatterOutput) { + Result.Fmt16 = PackNBytesDither; + } + break; + + case TYPE_ABGR_8_DITHER: + case TYPE_BGR_8_DITHER: + case TYPE_KYMC_8_DITHER: + if (Dir == cmsFormatterOutput) { + Result.Fmt16 = PackNBytesSwapDither; + } + break; + + default:; + } + + return Result; +} + + + diff --git a/local/recipes/libs/lcms2/source/plugins/fast_float/src/fast_float_15mats.c b/local/recipes/libs/lcms2/source/plugins/fast_float/src/fast_float_15mats.c new file mode 100644 index 0000000000..2b12e6c919 --- /dev/null +++ b/local/recipes/libs/lcms2/source/plugins/fast_float/src/fast_float_15mats.c @@ -0,0 +1,358 @@ +//--------------------------------------------------------------------------------- +// +// Little Color Management System, fast floating point extensions +// Copyright (c) 1998-2026 Marti Maria Saguer, all rights reserved +// +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +//--------------------------------------------------------------------------------- + +// Optimization for matrix-shaper in 15 bits. Numbers are operated in 1.15 unsigned, + +#include "fast_float_internal.h" + +// An storage capable to keep 1.15 signed and some extra precision. +// Actually I use 32 bits integer (signed) +typedef cmsInt32Number cmsS1Fixed15Number; + +// Conversion to fixed. Note we don't use floor to get proper sign roundoff +#define DOUBLE_TO_1FIXED15(x) ((cmsS1Fixed15Number) ((double) (x) * 0x8000 + 0.5)) + +// This is the private data container used by this optimization +typedef struct { + + cmsS1Fixed15Number Mat[3][3]; + cmsS1Fixed15Number Off[3]; + + // Precalculated tables for first shaper (375 Kb in total of both shapers) + cmsUInt16Number Shaper1R[MAX_NODES_IN_CURVE]; + cmsUInt16Number Shaper1G[MAX_NODES_IN_CURVE]; + cmsUInt16Number Shaper1B[MAX_NODES_IN_CURVE]; + + // Second shaper + cmsUInt16Number Shaper2R[MAX_NODES_IN_CURVE]; + cmsUInt16Number Shaper2G[MAX_NODES_IN_CURVE]; + cmsUInt16Number Shaper2B[MAX_NODES_IN_CURVE]; + + // A flag for fast operation if identity + cmsBool IdentityMat; + + // The context + cmsContext ContextID; + + // Points to the raw, unaligned memory + void * real_ptr; + + +} XMatShaperData; + +// A special malloc that returns memory aligned to DWORD boundary. Aligned memory access is way faster than unaligned +// reference to the real block is kept for later free +static XMatShaperData* malloc_aligned(cmsContext ContextID) +{ + cmsUInt8Number* real_ptr = (cmsUInt8Number*)_cmsMallocZero(ContextID, sizeof(XMatShaperData) + 32); + cmsUInt8Number* aligned = (cmsUInt8Number*)(((uintptr_t)real_ptr + 16) & ~0xf); + XMatShaperData* p = (XMatShaperData*)aligned; + + p->real_ptr = real_ptr; + p->ContextID = ContextID; + return p; +} + + +// Free the private data container +static +void FreeMatShaper(cmsContext ContextID, void* Data) +{ + + XMatShaperData* p = (XMatShaperData*)Data; + if (p != NULL) + _cmsFree(ContextID, p->real_ptr); +} + + +// This table converts from 8 bits to 1.14 after applying the curve +static +void FillShaper(cmsUInt16Number* Table, cmsToneCurve* Curve) +{ + int i; + cmsFloat32Number R, y; + + for (i = 0; i < MAX_NODES_IN_CURVE; i++) { + + R = (cmsFloat32Number)i / (cmsFloat32Number) (MAX_NODES_IN_CURVE - 1); + y = cmsEvalToneCurveFloat(Curve, R); + + Table[i] = (cmsUInt16Number) DOUBLE_TO_1FIXED15(y); + } +} + + +// Compute the matrix-shaper structure +static +XMatShaperData* SetMatShaper(cmsContext ContextID, cmsToneCurve* Curve1[3], cmsMAT3* Mat, cmsVEC3* Off, cmsToneCurve* Curve2[3], cmsBool IdentityMat) +{ + XMatShaperData* p; + int i, j; + + // Allocate a big chuck of memory to store precomputed tables + p = malloc_aligned(ContextID); + if (p == NULL) return FALSE; + + p->ContextID = ContextID; + + p->IdentityMat = IdentityMat; + + // Precompute tables + FillShaper(p->Shaper1R, Curve1[0]); + FillShaper(p->Shaper1G, Curve1[1]); + FillShaper(p->Shaper1B, Curve1[2]); + + FillShaper(p->Shaper2R, Curve2[0]); + FillShaper(p->Shaper2G, Curve2[1]); + FillShaper(p->Shaper2B, Curve2[2]); + + // Convert matrix to nFixed14. Note that those values may take more than 16 bits if negative + for (i = 0; i < 3; i++) { + for (j = 0; j < 3; j++) { + + p->Mat[i][j] = DOUBLE_TO_1FIXED15(Mat->v[i].n[j]); + } + } + + + for (i = 0; i < 3; i++) { + + if (Off == NULL) { + + p->Off[i] = 0x4000; + + } + else { + p->Off[i] = DOUBLE_TO_1FIXED15(Off->n[i]) + 0x4000; + + } + } + + + return p; +} + +// A fast matrix-shaper evaluator for 15 bits. This is a bit ticky since I'm using 1.15 signed fixed point. +static +void MatShaperXform(struct _cmstransform_struct *CMMcargo, + const void* Input, + void* Output, + cmsUInt32Number PixelsPerLine, + cmsUInt32Number LineCount, + const cmsStride* Stride) +{ + XMatShaperData* p = (XMatShaperData*)_cmsGetTransformUserData(CMMcargo); + + cmsS1Fixed15Number l1, l2, l3; + + cmsS1Fixed15Number r, g, b; + cmsUInt32Number ri, gi, bi; + cmsUInt32Number i, ii; + cmsUInt32Number SourceStartingOrder[cmsMAXCHANNELS]; + cmsUInt32Number SourceIncrements[cmsMAXCHANNELS]; + cmsUInt32Number DestStartingOrder[cmsMAXCHANNELS]; + cmsUInt32Number DestIncrements[cmsMAXCHANNELS]; + + const cmsUInt8Number* rin; + const cmsUInt8Number* gin; + const cmsUInt8Number* bin; + const cmsUInt8Number* ain = NULL; + + cmsUInt8Number* rout; + cmsUInt8Number* gout; + cmsUInt8Number* bout; + cmsUInt8Number* aout = NULL; + + cmsUInt32Number nalpha; + size_t strideIn, strideOut; + + _cmsComputeComponentIncrements(cmsGetTransformInputFormat((cmsHTRANSFORM)CMMcargo), Stride->BytesPerPlaneIn, NULL, &nalpha, SourceStartingOrder, SourceIncrements); + _cmsComputeComponentIncrements(cmsGetTransformOutputFormat((cmsHTRANSFORM)CMMcargo), Stride->BytesPerPlaneOut, NULL, &nalpha, DestStartingOrder, DestIncrements); + + if (!(_cmsGetTransformFlags(CMMcargo) & cmsFLAGS_COPY_ALPHA)) + nalpha = 0; + + strideIn = strideOut = 0; + for (i = 0; i < LineCount; i++) { + + rin = (const cmsUInt8Number*)Input + SourceStartingOrder[0] + strideIn; + gin = (const cmsUInt8Number*)Input + SourceStartingOrder[1] + strideIn; + bin = (const cmsUInt8Number*)Input + SourceStartingOrder[2] + strideIn; + if (nalpha) + ain = (const cmsUInt8Number*)Input + SourceStartingOrder[3] + strideIn; + + + rout = (cmsUInt8Number*)Output + DestStartingOrder[0] + strideOut; + gout = (cmsUInt8Number*)Output + DestStartingOrder[1] + strideOut; + bout = (cmsUInt8Number*)Output + DestStartingOrder[2] + strideOut; + if (nalpha) + aout = (cmsUInt8Number*)Output + DestStartingOrder[3] + strideOut; + + + for (ii = 0; ii < PixelsPerLine; ii++) { + + // Across first shaper, which also converts to 1.15 fixed point. + r = p->Shaper1R[*(cmsUInt16Number*)rin]; + g = p->Shaper1G[*(cmsUInt16Number*)gin]; + b = p->Shaper1B[*(cmsUInt16Number*)bin]; + + if (p->IdentityMat) + { + l1 = r; l2 = g; l3 = b; + } + else + { + // Evaluate the matrix in 1.14 fixed point + l1 = (p->Mat[0][0] * r + p->Mat[0][1] * g + p->Mat[0][2] * b + p->Off[0]) >> 15; + l2 = (p->Mat[1][0] * r + p->Mat[1][1] * g + p->Mat[1][2] * b + p->Off[1]) >> 15; + l3 = (p->Mat[2][0] * r + p->Mat[2][1] * g + p->Mat[2][2] * b + p->Off[2]) >> 15; + } + + // Now we have to clip to 0..1.0 range + ri = (l1 < 0) ? 0 : ((l1 > 0x8000) ? 0x8000 : l1); + gi = (l2 < 0) ? 0 : ((l2 > 0x8000) ? 0x8000 : l2); + bi = (l3 < 0) ? 0 : ((l3 > 0x8000) ? 0x8000 : l3); + + + // And across second shaper, + *(cmsUInt16Number*)rout = p->Shaper2R[ri]; + *(cmsUInt16Number*)gout = p->Shaper2G[gi]; + *(cmsUInt16Number*)bout = p->Shaper2B[bi]; + + + // Handle alpha + if (ain) { + memmove(aout, ain, 2); + } + + rin += SourceIncrements[0]; + gin += SourceIncrements[1]; + bin += SourceIncrements[2]; + if (ain) ain += SourceIncrements[3]; + + rout += DestIncrements[0]; + gout += DestIncrements[1]; + bout += DestIncrements[2]; + if (aout) aout += DestIncrements[3]; + } + + strideIn += Stride->BytesPerLineIn; + strideOut += Stride->BytesPerLineOut; + } +} + + + +// 15 bits on input allows matrix-shaper boost up a little bit +cmsBool OptimizeMatrixShaper15(_cmsTransform2Fn* TransformFn, + void** UserData, + _cmsFreeUserDataFn* FreeUserData, + cmsPipeline** Lut, + cmsUInt32Number* InputFormat, + cmsUInt32Number* OutputFormat, + cmsUInt32Number* dwFlags) +{ + cmsStage* Curve1, *Curve2; + cmsStage* Matrix1, *Matrix2; + _cmsStageMatrixData* Data1; + _cmsStageMatrixData* Data2; + cmsMAT3 res; + cmsBool IdentityMat = FALSE; + cmsPipeline* Dest, *Src; + cmsContext ContextID; + cmsUInt32Number nChans; + + // Only works on RGB to RGB and gray + + if (!(T_CHANNELS(*InputFormat) == 3 && T_CHANNELS(*OutputFormat) == 3)) return FALSE; + + // Only works on 15 bit to 15 bit + if (T_BYTES(*InputFormat) != 2 || T_BYTES(*OutputFormat) != 2 || + T_BIT15(*InputFormat) == 0 || T_BIT15(*OutputFormat) == 0) return FALSE; + + // Seems suitable, proceed + Src = *Lut; + + // Check for shaper-matrix-matrix-shaper structure, that is what this optimizer stands for + if (!cmsPipelineCheckAndRetreiveStages(Src, 4, + cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType, + &Curve1, &Matrix1, &Matrix2, &Curve2)) return FALSE; + + ContextID = cmsGetPipelineContextID(Src); + nChans = T_CHANNELS(*InputFormat); + + // Get both matrices, which are 3x3 + Data1 = (_cmsStageMatrixData*)cmsStageData(Matrix1); + Data2 = (_cmsStageMatrixData*)cmsStageData(Matrix2); + + // Input offset should be zero + if (Data1->Offset != NULL) return FALSE; + + // Multiply both matrices to get the result + _cmsMAT3per(&res, (cmsMAT3*)Data2->Double, (cmsMAT3*)Data1->Double); + + // Now the result is in res + Data2 -> Offset. Maybe is a plain identity? + IdentityMat = FALSE; + if (_cmsMAT3isIdentity(&res) && Data2->Offset == NULL) { + + // We can get rid of full matrix + IdentityMat = TRUE; + } + + + // Allocate an empty LUT + Dest = cmsPipelineAlloc(ContextID, nChans, nChans); + if (!Dest) return FALSE; + + // Assamble the new LUT + cmsPipelineInsertStage(Dest, cmsAT_BEGIN, cmsStageDup(Curve1)); + + if (!IdentityMat) { + + cmsPipelineInsertStage(Dest, cmsAT_END, + cmsStageAllocMatrix(ContextID, 3, 3, (const cmsFloat64Number*)&res, Data2->Offset)); + } + + cmsPipelineInsertStage(Dest, cmsAT_END, cmsStageDup(Curve2)); + + { + _cmsStageToneCurvesData* mpeC1 = (_cmsStageToneCurvesData*)cmsStageData(Curve1); + _cmsStageToneCurvesData* mpeC2 = (_cmsStageToneCurvesData*)cmsStageData(Curve2); + + // In this particular optimization, cache does not help as it takes more time to deal with + // the cache than with the pixel handling + *dwFlags |= cmsFLAGS_NOCACHE; + + // Setup the optimizarion routines + *UserData = SetMatShaper(ContextID, mpeC1->TheCurves, &res, (cmsVEC3*)Data2->Offset, mpeC2->TheCurves, IdentityMat); + *FreeUserData = FreeMatShaper; + + *TransformFn = MatShaperXform; + } + + + cmsPipelineFree(Src); + *dwFlags &= ~cmsFLAGS_CAN_CHANGE_FORMATTER; + *Lut = Dest; + return TRUE; +} + + diff --git a/local/recipes/libs/lcms2/source/plugins/fast_float/src/fast_float_cmyk.c b/local/recipes/libs/lcms2/source/plugins/fast_float/src/fast_float_cmyk.c new file mode 100644 index 0000000000..f6597017d9 --- /dev/null +++ b/local/recipes/libs/lcms2/source/plugins/fast_float/src/fast_float_cmyk.c @@ -0,0 +1,393 @@ +//--------------------------------------------------------------------------------- +// +// Little Color Management System, fast floating point extensions +// Copyright (c) 1998-2026 Marti Maria Saguer, all rights reserved +// +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +//--------------------------------------------------------------------------------- + +#include "fast_float_internal.h" + +// Optimization for floating point tetrahedral interpolation +typedef struct { + + cmsContext ContextID; + const cmsInterpParams* p; // Tetrahedrical interpolation parameters. This is a not-owned pointer. + +} FloatCMYKData; + + + +// Precomputes tables on input devicelink. +static +FloatCMYKData* FloatCMYKAlloc(cmsContext ContextID, const cmsInterpParams* p) +{ + FloatCMYKData* fd; + + fd = (FloatCMYKData*) _cmsMallocZero(ContextID, sizeof(FloatCMYKData)); + if (fd == NULL) return NULL; + + fd ->ContextID = ContextID; + fd ->p = p; + return fd; +} + + +static +int XFormSampler(CMSREGISTER const cmsFloat32Number In[], CMSREGISTER cmsFloat32Number Out[], CMSREGISTER void* Cargo) +{ + // Evaluate in 16 bits + cmsPipelineEvalFloat(In, Out, (cmsPipeline*) Cargo); + + // Always succeed + return TRUE; +} + +cmsINLINE cmsFloat32Number LinearInterpInt(cmsFloat32Number a, cmsFloat32Number l, cmsFloat32Number h) +{ + return (h - l) * a + l; +} + +// To prevent out of bounds indexing +cmsINLINE cmsFloat32Number fclamp100(cmsFloat32Number v) +{ + return ((v < 1.0e-9f) || isnan(v)) ? 0.0f : (v > 100.0f ? 100.0f : v); +} + + +// A optimized interpolation for 8-bit input. +#define DENS(i,j,k) (LutTable[(i)+(j)+(k)+OutChan]) + +static +void FloatCMYKCLUTEval(struct _cmstransform_struct *CMMcargo, + const void* Input, + void* Output, + cmsUInt32Number PixelsPerLine, + cmsUInt32Number LineCount, + const cmsStride* Stride) +{ + + cmsFloat32Number c, m, y, k; + cmsFloat32Number px, py, pz, pk; + int x0, y0, z0, k0; + int X0, Y0, Z0, K0, X1, Y1, Z1, K1; + cmsFloat32Number rx, ry, rz, rk; + cmsFloat32Number c0, c1 = 0, c2 = 0, c3 = 0; + + cmsUInt32Number OutChan; + FloatCMYKData* pcmyk = (FloatCMYKData*) _cmsGetTransformUserData(CMMcargo); + + const cmsInterpParams* p = pcmyk ->p; + cmsUInt32Number TotalOut = p -> nOutputs; + cmsUInt32Number TotalPlusAlpha; + const cmsFloat32Number* LutTable = (const cmsFloat32Number*)p->Table; + cmsUInt32Number i, ii; + const cmsUInt8Number* cin; + const cmsUInt8Number* min; + const cmsUInt8Number* yin; + const cmsUInt8Number* kin; + const cmsUInt8Number* ain = NULL; + + cmsFloat32Number Tmp1[cmsMAXCHANNELS], Tmp2[cmsMAXCHANNELS]; + + cmsUInt8Number* out[cmsMAXCHANNELS]; + cmsUInt32Number SourceStartingOrder[cmsMAXCHANNELS]; + cmsUInt32Number SourceIncrements[cmsMAXCHANNELS]; + cmsUInt32Number DestStartingOrder[cmsMAXCHANNELS]; + cmsUInt32Number DestIncrements[cmsMAXCHANNELS]; + + cmsUInt32Number InputFormat = cmsGetTransformInputFormat((cmsHTRANSFORM) CMMcargo); + cmsUInt32Number OutputFormat = cmsGetTransformOutputFormat((cmsHTRANSFORM) CMMcargo); + + cmsUInt32Number nchans, nalpha; + size_t strideIn, strideOut; + + _cmsComputeComponentIncrements(InputFormat, Stride->BytesPerPlaneIn, &nchans, &nalpha, SourceStartingOrder, SourceIncrements); + _cmsComputeComponentIncrements(OutputFormat, Stride->BytesPerPlaneOut, &nchans, &nalpha, DestStartingOrder, DestIncrements); + + if (!(_cmsGetTransformFlags(CMMcargo) & cmsFLAGS_COPY_ALPHA)) + nalpha = 0; + + strideIn = strideOut = 0; + for (i = 0; i < LineCount; i++) { + + cin = (const cmsUInt8Number*)Input + SourceStartingOrder[0] + strideIn; + min = (const cmsUInt8Number*)Input + SourceStartingOrder[1] + strideIn; + yin = (const cmsUInt8Number*)Input + SourceStartingOrder[2] + strideIn; + kin = (const cmsUInt8Number*)Input + SourceStartingOrder[3] + strideIn; + + if (nalpha) + ain = (const cmsUInt8Number*)Input + SourceStartingOrder[4] + strideIn; + + TotalPlusAlpha = TotalOut; + if (ain) TotalPlusAlpha++; + + for (ii = 0; ii < TotalPlusAlpha; ii++) + out[ii] = (cmsUInt8Number*)Output + DestStartingOrder[ii] + strideOut; + + for (ii = 0; ii < PixelsPerLine; ii++) { + + c = fclamp100(*(cmsFloat32Number*)cin) / 100.0f; + m = fclamp100(*(cmsFloat32Number*)min) / 100.0f; + y = fclamp100(*(cmsFloat32Number*)yin) / 100.0f; + k = fclamp100(*(cmsFloat32Number*)kin) / 100.0f; + + cin += SourceIncrements[0]; + min += SourceIncrements[1]; + yin += SourceIncrements[2]; + kin += SourceIncrements[3]; + + pk = c * p->Domain[0]; // C + px = m * p->Domain[1]; // M + py = y * p->Domain[2]; // Y + pz = k * p->Domain[3]; // K + + + k0 = (int)_cmsQuickFloor(pk); rk = (pk - (cmsFloat32Number)k0); + x0 = (int)_cmsQuickFloor(px); rx = (px - (cmsFloat32Number)x0); + y0 = (int)_cmsQuickFloor(py); ry = (py - (cmsFloat32Number)y0); + z0 = (int)_cmsQuickFloor(pz); rz = (pz - (cmsFloat32Number)z0); + + + K0 = p->opta[3] * k0; + K1 = K0 + (c >= 1.0 ? 0 : p->opta[3]); + + X0 = p->opta[2] * x0; + X1 = X0 + (m >= 1.0 ? 0 : p->opta[2]); + + Y0 = p->opta[1] * y0; + Y1 = Y0 + (y >= 1.0 ? 0 : p->opta[1]); + + Z0 = p->opta[0] * z0; + Z1 = Z0 + (k >= 1.0 ? 0 : p->opta[0]); + + for (OutChan = 0; OutChan < TotalOut; OutChan++) { + + c0 = DENS(X0, Y0, Z0); + + if (rx >= ry && ry >= rz) { + + c1 = DENS(X1, Y0, Z0) - c0; + c2 = DENS(X1, Y1, Z0) - DENS(X1, Y0, Z0); + c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0); + + } + else + if (rx >= rz && rz >= ry) { + + c1 = DENS(X1, Y0, Z0) - c0; + c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1); + c3 = DENS(X1, Y0, Z1) - DENS(X1, Y0, Z0); + + } + else + if (rz >= rx && rx >= ry) { + + c1 = DENS(X1, Y0, Z1) - DENS(X0, Y0, Z1); + c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1); + c3 = DENS(X0, Y0, Z1) - c0; + + } + else + if (ry >= rx && rx >= rz) { + + c1 = DENS(X1, Y1, Z0) - DENS(X0, Y1, Z0); + c2 = DENS(X0, Y1, Z0) - c0; + c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0); + + } + else + if (ry >= rz && rz >= rx) { + + c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1); + c2 = DENS(X0, Y1, Z0) - c0; + c3 = DENS(X0, Y1, Z1) - DENS(X0, Y1, Z0); + + } + else + if (rz >= ry && ry >= rx) { + + c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1); + c2 = DENS(X0, Y1, Z1) - DENS(X0, Y0, Z1); + c3 = DENS(X0, Y0, Z1) - c0; + + } + else { + c1 = c2 = c3 = 0; + } + + + Tmp1[OutChan] = c0 + c1 * rx + c2 * ry + c3 * rz; + + } + + + LutTable = (cmsFloat32Number*)p->Table; + LutTable += K1; + + for (OutChan = 0; OutChan < p->nOutputs; OutChan++) { + + c0 = DENS(X0, Y0, Z0); + + if (rx >= ry && ry >= rz) { + + c1 = DENS(X1, Y0, Z0) - c0; + c2 = DENS(X1, Y1, Z0) - DENS(X1, Y0, Z0); + c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0); + + } + else + if (rx >= rz && rz >= ry) { + + c1 = DENS(X1, Y0, Z0) - c0; + c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1); + c3 = DENS(X1, Y0, Z1) - DENS(X1, Y0, Z0); + + } + else + if (rz >= rx && rx >= ry) { + + c1 = DENS(X1, Y0, Z1) - DENS(X0, Y0, Z1); + c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1); + c3 = DENS(X0, Y0, Z1) - c0; + + } + else + if (ry >= rx && rx >= rz) { + + c1 = DENS(X1, Y1, Z0) - DENS(X0, Y1, Z0); + c2 = DENS(X0, Y1, Z0) - c0; + c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0); + + } + else + if (ry >= rz && rz >= rx) { + + c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1); + c2 = DENS(X0, Y1, Z0) - c0; + c3 = DENS(X0, Y1, Z1) - DENS(X0, Y1, Z0); + + } + else + if (rz >= ry && ry >= rx) { + + c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1); + c2 = DENS(X0, Y1, Z1) - DENS(X0, Y0, Z1); + c3 = DENS(X0, Y0, Z1) - c0; + + } + else { + c1 = c2 = c3 = 0; + } + + Tmp2[OutChan] = c0 + c1 * rx + c2 * ry + c3 * rz; + } + + + for (OutChan = 0; OutChan < p->nOutputs; OutChan++) { + + *(cmsFloat32Number*)(out[OutChan]) = LinearInterpInt(rk, Tmp1[OutChan], Tmp2[OutChan]); + out[OutChan] += DestIncrements[OutChan]; + } + + if (ain) { + *(cmsFloat32Number*)(out[TotalOut]) = *(cmsFloat32Number*)ain; + ain += SourceIncrements[4]; + out[TotalOut] += DestIncrements[TotalOut]; + } + } + + strideIn += Stride->BytesPerLineIn; + strideOut += Stride->BytesPerLineOut; + } +} + +#undef DENS + + + +// -------------------------------------------------------------------------------------------------------------- + +cmsBool OptimizeCLUTCMYKTransform(_cmsTransform2Fn* TransformFn, + void** UserData, + _cmsFreeUserDataFn* FreeDataFn, + cmsPipeline** Lut, + cmsUInt32Number* InputFormat, + cmsUInt32Number* OutputFormat, + cmsUInt32Number* dwFlags) +{ + cmsPipeline* OriginalLut; + int nGridPoints; + cmsPipeline* OptimizedLUT = NULL; + cmsStage* OptimizedCLUTmpe; + FloatCMYKData* pcmyk; + cmsContext ContextID; + _cmsStageCLutData* data; + + // For empty transforms, do nothing + if (*Lut == NULL) return FALSE; + + // This is a lossy optimization! does not apply in floating-point cases + if (!T_FLOAT(*InputFormat) || !T_FLOAT(*OutputFormat)) return FALSE; + + // Only on 8-bit + if (T_BYTES(*InputFormat) != 4 || T_BYTES(*OutputFormat) != 4) return FALSE; + + // Only on CMYK + if (T_COLORSPACE(*InputFormat) != PT_CMYK) return FALSE; + + OriginalLut = *Lut; + + ContextID = cmsGetPipelineContextID(OriginalLut); + nGridPoints = _cmsReasonableGridpointsByColorspace(cmsSigRgbData, *dwFlags); + + // Create the result LUT + OptimizedLUT = cmsPipelineAlloc(cmsGetPipelineContextID(OriginalLut), 4, cmsPipelineOutputChannels(OriginalLut)); + if (OptimizedLUT == NULL) goto Error; + + + // Allocate the CLUT for result + OptimizedCLUTmpe = cmsStageAllocCLutFloat(ContextID, nGridPoints, 4, cmsPipelineOutputChannels(OriginalLut), NULL); + + // Add the CLUT to the destination LUT + cmsPipelineInsertStage(OptimizedLUT, cmsAT_BEGIN, OptimizedCLUTmpe); + + // Resample the LUT + if (!cmsStageSampleCLutFloat(OptimizedCLUTmpe, XFormSampler, (void*)OriginalLut, 0)) goto Error; + + // Set the evaluator, copy parameters + data = (_cmsStageCLutData*) cmsStageData(OptimizedCLUTmpe); + + pcmyk = FloatCMYKAlloc(ContextID, data ->Params); + if (pcmyk == NULL) return FALSE; + + // And return the obtained LUT + cmsPipelineFree(OriginalLut); + + *Lut = OptimizedLUT; + *TransformFn = FloatCMYKCLUTEval; + *UserData = pcmyk; + *FreeDataFn = _fast_float_free_user_data; + *dwFlags &= ~cmsFLAGS_CAN_CHANGE_FORMATTER; + return TRUE; + +Error: + + if (OptimizedLUT != NULL) cmsPipelineFree(OptimizedLUT); + + return FALSE; +} + diff --git a/local/recipes/libs/lcms2/source/plugins/fast_float/src/fast_float_curves.c b/local/recipes/libs/lcms2/source/plugins/fast_float/src/fast_float_curves.c new file mode 100644 index 0000000000..b2c112f98f --- /dev/null +++ b/local/recipes/libs/lcms2/source/plugins/fast_float/src/fast_float_curves.c @@ -0,0 +1,480 @@ +//--------------------------------------------------------------------------------- +// +// Little Color Management System, fast floating point extensions +// Copyright (c) 1998-2026 Marti Maria Saguer, all rights reserved +// +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +//--------------------------------------------------------------------------------- + +#include "fast_float_internal.h" + +// Curves, optimization is valid for floating point curves +typedef struct { + + cmsFloat32Number CurveR[MAX_NODES_IN_CURVE]; + cmsFloat32Number CurveG[MAX_NODES_IN_CURVE]; + cmsFloat32Number CurveB[MAX_NODES_IN_CURVE]; + + void* real_ptr; + +} CurvesFloatData; + + + +// A special malloc that returns memory aligned to DWORD boundary. Aligned memory access is way faster than unaligned +// reference to the real block is kept for later free +static CurvesFloatData* malloc_aligned(cmsContext ContextID) +{ + cmsUInt8Number* real_ptr = (cmsUInt8Number*)_cmsMallocZero(ContextID, sizeof(CurvesFloatData) + 32); + cmsUInt8Number* aligned = (cmsUInt8Number*)(((uintptr_t)real_ptr + 16) & ~0xf); + CurvesFloatData* p = (CurvesFloatData*)aligned; + + p->real_ptr = real_ptr; + + return p; +} + +// Free the private data container +static void free_aligned(cmsContext ContextID, void* Data) +{ + CurvesFloatData* p = (CurvesFloatData*)Data; + if (p != NULL) + _cmsFree(ContextID, p->real_ptr); +} + +// Evaluator for float curves. This are just 1D tables + +static void FastEvaluateFloatRGBCurves(struct _cmstransform_struct *CMMcargo, + const void* Input, + void* Output, + cmsUInt32Number PixelsPerLine, + cmsUInt32Number LineCount, + const cmsStride* Stride) +{ + cmsUInt32Number i, ii; + cmsUInt32Number SourceStartingOrder[cmsMAXCHANNELS]; + cmsUInt32Number SourceIncrements[cmsMAXCHANNELS]; + cmsUInt32Number DestStartingOrder[cmsMAXCHANNELS]; + cmsUInt32Number DestIncrements[cmsMAXCHANNELS]; + + const cmsUInt8Number* rin; + const cmsUInt8Number* gin; + const cmsUInt8Number* bin; + const cmsUInt8Number* ain = NULL; + + cmsUInt8Number* rout; + cmsUInt8Number* gout; + cmsUInt8Number* bout; + cmsUInt8Number* aout = NULL; + + cmsUInt32Number InputFormat = cmsGetTransformInputFormat((cmsHTRANSFORM) CMMcargo); + cmsUInt32Number OutputFormat = cmsGetTransformOutputFormat((cmsHTRANSFORM) CMMcargo); + + CurvesFloatData* Data = (CurvesFloatData*) _cmsGetTransformUserData(CMMcargo); + + cmsUInt32Number nchans, nalpha; + size_t strideIn, strideOut; + + _cmsComputeComponentIncrements(InputFormat, Stride->BytesPerPlaneIn, &nchans, &nalpha, SourceStartingOrder, SourceIncrements); + _cmsComputeComponentIncrements(OutputFormat, Stride->BytesPerPlaneOut, &nchans, &nalpha, DestStartingOrder, DestIncrements); + + if (!(_cmsGetTransformFlags(CMMcargo) & cmsFLAGS_COPY_ALPHA)) + nalpha = 0; + + + strideIn = strideOut = 0; + for (i = 0; i < LineCount; i++) { + + rin = (const cmsUInt8Number*)Input + SourceStartingOrder[0] + strideIn; + gin = (const cmsUInt8Number*)Input + SourceStartingOrder[1] + strideIn; + bin = (const cmsUInt8Number*)Input + SourceStartingOrder[2] + strideIn; + + if (nalpha) + ain = (const cmsUInt8Number*)Input + SourceStartingOrder[3] + strideIn; + + rout = (cmsUInt8Number*)Output + DestStartingOrder[0] + strideOut; + gout = (cmsUInt8Number*)Output + DestStartingOrder[1] + strideOut; + bout = (cmsUInt8Number*)Output + DestStartingOrder[2] + strideOut; + + if (nalpha) + aout = (cmsUInt8Number*)Output + DestStartingOrder[3] + strideOut; + + + for (ii = 0; ii < PixelsPerLine; ii++) { + + *(cmsFloat32Number*)rout = flerp(Data->CurveR, *(cmsFloat32Number*)rin); + *(cmsFloat32Number*)gout = flerp(Data->CurveG, *(cmsFloat32Number*)gin); + *(cmsFloat32Number*)bout = flerp(Data->CurveB, *(cmsFloat32Number*)bin); + + rin += SourceIncrements[0]; + gin += SourceIncrements[1]; + bin += SourceIncrements[2]; + + rout += DestIncrements[0]; + gout += DestIncrements[1]; + bout += DestIncrements[2]; + + if (ain) + { + *(cmsFloat32Number*)aout = *(cmsFloat32Number*)ain; + ain += SourceIncrements[3]; + aout += DestIncrements[3]; + } + } + + strideIn += Stride->BytesPerLineIn; + strideOut += Stride->BytesPerLineOut; + } +} + +// Do nothing but arrange the RGB format. +static void FastFloatRGBIdentity(struct _cmstransform_struct *CMMcargo, + const void* Input, + void* Output, + cmsUInt32Number PixelsPerLine, + cmsUInt32Number LineCount, + const cmsStride* Stride) +{ + cmsUInt32Number i, ii; + cmsUInt32Number SourceStartingOrder[cmsMAXCHANNELS]; + cmsUInt32Number SourceIncrements[cmsMAXCHANNELS]; + cmsUInt32Number DestStartingOrder[cmsMAXCHANNELS]; + cmsUInt32Number DestIncrements[cmsMAXCHANNELS]; + const cmsUInt8Number* rin; + const cmsUInt8Number* gin; + const cmsUInt8Number* bin; + const cmsUInt8Number* ain = NULL; + cmsUInt8Number* rout; + cmsUInt8Number* gout; + cmsUInt8Number* bout; + cmsUInt8Number* aout = NULL; + + cmsUInt32Number InputFormat = cmsGetTransformInputFormat((cmsHTRANSFORM) CMMcargo); + cmsUInt32Number OutputFormat = cmsGetTransformOutputFormat((cmsHTRANSFORM) CMMcargo); + + cmsUInt32Number nchans, nalpha; + size_t strideIn, strideOut; + + _cmsComputeComponentIncrements(InputFormat, Stride->BytesPerPlaneIn, &nchans, &nalpha, SourceStartingOrder, SourceIncrements); + _cmsComputeComponentIncrements(OutputFormat, Stride->BytesPerPlaneOut, &nchans, &nalpha, DestStartingOrder, DestIncrements); + + if (!(_cmsGetTransformFlags(CMMcargo) & cmsFLAGS_COPY_ALPHA)) + nalpha = 0; + + strideIn = strideOut = 0; + for (i = 0; i < LineCount; i++) { + + rin = (const cmsUInt8Number*)Input + SourceStartingOrder[0] + strideIn; + gin = (const cmsUInt8Number*)Input + SourceStartingOrder[1] + strideIn; + bin = (const cmsUInt8Number*)Input + SourceStartingOrder[2] + strideIn; + + if (nalpha) + ain = (const cmsUInt8Number*)Input + SourceStartingOrder[3] + strideIn; + + + rout = (cmsUInt8Number*)Output + DestStartingOrder[0] + strideOut; + gout = (cmsUInt8Number*)Output + DestStartingOrder[1] + strideOut; + bout = (cmsUInt8Number*)Output + DestStartingOrder[2] + strideOut; + + if (nalpha) + aout = (cmsUInt8Number*)Output + DestStartingOrder[3] + strideOut; + + + for (ii=0; ii < PixelsPerLine; ii++) { + + *(cmsFloat32Number*)rout = *(cmsFloat32Number*)rin; + *(cmsFloat32Number*)gout = *(cmsFloat32Number*)gin; + *(cmsFloat32Number*)bout = *(cmsFloat32Number*)bin; + + rin += SourceIncrements[0]; + gin += SourceIncrements[1]; + bin += SourceIncrements[2]; + + rout += DestIncrements[0]; + gout += DestIncrements[1]; + bout += DestIncrements[2]; + + + if (ain) + { + *(cmsFloat32Number*)aout = *(cmsFloat32Number*)ain; + ain += SourceIncrements[3]; + aout += DestIncrements[3]; + } + } + + strideIn += Stride->BytesPerLineIn; + strideOut += Stride->BytesPerLineOut; + } +} + +// Evaluate 1 channel only +static void FastEvaluateFloatGrayCurves(struct _cmstransform_struct* CMMcargo, + const void* Input, + void* Output, + cmsUInt32Number PixelsPerLine, + cmsUInt32Number LineCount, + const cmsStride* Stride) +{ + cmsUInt32Number i, ii; + cmsUInt32Number SourceStartingOrder[cmsMAXCHANNELS]; + cmsUInt32Number SourceIncrements[cmsMAXCHANNELS]; + cmsUInt32Number DestStartingOrder[cmsMAXCHANNELS]; + cmsUInt32Number DestIncrements[cmsMAXCHANNELS]; + const cmsUInt8Number* kin; + const cmsUInt8Number* ain = NULL; + cmsUInt8Number* kout; + cmsUInt8Number* aout = NULL; + + cmsUInt32Number InputFormat = cmsGetTransformInputFormat((cmsHTRANSFORM)CMMcargo); + cmsUInt32Number OutputFormat = cmsGetTransformOutputFormat((cmsHTRANSFORM)CMMcargo); + + CurvesFloatData* Data = (CurvesFloatData*)_cmsGetTransformUserData(CMMcargo); + + cmsUInt32Number nchans, nalpha; + size_t strideIn, strideOut; + + _cmsComputeComponentIncrements(InputFormat, Stride->BytesPerPlaneIn, &nchans, &nalpha, SourceStartingOrder, SourceIncrements); + _cmsComputeComponentIncrements(OutputFormat, Stride->BytesPerPlaneIn, &nchans, &nalpha, DestStartingOrder, DestIncrements); + + if (!(_cmsGetTransformFlags(CMMcargo) & cmsFLAGS_COPY_ALPHA)) + nalpha = 0; + + strideIn = strideOut = 0; + for (i = 0; i < LineCount; i++) { + + kin = (const cmsUInt8Number*)Input + SourceStartingOrder[0] + strideIn; + kout = (cmsUInt8Number*)Output + DestStartingOrder[0] + strideOut; + + if (nalpha) + { + ain = (const cmsUInt8Number*)Input + SourceStartingOrder[1] + strideIn; + aout = (cmsUInt8Number*)Output + DestStartingOrder[1] + strideOut; + } + + for (ii = 0; ii < PixelsPerLine; ii++) { + + *(cmsFloat32Number*)kout = flerp(Data->CurveR, *(cmsFloat32Number*)kin); + + kin += SourceIncrements[0]; + kout += DestIncrements[0]; + + if (ain) + { + *(cmsFloat32Number*)aout = *(cmsFloat32Number*)ain; + ain += SourceIncrements[1]; + aout += DestIncrements[1]; + } + } + + strideIn += Stride->BytesPerLineIn; + strideOut += Stride->BytesPerLineOut; + } +} + + +static void FastFloatGrayIdentity(struct _cmstransform_struct* CMMcargo, + const void* Input, + void* Output, + cmsUInt32Number PixelsPerLine, + cmsUInt32Number LineCount, + const cmsStride* Stride) +{ + cmsUInt32Number i, ii; + cmsUInt32Number SourceStartingOrder[cmsMAXCHANNELS]; + cmsUInt32Number SourceIncrements[cmsMAXCHANNELS]; + cmsUInt32Number DestStartingOrder[cmsMAXCHANNELS]; + cmsUInt32Number DestIncrements[cmsMAXCHANNELS]; + + const cmsUInt8Number* kin; + const cmsUInt8Number* ain = NULL; + cmsUInt8Number* kout; + cmsUInt8Number* aout = NULL; + + cmsUInt32Number InputFormat = cmsGetTransformInputFormat((cmsHTRANSFORM)CMMcargo); + cmsUInt32Number OutputFormat = cmsGetTransformOutputFormat((cmsHTRANSFORM)CMMcargo); + + cmsUInt32Number nchans, nalpha; + size_t strideIn, strideOut; + + _cmsComputeComponentIncrements(InputFormat, Stride->BytesPerPlaneIn, &nchans, &nalpha, SourceStartingOrder, SourceIncrements); + _cmsComputeComponentIncrements(OutputFormat, Stride->BytesPerPlaneOut, &nchans, &nalpha, DestStartingOrder, DestIncrements); + + if (!(_cmsGetTransformFlags(CMMcargo) & cmsFLAGS_COPY_ALPHA)) + nalpha = 0; + + strideIn = strideOut = 0; + for (i = 0; i < LineCount; i++) { + + + kin = (const cmsUInt8Number*)Input + SourceStartingOrder[0] + strideIn; + kout = (cmsUInt8Number*)Output + DestStartingOrder[0] + strideOut; + + if (nalpha) + { + ain = (const cmsUInt8Number*)Input + SourceStartingOrder[1] + strideIn; + aout = (cmsUInt8Number*)Output + DestStartingOrder[1] + strideOut; + } + + + for (ii = 0; ii < PixelsPerLine; ii++) { + + *(cmsFloat32Number*)kout = *(cmsFloat32Number*)kin; + + kin += SourceIncrements[0]; + kout += DestIncrements[0]; + + if (ain) + { + *(cmsFloat32Number*)aout = *(cmsFloat32Number*)ain; + ain += SourceIncrements[1]; + aout += DestIncrements[1]; + } + } + strideIn += Stride->BytesPerLineIn; + strideOut += Stride->BytesPerLineOut; + } +} + + +#define LINEAR_CURVES_EPSILON 0.00001 + +// Try to see if the curves are linear +static +cmsBool AllRGBCurvesAreLinear(CurvesFloatData* data) +{ + int j; + cmsFloat32Number expected; + + for (j = 0; j < MAX_NODES_IN_CURVE; j++) { + + expected = (cmsFloat32Number)j / (cmsFloat32Number)(MAX_NODES_IN_CURVE - 1); + + if (fabsf(data->CurveR[j] - expected) > LINEAR_CURVES_EPSILON || + fabsf(data->CurveG[j] - expected) > LINEAR_CURVES_EPSILON || + fabsf(data->CurveB[j] - expected) > LINEAR_CURVES_EPSILON) { + return FALSE; + } + } + + return TRUE; +} + +static +cmsBool KCurveIsLinear(CurvesFloatData* data) +{ + int j; + cmsFloat32Number expected; + + for (j = 0; j < MAX_NODES_IN_CURVE; j++) { + expected = (cmsFloat32Number)j / (cmsFloat32Number)(MAX_NODES_IN_CURVE - 1); + + if (fabs(data->CurveR[j] - expected) > LINEAR_CURVES_EPSILON) return FALSE; + } + + + return TRUE; +} + + +// Create linearization tables with a reasonable number of entries. Precision is about 32 bits. +static +CurvesFloatData* ComputeCompositeCurves(cmsUInt32Number nChan, cmsPipeline* Src) +{ + cmsUInt32Number i, j; + cmsFloat32Number InFloat[3], OutFloat[3]; + + CurvesFloatData* Data = malloc_aligned(cmsGetPipelineContextID(Src)); + if (Data == NULL) return NULL; + + // Create target curves + for (i = 0; i < MAX_NODES_IN_CURVE; i++) { + + for (j=0; j CurveR[i] = OutFloat[0]; + } + else { + Data->CurveR[i] = OutFloat[0]; + Data->CurveG[i] = OutFloat[1]; + Data->CurveB[i] = OutFloat[2]; + } + + } + + return Data; +} + + +// If the target LUT holds only curves, the optimization procedure is to join all those +// curves together. That only works on curves and does not work on matrices. +cmsBool OptimizeFloatByJoiningCurves(_cmsTransform2Fn* TransformFn, + void** UserData, + _cmsFreeUserDataFn* FreeUserData, + cmsPipeline** Lut, + cmsUInt32Number* InputFormat, + cmsUInt32Number* OutputFormat, + cmsUInt32Number* dwFlags) +{ + + cmsPipeline* Src = *Lut; + cmsStage* mpe; + CurvesFloatData* Data; + cmsUInt32Number nChans; + + // Apply only to floating-point cases + if (!T_FLOAT(*InputFormat) || !T_FLOAT(*OutputFormat)) return FALSE; + + // Only on 8-bit + if (T_BYTES(*InputFormat) != 4 || T_BYTES(*OutputFormat) != 4) return FALSE; + + // Curves need same channels on input and output (despite extra channels may differ) + nChans = T_CHANNELS(*InputFormat); + if (nChans != T_CHANNELS(*OutputFormat)) return FALSE; + + // gray and RGB + if (nChans != 1 && nChans != 3) return FALSE; + + // Only curves in this LUT? + for (mpe = cmsPipelineGetPtrToFirstStage(Src); + mpe != NULL; + mpe = cmsStageNext(mpe)) { + + if (cmsStageType(mpe) != cmsSigCurveSetElemType) return FALSE; + } + + Data = ComputeCompositeCurves(nChans, Src); + + *dwFlags |= cmsFLAGS_NOCACHE; + *dwFlags &= ~cmsFLAGS_CAN_CHANGE_FORMATTER; + *UserData = Data; + *FreeUserData = free_aligned; + + // Maybe the curves are linear at the end + if (nChans == 1) + *TransformFn = (KCurveIsLinear(Data) ? FastFloatGrayIdentity : FastEvaluateFloatGrayCurves); + else + *TransformFn = (AllRGBCurvesAreLinear(Data) ? FastFloatRGBIdentity : FastEvaluateFloatRGBCurves); + + return TRUE; + +} + diff --git a/local/recipes/libs/lcms2/source/plugins/fast_float/src/fast_float_internal.h b/local/recipes/libs/lcms2/source/plugins/fast_float/src/fast_float_internal.h new file mode 100644 index 0000000000..2dc07780ca --- /dev/null +++ b/local/recipes/libs/lcms2/source/plugins/fast_float/src/fast_float_internal.h @@ -0,0 +1,282 @@ +//--------------------------------------------------------------------------------- +// +// Little Color Management System, fast floating point extensions +// Copyright (c) 1998-2026 Marti Maria Saguer, all rights reserved +// +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +//--------------------------------------------------------------------------------- + +#ifndef _FAST_INTERNAL_H +#define _FAST_INTERNAL_H + +#include "lcms2_fast_float.h" +#include + +#define REQUIRED_LCMS_VERSION 2120 + +// Unused parameter warning suppression +#define UNUSED_PARAMETER(x) ((void)x) + +// For testbed +#define CMSCHECKPOINT CMSAPI + +// The specification for "inline" is section 6.7.4 of the C99 standard (ISO/IEC 9899:1999). +// unfortunately VisualC++ does not conform that +#if defined(_MSC_VER) || defined(__BORLANDC__) +# define cmsINLINE __inline +#else +# define cmsINLINE static inline +#endif + +/// Properly define some macros to accommodate +/// older MSVC versions. +# if defined(_MSC_VER) && _MSC_VER <= 1700 +#include +#define isnan _isnan +#define isinf(x) (!_finite((x))) +# endif + +#if !defined(_MSC_VER) && (defined(__STDC_VERSION__) && __STDC_VERSION__ < 199901L) +#if !defined(isinf) +#define isinf(x) (!finite((x))) +#endif +#endif + + +// A fast way to convert from/to 16 <-> 8 bits +#define FROM_8_TO_16(rgb) (cmsUInt16Number) ((((cmsUInt16Number) (rgb)) << 8)|(rgb)) +#define FROM_16_TO_8(rgb) (cmsUInt8Number) ((((rgb) * 65281 + 8388608) >> 24) & 0xFF) + + +// This macro return words stored as big endian +#define CHANGE_ENDIAN(w) (cmsUInt16Number) ((cmsUInt16Number) ((w)<<8)|((w)>>8)) + +// This macro changes the polarity of a word +#define REVERSE_FLAVOR_16(x) ((cmsUInt16Number)(0xffff-(x))) + +// Fixed point +#define FIXED_TO_INT(x) ((x)>>16) +#define FIXED_REST_TO_INT(x) ((x)&0xFFFFU) + +#define cmsFLAGS_CAN_CHANGE_FORMATTER 0x02000000 // Allow change buffer format + +// Utility macros to convert from to 0...1.0 in 15.16 fixed domain to 0..0xffff as integer +cmsINLINE cmsS15Fixed16Number _cmsToFixedDomain(int a) { return a + ((a + 0x7fff) / 0xffff); } +cmsINLINE int _cmsFromFixedDomain(cmsS15Fixed16Number a) { return a - ((a + 0x7fff) >> 16); } + +// This is the upper part of internal transform structure. Only format specifiers are used +typedef struct { + + cmsUInt32Number InputFormat, OutputFormat; // Keep formats for further reference + +} _xform_head; + + +#define MAX_NODES_IN_CURVE 0x8001 + +// To prevent out of bounds indexing +cmsINLINE cmsFloat32Number fclamp(cmsFloat32Number v) +{ + return ((v < 1.0e-9f) || isnan(v)) ? 0.0f : (v > 1.0f ? 1.0f : v); +} + +// Fast floor conversion logic. +cmsINLINE int _cmsQuickFloor(cmsFloat64Number val) +{ +#ifdef CMS_DONT_USE_FAST_FLOOR + return (int)floor(val); +#else +#define _lcms_double2fixmagic (68719476736.0 * 1.5) + + union { + cmsFloat64Number val; + int halves[2]; + } temp; + + temp.val = val + _lcms_double2fixmagic; + +#ifdef CMS_USE_BIG_ENDIAN + return temp.halves[1] >> 16; +#else + return temp.halves[0] >> 16; +#endif +#endif +} + +// Floor to word, taking care of saturation. This is not critical in terms of performance +cmsINLINE cmsUInt16Number _cmsSaturateWord(cmsFloat64Number d) +{ + d += 0.5; + + if (d <= 0) return 0; + if (d >= 65535.0) return 0xffff; + + return (cmsUInt16Number)floor(d); +} + + +cmsINLINE cmsFloat32Number flerp(const cmsFloat32Number LutTable[], cmsFloat32Number v) +{ + cmsFloat32Number y1, y0; + cmsFloat32Number rest; + int cell0, cell1; + + if (isnan(v)) + return LutTable[0]; + + if (v < 1.0e-9f) { + return v; + } + else + if (v >= 1.0) { + return v; + } + + v *= (MAX_NODES_IN_CURVE - 1); + + cell0 = _cmsQuickFloor(v); + cell1 = (int)ceilf(v); + + // Rest is 16 LSB bits + rest = v - cell0; + + y0 = LutTable[cell0]; + y1 = LutTable[cell1]; + + return y0 + (y1 - y0) * rest; +} + + + +// Some secret sauce from lcms +CMSAPI cmsUInt32Number CMSEXPORT _cmsReasonableGridpointsByColorspace(cmsColorSpaceSignature Colorspace, cmsUInt32Number dwFlags); + + + +// Compute the increments to be used by the transform functions +CMSCHECKPOINT void CMSEXPORT _cmsComputeComponentIncrements(cmsUInt32Number Format, + cmsUInt32Number BytesPerPlane, + cmsUInt32Number* nChannels, + cmsUInt32Number* nAlpha, + cmsUInt32Number ComponentStartingOrder[], + cmsUInt32Number ComponentPointerIncrements[]); + +// 15 bits formatters +CMSCHECKPOINT cmsFormatter CMSEXPORT Formatter_15Bit_Factory(cmsUInt32Number Type, + cmsFormatterDirection Dir, + cmsUInt32Number dwFlags); + +// Optimizers + +// 8 bits on input allows matrix-shaper boost up a little bit +cmsBool Optimize8MatrixShaper(_cmsTransform2Fn* TransformFn, + void** UserData, + _cmsFreeUserDataFn* FreeUserData, + cmsPipeline** Lut, + cmsUInt32Number* InputFormat, + cmsUInt32Number* OutputFormat, + cmsUInt32Number* dwFlags); + +// 8 bits using SSE +cmsBool Optimize8MatrixShaperSSE(_cmsTransform2Fn* TransformFn, + void** UserData, + _cmsFreeUserDataFn* FreeUserData, + cmsPipeline** Lut, + cmsUInt32Number* InputFormat, + cmsUInt32Number* OutputFormat, + cmsUInt32Number* dwFlags); + +cmsBool OptimizeMatrixShaper15(_cmsTransform2Fn* TransformFn, + void** UserData, + _cmsFreeUserDataFn* FreeUserData, + cmsPipeline** Lut, + cmsUInt32Number* InputFormat, + cmsUInt32Number* OutputFormat, + cmsUInt32Number* dwFlags); + + +cmsBool Optimize8ByJoiningCurves(_cmsTransform2Fn* TransformFn, + void** UserData, + _cmsFreeUserDataFn* FreeUserData, + cmsPipeline** Lut, + cmsUInt32Number* InputFormat, + cmsUInt32Number* OutputFormat, + cmsUInt32Number* dwFlags); + +cmsBool OptimizeFloatByJoiningCurves(_cmsTransform2Fn* TransformFn, + void** UserData, + _cmsFreeUserDataFn* FreeUserData, + cmsPipeline** Lut, + cmsUInt32Number* InputFormat, + cmsUInt32Number* OutputFormat, + cmsUInt32Number* dwFlags); + +cmsBool OptimizeFloatMatrixShaper(_cmsTransform2Fn* TransformFn, + void** UserData, + _cmsFreeUserDataFn* FreeUserData, + cmsPipeline** Lut, + cmsUInt32Number* InputFormat, + cmsUInt32Number* OutputFormat, + cmsUInt32Number* dwFlags); + +cmsBool Optimize8BitRGBTransform(_cmsTransform2Fn* TransformFn, + void** UserData, + _cmsFreeUserDataFn* FreeDataFn, + cmsPipeline** Lut, + cmsUInt32Number* InputFormat, + cmsUInt32Number* OutputFormat, + cmsUInt32Number* dwFlags); + +cmsBool Optimize16BitRGBTransform(_cmsTransform2Fn* TransformFn, + void** UserData, + _cmsFreeUserDataFn* FreeDataFn, + cmsPipeline** Lut, + cmsUInt32Number* InputFormat, + cmsUInt32Number* OutputFormat, + cmsUInt32Number* dwFlags); + +cmsBool OptimizeCLUTRGBTransform(_cmsTransform2Fn* TransformFn, + void** UserData, + _cmsFreeUserDataFn* FreeDataFn, + cmsPipeline** Lut, + cmsUInt32Number* InputFormat, + cmsUInt32Number* OutputFormat, + cmsUInt32Number* dwFlags); + +cmsBool OptimizeCLUTCMYKTransform(_cmsTransform2Fn* TransformFn, + void** UserData, + _cmsFreeUserDataFn* FreeDataFn, + cmsPipeline** Lut, + cmsUInt32Number* InputFormat, + cmsUInt32Number* OutputFormat, + cmsUInt32Number* dwFlags); + + +cmsBool OptimizeCLUTLabTransform(_cmsTransform2Fn* TransformFn, + void** UserData, + _cmsFreeUserDataFn* FreeDataFn, + cmsPipeline** Lut, + cmsUInt32Number* InputFormat, + cmsUInt32Number* OutputFormat, + cmsUInt32Number* dwFlags); + +// Wrapper for _cmsFree that matches the _cmsFreeUserDataFn calling convention. +// On Win32, _cmsFree uses __stdcall (CMSEXPORT) but _cmsFreeUserDataFn is __cdecl. +// Using _cmsFree directly as a _cmsFreeUserDataFn would cause a calling convention +// mismatch on 32-bit Windows builds. This wrapper uses the default (cdecl) convention. +cmsINLINE void _fast_float_free_user_data(cmsContext ContextID, void* Data) { _cmsFree(ContextID, Data); } + +#endif diff --git a/local/recipes/libs/lcms2/source/plugins/fast_float/src/fast_float_lab.c b/local/recipes/libs/lcms2/source/plugins/fast_float/src/fast_float_lab.c new file mode 100644 index 0000000000..dc110658ab --- /dev/null +++ b/local/recipes/libs/lcms2/source/plugins/fast_float/src/fast_float_lab.c @@ -0,0 +1,435 @@ +//--------------------------------------------------------------------------------- +// +// Little Color Management System, fast floating point extensions +// Copyright (c) 1998-2026 Marti Maria Saguer, all rights reserved +// +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +//--------------------------------------------------------------------------------- + +#include "fast_float_internal.h" + + +#define SIGMOID_POINTS 1024 + +// Optimization for floating point tetrahedral interpolation using Lab as indexing space +typedef struct { + + cmsContext ContextID; + const cmsInterpParams* p; // Tetrahedrical interpolation parameters. This is a not-owned pointer. + + cmsFloat32Number sigmoidIn[SIGMOID_POINTS]; // to apply to a*/b* axis on indexing + cmsFloat32Number sigmoidOut[SIGMOID_POINTS]; // the curve above, inverted. + +} LabCLUTdata; + + +typedef struct { + + LabCLUTdata* data; + cmsPipeline* original; + +} ResamplingContainer; + +/** +* Predefined tone curve +*/ +#define TYPE_SIGMOID 109 + + +// Floating-point version of 1D interpolation +cmsINLINE cmsFloat32Number LinLerp1D(cmsFloat32Number Value, const cmsFloat32Number* LutTable) +{ + if (Value >= 1.0f) + { + return LutTable[SIGMOID_POINTS - 1]; + } + else + if (Value <= 0) + { + return LutTable[0]; + } + else + { + cmsFloat32Number y1, y0; + cmsFloat32Number rest; + int cell0, cell1; + + Value *= (SIGMOID_POINTS - 1); + + cell0 = _cmsQuickFloor(Value); + cell1 = cell0 + 1; + + rest = Value - cell0; + + y0 = LutTable[cell0]; + y1 = LutTable[cell1]; + + return y0 + (y1 - y0) * rest; + } +} + +static +void tabulateSigmoid(cmsContext ContextID, cmsInt32Number type, cmsFloat32Number table[], cmsInt32Number tablePoints) +{ + const cmsFloat64Number sigmoidal_slope = 2.5; + cmsToneCurve* original; + cmsInt32Number i; + + memset(table, 0, sizeof(cmsFloat32Number) * tablePoints); + original = cmsBuildParametricToneCurve(ContextID, type, &sigmoidal_slope); + if (original != NULL) + { + for (i = 0; i < tablePoints; i++) + { + cmsFloat32Number v = (cmsFloat32Number)i / (cmsFloat32Number)(tablePoints - 1); + + table[i] = fclamp(cmsEvalToneCurveFloat(original, v)); + } + + cmsFreeToneCurve(original); + } +} + + +// Allocates container and curves +static +LabCLUTdata* LabCLUTAlloc(cmsContext ContextID, const cmsInterpParams* p) +{ + LabCLUTdata* fd; + + fd = (LabCLUTdata*) _cmsMallocZero(ContextID, sizeof(LabCLUTdata)); + if (fd == NULL) return NULL; + + fd ->ContextID = ContextID; + fd ->p = p; + + tabulateSigmoid(ContextID, +TYPE_SIGMOID, fd->sigmoidIn, SIGMOID_POINTS); + tabulateSigmoid(ContextID, -TYPE_SIGMOID, fd->sigmoidOut, SIGMOID_POINTS); + + return fd; +} + +static +void LabCLUTFree(cmsContext ContextID, void* v) +{ + _cmsFree(ContextID, v); +} + +// Sampler implemented by another LUT. +static +int XFormSampler(CMSREGISTER const cmsFloat32Number In[], CMSREGISTER cmsFloat32Number Out[], CMSREGISTER void* Cargo) +{ + ResamplingContainer* container = (ResamplingContainer*)Cargo; + cmsFloat32Number linearized[3]; + + // Apply inverse sigmoid + linearized[0] = In[0]; + linearized[1] = LinLerp1D(In[1], container->data->sigmoidOut); + linearized[2] = LinLerp1D(In[2], container->data->sigmoidOut); + + cmsPipelineEvalFloat(linearized, Out, container->original); + return TRUE; +} + + +// To prevent out of bounds indexing +cmsINLINE cmsFloat32Number fclamp128(cmsFloat32Number v) +{ + return ((v < -128) || isnan(v)) ? -128.0f : (v > 128.0f ? 128.0f : v); +} + +cmsINLINE cmsFloat32Number fclamp100(cmsFloat32Number v) +{ + return ((v < 1.0e-9f) || isnan(v)) ? 0.0f : (v > 100.0f ? 100.0f : v); +} + +// A optimized interpolation for Lab. +#define DENS(i,j,k) (LutTable[(i)+(j)+(k)+OutChan]) + +static +void LabCLUTEval(struct _cmstransform_struct* CMMcargo, + const void* Input, + void* Output, + cmsUInt32Number PixelsPerLine, + cmsUInt32Number LineCount, + const cmsStride* Stride) + +{ + + LabCLUTdata* pfloat = (LabCLUTdata*)_cmsGetTransformUserData(CMMcargo); + + cmsFloat32Number l, a, b; + cmsFloat32Number px, py, pz; + int x0, y0, z0; + int X0, Y0, Z0, X1, Y1, Z1; + cmsFloat32Number rx, ry, rz; + cmsFloat32Number c0, c1 = 0, c2 = 0, c3 = 0; + cmsUInt32Number OutChan; + + const cmsInterpParams* p = pfloat->p; + cmsUInt32Number TotalOut = p->nOutputs; + cmsUInt32Number TotalPlusAlpha; + const cmsFloat32Number* LutTable = (const cmsFloat32Number*)p->Table; + + cmsUInt32Number i, ii; + const cmsUInt8Number* lin; + const cmsUInt8Number* ain; + const cmsUInt8Number* bin; + const cmsUInt8Number* xin = NULL; + + cmsUInt8Number* out[cmsMAXCHANNELS]; + cmsUInt32Number SourceStartingOrder[cmsMAXCHANNELS]; + cmsUInt32Number SourceIncrements[cmsMAXCHANNELS]; + cmsUInt32Number DestStartingOrder[cmsMAXCHANNELS]; + cmsUInt32Number DestIncrements[cmsMAXCHANNELS]; + + cmsUInt32Number InputFormat = cmsGetTransformInputFormat((cmsHTRANSFORM)CMMcargo); + cmsUInt32Number OutputFormat = cmsGetTransformOutputFormat((cmsHTRANSFORM)CMMcargo); + + cmsUInt32Number nchans, nalpha; + size_t strideIn, strideOut; + + _cmsComputeComponentIncrements(InputFormat, Stride->BytesPerPlaneIn, &nchans, &nalpha, SourceStartingOrder, SourceIncrements); + _cmsComputeComponentIncrements(OutputFormat, Stride->BytesPerPlaneOut, &nchans, &nalpha, DestStartingOrder, DestIncrements); + + if (!(_cmsGetTransformFlags(CMMcargo) & cmsFLAGS_COPY_ALPHA)) + nalpha = 0; + + strideIn = strideOut = 0; + for (i = 0; i < LineCount; i++) { + + lin = (const cmsUInt8Number*)Input + SourceStartingOrder[0] + strideIn; + ain = (const cmsUInt8Number*)Input + SourceStartingOrder[1] + strideIn; + bin = (const cmsUInt8Number*)Input + SourceStartingOrder[2] + strideIn; + + if (nalpha) + xin = (const cmsUInt8Number*)Input + SourceStartingOrder[3] + strideIn; + + TotalPlusAlpha = TotalOut; + if (xin) TotalPlusAlpha++; + + for (ii = 0; ii < TotalPlusAlpha; ii++) + out[ii] = (cmsUInt8Number*)Output + DestStartingOrder[ii] + strideOut; + + for (ii = 0; ii < PixelsPerLine; ii++) { + + // Decode Lab and go across sigmoids on a*/b* + l = fclamp100( *(cmsFloat32Number*)lin ) / 100.0f; + + a = LinLerp1D((( fclamp128( *(cmsFloat32Number*)ain)) + 128.0f) / 255.0f, pfloat->sigmoidIn); + b = LinLerp1D((( fclamp128( *(cmsFloat32Number*)bin)) + 128.0f) / 255.0f, pfloat->sigmoidIn); + + lin += SourceIncrements[0]; + ain += SourceIncrements[1]; + bin += SourceIncrements[2]; + + px = l * p->Domain[0]; + py = a * p->Domain[1]; + pz = b * p->Domain[2]; + + x0 = _cmsQuickFloor(px); rx = (px - (cmsFloat32Number)x0); + y0 = _cmsQuickFloor(py); ry = (py - (cmsFloat32Number)y0); + z0 = _cmsQuickFloor(pz); rz = (pz - (cmsFloat32Number)z0); + + X0 = p->opta[2] * x0; + X1 = X0 + (l >= 1.0f ? 0 : p->opta[2]); + + Y0 = p->opta[1] * y0; + Y1 = Y0 + (a >= 1.0f ? 0 : p->opta[1]); + + Z0 = p->opta[0] * z0; + Z1 = Z0 + (b >= 1.0f ? 0 : p->opta[0]); + + for (OutChan = 0; OutChan < TotalOut; OutChan++) { + + // These are the 6 Tetrahedral + + c0 = DENS(X0, Y0, Z0); + + if (rx >= ry && ry >= rz) { + + c1 = DENS(X1, Y0, Z0) - c0; + c2 = DENS(X1, Y1, Z0) - DENS(X1, Y0, Z0); + c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0); + + } + else + if (rx >= rz && rz >= ry) { + + c1 = DENS(X1, Y0, Z0) - c0; + c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1); + c3 = DENS(X1, Y0, Z1) - DENS(X1, Y0, Z0); + + } + else + if (rz >= rx && rx >= ry) { + + c1 = DENS(X1, Y0, Z1) - DENS(X0, Y0, Z1); + c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1); + c3 = DENS(X0, Y0, Z1) - c0; + + } + else + if (ry >= rx && rx >= rz) { + + c1 = DENS(X1, Y1, Z0) - DENS(X0, Y1, Z0); + c2 = DENS(X0, Y1, Z0) - c0; + c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0); + + } + else + if (ry >= rz && rz >= rx) { + + c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1); + c2 = DENS(X0, Y1, Z0) - c0; + c3 = DENS(X0, Y1, Z1) - DENS(X0, Y1, Z0); + + } + else + if (rz >= ry && ry >= rx) { + + c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1); + c2 = DENS(X0, Y1, Z1) - DENS(X0, Y0, Z1); + c3 = DENS(X0, Y0, Z1) - c0; + + } + else { + c1 = c2 = c3 = 0; + } + + *(cmsFloat32Number*)(out[OutChan]) = c0 + c1 * rx + c2 * ry + c3 * rz; + + out[OutChan] += DestIncrements[OutChan]; + } + + if (xin) + { + *(cmsFloat32Number*) (out[TotalOut]) = *(cmsFloat32Number*)xin; + xin += SourceIncrements[3]; + out[TotalOut] += DestIncrements[TotalOut]; + } + } + + strideIn += Stride->BytesPerLineIn; + strideOut += Stride->BytesPerLineOut; + } +} + +#undef DENS + + +/** +* Get from flags +*/ +static +int GetGridpoints(cmsUInt32Number dwFlags) +{ + // Already specified? + if (dwFlags & 0x00FF0000) { + return (dwFlags >> 16) & 0xFF; + } + + // HighResPrecalc is maximum resolution + if (dwFlags & cmsFLAGS_HIGHRESPRECALC) { + return 66; + } + else + // LowResPrecal is lower resolution + if (dwFlags & cmsFLAGS_LOWRESPRECALC) { + return 33; + } + else + return 51; + +} + +// -------------------------------------------------------------------------------------------------------------- + +cmsBool OptimizeCLUTLabTransform(_cmsTransform2Fn* TransformFn, + void** UserData, + _cmsFreeUserDataFn* FreeDataFn, + cmsPipeline** Lut, + cmsUInt32Number* InputFormat, + cmsUInt32Number* OutputFormat, + cmsUInt32Number* dwFlags) +{ + cmsPipeline* OriginalLut; + int nGridPoints; + cmsPipeline* OptimizedLUT = NULL; + cmsStage* OptimizedCLUTmpe; + LabCLUTdata* pfloat; + cmsContext ContextID; + _cmsStageCLutData* data; + ResamplingContainer container; + + + // For empty transforms, do nothing + if (*Lut == NULL) return FALSE; + + // Check for floating point only + if (!T_FLOAT(*InputFormat) || !T_FLOAT(*OutputFormat)) return FALSE; + + // Only on floats + if (T_BYTES(*InputFormat) != sizeof(cmsFloat32Number) || + T_BYTES(*OutputFormat) != sizeof(cmsFloat32Number)) return FALSE; + + if (T_COLORSPACE(*InputFormat) != PT_Lab) return FALSE; + + OriginalLut = *Lut; + + ContextID = cmsGetPipelineContextID(OriginalLut); + nGridPoints = GetGridpoints(*dwFlags); + + // Create the result LUT + OptimizedLUT = cmsPipelineAlloc(cmsGetPipelineContextID(OriginalLut), 3, cmsPipelineOutputChannels(OriginalLut)); + if (OptimizedLUT == NULL) goto Error; + + // Allocate the CLUT for result + OptimizedCLUTmpe = cmsStageAllocCLutFloat(ContextID, nGridPoints, 3, cmsPipelineOutputChannels(OriginalLut), NULL); + + // Add the CLUT to the destination LUT + cmsPipelineInsertStage(OptimizedLUT, cmsAT_BEGIN, OptimizedCLUTmpe); + + // Set the evaluator, copy parameters + data = (_cmsStageCLutData*) cmsStageData(OptimizedCLUTmpe); + + // Allocate data + pfloat = LabCLUTAlloc(ContextID, data ->Params); + if (pfloat == NULL) return FALSE; + + container.data = pfloat; + container.original = OriginalLut; + + // Resample the LUT + if (!cmsStageSampleCLutFloat(OptimizedCLUTmpe, XFormSampler, (void*)&container, 0)) goto Error; + + // And return the obtained LUT + cmsPipelineFree(OriginalLut); + + *Lut = OptimizedLUT; + *TransformFn = LabCLUTEval; + *UserData = pfloat; + *FreeDataFn = LabCLUTFree; + *dwFlags &= ~cmsFLAGS_CAN_CHANGE_FORMATTER; + return TRUE; + +Error: + + if (OptimizedLUT != NULL) cmsPipelineFree(OptimizedLUT); + + return FALSE; +} + diff --git a/local/recipes/libs/lcms2/source/plugins/fast_float/src/fast_float_matsh.c b/local/recipes/libs/lcms2/source/plugins/fast_float/src/fast_float_matsh.c new file mode 100644 index 0000000000..6c54a92cb7 --- /dev/null +++ b/local/recipes/libs/lcms2/source/plugins/fast_float/src/fast_float_matsh.c @@ -0,0 +1,386 @@ +//--------------------------------------------------------------------------------- +// +// Little Color Management System, fast floating point extensions +// Copyright (c) 1998-2026 Marti Maria Saguer, all rights reserved +// +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +//--------------------------------------------------------------------------------- + +// Optimization for matrix-shaper in float + +#include "fast_float_internal.h" + + +// This is the private data container used by this optimization +typedef struct { + + + cmsFloat32Number Mat[3][3]; + cmsFloat32Number Off[3]; + + cmsFloat32Number Shaper1R[MAX_NODES_IN_CURVE]; + cmsFloat32Number Shaper1G[MAX_NODES_IN_CURVE]; + cmsFloat32Number Shaper1B[MAX_NODES_IN_CURVE]; + + cmsFloat32Number Shaper2R[MAX_NODES_IN_CURVE]; + cmsFloat32Number Shaper2G[MAX_NODES_IN_CURVE]; + cmsFloat32Number Shaper2B[MAX_NODES_IN_CURVE]; + + cmsBool UseOff; + + void * real_ptr; + +} VXMatShaperFloatData; + + +static +VXMatShaperFloatData* malloc_aligned(cmsContext ContextID) +{ + cmsUInt8Number* real_ptr = (cmsUInt8Number*) _cmsMallocZero(ContextID, sizeof(VXMatShaperFloatData) + 32); + cmsUInt8Number* aligned = (cmsUInt8Number*) (((uintptr_t)real_ptr + 16) & ~0xf); + VXMatShaperFloatData* p = (VXMatShaperFloatData*) aligned; + + p ->real_ptr = real_ptr; + return p; +} + + + +// Free the private data container +static +void FreeMatShaper(cmsContext ContextID, void* Data) +{ + VXMatShaperFloatData* d = (VXMatShaperFloatData*)Data; + + if (d != NULL) + _cmsFree(ContextID, d->real_ptr); +} + + +static +void FillShaper(cmsFloat32Number* Table, cmsToneCurve* Curve) +{ + int i; + cmsFloat32Number R; + + for (i = 0; i < MAX_NODES_IN_CURVE; i++) { + + R = (cmsFloat32Number) i / (cmsFloat32Number) (MAX_NODES_IN_CURVE - 1); + + Table[i] = cmsEvalToneCurveFloat(Curve, R); + } +} + + +// Compute the matrix-shaper structure +static +VXMatShaperFloatData* SetMatShaper(cmsContext ContextID, cmsToneCurve* Curve1[3], cmsMAT3* Mat, cmsVEC3* Off, cmsToneCurve* Curve2[3]) +{ + VXMatShaperFloatData* p; + int i, j; + + // Allocate a big chuck of memory to store precomputed tables + p = malloc_aligned(ContextID); + if (p == NULL) return FALSE; + + + // Precompute tables + FillShaper(p->Shaper1R, Curve1[0]); + FillShaper(p->Shaper1G, Curve1[1]); + FillShaper(p->Shaper1B, Curve1[2]); + + FillShaper(p->Shaper2R, Curve2[0]); + FillShaper(p->Shaper2G, Curve2[1]); + FillShaper(p->Shaper2B, Curve2[2]); + + + for (i=0; i < 3; i++) { + for (j=0; j < 3; j++) { + p->Mat[i][j] = (cmsFloat32Number) Mat->v[i].n[j]; + } + } + + + for (i = 0; i < 3; i++) { + + if (Off == NULL) { + + p->UseOff = FALSE; + p->Off[i] = 0.0; + } + else { + p->UseOff = TRUE; + p->Off[i] = (cmsFloat32Number)Off->n[i]; + + } + } + + + return p; +} + + + +// A fast matrix-shaper evaluator for floating point +static +void MatShaperFloat(struct _cmstransform_struct* CMMcargo, + const void* Input, + void* Output, + cmsUInt32Number PixelsPerLine, + cmsUInt32Number LineCount, + const cmsStride* Stride) +{ + VXMatShaperFloatData* p = (VXMatShaperFloatData*) _cmsGetTransformUserData(CMMcargo); + cmsFloat32Number l1, l2, l3; + cmsFloat32Number r, g, b; + cmsUInt32Number i, ii; + cmsUInt32Number SourceStartingOrder[cmsMAXCHANNELS]; + cmsUInt32Number SourceIncrements[cmsMAXCHANNELS]; + cmsUInt32Number DestStartingOrder[cmsMAXCHANNELS]; + cmsUInt32Number DestIncrements[cmsMAXCHANNELS]; + + const cmsUInt8Number* rin; + const cmsUInt8Number* gin; + const cmsUInt8Number* bin; + const cmsUInt8Number* ain = NULL; + + cmsUInt8Number* rout; + cmsUInt8Number* gout; + cmsUInt8Number* bout; + cmsUInt8Number* aout = NULL; + + cmsUInt32Number nchans, nalpha; + size_t strideIn, strideOut; + + _cmsComputeComponentIncrements(cmsGetTransformInputFormat((cmsHTRANSFORM)CMMcargo), Stride->BytesPerPlaneIn, &nchans, &nalpha, SourceStartingOrder, SourceIncrements); + _cmsComputeComponentIncrements(cmsGetTransformOutputFormat((cmsHTRANSFORM)CMMcargo), Stride->BytesPerPlaneOut, &nchans, &nalpha, DestStartingOrder, DestIncrements); + + if (!(_cmsGetTransformFlags(CMMcargo) & cmsFLAGS_COPY_ALPHA)) + nalpha = 0; + + strideIn = strideOut = 0; + for (i = 0; i < LineCount; i++) { + + rin = (const cmsUInt8Number*)Input + SourceStartingOrder[0] + strideIn; + gin = (const cmsUInt8Number*)Input + SourceStartingOrder[1] + strideIn; + bin = (const cmsUInt8Number*)Input + SourceStartingOrder[2] + strideIn; + + if (nalpha) + ain = (const cmsUInt8Number*)Input + SourceStartingOrder[3] + strideIn; + + rout = (cmsUInt8Number*)Output + DestStartingOrder[0] + strideOut; + gout = (cmsUInt8Number*)Output + DestStartingOrder[1] + strideOut; + bout = (cmsUInt8Number*)Output + DestStartingOrder[2] + strideOut; + + if (nalpha) + aout = (cmsUInt8Number*)Output + DestStartingOrder[3] + strideOut; + + for (ii = 0; ii < PixelsPerLine; ii++) { + + r = flerp(p->Shaper1R, *(cmsFloat32Number*)rin); + g = flerp(p->Shaper1G, *(cmsFloat32Number*)gin); + b = flerp(p->Shaper1B, *(cmsFloat32Number*)bin); + + l1 = p->Mat[0][0] * r + p->Mat[0][1] * g + p->Mat[0][2] * b; + l2 = p->Mat[1][0] * r + p->Mat[1][1] * g + p->Mat[1][2] * b; + l3 = p->Mat[2][0] * r + p->Mat[2][1] * g + p->Mat[2][2] * b; + + if (p->UseOff) { + + l1 += p->Off[0]; + l2 += p->Off[1]; + l3 += p->Off[2]; + } + + *(cmsFloat32Number*)rout = flerp(p->Shaper2R, l1); + *(cmsFloat32Number*)gout = flerp(p->Shaper2G, l2); + *(cmsFloat32Number*)bout = flerp(p->Shaper2B, l3); + + rin += SourceIncrements[0]; + gin += SourceIncrements[1]; + bin += SourceIncrements[2]; + + rout += DestIncrements[0]; + gout += DestIncrements[1]; + bout += DestIncrements[2]; + + if (ain) + { + *(cmsFloat32Number*)aout = *(cmsFloat32Number*)ain; + ain += SourceIncrements[3]; + aout += DestIncrements[3]; + } + } + + strideIn += Stride->BytesPerLineIn; + strideOut += Stride->BytesPerLineOut; + } +} + + + +cmsBool OptimizeFloatMatrixShaper(_cmsTransform2Fn* TransformFn, + void** UserData, + _cmsFreeUserDataFn* FreeUserData, + cmsPipeline** Lut, + cmsUInt32Number* InputFormat, + cmsUInt32Number* OutputFormat, + cmsUInt32Number* dwFlags) +{ + cmsStage* Curve1, *Curve2; + cmsStage* Matrix1, *Matrix2, * XYZmatrix = NULL; + _cmsStageMatrixData* Data1; + _cmsStageMatrixData* Data2; + cmsMAT3 res; + cmsBool IdentityMat = FALSE; + cmsPipeline* Dest, *Src; + cmsContext ContextID; + cmsUInt32Number nChans; + cmsFloat64Number factor = 1.0; + + + // Apply only to floating-point cases + if (!T_FLOAT(*InputFormat) || !T_FLOAT(*OutputFormat)) return FALSE; + + // Only works on RGB to RGB and gray to gray + if ( !( (T_CHANNELS(*InputFormat) == 3 && T_CHANNELS(*OutputFormat) == 3)) && + !( (T_CHANNELS(*InputFormat) == 1 && T_CHANNELS(*OutputFormat) == 1))) return FALSE; + + // Only works on float + if (T_BYTES(*InputFormat) != 4 || T_BYTES(*OutputFormat) != 4) return FALSE; + + // Seems suitable, proceed + Src = *Lut; + + // Check for shaper-matrix-matrix-shaper structure, that is what this optimizer stands for + + if (cmsPipelineCheckAndRetreiveStages(Src, 3, + cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType, + &Curve1, &Matrix1, &Curve2)) + { + if (T_COLORSPACE(*OutputFormat) == PT_XYZ) { + + /** + * XYZ is encoded in 1.15 fixed point, but in + * out table it is on 0..1.0 range, so we need to adjust it. + */ +#define MAX_ENCODEABLE_XYZ (1.0 + 32767.0/32768.0) + + static const cmsFloat64Number mat[] = { MAX_ENCODEABLE_XYZ, 0, 0, + 0, MAX_ENCODEABLE_XYZ, 0, + 0, 0, MAX_ENCODEABLE_XYZ }; + + XYZmatrix = Matrix2 = cmsStageAllocMatrix(cmsGetPipelineContextID(Src), 3, 3, mat, NULL); + } + else + if (T_COLORSPACE(*InputFormat) == PT_XYZ) { + static const cmsFloat64Number mat[] = { 1.0/MAX_ENCODEABLE_XYZ, 0, 0, + 0, 1.0/MAX_ENCODEABLE_XYZ, 0, + 0, 0, 1.0/MAX_ENCODEABLE_XYZ }; + + Matrix2 = Matrix1; + XYZmatrix = Matrix1 = cmsStageAllocMatrix(cmsGetPipelineContextID(Src), 3, 3, mat, NULL); + } + else + return FALSE; + } + else + if (!cmsPipelineCheckAndRetreiveStages(Src, 4, + cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType, + &Curve1, &Matrix1, &Matrix2, &Curve2)) return FALSE; + + ContextID = cmsGetPipelineContextID(Src); + nChans = T_CHANNELS(*InputFormat); + + // Get both matrices, which are 3x3 + Data1 = (_cmsStageMatrixData*) cmsStageData(Matrix1); + Data2 = (_cmsStageMatrixData*) cmsStageData(Matrix2); + + // Input offset should be zero + if (Data1 ->Offset != NULL) return FALSE; + + if (cmsStageInputChannels(Matrix1) == 1 && cmsStageOutputChannels(Matrix2) == 1) + { + // This is a gray to gray. Just multiply + factor = Data1->Double[0]*Data2->Double[0] + + Data1->Double[1]*Data2->Double[1] + + Data1->Double[2]*Data2->Double[2]; + + if (fabs(1 - factor) < (1.0 / 65535.0)) IdentityMat = TRUE; + } + else + { + // Multiply both matrices to get the result + _cmsMAT3per(&res, (cmsMAT3*) Data2 ->Double, (cmsMAT3*) Data1 ->Double); + + // Now the result is in res + Data2 -> Offset. Maybe is a plain identity? + IdentityMat = FALSE; + if (_cmsMAT3isIdentity(&res) && Data2 ->Offset == NULL) { + + // We can get rid of full matrix + IdentityMat = TRUE; + } + } + + // Allocate an empty LUT + Dest = cmsPipelineAlloc(ContextID, nChans, nChans); + if (!Dest) return FALSE; + + // Assemble the new LUT + cmsPipelineInsertStage(Dest, cmsAT_BEGIN, cmsStageDup(Curve1)); + + if (!IdentityMat) { + + if (nChans == 1) + cmsPipelineInsertStage(Dest, cmsAT_END, + cmsStageAllocMatrix(ContextID, 1, 1, (const cmsFloat64Number*) &factor, Data2->Offset)); + else + cmsPipelineInsertStage(Dest, cmsAT_END, + cmsStageAllocMatrix(ContextID, 3, 3, (const cmsFloat64Number*) &res, Data2 ->Offset)); + } + + + cmsPipelineInsertStage(Dest, cmsAT_END, cmsStageDup(Curve2)); + + // If identity on matrix, we can further optimize the curves, so call the join curves routine + if (IdentityMat) { + + OptimizeFloatByJoiningCurves(TransformFn, UserData, FreeUserData, &Dest, InputFormat, OutputFormat, dwFlags); + } + else { + _cmsStageToneCurvesData* mpeC1 = (_cmsStageToneCurvesData*) cmsStageData(Curve1); + _cmsStageToneCurvesData* mpeC2 = (_cmsStageToneCurvesData*) cmsStageData(Curve2); + + // In this particular optimization, cache does not help as it takes more time to deal with + // the cache than with the pixel handling + *dwFlags |= cmsFLAGS_NOCACHE; + + // Setup the optimization routines + *UserData = SetMatShaper(ContextID, mpeC1 ->TheCurves, &res, (cmsVEC3*) Data2 ->Offset, mpeC2->TheCurves); + *FreeUserData = FreeMatShaper; + + *TransformFn = MatShaperFloat; + } + + *dwFlags &= ~cmsFLAGS_CAN_CHANGE_FORMATTER; + cmsPipelineFree(Src); + if (XYZmatrix != NULL) + cmsStageFree(XYZmatrix); + *Lut = Dest; + return TRUE; +} + + diff --git a/local/recipes/libs/lcms2/source/plugins/fast_float/src/fast_float_separate.c b/local/recipes/libs/lcms2/source/plugins/fast_float/src/fast_float_separate.c new file mode 100644 index 0000000000..5d1868ac01 --- /dev/null +++ b/local/recipes/libs/lcms2/source/plugins/fast_float/src/fast_float_separate.c @@ -0,0 +1,199 @@ +//--------------------------------------------------------------------------------- +// +// Little Color Management System, fast floating point extensions +// Copyright (c) 1998-2026 Marti Maria Saguer, all rights reserved +// +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +//--------------------------------------------------------------------------------- + +#include "fast_float_internal.h" + +// Separable input. It just computes the distance from +// each component to the next one in bytes. It gives components RGB in this order +// +// Encoding Starting Increment DoSwap Swapfirst Extra +// RGB, 012 333 0 0 0 +// RGBA, 012 444 0 0 1 +// ARGB, 123 444 0 1 1 +// BGR, 210 333 1 0 0 +// BGRA, 210 444 1 1 1 +// ABGR 321 444 1 0 1 +// +// +// On planar configurations, the distance is the stride added to any non-negative +// +// RGB 0, S, 2*S 111 +// RGBA 0, S, 2*S 111 (fourth plane is safely ignored) +// ARGB S, 2*S, 3*S 111 +// BGR 2*S, S, 0 111 +// BGRA 2*S, S, 0, 111 (fourth plane is safely ignored) +// ABGR 3*S, 2*S, S 111 +// +//---------------------------------------------------------------------------------------- + + +// Return the size in bytes of a given formatter +static +int trueBytesSize(cmsUInt32Number Format) +{ + int fmt_bytes = T_BYTES(Format); + + // For double, the T_BYTES field returns zero + if (fmt_bytes == 0) + return sizeof(double); + + // Otherwise, it is already correct for all formats + return fmt_bytes; +} + +// RGBA -> normal +// ARGB -> swap first +// ABGR -> doSwap +// BGRA -> doSwap swapFirst + +// This function computes the distance from each component to the next one in bytes. +static +void ComputeIncrementsForChunky(cmsUInt32Number Format, + cmsUInt32Number BytesPerPlane, + cmsUInt32Number* nChannels, + cmsUInt32Number* nAlpha, + cmsUInt32Number ComponentStartingOrder[], + cmsUInt32Number ComponentPointerIncrements[]) +{ + int extra = T_EXTRA(Format); + int channels = T_CHANNELS(Format); + int total_chans = channels + extra; + int i; + int channelSize = trueBytesSize(Format); + int pixelSize = channelSize * total_chans; + + UNUSED_PARAMETER(BytesPerPlane); + + // Setup the counts + if (nChannels != NULL) + *nChannels = channels; + + if (nAlpha != NULL) + *nAlpha = extra; + + // Separation is independent of starting point and only depends on channel size + for (i = 0; i < total_chans; i++) + ComponentPointerIncrements[i] = pixelSize; + + // Handle do swap + for (i = 0; i < total_chans; i++) + { + if (T_DOSWAP(Format)) { + ComponentStartingOrder[i] = total_chans - i - 1; + } + else { + ComponentStartingOrder[i] = i; + } + } + + // Handle swap first (ROL of positions), example CMYK -> KCMY | 0123 -> 3012 + if (T_SWAPFIRST(Format)) { + + cmsUInt32Number tmp = ComponentStartingOrder[0]; + for (i = 0; i < total_chans-1; i++) + ComponentStartingOrder[i] = ComponentStartingOrder[i + 1]; + + ComponentStartingOrder[total_chans - 1] = tmp; + } + + // Handle size + if (channelSize > 1) + for (i = 0; i < total_chans; i++) { + ComponentStartingOrder[i] *= channelSize; + } +} + + + +// On planar configurations, the distance is the stride added to any non-negative +static +void ComputeIncrementsForPlanar(cmsUInt32Number Format, + cmsUInt32Number BytesPerPlane, + cmsUInt32Number* nChannels, + cmsUInt32Number* nAlpha, + cmsUInt32Number ComponentStartingOrder[], + cmsUInt32Number ComponentPointerIncrements[]) +{ + int extra = T_EXTRA(Format); + int channels = T_CHANNELS(Format); + int total_chans = channels + extra; + int i; + int channelSize = trueBytesSize(Format); + + // Setup the counts + if (nChannels != NULL) + *nChannels = channels; + + if (nAlpha != NULL) + *nAlpha = extra; + + // Separation is independent of starting point and only depends on channel size + for (i = 0; i < total_chans; i++) + ComponentPointerIncrements[i] = channelSize; + + // Handle do swap + for (i = 0; i < total_chans; i++) + { + if (T_DOSWAP(Format)) { + ComponentStartingOrder[i] = total_chans - i - 1; + } + else { + ComponentStartingOrder[i] = i; + } + } + + // Handle swap first (ROL of positions), example CMYK -> KCMY | 0123 -> 3012 + if (T_SWAPFIRST(Format)) { + + cmsUInt32Number tmp = ComponentStartingOrder[0]; + for (i = 0; i < total_chans - 1; i++) + ComponentStartingOrder[i] = ComponentStartingOrder[i + 1]; + + ComponentStartingOrder[total_chans - 1] = tmp; + } + + // Handle size + for (i = 0; i < total_chans; i++) { + ComponentStartingOrder[i] *= BytesPerPlane; + } +} + + + +// Dispatcher por chunky and planar RGB +CMSCHECKPOINT void CMSEXPORT _cmsComputeComponentIncrements(cmsUInt32Number Format, + cmsUInt32Number BytesPerPlane, + cmsUInt32Number* nChannels, + cmsUInt32Number* nAlpha, + cmsUInt32Number ComponentStartingOrder[], + cmsUInt32Number ComponentPointerIncrements[]) +{ + if (T_PLANAR(Format)) { + + ComputeIncrementsForPlanar(Format, BytesPerPlane, nChannels, nAlpha, ComponentStartingOrder, ComponentPointerIncrements); + } + else { + ComputeIncrementsForChunky(Format, BytesPerPlane, nChannels, nAlpha, ComponentStartingOrder, ComponentPointerIncrements); + } + +} + + diff --git a/local/recipes/libs/lcms2/source/plugins/fast_float/src/fast_float_sup.c b/local/recipes/libs/lcms2/source/plugins/fast_float/src/fast_float_sup.c new file mode 100644 index 0000000000..d491354b6c --- /dev/null +++ b/local/recipes/libs/lcms2/source/plugins/fast_float/src/fast_float_sup.c @@ -0,0 +1,118 @@ +//--------------------------------------------------------------------------------- +// +// Little Color Management System, fast floating point extensions +// Copyright (c) 1998-2026 Marti Maria Saguer, all rights reserved +// +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +//--------------------------------------------------------------------------------- + + +#include "fast_float_internal.h" + +// This is the main dispatcher +static +cmsBool Floating_Point_Transforms_Dispatcher(_cmsTransform2Fn* TransformFn, + void** UserData, + _cmsFreeUserDataFn* FreeUserData, + cmsPipeline** Lut, + cmsUInt32Number* InputFormat, + cmsUInt32Number* OutputFormat, + cmsUInt32Number* dwFlags) +{ + // Softproofing & gamut check does not use plugin, both are activated via following flag. + if (*dwFlags & cmsFLAGS_SOFTPROOFING) return FALSE; + + // Special flags for reversing are not supported + if (T_FLAVOR(*InputFormat) || T_FLAVOR(*OutputFormat)) return FALSE; + + // Check consistency for alpha channel copy + if (*dwFlags & cmsFLAGS_COPY_ALPHA) + { + if ((T_EXTRA(*InputFormat) != T_EXTRA(*OutputFormat))) return FALSE; + if (T_PREMUL(*InputFormat) || T_PREMUL(*OutputFormat)) return FALSE; + } + + // Try to optimize as a set of curves plus a matrix plus a set of curves + if (OptimizeMatrixShaper15(TransformFn, UserData, FreeUserData, Lut, InputFormat, OutputFormat, dwFlags)) return TRUE; + + // Try to optimize by joining curves + if (Optimize8ByJoiningCurves(TransformFn, UserData, FreeUserData, Lut, InputFormat, OutputFormat, dwFlags)) return TRUE; + +#ifndef CMS_DONT_USE_SSE2 + // Try to use SSE2 to optimize as a set of curves plus a matrix plus a set of curves + if (Optimize8MatrixShaperSSE(TransformFn, UserData, FreeUserData, Lut, InputFormat, OutputFormat, dwFlags)) return TRUE; +#endif + // Try to optimize as a set of curves plus a matrix plus a set of curves + if (Optimize8MatrixShaper(TransformFn, UserData, FreeUserData, Lut, InputFormat, OutputFormat, dwFlags)) return TRUE; + + // Try to optimize by joining curves + if (OptimizeFloatByJoiningCurves(TransformFn, UserData, FreeUserData, Lut, InputFormat, OutputFormat, dwFlags)) return TRUE; + + // Try to optimize as a set of curves plus a matrix plus a set of curves + if (OptimizeFloatMatrixShaper(TransformFn, UserData, FreeUserData, Lut, InputFormat, OutputFormat, dwFlags)) return TRUE; + + // Try to optimize using prelinearization plus tetrahedral + if (Optimize8BitRGBTransform(TransformFn, UserData, FreeUserData, Lut, InputFormat, OutputFormat, dwFlags)) return TRUE; + + // Try to optimize using prelinearization plus tetrahedral + if (Optimize16BitRGBTransform(TransformFn, UserData, FreeUserData, Lut, InputFormat, OutputFormat, dwFlags)) return TRUE; + + // Try to optimize using prelinearization plus tetrahedral + if (OptimizeCLUTRGBTransform(TransformFn, UserData, FreeUserData, Lut, InputFormat, OutputFormat, dwFlags)) return TRUE; + + // Try to optimize using prelinearization plus tetrahedral + if (OptimizeCLUTCMYKTransform(TransformFn, UserData, FreeUserData, Lut, InputFormat, OutputFormat, dwFlags)) return TRUE; + + // Try to optimize for Lab float as input + if (OptimizeCLUTLabTransform(TransformFn, UserData, FreeUserData, Lut, InputFormat, OutputFormat, dwFlags)) return TRUE; + + // Cannot optimize, use lcms normal process + return FALSE; +} + +// On Win32, CMSEXPORT expands to __stdcall but cmsFormatterFactory is __cdecl. +// This wrapper has the cdecl calling convention so it can be stored in the plugin struct. +static cmsFormatter Formatter_15Bit_Factory_wrapper(cmsUInt32Number Type, + cmsFormatterDirection Dir, + cmsUInt32Number dwFlags) +{ + return Formatter_15Bit_Factory(Type, Dir, dwFlags); +} + +// The Plug-in entry points +static cmsPluginFormatters PluginFastFloat = { + { cmsPluginMagicNumber, REQUIRED_LCMS_VERSION, cmsPluginFormattersSig, NULL }, + + Formatter_15Bit_Factory_wrapper +}; + +static cmsPluginTransform PluginList = { + + { cmsPluginMagicNumber, REQUIRED_LCMS_VERSION, cmsPluginTransformSig, (cmsPluginBase *) &PluginFastFloat }, + + // When initializing a union, the initializer list must have only one member, which initializes the first member of + // the union unless a designated initializer is used (C99) + + { (_cmsTransformFactory) Floating_Point_Transforms_Dispatcher } +}; + +// This is the main plug-in installer. +// Using a function to retrieve the plug-in entry point allows us to execute initialization data. +void* CMSEXPORT cmsFastFloatExtensions(void) +{ + return (void*)&PluginList; +} + diff --git a/local/recipes/libs/lcms2/source/plugins/fast_float/src/fast_float_tethra.c b/local/recipes/libs/lcms2/source/plugins/fast_float/src/fast_float_tethra.c new file mode 100644 index 0000000000..a0378cea79 --- /dev/null +++ b/local/recipes/libs/lcms2/source/plugins/fast_float/src/fast_float_tethra.c @@ -0,0 +1,362 @@ +//--------------------------------------------------------------------------------- +// +// Little Color Management System, fast floating point extensions +// Copyright (c) 1998-2026 Marti Maria Saguer, all rights reserved +// +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +//--------------------------------------------------------------------------------- + +#include "fast_float_internal.h" + +// Optimization for floating point tetrahedral interpolation +typedef struct { + + cmsContext ContextID; + const cmsInterpParams* p; // Tetrahedrical interpolation parameters. This is a not-owned pointer. + +} FloatCLUTData; + +// Allocates container +static +FloatCLUTData* FloatCLUTAlloc(cmsContext ContextID, const cmsInterpParams* p) +{ + FloatCLUTData* fd; + + fd = (FloatCLUTData*) _cmsMallocZero(ContextID, sizeof(FloatCLUTData)); + if (fd == NULL) return NULL; + + fd ->ContextID = ContextID; + fd ->p = p; + + return fd; +} + + +// Sampler implemented by another LUT. +static +int XFormSampler(CMSREGISTER const cmsFloat32Number In[], CMSREGISTER cmsFloat32Number Out[], CMSREGISTER void* Cargo) +{ + cmsPipelineEvalFloat(In, Out, (cmsPipeline*) Cargo); + return TRUE; +} + +// A optimized interpolation for input. +#define DENS(i,j,k) (LutTable[(i)+(j)+(k)+OutChan]) + +static +void FloatCLUTEval(struct _cmstransform_struct* CMMcargo, + const void* Input, + void* Output, + cmsUInt32Number PixelsPerLine, + cmsUInt32Number LineCount, + const cmsStride* Stride) + +{ + + FloatCLUTData* pfloat = (FloatCLUTData*)_cmsGetTransformUserData(CMMcargo); + + cmsFloat32Number r, g, b; + cmsFloat32Number px, py, pz; + int x0, y0, z0; + int X0, Y0, Z0, X1, Y1, Z1; + cmsFloat32Number rx, ry, rz; + cmsFloat32Number c0, c1 = 0, c2 = 0, c3 = 0; + cmsUInt32Number OutChan; + + const cmsInterpParams* p = pfloat->p; + cmsUInt32Number TotalOut = p->nOutputs; + cmsUInt32Number TotalPlusAlpha; + const cmsFloat32Number* LutTable = (const cmsFloat32Number*)p->Table; + + cmsUInt32Number i, ii; + const cmsUInt8Number* rin; + const cmsUInt8Number* gin; + const cmsUInt8Number* bin; + const cmsUInt8Number* ain = NULL; + + cmsUInt8Number* out[cmsMAXCHANNELS]; + cmsUInt32Number SourceStartingOrder[cmsMAXCHANNELS]; + cmsUInt32Number SourceIncrements[cmsMAXCHANNELS]; + cmsUInt32Number DestStartingOrder[cmsMAXCHANNELS]; + cmsUInt32Number DestIncrements[cmsMAXCHANNELS]; + + cmsUInt32Number InputFormat = cmsGetTransformInputFormat((cmsHTRANSFORM)CMMcargo); + cmsUInt32Number OutputFormat = cmsGetTransformOutputFormat((cmsHTRANSFORM)CMMcargo); + + cmsUInt32Number nchans, nalpha; + size_t strideIn, strideOut; + + _cmsComputeComponentIncrements(InputFormat, Stride->BytesPerPlaneIn, &nchans, &nalpha, SourceStartingOrder, SourceIncrements); + _cmsComputeComponentIncrements(OutputFormat, Stride->BytesPerPlaneOut, &nchans, &nalpha, DestStartingOrder, DestIncrements); + + if (!(_cmsGetTransformFlags(CMMcargo) & cmsFLAGS_COPY_ALPHA)) + nalpha = 0; + + strideIn = strideOut = 0; + for (i = 0; i < LineCount; i++) { + + rin = (const cmsUInt8Number*)Input + SourceStartingOrder[0] + strideIn; + gin = (const cmsUInt8Number*)Input + SourceStartingOrder[1] + strideIn; + bin = (const cmsUInt8Number*)Input + SourceStartingOrder[2] + strideIn; + if (nalpha) + ain = (const cmsUInt8Number*)Input + SourceStartingOrder[3] + strideIn; + + TotalPlusAlpha = TotalOut; + if (ain) TotalPlusAlpha++; + + for (ii = 0; ii < TotalPlusAlpha; ii++) + out[ii] = (cmsUInt8Number*)Output + DestStartingOrder[ii] + strideOut; + + for (ii = 0; ii < PixelsPerLine; ii++) { + + r = fclamp(*(cmsFloat32Number*)rin); + g = fclamp(*(cmsFloat32Number*)gin); + b = fclamp(*(cmsFloat32Number*)bin); + + rin += SourceIncrements[0]; + gin += SourceIncrements[1]; + bin += SourceIncrements[2]; + + px = r * p->Domain[0]; + py = g * p->Domain[1]; + pz = b * p->Domain[2]; + + x0 = (int) floorf(px); rx = (px - (cmsFloat32Number)x0); + y0 = (int) floorf(py); ry = (py - (cmsFloat32Number)y0); + z0 = (int) floorf(pz); rz = (pz - (cmsFloat32Number)z0); + + + X0 = p->opta[2] * x0; + X1 = X0 + (r >= 1.0 ? 0 : p->opta[2]); + + Y0 = p->opta[1] * y0; + Y1 = Y0 + (g >= 1.0 ? 0 : p->opta[1]); + + Z0 = p->opta[0] * z0; + Z1 = Z0 + (b >= 1.0 ? 0 : p->opta[0]); + + for (OutChan = 0; OutChan < TotalOut; OutChan++) { + + // These are the 6 Tetrahedral + + c0 = DENS(X0, Y0, Z0); + + if (rx >= ry && ry >= rz) { + + c1 = DENS(X1, Y0, Z0) - c0; + c2 = DENS(X1, Y1, Z0) - DENS(X1, Y0, Z0); + c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0); + + } + else + if (rx >= rz && rz >= ry) { + + c1 = DENS(X1, Y0, Z0) - c0; + c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1); + c3 = DENS(X1, Y0, Z1) - DENS(X1, Y0, Z0); + + } + else + if (rz >= rx && rx >= ry) { + + c1 = DENS(X1, Y0, Z1) - DENS(X0, Y0, Z1); + c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1); + c3 = DENS(X0, Y0, Z1) - c0; + + } + else + if (ry >= rx && rx >= rz) { + + c1 = DENS(X1, Y1, Z0) - DENS(X0, Y1, Z0); + c2 = DENS(X0, Y1, Z0) - c0; + c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0); + + } + else + if (ry >= rz && rz >= rx) { + + c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1); + c2 = DENS(X0, Y1, Z0) - c0; + c3 = DENS(X0, Y1, Z1) - DENS(X0, Y1, Z0); + + } + else + if (rz >= ry && ry >= rx) { + + c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1); + c2 = DENS(X0, Y1, Z1) - DENS(X0, Y0, Z1); + c3 = DENS(X0, Y0, Z1) - c0; + + } + else { + c1 = c2 = c3 = 0; + } + + *(cmsFloat32Number*)(out[OutChan]) = c0 + c1 * rx + c2 * ry + c3 * rz; + + out[OutChan] += DestIncrements[OutChan]; + } + + if (ain) { + *(cmsFloat32Number*)(out[TotalOut]) = *(cmsFloat32Number*)ain; + ain += SourceIncrements[3]; + out[TotalOut] += DestIncrements[TotalOut]; + } + } + + strideIn += Stride->BytesPerLineIn; + strideOut += Stride->BytesPerLineOut; + } +} + +#undef DENS + + + +// -------------------------------------------------------------------------------------------------------------- + +cmsBool OptimizeCLUTRGBTransform(_cmsTransform2Fn* TransformFn, + void** UserData, + _cmsFreeUserDataFn* FreeDataFn, + cmsPipeline** Lut, + cmsUInt32Number* InputFormat, + cmsUInt32Number* OutputFormat, + cmsUInt32Number* dwFlags) +{ + cmsPipeline* OriginalLut; + int nGridPoints; + cmsPipeline* OptimizedLUT = NULL; + cmsStage* OptimizedCLUTmpe; + FloatCLUTData* pfloat; + cmsContext ContextID; + _cmsStageCLutData* data; + + // For empty transforms, do nothing + if (*Lut == NULL) return FALSE; + + // Check for floating point only + if (!T_FLOAT(*InputFormat) || !T_FLOAT(*OutputFormat)) return FALSE; + + // Only on floats + if (T_BYTES(*InputFormat) != sizeof(cmsFloat32Number) || + T_BYTES(*OutputFormat) != sizeof(cmsFloat32Number)) return FALSE; + + // Input has to be RGB + if (T_COLORSPACE(*InputFormat) != PT_RGB) return FALSE; + + OriginalLut = *Lut; + + ContextID = cmsGetPipelineContextID(OriginalLut); + nGridPoints = _cmsReasonableGridpointsByColorspace(cmsSigRgbData, *dwFlags); + + // Create the result LUT + OptimizedLUT = cmsPipelineAlloc(cmsGetPipelineContextID(OriginalLut), 3, cmsPipelineOutputChannels(OriginalLut)); + if (OptimizedLUT == NULL) goto Error; + + // Allocate the CLUT for result + OptimizedCLUTmpe = cmsStageAllocCLutFloat(ContextID, nGridPoints, 3, cmsPipelineOutputChannels(OriginalLut), NULL); + + // Add the CLUT to the destination LUT + cmsPipelineInsertStage(OptimizedLUT, cmsAT_BEGIN, OptimizedCLUTmpe); + + // If output is CMYK, add a conversion stage to get % + if (T_COLORSPACE(*OutputFormat) == PT_CMYK) { + + static const cmsFloat64Number mat[] = { 100.0, 0, 0, 0, + 0, 100.0, 0, 0, + 0, 0, 100.0, 0, + 0, 0, 0, 100.0 }; + + cmsStage* percent = cmsStageAllocMatrix(ContextID, 4, 4, mat, NULL); + if (percent == NULL) goto Error; + + cmsPipelineInsertStage(OriginalLut, cmsAT_END, percent); + } + else + // If output is Lab, add a conversion stage to get Lab values + if (T_COLORSPACE(*OutputFormat) == PT_Lab) { + + static const cmsFloat64Number mat[] = { 100.0, 0, 0, + 0, 255.0, 0, + 0, 0, 255.0 }; + + static const cmsFloat64Number off[] = { 0, -128.0, -128.0 }; + + cmsStage* lab_fix = cmsStageAllocMatrix(ContextID, 3, 3, mat, off); + if (lab_fix == NULL) goto Error; + + cmsPipelineInsertStage(OriginalLut, cmsAT_END, lab_fix); + } + else + // If output is XYZ + if (T_COLORSPACE(*OutputFormat) == PT_XYZ) { + + /** + * XYZ is encoded in 1.15 fixed point, but in + * out table it is on 0..1.0 range, so we need to adjust it. + */ + +#define MAX_ENCODEABLE_XYZ (1.0 + 32767.0/32768.0) + + static const cmsFloat64Number mat[] = { MAX_ENCODEABLE_XYZ, 0, 0, + 0, MAX_ENCODEABLE_XYZ, 0, + 0, 0, MAX_ENCODEABLE_XYZ }; + + + cmsStage* XYZ_fix = cmsStageAllocMatrix(ContextID, 3, 3, mat, NULL); + if (XYZ_fix == NULL) goto Error; + + cmsPipelineInsertStage(OriginalLut, cmsAT_END, XYZ_fix); + + } + else { + if (T_COLORSPACE(*OutputFormat) != PT_GRAY && + T_COLORSPACE(*OutputFormat) != PT_RGB) return FALSE; + } + + + // Resample the LUT + if (!cmsStageSampleCLutFloat(OptimizedCLUTmpe, XFormSampler, (void*)OriginalLut, 0)) goto Error; + + + if (T_COLORSPACE(*OutputFormat) == PT_CMYK) { + + cmsPipelineUnlinkStage(OriginalLut, cmsAT_END, NULL); + } + + // Set the evaluator, copy parameters + data = (_cmsStageCLutData*) cmsStageData(OptimizedCLUTmpe); + + pfloat = FloatCLUTAlloc(ContextID, data ->Params); + if (pfloat == NULL) return FALSE; + + // And return the obtained LUT + cmsPipelineFree(OriginalLut); + + *Lut = OptimizedLUT; + *TransformFn = FloatCLUTEval; + *UserData = pfloat; + *FreeDataFn = _fast_float_free_user_data; + *dwFlags &= ~cmsFLAGS_CAN_CHANGE_FORMATTER; + return TRUE; + +Error: + + if (OptimizedLUT != NULL) cmsPipelineFree(OptimizedLUT); + + return FALSE; +} + diff --git a/local/recipes/libs/lcms2/source/plugins/fast_float/src/lcms2_fast_float.rc.in b/local/recipes/libs/lcms2/source/plugins/fast_float/src/lcms2_fast_float.rc.in new file mode 100644 index 0000000000..0485c227da --- /dev/null +++ b/local/recipes/libs/lcms2/source/plugins/fast_float/src/lcms2_fast_float.rc.in @@ -0,0 +1,52 @@ +//--------------------------------------------------------------------------------- +// +// Little Color Management System, multithread extensions +// Copyright (c) 1998-2022 Marti Maria Saguer, all rights reserved +// +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +//--------------------------------------------------------------------------------- + +#include + +1 VERSIONINFO +FILEVERSION @LCMS2_VERSION_MAJOR@, @LCMS2_VERSION_MINOR@, @LCMS2_VERSION_MICRO@, 0 +PRODUCTVERSION @LCMS2_VERSION_MAJOR@, @LCMS2_VERSION_MINOR@, @LCMS2_VERSION_MICRO@, 0 +FILEFLAGSMASK 0x0L +#ifdef _DEBUG +FILEFLAGS VS_FF_DEBUG +#endif +FILEOS VOS_NT_WINDOWS32 +FILETYPE VFT_DLL +{ + BLOCK "StringFileInfo" + { + BLOCK "040904e4" + { + VALUE "CompanyName", "Marti Maria" + VALUE "FileDescription", "Fast Float plugin" + VALUE "FileVersion", @LCMS2_VERSION@ + VALUE "InternalName", "lcms2_fast_float" + VALUE "LegalCopyright", "Copyright (C) Marti Maria 2022, GPL-3.0-or-later" + VALUE "OriginalFilename", "lcms2_fast_float.dll" + VALUE "ProductName", "LittleCMS color engine" + VALUE "ProductVersion", @LCMS2_VERSION@ + } + } + BLOCK "VarFileInfo" + { + VALUE "Translation", 0x409, 1252 + } +} diff --git a/local/recipes/libs/lcms2/source/plugins/fast_float/src/meson.build b/local/recipes/libs/lcms2/source/plugins/fast_float/src/meson.build new file mode 100644 index 0000000000..32e71e6d7e --- /dev/null +++ b/local/recipes/libs/lcms2/source/plugins/fast_float/src/meson.build @@ -0,0 +1,50 @@ +lcms2_fast_float_sources = files( + 'fast_16_tethra.c', + 'fast_8_curves.c', + 'fast_8_matsh.c', + 'fast_8_matsh_sse.c', + 'fast_8_tethra.c', + 'fast_float_15bits.c', + 'fast_float_15mats.c', + 'fast_float_cmyk.c', + 'fast_float_curves.c', + 'fast_float_internal.h', + 'fast_float_lab.c', + 'fast_float_matsh.c', + 'fast_float_separate.c', + 'fast_float_sup.c', + 'fast_float_tethra.c', +) + +lcms2_fast_float_incdir = include_directories('../include', '.') + +if host_machine.system() == 'windows' + if get_option('default_library') == 'shared' + + lcms2_fast_float_rc = configure_file( + input: 'lcms2_fast_float.rc.in', + configuration: version_cfg, + output: 'lcms2_fast_float.rc', + ) + + lcms2_fast_float_sources += win.compile_resources(lcms2_fast_float_rc) + endif +endif + +liblcms2_fast_float = library( + 'lcms2_fast_float', + lcms2_fast_float_sources, + gnu_symbol_visibility: 'hidden', + dependencies: [liblcms2_dep, m_dep], + include_directories: lcms2_fast_float_incdir, + c_args: cargs, + version: library_version, + install: true, +) + +liblcms2_fast_float_dep = declare_dependency( + link_with: liblcms2_fast_float, + include_directories: lcms2_fast_float_incdir, +) + +extra_libraries += liblcms2_fast_float diff --git a/local/recipes/libs/lcms2/source/plugins/fast_float/testbed/Makefile.am b/local/recipes/libs/lcms2/source/plugins/fast_float/testbed/Makefile.am new file mode 100644 index 0000000000..fc92ef3cf4 --- /dev/null +++ b/local/recipes/libs/lcms2/source/plugins/fast_float/testbed/Makefile.am @@ -0,0 +1,23 @@ +# +# Makefile for building fast_float_testbed +# + +# Don't require all the GNU mandated files +AUTOMAKE_OPTIONS = 1.7 foreign + +AM_CPPFLAGS = -I$(builddir)/../include -I$(srcdir)/../include -I$(srcdir)/../src \ + -I$(top_builddir)/include + +check_PROGRAMS = fast_float_testbed + +fast_float_testbed_LDADD = $(builddir)/../src/liblcms2_fast_float.la $(LCMS_LIB_DEPLIBS) +fast_float_testbed_LDFLAGS = -static @LDFLAGS@ +fast_float_testbed_SOURCES = fast_float_testbed.c + +EXTRA_DIST = test0.icc test1.icc test2.icc test3.icc test5.icc + +check: + if [ "x$(srcdir)" != "x$(builddir)" ]; then \ + cp $(srcdir)/test?.icc . ; \ + fi + ./fast_float_testbed diff --git a/local/recipes/libs/lcms2/source/plugins/fast_float/testbed/Makefile.in b/local/recipes/libs/lcms2/source/plugins/fast_float/testbed/Makefile.in new file mode 100644 index 0000000000..492029ef5f --- /dev/null +++ b/local/recipes/libs/lcms2/source/plugins/fast_float/testbed/Makefile.in @@ -0,0 +1,658 @@ +# Makefile.in generated by automake 1.18.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2025 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# +# Makefile for building fast_float_testbed +# +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +am__rm_f = rm -f $(am__rm_f_notfound) +am__rm_rf = rm -rf $(am__rm_f_notfound) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +check_PROGRAMS = fast_float_testbed$(EXEEXT) +subdir = plugins/fast_float/testbed +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_append_compile_flags.m4 \ + $(top_srcdir)/m4/ax_append_flag.m4 \ + $(top_srcdir)/m4/ax_check_compile_flag.m4 \ + $(top_srcdir)/m4/ax_gcc_func_attribute.m4 \ + $(top_srcdir)/m4/ax_pthread.m4 \ + $(top_srcdir)/m4/ax_require_defined.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am_fast_float_testbed_OBJECTS = fast_float_testbed.$(OBJEXT) +fast_float_testbed_OBJECTS = $(am_fast_float_testbed_OBJECTS) +am__DEPENDENCIES_1 = +fast_float_testbed_DEPENDENCIES = \ + $(builddir)/../src/liblcms2_fast_float.la \ + $(am__DEPENDENCIES_1) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +fast_float_testbed_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(fast_float_testbed_LDFLAGS) \ + $(LDFLAGS) -o $@ +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = ./$(DEPDIR)/fast_float_testbed.Po +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(fast_float_testbed_SOURCES) +DIST_SOURCES = $(fast_float_testbed_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ETAGS = @ETAGS@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FILECMD = @FILECMD@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +JPEGICC_DEPLIBS = @JPEGICC_DEPLIBS@ +LCMS_LIB_DEPLIBS = @LCMS_LIB_DEPLIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBRARY_AGE = @LIBRARY_AGE@ +LIBRARY_CURRENT = @LIBRARY_CURRENT@ +LIBRARY_REVISION = @LIBRARY_REVISION@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_DEPS = @LIBTOOL_DEPS@ +LIB_JPEG = @LIB_JPEG@ +LIB_MATH = @LIB_MATH@ +LIB_PLUGINS = @LIB_PLUGINS@ +LIB_THREAD = @LIB_THREAD@ +LIB_TIFF = @LIB_TIFF@ +LIB_ZLIB = @LIB_ZLIB@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_CXX = @PTHREAD_CXX@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +TIFFICC_DEPLIBS = @TIFFICC_DEPLIBS@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__rm_f_notfound = @am__rm_f_notfound@ +am__tar = @am__tar@ +am__untar = @am__untar@ +am__xargs_n = @am__xargs_n@ +ax_pthread_config = @ax_pthread_config@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +inline = @inline@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +# Don't require all the GNU mandated files +AUTOMAKE_OPTIONS = 1.7 foreign +AM_CPPFLAGS = -I$(builddir)/../include -I$(srcdir)/../include -I$(srcdir)/../src \ + -I$(top_builddir)/include + +fast_float_testbed_LDADD = $(builddir)/../src/liblcms2_fast_float.la $(LCMS_LIB_DEPLIBS) +fast_float_testbed_LDFLAGS = -static @LDFLAGS@ +fast_float_testbed_SOURCES = fast_float_testbed.c +EXTRA_DIST = test0.icc test1.icc test2.icc test3.icc test5.icc +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign plugins/fast_float/testbed/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign plugins/fast_float/testbed/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-checkPROGRAMS: + $(am__rm_f) $(check_PROGRAMS) + test -z "$(EXEEXT)" || $(am__rm_f) $(check_PROGRAMS:$(EXEEXT)=) + +fast_float_testbed$(EXEEXT): $(fast_float_testbed_OBJECTS) $(fast_float_testbed_DEPENDENCIES) $(EXTRA_fast_float_testbed_DEPENDENCIES) + @rm -f fast_float_testbed$(EXEEXT) + $(AM_V_CCLD)$(fast_float_testbed_LINK) $(fast_float_testbed_OBJECTS) $(fast_float_testbed_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fast_float_testbed.Po@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @: >>$@ + +am--depfiles: $(am__depfiles_remade) + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -$(am__rm_f) $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || $(am__rm_f) $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ + mostlyclean-am + +distclean: distclean-am + -rm -f ./$(DEPDIR)/fast_float_testbed.Po + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f ./$(DEPDIR)/fast_float_testbed.Po + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: check-am install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ + clean-checkPROGRAMS clean-generic clean-libtool cscopelist-am \ + ctags ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +check: + if [ "x$(srcdir)" != "x$(builddir)" ]; then \ + cp $(srcdir)/test?.icc . ; \ + fi + ./fast_float_testbed + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: + +# Tell GNU make to disable its built-in pattern rules. +%:: %,v +%:: RCS/%,v +%:: RCS/% +%:: s.% +%:: SCCS/s.% diff --git a/local/recipes/libs/lcms2/source/plugins/fast_float/testbed/demo_cmyk.c b/local/recipes/libs/lcms2/source/plugins/fast_float/testbed/demo_cmyk.c new file mode 100644 index 0000000000..d41f3f5745 --- /dev/null +++ b/local/recipes/libs/lcms2/source/plugins/fast_float/testbed/demo_cmyk.c @@ -0,0 +1,151 @@ +//--------------------------------------------------------------------------------- +// +// Little Color Management System, fast floating point extensions +// Copyright (c) 1998-2022 Marti Maria Saguer, all rights reserved +// +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +//--------------------------------------------------------------------------------- + +#include "lcms2_fast_float.h" + +#include +#include + +static +void Fail(const char* frm, ...) +{ + va_list args; + + va_start(args, frm); + vprintf(frm, args); + va_end(args); + exit(1); +} + + + +#define ALIGNED_SIZE(a,x) (((x)+((a) - 1)) & ~((a) - 1)) + + +static +void* make_image(size_t size_x, size_t size_y, cmsBool fill_rgb, cmsUInt32Number* stride_x) +{ + cmsUInt32Number size_x_aligned = ALIGNED_SIZE(16, size_x); + cmsUInt32Number line_size_in_bytes = size_x_aligned * sizeof(cmsUInt32Number); // RGBA + + cmsUInt8Number* ptr_image = (cmsUInt8Number*) calloc(size_y, line_size_in_bytes); + + if (ptr_image == NULL) Fail("Couldn't allocate memory for image"); + + if (fill_rgb) + { + size_t line; + + for (line = 0; line < size_y; line++) + { + cmsUInt32Number* ptr_line = (cmsUInt32Number*)(ptr_image + line_size_in_bytes * line); + cmsUInt32Number argb = 0; + int col; + + for (col = 0; col < size_x; col++) + *ptr_line++ = argb++; + + } + } + + *stride_x = line_size_in_bytes; + return (void*) ptr_image; +} + +#define SIZE_X 10000 +#define SIZE_Y 10000 + +static +cmsFloat64Number MPixSec(cmsFloat64Number diff) +{ + cmsFloat64Number seconds = (cmsFloat64Number)diff / (cmsFloat64Number)CLOCKS_PER_SEC; + return (SIZE_X * SIZE_Y) / (1024.0 * 1024.0 * seconds); +} + + + +static +cmsFloat64Number speed_test(void) +{ + clock_t atime; + cmsFloat64Number diff; + cmsHPROFILE hProfileIn; + cmsHPROFILE hProfileOut; + cmsHTRANSFORM xform; + void* image_in; + void* image_out; + cmsUInt32Number stride_rgb_x, stride_cmyk_x; + + + hProfileIn = cmsOpenProfileFromFile("sRGB Color Space Profile.icm", "r"); + hProfileOut = cmsOpenProfileFromFile("USWebCoatedSWOP.icc", "r"); + + if (hProfileIn == NULL || hProfileOut == NULL) + Fail("Unable to open profiles"); + + xform = cmsCreateTransform(hProfileIn, TYPE_RGBA_8, hProfileOut, TYPE_CMYK_8, INTENT_PERCEPTUAL, 0); + cmsCloseProfile(hProfileIn); + cmsCloseProfile(hProfileOut); + + + image_in = make_image(SIZE_X, SIZE_Y, TRUE, &stride_rgb_x); + image_out = make_image(SIZE_X, SIZE_Y, FALSE, &stride_cmyk_x); + + atime = clock(); + + cmsDoTransformLineStride(xform, image_in, image_out, SIZE_X, SIZE_Y, stride_rgb_x, stride_cmyk_x, 0, 0); + + diff = clock() - atime; + + free(image_in); + free(image_out); + + cmsDeleteTransform(xform); + return MPixSec(diff); +} + + +int main(void) +{ + cmsFloat64Number without_plugin; + cmsFloat64Number with_plugin; + + fprintf(stdout, "DEMO of littleCMS fast float plugin: RGBA -> CMYK in Megapixels per second\n"); fflush(stdout); + + // filling cache + fprintf(stdout, "Wait CPU cache to stabilize: "); fflush(stdout); + speed_test(); + fprintf(stdout, "Ok\n"); + + fprintf(stdout, "Without plugin: "); fflush(stdout); + without_plugin = speed_test(); + fprintf(stdout, "%.2f\n", without_plugin); fflush(stdout); + + cmsPlugin(cmsFastFloatExtensions()); + + fprintf(stdout, "With plugin: "); fflush(stdout); + with_plugin = speed_test(); + fprintf(stdout, "%.2f\n", with_plugin); fflush(stdout); + + fprintf(stdout, "x %2.2f\n", (with_plugin/without_plugin)); fflush(stdout); + + return 0; +} \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/plugins/fast_float/testbed/fast_float_testbed.c b/local/recipes/libs/lcms2/source/plugins/fast_float/testbed/fast_float_testbed.c new file mode 100644 index 0000000000..f141f9691b --- /dev/null +++ b/local/recipes/libs/lcms2/source/plugins/fast_float/testbed/fast_float_testbed.c @@ -0,0 +1,2739 @@ +//--------------------------------------------------------------------------------- +// +// Little Color Management System, fast floating point extensions +// Copyright (c) 1998-2026 Marti Maria Saguer, all rights reserved +// +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +//--------------------------------------------------------------------------------- + +#include "fast_float_internal.h" + +#include +#include + +// On Visual Studio, use debug CRT +#ifdef _MSC_VER +# include "crtdbg.h" +#endif + +#ifndef PROFILES_DIR +#define PROFILES_DIR "../../test_profiles/" +#endif + +// Some pixel representations +typedef struct { cmsUInt8Number r, g, b; } Scanline_rgb8bits; +typedef struct { cmsUInt8Number r, g, b, a; } Scanline_rgba8bits; +typedef struct { cmsUInt8Number c, m, y, k; } Scanline_cmyk8bits; +typedef struct { cmsUInt16Number r, g, b; } Scanline_rgb16bits; +typedef struct { cmsUInt16Number r, g, b, a; } Scanline_rgba16bits; +typedef struct { cmsUInt16Number c, m, y, k; } Scanline_cmyk16bits; +typedef struct { cmsUInt16Number r, g, b; } Scanline_rgb15bits; +typedef struct { cmsUInt16Number r, g, b, a; } Scanline_rgba15bits; +typedef struct { cmsUInt16Number r, g, b, a; } Scanline_cmyk15bits; +typedef struct { cmsFloat32Number r, g, b; } Scanline_rgbFloat; +typedef struct { cmsFloat32Number r, g, b, a; } Scanline_rgbaFloat; +typedef struct { cmsFloat32Number c, m, y, k; } Scanline_cmykFloat; +typedef struct { cmsFloat32Number L, a, b; } Scanline_LabFloat; + +// 15 bit mode. <=> 8 bits mode +#define FROM_8_TO_15(x8) (cmsUInt16Number) ((((cmsUInt64Number)x8 << 15)) / 0xFF) +#define FROM_15_TO_8(x15) (cmsUInt8Number) (((cmsUInt64Number) x15 * 0xFF + 0x4000) >> 15) + + +// Floating point accuracy for tests +#define EPSILON_FLOAT_TESTS 0.005 + +// A flushed printf +static +void trace(const char* frm, ...) +{ + va_list args; + + va_start(args, frm); + vfprintf(stderr, frm, args); + fflush(stderr); + va_end(args); +} + + +// The callback function used by cmsSetLogErrorHandler() +static +void FatalErrorQuit(cmsContext ContextID, cmsUInt32Number ErrorCode, const char *Text) +{ + UNUSED_PARAMETER(ContextID); + UNUSED_PARAMETER(ErrorCode); + + trace("** Fatal error: %s\n", Text); + exit(1); +} + +// Rise an error and exit +static +void Fail(const char* frm, ...) +{ + char ReasonToFailBuffer[1024]; + va_list args; + + va_start(args, frm); + vsprintf(ReasonToFailBuffer, frm, args); + FatalErrorQuit(0, 0, ReasonToFailBuffer); + + // unreachable va_end(args); +} + + +// Creates a fake profile that only has a curve. Used in several places +static +cmsHPROFILE CreateCurves(void) +{ + cmsToneCurve* Gamma = cmsBuildGamma(0, 1.1); + cmsToneCurve* Transfer[3]; + cmsHPROFILE h; + + Transfer[0] = Transfer[1] = Transfer[2] = Gamma; + h = cmsCreateLinearizationDeviceLink(cmsSigRgbData, Transfer); + + cmsFreeToneCurve(Gamma); + + return h; +} + + +// Check for a single 15 bit Photoshop-like formatter +static +void CheckSingleFormatter15(cmsContext id, cmsUInt32Number Type, const char* Text) +{ + cmsUInt16Number Values[cmsMAXCHANNELS]; + cmsUInt8Number Buffer[1024]; + cmsFormatter f, b; + cmsInt32Number i, j, nChannels, bytes; + _xform_head info; + + UNUSED_PARAMETER(id); + + memset(&info, 0, sizeof(info)); + info.OutputFormat = info.InputFormat = Type; + + // Get functions to go forth and back + f = Formatter_15Bit_Factory(Type, cmsFormatterInput, CMS_PACK_FLAGS_16BITS); + b = Formatter_15Bit_Factory(Type, cmsFormatterOutput, CMS_PACK_FLAGS_16BITS); + + if (f.Fmt16 == NULL || b.Fmt16 == NULL) { + + Fail("no formatter for %s", Text); + return; + } + + nChannels = T_CHANNELS(Type); + bytes = T_BYTES(Type); + + for (j = 0; j < 5; j++) { + + for (i = 0; i < nChannels; i++) { + + Values[i] = (cmsUInt16Number)(i + j) << 1; + } + + b.Fmt16((struct _cmstransform_struct*) &info, Values, Buffer, 1); + memset(Values, 0, sizeof(Values)); + f.Fmt16((struct _cmstransform_struct*) &info, Values, Buffer, 1); + + for (i = 0; i < nChannels; i++) { + + if (Values[i] != ((i + j) << 1)) { + + Fail("%s failed", Text); + return; + } + } + } +} + +#define C(a) CheckSingleFormatter15(0, a, #a) + +// Check for all 15 bits formatters +static +void CheckFormatters15(void) +{ + C(TYPE_GRAY_15); + C(TYPE_GRAY_15_REV); + C(TYPE_GRAY_15_SE); + C(TYPE_GRAYA_15); + C(TYPE_GRAYA_15_SE); + C(TYPE_GRAYA_15_PLANAR); + C(TYPE_RGB_15); + C(TYPE_RGB_15_PLANAR); + C(TYPE_RGB_15_SE); + C(TYPE_BGR_15); + C(TYPE_BGR_15_PLANAR); + C(TYPE_BGR_15_SE); + C(TYPE_RGBA_15); + C(TYPE_RGBA_15_PLANAR); + C(TYPE_RGBA_15_SE); + C(TYPE_ARGB_15); + C(TYPE_ABGR_15); + C(TYPE_ABGR_15_PLANAR); + C(TYPE_ABGR_15_SE); + C(TYPE_BGRA_15); + C(TYPE_BGRA_15_SE); + C(TYPE_YMC_15); + C(TYPE_CMY_15); + C(TYPE_CMY_15_PLANAR); + C(TYPE_CMY_15_SE); + C(TYPE_CMYK_15); + C(TYPE_CMYK_15_REV); + C(TYPE_CMYK_15_PLANAR); + C(TYPE_CMYK_15_SE); + C(TYPE_KYMC_15); + C(TYPE_KYMC_15_SE); + C(TYPE_KCMY_15); + C(TYPE_KCMY_15_REV); + C(TYPE_KCMY_15_SE); +} +#undef C + + +static +cmsInt32Number checkSingleComputeIncrements(cmsUInt32Number Format, cmsUInt32Number planeStride, cmsUInt32Number ExpectedChannels, cmsUInt32Number ExpectedAlpha, ...) +{ + cmsUInt32Number nChannels, nAlpha, nTotal, i, rc = 0 ; + cmsUInt32Number ComponentStartingOrder[cmsMAXCHANNELS], ComponentPointerIncrements[cmsMAXCHANNELS]; + va_list args; + + + va_start(args, ExpectedAlpha); + + _cmsComputeComponentIncrements(Format, planeStride, &nChannels, &nAlpha, ComponentStartingOrder, ComponentPointerIncrements); + + if (nChannels != ExpectedChannels) + return 0; + + if (nAlpha != ExpectedAlpha) + return 0; + + nTotal = nAlpha + nChannels; + + for (i = 0; i < nTotal; i++) + { + cmsUInt32Number so = va_arg(args, cmsUInt32Number); + if (so != ComponentStartingOrder[i]) + goto Error; + } + + for (i = 0; i < nTotal; i++) + { + cmsUInt32Number so = va_arg(args, cmsUInt32Number); + if (so != ComponentPointerIncrements[i]) + goto Error; + } + + // Success + rc = 1; + +Error: + va_end(args); + + return rc; +} + +#define CHECK(frm, plane, chans, alpha, ...) if (!checkSingleComputeIncrements(frm, plane, chans, alpha, __VA_ARGS__)) { trace("Format failed!\n"); return 0; } + + + +// Validate the compute increments function +cmsInt32Number CheckComputeIncrements(void) +{ + CHECK(TYPE_GRAY_8, 0, 1, 0, /**/ 0, /**/ 1); + CHECK(TYPE_GRAYA_8, 0, 1, 1, /**/ 0, 1, /**/ 2, 2); + CHECK(TYPE_AGRAY_8, 0, 1, 1, /**/ 1, 0, /**/ 2, 2); + CHECK(TYPE_GRAY_16, 0, 1, 0, /**/ 0, /**/ 2); + CHECK(TYPE_GRAYA_16, 0, 1, 1, /**/ 0, 2, /**/ 4, 4); + CHECK(TYPE_AGRAY_16, 0, 1, 1, /**/ 2, 0, /**/ 4, 4); + + CHECK(TYPE_GRAY_FLT, 0, 1, 0, /**/ 0, /**/ 4); + CHECK(TYPE_GRAYA_FLT, 0, 1, 1, /**/ 0, 4, /**/ 8, 8); + CHECK(TYPE_AGRAY_FLT, 0, 1, 1, /**/ 4, 0, /**/ 8, 8); + + CHECK(TYPE_GRAY_DBL, 0, 1, 0, /**/ 0, /**/ 8); + CHECK(TYPE_AGRAY_DBL, 0, 1, 1, /**/ 8, 0, /**/ 16, 16); + + CHECK(TYPE_RGB_8, 0, 3, 0, /**/ 0, 1, 2, /**/ 3, 3, 3); + CHECK(TYPE_RGBA_8, 0, 3, 1, /**/ 0, 1, 2, 3, /**/ 4, 4, 4, 4); + CHECK(TYPE_ARGB_8, 0, 3, 1, /**/ 1, 2, 3, 0, /**/ 4, 4, 4, 4); + + CHECK(TYPE_RGB_16, 0, 3, 0, /**/ 0, 2, 4, /**/ 6, 6, 6); + CHECK(TYPE_RGBA_16, 0, 3, 1, /**/ 0, 2, 4, 6, /**/ 8, 8, 8, 8); + CHECK(TYPE_ARGB_16, 0, 3, 1, /**/ 2, 4, 6, 0, /**/ 8, 8, 8, 8); + + CHECK(TYPE_RGB_FLT, 0, 3, 0, /**/ 0, 4, 8, /**/ 12, 12, 12); + CHECK(TYPE_RGBA_FLT, 0, 3, 1, /**/ 0, 4, 8, 12, /**/ 16, 16, 16, 16); + CHECK(TYPE_ARGB_FLT, 0, 3, 1, /**/ 4, 8, 12, 0, /**/ 16, 16, 16, 16); + + CHECK(TYPE_BGR_8, 0, 3, 0, /**/ 2, 1, 0, /**/ 3, 3, 3); + CHECK(TYPE_BGRA_8, 0, 3, 1, /**/ 2, 1, 0, 3, /**/ 4, 4, 4, 4); + CHECK(TYPE_ABGR_8, 0, 3, 1, /**/ 3, 2, 1, 0, /**/ 4, 4, 4, 4); + + CHECK(TYPE_BGR_16, 0, 3, 0, /**/ 4, 2, 0, /**/ 6, 6, 6); + CHECK(TYPE_BGRA_16, 0, 3, 1, /**/ 4, 2, 0, 6, /**/ 8, 8, 8, 8); + CHECK(TYPE_ABGR_16, 0, 3, 1, /**/ 6, 4, 2, 0, /**/ 8, 8, 8, 8); + + CHECK(TYPE_BGR_FLT, 0, 3, 0, /**/ 8, 4, 0, /**/ 12, 12, 12); + CHECK(TYPE_BGRA_FLT, 0, 3, 1, /**/ 8, 4, 0, 12, /**/ 16, 16, 16, 16); + CHECK(TYPE_ABGR_FLT, 0, 3, 1, /**/ 12, 8, 4, 0, /**/ 16, 16, 16, 16); + + + CHECK(TYPE_CMYK_8, 0, 4, 0, /**/ 0, 1, 2, 3, /**/ 4, 4, 4, 4); + CHECK(TYPE_CMYKA_8, 0, 4, 1, /**/ 0, 1, 2, 3, 4, /**/ 5, 5, 5, 5, 5); + CHECK(TYPE_ACMYK_8, 0, 4, 1, /**/ 1, 2, 3, 4, 0, /**/ 5, 5, 5, 5, 5); + + CHECK(TYPE_KYMC_8, 0, 4, 0, /**/ 3, 2, 1, 0, /**/ 4, 4, 4, 4); + CHECK(TYPE_KYMCA_8, 0, 4, 1, /**/ 3, 2, 1, 0, 4, /**/ 5, 5, 5, 5, 5); + CHECK(TYPE_AKYMC_8, 0, 4, 1, /**/ 4, 3, 2, 1, 0, /**/ 5, 5, 5, 5, 5); + + CHECK(TYPE_KCMY_8, 0, 4, 0, /**/ 1, 2, 3, 0, /**/ 4, 4, 4, 4); + + CHECK(TYPE_CMYK_16, 0, 4, 0, /**/ 0, 2, 4, 6, /**/ 8, 8, 8, 8); + CHECK(TYPE_CMYKA_16, 0, 4, 1, /**/ 0, 2, 4, 6, 8, /**/ 10, 10, 10, 10, 10); + CHECK(TYPE_ACMYK_16, 0, 4, 1, /**/ 2, 4, 6, 8, 0, /**/ 10, 10, 10, 10, 10); + + CHECK(TYPE_KYMC_16, 0, 4, 0, /**/ 6, 4, 2, 0, /**/ 8, 8, 8, 8); + CHECK(TYPE_KYMCA_16, 0, 4, 1, /**/ 6, 4, 2, 0, 8, /**/ 10, 10, 10, 10, 10); + CHECK(TYPE_AKYMC_16, 0, 4, 1, /**/ 8, 6, 4, 2, 0, /**/ 10, 10, 10, 10, 10); + + CHECK(TYPE_KCMY_16, 0, 4, 0, /**/ 2, 4, 6, 0, /**/ 8, 8, 8, 8); + + // Planar + + CHECK(TYPE_GRAYA_8_PLANAR, 100, 1, 1, /**/ 0, 100, /**/ 1, 1); + CHECK(TYPE_AGRAY_8_PLANAR, 100, 1, 1, /**/ 100, 0, /**/ 1, 1); + + CHECK(TYPE_GRAYA_16_PLANAR, 100, 1, 1, /**/ 0, 100, /**/ 2, 2); + CHECK(TYPE_AGRAY_16_PLANAR, 100, 1, 1, /**/ 100, 0, /**/ 2, 2); + + CHECK(TYPE_GRAYA_FLT_PLANAR, 100, 1, 1, /**/ 0, 100, /**/ 4, 4); + CHECK(TYPE_AGRAY_FLT_PLANAR, 100, 1, 1, /**/ 100, 0, /**/ 4, 4); + + CHECK(TYPE_GRAYA_DBL_PLANAR, 100, 1, 1, /**/ 0, 100, /**/ 8, 8); + CHECK(TYPE_AGRAY_DBL_PLANAR, 100, 1, 1, /**/ 100, 0, /**/ 8, 8); + + CHECK(TYPE_RGB_8_PLANAR, 100, 3, 0, /**/ 0, 100, 200, /**/ 1, 1, 1); + CHECK(TYPE_RGBA_8_PLANAR, 100, 3, 1, /**/ 0, 100, 200, 300, /**/ 1, 1, 1, 1); + CHECK(TYPE_ARGB_8_PLANAR, 100, 3, 1, /**/ 100, 200, 300, 0, /**/ 1, 1, 1, 1); + + CHECK(TYPE_BGR_8_PLANAR, 100, 3, 0, /**/ 200, 100, 0, /**/ 1, 1, 1); + CHECK(TYPE_BGRA_8_PLANAR, 100, 3, 1, /**/ 200, 100, 0, 300, /**/ 1, 1, 1, 1); + CHECK(TYPE_ABGR_8_PLANAR, 100, 3, 1, /**/ 300, 200, 100, 0, /**/ 1, 1, 1, 1); + + CHECK(TYPE_RGB_16_PLANAR, 100, 3, 0, /**/ 0, 100, 200, /**/ 2, 2, 2); + CHECK(TYPE_RGBA_16_PLANAR, 100, 3, 1, /**/ 0, 100, 200, 300, /**/ 2, 2, 2, 2); + CHECK(TYPE_ARGB_16_PLANAR, 100, 3, 1, /**/ 100, 200, 300, 0, /**/ 2, 2, 2, 2); + + CHECK(TYPE_BGR_16_PLANAR, 100, 3, 0, /**/ 200, 100, 0, /**/ 2, 2, 2); + CHECK(TYPE_BGRA_16_PLANAR, 100, 3, 1, /**/ 200, 100, 0, 300, /**/ 2, 2, 2, 2); + CHECK(TYPE_ABGR_16_PLANAR, 100, 3, 1, /**/ 300, 200, 100, 0, /**/ 2, 2, 2, 2); + + return 1; +} + + + +// Check 15 bit mode accuracy +static +cmsBool Valid15(cmsUInt16Number a, cmsUInt8Number b) +{ + return abs(FROM_15_TO_8(a) - b) <= 2; +} + +// Check the test macros itselves +static +void Check15bitMacros(void) +{ + int i; + + trace("Checking 15 bit <=> 8 bit macros..."); + + for (i = 0; i < 256; i++) + { + cmsUInt16Number n = FROM_8_TO_15(i); + cmsUInt8Number m = FROM_15_TO_8(n); + + if (m != i) + Fail("Failed on %d (->%d->%d)", i, n, m); + } + trace("ok\n"); +} + +// Do an in-depth test by checking all RGB cube of 8 bits, going from profilein to profileout. +// Results should be same except for 2 contone levels allowed for roundoff. Note 15 bits is more +// precise than 8 bits and this is a source of discrepancies. Cache is disabled +static +void TryAllValues15(cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut, cmsInt32Number Intent) +{ + Scanline_rgb8bits* buffer8in; + Scanline_rgb15bits* buffer15in; + Scanline_rgb8bits* buffer8out; + Scanline_rgb15bits* buffer15out; + int r, g, b, j; + cmsUInt32Number npixels = 256 * 256 * 256; // All RGB cube in 8 bits + + cmsHTRANSFORM xform15 = cmsCreateTransformTHR(0, hlcmsProfileIn, TYPE_RGB_15, hlcmsProfileOut, TYPE_RGB_15, Intent, cmsFLAGS_NOCACHE); + cmsHTRANSFORM xform8 = cmsCreateTransformTHR(0, hlcmsProfileIn, TYPE_RGB_8, hlcmsProfileOut, TYPE_RGB_8, Intent, cmsFLAGS_NOCACHE); // Transforms already created + + cmsCloseProfile(hlcmsProfileIn); + cmsCloseProfile(hlcmsProfileOut); + + if (xform15 == NULL || xform8 == NULL) { + + Fail("NULL transforms on check for 15 bit conversions"); + } + + // Since this is just a test, I will not check memory allocation... + buffer8in = (Scanline_rgb8bits*)malloc(npixels * sizeof(Scanline_rgb8bits)); + buffer15in = (Scanline_rgb15bits*)malloc(npixels * sizeof(Scanline_rgb15bits)); + buffer8out = (Scanline_rgb8bits*)malloc(npixels * sizeof(Scanline_rgb8bits)); + buffer15out = (Scanline_rgb15bits*)malloc(npixels * sizeof(Scanline_rgb15bits)); + + // Fill input values for 8 and 15 bits + j = 0; + for (r = 0; r < 256; r++) + for (g = 0; g < 256; g++) + for (b = 0; b < 256; b++) { + + buffer8in[j].r = (cmsUInt8Number)r; + buffer8in[j].g = (cmsUInt8Number)g; + buffer8in[j].b = (cmsUInt8Number)b; + + buffer15in[j].r = FROM_8_TO_15(r); + buffer15in[j].g = FROM_8_TO_15(g); + buffer15in[j].b = FROM_8_TO_15(b); + + j++; + } + + cmsDoTransform(xform15, buffer15in, buffer15out, npixels); + cmsDoTransform(xform8, buffer8in, buffer8out, npixels); + + j = 0; + for (r = 0; r < 256; r++) + for (g = 0; g < 256; g++) + for (b = 0; b < 256; b++) { + + // Check the results + if (!Valid15(buffer15out[j].r, buffer8out[j].r) || + !Valid15(buffer15out[j].g, buffer8out[j].g) || + !Valid15(buffer15out[j].b, buffer8out[j].b)) + Fail("Conversion failed at (%d %d %d) != (%d %d %d)", buffer8out[j].r, buffer8out[j].g, buffer8out[j].b, + FROM_15_TO_8(buffer15out[j].r), FROM_15_TO_8(buffer15out[j].g), FROM_15_TO_8(buffer15out[j].b)); + + j++; + } + + free(buffer8in); free(buffer15in); + free(buffer8out); free(buffer15out); + cmsDeleteTransform(xform15); + cmsDeleteTransform(xform8); +} + +// Convert some known values +static +void Check15bitsConversions(void) +{ + Check15bitMacros(); + + trace("Checking accuracy of 15 bits on CLUT..."); + TryAllValues15(cmsOpenProfileFromFile(PROFILES_DIR "test5.icc", "r"), cmsOpenProfileFromFile(PROFILES_DIR "test3.icc", "r"), INTENT_PERCEPTUAL); + trace("Ok\n"); + + trace("Checking accuracy of 15 bits on same profile ..."); + TryAllValues15(cmsOpenProfileFromFile(PROFILES_DIR "test0.icc", "r"), cmsOpenProfileFromFile(PROFILES_DIR "test0.icc", "r"), INTENT_PERCEPTUAL); + trace("Ok\n"); + + trace("Checking accuracy of 15 bits on Matrix..."); + TryAllValues15(cmsOpenProfileFromFile(PROFILES_DIR "test5.icc", "r"), cmsOpenProfileFromFile(PROFILES_DIR "test0.icc", "r"), INTENT_PERCEPTUAL); + trace("Ok\n"); + + trace("All 15 bits tests passed OK\n\n"); +} + +// Next test checks results of optimized 16 bits versus raw 16 bits. +static +void TryAllValues16bits(cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut, cmsInt32Number Intent) +{ + cmsContext Raw = cmsCreateContext(NULL, NULL); + cmsContext Plugin = cmsCreateContext(cmsFastFloatExtensions(), NULL); + + Scanline_rgba16bits* bufferIn; + Scanline_rgba16bits* bufferRawOut; + Scanline_rgba16bits* bufferPluginOut; + int r, g, b; + + int j; + cmsUInt32Number npixels = 256 * 256 * 256; + + cmsHTRANSFORM xformRaw = cmsCreateTransformTHR(Raw, hlcmsProfileIn, TYPE_RGBA_16, hlcmsProfileOut, TYPE_RGBA_16, Intent, cmsFLAGS_NOCACHE| cmsFLAGS_COPY_ALPHA); + cmsHTRANSFORM xformPlugin = cmsCreateTransformTHR(Plugin, hlcmsProfileIn, TYPE_RGBA_16, hlcmsProfileOut, TYPE_RGBA_16, Intent, cmsFLAGS_NOCACHE| cmsFLAGS_COPY_ALPHA); + + cmsCloseProfile(hlcmsProfileIn); + cmsCloseProfile(hlcmsProfileOut); + + if (xformRaw == NULL || xformPlugin == NULL) { + + Fail("NULL transforms on check float conversions"); + } + + // Again, no checking on mem alloc because this is just a test + bufferIn = (Scanline_rgba16bits*)malloc(npixels * sizeof(Scanline_rgba16bits)); + bufferRawOut = (Scanline_rgba16bits*)malloc(npixels * sizeof(Scanline_rgba16bits)); + bufferPluginOut = (Scanline_rgba16bits*)malloc(npixels * sizeof(Scanline_rgba16bits)); + + // Same input to both transforms + j = 0; + for (r = 0; r < 256; r++) + for (g = 0; g < 256; g++) + for (b = 0; b < 256; b++) { + + bufferIn[j].r = FROM_8_TO_16(0xf8); + bufferIn[j].g = FROM_8_TO_16(0xf8); + bufferIn[j].b = FROM_8_TO_16(0xf8); + bufferIn[j].a = 0xffff; + + j++; + } + + // Different transforms, different output buffers + cmsDoTransform(xformRaw, bufferIn, bufferRawOut, npixels); + cmsDoTransform(xformPlugin, bufferIn, bufferPluginOut, npixels); + + // Lets compare results + j = 0; + for (r = 0; r < 256; r++) + for (g = 0; g < 256; g++) + for (b = 0; b < 256; b++) { + + if (bufferRawOut[j].r != bufferPluginOut[j].r || + bufferRawOut[j].g != bufferPluginOut[j].g || + bufferRawOut[j].b != bufferPluginOut[j].b || + bufferRawOut[j].a != bufferPluginOut[j].a) + Fail( + "Conversion failed at [%x %x %x %x] (%x %x %x %x) != (%x %x %x %x)", + bufferIn[j].r, bufferIn[j].g, bufferIn[j].b, bufferIn[j].a, + bufferRawOut[j].r, bufferRawOut[j].g, bufferRawOut[j].b, bufferRawOut[j].a, + bufferPluginOut[j].r, bufferPluginOut[j].g, bufferPluginOut[j].b, bufferPluginOut[j].a); + + j++; + } + + free(bufferIn); free(bufferRawOut); + free(bufferPluginOut); + + cmsDeleteTransform(xformRaw); + cmsDeleteTransform(xformPlugin); + + cmsDeleteContext(Plugin); + cmsDeleteContext(Raw); +} + +static +void CheckAccuracy16Bits(void) +{ + // CLUT should be as 16 bits or better + trace("Checking accuracy of 16 bits CLUT..."); + TryAllValues16bits(cmsOpenProfileFromFile(PROFILES_DIR "test5.icc", "r"), cmsOpenProfileFromFile(PROFILES_DIR "test3.icc", "r"), INTENT_PERCEPTUAL); + trace("All 16 bits tests passed OK\n\n"); +} + + +// Try values that are denormalized, not-a-number and out of range +static +void CheckUncommonValues(cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut, cmsInt32Number Intent) +{ + union + { + cmsFloat32Number subnormal; + cmsUInt32Number Int; + + } sub_pos, sub_neg; + + Scanline_rgbFloat* bufferIn; + Scanline_rgbFloat* bufferPluginOut; + + cmsUInt32Number i, npixels = 100; + + cmsContext Plugin = cmsCreateContext(cmsFastFloatExtensions(), NULL); + + cmsHTRANSFORM xformPlugin = cmsCreateTransformTHR(Plugin, hlcmsProfileIn, TYPE_RGB_FLT, hlcmsProfileOut, TYPE_RGB_FLT, Intent, 0); + + + sub_pos.Int = 0x00000002; + sub_neg.Int = 0x80000002; + + cmsCloseProfile(hlcmsProfileIn); + cmsCloseProfile(hlcmsProfileOut); + + if (xformPlugin == NULL) { + + Fail("NULL transform on check uncommon values"); + } + + + bufferIn = (Scanline_rgbFloat*)malloc(npixels * sizeof(Scanline_rgbFloat)); + bufferPluginOut = (Scanline_rgbFloat*)malloc(npixels * sizeof(Scanline_rgbFloat)); + + for (i = 0; i < npixels; i++) + { + bufferIn[i].r = i / 40.0f - 0.5f; + bufferIn[i].g = i / 20.0f - 0.5f; + bufferIn[i].b = i / 60.0f - 0.5f; + } + + cmsDoTransform(xformPlugin, bufferIn, bufferPluginOut, npixels); + + + bufferIn[0].r = NAN; + bufferIn[0].g = NAN; + bufferIn[0].b = NAN; + + bufferIn[1].r = INFINITY; + bufferIn[1].g = INFINITY; + bufferIn[1].b = INFINITY; + + bufferIn[2].r = sub_pos.subnormal; + bufferIn[2].g = sub_pos.subnormal; + bufferIn[2].b = sub_pos.subnormal; + + bufferIn[3].r = sub_neg.subnormal; + bufferIn[3].g = sub_neg.subnormal; + bufferIn[3].b = sub_neg.subnormal; + + cmsDoTransform(xformPlugin, bufferIn, bufferPluginOut, 4); + + free(bufferIn); + free(bufferPluginOut); + + cmsDeleteTransform(xformPlugin); + + cmsDeleteContext(Plugin); +} + + +static +void lab8toLab(cmsUInt8Number lab8[3], cmsCIELab* Lab) +{ + cmsUInt16Number lab16[3]; + + lab16[0] = FROM_8_TO_16(lab8[0]); + lab16[1] = FROM_8_TO_16(lab8[1]); + lab16[2] = FROM_8_TO_16(lab8[2]); + + cmsLabEncoded2Float(Lab, lab16); +} + +static +void CheckToEncodedLab(void) +{ + cmsContext Plugin = cmsCreateContext(cmsFastFloatExtensions(), NULL); + cmsContext Raw = cmsCreateContext(NULL, NULL); + + cmsHPROFILE hsRGB = cmsCreate_sRGBProfile(); + cmsHPROFILE hLab = cmsCreateLab4Profile(NULL); + + cmsHTRANSFORM xform_plugin = cmsCreateTransformTHR(Plugin, hsRGB, TYPE_RGB_8, hLab, TYPE_Lab_8, INTENT_PERCEPTUAL, 0); + cmsHTRANSFORM xform = cmsCreateTransformTHR(Raw, hsRGB, TYPE_RGB_8, hLab, TYPE_Lab_8, INTENT_PERCEPTUAL, 0); + + int r, g, b; + cmsCIELab Lab1, Lab2; + cmsUInt8Number rgb[3], lab1[3], lab2[3]; + double err; + + for (r=0; r < 256; r += 5) + for (g = 0; g < 256; g += 5) + for (b = 0; b < 256; b += 5) + { + rgb[0] = (cmsUInt8Number) r; rgb[1] = (cmsUInt8Number) g; rgb[2] = (cmsUInt8Number) b; + + cmsDoTransform(xform_plugin, rgb, lab1, 1); + cmsDoTransform(xform, rgb, lab2, 1); + + lab8toLab(lab1, &Lab1); + lab8toLab(lab2, &Lab2); + + err = cmsDeltaE(&Lab1, &Lab2); + if (err > 0.1) + { + trace("Error on lab encoded (%f, %f, %f) <> (% f, % f, % f)\n", + Lab1.L, Lab1.a, Lab1.b, Lab2.L, Lab2.a, Lab2.b); + } + } + + + cmsDeleteTransform(xform); cmsDeleteTransform(xform_plugin); + cmsCloseProfile(hsRGB); cmsCloseProfile(hLab); + cmsDeleteContext(Raw); + cmsDeleteContext(Plugin); + +} + + +static +void CheckToFloatLab(void) +{ + cmsContext Plugin = cmsCreateContext(cmsFastFloatExtensions(), NULL); + cmsContext Raw = cmsCreateContext(NULL, NULL); + + cmsHPROFILE hsRGB = cmsCreate_sRGBProfile(); + cmsHPROFILE hLab = cmsCreateLab4Profile(NULL); + + cmsHTRANSFORM xform_plugin = cmsCreateTransformTHR(Plugin, hsRGB, TYPE_RGB_8, hLab, TYPE_Lab_DBL, INTENT_PERCEPTUAL, 0); + cmsHTRANSFORM xform = cmsCreateTransformTHR(Raw, hsRGB, TYPE_RGB_8, hLab, TYPE_Lab_DBL, INTENT_PERCEPTUAL, 0); + + int r, g, b; + cmsCIELab Lab1, Lab2; + cmsUInt8Number rgb[3]; + double err; + + for (r = 0; r < 256; r += 10) + for (g = 0; g < 256; g += 10) + for (b = 0; b < 256; b += 10) + { + rgb[0] = (cmsUInt8Number)r; rgb[1] = (cmsUInt8Number)g; rgb[2] = (cmsUInt8Number)b; + + cmsDoTransform(xform_plugin, rgb, &Lab1, 1); + cmsDoTransform(xform, rgb, &Lab2, 1); + + err = cmsDeltaE(&Lab1, &Lab2); + if (err > 0.1) + { + trace("Error on lab encoded (%f, %f, %f) <> (% f, % f, % f)\n", + Lab1.L, Lab1.a, Lab1.b, Lab2.L, Lab2.a, Lab2.b); + } + } + + + cmsDeleteTransform(xform); cmsDeleteTransform(xform_plugin); + cmsCloseProfile(hsRGB); cmsCloseProfile(hLab); + cmsDeleteContext(Raw); + cmsDeleteContext(Plugin); +} + + + +static +void CheckFloatToFloatLab(void) +{ + cmsContext Plugin = cmsCreateContext(cmsFastFloatExtensions(), NULL); + cmsContext Raw = cmsCreateContext(NULL, NULL); + + cmsHPROFILE hsRGB = cmsCreate_sRGBProfile(); + cmsHPROFILE hLab = cmsCreateLab4Profile(NULL); + + cmsHTRANSFORM xform_plugin = cmsCreateTransformTHR(Plugin, hsRGB, TYPE_RGB_FLT, hLab, TYPE_Lab_FLT, INTENT_PERCEPTUAL, 0); + cmsHTRANSFORM xform = cmsCreateTransformTHR(Raw, hsRGB, TYPE_RGB_FLT, hLab, TYPE_Lab_FLT, INTENT_PERCEPTUAL, 0); + + int r, g, b; + cmsCIELab Lab1, Lab2; + cmsFloat32Number rgb[3]; + cmsFloat32Number Lab[3]; + double err; + + + for (r = 0; r < 256; r += 10) + for (g = 0; g < 256; g += 10) + for (b = 0; b < 256; b += 10) + { + rgb[0] = (cmsFloat32Number)r / 255.0f; + rgb[1] = (cmsFloat32Number)g / 255.0f; + rgb[2] = (cmsFloat32Number)b / 255.0f; + + cmsDoTransform(xform_plugin, rgb, Lab, 1); + Lab1.L = Lab[0]; Lab1.a = Lab[1]; Lab1.b = Lab[2]; + cmsDoTransform(xform, rgb, Lab, 1); + Lab2.L = Lab[0]; Lab2.a = Lab[1]; Lab2.b = Lab[2]; + + err = cmsDeltaE(&Lab1, &Lab2); + if (err > 0.5) + { + trace("Error on lab encoded (%f, %f, %f) <> (% f, % f, % f)\n", + Lab1.L, Lab1.a, Lab1.b, Lab2.L, Lab2.a, Lab2.b); + } + } + + + cmsDeleteTransform(xform); cmsDeleteTransform(xform_plugin); + cmsCloseProfile(hsRGB); cmsCloseProfile(hLab); + cmsDeleteContext(Raw); + cmsDeleteContext(Plugin); + +} + + +static +void CheckToFloatXYZ(void) +{ + cmsContext Plugin = cmsCreateContext(cmsFastFloatExtensions(), NULL); + cmsContext Raw = cmsCreateContext(NULL, NULL); + + cmsHPROFILE hsRGB = cmsCreate_sRGBProfile(); + cmsHPROFILE hXYZ = cmsCreateXYZProfile(); + + cmsHTRANSFORM xform_plugin = cmsCreateTransformTHR(Plugin, hsRGB, TYPE_RGB_8, hXYZ, TYPE_XYZ_DBL, INTENT_PERCEPTUAL, 0); + cmsHTRANSFORM xform = cmsCreateTransformTHR(Raw, hsRGB, TYPE_RGB_8, hXYZ, TYPE_XYZ_DBL, INTENT_PERCEPTUAL, 0); + + int r, g, b; + cmsCIEXYZ XYZ1, XYZ2; + cmsCIELab Lab1, Lab2; + cmsUInt8Number rgb[3]; + double err; + + for (r = 0; r < 256; r += 10) + for (g = 0; g < 256; g += 10) + for (b = 0; b < 256; b += 10) + { + rgb[0] = (cmsUInt8Number)r; rgb[1] = (cmsUInt8Number)g; rgb[2] = (cmsUInt8Number)b; + + cmsDoTransform(xform_plugin, rgb, &XYZ1, 1); + cmsDoTransform(xform, rgb, &XYZ2, 1); + + cmsXYZ2Lab(NULL, &Lab1, &XYZ1); + cmsXYZ2Lab(NULL, &Lab2, &XYZ2); + + err = cmsDeltaE(&Lab1, &Lab2); + if (err > 0.1) + { + trace("Error on lab encoded (%f, %f, %f) <> (% f, % f, % f)\n", + Lab1.L, Lab1.a, Lab1.b, Lab2.L, Lab2.a, Lab2.b); + } + } + + + cmsDeleteTransform(xform); cmsDeleteTransform(xform_plugin); + cmsCloseProfile(hsRGB); cmsCloseProfile(hXYZ); + cmsDeleteContext(Raw); + cmsDeleteContext(Plugin); +} + +static +void CheckFloatToFloatXYZ(void) +{ + cmsContext Plugin = cmsCreateContext(cmsFastFloatExtensions(), NULL); + cmsContext Raw = cmsCreateContext(NULL, NULL); + + cmsHPROFILE hsRGB = cmsCreate_sRGBProfile(); + cmsHPROFILE hXYZ = cmsCreateXYZProfile(); + + cmsHTRANSFORM xform_plugin = cmsCreateTransformTHR(Plugin, hsRGB, TYPE_RGB_FLT, hXYZ, TYPE_XYZ_FLT, INTENT_PERCEPTUAL, 0); + cmsHTRANSFORM xform = cmsCreateTransformTHR(Raw, hsRGB, TYPE_RGB_FLT, hXYZ, TYPE_XYZ_FLT, INTENT_PERCEPTUAL, 0); + + int r, g, b; + cmsCIEXYZ XYZ1, XYZ2; + cmsCIELab Lab1, Lab2; + cmsFloat32Number rgb[3]; + cmsFloat32Number XYZ[3]; + double err; + + + for (r = 0; r < 256; r += 10) + for (g = 0; g < 256; g += 10) + for (b = 0; b < 256; b += 10) + { + rgb[0] = (cmsFloat32Number)r / 255.0f; + rgb[1] = (cmsFloat32Number)g / 255.0f; + rgb[2] = (cmsFloat32Number)b / 255.0f; + + cmsDoTransform(xform_plugin, rgb, XYZ, 1); + XYZ1.X = XYZ[0]; XYZ1.Y = XYZ[1]; XYZ1.Z = XYZ[2]; + cmsDoTransform(xform, rgb, XYZ, 1); + XYZ2.X = XYZ[0]; XYZ2.Y = XYZ[1]; XYZ2.Z = XYZ[2]; + + cmsXYZ2Lab(NULL, &Lab1, &XYZ1); + cmsXYZ2Lab(NULL, &Lab2, &XYZ2); + + err = cmsDeltaE(&Lab1, &Lab2); + if (err > 0.5) + { + trace("Error on XYZ encoded (%f, %f, %f) <> (% f, % f, % f)\n", + Lab1.L, Lab1.a, Lab1.b, Lab2.L, Lab2.a, Lab2.b); + } + } + + + cmsDeleteTransform(xform); cmsDeleteTransform(xform_plugin); + cmsCloseProfile(hsRGB); cmsCloseProfile(hXYZ); + cmsDeleteContext(Raw); + cmsDeleteContext(Plugin); + +} + + + +// -------------------------------------------------------------------------------------------------- +// A C C U R A C Y C H E C K S +// -------------------------------------------------------------------------------------------------- + + +// Check result accuracy +static +cmsBool ValidFloat(cmsFloat32Number a, cmsFloat32Number b) +{ + return fabsf(a-b) < EPSILON_FLOAT_TESTS; +} + +// Do an in-depth test by checking all RGB cube of 8 bits, going from profilein to profileout. +// Values with and without optimization are checked (different contexts, one with the plugin and another without) +// Results should be same except for EPSILON_FLOAT_TESTS allowed for accuracy/speed tradeoff. Cache is disabled +static +void TryAllValuesFloat(cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut, cmsInt32Number Intent) +{ + cmsContext Raw = cmsCreateContext(NULL, NULL); + cmsContext Plugin = cmsCreateContext(cmsFastFloatExtensions(), NULL); + + Scanline_rgbFloat* bufferIn; + Scanline_rgbFloat* bufferRawOut; + Scanline_rgbFloat* bufferPluginOut; + int r, g, b; + + int j; + cmsUInt32Number npixels = 256 * 256 * 256; + + cmsHTRANSFORM xformRaw = cmsCreateTransformTHR(Raw, hlcmsProfileIn, TYPE_RGB_FLT, hlcmsProfileOut, TYPE_RGB_FLT, Intent, cmsFLAGS_NOCACHE); + cmsHTRANSFORM xformPlugin = cmsCreateTransformTHR(Plugin, hlcmsProfileIn, TYPE_RGB_FLT, hlcmsProfileOut, TYPE_RGB_FLT, Intent, cmsFLAGS_NOCACHE); + + cmsCloseProfile(hlcmsProfileIn); + cmsCloseProfile(hlcmsProfileOut); + + if (xformRaw == NULL || xformPlugin == NULL) { + + Fail("NULL transforms on check float conversions"); + } + + // Again, no checking on mem alloc because this is just a test + bufferIn = (Scanline_rgbFloat*)malloc(npixels * sizeof(Scanline_rgbFloat)); + bufferRawOut = (Scanline_rgbFloat*)malloc(npixels * sizeof(Scanline_rgbFloat)); + bufferPluginOut = (Scanline_rgbFloat*)malloc(npixels * sizeof(Scanline_rgbFloat)); + + // Same input to both transforms + j = 0; + for (r = 0; r < 256; r++) + for (g = 0; g < 256; g++) + for (b = 0; b < 256; b++) { + + bufferIn[j].r = (cmsFloat32Number)r / 255.0f; + bufferIn[j].g = (cmsFloat32Number)g / 255.0f; + bufferIn[j].b = (cmsFloat32Number)b / 255.0f; + + j++; + } + + // Different transforms, different output buffers + cmsDoTransform(xformRaw, bufferIn, bufferRawOut, npixels); + cmsDoTransform(xformPlugin, bufferIn, bufferPluginOut, npixels); + + // Lets compare results + j = 0; + for (r = 0; r < 256; r++) + for (g = 0; g < 256; g++) + for (b = 0; b < 256; b++) { + + if (!ValidFloat(bufferRawOut[j].r, bufferPluginOut[j].r) || + !ValidFloat(bufferRawOut[j].g, bufferPluginOut[j].g) || + !ValidFloat(bufferRawOut[j].b, bufferPluginOut[j].b)) + Fail("Conversion failed at (%f %f %f) != (%f %f %f)", bufferRawOut[j].r, bufferRawOut[j].g, bufferRawOut[j].b, + bufferPluginOut[j].r, bufferPluginOut[j].g, bufferPluginOut[j].b); + + j++; + } + + free(bufferIn); free(bufferRawOut); + free(bufferPluginOut); + + cmsDeleteTransform(xformRaw); + cmsDeleteTransform(xformPlugin); + + cmsDeleteContext(Plugin); + cmsDeleteContext(Raw); +} + +static +void TryAllValuesFloatAlpha(cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut, cmsInt32Number Intent, cmsBool copyAlpha) +{ + cmsContext Raw = cmsCreateContext(NULL, NULL); + cmsContext Plugin = cmsCreateContext(cmsFastFloatExtensions(), NULL); + + Scanline_rgbaFloat* bufferIn; + Scanline_rgbaFloat* bufferRawOut; + Scanline_rgbaFloat* bufferPluginOut; + int r, g, b; + + int j; + cmsUInt32Number npixels = 256 * 256 * 256; + + cmsUInt32Number flags = cmsFLAGS_NOCACHE | ( copyAlpha? cmsFLAGS_COPY_ALPHA : 0); + + cmsHTRANSFORM xformRaw = cmsCreateTransformTHR(Raw, hlcmsProfileIn, TYPE_RGBA_FLT, hlcmsProfileOut, TYPE_RGBA_FLT, Intent, flags); + cmsHTRANSFORM xformPlugin = cmsCreateTransformTHR(Plugin, hlcmsProfileIn, TYPE_RGBA_FLT, hlcmsProfileOut, TYPE_RGBA_FLT, Intent, flags); + + cmsCloseProfile(hlcmsProfileIn); + cmsCloseProfile(hlcmsProfileOut); + + if (xformRaw == NULL || xformPlugin == NULL) { + + Fail("NULL transforms on check float conversions"); + } + + // Again, no checking on mem alloc because this is just a test + bufferIn = (Scanline_rgbaFloat*)malloc(npixels * sizeof(Scanline_rgbaFloat)); + bufferRawOut = (Scanline_rgbaFloat*)malloc(npixels * sizeof(Scanline_rgbaFloat)); + bufferPluginOut = (Scanline_rgbaFloat*)malloc(npixels * sizeof(Scanline_rgbaFloat)); + + memset(bufferRawOut, 0, npixels * sizeof(Scanline_rgbaFloat)); + memset(bufferPluginOut, 0, npixels * sizeof(Scanline_rgbaFloat)); + + // Same input to both transforms + j = 0; + for (r = 0; r < 256; r++) + for (g = 0; g < 256; g++) + for (b = 0; b < 256; b++) { + + bufferIn[j].r = (cmsFloat32Number)r / 255.0f; + bufferIn[j].g = (cmsFloat32Number)g / 255.0f; + bufferIn[j].b = (cmsFloat32Number)b / 255.0f; + bufferIn[j].a = (cmsFloat32Number) 1.0f; + + j++; + } + + // Different transforms, different output buffers + cmsDoTransform(xformRaw, bufferIn, bufferRawOut, npixels); + cmsDoTransform(xformPlugin, bufferIn, bufferPluginOut, npixels); + + // Lets compare results + j = 0; + for (r = 0; r < 256; r++) + for (g = 0; g < 256; g++) + for (b = 0; b < 256; b++) { + + if (!ValidFloat(bufferRawOut[j].r, bufferPluginOut[j].r) || + !ValidFloat(bufferRawOut[j].g, bufferPluginOut[j].g) || + !ValidFloat(bufferRawOut[j].b, bufferPluginOut[j].b) || + !ValidFloat(bufferRawOut[j].a, bufferPluginOut[j].a)) + Fail("Conversion failed at (%f %f %f %f) != (%f %f %f %f)", bufferRawOut[j].r, bufferRawOut[j].g, bufferRawOut[j].b, bufferRawOut[j].a, + bufferPluginOut[j].r, bufferPluginOut[j].g, bufferPluginOut[j].b, bufferPluginOut[j].a); + + j++; + } + + free(bufferIn); free(bufferRawOut); + free(bufferPluginOut); + + cmsDeleteTransform(xformRaw); + cmsDeleteTransform(xformPlugin); + + cmsDeleteContext(Plugin); + cmsDeleteContext(Raw); +} + + + +// Next test checks results of optimized floating point versus 16 bits. That is, converting the float to 16 bits, operating +// in 16 bits and back to float. Results again should be in range of epsilon +static +cmsBool Valid16Float(cmsUInt16Number a, cmsFloat32Number b) +{ + return fabs(((cmsFloat32Number)a / (cmsFloat32Number) 0xFFFF) - b) < EPSILON_FLOAT_TESTS; +} + +// Do an in-depth test by checking all RGB cube of 8 bits, going from profilein to profileout. 16 bits temporary is used as reference +static +void TryAllValuesFloatVs16(cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut, cmsInt32Number Intent) +{ + Scanline_rgbFloat* bufferIn; + Scanline_rgb16bits* bufferIn16; + + Scanline_rgbFloat* bufferFloatOut; + Scanline_rgb16bits* buffer16Out; + int r, g, b; + + int j; + cmsUInt32Number npixels = 256 * 256 * 256; + + cmsHTRANSFORM xformRaw = cmsCreateTransform(hlcmsProfileIn, TYPE_RGB_16, hlcmsProfileOut, TYPE_RGB_16, Intent, cmsFLAGS_NOCACHE); + cmsHTRANSFORM xformPlugin = cmsCreateTransform(hlcmsProfileIn, TYPE_RGB_FLT, hlcmsProfileOut, TYPE_RGB_FLT, Intent, cmsFLAGS_NOCACHE); + + cmsCloseProfile(hlcmsProfileIn); + cmsCloseProfile(hlcmsProfileOut); + + if (xformRaw == NULL || xformPlugin == NULL) { + + Fail("NULL transforms on check float vs 16 conversions"); + } + + // Again, no checking on mem alloc because this is just a test + bufferIn = (Scanline_rgbFloat*)malloc(npixels * sizeof(Scanline_rgbFloat)); + bufferIn16 = (Scanline_rgb16bits*)malloc(npixels * sizeof(Scanline_rgb16bits)); + bufferFloatOut = (Scanline_rgbFloat*)malloc(npixels * sizeof(Scanline_rgbFloat)); + buffer16Out = (Scanline_rgb16bits*)malloc(npixels * sizeof(Scanline_rgb16bits)); + + + // Fill two equivalent input buffers + j = 0; + for (r = 0; r < 256; r++) + for (g = 0; g < 256; g++) + for (b = 0; b < 256; b++) { + + bufferIn[j].r = (cmsFloat32Number)r / 255.0f; + bufferIn[j].g = (cmsFloat32Number)g / 255.0f; + bufferIn[j].b = (cmsFloat32Number)b / 255.0f; + + bufferIn16[j].r = FROM_8_TO_16(r); + bufferIn16[j].g = FROM_8_TO_16(g); + bufferIn16[j].b = FROM_8_TO_16(b); + + j++; + } + + // Convert + cmsDoTransform(xformRaw, bufferIn16, buffer16Out, npixels); + cmsDoTransform(xformPlugin, bufferIn, bufferFloatOut, npixels); + + + j = 0; + for (r = 0; r < 256; r++) + for (g = 0; g < 256; g++) + for (b = 0; b < 256; b++) { + + // Check for same values + if (!Valid16Float(buffer16Out[j].r, bufferFloatOut[j].r) || + !Valid16Float(buffer16Out[j].g, bufferFloatOut[j].g) || + !Valid16Float(buffer16Out[j].b, bufferFloatOut[j].b)) + Fail("Conversion failed at (%f %f %f) != (%f %f %f)", buffer16Out[j].r / 65535.0, buffer16Out[j].g / 65535.0, buffer16Out[j].b / 65535.0, + bufferFloatOut[j].r, bufferFloatOut[j].g, bufferFloatOut[j].b); + + j++; + } + + free(bufferIn16); free(buffer16Out); + free(bufferIn); free(bufferFloatOut); + cmsDeleteTransform(xformRaw); + cmsDeleteTransform(xformPlugin); +} + + +// Check change format feature +static +void CheckChangeFormat(void) +{ + cmsHPROFILE hsRGB, hLab; + cmsHTRANSFORM xform; + cmsUInt8Number rgb8[3] = { 10, 120, 40 }; + cmsUInt16Number rgb16[3] = { 10* 257, 120*257, 40*257 }; + cmsUInt16Number lab16_1[3], lab16_2[3]; + + trace("Checking change format feature..."); + + hsRGB = cmsCreate_sRGBProfile(); + hLab = cmsCreateLab4Profile(NULL); + + xform = cmsCreateTransform(hsRGB, TYPE_RGB_16, hLab, TYPE_Lab_16, INTENT_PERCEPTUAL, 0); + + cmsCloseProfile(hsRGB); + cmsCloseProfile(hLab); + + cmsDoTransform(xform, rgb16, lab16_1, 1); + + cmsChangeBuffersFormat(xform, TYPE_RGB_8, TYPE_Lab_16); + + cmsDoTransform(xform, rgb8, lab16_2, 1); + cmsDeleteTransform(xform); + + if (memcmp(lab16_1, lab16_2, sizeof(lab16_1)) != 0) + Fail("Change format failed!"); + + trace("Ok\n"); + +} + +static +cmsBool ValidInt(cmsUInt16Number a, cmsUInt16Number b) +{ + return abs(a - b) <= 32; +} + +static +void CheckLab2Roundtrip(void) +{ + cmsHPROFILE hsRGB, hLab; + cmsHTRANSFORM xform, xform2; + cmsInt8Number* lab; + cmsInt32Number Mb, j; + cmsInt32Number r, g, b; + Scanline_rgb8bits* In; + Scanline_rgb8bits* Out; + + trace("Checking lab2 roundtrip..."); + + hsRGB = cmsCreate_sRGBProfile(); + hLab = cmsCreateLab2Profile(NULL); + + + xform = cmsCreateTransform(hsRGB, TYPE_RGB_8, hLab, TYPE_Lab_8, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_NOOPTIMIZE|cmsFLAGS_BLACKPOINTCOMPENSATION); + xform2 = cmsCreateTransform(hLab, TYPE_Lab_8, hsRGB, TYPE_RGB_8, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_NOOPTIMIZE | cmsFLAGS_BLACKPOINTCOMPENSATION); + + cmsCloseProfile(hsRGB); + cmsCloseProfile(hLab); + + + Mb = 256 * 256 * 256 * sizeof(Scanline_rgb8bits); + In = (Scanline_rgb8bits*)malloc(Mb); + Out = (Scanline_rgb8bits*)malloc(Mb); + lab = (cmsInt8Number*)malloc(256 * 256 * 256 * 3 * sizeof(cmsInt8Number)); + + j = 0; + for (r = 0; r < 256; r++) + for (g = 0; g < 256; g++) + for (b = 0; b < 256; b++) + { + + In[j].r = (cmsUInt8Number)r; + In[j].g = (cmsUInt8Number)g; + In[j].b = (cmsUInt8Number)b; + j++; + } + + + cmsDoTransform(xform, In, lab, 256 * 256 * 256); + cmsDoTransform(xform2, lab, Out, 256 * 256 * 256); + + cmsDeleteTransform(xform); + cmsDeleteTransform(xform2); + + + j = 0; + for (r = 0; r < 256; r++) + for (g = 0; g < 256; g++) + for (b = 0; b < 256; b++) { + + // Check for same values + if (!ValidInt(In[j].r, Out[j].r) || + !ValidInt(In[j].g, Out[j].g) || + !ValidInt(In[j].b, Out[j].b)) + Fail("Conversion failed at (%d %d %d) != (%d %d %d)", In[j].r, In[j].g, In[j].b, + Out[j].r, Out[j].g, Out[j].b); + + j++; + } + + + free(In); + free(Out); + free(lab); + trace("Ok\n"); + +} + +static +void CheckAlphaDetect(void) +{ + cmsHPROFILE hsRGB; + cmsHTRANSFORM xform; + + cmsSetLogErrorHandler(NULL); + + hsRGB = cmsCreate_sRGBProfile(); + + xform = cmsCreateTransform(hsRGB, TYPE_RGB_FLT, hsRGB, TYPE_RGBA_FLT, INTENT_PERCEPTUAL, cmsFLAGS_COPY_ALPHA); + cmsCloseProfile(hsRGB); + + if (xform != NULL) + Fail("Copy alpha with mismatched channels should not succeed"); + + cmsSetLogErrorHandler(FatalErrorQuit); +} + +// Convert some known values +static +void CheckConversionFloat(void) +{ + trace("Check alpha detection."); + CheckAlphaDetect(); + trace("Ok\n"); + + trace("Crash test."); + TryAllValuesFloatAlpha(cmsOpenProfileFromFile(PROFILES_DIR "test5.icc", "r"), cmsOpenProfileFromFile(PROFILES_DIR "test0.icc", "r"), INTENT_PERCEPTUAL, FALSE); + + trace(".."); + TryAllValuesFloatAlpha(cmsOpenProfileFromFile(PROFILES_DIR "test5.icc", "r"), cmsOpenProfileFromFile(PROFILES_DIR "test0.icc", "r"), INTENT_PERCEPTUAL, TRUE); + trace("Ok\n"); + + trace("Crash (II) test."); + TryAllValuesFloatAlpha(cmsOpenProfileFromFile(PROFILES_DIR "test0.icc", "r"), cmsOpenProfileFromFile(PROFILES_DIR "test0.icc", "r"), INTENT_PERCEPTUAL, FALSE); + trace(".."); + TryAllValuesFloatAlpha(cmsOpenProfileFromFile(PROFILES_DIR "test0.icc", "r"), cmsOpenProfileFromFile(PROFILES_DIR "test0.icc", "r"), INTENT_PERCEPTUAL, TRUE); + trace("Ok\n"); + + trace("Crash (III) test."); + CheckUncommonValues(cmsOpenProfileFromFile(PROFILES_DIR "test5.icc", "r"), cmsOpenProfileFromFile(PROFILES_DIR "test3.icc", "r"), INTENT_PERCEPTUAL); + trace(".."); + CheckUncommonValues(cmsOpenProfileFromFile(PROFILES_DIR "test5.icc", "r"), cmsOpenProfileFromFile(PROFILES_DIR "test0.icc", "r"), INTENT_PERCEPTUAL); + trace("Ok\n"); + + trace("Checking conversion to Lab..."); + CheckToEncodedLab(); + CheckToFloatLab(); + CheckFloatToFloatLab(); + trace("Ok\n"); + + trace("Checking conversion to XYZ..."); + CheckToFloatXYZ(); + CheckFloatToFloatXYZ(); + trace("Ok\n"); + + // Matrix-shaper should be accurate + trace("Checking accuracy on Matrix-shaper..."); + TryAllValuesFloat(cmsOpenProfileFromFile(PROFILES_DIR "test5.icc", "r"), cmsOpenProfileFromFile(PROFILES_DIR "test0.icc", "r"), INTENT_PERCEPTUAL); + trace("Ok\n"); + + // CLUT should be as 16 bits or better + trace("Checking accuracy of CLUT..."); + TryAllValuesFloatVs16(cmsOpenProfileFromFile(PROFILES_DIR "test5.icc", "r"), cmsOpenProfileFromFile(PROFILES_DIR "test3.icc", "r"), INTENT_PERCEPTUAL); + trace("Ok\n"); + + // Same profile should give same values (we test both methods) + trace("Checking accuracy on same profile ..."); + TryAllValuesFloatVs16(cmsOpenProfileFromFile(PROFILES_DIR "test0.icc", "r"), cmsOpenProfileFromFile(PROFILES_DIR "test0.icc", "r"), INTENT_PERCEPTUAL); + TryAllValuesFloat(cmsOpenProfileFromFile(PROFILES_DIR "test0.icc", "r"), cmsOpenProfileFromFile(PROFILES_DIR "test0.icc", "r"), INTENT_PERCEPTUAL); + trace("Ok\n"); + + +} + + +static +cmsBool ValidFloat2(cmsFloat32Number a, cmsFloat32Number b) +{ + return fabsf(a - b) < 0.007; +} + + +static +cmsFloat32Number distance(cmsFloat32Number rgb1[], cmsFloat32Number rgb2[]) +{ + cmsFloat32Number dr = rgb2[0] - rgb1[0]; + cmsFloat32Number dg = rgb2[1] - rgb1[1]; + cmsFloat32Number db = rgb2[2] - rgb1[2]; + + return dr * dr + dg * dg + db * db; +} + +static +void CheckLab2RGB(void) +{ + cmsHPROFILE hLab = cmsCreateLab4Profile(NULL); + cmsHPROFILE hRGB = cmsOpenProfileFromFile(PROFILES_DIR "test3.icc", "r"); + cmsContext noPlugin = cmsCreateContext(0, 0); + + cmsHTRANSFORM hXformNoPlugin = cmsCreateTransformTHR(noPlugin, hLab, TYPE_Lab_FLT, hRGB, TYPE_RGB_FLT, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_NOCACHE); + cmsHTRANSFORM hXformPlugin = cmsCreateTransformTHR(0, hLab, TYPE_Lab_FLT, hRGB, TYPE_RGB_FLT, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_NOCACHE); + + cmsFloat32Number Lab[3], RGB[3], RGB2[3]; + + cmsFloat32Number maxInside = 0, maxOutside = 0, L, a, b; + + trace("Checking Lab -> RGB..."); + cmsCloseProfile(hLab); + cmsCloseProfile(hRGB); + + for (L = 4; L <= 100; L++) + { + for (a = -30; a < +30; a++) + for (b = -30; b < +30; b++) + { + cmsFloat32Number d; + + Lab[0] = L; Lab[1] = a; Lab[2] = b; + cmsDoTransform(hXformNoPlugin, Lab, RGB, 1); + cmsDoTransform(hXformPlugin, Lab, RGB2, 1); + + d = distance(RGB, RGB2); + if (d > maxInside) + maxInside = d; + } + } + + + for (L = 1; L <= 100; L += 5) + { + for (a = -100; a < +100; a += 5) + for (b = -100; b < +100; b += 5) + { + cmsFloat32Number d; + + Lab[0] = L; Lab[1] = a; Lab[2] = b; + cmsDoTransform(hXformNoPlugin, Lab, RGB, 1); + cmsDoTransform(hXformPlugin, Lab, RGB2, 1); + + d = distance(RGB, RGB2); + if (d > maxOutside) + maxOutside = d; + } + + } + + + trace("Max distance: Inside gamut %f, Outside gamut %f\n", sqrtf(maxInside), sqrtf(maxOutside)); + + cmsDeleteTransform(hXformNoPlugin); + cmsDeleteTransform(hXformPlugin); + + cmsDeleteContext(noPlugin); +} + + + +static +void CheckSoftProofing(void) +{ + cmsHPROFILE hRGB1 = cmsOpenProfileFromFile(PROFILES_DIR "test5.icc", "r"); + cmsHPROFILE hRGB2 = cmsOpenProfileFromFile(PROFILES_DIR "test3.icc", "r"); + cmsContext noPlugin = cmsCreateContext(0, 0); + + cmsHTRANSFORM hXformNoPlugin = cmsCreateProofingTransformTHR(noPlugin, hRGB1, TYPE_RGB_FLT, hRGB1, TYPE_RGB_FLT, hRGB2, INTENT_RELATIVE_COLORIMETRIC, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_GAMUTCHECK | cmsFLAGS_SOFTPROOFING); + cmsHTRANSFORM hXformPlugin = cmsCreateProofingTransformTHR(0, hRGB1, TYPE_RGB_FLT, hRGB1, TYPE_RGB_FLT, hRGB2, INTENT_RELATIVE_COLORIMETRIC, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_GAMUTCHECK | cmsFLAGS_SOFTPROOFING); + + cmsUInt32Number Mb, j, r, g, b; + + Scanline_rgbFloat* In; + Scanline_rgbFloat* Out1, *Out2; + + + trace("Checking soft proofing and gamut check ..."); + + cmsCloseProfile(hRGB1); + cmsCloseProfile(hRGB2); + + Mb = 256 * 256 * 256 * sizeof(Scanline_rgbFloat); + In = (Scanline_rgbFloat*)malloc(Mb); + Out1 = (Scanline_rgbFloat*)malloc(Mb); + Out2 = (Scanline_rgbFloat*)malloc(Mb); + + + j = 0; + for (r = 0; r < 256; r++) + for (g = 0; g < 256; g++) + for (b = 0; b < 256; b++) + { + + In[j].r = (cmsFloat32Number)r / 255.0f; + In[j].g = (cmsFloat32Number)g / 255.0f; + In[j].b = (cmsFloat32Number)b / 255.0f; + j++; + } + + + cmsDoTransform(hXformNoPlugin, In, Out1, 256 * 256 * 256); + cmsDoTransform(hXformPlugin, In, Out2, 256 * 256 * 256); + + j = 0; + for (r = 0; r < 256; r++) + for (g = 0; g < 256; g++) + for (b = 0; b < 256; b++) { + + // Check for same values + if (!ValidFloat(Out1[j].r, Out2[j].r) || + !ValidFloat(Out1[j].g, Out2[j].g) || + !ValidFloat(Out1[j].b, Out2[j].b)) + Fail("Conversion failed at (%f %f %f) != (%f %f %f)", Out1[j].r, Out1[j].g, Out1[j].b, + Out2[j].r, Out2[j].g, Out2[j].b); + + j++; + } + + free(In); free(Out1); free(Out2); + cmsDeleteTransform(hXformNoPlugin); + cmsDeleteTransform(hXformPlugin); + + cmsDeleteContext(noPlugin); + + trace("Ok\n"); +} + +static +void CheckPremultiplied(void) +{ + uint8_t BGRA8[4] = { 255, 192, 160, 128 }; + uint8_t bgrA8_1[4], bgrA8_2[4]; + + cmsHPROFILE srgb1 = cmsCreate_sRGBProfile(); + cmsHPROFILE srgb2 = cmsCreate_sRGBProfile(); + + cmsContext noPlugin = cmsCreateContext(0, 0); + + cmsHTRANSFORM xform1 = cmsCreateTransformTHR(noPlugin, + srgb1, TYPE_BGRA_8, + srgb2, TYPE_BGRA_8_PREMUL, + INTENT_PERCEPTUAL, cmsFLAGS_COPY_ALPHA); + + cmsHTRANSFORM xform2 = cmsCreateTransformTHR(0, + srgb1, TYPE_BGRA_8, + srgb2, TYPE_BGRA_8_PREMUL, + INTENT_PERCEPTUAL, cmsFLAGS_COPY_ALPHA); + + int i; + + cmsCloseProfile(srgb1); + cmsCloseProfile(srgb2); + + cmsDoTransform(xform1, BGRA8, bgrA8_1, 1); + cmsDoTransform(xform2, BGRA8, bgrA8_2, 1); + + cmsDeleteTransform(xform1); + cmsDeleteTransform(xform2); + + for (i = 0; i < 4; i++) + { + if (bgrA8_1[i] != bgrA8_2[i]) + Fail("Premultiplied failed at (%d %d %d) != (%d %d %d)", + bgrA8_1[0], bgrA8_1[1], bgrA8_1[2], + bgrA8_2[0], bgrA8_2[1], bgrA8_2[2]); + } +} + + + +// -------------------------------------------------------------------------------------------------- +// P E R F O R M A N C E C H E C K S +// -------------------------------------------------------------------------------------------------- + + +static +cmsFloat64Number MPixSec(cmsFloat64Number diff) +{ + cmsFloat64Number seconds = (cmsFloat64Number)diff / (cmsFloat64Number)CLOCKS_PER_SEC; + return (256.0 * 256.0 * 256.0) / (1024.0*1024.0*seconds); +} + +typedef cmsFloat64Number(*perf_fn)(cmsContext ct, cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut); + + +static +void PerformanceHeader(void) +{ + trace(" MPixel/sec. MByte/sec.\n"); +} + + +static +cmsHPROFILE loadProfile(const char* name) +{ + if (*name == '*') + { + if (strcmp(name, "*lab") == 0) + { + return cmsCreateLab4Profile(NULL); + } + else + if (strcmp(name, "*xyz") == 0) + { + return cmsCreateXYZProfile(); + } + else + if (strcmp(name, "*curves") == 0) + { + return CreateCurves(); + } + else + Fail("Unknown builtin '%s'", name); + + } + + return cmsOpenProfileFromFile(name, "r"); +} + + +static +cmsFloat64Number Performance(const char* Title, perf_fn fn, cmsContext ct, const char* inICC, const char* outICC, size_t sz, cmsFloat64Number prev) +{ + cmsHPROFILE hlcmsProfileIn = loadProfile(inICC); + cmsHPROFILE hlcmsProfileOut = loadProfile(outICC); + + cmsFloat64Number n = fn(ct, hlcmsProfileIn, hlcmsProfileOut); + + trace("%-30s: ", Title); fflush(stdout); + trace("%-12.2f %-12.2f", n, n * sz); + + if (prev > 0.0) { + + cmsFloat64Number imp = n / prev; + if (imp > 1) + trace(" (x %-2.1f)", imp); + } + + trace("\n"); fflush(stdout); + return n; +} + + +static +void ComparativeCt(cmsContext ct1, cmsContext ct2, const char* Title, perf_fn fn1, perf_fn fn2, const char* inICC, const char* outICC) +{ + cmsHPROFILE hlcmsProfileIn; + cmsHPROFILE hlcmsProfileOut; + + if (inICC == NULL) + hlcmsProfileIn = CreateCurves(); + else + hlcmsProfileIn = cmsOpenProfileFromFile(inICC, "r"); + + if (outICC == NULL) + hlcmsProfileOut = CreateCurves(); + else + hlcmsProfileOut = cmsOpenProfileFromFile(outICC, "r"); + + + cmsFloat64Number n1 = fn1(ct1, hlcmsProfileIn, hlcmsProfileOut); + + if (inICC == NULL) + hlcmsProfileIn = CreateCurves(); + else + hlcmsProfileIn = cmsOpenProfileFromFile(inICC, "r"); + + if (outICC == NULL) + hlcmsProfileOut = CreateCurves(); + else + hlcmsProfileOut = cmsOpenProfileFromFile(outICC, "r"); + + cmsFloat64Number n2 = fn2(ct2, hlcmsProfileIn, hlcmsProfileOut); + + + trace("%-30s: ", Title); fflush(stdout); + trace("%-12.2f %-12.2f\n", n1, n2); +} + +static +void Comparative(const char* Title, perf_fn fn1, perf_fn fn2, const char* inICC, const char* outICC) +{ + ComparativeCt(0, 0, Title, fn1, fn2, inICC, outICC); +} + +// The worst case is used, no cache and all rgb combinations +static +cmsFloat64Number SpeedTest8bitsRGB(cmsContext ct, cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut) +{ + cmsInt32Number r, g, b, j; + clock_t atime; + cmsFloat64Number diff; + cmsHTRANSFORM hlcmsxform; + Scanline_rgb8bits *In; + cmsUInt32Number Mb; + + if (hlcmsProfileIn == NULL || hlcmsProfileOut == NULL) + Fail("Unable to open profiles"); + + hlcmsxform = cmsCreateTransformTHR(ct, hlcmsProfileIn, TYPE_RGB_8, hlcmsProfileOut, TYPE_RGB_8, INTENT_PERCEPTUAL, cmsFLAGS_NOCACHE); + cmsCloseProfile(hlcmsProfileIn); + cmsCloseProfile(hlcmsProfileOut); + + Mb = 256 * 256 * 256 * sizeof(Scanline_rgb8bits); + In = (Scanline_rgb8bits*)malloc(Mb); + + j = 0; + for (r = 0; r < 256; r++) + for (g = 0; g < 256; g++) + for (b = 0; b < 256; b++) { + + In[j].r = (cmsUInt8Number)r; + In[j].g = (cmsUInt8Number)g; + In[j].b = (cmsUInt8Number)b; + + j++; + } + + atime = clock(); + + cmsDoTransform(hlcmsxform, In, In, 256 * 256 * 256); + + diff = clock() - atime; + free(In); + + cmsDeleteTransform(hlcmsxform); + + return MPixSec(diff); +} + +static +cmsFloat64Number SpeedTest8bitsRGBA(cmsContext ct, cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut) +{ + cmsInt32Number r, g, b, j; + clock_t atime; + cmsFloat64Number diff; + cmsHTRANSFORM hlcmsxform; + Scanline_rgba8bits *In; + cmsUInt32Number Mb; + + if (hlcmsProfileIn == NULL || hlcmsProfileOut == NULL) + Fail("Unable to open profiles"); + + hlcmsxform = cmsCreateTransformTHR(ct, hlcmsProfileIn, TYPE_RGBA_8, hlcmsProfileOut, TYPE_RGBA_8, INTENT_PERCEPTUAL, cmsFLAGS_NOCACHE); + cmsCloseProfile(hlcmsProfileIn); + cmsCloseProfile(hlcmsProfileOut); + + Mb = 256 * 256 * 256 * sizeof(Scanline_rgba8bits); + In = (Scanline_rgba8bits*)malloc(Mb); + + j = 0; + for (r = 0; r < 256; r++) + for (g = 0; g < 256; g++) + for (b = 0; b < 256; b++) { + + In[j].r = (cmsUInt8Number)r; + In[j].g = (cmsUInt8Number)g; + In[j].b = (cmsUInt8Number)b; + In[j].a = 0; + + j++; + } + + atime = clock(); + + cmsDoTransform(hlcmsxform, In, In, 256 * 256 * 256); + + diff = clock() - atime; + free(In); + + cmsDeleteTransform(hlcmsxform); + return MPixSec(diff); + +} + + +// The worst case is used, no cache and all rgb combinations +static +cmsFloat64Number SpeedTest15bitsRGB(cmsContext ct, cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut) +{ + cmsInt32Number r, g, b, j; + clock_t atime; + cmsFloat64Number diff; + cmsHTRANSFORM hlcmsxform; + Scanline_rgb15bits *In; + cmsUInt32Number Mb; + + if (hlcmsProfileIn == NULL || hlcmsProfileOut == NULL) + Fail("Unable to open profiles"); + + hlcmsxform = cmsCreateTransformTHR(ct, hlcmsProfileIn, TYPE_RGB_15, hlcmsProfileOut, TYPE_RGB_15, INTENT_PERCEPTUAL, cmsFLAGS_NOCACHE); + cmsCloseProfile(hlcmsProfileIn); + cmsCloseProfile(hlcmsProfileOut); + + Mb = 256 * 256 * 256 * sizeof(Scanline_rgb15bits); + In = (Scanline_rgb15bits*)malloc(Mb); + + j = 0; + for (r = 0; r < 256; r++) + for (g = 0; g < 256; g++) + for (b = 0; b < 256; b++) { + + In[j].r = (cmsUInt16Number)r; + In[j].g = (cmsUInt16Number)g; + In[j].b = (cmsUInt16Number)b; + + j++; + } + + atime = clock(); + + cmsDoTransform(hlcmsxform, In, In, 256 * 256 * 256); + + diff = clock() - atime; + free(In); + + cmsDeleteTransform(hlcmsxform); + + return MPixSec(diff); +} + +static +cmsFloat64Number SpeedTest15bitsRGBA(cmsContext ct, cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut) +{ + cmsInt32Number r, g, b, j; + clock_t atime; + cmsFloat64Number diff; + cmsHTRANSFORM hlcmsxform; + Scanline_rgba15bits *In; + cmsUInt32Number Mb; + + if (hlcmsProfileIn == NULL || hlcmsProfileOut == NULL) + Fail("Unable to open profiles"); + + hlcmsxform = cmsCreateTransformTHR(ct, hlcmsProfileIn, TYPE_RGBA_15, hlcmsProfileOut, TYPE_RGBA_15, INTENT_PERCEPTUAL, cmsFLAGS_NOCACHE); + cmsCloseProfile(hlcmsProfileIn); + cmsCloseProfile(hlcmsProfileOut); + + Mb = 256 * 256 * 256 * sizeof(Scanline_rgba15bits); + In = (Scanline_rgba15bits*)malloc(Mb); + + j = 0; + for (r = 0; r < 256; r++) + for (g = 0; g < 256; g++) + for (b = 0; b < 256; b++) { + + In[j].r = (cmsUInt16Number)r; + In[j].g = (cmsUInt16Number)g; + In[j].b = (cmsUInt16Number)b; + In[j].a = 0; + + j++; + } + + atime = clock(); + + cmsDoTransform(hlcmsxform, In, In, 256 * 256 * 256); + + diff = clock() - atime; + free(In); + + cmsDeleteTransform(hlcmsxform); + return MPixSec(diff); + +} + +static +cmsFloat64Number SpeedTest15bitsCMYK(cmsContext ct, cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut) +{ + + cmsInt32Number r, g, b, j; + clock_t atime; + cmsFloat64Number diff; + cmsHTRANSFORM hlcmsxform; + Scanline_cmyk15bits *In; + cmsUInt32Number Mb; + + if (hlcmsProfileIn == NULL || hlcmsProfileOut == NULL) + Fail("Unable to open profiles"); + + hlcmsxform = cmsCreateTransformTHR(ct, hlcmsProfileIn, TYPE_CMYK_15, hlcmsProfileOut, TYPE_CMYK_15, INTENT_PERCEPTUAL, cmsFLAGS_NOCACHE); + cmsCloseProfile(hlcmsProfileIn); + cmsCloseProfile(hlcmsProfileOut); + + Mb = 256 * 256 * 256 * sizeof(Scanline_cmyk15bits); + In = (Scanline_cmyk15bits*)malloc(Mb); + + j = 0; + for (r = 0; r < 256; r++) + for (g = 0; g < 256; g++) + for (b = 0; b < 256; b++) { + + In[j].r = (cmsUInt16Number)r; + In[j].g = (cmsUInt16Number)g; + In[j].b = (cmsUInt16Number)b; + In[j].a = (cmsUInt16Number)0; + + j++; + } + + atime = clock(); + + cmsDoTransform(hlcmsxform, In, In, 256 * 256 * 256); + + diff = clock() - atime; + free(In); + + cmsDeleteTransform(hlcmsxform); + return MPixSec(diff); +} + +// The worst case is used, no cache and all rgb combinations +static +cmsFloat64Number SpeedTest16bitsRGB(cmsContext ct, cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut) +{ + cmsInt32Number r, g, b, j; + clock_t atime; + cmsFloat64Number diff; + cmsHTRANSFORM hlcmsxform; + Scanline_rgb16bits *In; + cmsUInt32Number Mb; + + if (hlcmsProfileIn == NULL || hlcmsProfileOut == NULL) + Fail("Unable to open profiles"); + + hlcmsxform = cmsCreateTransformTHR(ct, hlcmsProfileIn, TYPE_RGB_16, hlcmsProfileOut, TYPE_RGB_16, INTENT_PERCEPTUAL, cmsFLAGS_NOCACHE); + cmsCloseProfile(hlcmsProfileIn); + cmsCloseProfile(hlcmsProfileOut); + + Mb = 256 * 256 * 256 * sizeof(Scanline_rgb16bits); + In = (Scanline_rgb16bits*)malloc(Mb); + + j = 0; + for (r = 0; r < 256; r++) + for (g = 0; g < 256; g++) + for (b = 0; b < 256; b++) { + + In[j].r = (cmsUInt16Number)FROM_8_TO_16(r); + In[j].g = (cmsUInt16Number)FROM_8_TO_16(g); + In[j].b = (cmsUInt16Number)FROM_8_TO_16(b); + + j++; + } + + atime = clock(); + + cmsDoTransform(hlcmsxform, In, In, 256 * 256 * 256); + + diff = clock() - atime; + free(In); + + cmsDeleteTransform(hlcmsxform); + + return MPixSec(diff); +} + +static +cmsFloat64Number SpeedTest16bitsCMYK(cmsContext ct, cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut) +{ + + cmsInt32Number r, g, b, j; + clock_t atime; + cmsFloat64Number diff; + cmsHTRANSFORM hlcmsxform; + Scanline_cmyk16bits* In; + cmsUInt32Number Mb; + + if (hlcmsProfileIn == NULL || hlcmsProfileOut == NULL) + Fail("Unable to open profiles"); + + hlcmsxform = cmsCreateTransformTHR(ct, hlcmsProfileIn, TYPE_CMYK_16, hlcmsProfileOut, TYPE_CMYK_16, INTENT_PERCEPTUAL, cmsFLAGS_NOCACHE); + cmsCloseProfile(hlcmsProfileIn); + cmsCloseProfile(hlcmsProfileOut); + + Mb = 256 * 256 * 256 * sizeof(Scanline_cmyk16bits); + In = (Scanline_cmyk16bits*)malloc(Mb); + + j = 0; + for (r = 0; r < 256; r++) + for (g = 0; g < 256; g++) + for (b = 0; b < 256; b++) { + + In[j].c = (cmsUInt16Number)r; + In[j].m = (cmsUInt16Number)g; + In[j].y = (cmsUInt16Number)b; + In[j].k = (cmsUInt16Number)r; + + j++; + } + + atime = clock(); + + cmsDoTransform(hlcmsxform, In, In, 256 * 256 * 256); + + diff = clock() - atime; + free(In); + + cmsDeleteTransform(hlcmsxform); + return MPixSec(diff); +} + + + +static +void SpeedTest8(void) +{ + cmsContext noPlugin = cmsCreateContext(0, 0); + + cmsFloat64Number t[10]; + + trace("\n\n"); + trace("P E R F O R M A N C E T E S T S 8 B I T S (D E F A U L T)\n"); + trace("==============================================================\n\n"); + fflush(stdout); + + PerformanceHeader(); + t[0] = Performance("8 bits on CLUT profiles ", SpeedTest8bitsRGB, noPlugin, PROFILES_DIR "test5.icc", PROFILES_DIR "test3.icc", sizeof(Scanline_rgb8bits), 0); + t[1] = Performance("8 bits on Matrix-Shaper ", SpeedTest8bitsRGB, noPlugin, PROFILES_DIR "test5.icc", PROFILES_DIR "test0.icc", sizeof(Scanline_rgb8bits), 0); + t[2] = Performance("8 bits on same MatrixSh ", SpeedTest8bitsRGB, noPlugin, PROFILES_DIR "test0.icc", PROFILES_DIR "test0.icc", sizeof(Scanline_rgb8bits), 0); + t[3] = Performance("8 bits on curves ", SpeedTest8bitsRGB, noPlugin, "*curves", "*curves", sizeof(Scanline_rgb8bits), 0); + + // Note that context 0 has the plug-in installed + + trace("\n\n"); + trace("P E R F O R M A N C E T E S T S 8 B I T S (P L U G I N)\n"); + trace("===========================================================\n\n"); + fflush(stdout); + + PerformanceHeader(); + Performance("8 bits on CLUT profiles ", SpeedTest8bitsRGB, 0, PROFILES_DIR "test5.icc", PROFILES_DIR "test3.icc", sizeof(Scanline_rgb8bits), t[0]); + Performance("8 bits on Matrix-Shaper ", SpeedTest8bitsRGB, 0, PROFILES_DIR "test5.icc", PROFILES_DIR "test0.icc", sizeof(Scanline_rgb8bits), t[1]); + Performance("8 bits on same MatrixSh ", SpeedTest8bitsRGB, 0, PROFILES_DIR "test0.icc", PROFILES_DIR "test0.icc", sizeof(Scanline_rgb8bits), t[2]); + Performance("8 bits on curves ", SpeedTest8bitsRGB, 0, "*curves", "*curves", sizeof(Scanline_rgb8bits), t[3]); + + cmsDeleteContext(noPlugin); +} + +static +void SpeedTest15(void) +{ + trace("\n\nP E R F O R M A N C E T E S T S 1 5 B I T S (P L U G I N)\n"); + trace( "===============================================================\n\n"); + + PerformanceHeader(); + Performance("15 bits on CLUT profiles ", SpeedTest15bitsRGB, 0, PROFILES_DIR "test5.icc", PROFILES_DIR "test3.icc", sizeof(Scanline_rgb15bits), 0); + Performance("15 bits on Matrix-Shaper profiles", SpeedTest15bitsRGB, 0, PROFILES_DIR "test5.icc", PROFILES_DIR "test0.icc", sizeof(Scanline_rgb15bits), 0); + Performance("15 bits on same Matrix-Shaper ", SpeedTest15bitsRGB, 0, PROFILES_DIR "test0.icc", PROFILES_DIR "test0.icc", sizeof(Scanline_rgb15bits), 0); + Performance("15 bits on curves ", SpeedTest15bitsRGB, 0, "*curves", "*curves", sizeof(Scanline_rgb15bits), 0); + Performance("15 bits on CMYK CLUT profiles ", SpeedTest15bitsCMYK, 0, PROFILES_DIR "test1.icc", PROFILES_DIR "test2.icc", sizeof(Scanline_rgba15bits), 0); +} + +static +void SpeedTest16(void) +{ + cmsContext noPlugin = cmsCreateContext(0, 0); + + + trace("\n\n"); + trace("P E R F O R M A N C E T E S T S 1 6 B I T S (D E F A U L T)\n"); + trace("=================================================================\n\n"); + + PerformanceHeader(); + Performance("16 bits on CLUT profiles ", SpeedTest16bitsRGB, noPlugin, PROFILES_DIR "test5.icc", PROFILES_DIR "test3.icc", sizeof(Scanline_rgb16bits), 0); + Performance("16 bits on Matrix-Shaper profiles", SpeedTest16bitsRGB, noPlugin, PROFILES_DIR "test5.icc", PROFILES_DIR "test0.icc", sizeof(Scanline_rgb16bits), 0); + Performance("16 bits on same Matrix-Shaper ", SpeedTest16bitsRGB, noPlugin, PROFILES_DIR "test0.icc", PROFILES_DIR "test0.icc", sizeof(Scanline_rgb16bits), 0); + Performance("16 bits on curves ", SpeedTest16bitsRGB, noPlugin, "*curves", "*curves", sizeof(Scanline_rgb16bits), 0); + Performance("16 bits on CMYK CLUT profiles ", SpeedTest16bitsCMYK, noPlugin, PROFILES_DIR "test1.icc", PROFILES_DIR "test2.icc", sizeof(Scanline_cmyk16bits), 0); + + trace("\n\n"); + trace("P E R F O R M A N C E T E S T S 1 6 B I T S (P L U G I N)\n"); + trace("===============================================================\n\n"); + + PerformanceHeader(); + Performance("16 bits on CLUT profiles ", SpeedTest16bitsRGB, 0, PROFILES_DIR "test5.icc", PROFILES_DIR "test3.icc", sizeof(Scanline_rgb16bits), 0); + Performance("16 bits on Matrix-Shaper profiles", SpeedTest16bitsRGB, 0, PROFILES_DIR "test5.icc", PROFILES_DIR "test0.icc", sizeof(Scanline_rgb16bits), 0); + Performance("16 bits on same Matrix-Shaper ", SpeedTest16bitsRGB, 0, PROFILES_DIR "test0.icc", PROFILES_DIR "test0.icc", sizeof(Scanline_rgb16bits), 0); + Performance("16 bits on curves ", SpeedTest16bitsRGB, 0, "*curves", "*curves", sizeof(Scanline_rgb16bits), 0); + Performance("16 bits on CMYK CLUT profiles ", SpeedTest16bitsCMYK, 0, PROFILES_DIR "test1.icc", PROFILES_DIR "test2.icc", sizeof(Scanline_cmyk16bits), 0); + + cmsDeleteContext(noPlugin); +} + +// The worst case is used, no cache and all rgb combinations +static +cmsFloat64Number SpeedTestFloatRGB(cmsContext ct, cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut) +{ + cmsInt32Number j; + clock_t atime; + cmsFloat64Number diff; + cmsHTRANSFORM hlcmsxform; + void *In; + cmsUInt32Number size, Mb; + cmsUInt32Number inFormatter=0, outFormatter=0; + cmsFloat64Number seconds; + + if (hlcmsProfileIn == NULL || hlcmsProfileOut == NULL) + Fail("Unable to open profiles"); + + + switch (cmsGetColorSpace(hlcmsProfileIn)) + { + case cmsSigRgbData: inFormatter = TYPE_RGB_FLT; break; + case cmsSigLabData: inFormatter = TYPE_Lab_FLT; break; + + default: + Fail("Invalid colorspace"); + } + + switch (cmsGetColorSpace(hlcmsProfileOut)) + { + case cmsSigRgbData: outFormatter = TYPE_RGB_FLT; break; + case cmsSigLabData: outFormatter = TYPE_Lab_FLT; break; + case cmsSigXYZData: outFormatter = TYPE_XYZ_FLT; break; + + default: + Fail("Invalid colorspace"); + } + + hlcmsxform = cmsCreateTransformTHR(ct, hlcmsProfileIn, inFormatter, hlcmsProfileOut, outFormatter, INTENT_PERCEPTUAL, cmsFLAGS_NOCACHE); + cmsCloseProfile(hlcmsProfileIn); + cmsCloseProfile(hlcmsProfileOut); + + + + j = 0; + + if (inFormatter == TYPE_RGB_FLT) + { + cmsInt32Number r, g, b; + Scanline_rgbFloat* fill; + + size = 256 * 256 * 256; + Mb = size * sizeof(Scanline_rgbFloat); + In = malloc(Mb); + fill = (Scanline_rgbFloat*)In; + + for (r = 0; r < 256; r++) + for (g = 0; g < 256; g++) + for (b = 0; b < 256; b++) { + + fill[j].r = (cmsFloat32Number)r / 255.0f; + fill[j].g = (cmsFloat32Number)g / 255.0f; + fill[j].b = (cmsFloat32Number)b / 255.0f; + + j++; + } + + } + else + { + cmsFloat32Number L, a, b; + Scanline_LabFloat* fill; + + size = 100 * 256 * 256; + Mb = size * sizeof(Scanline_LabFloat); + In = malloc(Mb); + fill = (Scanline_LabFloat*)In; + + for (L = 0; L < 100; L++) + for (a = -127.0; a < 127.0; a++) + for (b = -127.0; b < +127.0; b++) { + + fill[j].L = L; + fill[j].a = a; + fill[j].b = b; + + j++; + } + } + + atime = clock(); + + cmsDoTransform(hlcmsxform, In, In, size); + + diff = clock() - atime; + free(In); + + cmsDeleteTransform(hlcmsxform); + + seconds = (cmsFloat64Number)diff / (cmsFloat64Number)CLOCKS_PER_SEC; + return ((cmsFloat64Number)size) / (1024.0 * 1024.0 * seconds); +} + + +static +cmsFloat64Number SpeedTestFloatCMYK(cmsContext ct, cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut) +{ + cmsInt32Number c, m, y, k, j; + clock_t atime; + cmsFloat64Number diff; + cmsHTRANSFORM hlcmsxform; + Scanline_cmykFloat* In; + cmsUInt32Number Mb; + + if (hlcmsProfileIn == NULL || hlcmsProfileOut == NULL) + Fail("Unable to open profiles"); + + + hlcmsxform = cmsCreateTransformTHR(ct, hlcmsProfileIn, TYPE_CMYK_FLT, hlcmsProfileOut, TYPE_CMYK_FLT, INTENT_PERCEPTUAL, cmsFLAGS_NOCACHE); + cmsCloseProfile(hlcmsProfileIn); + cmsCloseProfile(hlcmsProfileOut); + + Mb = 64 * 64 * 64 * 64 * sizeof(Scanline_cmykFloat); + In = (Scanline_cmykFloat*)malloc(Mb); + + j = 0; + for (c = 0; c < 256; c += 4) + for (m = 0; m < 256; m += 4) + for (y = 0; y < 256; y += 4) + for (k = 0; k < 256; k += 4) { + + In[j].c = (cmsFloat32Number)c / 255.0f; + In[j].m = (cmsFloat32Number)m / 255.0f; + In[j].y = (cmsFloat32Number)y / 255.0f; + In[j].k = (cmsFloat32Number)k / 255.0f; + + j++; + } + + atime = clock(); + + cmsDoTransform(hlcmsxform, In, In, 64 * 64 * 64 * 64); + + diff = clock() - atime; + free(In); + + cmsDeleteTransform(hlcmsxform); + return MPixSec(diff); +} + + +static +cmsFloat64Number SpeedTestFloatLab(cmsContext ct, cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut) +{ + cmsInt32Number j; + clock_t atime; + cmsFloat64Number diff; + cmsHTRANSFORM hlcmsxform; + void* In; + cmsUInt32Number size, Mb; + cmsUInt32Number outFormatter = 0; + cmsFloat64Number seconds; + cmsFloat32Number L, a, b; + Scanline_LabFloat* fill; + + + if (hlcmsProfileIn == NULL || hlcmsProfileOut == NULL) + Fail("Unable to open profiles"); + + + if (cmsGetColorSpace(hlcmsProfileIn) != cmsSigLabData) + { + Fail("Invalid colorspace"); + } + + switch (cmsGetColorSpace(hlcmsProfileOut)) + { + case cmsSigRgbData: outFormatter = TYPE_RGB_FLT; break; + case cmsSigLabData: outFormatter = TYPE_Lab_FLT; break; + case cmsSigXYZData: outFormatter = TYPE_XYZ_FLT; break; + + default: + Fail("Invalid colorspace"); + } + + hlcmsxform = cmsCreateTransformTHR(ct, hlcmsProfileIn, TYPE_Lab_FLT, hlcmsProfileOut, outFormatter, INTENT_PERCEPTUAL, cmsFLAGS_NOCACHE); + cmsCloseProfile(hlcmsProfileIn); + cmsCloseProfile(hlcmsProfileOut); + + j = 0; + + size = 100 * 256 * 256; + Mb = size * sizeof(Scanline_LabFloat); + In = malloc(Mb); + fill = (Scanline_LabFloat*)In; + + for (L = 0; L < 100; L++) + for (a = -127.0; a < 127.0; a++) + for (b = -127.0; b < +127.0; b++) { + + fill[j].L = L; + fill[j].a = a; + fill[j].b = b; + + j++; + } + + + atime = clock(); + + cmsDoTransform(hlcmsxform, In, In, size); + + diff = clock() - atime; + free(In); + + cmsDeleteTransform(hlcmsxform); + + seconds = (cmsFloat64Number)diff / (cmsFloat64Number)CLOCKS_PER_SEC; + return ((cmsFloat64Number)size) / (1024.0 * 1024.0 * seconds); +} + + + +static +void SpeedTestFloat(void) +{ + cmsContext noPlugin = cmsCreateContext(0, 0); + + cmsFloat64Number t[10] = { 0 }; + + trace("\n\n"); + trace("P E R F O R M A N C E T E S T S F L O A T (D E F A U L T)\n"); + trace("==============================================================\n\n"); + fflush(stdout); + + PerformanceHeader(); + t[0] = Performance("Floating point on CLUT profiles ", SpeedTestFloatRGB, noPlugin, PROFILES_DIR "test5.icc", PROFILES_DIR "test3.icc", sizeof(Scanline_rgbFloat), 0); + t[1] = Performance("Floating point on Matrix-Shaper ", SpeedTestFloatRGB, noPlugin, PROFILES_DIR "test5.icc", PROFILES_DIR "test0.icc", sizeof(Scanline_rgbFloat), 0); + t[2] = Performance("Floating point on same MatrixSh ", SpeedTestFloatRGB, noPlugin, PROFILES_DIR "test0.icc", PROFILES_DIR "test0.icc", sizeof(Scanline_rgbFloat), 0); + t[3] = Performance("Floating point on curves ", SpeedTestFloatRGB, noPlugin, "*curves", "*curves", sizeof(Scanline_rgbFloat), 0); + t[4] = Performance("Floating point on RGB->Lab ", SpeedTestFloatRGB, noPlugin, PROFILES_DIR "test5.icc", "*lab", sizeof(Scanline_rgbFloat), 0); + t[5] = Performance("Floating point on RGB->XYZ ", SpeedTestFloatRGB, noPlugin, PROFILES_DIR "test3.icc", "*xyz", sizeof(Scanline_rgbFloat), 0); + t[6] = Performance("Floating point on CMYK->CMYK ", SpeedTestFloatCMYK, noPlugin, PROFILES_DIR "test1.icc", PROFILES_DIR "test2.icc",sizeof(Scanline_cmykFloat), 0); + t[7] = Performance("Floating point on Lab->RGB ", SpeedTestFloatLab, noPlugin, "*lab", PROFILES_DIR "test3.icc", sizeof(Scanline_LabFloat), 0); + + + // Note that context 0 has the plug-in installed + + trace("\n\n"); + trace("P E R F O R M A N C E T E S T S F L O A T (P L U G I N)\n"); + trace("===========================================================\n\n"); + fflush(stdout); + + PerformanceHeader(); + Performance("Floating point on CLUT profiles ", SpeedTestFloatRGB, 0, PROFILES_DIR "test5.icc", PROFILES_DIR "test3.icc", sizeof(Scanline_rgbFloat), t[0]); + Performance("Floating point on Matrix-Shaper ", SpeedTestFloatRGB, 0, PROFILES_DIR "test5.icc", PROFILES_DIR "test0.icc", sizeof(Scanline_rgbFloat), t[1]); + Performance("Floating point on same MatrixSh ", SpeedTestFloatRGB, 0, PROFILES_DIR "test0.icc", PROFILES_DIR "test0.icc", sizeof(Scanline_rgbFloat), t[2]); + Performance("Floating point on curves ", SpeedTestFloatRGB, 0, "*curves", "*curves", sizeof(Scanline_rgbFloat), t[3]); + Performance("Floating point on RGB->Lab ", SpeedTestFloatRGB, 0, PROFILES_DIR "test5.icc", "*lab", sizeof(Scanline_rgbFloat), t[4]); + Performance("Floating point on RGB->XYZ ", SpeedTestFloatRGB, 0, PROFILES_DIR "test3.icc", "*xyz", sizeof(Scanline_rgbFloat), t[5]); + Performance("Floating point on CMYK->CMYK ", SpeedTestFloatCMYK, 0, PROFILES_DIR "test1.icc", PROFILES_DIR "test2.icc", sizeof(Scanline_cmykFloat), t[6]); + Performance("Floating point on Lab->RGB ", SpeedTestFloatLab, 0, "*lab", PROFILES_DIR "test3.icc", sizeof(Scanline_LabFloat), t[7]); + + cmsDeleteContext(noPlugin); +} + + +static +cmsFloat64Number SpeedTestFloatByUsing16BitsRGB(cmsContext ct, cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut) +{ + cmsInt32Number r, g, b, j; + clock_t atime; + cmsFloat64Number diff; + cmsHTRANSFORM xform16; + Scanline_rgbFloat *In; + Scanline_rgb16bits *tmp16; + cmsUInt32Number MbFloat, Mb16; + + UNUSED_PARAMETER(ct); + + if (hlcmsProfileIn == NULL || hlcmsProfileOut == NULL) + Fail("Unable to open profiles"); + + xform16 = cmsCreateTransformTHR(0, hlcmsProfileIn, TYPE_RGB_16, hlcmsProfileOut, TYPE_RGB_16, INTENT_PERCEPTUAL, cmsFLAGS_NOCACHE); + + cmsCloseProfile(hlcmsProfileIn); + cmsCloseProfile(hlcmsProfileOut); + + MbFloat = 256 * 256 * 256 * sizeof(Scanline_rgbFloat); + Mb16 = 256 * 256 * 256 * sizeof(Scanline_rgb16bits); + + In = (Scanline_rgbFloat*)malloc(MbFloat); + tmp16 = (Scanline_rgb16bits*)malloc(Mb16); + + + j = 0; + for (r = 0; r < 256; r++) + for (g = 0; g < 256; g++) + for (b = 0; b < 256; b++) { + + In[j].r = (cmsFloat32Number)r / 255.0f; + In[j].g = (cmsFloat32Number)g / 255.0f; + In[j].b = (cmsFloat32Number)b / 255.0f; + + j++; + } + + + atime = clock(); + + + for (j = 0; j < 256 * 256 * 256; j++) { + + tmp16[j].r = (cmsUInt16Number)floor(In[j].r * 65535.0 + 0.5); + tmp16[j].g = (cmsUInt16Number)floor(In[j].g * 65535.0 + 0.5); + tmp16[j].b = (cmsUInt16Number)floor(In[j].b * 65535.0 + 0.5); + + j++; + } + + cmsDoTransform(xform16, tmp16, tmp16, 256 * 256 * 256); + + for (j = 0; j < 256 * 256 * 256; j++) { + + In[j].r = (cmsFloat32Number) (tmp16[j].r / 65535.0 ); + In[j].g = (cmsFloat32Number) (tmp16[j].g / 65535.0); + In[j].b = (cmsFloat32Number) (tmp16[j].b / 65535.0); + + j++; + } + + diff = clock() - atime; + free(In); free(tmp16); + + cmsDeleteTransform(xform16); + return MPixSec(diff); +} + + + + + +static +void ComparativeFloatVs16bits(void) +{ + trace("\n\n"); + trace("C O M P A R A T I V E converting to 16 bit vs. using float plug-in.\n"); + trace(" values given in MegaPixels per second.\n"); + trace("====================================================================\n"); + trace(" 16 bits tmp. Float plugin\n"); + fflush(stdout); + + Comparative("Floating point on CLUT profiles ", SpeedTestFloatByUsing16BitsRGB, SpeedTestFloatRGB, PROFILES_DIR "test5.icc", PROFILES_DIR "test3.icc"); + Comparative("Floating point on Matrix-Shaper ", SpeedTestFloatByUsing16BitsRGB, SpeedTestFloatRGB, PROFILES_DIR "test5.icc", PROFILES_DIR "test0.icc"); + Comparative("Floating point on same MatrixSh ", SpeedTestFloatByUsing16BitsRGB, SpeedTestFloatRGB, PROFILES_DIR "test0.icc", PROFILES_DIR "test0.icc"); + Comparative("Floating point on curves ", SpeedTestFloatByUsing16BitsRGB, SpeedTestFloatRGB, NULL, NULL); +} + + + + + + + +typedef struct +{ + Scanline_rgba8bits pixels[256][256]; + cmsUInt8Number padding[4]; + +} padded_line; + +typedef struct +{ + padded_line line[256]; +} big_bitmap; + + +static +cmsFloat64Number SpeedTest8bitDoTransform(cmsContext ct, cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut) +{ + cmsInt32Number r, g, b, j; + clock_t atime; + cmsFloat64Number diff; + cmsHTRANSFORM hlcmsxform; + big_bitmap* In; + big_bitmap* Out; + cmsUInt32Number Mb; + + if (hlcmsProfileIn == NULL || hlcmsProfileOut == NULL) + Fail("Unable to open profiles"); + + hlcmsxform = cmsCreateTransformTHR(ct, hlcmsProfileIn, TYPE_RGBA_8, hlcmsProfileOut, TYPE_RGBA_8, INTENT_PERCEPTUAL, cmsFLAGS_NOCACHE); + cmsCloseProfile(hlcmsProfileIn); + cmsCloseProfile(hlcmsProfileOut); + + + // Our test bitmap is 256 x 256 padded lines + Mb = sizeof(big_bitmap); + + In = (big_bitmap*)malloc(Mb); + Out = (big_bitmap*)malloc(Mb); + + for (r = 0; r < 256; r++) + for (g = 0; g < 256; g++) + for (b = 0; b < 256; b++) { + + In->line[r].pixels[g][b].r = (cmsUInt8Number)r; + In->line[r].pixels[g][b].g = (cmsUInt8Number)g; + In->line[r].pixels[g][b].b = (cmsUInt8Number)b; + In->line[r].pixels[g][b].a = 0; + } + + atime = clock(); + + for (j = 0; j < 256; j++) { + + cmsDoTransform(hlcmsxform, In->line[j].pixels, Out->line[j].pixels, 256 * 256); + } + + diff = clock() - atime; + free(In); free(Out); + + cmsDeleteTransform(hlcmsxform); + return MPixSec(diff); + +} + + +static +cmsFloat64Number SpeedTest8bitLineStride(cmsContext ct, cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut) +{ + cmsInt32Number r, g, b; + clock_t atime; + cmsFloat64Number diff; + cmsHTRANSFORM hlcmsxform; + big_bitmap* In; + big_bitmap* Out; + cmsUInt32Number Mb; + + if (hlcmsProfileIn == NULL || hlcmsProfileOut == NULL) + Fail("Unable to open profiles"); + + hlcmsxform = cmsCreateTransformTHR(ct, hlcmsProfileIn, TYPE_RGBA_8, hlcmsProfileOut, TYPE_RGBA_8, INTENT_PERCEPTUAL, cmsFLAGS_NOCACHE); + cmsCloseProfile(hlcmsProfileIn); + cmsCloseProfile(hlcmsProfileOut); + + + // Our test bitmap is 256 x 256 padded lines + Mb = sizeof(big_bitmap); + + In = (big_bitmap*)malloc(Mb); + Out = (big_bitmap*)malloc(Mb); + + for (r = 0; r < 256; r++) + for (g = 0; g < 256; g++) + for (b = 0; b < 256; b++) { + + In->line[r].pixels[g][b].r = (cmsUInt8Number)r; + In->line[r].pixels[g][b].g = (cmsUInt8Number)g; + In->line[r].pixels[g][b].b = (cmsUInt8Number)b; + In->line[r].pixels[g][b].a = 0; + } + + atime = clock(); + + cmsDoTransformLineStride(hlcmsxform, In, Out, 256*256, 256, sizeof(padded_line), sizeof(padded_line), 0, 0); + + diff = clock() - atime; + free(In); free(Out); + + cmsDeleteTransform(hlcmsxform); + return MPixSec(diff); + +} + +static +void ComparativeLineStride8bits(void) +{ + cmsContext NoPlugin, Plugin; + + trace("\n\n"); + trace("C O M P A R A T I V E cmsDoTransform() vs. cmsDoTransformLineStride()\n"); + trace(" values given in MegaPixels per second.\n"); + trace("====================================================================\n"); + + fflush(stdout); + + NoPlugin = cmsCreateContext(NULL, NULL); + Plugin = cmsCreateContext(cmsFastFloatExtensions(), NULL); + + ComparativeCt(NoPlugin, Plugin, "CLUT profiles ", SpeedTest8bitDoTransform, SpeedTest8bitLineStride, PROFILES_DIR "test5.icc", PROFILES_DIR "test3.icc"); + ComparativeCt(NoPlugin, Plugin, "CLUT 16 bits ", SpeedTest16bitsRGB, SpeedTest16bitsRGB, PROFILES_DIR "test5.icc", PROFILES_DIR "test3.icc"); + ComparativeCt(NoPlugin, Plugin, "Matrix-Shaper ", SpeedTest8bitDoTransform, SpeedTest8bitLineStride, PROFILES_DIR "test5.icc", PROFILES_DIR "test0.icc"); + ComparativeCt(NoPlugin, Plugin, "same MatrixSh ", SpeedTest8bitDoTransform, SpeedTest8bitLineStride, PROFILES_DIR "test0.icc", PROFILES_DIR "test0.icc"); + ComparativeCt(NoPlugin, Plugin, "curves ", SpeedTest8bitDoTransform, SpeedTest8bitLineStride, NULL, NULL); + + cmsDeleteContext(Plugin); + cmsDeleteContext(NoPlugin); +} + + + +static +void TestGrayTransformPerformance() +{ + cmsInt32Number j; + clock_t atime; + cmsFloat64Number diff; + cmsHTRANSFORM hlcmsxform; + float *In; + + cmsInt32Number pixels; + cmsUInt32Number Mb; + cmsToneCurve* gamma18; + cmsToneCurve* gamma22; + + cmsHPROFILE hlcmsProfileIn; + cmsHPROFILE hlcmsProfileOut; + + + gamma18 = cmsBuildGamma(0, 1.8); + gamma22 = cmsBuildGamma(0, 2.2); + + hlcmsProfileIn = cmsCreateGrayProfile(NULL, gamma18); + hlcmsProfileOut = cmsCreateGrayProfile(NULL, gamma22); + + + cmsFreeToneCurve(gamma18); + cmsFreeToneCurve(gamma22); + + hlcmsxform = cmsCreateTransform(hlcmsProfileIn, TYPE_GRAY_FLT | EXTRA_SH(1), hlcmsProfileOut, TYPE_GRAY_FLT|EXTRA_SH(1), INTENT_PERCEPTUAL, 0); + cmsCloseProfile(hlcmsProfileIn); + cmsCloseProfile(hlcmsProfileOut); + + pixels = 256 * 256 * 256; + Mb = pixels* 2*sizeof(float); + In = (float*) malloc(Mb); + + for (j = 0; j < pixels*2; j++) + In[j] = (j % 256) / 255.0f; + + atime = clock(); + + cmsDoTransform(hlcmsxform, In, In, pixels); + + diff = clock() - atime; + free(In); + + cmsDeleteTransform(hlcmsxform); + trace("Gray conversion using two gray profiles\t %-12.2f MPixels/Sec.\n", MPixSec(diff)); +} + +static +void TestGrayTransformPerformance1() +{ + cmsInt32Number j; + clock_t atime; + cmsFloat64Number diff; + cmsHTRANSFORM hlcmsxform; + float *In; + + cmsInt32Number pixels; + cmsUInt32Number Mb; + cmsToneCurve* gamma18; + cmsToneCurve* gamma22; + + cmsHPROFILE hlcmsProfileIn; + cmsHPROFILE hlcmsProfileOut; + + + gamma18 = cmsBuildGamma(0, 1.8); + gamma22 = cmsBuildGamma(0, 1./2.2); + + hlcmsProfileIn = cmsCreateLinearizationDeviceLink(cmsSigGrayData, &gamma18); + hlcmsProfileOut = cmsCreateLinearizationDeviceLink(cmsSigGrayData, &gamma22); + + + cmsFreeToneCurve(gamma18); + cmsFreeToneCurve(gamma22); + + hlcmsxform = cmsCreateTransform(hlcmsProfileIn, TYPE_GRAY_FLT, hlcmsProfileOut, TYPE_GRAY_FLT, INTENT_PERCEPTUAL, 0); + cmsCloseProfile(hlcmsProfileIn); + cmsCloseProfile(hlcmsProfileOut); + + pixels = 256 * 256 * 256; + Mb = pixels* sizeof(float); + In = (float*) malloc(Mb); + + for (j = 0; j < pixels; j++) + In[j] = (j % 256) / 255.0f; + + atime = clock(); + + cmsDoTransform(hlcmsxform, In, In, pixels); + + diff = clock() - atime; + free(In); + + cmsDeleteTransform(hlcmsxform); + trace("Gray conversion using two devicelinks\t %-12.2f MPixels/Sec.\n", MPixSec(diff)); +} + + +static +void sRGB_XYZ_roundtrip(void) +{ + cmsHPROFILE hsRGB = cmsCreate_sRGBProfile(); + cmsHPROFILE hXYZ = cmsCreateXYZProfile(); + + + cmsHTRANSFORM hform_forward = cmsCreateTransform(hsRGB, TYPE_RGB_FLT, hXYZ, TYPE_XYZ_FLT, INTENT_PERCEPTUAL, 0); + cmsHTRANSFORM hform_reverse = cmsCreateTransform(hXYZ, TYPE_XYZ_FLT, hsRGB, TYPE_RGB_FLT, INTENT_PERCEPTUAL, 0); + + cmsCloseProfile(hXYZ); + cmsCloseProfile(hsRGB); + + float diff[3] = { 0, 0, 0 }; + + for (int r = 0; r < 256; r++) + for (int g = 0; g < 256; g++) + for (int b = 0; b < 256; b++) + { + float input_rgb[3] = { (float)r / 255.0f, (float)g / 255.0f, (float)b / 255.0f }; + float xyz[3]; + float output_rgb[3]; + + + cmsDoTransform(hform_forward, input_rgb, xyz, 1); + cmsDoTransform(hform_reverse, xyz, output_rgb, 1); + + for (int i = 0; i < 3; i++) + { + float d = fabsf(output_rgb[i] - input_rgb[i]); + if (d > diff[i]) + diff[i] = d; + } + } + + + printf("sRGB XYZ roundtrip differences: %f %f %f\n", diff[0], diff[1], diff[2]); + cmsDeleteTransform(hform_forward); + cmsDeleteTransform(hform_reverse); + +} + +// The harness test +int main() +{ + +#ifdef _MSC_VER + _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); +#endif + + trace("FastFloating point extensions testbed - 1.7\n"); + trace("Copyright (c) 1998-2026 Marti Maria Saguer, all rights reserved\n"); + + trace("\nInstalling error logger ... "); + cmsSetLogErrorHandler(FatalErrorQuit); + trace("done.\n"); + + trace("Installing plug-in ... "); + cmsPlugin(cmsFastFloatExtensions()); + trace("done.\n\n"); + + CheckComputeIncrements(); + + CheckPremultiplied(); + + // 15 bit functionality + CheckFormatters15(); + Check15bitsConversions(); + + // 16 bits functionality + CheckAccuracy16Bits(); + + // Lab to whatever + CheckLab2RGB(); + + // Change format + CheckChangeFormat(); + + // Soft proofing + CheckSoftProofing(); + + // Floating point functionality + CheckConversionFloat(); + + // Do a roundrtrip + sRGB_XYZ_roundtrip(); + + trace("All floating point tests passed OK\n"); + + SpeedTest8(); + SpeedTest16(); + SpeedTest15(); + SpeedTestFloat(); + + ComparativeFloatVs16bits(); + ComparativeLineStride8bits(); + + // Test gray performance + trace("\n\n"); + trace("F L O A T G R A Y conversions performance.\n"); + trace("====================================================================\n"); + TestGrayTransformPerformance(); + TestGrayTransformPerformance1(); + + trace("\nAll tests passed OK\n"); + + cmsDeleteContext(0); + + return 0; +} + + + diff --git a/local/recipes/libs/lcms2/source/plugins/fast_float/testbed/meson.build b/local/recipes/libs/lcms2/source/plugins/fast_float/testbed/meson.build new file mode 100644 index 0000000000..db551707ca --- /dev/null +++ b/local/recipes/libs/lcms2/source/plugins/fast_float/testbed/meson.build @@ -0,0 +1,16 @@ +fast_float_testbed_srcs = files( + 'fast_float_testbed.c', +) + +fast_float_testbed = executable( + 'fast_float_testbed', + fast_float_testbed_srcs, + dependencies: [liblcms2_fast_float_dep, liblcms2_dep, m_dep], + c_args: cargs + ['-DPROFILES_DIR="@0@"'.format(profiles_dir / '')], +) + +test( + 'fast_float_testbed', + fast_float_testbed, + timeout: 600, +) diff --git a/local/recipes/libs/lcms2/source/plugins/meson.build b/local/recipes/libs/lcms2/source/plugins/meson.build new file mode 100644 index 0000000000..2eb9c13cd8 --- /dev/null +++ b/local/recipes/libs/lcms2/source/plugins/meson.build @@ -0,0 +1,9 @@ +subdir('test_profiles') + +if get_option('fastfloat') + subdir('fast_float') +endif + +if get_option('threaded') + subdir('threaded') +endif diff --git a/local/recipes/libs/lcms2/source/plugins/test_profiles/meson.build b/local/recipes/libs/lcms2/source/plugins/test_profiles/meson.build new file mode 100644 index 0000000000..1eb96dc937 --- /dev/null +++ b/local/recipes/libs/lcms2/source/plugins/test_profiles/meson.build @@ -0,0 +1 @@ +profiles_dir = meson.current_source_dir() diff --git a/local/recipes/libs/lcms2/source/plugins/test_profiles/test0.icc b/local/recipes/libs/lcms2/source/plugins/test_profiles/test0.icc new file mode 100644 index 0000000000000000000000000000000000000000..c233a53002583167119c83ff8c3e4a6279e76817 GIT binary patch literal 568 zcmZ{g&q@MO6vjXQgh5gUE(%(>2p6FcX%NxMAR+n#YEaQ;yp9^o*l=ftkRG5OpoqwY zK9|_t+fPJ3 z5XCqmSjMy_Y-_W)R>IKr{fvN0KBd)LL(Be8j8$}70D)1av%-=Nd4;@j>{yD=$Z=8E zD&!V9CD|bPQR(GAzbUTu`BSkh6;^>@m>jDOaCv}5U7DQAD2W2eYC z#WRBf^2i~9GF%+OfP*w+V~B^7q-P69bO_!Snvkrop-yLtstX%BW0ktjZJ?=UP9K*) zOS_s`=t+U-IxzC?d0%rt_x-I&V7m>3e|;^a>?#kD) n7eJfuPh47>)Oz1hS1^PAT*x6MbY6hc39$G8-0~!=^c?&FK?Gr) literal 0 HcmV?d00001 diff --git a/local/recipes/libs/lcms2/source/plugins/test_profiles/test1.icc b/local/recipes/libs/lcms2/source/plugins/test_profiles/test1.icc new file mode 100644 index 0000000000000000000000000000000000000000..d0245c813cfb52a7260186c8a9ba5ae6b8160124 GIT binary patch literal 557536 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

    u~a{qX$F`z8IWheD5?Spm>*^|7jW2jia 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ëLe#YTVXVdMC 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

    {$&C5t9HT%M7t-T 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

    H}m2g5AtIjukvG^ ze&EMA{mqMU;$*O6ICAVK&^e2~AAq)O8Mpy-2Vsqi_AEv_s-01LfM=wNo%Jc-c{=5~ zSWvc$9c8+>Qo4%|rMd)DvP%>txkwqQO9qqRTFAz^RCZ%}Hqht>!O7!rg1djlU^9ZL{&p0N=GnI+*%wr=xE7)+)MqZfbN?wTPAV1h^ zlpo}Ekss*w5c~l+o{XS3T=him9|$iD+Cy0Wjd?KGHsQ}T_<0f9k?k#}bZ;$6@iCx8 z9}`OOv7$I1dy4UKqbMI=iu4Jk2;Uec+&7sC_03^Ie9PG&-+Er4?+Tv3-+I2E-yXiN z-+8`|-vjUpa6I34xP*CdI0WYc=nlqVF2-XVKw}K<_aYv-Xh&Lr0wwyZQ+&V#iVc`f z(E+n5GQgI?16(L9(3?U7gD5yKiU|r#WC8-S82`Xh);Fk@^$BX{c?I?JJ%e`fJ%Y~i z-GlG*-GhF|XO1^UAhzHf=D~poEd8OsUW(j530@ee!{-vTD--RIhKML8M3tgK#!-04 z6bcPBr;yNj6cp-2fuWuh5EelGVG-mTmcaOgWiVc0MXX2ILe@R3jprJ+j^`4-gYO)E zn(q{T5B$b+4&(kIl;fSkxbKa|IRTn|Sn_qI<9GxM@wou;NJTtiB6$=ZDWQ-^9SVvx zq<|<>@{h72-zajG5-vzBrsmOaXaZbp_Jy%eL&$(zv5@HgOfHilV68XhxkWc(X z@`|5Mo(Z$bBf*B;5?shN!JAy9!Q?EBCP!&9V=v8P?4*^fjkKAaC+%kEO1JaoNRRWZ z62IbENq^zZN#NKq;;{vX(a+&z9Fx#olZTwE0OtfSAD=VPmiP?h-f77DQsl`!MU`CP z#kiyzkyEM}Ii}7bhcpMWPs1}9X#r%D7D3i&i8MDYo0*d~pRr6^!pu%z&CW{S%9^Ji zWoM>;&dyAG!Ol$OSaTUEui1w&*b1G#eB|E67>81f11KrMTr5J~h4uuXJ+3+MAF|;; ztbf)ZDywD z9bu;Bf5J@5{h67T!;LXLn`33{LLWClV=Z)-&&PQQDL_>fa$jtdDsb-=Kl3g}?uWm( zDp8=>rK&WmRFBL{C)3PQ6EZ8aBGWQ^GAVPX8D#-9y*!Ghm8a5_@_ zg&K@CLXvb#NZhSSO5NkZR8s6VCxvbslJ9mWx$a;Rc1uanT|m4wb;PW}FRk7NPC)D~ zc!9~s5!3ma9`s%2!7N$!+Jnh~R>ErJpFOC9>BShVg9p@y8jybI4?uqdJb;ZXi8d(` zvq=S$NgGTA(*PDDL-xQML;{>>Heph2LdQ1Y7dIZn$@nJt2?ydIfEz>R!L%%YdieKJy0X)L*y##0jScZ7Nt%FHjkMj{Uy`X0cJv01@A@p?izysKa zI)nrG9+Jb*Kl+AaXvZe0MX#5o;(j)Jz&PJAEDDDFh(FuC(znsVRBDe%D1AK=u z;XNsIO&Pw31{UY~SR778jR@NDsS5~$XORJL(0zt^@!1GC3%&*zlh0m^y^khy3+5pD z?6()kz#({W??M0g>t~R}=Ma0D<`r-q+yuA4C*U*i1^5cwK}^0@Lfr{s@<10Jg%Oe_ zwBv~zl7~pthU9|90F&z}gq~gi_{FF9DF=Oz+l^xYeRe#CbHFJaf6&!HKb5W`_BXKq zkAY0@Hn<1A1rNX@@E!O8{0M$x;f2WKhBadHn>Kuq$w=ZXfhULs#h?XX&^ZK~I|VKv z`;^rh$b1JGG9N^ib594d8Vq+30%XsCWPn0Y0bctLuiweB5`XRn{a^@;fc?mBPr@&_ zj@TzQ6MXs}t$K{#lxfP4J(nV@$+!zR zku2AT2SM;4#{37FA2Sh{0$B})Cw@B={fUQ8IyCa&eUu@SuZA~J4~=H@rycw6!oGX4 z??Lo@JNCa1zQjpn{WmaOzJn9;JBE{^{{gq&;bVN}6)R@j%m6IQ)eA&F*d=*+X+wNFsAZF971;y zk>~IWIQRwsH=H7a@xau;lzQC`Mf__uXikKt8Tw=kJr8IFp&!xENP-65g@JZlMLVvb z9hcCK3uwnVS`N2i4V}WXIVbR*l%w!sj^Iy+@LLBEt$pa(KB(+{!zi{g#=H+9^wEx& zXvYi0;~~c8E^356M{UkWm>1XatkxBHF&8i<|A(#j0JEw(`}TilfElLu-h1!8_ul)! zFa>6qp~KL7??{o}n+PHxB1Kf}Eq0UF`1vLpTVgbtL=$7I;eT%iKFxRiFR$Bu&Y8n{ zp0(Dq*Iv(WueHy!XhKgB8&BZJ4g7c%Kd$4)HT<}O4)PFM-GgXC53o<^JZ*75-?)#J zDW|E;y;v}!_8vI-3yhy!`hnB>?{=JS40-Q!YW+^;^r9m}kS}$MqF2+YQxWy4#!d@% zI?+}pU||wx!3=tT9(I;sXAL&CQ2uTmr!9_}?$cqjt2#8|1sxdmk@lN^t-btq(jH58 zcKw1M8B&bL4Sme8@;1E6>lg9sISVU2KEg#0j||j9=5cypbQbzbiOyKo>XcQhPFjuA zajOYBYCTzpt!L_x^?V($S+0FH>$TTrhj!Z>)K1&ey4&`$w%b0ht#%)2i^DhC;+~3m*kFT}N z^QM;GW(h}wzXvkZMluw~a@mO|*N9=B9Zvp@U-!6=)=@WS9dHlSZqHcV?UkWzUWMA? zU8zmp4cg${u5~`$TIF6IE?@eTW7fsF;%>D~M2W<`T)~3L4tq)4ln&2F* z3NF#|;A$-mY0{FAFBW$umhSAc1F{~uWMTP>!v9Y ze>F{xylI+r2lSXp@L?R6y)-Vt*<9XpnPbDTOmc6A`R%mL#&8?033tck9iD^vg4{*~oCgo>-lfkqDo0m(8feQKn_LPxx^4V(IW>M-$%}I99%oHz8O9|EF z)OZc1rfXtazWUP2G$E~4y=g7#N$XTsdY{InPgQ67eAAfp)uxV&?WVSjqo&r3i)JmE z&zd!7{?V*C>pN3(=1o%*7)OKGXoDLiOsOiF{?#zYhP$g-=ZqiA@M8{sOv|vvOCnC-K)0jNoviRV`|P>VQR|RYHG+mY^u*a zZ&sK0v{`N5hwv@jG~FVXBfNy2>(u>xEmO?~;-HZ^ZaujUek`JGX7Kj`ephNju8Vqd z{WLBwLSyq1)sdH>_PheM=9j4@zgErpt!gUhQbWOj>I-I>>I#;cY6>@-stXUARTZ8y zt1NoLtfJ@-@D1EFFjW)|^E_>E6?E)YkMTvLHLlQ6V~V`h zUKFa>PTCdMP|9_ZwJ=t2h?$6S95`4;Ul0YBPnOlqvMRb7>< zYO4KJRUM(q>I9WnXQ-?uU!|6 zA2G|Ue+&L$%B;INOzllm7Cc%bS4JxZ?jxw58o6?(ino^rjnNpe` zHYKTHfh9{@>UBKwK}Mv z)kFDhfy!-*QchcvvfDD1)n2H~_DW^6H!8hjtWrBBDy3scNgXRqi5)vk@ncS!;>KJx z#g2Ic{%(rvxM_-OzfIds(?i6-z105@cJH3dIXQ*(Krl239f;35CXjpc_u?)y<#gIA zYn+QR#`!9JT$ob3;*`>rrsS?XC3Tf4vAa$Q-R+9+o}k$78H(vyrl_86itIVAh@Q)) z@Sax{-t$*ecsKe(*G*G|!MK~I3)J%@_1}-(Z8PYHnVgd_gV)A7lotG|9OT|F{-pL< zDya|sq0dwC{eg<>k5p`bqGI|p6+N*?Q4^~aF|kGA6MGakFjXM~ixoVuML`2c6fkf} z{sS+;=L(qk9|iQYa=7oNDG<(5&s%G8W|4c(p&#aPPQtBqD6?4yGequ-Pg(esFnxp~ zr`alenv24w`6zUHh(e~vD0q5`f~Myxa7LK|W;DoeMyGsd49aK5e0j~-AkUcxF^$#SQ-?W4J#X!Yn$P*Lh<;c?KR`dUFXsL~pXD#44Ip{}`R9BK z`OdeO&jL4jFYuGsf-re5h?B>Hbh$4qkn6%Kxh!mx^TIwkEu1Y!7L_KOIhL-|{la(!4q{=bTGX*KyjG(ZVtKpcdC54fzhl;axq zfUI!?ev5QXI3&n+O(vAcW=(^v*L2Bp%`}Z(vs~tD?$)T)_iDuI$24-)@8KUBwURv` zD~35pJ$Edp4c2gdSjU>E4U7q!$iFue2U}PJaToXCAq;%Cl7nvJSq$4p$ci;7<~tlU za=V8{Y!8rWdn6b8Bnso=zoU}ZoYdP1qU|*Bb_&~e46bnUzk&GoH~4{y-@L`{l^n3W z8oP6`Gq9cf_io06U917vg9ft~4G8@9VShjN5267aA`d-m$-rs{&fo<>2=3943S4B4 z)Byo+JOJr1jeD2^4xi@)e1XpYlmYQOz=!?ZU)x9oaCRhE0e+mtkNfe1XQk*Iew|bIH3SDUPFl#^_!7f!G*nxrsNnxR2JgUM;hS3;O#eNs!=b+A*v-6*{cFS@Hl46(W!N-q(T%rs zm)AHFRwO}`2XDdK@V{p0A*0bKXp;|}Sr_7qJ`n{uXcYC(&yC!r?3ba^pA#3KQ;{!z z3xCo8ZQj90mDtY4ZZvj%pF;nlewM$YY?|%A)}g$|`w!ql_!#~Ke+HVCloBmuBuSGs zItYF9tq(~Y?eS9{4-{yIDI}F^fQG;IT+}Bx8mj^B=nsbWVC4Ot5C+B?j6$e|4wwK_ zVGb;YRj>iJ!Y()f$KecG!9}!*N6{u;BIExM&ETK6v=3wL$G_k!Ff@oi!iO-t_QKE~ z3=A#8&|?B24valH70?V_FhKd!DSsXr^b*QnP5B!se;fM8Zt~?rSUZW0`_U$@pnW`z z_VHVq=nG_{A8D@PXK{SO@dGgQh+F!@E$zct_h1fp^au6{u?A!KnIJ{jtHVw^HhR$_ zCQ<%O%AZfkODTUfQzZ6M zk^c$_{c7sbf{k(1jAvos#|!xJEdBB{{qiJ!Jb@oK&>tQ}o4QV)Tt$JnOj}&StBbVM z1N7W^tQo4AalG^TCSh#&@Qo4DV1)Sl=u&T^*S*1dl$VK%7tvy#MWcI)_`JdToJa8E zVf?s?AD8jt5`J97j|=#5jx|eX(a6rwC#=Fi@3@RY^(<=HA84I_+*0ojW6{7^(PVJb z0{aYgpK&_9Z-xAcPp@kfb#%a{7urWS_L3+m7k#A+JM~0d8!bH!3w`wbBx*bpJM*x! z6dP+PcPnSfKK?sNggn4m^EfM*{)ZO&E4}q2k;B_e3bn(gQrm1BbeCn_J|ZE{M|dgpAd#Ufbslb7qUNKtYou)T2Y<=d+nzJr?XH%n9f z7Hf*%I!*H5sX_nani%k)`U9U=U*I1#A?SOJM~C?({|9@|rf>=7QhR?Uxemwuso0Mv z=c7$l29DN}0Q84IU(F2)N5@Ij%wV3s5L~FK!4;YuT&GDPtr`gF)WncJ^@UE=gwS~! zj~3GtwoTn(N7NO5L7fp#!v`80`EQMhWC!3KBG^BdL=0lv&|psIGu44zIn+Omd#wq~ z^P@&+c9^|pgnMdgM6f1D#AqNgRTCp~)ECMAho~y`Mm4HCs$E@CJsKB1Nn@jDYYbXU zN6Z$r#U4~^?EPwqdtA+N@2V;OU%+n2xSx3$TaRM@LJ@gJ32gw|3%S3AA4}4?*Gk_^ zjj_>StgHHC{WU%=LOpSb>Wa(MxcCB%jW1J2e68B!Thx{?POS<3YEGP?ro_c+Ox&o3 zqtN3X$w@HwoX;)dsM*# z^2#%=o60l($5fW_72Gt?Ez)o5X)f&#mC_GY^g}JVKWwZf_s5Sp_%RtjdeY4`HqAlp z=^koH4^mTllp4~LRG*Ql+Kd9#WR$BqqfS+sZK}-dQAO5dm1oUUY4#eGWbaaO&M8w- z&NWkE?wjx>+%y&D{9p70b_^Zpo;s$v4fI1J{lJms^O{N9kiuzfu9;f0S$mM}s`_ky z)nS8!6f1y@Zug|EZk z;HD|3V3^!|a(~+3JoZjtdtVFF|5kENjthA|jrJH%d$i$4eSwW?@|{&#;G^<_5S10g zsH7lS#RXX^DlAfAVWkR+8kJu(R(Zt}m0LWd?BW&5D%q~glHvEG^X=)%9|3Ua}!A6!kuU-Rr^TFLB{ zN@~bbVndM<8mko7*sNHzn3$%?if&q{$fk{oXg;X$<_ijIejfe|KPtS5C)qU)bDr{# zQ~$l#-a0@m3=#_*r%yzGz?ar;`T<|^@g=owv=Y%`658Aq*XFO-ws6I?#Vfi!O;PRa z!Dwd>Mtg(8&|*S61{KmVPr+l>D{#zy1&lc-|1rdx7RnBk$vN*Cg^Td@1W=-rq~^+dV>2UABr~k5X8dw?eyv71AB0;O-;^b!REC zyI27|HS+IimtRkxe0qoE-MdQoY2OJzHvINqLO>y93B1~1Mw#a;@<*3fT6)` z!1i*=9@>N+xP@_XEBWVk)&Sg%4hA9MwG;chu)iA(fa0{*9BjDAIdF6ZUkHIXU^1|` z3}}nJ1od7zch5FB#Xxw26X1RL7XuPLz!vJeW;0qGb_aLR2iU0D$GLcbbvOsnfJjfh zX-20bXaL7}7R7PwpM-l%U;+4X4}P4&k5fK~ouOO+;~@vCffM^Q0e|mWps-Vy`Tm>m zcgpz@_$3Q$FQlGR_MpLFw+>r{*h$7t*ge?4m;OJ425?p~(UeT?xyZqTcNoP4$eN3< zJvU1jvU5;N*Xpws?3469o#o_6+2jo6YLIH6T|qE+C>%SqfUD~47ygegF$ zzj~PWS2?~8pTRe`G??)xcpfdbOR$?p{lc;7#n+gU%i^)ycAn<=9Q+Dixy@@FDeC{~ zA-^5L+7m0Z5C^mn57uko$H%GYArU?;~unvbL8$<(I=ioGx$BZ?3d^U!+T%;!SM_D2;POaVR+qzp*t8F1ZyE~ z=`wyCqag!IpdQ9xV?5d7WXhjK2EBmtmr?#2%HKpbyB+OgFB$$3vdVk0bCD*wLH_<4 zcl$)@24J9(LIJJe?H|erTjIN zy@|5#CTBl@<$KU2E}%<1#wqj$|Nk7#;73j^=5BBeuE4D|7`N*GOATTaHth*DPkJ&G zTZ!1p!A==A>IuQ%$F7WOgYRp+m zJcA;38oT$xsb65!{YUr;jIjOy-l8pDr7d1$J<2n;)?lR4v-#MlAkrErwVffV8(p9u zEoCw`W@2L=HkMNUT3X;P^oYIm$O)q30xNZHpv?S+Ui#au$lZOQtW z|KRv4K0HrcJV9JsXPwez&XJ2~G3V%$vuHx6*(-Gq+SCdBI7Yu5AwCY_$3gtqPkZbo zK6bNaX(zFXvanN39ja*UMtZ)Tv!M$+eb|{yFU-Qu0?J=WYi!}n-OHaYpL(VtDms81}(7!z^1vb&6s4*eDyKi)UccCwH4g zYU_w(Z5f%PjiXAm-n?3C%^S7aqFt*jy0pTgPs>J6(UQ@#wRrSWEwo&(`RosxYjs?6 ztS)NE`f1Iwd0#VaztIf#1x^12A7b~FU@ie+*oXTFEpXmW3c`bEAYG{?hE zGd(>t%_~Tgy`wegovevI+3NQx)CAuO_4?MS$G25ozT-5`uV0;hGc?A3kvjZ0s4ZZx zS_4k2CGfhM1An8Yps&;vjP_uF9%Jw;>V6&D=dx&n9HuPUa5-c9V(AG zp)wYxmd3uK(zq{Ff(Bzy8avDr)cHZ|pDHE}OUd_O9j}+*#}IxD;$wH*NOeTpsWsY7 zO)>szhzVDHOuTAi(^M0iqpH|qRmN7SBCbj0abr~$->=g6St?FguA+pkDoi}8f}~5z zPx_Velm7z$;WaBGZ}S-Ke*v2(%ISwn=Gd^Ng85wuc?N#;;m26~XiBhAeS))U5`0vZ z5TeS&Xq6`>sVp&5C5Z(pPAXSXQoRa!c1=O@1m&kpS6<2z<)&^?PTFB*r(IN5`U}cT z{}g`YH7g_2hIyE_zrPF}sG2EnE%{y@xql7)fFD!vtrtJIwU54Ismc^bm8W{DG&NAg zsSzqnSRR43{y^K ztg>03la-aN%U~0cNzL1K~$I?NduX72|7Gv6a$_9hFk-q2%HKC6$CLu_RszC25K;%~fn^ znPN)o6->jL%OjomHX zj7vRef*hxgW4_8qH^5Jgu-E2=745mng=uP#j!Wujk+7O@+o?8>#5U-%dbOkmRD4?-Y zeof8tZR(Lv({ytFrIJ^?Z3a5SeVGTFo|(t zGO+*ygTw;<)Z$AK{$ zbxfyR#!Qy;*u`=hyH$>3Psm~H!?GLuTRDvRC!jr`#TXdB54C52abYUgr|FCfGl+$m zXi>awox=HmUwQmJ86P8Qr-1P$G!<*P_BzO=*ImxNesby!gE%>kPnW~^0@;tRmfiRc z*^VEO&4l@~p0G()E9me*=UPpPl;xBpjh>Pti>c)rHMLnI zr;eA|R0^K57WTshgx?q7&+skc&^@ zzVlgw0QU3EWI5kTBUzK8`L5stAygm+(tr!kJWi;2bf6(_&09{8?SlIlc%FifxfuQ% z@L`Bwu$;#=3R}irp!q9tZxx#4YVvO=gw!?k0Y`s6cLSy-vI4U;7IdC1ID$L)K^VkC zHgGbpCXiRriL0o@s;w9~$;I$dAW>ZYH49Jh0k$rs4Jg~#3p8UrWAjGNh0TmfThL(c zVjm0yf;%`+jO8}$Zx@rC5d^X&*nt!8J-{C#APMrJ7P|O59lCuTYf%ovWg7lX0`N-) zgZ}{QjIq5EyR)&`kBzn+#39X=y@&H)FYAE7eIM<=pEV!{uzd)Q+yOt1;KvbLE;zKu zQQG4eejJNrGLj0#&;kUVvH9pI1s^@f_lb!kpD`$W2Rz9E+w-W~;7-m(>{VkY7k3km zqCp+Q{&Ciz(1aGJuzMQlQf@Z>%sCSiAo}IJ4HsYsZpyhaDWhL5;m4&6sDQCRU|*uL zmyR=8pg%6s9~b`tKMiXz*dBL~u>hO-_Yi~F3OLjYVUmg;&qoh0)_tLliTeat47=e1{EEN*3I3^R)VrHH*Hh0z>X>w% zbMPYZcM1LL3Tsdddxnk2;VF0yXv$kq%&oN{uW)=7UWYf$xmiiyyyJ{cfggW}MW-kr zfonmlm>Gn9I|Q#aci=ub~l=Ckl3ybS!4ThAqV zo8$k1-@&`^K70rt!zb_={qu!237iwp9Pwu(K_WM_%h*&f4oze(Y)2D04K(DpFOhK> zYcH&CW90qDS`dGTflMfc1{edzT97F)1Pfp}tVNgDj83qFyw!Ln$5FDmGw21E$lsqJ z%Qc=!`UUx{@e47-&m;YWqoIHN23~`kvH(MOFavWiv>0y)hh)fyDoSWU7wDq=e#)Op z*|RBoA=<}s%3h21u^Fx4Zmb2A{Fbo!JKhZ2eU77{eHhQexC%epXW0(^{G0VCUy570z%ZtYS*F_+@+_;yq};?9^*uQgtmB?Z(POm z%k-3?c|3TV^Bm8@9Us2O{#Wp+Mo>3f?76Y-BZzv$VkaFNg_K{VC)tbgII;04eq6_o zhl!7?ZH5gdF3%0_y*!;{4S(72=RZc16^naZAyhd9*$a<7> z3ZRrI?4(eu9Bh9a19`ueAw9G|RBKCpM z!Yhg971;eHf3xBgXJ~twVb&Ppu5wym#GkXAFZXbc9A$6N0koLCoU6N73$laQ*hY-r zg&&)VkB!9Xdi+?2A8Y6rc3x2aVtQpQD`d8_o9r-N-H%fA7`unwB8u4uf)5798E)_~ zmzvkyS&HXL-U;`+4$JUI@NJ*Tin=*bFZO_-kF8TYcG9U!9xYyqooehfVyB(6w2PkT z*Id(7%{I-|EVC7wVYWrnM(o$r5vMhIU9lTe4&BSKWV^{r~ll>&|sbmK>rEm z(gP=WeZZT!l?#_wI}>YJY_)Qvi-^T(y$3dN59vb5vsCMs2wR$J0#V1`&KDlc2DN(&I`yYJS z|KQ912S4^dpv6@BFIBn!7L^4YR%ze^DhYf}#X+CIkHD{U-R1^$zkux%ImBQd)2v+D zAd7sDY0%6B@{B01?IC7r53p5BfQuRfd{rM9s=7d)eGr(e>YyxD1{J6xs9fbibt(&P zS4nWMibJNVC}fceLpLfv?11vZ&M7ziY4}*V5#IxM1;U3hbfEjOd$fRjuZY|qR^~Im zWm-CozfHi8G5FCKYOUH(M^%Sy;V3PZ`l?l^(;cyO5|{sPdy?loy?>+~`c@L>DSMrb1aUjmnJeR7Tu@(&FYQ zHGYj!;`b;y;f#_J9#>-GAK>3gN@VRp0#|0ZMEjq@=79>PzE$LVu%wbaqm;D=_|b_U zP54ofI8sG%w#tulR&JcPvg3l386T;P_;{tqrztHVPpJuIN=d9&a^e^zCG{&YX-Eml zs}!HIOK~Zu6_ffH{2uWGz6 zVl_9}TA9g?N>BDsTC%@VlEakD`kbVc6eXtQC?T~(@u@Y6OKVeX+62X<&s22!3Poky zt%!_M3eS8*VVUo6{8|y2>>AEsr6`=k&arA@p`NLJ6RAiuxj)Bgyziks+UT1aVx)+e z$;cS3lni?%@w?uM8NQ0o2vJ-H&tJ$)QcNcMAF>J+#a^k%>=s32_b5DPxZKOc$%=I}=;e8jMH`6{rvLW|uLQtYST5}pB35~IM96a|##$gi|izNPi@DH|*AvPtqRTPTn6&2le4D!1~> za;e}M5am1r0{z9kY?zbS*oVEXUF3YdjE&=oM~)M_IVZ<5=jU%F_>$Sk{&Rc@t2S3a z75YP!vwW+({#jPd z+&M#wF*t;M(oVrZZgDoe8q)%#vkisVq7hW!~AXk)6{uqI0E8oxADW``{@=*N@;EnZ`1kM~~Tu zjcwRoJA-jy7O^m!SQw%ocwNJ11^AQ7-=ijzf8&z}ZR9v$lFdXbSxmIo$cZi*(eEv@ ze&fOt0}S&01yBQYWO(*T772Jgd~Pu?d?i=b-~F_<0>l(|qnf z^I7Ix@^1*nH!r^D1h!y4G@8J%1t)Ol;=;v#X4vpWW@a`=0(fQ%P|2ATG-ES`ABSt4 z_;1tL{{Vb|ZF3kK7jiz}>YQc7;&R3%sD?a9f-pY!S&9Y(wqVYCEgOZHY7O?_3{1jU zlfq_KNTE?_3**5{OS)ku!M+v_G5}tpvab_(f9Im~AK-5FVq$RxAFsxxHH-=CI2YD4 zCT*Y(Hlo3B^aU5N<-PeP>{F#%Y%-@2Z2&(u;m0N~J`V!=WOD|T@fm@P&Hsj(u8irk2J#| zuU9frpy2y2!<&4M{y6)C=27QC>c?_2Rbej&Td^n6A+hC*E$cIA0B5mz4jzC@@X&22 zisWZl7rDmq`babp+T<|@k`xan>mk5-@>Dr=!fc?SpFYj;Y5w*x3B^A(g?8=4b}e~T4|#9A`yEocQh$z2bi7o22W#(6Y@ zN64dJA+!3FyX`-qPYkaC`H-Wbe;5jkp#$*59=M}H7+Q#-#khm99wi>K(OAl`(Lnhf zl-)!2JV3eAP!wiU?m~2l<>(&k$Y}3EFWALik;AASr^%r&p-nuEZtxz>^z|+6!&rOr z1{k)Dy&#Xk&-U;5VNKnfvFFFXio#whbts_xDink!${s^=_tNYG=sDAnq-G;cEhLj% zPTkg_O>9M**n>84jC$Trm|Q1^e~s?^Tu;$*Ph!!~Ka4dPh7NH7e(A$^w8uZ_m(N*) z@d;}%K2!*{;<1y7_EC)gHI&^<*<&fYm$C;adnz>@qU;6KYdImbp1N&AFW65g8#_QA zq&1%5l=^_)F`gXDeH*wB?t$ZQ$A^Dm|8w{d-X<>IpenqR-HZX+Tjg76c^Z zAVh zRyjluon@8EW2h3pC35}&!^)zeE*kvV0{dKcp0#Bd;`ji=%YFE8Qlt3ScGSrgd;aur z1a=a!k%^50Y?NW6h8j0vryVV#3oW7#J5#YS2Q6Y5nup=h9$M!VE4!``!7uaIzu+nR zK(Kv>-!ZJd;DUWO@=jOs9Vc=whL*kfwu7-_Gg{0#`ec;?sZSJklBgxm!NiYw_%R1R zW}}15!jBpB%XH#nDz7HZO-^7{Gc=->Tb;m1nnko#FIxUnKDW zE<^s@8t`HL2UC(Qj$Br0m*pd^vFU_8Z)^p#@`m5QFePiMDNB>h3N$!^-@zDBqyCXi z>Ki#m<45+YXVheMkD8-#<|{PTe5=M-99H}23u+tvv|24cREzaDzzVqAynx+npc$HP3*s&Qh0kfjVug>*|#{L=AIDD*Xhwp&(501d`$uQa=nm&l< z5)Z~RK-NbxrwGBmAJZ<{WTK;mdh8s~aNIT4!CxH?;c9b;Q;S2YnjQH42gf2cI990M zu|ai??W%F=RkhPpRXQzHh4TiLIqy@c%UPAUJfULO_f_onEucT#=27e$m-*uEQr<)a_|fy9@e*i?bSCyjAZStUA{y)wm|A+AUp`Zh5M3D^a<7jY{3w z|KQ%GVt&i0&||I&Jl81SYqxT}PAkXzF=c!IUfDk1CC6OtrFz zfpq4UN#uL9$@p;Q7W7S{x20;(Vye8{RpI5YGOsX|ddI4mwJ}BBSt?|0Oo2~@@_ZVU z%RZ$X*2QGA7(3H{r81a|r3ai+TEKOs2EGknD>aC92Z8L2gomj2DeNA|qaX5_;=z&} zrpg)2ZSbQDKU#>BnxIiC^S4v6zl#d}y_N4Dq`ZJgffDZw+89I{+VA={N0dQ$PB*AyT28~6vX?%*~Tv2_yrdyCM*iqYa=VIfm-rhOS?lPvq<>VPKzm!ik(Nr2a8PQ5tCAyploS!HgosGRMt|k_0I3KEr1$^noj~4u> zCRPgRvy6CiCB@n*A=X)Ov7U;J4N!D!xT50X6d9MQ$oO1E#Fr^Np+4BR8i+@ZlkjC6ZPUcxEAca* zcuh+)Q(TgbqLUmIndGjBBtL~Eg(x&RS|Q0v3QoyV5PPKpQ)?AKlI)*0QGRLj2^@HWQC6+=AvffG=b5qXGZQX{TIbB$+me z%CuByx}Ad4T@;kzt-y>R1!P3XKO;eYnHloUER;`HwY;+0~ACI<8vN8t5Uv`g|9p!Na1KP z0j!Jh&2yAbp1ZvBcm_mXs66vx<&mE%xBNW0qQ$rrG|Rc5S5Aeqi9;^oMrNNqj5Bm$W+a9()O|VEsX< zrQA#Gce4!$Juy@)1qFMM{d8;O2mBl{Zk zhZ=YAlWlFNY-;0VU7Iee+9Fxj*2LLnbmEVsqPes%%kvonQH$5=nv>H zd$GS2n`;M1izf}QLzy(0cpN0}=qLBZm-HTTuW_^i{&>+(PVFYywpq%u)lL?z&N6TH z(#X~zjcARMSt}<{D+5j|CzsKXZ4-ID0Jgw!xW>u$7JNk|e*)%n*x!upmD5PaXK;;} z$=JlPjrWyPh(-REgn!`_!nkOc&C55e8Tm%C@f z1_s^3@DLSz1O85ehYy|X0m06C>@MSL^XAeI^Y|La`Z=@#pQX(r|K{%j_~kyGH4yk_ z1!hyt5euyO2ln6sUJ%G4jwnch0w9Pc(}0uthm%&rel7qHaMHcZ#rUuABf-xekRi^8 z`Simgt`SR!MQDYJ#jJsVcnIcio(s`{Xi_T}0a{=NqX}Z#V!i{of;R+192Lp}P9{U_ zoJV8MT?#u1xcf=;pQF=1!{86V8e_^|v5bGV0ykGNCg5%jK=`C?B?iD79JgT~m?m?92deWkCSF^B4dBNv{MhBo1tW(w@czU|F2I&(Bz8;&h>v^m<8&0zC#P$8-wSl;y;R`Td3cHMe$K!7UUR5lKXq%v zZaKCxu@i+IU+g$i_UL;k|6Vu)XMulC^6@hldHo<7vNXK$t%{Z*>ECx34kP?9a6^njV>1R&j;G#x95O=@YYA_JVFd& zJC}OKW78j-j@Y!gN?CVo8nz4@FT%_4>TO=<_$K@Yehcrw@8Ny;2tL7&&uNb@Lf9XZ z!Gjg*&_o8&L{w$P!5e?tOe;MM;#;W+} zh?}_k-xykq3j{zkia|QIim*{l*~VU!PRbrn*@Kij9figCZIngi%qz%Sjo(JuMl}$N%8RugN0cAOm}iEb|roc!|9KMY6=_$&jBVn4iMR6TG{Dmyef(y_5kMWH@IRIE^H|MMPHAnOX0(#KMM4?RDT`b?$#A@cQw^uj8v zZ(%sui{^0;dci}ydJ(oV$wg98$E&b&^j&Fc*YTY0{uhJIA8jSO3 zG53-8-%FpIB;P)UPIm-94&lcE;$t6ix|e)=H#*2pviTkOu?+>_E^_Y846GaRWIf)l zrPS5*~#R#87+R$YELf5OJ{^U1~eJ)MoPj4fM%cG@(^!Q|w;HLLoNFIU{ON8k(@vj^@!t zRPIWGQe zXQm3CQRvZ8MM{wBKV z6f~hptRI_5jP~Ql1kTxB{OG|Cc06FKnJ67g`4ecBX`DR^_+%a4?N)>7Ue%kftImvH z92)thYDe)jq}x1+?FWOngoTp#!ggM-0@XP( zLSsh8t9?|e+D2uo#hl-uFfUi5d7T<8T2*J!t=iG-!5GaR49iujU~f>l)jcY;x~3BA zH&tTucNN>BKR^jQ!ccyHB$wnEF7>cEiYZ1I^$*0pH`6ZKq=(4!O~r}D$V7XQe7`A#q~8M zyZucmXfSuU$mRWH3b%LC$^E&stxhBN=lu*mpGcdGqn%p(xVCzXR2f=Kk&BZGTs)QU z5};hyaOJqN|ADnJnQmFia4S-}Tb0t>o0ZDCm}HMBO7dK!1kcTi_d23DuS<&cei^<{ zEILda&xkQNPu-7Udv`YdkV8Mf{7k0I_%VU@G1h?axJlNvaF4^wN;zmTS)Ojn@bp!h zSFlpOB9-Empk%LfCGp&tMDKFNqs7Geb}E+V#l-l{SCrpIMRH>*!v6t<2fV1TfWL73 zk0JuNLjh;0_Yv&w%qQ0>Bo+&p{^rpSOu>3mnO`N47Db~!;74|Vh0^@&lv&uYsSYaVx*9G%?KNz#9$l61vx4v$W2i} zzKRSARzz@=!h;hP7LuvZ&_acTRx3EHO+jIO3Jjku|L`^Pi`XaMh;#Ced=@^DPvj5s zWsj5}Yjf_Q&ik>swVWwk%`_#7GocOh}Ba0%M#M5aS{LSU>s2 zhRQcKMm}*V@{Y@q7g~%*e52eGy5*KIU9O2MvF?yRpBa znX$QTI5nHnO7745Rz7Drg^Ku22ENA8W+AkRPu6I;W!T9z!$~d~9&*m~mlOMx95dtO zkeM!f*2UOm)yOt`3`~+WNuyQvR$1nplts>U_^n3gd?`yb7%SLMeYdp`j~$Fnox~$d z8cWW_`(}LMXNZ)?cT#ApDEcgr{_!XpA*TXsIpjOYF5eY=WLpp{n}TRr7o^ClAWxQs zRkA2-lX>ApjVzq65rvy&Dm+GTUx7Dy{WthgW(Dl4#r|Dmh{tYppkCq;2B3@gjrdba znwG_P=w5}=E<7?yE>-0J6{FEs?9f!4WKr%Z^YQ?Vs)*2tibR=J5XcocTtQ=2On^DC z9uC1Jg8WtZEBpZLzo5>Wu(`62Ys5t2ae(m=jJ-HDd|uGS`G7A`_!)pd?z9cd6j?)J zp;3*tGBr3dh`9lSx-pnFFu*nt!2GVY8VIZgD$_6%))3(P;Q>Uhm*8`P4IgURB|n~P z1U8pVW^9^<7B!t~#8mo$_ho~$0lviJUkKmx>Oq5{NSkr2K^SL_eqqfCY!A-BMc)v% z$3#Lh5X56>G-F}U7z#8NRdnn|bUg>p6Y!rAaQM*5+TKZ=lh|E6i&&V=*aTyTXanBo z&)|IIZxIyXJB2>rySDgc0o*tNOB&4s1k!D&kmvLbM{jiWfLldt{A!9xo3V@=8|KL`ifVrBu*A2WL?oI+-7;lw{lW8dI{^bxwvw_Ft11A;B%nY4G-p|r2y zT!0*iU&%dqj_x$0Jy-yf$)7RaFUODN__3V!SdJgd@nd-aMAN}s{FYS!!L*bHUAmTw z!C@Nx8YjT-sQAAKLe^kV=7QC@L&$WlBShBI2OH5~HW35h0rp_A8GBTNNjn4kZH(8q zpkMA9&FA>B6+gD($F?AdhkV}C7F!9dyQu74dnkvv-256R!{34D>|=L2HoLLWK-opx z84K=a9nMZPs9m%_VPwufBZ=U`0teyH{|{78M`)8H)=bJAm=NH{abn|m3X}nDacmY~ z=;*!h4B!0}UFAE?q8{V1+le{-Gp#r-Z*o!>L zIe3ctpJolteYeXu%6<^|XSZ$wU*~A>2s{de7>V@HddRc9e%^w_2|r%;LJx^Svnb$3 zb{mQ0OpbKws}%k!ZSm?y>cDp8amE4a7(?BBsFOY2HS!YW7&adU!_E_6l>Gwy>NYQP zd<9;EH{drw)o$H5e~;sb^vx&u@n=6aG$gUGzk=t5^padI0V@6lhQ2UVh+pat#(EH2 zaD_mKfea{y8nRVmFG?p_(gYNZNo0;Q$kpePu`EWLSjoNn4d?~i$>#Qv!=6C%xPUhC zIJxvYWLN)0ni+l$si8v{YcOtrp+Wq&4~9RMFuWe+C-Rx^$T9!Lx`VICWB$rBC_d*| z7@v~Oe1ac;#E*~h<3lpZ_sRO+!;jyQW4=RXZTv3EZ^-uFpfO)1n|%q74DG{M{qi&z z8pK5~)V)%C1EBXh4r>LmwDN*%Oeb1}S?wT{MTf zEkZ9?rKiYHpCGroL6-gq!Fr8%S192!>dGZ78v2K^2IC|c`$6vb@Ev{fclZR}XWhZu z+~ayiQpGDb4v}_f6L<1q&M%kTc1mh`tfU>7i_G~iS#aLa%94#C}et zdpV`9=s1CMjG7(6qOteHSc_pi55v$R3?IIMzkm@&Mrggr8jPpV#vY?B9##N0q9{L^ z-pxiyD5mU6O0K7Dev^d!@;DjiQL@k@6;{X}?KJv`nC75c*p6q;p}x`Y}oBC-}@*I0XDFc1EO&0m9Y z+8L+(Mc~Y(ZsrV$c9h^sd--7}3>&eOnu`B9Xc0xUcsWs6i;X61bYP?(y|BO!X6VZJ07Lz#|j~RNF;ly|b$T@TJKI}7OP)~+veE!M9kfCZHU@}P_JQD4A0ySiH~WbE46O7t8>Nqdl1dy#K`20y^?Zouo_=nny0#)8N*z}N$`5`PxB zGWDQcCRuY$8)=122kg0F%NHxb*x?zJoU`@#QHLKj_)(3ONQBnC_!iI~;34eZ%cbo=B$s+v%j+e<)Sn@KGVL?oiMgHa z2sMx9`46KURWr(6Rpx%GFb`3=d6Y^m5>#Tr9*ohsDjZ#`g3;B=vuswbCBOe*HAz`k z^Oa$}LFv{9lxlrmDK@P5vSA0F?RS6%0T-}&oXgstc%~MxGLANgVonjtl#uorN1L?J zUp4mTDzmXwv5k`oZTRg68-L~5geu22TG_Tq%CgN+hHbvm?aGyA*Ps-%m}I*FCECwb zg8e$hIqX-g!#Tw`JgaEOKPkrXdtmiYuiRAt%#6c?4E{=0~KP8&ECH{2;G99PC z%88Q#M@zIEdu2MfDBZzZX%2x(VQoyZBl{m5+5g~}tpvwn#W~d~)~Q`FPJN1U9#W+9 zYK6P(Q5b7tLS3Iyi0j7+b^BgnXfa`~4}?VSgB6;;>oS9(uQdLcceKoXKrLJNTq2)*~-A@mk{=)Fi6 zq&I1TpcJJkSU{8_A_9sEiVD7nhz%9>+~1reklAz4@B5y6ukXEY!t-a&nOSG8wbx#2 z&t7Zx%!ElfztWQAS5^{P8&lT5ij)bcB?;7G;#n6H7ua1&2Mv{&peYi?q%1OcyF>)P zD&ZkFBqHP&i45WD0N6sipFy_eUZ6~-nlP*)wGr#1N-!hr`MFKX!N2-L|P}gyl zq#!RT8{{Wtf#@-C%_ut5?QHc3LmmPknW zRtXM2CP5LONN~i@5)#4MgK%>HD)<6&=Vx)*uQt8_2G=4T$RIUAk7i8KbMTQG_-m!o zTyv%t6CdUwv0*+E6BZ~@VPT-OM206yM0j}#kEkwT5p^XrvYCWLb(Y|$0TL8FK?0%| ziGTDK@ryYkzA+!M{Ym^|SbG50BWoG*=hk6N$RY0rgZSK&eZ2COXTLJf#8w%p@y zfxd}kT}-KX-oY8~BSG;&5)dCD{t2<-$3fqObnz)u3p5gMo*!%~+gCh!afWB&eDO%y zAnr*A#VzSww)gnXtc|rft7!8gWX^0%3evP-9g23Dx@#lm+V!YKalAHqR;9mEut_X7 z2}^aLp5rclNj!s+X9)Wwhl+P{jF^(kidVS`;#sbSc%;+^ZNxpbm$;_piA(AnaZXz+ zj%hD~GvJOmrT#9?sjTUw{ZBO^_isV^(~6jAO-!^TCYs}q=*6p$r4}}+gr6j0lW1%b zQrSj)D!PbQ1yAv;;42;#f&uqnR7?=JifQ6nsk%5<$`PkZEyW?dyV$1>7u)n11&IUC zs*&{5;5PVGY$`FALH;~sPHju-)t;E>Kuoah)Q0*4`|CBs7tkdQUE{GyIQ5Sb3`AKjK`~sLu zA!iOUCwHb6)rFYgC%xEqJ2WHd2>`q`Hm;{!?@Hy}XwV1EKuYmh6kTVOp6MGb_LmAkcnCL}J z@Vx=L)aXd=2~9k938%08(Z`eKxioPQ+a_)}ttaqh5mgZ2gvb3s(x^PZff}K3qjsPl zjx_-+hUs>2f_lss;1^3BW_~w(0lDKL)1HUYe*pf-ws~LFW`AXLNrEN{eS&C`iN4~N zRk3SlhoUajGCT+%Y|#c=w8j>#u|?}-P!$kxtx>!+j9QHWPvK&UTp2zRn={fD;l=3_xB!hqd?e3>*y^+h%!m*+^mm zBycPYy?lpK1A^8bkk%AnkSzn6Q^A^)fu3y9gXg5kfM|d%1`tI38vr`AKaI+rPSCBP zeshq0vnPX$Hc*INy0{Irnh@)?iFz_Y~Bdidm-72dJ7cgL>#pd;s_Z z4`2tFP&1$cOlpDl`4Q~-jDO5Vk2&ZuClr(cRoKTMGaHARg<)sm6En9nSvrX$e#4}d zyBCl*0N$P9+hiU!m<5al3yH%;j03=9F>7F!AZsaD255$*9IgueXcq=nV~f?f?5B~dHb8R(`p@C@iws6?H&knmtSn?yfOlzl1w4cNRon+d_mLh@ zKLMM-vtVnnt@e2vplO!GWGCC_u*q(B>LKW{Ckj*m^#HcmgVXIn(4IZiOwK`fPkPYC zRR0kFStdywtR;1IywNg)dBAvPo~_{d3r z5KG;nDoJEBfGtkV1e?Jz@Ts(+t@UVU6?T=OJ=!~wJ$Aw8dGI38)$T=UM?Inod1^0e1pQerFqDiXkJ`ipY7-XpJim(27W&if7ybeasd;GHNpJojCm{cx5{=56#ig+1OxkJria zULy-TPPX|9dK^WM!(_xSlj|O!3a}4{+RL}+sb=iLa?c@gCn#Ejv9g#BKO+BYt@{91 zIH_l8prP zdID-KRI6~HmE_#oy(dqDr9fMQF%SHX%`4D^^rt~&*LOd?y)=i7Lw$HGN>bIeHc-4U$%7>?Xwg&4wClm9j#QZ1pV4KbU* zDr~U~zgS3&%;O%V+2s8*$hW7G=T1hCiRdu_KOINBj3wV5O%|MouZ}>E;rPc;qzr;W zyE`VA7W5@X`XHqj6}Fy4SPx_u;hYWf9jL#6t+oZr@|L5+Q(zW;F_pYOpS*u8c|T99 zM@AXArxFS2v^ImfKo${N4>^sI(~|l?2jp~ze}A;mR)$Q)V-~Y_6JC4(54u3_eGdwr zf~;*{V+h&DX=a-j^%u5F8QSKe&op#kB`$K^kZGb#0munMP7E^2A|n+^>C_^sBPROXAf zF~mC8FR#u+<$BF`6D!AOaqO|i5m5pUofnCOv1ztq7$cp4_Mcn1aAW}kpar6P0%;!<;8&rxZ4yT*W*rc_)jWl(1m4>!n$n!&1 z2+|^H6VHG^k4&31$*`#`)onASsx9|m*fo)KyS7rvzK2v`;+5twNm3maONzr5Np?IW zNsgB!$>}>ua;72$=x@q$v{(_XS%-6Ye= zB-I`LrK(dYsp1qR>CU`=(m6>gIP?Aom#UKHk|ilF4WyiFD@k(gDv54`q>Nj>B)Bh< zIQPvG%M0R4yT30n9^Xl6YA~_jS>!*HLL8K5S_8(Vk>`|Sx>p7pV3St#Pb2y(8$Zb~ zIZ7oDcWOD*AKU{Z#XVHYc|=RHM}j1Jl#{YNKevoW4T<;6kvM8Gr9C@KjMo5(_L?A( zriBv0nwT)t%Mxn3Bw^m)1J)jZO~`+`0=}3|9jG!>KDLAT-i!T3Ye4GLH#M0e^4JIJ zEY8$(Jf*D3M-ogy5^oBZSk}grHu3%kZ{Gjl&HEpy#YFlvm2jVq66TvLrF_Rqi0^y} z^4lnZeg`GM?>!0dzb}E*V1oR}{gJl}*>kFKDXu!xO)#(u)Aow=19~*2Z|dSFHKMrA zg})|Ki;44fml$7@MEm+nq;H5s_(n;%U%Z6*rAVlMWhv#KB_RQgBsid*1P1nzfWXn> z$Hh6{p!MPtv|qe~&x3p76U^EJu$Fc&LGG+f=J++4?gGpEXqfi2sYD8uNfp$1MD$D*l>=k5Fci z$Vf*C33HdgP@caK>Mwp_r9ia!hLsT?YBAms8Dfga5mRI<@r>*t9#O-^J!+=7MXwUq z=sn^R{TAT)3(-7(A&T4|S=#+b({u30`dpp`{rKD&eOjVh18h`_zNtdrq+pYHY!V)C zM-9hSe4;$XJIYr~(ZL{6yrOvzXH1HCl&&i7rR#`WY;$pq?J6#DL&Yg>nmER-5c{~@ zVi)%&+b_Wb_Hiz!&D#A)QyY?!G$tlMpGKr(=+YcL>Sf`N=vf(Ecq}jX`LOmJoA{P> z60Zag@rd^pkAwhmPY4q?jO5DuwOz_o7N@ec#j$Ktu}|zQc8P<;CUG(a49-M6t40!E z12@6XbS`rV+N|A=G`Sfu(Sn!&y_%B_Hep;quX^a0i7pjtG3U*oAFxRvHt|k#5cd>! zaVcjKr*i({m{Lj{Qewm|B~ffsaimm?m`a0qR*ad*hrLr3}7B8_$_ob%7Ad*fH zr{gr~I8fypfFD+F2l|0=U=hc*f>*!|k_mL64x?R)o`Kx_j*O3;hzZagv_pMfwWtbz1Y`srK32haDR|w1^@=u%s4<$XX4PA5NFc3%-&!$0loli zVX!+2KBWeO4%A`hq2{#C_+vNxu?H~$v|C47ccmZDr5eX6ZAmP;ltN$1z~YWRjt%W_ zSQiFy4+u@bk7PLnM1v$y8K7)V3(y^djs$Z_rZ$2@1pLP&_vlcY`a>6dp=Uu_JOq>V z%f%o2(ht3eNpz`*E@jX$0z3Jmk0-WqqG{5~hQM*8p5X?tg|;T88MbH^4&nj*(F~tx zhSE(D(sU@8Nm9EG10UoBaFxJEhlV_Zq7VJhpYd@J{x}3*7>o@D(k%8>L#JepM`Ow$ z^fb{N7wpBvr2t*9MQ3M}cE^dm0DjQ{zvzH1IwS-7qXQk-zCD0xyQyFmwVQnmfEN+; zBW+=Ri|ld37#}fJF6cM{HHXv9>?@DzvFH^7jW;Y@1|VAl`dNU@xS^Mt272^GkG|;9 zhd${O3a~}*ih%y;-3ri{UK42Ka!v%#<86SOwMqT-s6#*~qpyXch@k!CH}L*=_~f=$jq%%MN^F zM>6Y1YJs+3D4=0G=#TAhLHCVxqixNRn}xgz$ckBud}O(9fRDy|i^dP|6H6Ur58J(k zc!8~keSl`k0q_!d85{wxpvQ6aI36K#q5^0Du*C^F{sfIW0panh(u#K0;cF#i#vw0& zHn?r)_s@anfhI%aukk(#=temKj)T|0>)=gr3Y-S-fV1FT@ILqmJ+AqZP{#7Skm@Wd zXhmX8uw7rkzMVi_2cp#uzaeCi%E$R3`O8+76)bkIj+kROn}U!r(exnOWd`{)nse; zpgawV)?oZzDElT`qJ=t+_C8imWcec}92xP{j#6>GD)6p_Yv#baF}zz)BWOz)bi#Fe zAgv!^GlWckG%}_TP7COfRn!c25YE~gYp;{XKLiE$pA@aZ_yw6?gO7pcN}8J;0{gJV zZfvoG9CIsq|7QARJvE`VWNoXk2Tu{89Sz~%9R6+K-;v>?JD$*wy2McG5@X5RXYg+c z!`MbN+D9*)#bfT11sA++xo8c>SIE=cS95F4?Oz01SZu-;Yw(MeMDt}usqhT!l|ML8EtK()kj7X zWVE72&;c1e&|&~}f;=K;D&Llng>S}#Ut(3l2lU(nV8(I9u-zPhGsL4*ikMC{mkI zr#A96?DJ-L_v4hn>2@K**$lokm*GY!jCqEASZ&h@ElC^XiU5` zLXQU6qdpvS_`fb%WTTfq&>wo1COdsPgld^t1?zpVZ_r`!D-kXNFS8qR2D}4 zA(Yc9r@B$-Gl*fnH+Jdb$h1csk?W4#xCexIt%n|UC6YG9AvFm}nkiFj~XqA7vM zj^_jvMSmyW2_)Cl{$|=PBtn zK2pIZP||EdCDkTcQf%WT*)~~{>?%rGyXsQLK3fv(n@F5Pdx>@EBQcJ7674ukA|0u8 zI_;5gr&AKY zuW5$(uqMXav`0)P-pp;f4Ic8H+#h)hE8z=O@P(>OIobA0#}~^p?MA@?;~OE~e%$}y$Ndj}Rm97mcVP1DUXOsz;vP6i z+yWt z<>;Gu`X&OK1co?^PoRgG0=>m6FhD$mLP3mpP>XSAU5r~uEpaW?SX@eV6sOSs;t-lI z_NNsxHbWGwN<|l4pA>tYyEzaR(#VMkKI7ViQePlzii)tq}QT>=Gj{^(A zvw+EF)HU!uM*UM3)Bah=)t01d>re)Qo=iR4=a3%OCQZdAHPEvXx+LPW(Zo(LHt|WY zr{3Z!E-{|s7~>-jF~MSAI#O&)Cx}ffP8Q3LVqqHB2J``Azyh!t90nh9935i+l!eHj zfy@a_7@wOFm!Nx7#->Kh_hC_o;~D6ZhE3wpBOL$n$0lCo?8G(6RU8sM#ipz`&Kdw1 z@X8X@i71+=Db0_QT7jNm6qv`pjo@W)8CrCp4x_yvX&N%ew`6>5Ohk=kd~?tpi~zGa zwjLZLk+}rWfjW%kekA0MZAVOWAZ-O*K^wj|K$lGHQob?qfK9?_7Va*d^q+GLTh^O6 zQ^Rm4LH8nfeLxV11Z6-)0AW=cQnd>h${;rrtff)=!9^S$9jL?1rn@G0EL?}ujkp9| zK+DebLwkP0@#L2H0lEaCiwS>mMIXBy8=Qp`S{+x6g)M4hi!6T-2I!A0d?Jeu%;E=G z2*?^lkWXd6T?JmGaTjnjbjV=+1G4fl)yQ7NL?7a^FEP=Zb3_lwx?+P)xDR#-ZA%|u zFL(5@r=K`^yYoyjCdQ3T7?Gfu$4}b}{(8Lp$!#4%R;)TU&=RY&gCE+7CnRp_phe z?t)Iy91lb%PxN#|FD5mQf&NUc0DAO5j~?_%cl78U2%>QAav%dV!O3Vu*E~A@nCIgaG_vP$iIq0E{+pFu^~I8qOvH@KsJsw`usFGHyIJ$fpUQ)kOLLq|r%K({Yy>gb->b&SpFY-oR-N{58x4^S}atIW5pWtFRoSZx*^2Oi&lmCkx91Y_Sk$ zdJ5w{wV2;M&&26GJb#c}WOhVGqxtv%zfWGoH~@+F667yM#xn3USP52vHDGPww&=6= zeH~a|hz)Ev5i^_7V{-sWOB|>Mu*H^K_91lhW^e*J?xa9&6J*vzR_Y2)BgpYtjeL#2 z#&;utoP@QY4)PpZ+}cu~(6+k)O|o2|-plqyun!ynFWay-!~@_PN0LD{z!pbvzN5qWFDVyN{8JN6ab4--iylE~Fi?P_FA)(6zH zWJq_Iw|~tbaf`Y8m*i77$?HBNtGv$q`4gP=8d;ilFUtEE@?DH}4n@z%4b*x_{h;7E z9NN7gS`A_gP<8knoqi^#(cX!2m-+kG%)-B5rhc7S{71~}KOl#BkL>1M^f<>rb%uQE zZE~5n$i_|*sBe(%o*-~u#et9FNQaQ}5*>2@>U~`2*4BUQE|jg^3sQUy#&5{J4{n1S zn!Nu_@`n>-6tAGi5%ef{CTJ^ow}*EZc=yC5`on)HT{xDkZW?uu zg}Biga`;{3vL~?0SA65SSwOo7MXN(-YcMoB{9GveW41&K-DyJ?yCKV)HiRG}8vcp! zt_bhy)FZNJT|Ia=hIb3Xp)H}(8Qwh!9c`t-Ff1^h+nXh&W6 zH-vw4__tvg=>-2C@b8ZmM$jYL(=g_fd9TJYyYQAbsRrDkCSkTfTZb_OTu0tna2#mi zq=nliuv%=9=Y}j3!%!gn!>M$|QHw~XqM$tsqbmGs!oLnRj|RwSij3CC=m`IwSVDUm z=P2@K?JX%wvCbB11&8opZ8gzDC<>l~(VeX(UkfoU{I&vZNFZ`8!{01yF_jp}XD!HB z^8Qiy#z^!SjvhntkHO@Z1Icp-koo4~BmK~$4|?>%9zBrO4K1{%ly;)mJKzcJkkS?} z*4ALOMs^WiMcxZQ8xpi(km1TQG*4wa4qJ?*7BiH*e;|F*58vn`k;sTcMiMg06BU*5 zgbd{HJ`jAQ9eVIK5cqec?vYC`<*{cvo}*Q-c3`m+XnPyVf+qlJ+XF6?g54N`-I4Fg z9NVGbbTk?rhJsvbF}=w9$(E4gPZWe8BMKRD)I5^#$TZ}nBPWB}Ky9*q?LLs^{NJ8h zL{EBZ2zw`5yr(9eJ_C&B`!Mv$^55EG+QmH}=us0rYM@63 zdQ`(6tb9OLWn^U{D+gK4*wcYphxP=MkxSR79%-@ zMqvXmDuO8oy7WR99^=omRXL|RF|T0Uszsb+;2TxYBb`{ONX%A1k2ES9sYofuw`4R* z#3E&}MFQ5-JSUbYDUEk)Pr8X>gpQ;N8p-GzK@~g#9o9v2DI*R)NMM=~&%830X%71= zYe0gS?)ftP#3nWInJNxW$aP1i33KkKqEDC7Oh>UvBW#lGM;d|O zROC4=$u2HZ#=%44>`YSH##f?kgC)u~Tq12tOSl~x*_D@4_SGcBp^gMQG?PHb&Jy4_ zK>VEY#n)-E_&9A9Z>OVTa=Ioa=kLWt9cCpm7o<=JN@H489$#eJyBt%_viJcuX+S^K zDuoT`n>75S47HdTcNd9p;rWlOjVa~C^B0^$B*-~Z0$t)Iz@?n{yH*xo*DUdIYa-rm z9mV8EbDQGXgcVK^W^s7fdW#T94 zVdUNPO+0-QX>y>>LjA#=`U7iYeBA@YhqW=@9^C)HeM(-`Vmv)-iic-IarbI3ZeIPw z)ih3=O;3pvYhoNths1$3F%G7CeCE18^5#@#OsGcQU7e{f+a6Vj2XtwgN*aHB|KP>_4<_z^Fhz>HiTfW|7vt)kA6;{M z5{tivhjYy-#8yoHF5>R%DXzXg;=+AO&VCW%Ryb#YkXJ62&|) z7i<6r*>?fl1zby@-7}Cop*As*&A0%%@wqMg8lzh_HmY8cd;^;#VUyBjnDgVWz7e+K z!Lxf^f<44B*jwy*W{fS*jIjyfUwv z-x&-B(*S42xEG*53-E{1f5;r(i2SkZmi}Z^-^Ebg6_*644_n0~_Ec zCYtD4-bUs&Jy6sO$E80i z(jOJ^iHhX_L>21+m{!aM6Y12aNhF?Uuz3fdLn`+b0q6=&?iDFGwdF^FS}Ol(mDThzc7T0u91{>VrKl>x*V2+8O}gT~Xb zOTjLZ%G0#rE^VOxfUI%2%YU@yj4COol+6<;ie6NZ=NgRvp zM?DlBJJ8)yz{g9;Of0}#Y#&vD2H zOmGXpKGK&0@LQ&7oN$Z7hVRY*J;nrqxPp`6=mrEIh8qQO-ZC1#mx1|x9Pxn+pM*-N z)_MxAGmSWyjt|UWxCNekwr5My!aX!#7MKI(7H(&=RiPcXzzI5hL%T>eH;H}NVh+wd z2V>5L!L04@d<)+9q%Zv2!Mi@ct2&Q3T)+_i6t!SrzYuIDfoGv;^0oj?p2l0_tMS|q4g%bXWVm2^i0u(@6yWNXr13Sj zZ-TeL8F0>>WIBYkA^7LJ^?8mewzx0_An=05K>ufBXYb(X?BeR?;pye=nlx?Jyk)D_ZQ8Z( z(5Z8muHAd|?A51lzy1RT4jM9a*zl2gqsELKH$H#jq$yLUO`kby_MCb17c5+~c*(Nm zPp^1p)#|nD)^FIfdCRlgw(odu*Y4-{zVPDy0|#F^boj{8S6)5-+Usw;dFrjxZ=X4P z?%fOTUA*+c{ORWhzy9{{_dm`5)jxgf z8GlRK|DV*2*iVeL$C-= zgcspP_z{kzd6LDI3Vca%CW|lON{yRnLn$L^$Ie~5_w3y_cfjDG!}CUu%bzrL`mDM0 z7cO4<^vYFh)@|6dWh=v_Hd^l6k5gEDLUD-#pRhQE<`uXFet~1)8Mp?%@#R-|$L+82 zk2~MsA>ZD+_Z?31{SQCvfc%6$3|6@)@$xOk>LI1lNuy7UH#3I2(Dgw zXaA%=gSY-ecuxZ-p#Az##LUFYVrW=tJuSH&#CN>X+6J74E(JSA*AI{<7p? zi3R?hEpX?|l|>~6)+ z`3oF;*($-qDVF6h3;{i?k3knZ+FBT}BGo#pX;51686!R8?--fjllf%vjejdYWAA^^!6hkStT%=KiIc>-`OvId&1F@-6aUT+=}dp04j&r}%Jc)q>c{c+NV(`o@K^7qi$Z z!N)^cOKbTvO|*KF-pd->!oQ*4T4OQ8x9GU^{>lo$H!U6=mv*08AvnaU;-bI$)<%## zzoNt3ieSYMzi!qZ=vep{V=Y;`zNT|h5rM}MD>|6(y*RN=)o5=g8(Z(_C(XsKAK$v_ znbjM2zw)Fp$Qt94eI*w7D+}Cwb={QwhfkvT{^c3%QavSX_Y(*%&TCu{JtKawN^x1c zpV0Ex$ZCDywoa|-v96mD-23@{byR>-le0~ z&WZ)bxOHgJfJQ0)L!V%pFE;h7=%jgNhSl&lU!GRI&}V&CT4Ql{W?}jOl~ozrY8U>V zO><*pnZN1(__$QIqQrjg<9YNK{gP1$?dGvZe)+pc>TWilUe>2ZFkTh5-l}D;E!5thXZagq zjo_O0n5x3Ry2jI@*{nTZv*<7SfRV-Pb&8I%wX-q?P1ME3WCMp=MH8F?K8DaUb6;Tb zzxD1&06TOM_PvDXxWW4goK9IIA2?kEIauPYqP3W4ikmEiI0 z!$RtMP$l4A&EkI^1`apYE*RFPc7?c7eqJ7)J|S_(RSuT#zkYG`;`y^@&c1v3#_v`M zN_PG~XMsEKAG`S^r7!NB*{6PzkIhW01ow9h&+sa6t7bQ>P<$}?QT0$FtmM@V@_&ngA?V;BD`_lZhSrTAeAscNz2RsC_XSLZ0&oz=R( zt%?ZkmS)}GGKJt{-BG?wQwY@XH%>u{M(H9>hWSCUd76c$yDDOQ(N7DvT~vbi6awQM z<#8%#A?>SjFu%Qf)!d1rhY#xCuW!GB!^Rt@VuoLo?D)60z~?8QTQaW480&g|vTaQB zBujdo_NEnz8%wo^OcnkuG7?-IR(yOg_^kQcp@pMQ0gK9?t1MQ87IC+1{Z6O^wRFdM zR)IpWM>#I)Ahlj47@=@b&;HU)A^1q;&_p5lO(m$V5STp`in6~d6crSLQtBk8c$r3{ z^-?D>ixduy7Zec}6asliAu#I-HBhTVt$B*V;*84SL4b{egI&Rt(8kdt$UtEJ{my4s z-_;(gaPiWWk3avH%An-?KVpIVADw!F-211t%*bt0K1lqn)*lb&=L8iw#c(5wEBVFC z2h|O;nCrb=ihiwa-3_ziJiFq@dAzM6<7Bam6BbG}!C0mLJx^g#IA{+y(fy_Vp{KZ_ zJIa^fTY7?@RRRY!n^VJIUej|h7q^my+g^o$r~K&u)O=7^hS5kDDjf7xRtTmj1XuL} zc$AMqVAiK{JX}a6$X8hOR|&2>x)xnPX_y9?l{CmWi7_|N$Z6WTLzf=Ca|aC@JxLwz zRf#3v|BqYX-Ummw%pcj&>g9)DjxX$;6=k_bDlLr(>4SA`9}OSO?bWa_e>o^X=Td6; zn|tXFb0Jn~tx{c}I-n@ANns$~AL?1WqY}tbJ;ApIf=zk?v+nYRMmlRtTD? z1icl4p(;U3gt_ z5SZ0@(3dK~+xi)$7%v8|D^{{{@(etwa$vE_;bX78b^e2EpM7=r$A`wlC42t+7Wn1* zyVig7&8e+(2Dh#ryiTmA_~7ES^;k8`emCVj#%Ub1)PKBupWwYG83& zPtn~#pj^S2X&`u6&p~^%r2bDSw4Bi&<(sl#?Vf(72EjzV2y>>&Vvs`6UnS_M5EzoV z1`5GNRf(z!fw{dRql`+hSs@5k34Us;r?6KE%tw`UPQ7AfHt*7TrKlq*9N(^|NpbRx zESK3bcg9_VjFKIy1%CYCZFQIB`)?OtSURRl?F44w4UGgRC)Ry@)n2@>Dim)v*LSvT z&=YJn%poXTXlNdF95C?_BZdC_S2tJKgDZW=II;#ZN6#^cbtN%Nz z5ZrF4KQ78pYc_9GMk(X`V0_^Tt&o$I;{EvInUX_eMF;Kc=61PxQ=VG8>(~XQUS);0 zWS3@vyEm=b;o_F@?W>iE2@UXcaMK+%V4dJg-F_CMN&>ItsdJvvhO!B$UTE~^rV zl35$IRQxv2z~Pc!#u@{`2|dA^mbG@psh-ypd}kP>R_h7O{fhru`>ZAyTU3G(3Wu9& znWVEqU|xcw75`HwjOIJtiXUcmkjlaQP9r^qfxvu*Ovyc{bXv`(-Sg&ef6GWWL4s=-SP z1WIoIvVlO!?LUoDDO%}uFstWwsi_c*Q8}oyoZU+OK>`#Gx9X}a6aw?SzazM;){FJM z1;6d(^gKRLWtg9NG+;XhCD-kK!$4r((JOE2qP4q@p8Nba&(kL*FC*( z?u;qY>Jws( ze4tK*xubzaQ$4{f1A#Kt+G8LH*K@d3EE6oCb=4F6R>QzTPhjrzcLYXLDIAU&M#_77 ziu+Af8EVoxUnMxM=U_go&PvrQR^}y&7ULBT=I`@#KIPp_B{1L4^NmQVQnyvl5i{2u zxTs#~v5;T6{iES$B|H8p3p{-A!~Ji+;j#Sp^%{J*Z`JH^gL`*r+oDlURz{Wb$q6y~ z0z{+O;>oDR`IhQf%uyYZcNXagt{4ew=m?C}1GPFZ$jCy^!C2!^ssnEuYB{36T6DjX zLB@5xj7|murJg*^K%i6yb}Dm!!-}`}mExjtO^kYpRMhgpGId7SRo@EpIdy!fr4X2B zoAeD)(m}KNs;Y&`!F;@69Ph@Zn@0Y6{({xpUpjgDwqg2WU{DqI}LGNzbHywew zqLDx!yjBvai#irB7&+)CF`tz-P^{2#Fc-U(zK}FuPhhO}=*L0xMuUhJdJb>Js1zA` zf^U_~pVv0(3CxB%ib)~ZqSPlO z3#)D_RG#=IV-1*h|{*t}_pIP9}*~7axty(gF)>JJC8kpO+Z?1k8 z)1z+rm>{i!`}l9Y&IXenA1L~yucN$CwEOY4rH;eH%8!o}ek!jcFb^;gD9Qf{1A#Kk z9apYbL$4R{l`&b<6POKGSrrcE#g9r+McODF4kr~IDB3F1_}hl7C?6^;mK0m|XJK+o zA$Ug}AJ!=Z=4Z+kN#|9HWpeuJ=cG`7J2}ifB%yLnyZ)1&-h1|2_4j}nf zyOl#FyZ-Ym@W)Tz-TCVC>({Pcy7=COi&t*wEO37Py!_$)dvt2sqH+D~%xdZ7Q_AV< zC>LYB?H+q%!6zLDvoSQ4(3`0KUXAV-42hPKqI^=-z~W=Q5ELnMCR)_JZxzo7_1{O zPcaZE8OTn<6r`G-!v(`Q7o#WmDOZ)@t|u@r@>3}kfrPU+P+NH1|0`YS^2`byXvnCzVBau;N+D% z){m9!EwRA=bqoA<@78A@e|Y)Q#S0fMy!ZZxH|{*pt8i%Eq%p$><@WB;wNr=o?b>zd z+Gn_);CNa@fXP)?uhkRWZCfm^3O*{!*{4}5z{RP~>RIeETm#v!C%D+I_^-9kYxD#U z@|6o1qO6%SZ!SJP5OGLcuIFGr)1znzWg%5k^U>?yQwV-~D%GNeM@;p0qgPpb1p6Dk zg34BJ+%4~^?Wb-jKQ8>bWAcg}NB?pGr|~Rcom0u)5)1rWSm2ZMCyyUH{L+E_FYeoS z@bHPZKTzk+D+l%N+M!L0W{n%xua{H5QS%OcmE{TB<2)ZtUkc*9t-fXFn-}bU{J)Z- z{5Vc6q(tdCm^YMv{A0@}Ple!3-Ewv3w2m_rg0Ck>6tQrOZ!~=M>t8Db=IxdlhHYR< z!`yj$KCn`Se1BAUT$P4hM=jcQ<_Q&uJtJm5v-|aH`b%9pIoF@?OC3?kml6y7e`JB< z`<~mjWz)tD8#Zm(w)?<|bDyYl`*|H(HEUEqr%rb5tlHW2ns(?vQEC19a=J@J1hPW# zhBAxs&r%3(O(>RNxK!*u|A0bZ-cYk}e6WvgIDFOX#w_4eU+pTYZ`nFMr*A)JZ2{Gt zg_ROBTjWk%ckEM@dExh0M^9e9^RXj>2taxV4hG%!b^!j_Bsh1c3T-dx}y}EVk)Tx_OuThJRxzl&5#@m+l z=s6Tl>Ae;m`Aj7^)u*7;Vjtgl~69rIx~K26C;z-CeG2(Nl8sl-RBJ}bhJng2=6rBk=hB}ryM&XfZDegW_zB>PVnD{@FUvG}a}`tf=U; zNFALC^T)LxMUG#@IDa1Jm09U2<2-TEIM3g^&0)(pZ_=4?G-jN){V%*#XF|B}KjaSE z_HNOc*!5dy;;zPV-l{YCN9}*-Z93DoMg0fIh9{-#%t#n7lgo=rN{-T*@vCyYd}>ru z)Hwg%G|uV&bv@&xqqE63IxXEeCG~hrTw?SlERKH(Z(^yQ;k!j!xN1& z(xU%U`M*b-b$oTAb<%Xwb&PdVbW(MW>%{29=_HQJHjPV?$J76jlctj~E=|`7*NOPg zJmYb#@LA*Q>KE@11!xa<1l|hz6s#ArA=K$;L>MJp8F4c5 zX4J=+S+Q%5?TrhG&q)v^)+b#}ew#A;#O74@wB&S7Mqy@4)}`!6IbR4fiKZkgvM1#j zl}eKVb@YqiDD(?9KsGSlv%FYtI>WPwxKM^XUAQ-i{09eUgjdrIgFT{VrE5 z29{r)diCA4Ti2Tg`8Se>4%}RM^Y^VAx6AKPhkfs^z5D%M-+k$W*oT&nCOo?GSUwUx zx@Gj&lb)yCXGg|XkG*?d^CIEpnwO7XDPQ})(SLK{E%n{bcW>Sod3?hg9sc)ky#MD+G@Z0_vd5ITsqnPY z>3uU^&eWZ?VfI12M19Vj#<_P5Ce1fnaKsQ@*tY1+5`(3?mW3{djH*`LG|@5LxYB$8F4w+% z?@fna`%N63of4h-E-eS{x$3yBa(DKKKg9AZ^Xl<_WWzTg+3 zGmfqfvkgBSks8U0Dvj=rc^vyUZdtr_!jVK`k~;a+@xhdrsT0$drdwusW+r4I*+n_s zxg*4hBvbM}N;s8369cvMOW-rcM0h!}i|LIfVK6HXZ(|Q~Uh#DJ`T`^2CXtocN#ZRH zksXt#DhNtY#Zn733T=K~X?{&XLt%MQUa_o%Tgog0%83f;*{ z8k3riH>b5^wx*p-X-jHP=!iRY>~u_LbXWA5=(Ex1qPwGeqR&V7#$1T*i@q3jDdKWi zf5??X19n%AD?tQg`PP)`#aY9JoUw<7f)ZRUirS(eckmY{q4H9ci*wz+q{4CLHW`3QxrXY#Mbzs~%Q`7`ZL;a}UoL;vFcv;XH#TsdjSWVb0% zQ_0ih)0<`t=suq{VfGR|OMUM-DRa5=>I`no|8BT^;oe2zi-9EtOM8|*H=4P^+}Ot? z+f==>Yt^GQ6V|R==eRz01G=$l)3wcC&6jSm-5R!yZc)7bqUGD2^LFjB3fWD!F57e2 zX3TDqz0uy?4u1Pi>}NR^JDqX9>+<>FY}b`;yWKrKVh@o#1zzReT|T#b-}+AtFgk1z zxIf76NK9~c2o|b7S|8RMemCMn)U;@$7|U4KW07&W@%)5}#Ga%F$v;x&pV*S>mKK-J z7#|1DWZlpHk-LDfjd+NZNM=%sspn{qfIr}3Xa~a^PC^i70osAxWW8liSeNF*+iv`YJAcjQkLW6Bq*SL(N#_u7wnpYy*Kd@uZ2^tBO?B<+>Gml?GLd zs*P$^)vm4ESa057(YUM0rrDvzxz+uoPg_uXSV!!s=Q5+8bR}&d_G-{Ix9c{88*eNgnlkkM=J2hvw@dHf!zb?g+}nPC{{4>+ zt~@MzM1SlvVlwh}^yCxzQ`cwnp4}c(K0o@xVF^kqw`1eclY1He{uiW|5GRG zO>wy<_l@8SnbzAT%) ze3j9j6~4wvCXlIWW%H^ltDmj;yUuXE*#^gr!Q-<4(@bmLyyf!N$J@SbpKWQnW7kgi zU6EGVyK(FMJuNnuZ6Dix-8<7^#lG$PT^xg*Qk>~7k^|)jPq|)o8+HGBXu9W8ug%`} zKHk33ep&v^0OjH8z%xOEN1g_M3)MZkEX*w2KEgXPDk>uyj*-QdA8U{6kAINxE=ebO z?s3x;ixc}&ebb`S(=)(KVOBwQL(bXU>x9R|_oROmJ?e7WCSW)H02lzpFw$WF;WE`| zCDz8efZt?~a^7?Q@O1?Xg{wqc#Cs$zQXg5UJWi3OB&lFES0mNt<(1{v7PJ(eDmqtu zq2zMu)v_Dqw<_*b-mSV;N^rM3(0-5s5$+D|uk z)^}B&DLI>WPSGvu;haZ$sTXqkPFy^8DeSU;zxx%3ft^=3U0ZQ|-r(fHFE^eJ-MD$~ zR_$%o9p-TQ-Ozi^_st&|KKT7`weu{{of~CujiO zz$F4m0|l#uPzWmeBPVwu_g)<*-$ab=%p<>r51&UU%NWfKRTN*wLM?+LfvQ;plowE3 z_9Uts6cnCG9fDNOU9<)UchwKj1iSd_1*x5P?L`aeDcAg#J9#cUqx&A&71ya>NyagT zW-WPme9kVUSTYZ0{-S6Qei%aCjO=h;L;Z<}R{H}#S+9S*BtDamj#ZLYNP~yWNk>Fg zXK#|^g1A~6(gWUdRSMaRvkhHC#_{NkcJgoR_fa;5g^oFisRvN)>Pp%e{{34g(Y0{N zQ-la;PY&u4+f=K&`iVc}dew(Wd&Fak8WKlng{VmHc;)FC%7p ze^Otw-+oaOK3363J&9|}_Fio!1{HRmPABrTw=2F7`;>QONu>F*LB;67m z2$@Yj!fn~FBERM=TeX~Wj~n!jl%uads9RAN^CAMs~m zlX?(bLei06NQof@O5BcYBApd3b;u)c;!iLhBx`wtAH;;=GbQSQ z3~_OdbICH|<}$Ugh!|2>O1nptX|5#)5JwdGff1xFl5YDBQi{lKxrDTj|LvWCxb_ly z?=x{_cT3-M;=EJzmQ3P;mW_quL){C&iY_A+P4#BP9-?{0n>c5p zO)==}LEM|Cu&yUAP?s!}P_*M#-wiQ>L`%?;wAGllp* zqFEc78%~_tP!Kan_*>QI)k?TkdfjRbA*CRG{z&$7w$Z0m3=c9sVgS{WZ(Mx>O{bW4 zMu9MeQl$o`Q(i0l>Fv}QYoy zU>76u$`^18G;j*1pMt_G#>PjFpR&vJDPR}89JmLTq}c+4;KdLP@C9<)|CxS*!CmXXr|cR1hV&?wu)P=fjYXF41^DQ8sTbhSbbxLG7D!U6319}l3oZgY z;M@BT0nG@$Y5}+(=e&XFD(R$qN9pFGflInTtAKE_AMoK}rAKKmIWn<~R*!!HeQ7*a zQpzxmgE=25qE(~heT~2*RJh88zMai|MWgF#&kqL!a@B>tDS)wD({hK_CV5>GA`NIMYq-4wa4dRu{xq#O zZ?uU+JFGrlxQ+Ty{)S&pRZAXGTdA4CH%YD3M1E4BDV50GwYP#=$eC%1(AIG~#}ELn zzjo6ISXgb=9Z!>&9c#A} z%KN;+lJb(T^E3rG+2J$z7g*i==Bzc1SZ7oFf%>A-Ns~%-F4>9ypp508BCe-s)WLBG zC0#D}BT#%K7B=0KwIaKvZ^%8r?H^AYpIbE}9=t*96J@rw;9o2H`s_H3N z0i~w&X3h^le1+0i>{LNxV?{4>9VU=2F?Q)`W~HXq}@3y zt+c1j>)0;GsXLn*nUg7nHP5qFQ&yMniGs;JMZumY$PsyScbz2lt4RxP5OUaO9|GXs zdqDqXy5o(T?InQe<;&&9G`pTgsVCLtG>vhRqG(-|-bemZcQ0ZInOa%o{)qIWG;xO+ zX+!>i!Mt1_*3+>?tZLHUTLu`Jq(1)#-9w(-%w%pOXBFK?){uV+)vzx`2wY+)sh-Dc z8Ovz9gKj{#0G7ij^cO5PZHKS3ram>nE<gZ=^0ni`%aB>nv0xbg1KxW_%hjow*gKv6?QHmRl?ni&)n+7eJ&skH>%|_0lSL#p0 zSC|9&dl@&88@vF90kW9#0g8lyq@Cah?0C2xMB(hcSs;KgP47ZDd)4EksF%p~nj>?+ zAmYqSWHm3W_7c2})1VDw>>gi@sh})Y2{{hDfE`PC0Xm~-Kok8XYG8kreg(x$Uw{B- z(Ze+6b(LV?Fw!Oe(76bfOE*@Df5Ssc?Zbd2-ueg+dQp4#t#q~{lRjKI#CC6$#7C*=&K2V^CEhn)cv#rCGguz zW0&abc$nX2;3TKjwi!s~Ofdcm}mtC?z4wN(6l<>0R&EHDOHF=arhD8k1RFcnPSQ%|eryt?bxy|do#brJ_ zv#NIy!fNL?2f(wN+KawGS8BPUP>@*R0S?o%i;L3r03?5TL?Z2i+V)Ts%|L#07n{0Y z##p$79K_KK@zL~47Tw>F-`!str^11!lL~O?XKNw<4oI&*2RPHit5_$F0iLDgqYbpo z!fkFawLr_aJV{Zicg~+pyo0j`HQ4H#DQEvMi38-izi|EqySxmB>6z=?5)f_oqE4Z^ zH*t^82UgV13~{4vtN;)EqFR@XT5Kl&%3nS=kWhuS4?h#EB`&%&#)~BKI-YPCq-b%Pa4-hfN6#pJuhYs^QKrubIm1@*lDdt@EpX1@U*0_#nNk$3 zZUx<^?F0KZeMtoi_Xgf8eq$GbOW0GC20SGAFx}|JaS4bgz1(jIrhyf95%2j^^9MMQJd>8CxSW$#a)o8Yo-7SURV*RGW(Hzu*+-Do zXlBe^cop-GPdme&S!weDDn%J4e5jwp8AQ2SIoh4Xel2xs+J!F`jTL>vq=H*wK01eY zhB1otai?Yu!vc0vw1C0I&Ad-Tr7TyQgWz8l(}V=x<%VC=a3k`ev+?W_jj&-p>#~wo za2d0e^$R1IC6YPdImB1kmVN^^;KPxfjH%ofFEdD=V{3g5bY}lukx0MD3moX@+LTvy zC9!EGvua0J`33fQ2sTCYoIi7X84dxd@E4gRmBT0y_lFljurTM4H%Q>aR&8`9@B6YT z0LI_a-^WdEusI#WW>pQ)c8M|Fl(>fw}RhP5K)XgQ=O<+`)z zZ^Xtsdw~H_(xM{TMsC@qd)%`fW*x`aXIktk+gaTD#VTjCyD9_EN1m2;kf*^Rg~H^G z&{M4-Bm*o~ZFP;Kr^x**S-?t}azQMmik;Ip!t?35)aJq2(q&hk!Mfd+Eq{f+Y}$`) zM4r_ACQx9T3ZDcVDk{DgbQbh1SmDB>Pt>m8)437tX3IM2h?cA0M*M{4 zUulqCCYW^9NhpN;`XO`64RkMTOQeCvl#; z?}BsK7k52mY~V~<{vKM$<8*J4Y$|@zbV_)ypsr*cKSCQMZR1+1;!z9yvpjpZ&a{Zu6L{FkRAYp`v3bzk|t)jezdH{(d?(&y3v}Dx{ik3CZ zEimPKR8xcs&WG|a=oL;Xw#eFnCFSGC9GMB41&2v+v2v?(CNwG=*(L(@Wn6OVZ_ zbhOl}OI6b?0@|yzulRT~&Ufd|se41G;h9zT>8+S^+1ltT=9(fGzbmkN{__1=C|fgZ zeu{oV6*Q-tl8X6vaHNA52dbWkKJ<91fARY|^SG|ujcoue8c%5oO=V)MYoA6&BV(24 ze3BWz%Ss&ud+)w0+FmLt`>I9E2d^PR)?hV*g@UzhctdqUI>y362O}F8y%AESExI?~^ z`bxG}qNIMrs)S!@IwXK!MDtF5%Z;VoK01vZ1DtfvV^KjfD_?95x%;hG^no zb^TVQnDMtrSEgbFO8AoL&~0>*@E8) zWOuOAkC?G4u!{%DXc5NSX@LA-U0&V<_wu~j!qkV9+bVx6j>|r2n9^{Gny)8n770KK z|Azq1tmKM#w~vX~_FTWfW2{viGnWtOTy~}4@wtAGH0g%nSRxVywhW76;;;n9E?tb*U~yo?F)S}jh%0zPArF2v^UZN8yS ztS~5ZQG}JWDm2pNg*NPIBDXvvsxLoE^*xo!8C5t%oxoG1-F_6zO5E)j%+wM2Z_Qwg zig(Osf_w0hrU~lyhQ%fE3U96 zN^Q~4dBWdZk0;#cgjF|(uvzK~caLb)vTTaY7<{>CVErj*iE`Jhg%mZixjC|=H+Nq7 z!NP;N6>1l45y6dDqoNZYgTLiRh~zAh1S18+oe~a^j|E};V9L;ehg^NyQ_FAc!%*;& ztL!bD9ZeHUR#LZ@4ir>T9h8+?J*p2^U-_CEMGumlrDkX9ia%3tAM+FLqMZnI<8=WU zE>}1apt0pvoDc6`l84XX{BBSd7O}1=E-}wj zmq|6q^VDym0VFsY5a=V5{I7Fah^bQ#djayq;w)<+=DEZj{m6@~l@~SfUl&^DZ{^V? z*VF{=9L!wd$?hQMNEhR=Ct^hVSn*MMd?Kdy<8eM?wvJcuEG)@l85WDDELqF^!KB1XaZNv`#L{7NReNGCSx8H;HjP12m zgr4NCUib(3!QE9wEQ--?)(+*}P~8@;P|r}DfWzh8GV@$qk|-Wcq6kSMov`gZmB8EU zGy4yJr31tY=Sj>Fbhbb-KM8(>4^-3@iA&NndU=lv1^gqb*LiA4AQ!6dWmii!D(5Ar zgqvmUpX zO>(I4b7qHRN?v1Jp5Tl6WAFj)CuNGqBKA(X#|y3RPw@#uj!a%a;aBrkYKpTKJXd0BcI`l<8QU6t>0osns@7B5J!dA zOd4<%?kx@|zSBjODf2IM*s(g*Q7z9Y7v*OgUZmzprq+Cn4iv^6oblb3v`<4@0W>hVqbg9mlizsb;usDX&$mq?l zr}XCjQh%h3CbJY`s!#YSsXJ|wk4WSRY~DYSp9~sqox`<;uNYQwnmB$Xqt#QO2xUgu zU+^VwQPFuY8S=|F02kx{YG3-Vj`2DCH4w`q2pzL)g`8i%<`)aG1xN zk6boC!>(mbHWcBB9LFNdDs$dknYwHt=L}oFuy=e`vB{f?+hhi-cCZ%5FOglxyh21` zDth+NH$fU&zjqDy1mJGHsEVCPOwyAPM{|D(2g}fqalhviZV^=Aj$&Sye*XoY&}L?1Z+h z@=M_s;aF*Xo|LIuxIz7nG)L>Ggj4=056X?Anxx&*wTHKe+{GyeFY%2;QF~n3??vA0 zD_HX+DYLI5bD4)VE2=Ci0tJqxL!}4cBZX!~s|kME9r-@Tw<_0apoqItp32hSSu{B|0^;kWL}T3~QB?Z$YEVUTTv& zE^`4U+Flclftxl-1p8y_Q%omg6MhrS{j z)qJAw3@lL^(|K;0QYFZ;c`e$^II(FGKNanr*Tr*ZRV&su1)y8FQMD(T`=PpuQN$y+ zsze5>kE;u87(b#6HNK42!%hkkquJF_@(B*GnJUad9&F6y72@;f4RIH;I^;TyZ#hMr zHMP#{V9>uJ8lRD~zr+Chm%KK=3e$-wR-Z;={m0~wQN4qUCElp}o{fSlSnP(++))l~ z-gEX>)&*&MW3lJ}-c$2aP!3$Ln8W**Rae}^l_!Gv`#HAZ6Vz^OH@|)I7+mSX6<@)T z-4_IQ?7;O@?rwhAoH6_imMqC>%v4NcMb=!9Eu|eOzauftTv(hbijKdX_gzqR)Lr$B zALRqfr}845?uw&$`c}*My}S!+37kUFj@f6hhfFu|)1}3B za&nwYUXwH-q)AmS9`Jf5s}|85ZNw9Vzjp%s08!6sgfm~#qWg+j07nSLjkTpqnOQZ1 zMLuMY^78!Lv?;|KwUc8D^LQ#{@FZ2XqTSO}mL%V~FGAETtF|Qb{>lX_t=V$P_30UK zJ=7}DZTww>!b7$5DwB!q^4n$mPwXgmDW*lA%@Y?42F+3>gNqOjt^En9e8t!Q~F{#@{UG703+XYi?=W`soKdfPk#gR;Nz0zsLvqINdn zN&MT21H_$S6N+CDfB4qt%gDOU&(yV)1}la98{oP2vE&cjq}M5incsQ!r?aT~@aV}P z${^XSaTbM}_NnF&g&tQ~4pAtf=Ze=+-ueJ}_o(Gg_f>BJgI!nTYe4$ic!@6aquvjZ z0cy;>ed+~xiSfGi6lg_S)Nq8ZN$sze(ru4rl=T5mLwH3=bRF-Iyw&t*#|J74khM!! zc7$K?CZ@`F<*tSqF`^ZbAkKWA$C|=n16iJG?D+S(zz=8N9pjEW_Vx zo;HJVe1DIU2)pjwFO@Kz)^J6(>@NLCek>ZxncDH5-3ku3G~jSVTI8&b)lL4)rMaoqdaZkY`{~E$-(R znqCuFh}w0Z;y!RFrs+7Kv835Fe^xEe9Io?||4y{3Oq4AOr8cJ5n_FV5 zbnu&$-zM)lP^)&9U9f@V>*R)8ti&@Fvy6m%7h%;@J>~*%5p#A2u`-*Cw#+L#m-egf zaLJ4~hswi+`Jo9Vd-DB!9P_KRmz)RGTeK6bz2v&u=*{V(F?Gk%T)rM(IC&u)0(8Tr z9nFp5q>U}Mbv~)ux)as=V;@z~2YW(HtY+es_jCzb}1 zP3@l*e52g6u-4oH+D$!`k<24A_eqOk6=Tx*f7Bnu8)t~rl(f$FOO(6u+nd>xlCZow zTMFGjr80;z=K87xq2}3rFE9Z%ZxgCtgFj5CC_J#XnJS49JPc)=_l0&5S9F~R6H_0w zPoWFq_B5TPFFGoyO#mwWj#i++g@X@^JL%ST2KhdqWb0S8F6?d6CEt&Kn)yLgff#@f zdb*fuLSWZAL~>%J?J!I~wz_E!qc=3Hrh&28cWwCq^yNTB(LcsU+xdAYd}ynW%AEPY zge-IBPMT#W^gvv|4LuHQi(IHv&3c{k;$%A}j-A_h994&y)#x!Byx*6vWcs;e7ae5! z*(}svLT$FRD8pF-lfBX)-qEJn=Emk-P9xVSW*(7wC?#3>Jlr(L( zttuz0;WSH;mekcMkVQn+HEfmC1oEot#B&d=EA0@i*iR|AD{Qhd)OdDe^i<+8`-z4Kq5nS z(ls;Xog4b)uww4wHgOU!deVLLFrcCw>fT=VA;bT4N=ZzDXY0|zo8epP-{trCf2|79 zj<`jXMrmH|%_^X4K3is~|7Z=?O_x&@a}9~&M9%h!a}fnChCH`>XI()0%F`#R8S!gd zgDaZDCfARZiT%2&JW4LQ8kYK&SlCY~$S5|mC{};Tf4v%#Gi0F#>0%1BCk~OjQOf;#G6jc*JUQRYqJ|>IF!_2dk<&?6FWJ(j2a@2`Rq6r*3 zX;pMAV$3It({4U=CwqR=lWv1-MXgVL zdCsbel)ULVHN_d6sN9|T(@EjEU8>r662VRO)PFwVt~ku*713R|ap^qbI$rft+pM!a zE`#;iW}Vy5T+5cWUabwunbojPU7ka$3LjsWeJ$NZn3)@2u=<#7?gMp`&j*65Tx#7( zfTi0Pe$P$dT8=Ktwi)<-EiqfzXWSW*{p8HYsyjJ0?Goj@9A1+V8k_UH#xFZG*Q%^E z8q7rso4l6h_Gqnlear1su@~rMKW1Azo|gUe?!^J$9Q_*>r*`FRzU)v@mJ{2vQFbLq zbLtbaBxksVkvS!IR^7hH<+)ZBZ#=}gP9<48a&rFUubStcHOvZoITbjYyX8(lK+b*H zM+Ynk4Xw9;Swv#V2ihyrVQ~WOIe8Q4Nc%-um@)vEQ|BE40SPV8;TJuL?qZV3ux8$W zK8cnGWZ&wir2$dBG@1k8-TYzP+s3DOBW)=VBD_Xh4N!qcw0*#-<6;_-ZW@$MdrZIW zuouXO_L=a(zu59;rc@lgKJ<#3#eCl*qlPjkHyKm?5vRgzst?Q-xKNKV{?M3IE(1u8 zr(R(k2uz`EWyI~}((c0tO{(bESuRi3QwjvmgRdwGp7U7M?6%w zo%~Q(plu>Q<0o+jDO0!_4vQL3-iugKAgnd&5Rlyo7UM<$7g#29iu|8v}T@+0mAzef}+_OR_Br38Py z;xQHAXdX-^FRLQ<^T;d8(mKY-%ZqkYGRO<^go@wfDXJIP9`amyQLX`bgCs5XCfQ$D z=R27!iu@&2 zX?JElA+;zEMc*I|O5b?fk-m!V?S4m|B(z(+os`3ydFLWIyeqWNiM+1uaVwehsL8Z+ z7OB2=wj_o`EFWdmkd75wXGlq*dBu@RQlzTV)0h-1pTDb%WFt*AoJwe8Ke^RRzI9RA zYe0s&6Pk_5#-~0M$w@a`cM0#4sP&29Qj$m2w$yK=m8EmTUX!L56uNs7A8UFozY{Z5 zDf9m3hOllA)lkxhKJ?5We;t_BIEx(Gd#@mu^z{sZUqYg{PooW!b~f!vDIvb8QG~LH z4dqV{4iF_&!Gj3obB^J_M#MB{r1Kr@nA=h7z>pKf+9>EVk4%MjVHC}~mk7V4zUki%Z>Ih@^@$Nhn^7GA zU8Jp5vmpzbCwmikiY6u5f&qX|{C#jaAn`8%4e7XD3U~r?GxlQmV*|q=<12FEk}Jan zS=ccd;=rMmL}()8s`3(;#c*M9!I{tt!VtX*DvryeXFz3s5_&9Sj%_2o5_UIsg0`?; z+!iuSxV?Qo5QP(P@*g;e-z*N&7&9a3uK1$W!z5YDxi^Ll-&&k;KJA` zz$%uX4+}8F!fiqUYb?pwg1&(L_y!xAowvHj7K~RPYPw24sqim8MmLl8ithm$@pi@^ zz+CV#vyIlrJ0ERM!#VH0{?Jm`5!QEUY4{tX)wHLaAJ>s^Pv}(oW6fzPm~Uuhqw$ znFh|OURM`2?ois2_Z$!x4e%XkFZ1pK>9h#7PpUihk^FJ^Vk#hc>v5E7E(+TDnsP-L zwa}M*n{)n3CN#NSeEKuEuDPtnmTpl8XM!T2rYvbt`R2;f9o1RJwL)=yU2E zrP|Gbk|z_5?{`m^*38!@ZNRygW1*~`@Qw>0(0RS`6+NYGy2=|6H$K84T6Ik+shs+y z{AW@I)vow>usx+FpL-ySvP=`U?HzfaYWv&;go_w{F`l7&)w=Bh_~xQ+`D1$dIi+F` zPWi-l%_&U{2MkdKvhf;#W4}^pmV9F4&St0=1{~@LVo6{(fSn2V&(RF9A;;tI}g#(QBB)rK*FPfQtw7IRC&9KbM+smE;kS^V9uCv-3T z>#`)e2iLwg7)vV}X}yJ-kGuD7M+P+vg$8a`*05eP__9ILS4bi`lw1bp37>~ZU8lUQ??N&` z{W`r^Wfz-kOVJlSJM#LFpPh(c8l2r03C@C^H(93t0fn^%(L%aiWq_Y4U{a>DZvpjp z@wCl>lq7Z8tQ&+8r1Jbv(Wxwtla+!y*;^|Uc#m?7)y3Rxx%%90Hb9sI7~?aDt5UyV zd8Dw2BWN1=qUQo;I<!oKx52?xo$Ti){jkjdp*-dyqpZMSbxt!!kN(K=Cynq@Oo)K zHvr63EM#|qmbeqXf&Pd57&}A%lA@1Bg7c5|GPiB;=5ZEsy(CFEjs2BbhrPfx1Q4aNki_52xdWZ#|}KWnz0V2S^k8q*fW-#0h_pK9oBq{e4lCwH%z0}K4d2=uL#z&&ddFv zU~Hb`Zk7X6AZj{x2U#Sj4LrcO#MgE4fMD)ri|1f0&url~x+|xqZ3ll}xkIIx>s9v{=iV+C`Q&u_^5YbdZ(a{E>JX4X95{ z1`(h->*xnYS@~^Ge`s#0jomi-iK2rWTxrLYvYC5G`mn6sP8pHeReeYHBdaivVu+(;g6mb*Oe(T71zSR|U-}Ze#2P$Vp}1F7On76uBWMf}2V4OgO|AP>qiCvBqc?2dl6k;Mxuj>J7=4 zGSFK5Y^$#P8vSGiTbfBHX;z5-(e3#zf=6^CD1_HZpOSTpbCYfo_X7V$j}1auF5r{{ zVze4Ew`^r{VDZwmOf@^NIYMrZdX)`HhL|jsmnalD!zBys5o5ZXX9P1cH*+lEwZ|fG zU&i~u?N|Y9LNHIle;&MSDri|lmvIet0rLmTBn ztR3krwhRl7dCY1=O9P%^6Hzz~SeBtMGn#c#zMWfEbG z(3928x8+w+9&q(|vr_r&C7h$Y$$bS`j94~TwgLL8++vIQvJARQRBbysqXD(Zy znO+zpu2nWk_`)^vLueiElXMg5G^as4BPA2B6Yh+7j5YGvz8je@c+UHmAS=0)Eer;q zcWOQtGQ!7dY-Fp8vHVvXl zX4O!O$tn9?;T&Tt%0-KQdz?c-GwsTf{j&H=Jf+W-VF5+kSxkkv;)D+RM|q{(D>VG zD&Ul&7U}`Hku+Wt@WA&oM@TQ*{}4x^MO({QbCCH9eOR+O-W4nJwj;%w4T++vLi zS;q};GM{r&O2)L|qGQTMszAX9u7`XzKNZ|7N$1VVHWi-c6edXd?rdgg7iR=lcsApW zxc=S%Oo-1lt7P8f?4OS!*YVL}5AAB@WO=A+seB1LQT9Z-3h&rS3Kz)uv8Q>sL>Ba%Geb1!K8P$7rKhO_&i)lBdFMy+2tD88Ut zP?CpUmuU*C$))1%yw|Bm1&=iAqA&4Wl$Q>_V%N#bT&J-7Wm~QLnO~*->-^v{ncmDv zbayyadskaj&lcWS9jZBi49HGZd?kv+mrHM^>=FzVHAnJ!D+&z!rR*eaj|+zV)kIs( zV#4YNt5e`fGSBG}T0JzNnVzTD4hiO|#4R`B8M1qg%W`|gL$xKz{(`Qmz2O?}?{cy) z&fZ$;<#ZUUDVerI$TTgSH15?LEn!TBsXkzQ!Du;{Ns?_Z(aCaV7Z)7KUPLEoO|rjd zJ19qT#u9hQ-V$aXZI?_XCU|uUlgY*omi!4+viV|eB#0R_^E`3id_`F=afW2L*pV29 zTjpzt?Z5<0JZW9#X{9+y8{aLnBL{^>ijPp-JyAg?wPf!`o+Hp?=EuPp90L}2623F< zK-mhKLY!HopwY38ypOa5Dy%+DOUiIkfV7;rP^pA=A!L!L32;3WE?7W!vER()K$ABs z*=&e`-De}}#`u*ccsBM_l<7H%qF77|!iNU`=5=1NLX0Vt5VN^ZyOia8>2 zV;%_FH||wB#qA~UG;@os4aW?fvB?ED#}617u@YEslwV3(1RHp73s>;&GCpVnxC}y- zY5~VTC0N$S-WVkr-%s>B3=8hE%3Tlg%vsrc&a(xqUmLnuncSc`-?2qlj)Gj0BlG4S zE_f)(gSKl8L@#n4EBl1L$$%`CenQka z6^he@_G@afdE(=`eT*U4RccnkEB=j7E9fgcM!T=+$-9u5qm0nR#Q&ClP|ZBLMs!oL z%x4n6U6$o|gY#4>-|36bmTg!Sfu4}cr`v(wA)z><fv$hLa6>6dxu{sh(uf0c4;hm z+Md568kM(!C4eDI{Vw4|v{S7lKar!O#Q;e;JXB__5fHBmaDu5Hv8$zV!+=n9%5(c`ffA9UKn1d;=X6;=+|=Y zq6z_AQ;sz--77fg5M@<~BlAOgQ2~+Z5^tm_Mk zOt$Fl-2}sO-s6-)O+9Z*)Kuka?!&EW*;w8jFt@bnZF2n{Y&{wb-8 z?O_g!wM~%N{8tyi{8)cf6HDaOM5@wDUR0MW>asobpzLqr4D}c3zOW9(Zpo1?0n)`1 z)I%wJC+(Y0<1dkm$4)_#APoAnWrXP(SXSR-gzq-IHcj=EE2 z3i+s*tt9&uNG>QNRx5-|6*$)w)yNKxItUZNC%otu*M@QQGxaxWD{&iZ0xY)*Y1QE- z?yh?MHe+mTiCSaW8+2FxUT^Z5Ara|+uDUMt&~KgXj4qM1j_hV$V}P8lmcl)Y0I!Ds zTD>r>HE~Vb^WRj*)E`eDrT3}DM0cv8n!z1oX1sR0S+bafvEUeFUd76QF^$Cf03QykGS2SBo@ zHFp6~;^^wnz>jbbgCpItWk4ff{8_tMxeUs1StbLyPIj4+xkx&@uX{Gs1#H*rfoV61O(-8{G+~p#8KpAMq@vl_wY?7cy^3&^rc=yvY%-?t;V%`~tarwb+ItOm9 zZ>oyI{j@qw_7`oQcSbT+>}Gp~pU8@YfzF$<1>~;w#gcpF-ei+)veqxph zH$-PusRiH;t+rM$chhOr7y-}igbXhtIv*03NQq+|xo;pmw7j!T{fCs-_ED8k*4X%2 z(Ux0PtCz1yp_+Z92cy1L`AAL$&ed*}cx?<)swIY1zS3W^gR_r_?n|9V8QJ^5^Wd}2 zDx))TX4_SRYiU&DDV=-H`q~mrQSun`Xw|;RV#7bBavQAqs~GSWDua~P6~R)y>XK8I zs7MTrq_M6sQW)&cHtS2gwe68*fANvV3nponwzj}nm6%}qW;h;RZ+NaZ22^Qo>o>1U zQ9A42Ek&h;+GEoUbfyVxW_;dIL2ae;vlpN@8 zCQQybz2_@|opPmRHE~L`UHw6l-Hv-T3FH``G1ZyW4Q@hxC*952ta-<}GWMh54LlC8 zKm3yX5tp<71Nn0C-LA{zrtFJ*9Le{R4-8$hI!6uEJ)~R?JZqs*uWy=RgaH1kySfu# zh4W_h6^^gX68UD>omO~wDSai@vVSpfw&+LaZy+=4X1gyClGN6O1-3>$ud@N#w;wY% z(MvaaR5dext#a2sfUeGYsyf1B*rZ4s;ArZeLv#qnoZ45(d|UXn)0-KTd8myD4kR)g zo51FXu3BI4-ZqWt0W)obm*Ec7xf0a;Lki~blzn`?4Jug*V<>MAKIKfPe9?P>?NKnW zmyPVqXlOmgI-HQ$@P)M{oMWZ4)^9C0&0@jcn+%hYniY37%ebrNcq>i`IX1nbqp*ZB z^jBO?dZ|`8y$amwY!L|Ufi4U4h_4wGs3)U-f?aQ%&cZ|2G)JiS8~5BuU9kp z(pk3@4q|xha)AkAk+=1|k@S@R?ztt#<#l%mMXS@dx11I(j6GNXNw6g3X$^_rzNNi- zBEQZH)cp`NEL*M`6w7CxmkY#mN7bWl;8oI+z82NWvS&R*^YiYS4tLqVG}o3~X?u*e zo+lv%n`<1zcQ@}cn#G4b7wQnnfNQUcD&I2wg4{uPd}J=?7bBE7v5%{NU3#J?O*b)@ zzUQ09J>^HsVpU6YLj5*nNKl03oI>gQ#h9cJd2n?bRSOnhR;^MsOiPuW6*vzsXHNzO z@elfFmhcj|XQwGNXX&07#)xET%M?R%)YE!by?0>0rCDe3@iT7HPhL&Xx#-Im+N)et z6Q@j&o#8zmHVhsBhT&@aaEO;Kc3{bY;t_T3hl`RB$X z#zp3xZq+)6s>kzD)j~zG{VG`*=hLuZ;1poko8N>CY|ou)!T|2}8BZdgFr_z_w3fKM zE|K(>6t8F_Tgj!+ZVHB?FYBO2QTHW}qh$i4{U-vq=r`u_n1w9dtM|Ciw47TSd_Aq{ z)EYto?N2w6xC-#IvWWixu6!)%Jn#}6AUDx>m6lM%^v8)`sYZr!OC&H7d^ooOoQvFh z@epf99B#;QI2L$f4L%lr*C{8s!v&V3#2L_QX(@3K;xPoI*HA!-7x@M>Kj97KDYS93 zj19Oga+4sZ*e@GBXr#w(E+yrQyy085h1YiHp~Br}a~@x`L? z!Z(Br!FE~+F&&i`N=T`^nQ;%vc+N4uSV|MebM9|iJ&*e+y5d5$>5^^bC4=^m0`ovy z+PV^ZT~%vP;;zWA^IP%9q$!kGLZ9eoeh0Bra5FZ7bOgQUbDw;Jx8K=@nuHEK@T&-E zIDP(7Ws>!6-%1S5bhl|AHoq!PHxrktJ;B?I->%XVe-k|AoZSNA9Lf3UO43BpmW|Iz z9|Y}AUF04?$lc!+YxizEE2v!DYTEY-Gr!?-Lj`uMm8(99{bX9j9>iTT1mREOJ2dzl z4uPk1jA|ujNZ)T5O&TY$onAz|BMiNLy<+>pF{e{17xc9Cm@xl!%&J?6xz#dVS%Ph? z8)R8PwroHcY;9o|xXE%eHentaaFm9SZxIXP;`@6Nmq zS1!NWbL?Z~*>k`4+G6sLe>G#VwuiJ5J=WU0m~j&4(~()m!JTbBn-+oJQa>y>4bQHz zThonCt~xvMH1;~D>EV7_2)`=fE`ELcd>WIGTkTA<5*tMsv^S*Nz<)pp zWlqsT-~=@(KAKLTUGv+@P|;sGdqUTcg!}E3LCUua@l+RT;=!-f2ws=XoG*ob1bpM{&g8RO?zWTr;brGiDWjni2mVk( zp^WBuiX3v#vnfxR=lQd!K}`J+1?MCa%-7SxnUYvn+AroipM$_>XwZ2D7|VHo+f3TS zC!Yx?+oECnUXinTQySyRz1+!KBV`iDk(W%Nu{V>%)DZ|JFOVu?y^Wbk^JD3K>;P9} zn)4FI3f}aaJmMw!vs0T%tE7WHk4ZxDV0|{}ttddR;73HLD%Aw_RyqsO=)6pf@vx%z=g(vKYQf+^ig7{nYt9I5qv=22D&CP%R;H__q^FQ_8kq1jHf6RYi z2i-sUWRjoy5j>S-RZhb+kY~w~vPO|r;%^bH6c^#S^=~LOg8mtMsdEIh%X0~awz>Uv zgilQ)_lzZOsqHe+iG1^G$wlIIqdj$0o`N=ID$&S$aqcd0^wHeDEyNXlpPGw^Aw664mx)CkD+K=$nJqT7@x;CL z>BWu2*OtpE>q)bXcYJXvyEPIgR)vr6$NREFuSuZ5%C{$$ zFwbM>clR^Ha3ytjz)yIq`ZTB_eB}&j#3U~w3Wk!UyE$MAWguDx*3zmr5t;e)KeL~) zeAvsb7?=~trej`U6UDjn61bgWwf+EyQC*ea7=6?(b|6DTizQ5C@PVnh-i&JC&CW{3 zOU9IqR!|E5n7t4B$0@jEWqf9)9ofRDVY+nOWyFB5Yi2O!fJYSW^jDynRZqVP8gW(h z%V1abclsOfcT_rKIa9si0pkcfVzz{NhO4+xOCRKUANHdk;BITbOeb-I%=73WY?>^B z?u_(8@8}Z{C+sBpM3yA0ioSxiB{Gy=#`4=RkNy*xHM;Mk1zk8R_y*Zm^hcHBF(-|%x z(QZ318%R@qZ#Do672>Mlv_Tn36hJ#C$zaT&^@=#thtpXMf=mzGak zFP^w!S)q*F*iTe?+OG zUe;VJUPRriyqZ!;ZIt^3&!g5!hkN{{vLz)BD=2$W^RXacZl`_cK3ad<@md>NOw&$P z0&PrP1cyp(xA>BBsbr(P;3G9eKRPLlxT24>gT(SCm+<# zn6QS}&sHCv0X#eH(2fU!j;c+yGZ> z-Tj}EZ&|`uh)MVK7sp*C$XWkR=W;VD=k0&NNyp^0VA)aFgT^w1hWjT8WVI3^nF%aA zqOtNWOd?OoJPgmINFq)_pJ+wid*DEZ!z?XgX1_YgicUBMD@)LCsQ9 zHj2pbJ<2^s(~!!hs7Qeh(XbgMPzF#LZi3wDm)Bo~Dw$(vg|JGvQ;yfLJsFKXi;*OT zp`n?DVaRmH;lm7(-~c>{A)!x(AVz1|2gru;bJtR46IdF?Vd9t}>xVJT@Pt{zV1M4y zqx+F4&eSeX7K5Eu*A80{v*s4`9kD^5Kq0J3S|al(Yiwy6GYIZZy9j=UjiD9b0r=TE zFYpes$f*aKkFMxH&60>zdw0P7!fn=*&=dX()gNd*+QFN~6!Dmp2Bs|+F1`WsIi^$^ zxPkpGBo7?NmUxlDS)3pzJaZC%=AnL;t;%nY2fRTMW-&mivS7tEW~&5Xe`Jmj?IkHd zjBs(`9mZ#VM{*lOj#7heF=Bb*weJ|4d5>mnVjSfE>$?n_jP`AdpgVe!DIXfCxgb+A z!&SwsdQheqM@VG+m43=^V3deIC0ZH7MVohwq?-gU);y+13&&11)2H&Q_qV~kx(zMk zp~jkt#yDnI^+^c>{AM@@@jy52Y1|fuK<%_!NB^Qg;`h-jWeM8@fbSBC`+Fc?a%}QU znip?VZ!N58>unkanVSX;eoR@tlPCx5uR*~q#>?sf%uI%-VP6i0j%cf5^}rX^zpd^- zyyE$)E*he^HE{%m%URSdf}izXs=p51=;UaBGn?8M2pqvf%~R>47$@rfmbcLdYhpA1 z&{tO9j-CwA3k@FUeoN#P-d|+uY<(RhBb|mo@eC*%`k*)&YZV=9^ z?5&x}S70Y9f1rW5Xzo7lAijap!nsQvS2Bxzi6lz>jC`ZGhmJymXzRUxBg+}fozgkO zIHCi1p^zBZdQ0F!{A3PAYe{B>J1?Ic#{R)wN%@a#!Gbo39>~zm zRdNE0&v+iRAHE9y^;`w>;W;yjtWI7{&kg=r#Ib2PTERlAxIA0da0#1p8I8%EbALMIT;o9J)us(8v^Jc)`*^LPncoEw_PzV*V-8>|a4JTzrGbHAhbdE(;^7Oh0 zp0Bh=tKwXgj20N#IuXo}B00jb7&}%n|5)xKI2kp@-Gvyu-fe%GJv`UdgUnUvFvkSu zHi2u$3UrRRC9r)IYk_Rmpln6?6ZoklFMBL>U34VoKJ$&RXsau8 zjDX_y0`wOKOtCQZXkhzH)Wrf=!nj@42b6e@o8c)JhrG~*QxjP-b!X{)xI$TwX$!^6 zeRuw5CP{Jr1z?h7<;qu#1nErsm4KG>snr>EYm%5ExlQ$f@=A_f&2x4U(q=kK-o^^9 zYAQYnPuD$7|HOQy@r!%~-cn85oWST)h?m#ViHh^%S5j{yubQW!6`g*@q5tG|s&ory zR zJE|6sjVAvGRdn!O5q5T zqXdOMDZ)ikNX(rjcnpP5Z}OKz6U)Bx>Y))?P29DRQ_Ow#O9;QU1Zjgq-3M785t3sW zLg70!Et8()y)#CMAMqy2Si;BL73^feDo!EAd8o45OQX0y*vm5)a~R0!XfE3esR`JH z3`btOuV%S(S{z5SiupGiVx%FGZbN}MTbwB22(yI)Ltc2Jpp!IbhS8h zC8dQSoDZU3Y3tcp!iI>u$S^_M=8>>b;I)DRVT7;je=q~N1glhXulhfYO7z%Z5@-Y` zb!)&ZbWlBro64K3?9Wf;0P?FTVaN-aUHE8LxunfE5c(+|SVmxqq=NBn3=j4eOOxb9 zU6ZO+bfe}X+9WWUp3qCtBgQqDY2532=I%t!BJGl-Z3s#AJ>(xepbXoz9@?cKyRHU% z6nAWI139cXQ;*cC?VX}Q^rN|sD-tv{#L;%3owWhwkGM@1&z$M(=hf`^_lR@V>>w7* z(C_w!m{)a&7sWH4s@{!Fr(S{Tji;o=`xeTMit4ZHvHn_JX0?9B!Y(|S{4DnO+T0sc8FJJv0MdQ*(2`crU9@rf3~jF#=E$?@kTEZWmTi3kO<(>@RN^C^-0(IxSQb{QwDhMDAhbeyMx)MvQ?dDiuscjp3FRkQ8t3XJR5s(4~;g&}}svUbSM7Q^B4vMalV#`c`8!4V<@%ER`!KjF&4%*loZsX(W3# zh9;hg@bZd<&WK0KNd78hbhs-IgDmtt&$))2Ua^VY!cCpx&%TL{uG**Z5bcm@l&wN< z4qI*~aHY+ZT;wmT(1?WS{9K7Zz)MZ?7~%#U4JC1}aVb7QoWrab}Qk`<{>ky0eHl}}1e3y;hHWFF(U$+F@KcqYl< zj_aI$iM{s)^*4&12>~s# z>kdCfEsVkQe3X~B-{S-;_O3gQge#6N+yJL3K8+p2SOpcSVD-DE>-=p>j|K;Dgehdto!FVg>_2TH9vZ2BhhozVL$^uRn%x! zcItSQ%A`G&^bNAO)*YC7@#UttypKYkddd(z<8$rWNN;X+4dNfk1}(BRHLQ^84(EF2 zHCf)s%QXL?3AV^`wEUJNuzG*RFZK?D7PEwE&|bpESG-pLhg0s3RS*cHl0&6`h;?CR z@fkAeyHj|MX1hFEum@aW-zF;K?$Ay!zs2tqJuGk`fU2ck=r>l0{c^sJ^FifqB7i0Q z*Hz_U81sNG1YAX&qUM1MOHvglL6^*bvK?S@{1)+b@ObbDVKq~>(UZ@Gr@8(_=dq7X z{D^MmoKWnke!yOd<`^y_bwe{~6|w-2sP3}5imoagSTPw)shG7g_MX^@wQk2L!Aq8L zgAaNIX?5Msi{<%F?BRYJx^JFcohO*XJ!FXId(tu51!xHNges9oDYTPwxSi?!(ve)Z zm<1w;b2o6AAc*sJ{ZVuYw|Vg%E?1B_zK%12y-}*H9w%GHan}ElyrQ*hPKm23e<**6 zO7d6B=L-W;pGzb|)P?P$@%%m8lKDsZv~~aSID+{LRh)z3p^=`|%UUYFYkaHeLkjh$ z)MKb)G!$iMMWE6m@7j%(^~)BgERigiyo_WCwc=+1HT+2Y%97;beR*1N!H$j9wYzphQgUyf0!GKqx14*5QEnYXJngf@NgY4KC=%=nR#7UZn( zTw^hQH7l$3G5$2w*|LFf`mU5`Z4Q z*hcgn8nk;Tc0@V^!iK$+_3(_^g_I$u-HfHQm)|h1q}uO(tb0TyrLIyxq`B^#rFaKS z+*U60qZhARBklpK7Db6BArW>5g&aiB4{jL7$Y&n1mN0@yk*58OoMCMxyfRIM z&z1Zz9D?cDf3*3qe^RC@6Ap@~kne`s0kb3rSQ|ZKMQf41g(C&YXr&z!H6S>yr0zAk zh5o80f``S&RP(uY#Yu*Z+%Z{kng^Wngg)gJ&Z4j@vdbKYEh5QW4%Oq8kjp*40K=CH z{cLNwC~Gaps}2!A0ZJ{OL}#!))o#M}!Z!VF!M=qz875);LPYv6;%@ zVo7kJ^owY~cddAlc!IlBkR_>e4nh~omW&E#%?1^$`E~vV8YRgh(wQp^##YUVAplX3 zdP!QM`kGP~-K6ML;CIwYweq%2DWb#j$Ezg#m&$}$FL-nbcjPQ6h%pm_>Y{4+qy~%1 zTwZqF*i@a6+os=GMN7e`d-VNLoeGYQyImno(LUcWSyZZ%FTcwNwBKf2;(iffhOY+q z02ja)b);qt(ZSN%XjAHMY^k&6IOsyaX7nv>V$BLGkdYA6z zyJ#Dyedd-3n8SwAHNY^Kxp!H`S<20}X_YmYn8s%quyAhOd@MENi6tG!jz4L9fqxXX zNlzhCwv5yikpYj{Njp=MgGUy5aNto zW;2&~HcnuiO1d2Cplhbg^82pVP#>@HRve=9=3SHBXSvxlNjhLIle$Mo{z+B>y`zv=gyrgvEhR@M*biS(p}s3a*yNZG>NziN?hxblU#Z8_@A=w|QZis|Ur6-T6Fg_~y4LCU+y8HNP(F} z!hfRsBgY`+3_HrU)@RxSm2(>RXx0@BuMJmq?IM}+%Cxw9RWik_&;vSKd7S?i6)d0N z#gK1REMDp(nWQ8;4hrc)&*39r1JF!*(0bRDU0&U2HMZsz)^4gAop#-vu4lw9s>0}; zgFk8?X)`v*sdj2h)<($3>2@uK#23`v4*P}c_@joL!9HLZ5!3p*{%zUD#=6=MyT{bJ zTSuktHiudYqid=X%~OL?v8mEEMXg0sA_L!lr;5Apbc z_R34;hk86P>G_X3^q999X|1W)q4bExnYgNm^4j_MXWNYC4Mg0ADOEjW?uzp|geIGH zQ$vPVk8YBmVls(i_g}}qDtpx(L-5S|u&0{<>`H3E6Yb&;H>@Vsg{N3IlIpk0O|j&k z-Y$kq)CVismvz?D*X4e0 zA5OPP^KUvxcZfynFm$)j6&8Tr=3i;lG8pRu^plz6mMPSI@KdKE<$845==Y*JW-CtH z3q$uxy!L*FDs$enZH8=8S2g}%-iaxwH8T%}*qWOl+bywGC!t!eP~9f@@6xBL$Lubr z{}kQ=n=!+MYnl784L$ET+Tvw_y4gPX4!oB9DOt?*7{YvJ!u|@wy2D{@lL5eb$cEthZ;>rE8 z>AaR9zdINhR_@n*vPzc6?r<|Wrr&JI(OKgzG|bdu!y0N1Xs`kQst;(kd%x44)HyUyCWJGsN&@-xla5@1e<71n<@EeVaUQC7$L zORH7YruDn@mg@8sl%c!Oe&+&(Rpv8(n8bvf{(n_J`i@;tKJ79dH=?4g|1<6lrfAOy z{5kCV>PLhgJSZMdY$kjI)TCY#smMgWLw*#$hw4o&^-HDw07~Xi!B^0;2ahY+#F~p` z7%{2v&{u3NIiPJCu7NyY9F6a$GzjAe$Ei6qN8(GGcVRer5->JSM9HWB=PRZ;Fer0y z3^6P9-tmg@;Og_~mFvMpeQz-s(79zPRtioqtj8T-{Ns1vAA=()CgKcmR)H-k7z~Of zldHf+p9@q^rgBahJqS5^M^V65Jh=OS%ph`#4fk;X`u@fJvN5x6(@0Qu67EWuL`YdmAc}MNSP)l^TIW zvkUWxKbpG?H;30u#Nl^yckhlNv~U8V(@9gQ7a#mI*_+0=L3%{OM0?9**Haky-u z`h0g-xly^T_E^OW`6$&C%qqz~l7Tx!Q;R4hecf=hVha&d?Z=9lvx=R zEU)J3my&Tci;huCk?PlbpO()wAT==+8CsECTUnzL!+gwr`BSVt&RH6mm57fNeTw)- z;0O+{A0%4&Hl zVEHQ7j6__kd`rqx>^nJGCg*>9!Ot_o2UL7>VluDXkPmp-yokdnTvPivCq2~f9gNnS6k|J zfYSW3jMM#}A-LSKXOsY2(cScchOInU7hf_SbJ%=4MTRw2Jqp6$5_BIj)JVXBYT+Ds8{f$V{-LlM+J>(7L|9V}>`pVvh+2lXiAk7C#8tx#i)v|D=OQn+Php zrgIr_3%%DGLA*}Cp^P9E(|;o-@@$4HK9~H0k(VQ;bTf`couRgYSsUKczA;U+su&m8 ztV9@f#QNZ^2Spmk?*sTfFkbwv%Q#S>K%Psv0cg)Er)Sp*&pLH{8s5CaWH;B zynykCuveH@;Ynok4`hrb<)HrIGs&skuj{^2GP&HDzSNKCl+#wsmg-ac9k4Ej_f2^? zd+k?!H}0r9UGNfLtT+u=2}@<=rC$hNC9Y`$#6u#N&;XK35bODqoXS^CJ4yb_pLQ}8 zGopdha|3g}c3gu8w#uBZW#U4NOVMWBC*4CT9&b@UD!xX@ReVhON1P{12!@EaC8O3l zkP^jnrbLkzp!UaCSHADib=6{OTZy%Qu-T1n>LA>IwL#oMoW>kS-iY5^wZBl0|EOD) zbeAAj+wZ^=7bt>Oe;~%oN%lU3I?k^nKQMFp*6vNloa({WD6p6gRB;dcw{!{MvSwkf)pAwwbU^GkZKApUPf(_zb4vEz%oHr^ zz;oFl?2qmT@L62ao^wMM|GAd+xzF)F^;hHU@CxgSfI@taIef(p{5t)Qaa(a)S^Be0 z^s3UXgTv{x@`Sc@dTQk~(;E7ak|KRVUys`f9ifNgpJFG_8AL%=(@^$;dt@8~M|Jex z2l4=&QwIErRe!n_Sc{K3Un#=XuzA~B$*8OlWmy}Kq2{0B^PL>+GWPl z?P-f6R?@8iy8aHMj-hv&2APl_CmX3BXdm|3)5Zd>O=Q}9Am4zYZ2+vIa9RxTmVu@5 z>3$V6XbD@fxF=J^`q!#n5{F(4=>I#JeIZ(NVJ)K-E`$9C48zmnK`pMr! zf0JmGox;c+EXq;->oxDG%lO9}NK`g@tIw6>YrWCRB;n1+t1pmRj2h`j(slhl_yg&y z<|-Z{FH?EuwUZ0vLnuA+UMYV2DawCh&FbM47jeZTTXGK<-aneOycKHRMT%;?TUAS{ zsB;jXAfXm5^B_rIJrf&GI;MY<%O-u%T!|x+7pWF+?IVZD->$kwo-5x!VIpY}o8EJi z6y4L+xPX+mm!aQD!nLgw7LdqIYZ&pQ$~w1-cO-@d&2}J(s>ervB~=?7{HKx>+8ZmJ zNfXrX#$gD@SqHmXNTwsV>TOAigEO?-NwnS#{1j5r-UEOiDYVVI>^v!;$vxu@XdI%nKL2uS{+C9o?lU{5ksgWp-tp$%$dqVQTcR-ZqKPJj(pOMd6%dYD4WDZix z+De%`>IHKTb0*DGK?4uagdA6J7wsc?Hs}iE6v@C*z>k!4#y@&Ta1gkFalvyoIKf(b_=9E%^C#HS-AfT(2MaAL`V^VASz8Rh?r5auX#T^xqsl%%C^3kKy;w>Fjy= z7IdaPLK#Zmd|D^1=!M6m3SahOvp(C76|XeJ_05Rz^&bY9iQR$VCa4LWN%J{Cm_o>tl7_xBS z_q5;b?F0iYrMa)*E%knbPs%B3Vy$ghAmyQD|Hk)}ji%(q6{P3t#xXI3d(5w0#VEF< zs-c{hTjpyJb0f+JB;z~0;{RP zflY7#FwMgaCNWMro<@#xR_xh77iG<+EOK+A%@AZg`^P&jKK>p8QRRTJ}p8N?cbFMvN;{q93j65C_iTF4(A+w>V} z7kxB-XWbC)myd=&3K;AjcmaPmB@T)}BTG}5R$gw#U#1;b8ND2oa)>prtSRvpy6XHC$PMepEQ+U1ZQ@>7o`crxP^PYXjq zjqG>Y2*wNP>WD1H4)HO+)$}^i{bkpI9}+ja7c?c(V|~ZESzD!f3qP~m6TF5VnZ|<} z=C`T>+)D7T?qvRU&|OoIJjf_exre3GyA=68uD~~WoU4TPRes!d2IUrf)pDKnwQZv6 zEc~hIKH3Z2syEVen76Eo%8%d)vvBta##7^+#9GD(LsIY;`Wjv31`r6+)+{3bl7yu*JXz$!EAkE;gsrHzR7+?{GGoI0(UWfbz7e)mm4&bpZ{;VC$ zyDNXge^~)jo*)H0u0Y&YU#X^nz<_fA~?F3*rf% zjrhunfB$L+1 zsS;1DoW=GN9?pG%I0(#1;qU;zJ~R&c#vi`v3N!+Jur!7Ps(TRm)gpZfuns=`H(>?sKUhQljb3vS%$*9gZVGZxvs6NSG((jowp0 znLKLI1jYt=|Cp<^G$>f}l8EFrunQ&Xoci>LYlmJ6c3=tR@Cv9)6*s?`PVqR zs(e)QD+gs)6|=F^xu|RmZX2MGti|ud2t=8L-FaPtW5nu|LcSMyd^nAFpVI34h`Wb& zXL&C-5X_zAh!$`|^*ZHh;&tg7xd(~DekpY!ucZDJCy-B9jui4K1-t$EKd2tbj%Yc} zH7t@2{$g`kH|$q%G@Or`t#T>+On6PIfNNo@m+E7NoO7^KB8}=>s*$pm;k+W+FpLGdM z7_VS?v)vSDWkd-Z^_H;3m5go?U6h8qDQFRf6}~~Q3Ve5E^49WmVn`e#+7;-|_C^cV zr?8%)mlhSlw}f|WG0ZQl$+EjLUv)e;S+Yra33wx#tJs0H6Ks>6E|`Jtl7^*8xjmAJ zJDWL9qQBe95R)k1tDdz|bigGQdMNoe#>99IEtQUx%`uj;VaY@TZHRI9M2A*-@c(G) z^VXxbsxv9=+!*EB$P;X<{6+wXILT+OwZM?PVZIIXqr7XBJKY%s#ZEGpx*067#IEKl zWuowkSyH})f3G?t*M)bzYGaa^Yo{*@m$3u1|F$e;>9yq5|DeZOtn)1JkIZJ|M4E^( zN$4i?YcoMTlBq4jNZW)b8?#DN`G@O1XGijCt(t_roHLd)p*6@`v%zmFYlV4)n+^)9 zx<9J`94GM_?nCtjZpg0~$Ca!>J@nMlI1T!q~3M zlWBaUQ*)bknzm521sI1JDgOdQ=U4?`OPRzX)B-G%fnd z3q%BVr+5*FMR-SNgx0Z^YMh`+6uFYZ{7^xVFJs=$i06?E!Q3*sbLPAbWQP!Gp4LlCS{9rxe`zIlH|Rj zS;)son!p};5pVJ(nX=kWIX+w%7Cu6aD?d`7R#FJN0mDPx8p^pGp}t~N+f!I-2v zBzMIpDyB;x6|a(ZOPVsjh(pB8ggL^+B5mkPzMb&x<`|xf@X8u5&Q{UexzWfWsof|W zCI!sp%-1f^F9G6Jd@U8LliyTdD=e0lsDd+=h<+%}$At<`$n_!is6p20Tgo-bWbSL& z7WwDdpIA?%z9UXCy6KOR80~yZIhCw}Oh9Fm{FqUikClcSPNgptozPE-@ewe!M|ZqM z{WUK(IdfNPx2|NfZMD;8z8&JncnrHtUk>nLwsv(BO5U$xH3XIakayNi+1)4gusWt@ zinNx%oh5=m^VC3F-Y3)k4fdR)ruoa~BShVe>CW&{Vfg>`YHnj~LJ5{}*%DlOjJTkB zS^4bJE<v@ zYjI^EooC*KNylF?`eKty()78wjO>RR9v+tjD+dV2BM!-nNf7~IQV)u|=Nj=^+G!UT zQ6N)f>nfTBKVUDY5fkzNFB420hAXSeB5I3=>x87>EJWQy9-HW+TulBQj>>ANOZ?YJ z3TOw{dWbR^a~C8CW8q&m?*(aa7wfd;FqK8URNYBEju|vaX*PwZ_8=`g(^2)5b|L<* zA_^!A+a$d}58N_FtYq*#)(OQ-%Y20(pKY}1Mi0SaIM*^3JVq%n4uZ{%8|Tv(N3})?%N##@pbO~O-dok%W#{? z&*V>^pfE-kcBNTLzgQi&7g6EMVp3cm`i~?YJ(}SdNc-861 z7_76?pUmh~JL!@V#wn(1Cx!J(lQlj86GT?caIedPC0aYz!#t~I=rhLA2%Ls$QU(m8 z*qVy#x+`u~ZMR;?Z`b~`{MhBF`fDzVOO?Mf%?lkZT~saIvO$zqeR1ts{@Lmoi=%ie z)$%F1>^JC~|5r6o+B&D?C*G%#SGJvq>HW`i_Z~hA{_dnJw!p$+$%gCQNq8Wa|&?&YS>q6D~L<-rW7Bi|$(; ziGkVnrt`$l$zD|~QeBi#2a#(6|3}kVhc(r|e;iT4R=`da1;s!VDM1lwlnxP*?ilMj z+s@g}&d$1fV~lP@P{HD{yYsQ*vAbJ;yDq=K>-_)T{ zw&caMDY9d-FZPG|q0n8*koHtX8HU_^P;M+9+Av0TWvg>-zidwGcyor78e3tAl`dab ztc{U|``W1lvdxP|$R8=)CO?-=lrrrkyg)FAWNDwMOQ{;)%+v-I%Ignlytb%nE7U>B zka>hEFZzQ1lk)T0J(`y)N1s5It6JbOR$iUb)-6p~ZtAjTM5OD5R#wnRO{Mk3az~}SmOA&g?6~I9 zII8$C|HNMf!mWO7_4&%UJ{@*%;j?XgTwB)Vj=lKvsr@alh+{T%H5QX}>%FbtD3yNi zYu?lPJU^K>G9FF)WSj)EhVj%~&IH1kT{VPT6_vdfqPXBwx0tkc%fo)>Seayi{j)l#uL?;h$=FtjOv#aV#B=X&+StP4UP>6!P|v*{ zIn3&ctPXB9_adKG+%#BGqB~c6TDX1k81*a3Q~S4~Zs->#u=lRerP#Oosh~AGs{Mi> zJnenUaQ^Q&Rl{Qb$#7w9GyiAMJhPub=^byFB3eBEg?5Rw+vTu2L%h|lU4Q`zRYQAe zvbZ9p-xtn zS@_cCcTWQCDz5f=s!tZ2=w7P2wdG9v80FWLEzP0I=-6xZC5pk&9?L_;{s1>qg|cXw zn?6Y0I=5J}O2Zu=uG}w3w)x$upk29f`y1nnd`j0R!+)8%ZCCa0lWsJR(Jzk)toPP6 zgnYAf=x+MiPWA?u#b5Me43B18G&5CwV@eeQwBT<|mX&QEtot`FwCk9)VY6FXORXeP z&~(>wBkFwpP>Xae$-=DNu&UnVP@CcDpnGB}o9V1^R{R+GUG@eU{Ht(nC+>b_)rl$i zUl`_Y8gT)(uf3SG4qszhLM|biMN23;av5DoeMk)}Eu+WMzNIDse}K!ueXP+e$C)@z z4!r3~Ep{^T&M{|PK6zF@j313MM7~0 z?-dPFtx#UFBR!lwDQGyugX2GQ5?IGezTj8+8rggBD29t<_a$JxZ2V3H*Us(HXb8)= zdA#AoHtsyqYqB5wrf?HwKYTv%8Lbq)wR#P(mRmaG1uG5hJo}?UDGm9jrfR)p!S=vv zN3nf9id6}}s(SDX1+Tg52|a?L#8gr=-#!03`8JxJ@Gn)#+Y!j6=kn@i9AVDnKR>;# zoTELxKdv%X{h|9FW}#}7)wlY9B3@B~+ai;4T=35%zwzsd95F3#HrYiqEk1&>M{p@% z7%f{6IBgq%6Goi`%i3${dmSqH=3AYVD$qEu=5+NO-GKB5cCTgwxDy|xnqK{#a7+F% z$AOe38@92U{74euH=Y_QUNbh}f)j@t z%jWD|wqrs0#a%5;V5N5Z5A6la#I6?fO|_^kj5>&Y*%Vqf6CYWZo>54^*4&94Pb@WF zSUr6o2delFsCE=&3 zMYONPc}N=lAJPw!E$o-_pl~8%7p*&SCu=Ow9e4{o!Ri6EBmPrXpT1j<_O)N@RNQ7VC44$HyQg9Q07vWZ@?GUzmVtjRE`$e zeS$!o16Rh+vQCj!}wi0m;9Q^mA|80Vol);p`Kw`@i6T_aCKfOFcf?mU(85^ zE(OeFKIcSEAIT0zCm)N!Z-;LTbQ2E3Z5`8ycVI@1E9o-4MK+Rr+QyU*qFjMjV4qOG z!b@_8(&xb;aS?!xROP>cIfP4^b_jgM&p0w0hZnuyrNOI3&TUSFL$-6wGU9PTfn*8k zEWd`uB0oT1RL4`tq2bvLwDr7!jXrcMFVj!Rn8({T4Ptc(z=Qu`De4(J(s7+iLGy9^ zYxyhvE5c71OZbsALh8iGBF_;Ys*0w>h`_A#RGKh9)=E1j!1>w(GXx1!;u$}L?f)FB zZZ#M6&c%K-&T7QsH|hqpDngEC8{bGQSJlxcl30rU6)xm@*~82ulmpVx=yTLp;;TLm zv@havmqYZ|BK3Y;b!g+$ZMU)X`r-9KxWU>{>H_>(b2_h-aNS^`ydgf(%_y@Y4^>+; zu2aS<@lh_+X>!2|SL#Liun9O?fN=KSpz0A_JG)x3E87FC!*M0ewMs91RYM}zn^0N% zois?SHs3G4Mxq%mryn3!=sY6EQDW3rz5YPiA13#@?yfDH9oSNY8j)LEE{FIjst6y~&KJZZ(xKL7ZN4mARWx0~WJpkXYD4mXSir z*$#%$vf`YfRRHR5$F64uOud3wkvRtxKpg&4-wvRj7~A|3_(|$F@EHl@?_x(r3pJYA z&zwz@V(v1x(cfmLvGN(o8}5TC%s+k;pl#6FsRi8iJjx)K_Ai~deFuF5FuUmLAGU>0O16x>?f0Eu=mbbID>FDx#DI z(F29F3_M^XxkbJQ-U!C8_`-N2z)ZZusujN2;X8t~Mduu4brc7=8x9TKCP&bfcqtg^-G3r05|l^+Oo~9if+QKFl5uypHx{tC=T!JUMzO zZ89GDflk?>2RmqsTIFD^jecPPRrEvhiJ%Oi!BwD?5lFTJJDB#RF5o@pe;H(GCF@z# zP-r(4voes~$*G$3AGd`c+^b^Yp`>ORiw04R78VFKOFdY8=sa7)Qn7~+BUpRcYm4cu zZ*0w`31BK`V#F=*KIi3%bm$1zJShv#6vXuim|IYJqmo&P&ez)py?OoOD5i{;44z;% zARq8*=4GU%@F{C5f=laRF_41rL*N7(-jD-6=G~ommor@$-d)9DNuSpf7$(VcEz0N@ zKM^isoELp&_A(xcMq(ArNkaeppUhMNE#(!nm;X9!1tx^iA$7Mu%j3(oe=`abIY@4GrqD^cu5W z{BGP&mX}~&`zoN&vcwV$aLi817@)@R0{H-J*FB=KfI-czN)m8iJv93lW3+Nzq6cH0 z{6a`OgD$(g_!fgEe>D0oBLa17od$R`uQq!C0SzX(9}sSR4?hGFETxo6AlY=YybLI@ zp^3i$pe`0JX-baT3}vN zJ;?)bsqZMA2e{P!$ZQ72*AO-w0!ElfK`!*$M%euseT06q!+F|b*w}CYSUs>@cL(s? z(I)x|jN3i~Y^Hzf+DGuD|JzR?1S z_b}kMA{C*tu#+ML_B=`_!h4QOu3KZvA{x+6Ms^Zc2z?Q663PnZc9EasD!3b{DTOoP zKeT&kp76f_FPs8DV=BDkxe^FtBis(4+I9=lLit#mjkr-ys#kN3v@Sk|JD*Nxh~RD@ zsrm+-#qi7Tg6A+-r`&;uu*$+V!cLIG@?^MygScGhVfb~eyKEtN+iD2hQLN9(SXd5* z^Ca*BP)6U+=?5QS7IH99Y~Bn`Aao{~%5i6d>)kkk9Ftc8XOP?PvI3baFf{)I0|>{& zhsPr8);=tX@S;4(P{lPxPZK!0j`CMU+n7x@ROq#)t+uzd`Rh2hXKT`sE)+M?;ke*&MV z?TTwarINAvIvAyJ*{~fPD<2m0hILT}FYISkE0&JDV7q_oEjsol+vI8)^wgTi4~H<8 zIgBpwyXhh5iN#M+~s5HrXsQFjNvVhvNfxZ{{1>L$k(z!Uh6nZ(}M ze$kfMajA7V&jpHW;?o)6$p(AOF>sX?$|tf0E$h$f-jD@D=X=g`=R+&Ij!>0gP5YzDTdXgwQ*wE%s-}jNKIWYUMMN4i zwjT6#U@)!Wb0^XdXtvsaru}9QX`CgEDn|?w$-+v!Y=L+Ph64W(e#LI04hr7lV=H9> zCt^^}ZGI#aqcF>tKINT)8l83tPV(nkVbKlpL+vo( zb;?Omli)0MKcwdWM>CVE(eHF#842|V;H?fkKBFoA3-X8gJH!{Uf|r*(L+*19J2~>R z1k)_Lg#R#Cs8eQ8 z4{Th|-N0QK{1N_zj9fg4I~&a&e-;4+-Nxs(w@I- z=NE3`wxK68mT~P-ajXJnqw=6acpiWJqGEWWFl8(krt{|;ocV?F%TfsC$}V$<@(j`| zw28=oqQKY5cX54!>ClYFY-$_9Q~%d zDMrx=+EUIO-VF6;iXXC4rK$|zhA91Wr7&6HkV@hV$Ua4W<2cJU_&;Qq%d!?Mf%+9R zM>4pCJ4Q1G?W^?^YI%ohVxSesAyXMCj(gEyDNlee>TYDWa(-!}lI5Ib>U$C6*%;Li z-v>~wdiK13L9tpq><6=$vsL*UZD<+7=kVGZPq3U3OTCid#jUXtOP9k!OFj*b%6FA% zyd{cgOd7CTb{@MF7a+~RI~N_4I1}wQpAg+APv5vw_>7ts{6V+^nBaL?n8*4wu13N^ zPw1Ug`PgOBHHvdMD_0?3PH?BsmmVXss~aS_q-TYpVh>75MyY5BZDQ-*KMGmQems`I0l#mze3|YTEt$i=uV(_nRgQ z7ciE@>=FbpTUWR8nc%>}+k6lX7)ud)^Jl2rY@6(tg#XG8F>=|SQa{Fb@^$eoCbN<( zf>@*TB82Iz-n4qbS`dmZNYQ zlrX9YapjGWq=Yv(x% z+kF=!3q@GBAg)|G;7H;;;EtA*NfqkHuu(Egb%yppq*nGtM>;iO$vrdFcH<+%l2gPTNo2a8i!TNhuCk2;v zWd(SCw&rI>B|1}mWaDS#p6ckjaoqi?iWOv7p$2FF!%0$|wC94ep+12|>fMkC9ujxf z@yK=}=h~wc`vqppsJuM>RC88(8t!H{@c);3h}V@8>8PNL+k2-2H}RfO-o_U zq?)7C#)6+^Z~u1oWK&Hc<#gT2l;X>1L{1K(ZtRuygN{gn~(s@d@wlA#@_(t3d^;n`^si)F| zRJ@ffCzIbN7f5eVyCP~OOnRID3UNL&WWi2xG@CN2MFQ}A#A6N9NS>S@y7A-%bSL!} z%3^GVY8rKZ@ql7AZDE#&Ohu1Ra+CZ48pBEAX66RJSt34Yo_}1F3?CmAAli>S6Vmi^ z>9yV z9xrC(1>qc|p8rS}0{Ma$HNj97`JrkN)LE6Nh=pDk?2whPS8tA#9AdY{SBSkhq3eeV zpTNsk4Hewvo^hKXpb3VK#PjQseAG|NMLx5ptNF+U(kvwn>8%jSjfgJqowN@@H;E); z5c9^pA|i5YU5U`02drcXMxpoTX7gEMS4Z1(i8}+)Xr78LGV)cQMX7`s#XI4>vOc+s zusnC7bfIuaTCW%o{1f{~cvsN1)+AsECwUL>gGHn{9w<>ZdDvC1?Q8@OY9Qq-x>3bb z1mWZgvOK@!r%WYNWT#0QrDsw;i#|#NVmyTjk{iL#_&24~mOG#%S=-D%yi!G{eIcg| zs$u`o1n9e{|Ehd-`0BHYS=x|dUzv|)R+d1rMm;8Zp@^gMi%Jt*P&NmRkAV0^=;k>U) zsW#CKmO<<@JjOf|zpe~t=qG4$OLeKl@9B8WGO}pnDAi1AddLSwIvumpTXu^XIM+v} z=FD(3N?&m2v(?r_qKFnybBM&iIhfqZe8SnYh*&Nq76p0Z{ariC*;eOUW3zv0>yxH^<9E+J{n@!Ft^4Hmc z`?6xxdT41fqNG5_qEqE%Y-O-Sx`T6Mxu+z8dwzD8xK;4kp;z!5MwzQ>&TwZD51V4S zQz}XNKJL^4sWzFrFw>%X%8g9Cr#Qk@MDCRJA{a_2mcjOZh+Z&TG!__h(#JUB-BP9Yd$7}Z~|kr^h%kVu21Tn>!nGO*dAxfhmr+x74qHU2Vud| zTJb}Fg?LcXws?*3o7{UUU2sh%w)256fNoTbnX2inerEWr-dRG|WvC8jgX#~;*J*eq zOX;(rT^_IaCloJTq-gftCH7HT7p)e?sJkY;=D(L*wpG+T8>e@lInGSNxEqd{!i(y4 z^NkC#%<6u_f)q%(S|1zJA^V}b5t1Vr)DQE)iFyo0?lM8W!NGX|{Ud7qTa%;-=9LYf zDj`Edy|8eo_G?{0<`*^Bx*+L{;!kZ_)C*ZpZSWd_B&YWNiV9I+?bi7V1P;3D@t=9N zug|{kyG@aNsQGZ?Ip^y zWr-SRVA9Ng)F+^Z;nS3^92|9V>(^>E7SnVed%g5-{cgNlE~oY}p(0~?%@pE+_@hRI zoD}{?KZ-gxkgIu0PgFw-)_KIrDt?*^b6d&boz1u7qK_l!x(dgQ_|tF(+Wk944AH1$B$ z=Z0Uj>f%J}ZMyr`KbA4{J8AW%V4!Yeg?<~OZv8Q>AM>t1Nj(+RF2*ZkISJF_6k2}# zunO^h_Aes2Ie-aPb~Y?zJ}(+!9m>ke+Fi4Zbul&Hm=30H@YS7woI)*{MD`fJQk5?U z@f0h{5SM8xxkjiO7AW#%-y+OtVsi);q4gw=sX$Ph$~m*e*9>xgCI4$^fmg?L>ZZXv z*G*B^aB-_%E9uCQMXqu)zjVrN*>>?o`zC=ebP9K+@g~YGyIFS^#peCCoI=Ysn@r!) z^dxV?JTxiVPOCtrYxC8U_)~p?754>29%ZrzVt5i)`kzE>myC`C{juqdWs<3-xpk%D zu3W?tFHXpqWnziGB{b@rL^~oYwUb2qf{&|I;<+oVig<~1!C{$~yxnEB)JZ(V=6Bn? zMa+MVPRb|6PwU1j{d0!Zd{Ai9Wv01`5%G@tFu6MXkfvJ>1&vd=%bzYkFTbR`;&wo4 zR09(RCF6xQZxOUzRe23p43R}i)@yp=*3_E4y4|VgjE{BWH!jx?(aP6f*W_tUfsV@4 zI&hg-j?urGJ3_itlQ#B}$js09t5ET|q1RefaNoMEwq(oA8mWbw5^3zMxgD$09j_6G zF4VYMy!=-y8J1&9Q2FGVnX^TbQ>y0C>4HbR_W%8d8@-z=b`>A)zENeLbF(7>la#Tt zxSdc(#FcK>x&st@q-)pwjm?&3QUNB9jdw4803}=!i`|D-g zRrZ;RJV;kLqGv7PQQ?Em!^DBDkJvl~J6(t^FtC+?LvwD(0G$ z*NwB7M>hIckFmCfHP-wCu3z15JP#4QhwGy`Ve?zH^AX0x*_xF?!;tT`tgp1vf4X)< zfAYxfVeF-u@y!G5{A6WAIlCwJjCB&nd3|8bc+SDVAmbePsFy`2L-=kRG@AsoovYL_ zB9a|nm;z>%v~$+AmpGWmK8w_aH(qG!2 zg3!4Zb+cr`1bmk|R^q8h~vY7a+ zy5G`2k(rim>8&+pQ-^Hjs&f5q`6|yw?I`8RSzlEO)%wvtgtKW@7S&kgv1C;wMl~fsy`d`VYu56=uEVs*keE#zNZu z-{tS2fp)0!1@zD?$8@vpr688Z_5gR|gV?dy3ZfI6mZK%zXZLP=MY+jw@jFKQ&ABmk zBa?;vJ{(p;=D**0t&G9n(u%1tpht}QDkAD5wpOR|>X|=n9sGHii-b`~XZ9-Mb0l=b zzvTDa_kIqv(TMBRX$)61^1zScm5R7NVQIR2Nb}5crLj%#ic^M9Gk1DCu^*8J-JEAdY-c{^Y z_46I7Iu%!F{A#{@TDcroDJ{uNC9D?Ti>8vCM8HY~xm9?}nMo}c^zJJw)YO-Be=9y( z`%fLKY;4U?)t(A_BNaJc`AzqTl83pX;g-^|J5*j7C3w7IO5_3J0@(`houmS3(fACq zZCZZMqC)?UxX!)BnXMyh*OjUoI}~6!r;Y=wDsh%rk{2e-lw6#Qov1HLPs8ohoC-fe z2vCu|>WPz-N5|BXC@8=GUZLj>wXLrl)-!0nQi|_9BXcQ_Z=1<>t8{PLia%6!yY5xN z(`u1Lk@5&q^AdS25bE@{U!HZQ7NzADdEd2>FQ%wT62h!?~HtMg$PTxY9$dgvTXSJG+Ue z%kH$EAnmCnni9!o%mK+h3XEF-hEqj^c&sn2pM>NvfUy+Q#_NoowEKQ!);R`c@=v&r zlXF0V`(C}aua)48{n&hkxC(#FP)!OUW{O^t6G^|BDhh=HV>+q(X|uCu(`VCLH#7o= z8RfnL<}sFVvWc?{zCT!k^`VU4uEmk4;~KBwkI-Co62b@i7~vw)0>B>lL@ogySNYhs zYyQnTLtDwb91GH~fTLG6GY&yLlh;9=NYp-G8>Z^xHbV6`FrfYb4g>Nua{Ny496y5a z2bxD;NlJyPDm3IH(BUol)L{0Km`vJZ_DP@fz+ujdNiRWPo_f#ls@c5zU7Imx9@DxP zyO=jqRgXiEgS;yI1Ei8lB}O8%%KnfJaj$3EQ=++z(P7kI+!~(|^z+EdNoM9*^l1N) zinr419n-5&$!QC@dbxP7q717O9pZ-Iehbf#^9ZGaXQlSUCxWpVtH>q%xX2yU(dh0K zOj;ZIz$KMo$A7TXTK-=9uJu7>qh_Vq9aE+%k3$@wcv1LM%4E^px3%hwA3`>X?a@MO0v83<}wRqg7o;9msAqEcl)TaKP?9uODlAZcXfxW zLh4=$k73$s7c(2NLGgr|fp#ye}b6IUBX zEP6%^&|w^Zk@j(mJHfISd(hgK6-B#@s*RP;driDen3di4Xg<~W4)+QeTi3F8YaH%) zBNTT6zrF5TFpdyuo!}wG?=lQJj3l0cC+=QG^DbG^Wk>5QlUrZXmsQSCd(k^E*=QQz zg&m-&fvfl@6=4huY2lUtrkaux6Uw?x+wY@-IvC1{?-4${q~DFQ1%q}BqdH*MS^iLW z;U_ASX`2Y$h=}%^ltFnxA0)pm`v)*nEt_vKEcBS@vCLhc=aUm?9l-q37K5D#6IM3}i3@2XWGR3u|z1#$79=VRY5PyfF z} z>ir`6j+1Yrf_w2Lo!*2bf^X~F;yA+Rre7I{iLDKhF^5Sj>hc4wk;-d(=dUG}>)1m- zQWM!7+bk??@v}y6R!dp5{vm63#Yyo^)^&^{G{E|aO(V2{>unnZ$u~1L=ci4)B|@M6iaDLJeYu zGdgIgSlgT*y`sQI#Rp8O(^x5tCt?0zAWP)6%Qnh?(`kSk!AowdrQHXvTTS+F)b3R ziSxmnVq@vNRjj1xIUf)@eH`Zvt%DA8K2$ja6F7fzegHl2?4%S14$fKkfms5-UHX<) zk5o+PWXJRIO{El>aK3Q`b(TOSn_wg1IKug~C42^@me!1Zt(ZagMd9q}^egDx1RWsd zJr5~h;8FV}iA*9tXdD(S;~#FwA$KSU`Wcisd8+s^<&(^Zy@pDbdXPZs2g#hWQ8b3w zD{DI4S(FslOCJz+uQ387VWnpXW2UHgbTl)KXRUK1&oqqGd?EMh%7r&68#E`uV9FV_ z9|5LDDH}>=P|qlQG6QLwWH&ZEr#+LN4thdoN&OeDr|*$OMKt za-4sfe9_#>Tt(SvG~ig2gL*;HY-*6UDPui#r}}oxH`)>vDew(Vrrhm5hL)zv8UCGi z9Ug7IMB=o0D>}(zn%j61vZ`?o{X1o7U3+ynrL;CM|1srU&5-mF)MdsGQ7u%!P~~4j zH5o>^B~i|4uME9JMcEo-3yIPjCo_^>ZQI0Ek+*i{(MFK}X%kl^Q>HW@&HY3vZ;VTI zqHM2U5MiQRw|?|>r}WgWbiGDir|}u`2dITInul;*i~CJU@aZx~`Ei(1fk#O2s;U}hxh`x72ZO=F)YE~uQyK1RBllgPeIX-<5?8A%hZ+rwc3mzExb^{k5%(orJP zUcZvSZ=pijj25;y1u*_ZtuIzmY&cR<^z>~a*^OY7PC7`jRSonT_mU|>QdY&k1t z$zhHG`Z&JTmVJ5D8VT;A=W4paZGfX_71$08KvTeaMketwXkv~my$x<>?#s#mZ?lB) z0nkDaUYiFsL5~)nWm{n1@s2j?;#o^93uaGN9b}>G06`i{#4cdPuq13DVKGa_-dz&N z+Q$Bnd7kx<6T0y>7|7YbCJa0X8$6#t?TB(5p7WSLX!d9F(Z`BjrXCfbk<1o!B_oo# zjdvHflDUJYC`x5s;iYE$W;yVdZt!HK@%)4OSf_cdivmG_4~$t0eL$m(A&g$>Wmz}l zlH@Dm!}uVXO%GuF7AIFPVcLl#1zVUig!eYNFxLsAW0IK+!Ncs*C$q_0q3-}IeOr_W=cvf z@IbXKVjJ*Exyx@2@JOkhcLa!61q>Sv%x3RZ-2;FojsOdY8uCCVKv%b(=mm&tSCx4I z_!{r6B%s8UmlOzO7*2*&03rG_K0E1O^)KdpqMcA1hkOEhpk&2AKt*>XS`L(T9AeG~ z^4h}ju|Rb5d4#Fxl@l`#0(~LE+I7HPfh`{sa(Z=hlJ#0vg;7Ply-I@5*G>>4<-XT<$*0R?M$8E(!F9epPGfY@r`iC?=d!&w5 z9SJG5(+XcfPU-`j&w*_!MZ7N7whrDL!p*Z1Vc0=6< z_8fMgbp@piI%c6&Err6(XY;RuJtpr>yFow0>5Vg4d-UCF@37YBla_Ze)%pW77c<g=j%qru4e^VX9xesG+FJI z6*Bs2ZcYQ}TKVd~3d#)G<6<@cw{)QNEO=VNtC&N&E+$q5S6mYnRhQ*n5kfd!TD+i_ z@H%>-U>-R)Fo}PU7V8lzXl1S+bxy43*~x3Ag32f~RZ@W&#abbbuD(Z%5XInl(+ z#CCkA(2Mk_^pGHwvS{mjKAp<6F%yo{enf0TBY-}CdvqA{*8)G(z^)s)T`&caNal+t zQVzraiJYj-^pnC7G!4#9Fq>XpvXJi!L}yi^Bt}3|Anzn|LwFG{iB;$OfHwsa%@5^i zxy~cKQ8wZy$`{!&J2}gQ!&vULnF2djTXimf8aTa3hkAp`%y&EzG%Mi}auzxf=7!|5 z2UeX!yy4YuS%`_(Gh#1q0{5waFPsARLrH=K@F~h_{$luP6%UPoKNcM2ZRL*GyacJ^ zddJV?e&NzX*<3a<(I=c6!i%5V$R!DWJ6z&UgU#rmAYO2nMdOzXq@+ZYC5Wo1;hFd! z^6ntp`Hh=4a^LZB8^gJ4`1v9Ia36nQ1q+T5+?<1fmq?WBA7|NUKk}tR_JKd3 zrSNTjf^IQ=Cz`LFf@|TGX~ve?A)xAK_ByUm`6*>Lyhl0HHihy=K@VQcS*1XhU0~x? z&eLx}kYdr_iemrAA7`ObccHUtW>welTutYSJ|jzv%q(B-BE#CGPB=mz9$Cl9)wKq` zVRQ8pm#l;MdT`1$aIEbAw+^49&zm{q%e+^Ox2i56_Zp%LmvQgc9m}kMFIX!Q?s0C{ za>7ru@71RGe}o>?ZdvpWY%y(_>%>uXNnOr6uLuXqW1deZAl!oc_T$S@R;LFaSD8n z`$=^l7r-c0rr{Byqx>-8e)(;nudPKZg^KoyDGk{SL~%ka+`%G6o)sVf;7dXI0N5Vt_xei zyDHE3Ux^GTMtWv(Eh>-60Ng9}`CC!cv(k&Enb<%{j&XF!KGAK%nCwnrwSH0>kN-gz zyg`Z9X!}BE^P;p(t3Dwkb$2}u!2`OlF3FrkvD04#@>^SS#~Dne#J!GQY%kJSL$lrs z=hiMsIl?zsHpHAlSJnIoiAIiEWGlaLi!Fo&C7j#(*a=E#r*PF@1!j9qbn#QtQIl8c zznJlcvE~03v2{+BSF)aICSm?d2~(xw#>UK0^bktcte5AJek|W5qtO=5E|D)_4INf1 zGjUuQQD&El{lrqk@2bs}{kjL$LkkycK4Gm}r0UW5xTNpOG~%47=kfvaf?zjU6&2@Y zk-|XPtP0s!X!Ecr+s5A``W52~tRDYee-C%JB365vuq^+S`Wca$xkfdDbRlt{VhbfM z^04d(^;ghXDGM03OfHc#PtBxBzHnX-{UZ9r?xN)yE|YXPNOzIUFFUO{N`dpzRgb7( z#&xAVO_We7&!7)PaHK~VlLP;gaG4jEa>X@J)(nOC5wdq^n=pY*qdd}Iq4!`%Yp(&x zr5Wn8!0(*5$`=e<@S|cVvod~`Y%^;^c!cB_xH;gUSO%S1!WH$xQ>G7yZt~NH7Vyup zW624+@8D-lxpp`dTil@@2DN6dSGuuBr(KW-vKbpGQWue&Wy z=LvnQMZ?gRMInM0Lifp9!7fRHogMrEv?Gkuc8eBP%upW|-YSSxo)VfeugYHw3zJi2 z!-eake@Qk8<3pB+_6RLLhlI(ZJsu*#1ZnHUFuqaT_qQH!h1xZW)n(P{M0tIlPMIQ~ zx_PdgAgfK(N>N!@RG|2>%zaIs$WxZT;;EoRerN%YAEFxWG=L@wfBaRbZqvNi-7INR z+v{9%_9*^nvo{6Gr)v(z*Gt_s8zKV5`I^9>cwwF9`v zRDIO!u3cXAU3Jj1B73r8XH8O?RCdbTyz!;voH-(lEc$IW1k!{aHI`*oKE5W&70>HY zzZ(+?|BG(?t3Vju*jW-%(N{mK%%xCXi>MG4^>OHlZwPVP4`C}*zcdS8CQCkjKe^vPulvuW6E^Q&29k4|yM8gie zLo7{aBwP(0rZJH2`<_(&q=qj#th@pcrr7o|*c*oImD=8VSav-gJF_gf_6e>qe|}9O zejqc*_=jkp9I5XmrN?a5TF7@oeyQuIwX4pmhSN_iJgK{3jH0QbAHmvGFaeE9@^>yR0OpWt96u2#beFPdF5lXYb4YoiKGNS~+=124sUY2HJH z5rwMzY>!|!#Z%6r70cu?@V*6QvXQ)PE-IO`@SL3;O0{jm&azy9!wOo>B``lL)$kU+ zm0GE5eT282LM4xcHm8_<9<(cySl00O z<-3}$@V8~2H*DtjBtOtO^S8%7QXl3YTR%bBCzu^@z?M#Se%V>+N0DmoH%YPd<@kBx z62bqzNJ~f6oRH#kwWb`Y+vaupN0LWL(OQ$FCniW8D>1FxqV$v8^!qJeA=NMWEX|fb zoAXAzOKBN%N2o`8|5j8nxrU(b%l=>*r(VB_t5>UDB>>teRYO#!>a|L+wpeja^>NiJ z*>25x&rZoL?fqHH#h%K&qgL~`BQO3c6b-BKGBs_b7*CqUq}%BejQY4|n%~CEh(49c z2n2U3@Fua(R9UzN{)3tE79e-w!JJ1&TMRcQT{k3 zyK!9Q_Kg$jR$vriofZ?ee)VDVBK$k=2}U21Wj?HbK=W|6?b3h-J3GZDn@fAWqo<-L z*Q<3`)zrl~bMeMgOgP#JjDG?xS|UualDwRcnNE(2s|7rm4- z#m-JP-{#UDYqwMn=FDzs#lFh0G`8dCCZ*QhBNWEk)lMV!hwd;-$#DU1jjq&1UeS6_ zIyA3ady@IqDNYx_Ewi(e*rpc>8`?C4ds{y=Hxh6DA5Cu^7UlMS4+Ekgh~0{aN(fSd zl!Qn~2uOD`z;x#`@x*lZ4Bd!@9mnqOu4C)5^O(o@&G+T=Ui<%bJ+t>cJMOjabr<9M z)-vwp_;x>FzD~Q-IhE~_(AK8mpd+8O%;Sy?%(gD#FZDcOJ`N3xx0vrsjCOWPKhUn8 zyrzY{pyKGj2KI}hxZWL{ovZA-UIY5nT^$}={xYQ1%3Bk0qd7p}9#CkBf)>nuZaOP$ z9{0{9lWFbjn(Rh-~ED37o^_qdyR{fzGHIrWNE%_HU9?fs)tr%B^4!S`}7ieo>TW) zNoz)L#|O#fq=2@?Qtzerns-Vshfc8M%D(t&P2o!IY!?GnV|Afw>5~7Q{#B@f7s~a; zw7#iIO-_4vsO>85-N99wm$$U;Q(laYXiiW8A$jJz>MP#cjk|RlW_-}U*U6npYFk!t zIHD>&2PFFTBA4C+`o>kxUC;EZQt2Iw^cBlax7vDdN2Xh!83u#m%{)`ff(m23dH*z5 z{a%e})FfrAaP}}l`N4sh=9Gffy)5gitgfzJ>+X~v?f+O`#V>B1(cB$wwwham0#IhZ z)-&^#8E091CztA*RYx2rC`Q2thY=2AaK&{$wqx*L8*U78i2dj%t)s|3II)UB86w6A z#?X?0^8?x+s-}s4^ zuz3;2h2Gl7z(p{}SRx2>SkbcEq|t05u#NnNqsBW@{{i-v57D1b@tiin z(4>h1UnFGDAnF$vGxWVFg=gPWgjvn&H$~t!@fS+I6ZY`8vA>Z15-h=DDW?U8%Tj4~ zz^t@%raSm2l*$%C-zR?L8HJnv!q$fiTi4%c=of-r+2}wa#*l{16DEtj@eH9SE0HJ_ zI-qZp*COvq-cZjWf2T$=<{(cNZ)dTEITNpO=ZW2Rde!bxo?L4{Whs7jjBfm;2+~c! zERi=Lzi>^mR>oq2Ncy<(328{Wq}YdYL1IkVL?1743yEZgNJfu8&f!YX+kV!tOrr-& z>H`hp)?JN`y6@_v=ya_X+JO~oe5k+i1FAcyW5jdH=E4y2eFZb=E%k?-6SR`PTOR4Q znsrXPd5fWXL%XfJPhClCVY8&cvpG!J)r7V93(S}erkUioxC@5Gbtee_>hki7N&jlr zCMHr|sKWyov{=%&BU`3){d|BZyHg6XWiY)>uP)?~i*Z$7* z+QMzW^|$K3ZVnVXHBQ~2U^}9{);z}2uww@F6;-&$y`;>K1a#NynDs<)XPCE^IJISx zBZoyqoc9wst#Gub~HwiL{Tn1X~Hpc)|zv8fF$5h0SAaq&_c8;v_K= z(w1?fSVu!=@HYa)2^m5ncxq=k(GP1_7f5Qyuj!mjnM=H{Z=~YMCq!Meebjx--wY4B z0eykl$plKCvlG}^spEjfK+fVoo{FcQ;0zDIHQNL6Uets&GYMyC1MM?O2xGohN&dlX zM4nJdtnCaG?GyV=Qwc*4gcdim61eP?SDZlJ*N`kOL2zjNDeyaTf6F&)GGIUO6+aW$ z+Ui1d;F8rAl7%-N9z*ftoumy>kMOY#$LMsy%%TWpsNhoaNwzPzCzt~iz+=X11Xxkx zreo+f_(b1*tOmZ`?25O*Zh8^@RMev73;!lp>MuBR81F8gi1gd@rDatR?wdXK+=_(YmZ`boA*F4kpHDEd01fvhhQ|FQYpRLQCJ)s2pNMi&Jgu8TCPu%PC%G!>t&z5=`$BC^_b(t#TIf!8tI{_A`4H!8k%FTQLpNk`^M8& z>AOd*U~+}={Y+HFI%e~hM*d*G>K%G({|V?A7SlV9&ccuDDrkZUz3u1AMv}r>YgW3G zHO;k4t0;q3AFn|Q&%D_&hIJGEyEg=tyzQk$)|kE7tayaR3`GhKW5=&^r805ds~LW+}RvC~~Ag##%)UrfAst^a-dj96Hmb;0SPl^)*SvD+A^S#R@pQzOmng zWyrksC<>mks@tC0Pu*|YMSDq4kX@mFXBc=lnWLERNPk$~?AW>vb`7T^pT+r$J36t7 zTfo~Ln8z;@TpQZ~Zxf2vCXoi&10C-v&K!baJCy+>NnX&pxg)uw>BqSjh}n!EJVWg` zRx-aaZ#sLOVCC|qKsHDXp!4Ek&#~!{pXkD%7jZn~-1ZMi2}SD;QKmsuu^Y7*>ft2O z^w3TGYWg*JLbaF~0GH+*WOcz?6TCUAkfcQe+yEi$_DgVB{ImZpevg#gvXhu69j7so zen>VU?73s4 zIE&_!RYS;7e^XVG#;g8=4v^8RDU30cZOTxzh5B33P~Jn&m9NQKz}O(48v8eEuI$3X z$?Qz|@zL(w8DhU~A@;mwgSiUNH3utFiP6T5f*mB2A&xeh{8)Fcv6t$v<&++vu{Dt^ z%jpNz;W431CzaL5m$^%QWfa0e2^%{LvC*A<##r2=_SLdrLUU_BZ#D6K^A_?Sa-?M+ zs*l1neJDOj-D!+YC($12Z$~H7-|NSC*)t~UcRMDqUc(RCr(@m>j?(?csr!xM*M!*K zIRKg{?m9?3M%vSXsw0q}w#61|siRw>Q+;TotXm__(~eu0%qyjZn(G|Wxbq=p%N@+A z%>kMRxPqZ1;T!zxbtP;n(QD9vzf4N&zfr>{SM{Ru+bNCRQ7QAOk)1D=v{L&!x;@@g z5=~aSHvTsdy;=*X>UOrR;W{?d=^k?-^kOlE`wF|A^OjdgNGEW3k4XD!0KSr%mb+Jg zryp5916<3316IJ@fX&)ivK?mk>(~a2q-8&6DXvB9!g)nFDO?W#q;2eIt}A6d?lE^O z&0Ouoqchra(EK`9&$4HNZqBDgDGf031&F99FVdsm0jE#&V*I-dF4QR`~iL|kLRBQRtsK@F$fDpbG!MBd8}3DbIft< zCCVt)D2^}W#ySJo(=W1>z+?1wP9^tf#SEKA{O+t1+${d-xMrRS^z&;HB*D>ReBcY> z+)g5`N04s3O79o+%kvpqK^H+BQw~N{Wi5ZKZOQN5qq9yOraCDf9tFJ!u3(DBoYd zkl83-RCJM*C)A>lac3q8c1 zO}nluAWWd|(E8OTGfbK}1wWZA^}f#e==jcVRlLilc)C#?_e#`J@Fi3e%ALo zlyIFPv$3CK?lZ~5$a{Mvf=iSaT^!n5>d_7s`Yp|-CanyjuWZ?x^NKO5d3KT$qt7}q z%$qsV8ZqY+!_D}{jw*-+v-ErtYD1IMm&{rFj(4A89OO_(QmY5%G>x`(!njnvl6JKF z@+wCOh1gpZYPPiS|>v~ZZfJC>c`9Cq^^$mgq+)Qb$ zKtYJ*4GQ*?7E9 z=-{$ZbX~OBIshDII;dN?3Cv%@4cz1GQJi_a`RuPm36IP9x89Za3iwn!j!)pZrZ)*D z@{^;#3O)+%`&2@eaFI)Zut0p)yq;6cYgKOHJm*h?ZvuRNJF5nGDVU1C!_5|0Ynj~B zpl6|pR{|bPo5pv6ps2t3|HAFwOfcQnp>GHLS*$Z!+1|obc|ZH4Fb%xGp$Kysjhtt~ zeC%5wS6Efu0bCF=@-K2LguN?>JSX9g$UNRX(bffL`EMmxoz6g0M9F&Fb6zn)+ReHm zH}em&jdBlKC1q4=$Wkgda6U`l=e`A)(yhr|TsP_Fa2@m=y z8b7xk*r*9|*vRvOE~*P{y-)E%Ig??X!nw-wHy$u`Hc)0%KV#+9}iTGhDToh7nAG;<~y)MT>ZL zgFhT7y3ur!HCiOcF2>&w#o~u*2SwvavkN~7e^Q3hOd?PEifERom9@?v1i`{93R>6jt-4E;=%jZRPFldl*hx-QF!TdqBht{$k(9TdZ zXG*0n)C&aXo`DW=o01R1qj=}Szrs?%!2C_Qsey`+qvCUaTav<|O|GeaI!bE|CbnIe- zAV>P$!%nbA>EiGLM4)ey1H5_-lP}=4tIyF(c{kMyv0c0eDpAc9-fiWJqEOxwC3fW$ z-bdwx_&WZ0<*eYR{7~h8vmfxMXd>;p_#Z)>Xg~LqnZQ-@985J-3U8^g41JInZz!z# z&I{336jbwqb&B*9UV!#xteO|3JsgG-#7|9ZI z)B6gD5Etm#fx5@7?+z??=Z18i%#m_kI}W8Z0Jl0aqws*HquDQ*^P){W`84aQdhGBw zDE24=>$bp06x;?s_9yw7radH*+#Nf$;gO7l2g~!M&xtQ`;-qW}D~T=5rq5pTRw`vJ zn%60J<+_h@P!fgX<#uv4ItQ91`;IMSRmf0y65)yTBC!}%DUBhgmp+x8pr&QNk)Y|M z#5hR`b9dMgiLEE8r&0QlpFUDAUyB@-Cdeib-U^zedXkv2Q#yqbh|iPgsT=B^NXF5Z zl!(OZ7^kz=h|5``<>SN&99n3fn9hAQ*C^Qqc8^>rvqyMhhGYk=kGEQqLcd7+CBDIQ z#cmK+v3zTDMNin7#V#T_2h2aPPoB;Od5NnY|jwdAyWT|kgn80BH zAH-vTSZbbV4R;)7vM7Rky84Xp5Kmob6%zPW8MZ21K~B6zxDXVC&~3faW9IAd zIwu)=pzuoB1}PLXqQy|QLbV8lJXOBa)!=W9$8bFGCLk^bz;*{bsy~4J2j=R>)gFe& z>k3L_kWsrjn*#-EeUe^+r!>zZw}KRHzMmYNpiiATNl>JIGmHRCg_~PiC?vR`xdr_Y z9&24&y&tkzwiSsWSM!xjI;b~CF24s(H9Lkwf>!e@UpxLc3o!8)Z$Not7=b+>UfF{q z>7hT}^P8qa8#+H!{s;MWoG&;8s@tz;Yy?NP=O>I4klNeARQyZr|9WlbJ#FTX&*R1_ zMh_!E-}R`v8|)prl!icZht{jf+H_1a2J@)uvFZ~(rr@h;B(Xa~qzs`fjxSbhqdf|# zQmkc-o3l){oLl1XQ}qoV3D#=wqup46nwywEqy_3rc>Bg&)mg%mN}BQn=}LZ^;sxbq zdXi!R-8IfnzK)3tj*+)ZCZcXCt&}en z;}qRAXzC1*n|ylLtHs+RUil|(y& z`>HHujHpku^->Eh)5`%CG3S|VD|`QneXo>JPIgNc2Td#=V?5{l`&jc)`b7kdR-YT)Qna4;WNZ#;`(OnXm;8%cyga=Qb ziIXDYJ@z+jDv@~hdc`xomaJDy6-+|6$rA-VHIA}M(5tvkN&vTKU6ZVXN|R2Bf5JXd zZek6R{Z_mJ%ha0Jo27^Bp*G)p{r1nqMR>`vVDa9kj>21Z?1)`YNYsn{ssjW|!u0hheR z`Rz`g?vS6keoUO8T)JWyf%&!Bt$rK{W#Kj~Yx-k)(IluoXROEUDAwxlXgLF zWP-MU{3hy>Moe3~s8o}{{C7r$ZW4E`-7-x%=+A&Hy-ha=zs&P7+Zy|fJ-Ci4h9Q8! zDO#%AMXJyIt))^3NeP-X+S(v;7S*IDJKXL zrt(!aLYrr@%%*=Je>A*cnlX@G!9waHb-rv)S%l^Uhm_~9t^(-kUaA1DVOh6w3h&;M zJVmiU>^ooK1dpE5r3{qVR6UZ%pdBe!|Ac$0>9)?m!`4W(G5qNzGW9+F;T%xK6acBP zG6l?uAF1$%ibGGxQSf>1UfC~E?xgebkFtJSCG1gK9qUouFL<)esbDWmt~#xu!?%l$ zsojyK+1r&nk+mti6(V6=Y`h#La$W2slZgon9!S5)k|*$G1jW_i)x_KD;w5KMu-0C3 zrEe#p%iBkSQRt}q~ z9aJ5xyQD#@1mzU{Wt|j&P4O=@RZ1$@6+9H}1#R)Chn02e# ztQg$g6%Wn(hyih}reN~6P{8O;V|k+tJDHCsF>STpfi_m|zK!S2>-gL>h-z&6iV;)} zw0y?Z7P&RgB!p!*SdvK-Q~ombQf9=;jB{zli>Zcjj3-_d`Yul3M3r%k;Hiz3yJT}b zc4}XTpH=VPx|guJqO$okDX!p>c3XL@XOadZ48im{N7sssN= zDpy%{gN7oU=>rs={lXXo9ZD_Hqu{dmJKAfAPxx(3xiEH-i+YK8s)vt?CA&UGs@x%E z53gq3U)Fu1>hgUSJ5hhZLsP8iM^=eJAWliyuiGgeh+C@lmLxA(tX?Nw?pLcK$@ATb zN}1}2%Nlu)0&oHi0%v`xg|56c_JW1!Fz{Q9(GR5~$f_jw7 z)mNh2t=TxMT(M1;?YvfcNOX7j8>;n|4LZ*f(DY3=GFNJh(v3=gp{MHH5`(qvx|C?0 z`lsG8q*B#r_{%#+>1JY1*U10VwvH+k{}iSTBUIU0k}S`QKA7~DfmPoP*DRW}9KDOB zFF~U9v(AjXq2@Nrf@I3;EqfLODDYOslyCBM^&Q7j5eNP_j8J=FFuLAa&hEe102Su+ zqMC@=h23r#MruySPMmgGKwA&tdIYCsJGpSt<>p$N*IXCtC+04(j@?ca)PFHPw!CQQ!v>H103XNGocC(ld?X(LlM$N9F{9!*P{tty7x z@24f2J!;MZ^KPzcOtGZ|nQP;kd7xcYL7$wotz>jhB>6|~Kb?=LX&L{uchcID?OV&} zzhfPnOPJ;`#KL707Jf7P0Y}|KOud3tu6s@GqC%T4=z=YlY+V~@FN%(L&!_*&S=(`y zIV=5mn~@chc)4X2o3QkOHHULG6lrU>(<+;sF-uUP$3&2kfd1mSsob+KDS3tjJo;CD|r;I+U zyCm)!UW+nWcQ5Z(!T3%Be|6Tb_E161ioLCN;M8TCtjEFok(7?SjFJ&x;685c}+*WOjeI|yaxp#LdJ3Ql!47%Q?v z+gBQ~sasn8jB64Y)^Dbu=t<@+=E#u4#?985zQ^@vtiRklbp=MJaUEKFxyJ6GEtcTn zU$HYB?N}AG&JDAtwy5I=j*r@?FC_#w4T^e+Z?Jn<&g6Xr3Hmm51G%!~CH)rl^NMdQ z5~Di=4ba(MZk^CQUg)-O4VXsX!H-Qiw9P0D!^e4RnK%-m9=S}wlQuI7NI1&%rc8>E zKBiboJII`#a)O!5jt`b|!hn3Y4se>lY0K)mKSZyALk)4Hn=K!jw3L3e0<(t}0lVTp z(y!6B5#5;u4VTCjtcOKQsDqrcod@t(}ht_iw7I*~j$i)73|^+^sho zPO`m}dh~40Brpui0me{%}68ymIYbUqF<21Jt!aYS%?-FCu5$R(doE`W*>Dbyd(uE50% zEnM!_3eb@=>+V*3mCWl3t3DwxHxy4PFM3;%B*hG=6<|=-_C?oeI zDMU0j;a|!z;XjN1qE8h0x?X1A5v^LYtDK?<>2R#Vs=f7PwV-N>I1}Zm^ye&WJfK*C zUxta0Q>!lEw#inndQO}weYY&03`$G=E>rWQl+kXi7_rCd+%l}Cp!Gmyx#^%bqNdTf zKp0&=Uf<1{+ptSF2b+psqS;>Y61z!VkiCFlubLCrO^R2#`~D$|m1(22jN?L5|LD@y zookz=720-%dR(=>wHEfMi)>!S7>l}RiAE2E&Yw-*LrNz{P*D_m-En#VZEL=YIh%1gF`r$}o)OT_ zoeng)_Cr?%pVxv-?+7KG(U{YuDaNt5t>ov@WCDvS<2I0z>EXm)%2dXQ+5(ybt1&Nu zVbA`#JcN}D99eXbbAz|WRRRVSp6F;X}9rGfQ}YaUK^b?8np*RtS|9L{hy_koAZn60+kU+F7Ax;cCV`QRZkp z&>}k1y|w0`^1ivdewlKTqPyX`A{h)qkC0nvYq5T^4^4UaI9Wj%l~^V{n(0i&NLR+3 zp$ergKHKRNr8`EwWmi&Zm9 zEQAtOSwraa~-V-+G3+Gkh&Xxpcct;M&zlo0AaHc#YEZ=7ez zB@Lign)LNJY`NiG(ONuKU!K-TOx2Bx${>B#M$O+(j?g}EU;$U5buCw`c>Oaq-)i3W zoEQ1jle&29I}MtSYyz>Vx6P+E9@Ez1T>#-U*2EP-glO}r@FzsMd6B0V;em0N-CF)b zkZNtM3Lo-S-Ko*9t4F-+eh#)VpEWoSIN-o0r(RlhA^K(ag1i>&!A`g2Xnb`0*06&F zpSBZoPU1*L+dB)ijR6KlR#n{ELRHrmY46cmP&^Tb-qlphab#@7X5d?ycL`&v``G@Z zhdDPme^E6FqqsX5SbvkCikY*(6iq7_3~!`oYBV+0KCz&0{;zfwsaAR!~)ec(kHSX z^pa9cxyo2WJxWtx`1GZWMHQzQXPFPP<5_IBDQ+u=1V|U|;a=tK9<7A#!Z}?Fupek= zO**`p{!%fUn97_6x{xlg!f4MZrR>V4+te2vPI(Gl1+32ehnc~>9jj+&@Kb&70eW!S z=pwKL+0rorGl}bLP+;$J&9Y$pR$d@Kl32()Kn*1Q$1iDIMrr4NC_PQHF)}Ng8SY?G z49HppdHRm$6vL{~-u$n^e_Jm%*<5~gwU`DZRWb%wiDYrT2~&_FavumfQqcLU>auYJynyMJaiM` zOPFA-Bg+x{Lo*UT7k@zQT7x5!RXzowWN&5Bib~1}#lDCETDd|o&qN=g@^EMeOwdu& zQdB|nJ^8DW&wWq(`Ea)KBSIJJ+FpZ7)!A^0i^kMLR>c5xm0`*Tw+r~`!~$cU1m&f zqDW3M9Wnp##xq~x=TcU%ZWEgtbnM&Yj?z5NC+fSE$=n#ml9=VZ`>g#wU0^t%bha0{ zK{r~HsQ&;H-`?wpt?E3$sRsHW%rV_2;yD7vC(>~s2==G=0k4=xsaS3+K9jbQ zS5WhY{x5%Qp$jvee>WAwIw05)`45K~ki-R{f%>oU=^M;-H=TM#O7O@i2gVRa( zpi}filwjyTY$+9nBdRCRF2J1pB!(}1DdiZ`io`~s*pbNl`71fsMcYQ=`InJ(y7f4N zv`TV<;3akD{U9EZY^Sa#drAoCRTMxHQaOWqN-`q1l0HZLD(NeOCH}r-9rL-Q$uoxa zNyc^f&3yxp(h#v$jZrj+_fnq%eh~Jm?QQ3!hbq1iP39|+@&w9R#e-EQ+AKw3Vj{g# zF(zyjqeYSC5zF|ZO0+x2?*|pCm6(eb2gHmkF&$@r#lJGDh)0R(hEfzj>eC05R+3-p z=4I`*=}DpzaI{sL^@}~}>6*9h_Oz?o?%{}1cwo{xZb2CAh4v`sDSSn12fmB2zGY%v z74d^rSDZ?oZ&|jopOS7~5FbxnX0inBpx!e_&Wxjwbo+-9q`%QGSEB^=*qZ)I`ro*} zZBCE}3A4NTH4d}rIMzHni_a2|DivM zTn{F)RFp;H0B|WaOYFiNNn?p#<5$oLqFZ%5Muq5d@kM5u=yql|D@ycp*>Uy~ zapvODoMg!i_gBDF*)jX2{B-b|q?R0|n!pdB6euD3WGYMX1&gAQ6qK4idcFKx(J01B zxjEw*bFn-xemZN4yfnC)^-1A2>pFXkDtI^^M79&b7{v7_%WU3T9+W|S5*nbk>q@JR z&=guuK@c6I*_S?zu}rftb_LT>V;9I^c55EYfEl;7p~DEsV&d)A{hTqRFD*FIZ_3o> z`Hi)dpOzODo2l2#hx6vsx=d$NUFemj8B0CrpH1TzjbcQY{+rrCyQaw)Mu0qswBA3g zNhG8vo9Iq9cCACHD40(FvWL{b_A@!f)MssbQetSTHt(o#+UGX?!t1n4t$vd}P_hROn}WBEhu9;*`IuQm23Ud1K-~a42=cOI@IC3|st~A% z>X%pveV|*yhTx~Hs=0rJpMgD&Q>AwB5$V6Yf3Rq9EI$e#$;{^Kh%@lF_|Hf;>k9-WgYxtu_42jV&PcoSsLMHH|xm}bKbP;b7 zEfD9!vpwNz_woK={8L=RuV!UrBK$Y(bIYCzIsoG0M$p6q=KO#wK=Fty;Tt$c6v}B~ z%D8x74vR`X4GgfGFfiAhlV20WH3C_MFM00VjFt0vyLh$n{d_vVH6&L+1!L#9K~s^% z4qp&GY=?xi!+Co-O!ftSH2D?>&p*^;>j)x9t||wJg6jnff&V~KI*n_ByyDz=8Su!U zv;4(K#q3-GN369+Lx;hCp%pe2ixUfBtrt!w{>`oyE^b)QekIJQAaO`STSFbrH{oBY z{eW0BC1xepOSCC)Ecc%H)yx?@t=yKM1Z_iL>lGz$Wk{JjD zYcP&Xd-K-n_e`$oOwmc^3*(Q>y{v3wO`;cT&^RZ26YHsQyU$P7RnyQ!KFdxC4I{AU z(ZjnsN$ob}QfgB$gVW(q<;8f`_NdUF8Q=OU;~Ue^nwwD0yw+M0c7pk|&DHBLliVyB z_m;6=ery;4IVy>*+6u&pU)0u89*CP!3(;4_g^fq54~l1D2!#WpU--!@M~c1^AH;Ww z6Diw5N+nM8XYL)cI`%euvZ4U|4*e1}pq8?=qR>Vzd8KFs`f^jY@E-PORkH99A*>)# zxSK>t-!D8(xfzEO&8FuEFBaWq#m?4A-GC4F^JOjIF)#*Mi#f`CfEaMC#C3>(fHWLK zsHC)tYY3h)Bkv6YP(P%>NGJVGY!dR7H6duSaEP;cmRh`xUtxD!@*imAitmHa9cz~T*dfui~s>zuIegU{CSD?k*9nlw|4*tAF|G>rI zlo{)VBazp3#iD6o4CkO=De#3N7F2M1Fhl{&E3Y{yXy%VBaTaXk@5wF~+!pYX7lD(( z>Zn+d0fGJ~Xd03*?KzB-*z%K*7_?)(=DR{qNNf4a;m{@tp9`z1?%K|RJ4Flm+mR)i zQvO|}FR@PGDvXW*1%)E-g{uW8#4o3`fNJ@S;nie3=gpG(5f1TINvAjb#gj-UR!-xs zkvbGK@s3IDGA{D|kNU8BT%kI? z{xNsA>S1{r_m&FGYvaCC1*g04oK$Y{?|Cy-0byf!fvR8L&NfZRit%5#PZa;V(^4IP zjiye_Q{b8LL+wNEY-2%bIybZ;uVu(w1<3<=p#=hc)8J31T;(8j}=0m^*)3UK) zK()+PT?N_(c`^{*o`iM<>e^P;%mmb}*kU=LZ&{Q55D>P^NXZ1)Ep{>Ufy$PHLH`1t zt+k$!9EzFYdWSPr>Nt$R;iv+t9#DFe^jZ?;vtmDLQms@mtFgIsf?R+JS*4VZz+Ft? z%X)|{(e1K63S-e3c?^C3^gqg1>~pq!HDX(fy9x@*kvvs?v(c9DlP^OPYi7u{VfDpp zWr6r(*-_Htq*2MqQWk|8MUx8X4*r8O7uMKmUlek#k1bzKv^gF}$gX0%iF{c$_H*Mq z=~?`hs$OY6vArlm@`y~&{3KCP%aW!_a_Nnc1(I^+T0foSHitj;i+llp-*CQ~E|#t& zHsP;JZj$-(KeP}ew`?XU7ist8qaA?;0d1rKbCwH z{^GUy;zdls^C{CMr9z4=Up)%6qd1GKoG1+1rZ#b`eJA_~+%CN&G;`PHt`$b|q-hf5 zJD(o^H*!uO535IRgYUgx3nLM)N$H|PlGx$3Ams^Jg0oEn!X;oz%}nGIc&_*-(gCHf zx`re{*H`?7IKV*MH255ny?8ZzSZMGHfZvI~Oc;agl-(OfAfOSM=s?32WQFKKRVCsm z9$S| zu3}$BGaRAlC_tdc3MjJ-5-WhD6evQmHhK_zu3Qup0Js}XK^&E52))#Z_Fal;H z?5;P|xkI<~0c8V_UiWvN77EoFGaA6-I^yyyutC=r*#p|^OBVeRbQtsIJQGYc!Y*li zy7=E=gr=KNOY_^BLMXd=MadiRw{=g>9nfGcN!ticwMHzn`G8s1hTjtSw~Y69;rF%> zXN!5q4Qb9cm8J+BMj*W~=&Pro_vuNsNbP=I7Rs*lwKlbpk~dD1f&P*{OHIKkm$j&N z5p$O;Rxv4IJ_l8=>H10gb)oFnHdan+b3CT%-q&Ag%F{k?cwJMed4!%&VpPAy2ITBh z+vAHyq-t??wKj^Y+JMVU(*^6ppeV&0#4M6-*_v9WT!Hh%Ms7K_$4+|balMOClW zJiK3VxT=}(brnUqmvn7Kzj74icwCNxKzkfILJ`bN^fD?$oU92q)cyh+hk{(U@tf7^ zF9b4brFtCkd1bB2my9XgtIVRj%^ss*(vXx~`Dunws%SP{7^_+Bd;%FI zdN+(v8zB9vk(AAq#%R#_0TPa;ZlyuIUV}+`D7vKSh=~@B*G4V=F3i#Ce1?# zS`Y7P4w)7MUDfPxl!23x|5aZ$&S;@mXI0a!A8Pwbep!g9k-59fV;ie8nv8#;&o2LN z(BSf-zUk$}F@c};Q^+4Y|I$n8wPWo}J)HmB<(}Jk-W}HO^}SV|7Pw(+@lLaA)A<~Z z@h{B1^dJKT_bcI|zL*#j`9xPs9twD=eM>8!yH=Oa-0T)@IM1`)?U6aQO4wqH06nte zjCmI3Tv3y87p`knlz~jZrT*53l2$C+tn;QUi@2qYqhS_3*PLNI@#xcfa(u^ty4PTk z?d+!5>R8{Heek^UYU5er$b$b2WRf-Orapw?y<(mA8})EJQS*@wgs;|&Wj6SqQFpM{ z&uLY^=H79=sj2k7DdIIxN?pK{R>qo{z%_oj)(gF2h znI?N@7-d8^0yb<_ZN(f;f+noe+_S5z6=J_JHpS{j_Qb z$lj@`fM=wd)#31_gj&@Yq%tZ*IZl`yj8`la$-TD9g_0-J5qZ91EsBOB1QT(uwPy%&zpZm)~<@3S}99aZ*UwE zk4OB55lSf9JS8*tqQ+m@zcN+zTlq10n)19VE%vO!q`I*Lwwdg_Tx67iIy+B9x?O*5 z5+F@fEpq4=;-FK*2t}tgXAJH+!Rju9SNf2OXedf#DkBXCVm#!ZjOx(ivdiXTzkSl( zmMb23$t}~e@!!Pn6>Pf~wiC1CfAi4S<5w*%9Ozn6JGAObM`Qinbf31)#yN?&mPcsn zQb}_q_D!gh)tS)dTVcVFky+tZ7rK-4q2_SlqivV7vDIa`uKo3t0!GKfhPv#v?M_Xl zX^yQcF_p`+n%i*HXr|SRuz9hI`7YVp2W4JHeLQoq`8u=8d6C79FSC8a70|9Urn906 zm!ICQ#w^H!TaRF$ta#euhToVFX{{p4qe$kDWL3yy({}1fZ@Os)qiRODsgM1{soQu5 z{51yV~pL*yMbp6 z_3S+ha`b1o6Q@NRG6bhb4Qg))|99#YMzr?Pr>t7q{EZQsUTe){RwQ0DZ(yln15D%C zSC;S$LqKvsq@K>Rn|DliRZuZyjXoX`j%2B~A^-bl<-cp`XLn>>Y#z;#r(U$+0MYV5 z(={%B=5ybW4EJP$cn zn@1yE8T%|O;hf~drYFM9@nekzqSDA%{ULF1aDxsf!TJ27jg?ioFV~Qj$hcSPck&~4 z@1@tlo?(PlxzZCIg8`qPjszF3lp9xJ9~xMH`9=SIIH6o}q?Z6i5~ zs~wNp`kzI$?l0)q1?XlJKhaJVOUt9xzW_|tQq@;dXl=amQ~i9@IHg^YsPUF!T3Qtb zC(nwi!d;i`pZ^%YN8aFI09Hf$n)&%%&C%+&MYk=zLQ%Rqz2AFg{g*{X z)AHu<1w6%c5M>^M8x2A9qsbHC^|OiaK$J`0tor$w#XS!S*|?kCio`5}vFny!DIVXs z&OWQV-`0y)vkmH|Su0-3rneqh24iQnEnobeI0L3xXn>a4W*f5hEPBCQdVViS_0+G}%&wtqnk8omzd^mTT}fQXYYU$I1wm0xqsq|>x%=poaj!^Z#yR45s1{gH z^{gIbpQnG#cH$9%4-v7#Wt_Dx3l;wepDtRCi$Hwn8;1XgUSg6EkKtJIDsmUmku#D? zCNCmfrZ>?hLp+&K#-b_-tCKZ6^CmZ#qYtkW%;Y_CStNHCZ(YDaiwWTFPgpYvZ)nG_ zrkJG);%1tR1tTA0DDYL(+W;E8kui>4SD6VkaAPwLuD{ViDOy+xQ=AuvXKMBv`LIj8CZwXpqKgN%ALxgKNXv<#9EL&;w zQjAGk08~o8hJ0qI6?H1mv(73%)7^y<6HGv`Hoo^s?rPq871V!{e?* zmuV8oudx@@zY!ILO!bMzX{2@P`NhRlXSFt2LvK|t4b(6WYF0U25T?tYb)!K0EEf!= z5VQG;2moJ=(&XH2ir4CCNO7_QWVh+M<;!ujL@{i?)I)C+pP|4Le$;f%v> z$zhqab4KgV-nqKSHdRldBm)NPdIfAleCS+8@I)&+P>^2ioA#tyEuqdjHUA=sX~|Cr zqU4xg`jTLKwAkXFT9KKMV_61 zt92`8^t=g`n{YGxwb?iDx8@w1v5T;MPLa13Z|KOg6Z$_>wV>l2M`=5tBedJ;FA*fs zH)a&tzzhR;xIk07~Xf%gUxmA9NS5H5hZWgQrE``R6PjGe(AFYCkN6o%TI)gZ9 zJw+)&W7RjP|KP%fDfCjpI=Y;3o?L*w4v?vPT9&dy8D(V_t~;@%DT zspUK`zC$opa9)_>d`a#hE9_Z@eMP%sJcYl(C{ef*FEUSZ*O51{QYop_F7^Q8Je|!A zZoJJT@fMc2vA6=Clz7fj;qf3Vzfru&dAGDzzN<@#9^kyzpTu6|UY5 zb)#Q8uvqKj@Ld9ytu#Bq9+(tLIx^pQoBs{H$(Tlaf_-FIhS^8(GE4?-CWY(!tEW;@ z^zpg>(1LZp<2dx!`ow7!41dEP`+P85hu-RTmV*$fov*l`QHwjSP~KxMv=5@L;2o?d zTdot`EcYv`$nF-e94E>RbMMSWw0iT2DZbP#|M{zRtDw{SZ%L!!@;MOp3FL!W4@l=R z4t+wzVVqa5f74mQnC@5Q#l#O?k29Z=Rb6c{r4&uK^JFY}N4wN+gGLQmw6swi3VX7c z4%|Y1OOf}hgAy;MSYJf}Zn6e(j4FKPy9*X)~Kk4deTGj>Av zXdo2y$pB@IgZj#@uzn&4ocZi8Xb!oN^BXrC;l&Ffb~cvq8I;Av%Y+W}j^w{$7hq#h zxNHpP$S{-omc*xXB)t=1)bSX*(P2_o=1c5d)*F^D0YcozhLB#u`Z?>V$ohA@DfEv; zc>Yd+m2^$GixU+XBQf(n4{K0GOP99~r^evJHJvmwF;$#L|3roX`OIc2h>!prrX!)T z>{MoJ-BQkR7Pc^n$K(Ksdju5T;ec$htFU;OzhaKu$NZi2l6q4$k0PQ&g=pF&#yf_B zJ|CdrI+;l@iA$iMQ;jb`XnE#z?yH5M?ZzM?@-9Nf*e`%4(z^<%^QhET^qf&Z}r; zv?=dp6M)gGyqPT40kzANOYAjTkbN}OeV8Caf=G(<)}H_r1aCc@@S6Ba?*K0(@6)Yr z9H0U^T-hRefG#`p2xFVBF6IUhq5I-}4wzvW@~SDt=&2nP0S7y-y@#R4kFg%Y+tht5 zU!hpiDobMhV@jjBqvRU(i`hN>Hyvww6YapznKw_;GXgArb{pi)DA?=~yn0M!-+3Aq zm*2Y>^OE4$qi6#WcXTsr?~|*#tVNe77ds!PKA?^1ycD^Jwyo=-=SJE>^KUyrnvEP> zRKjUOuU@c`qQaWz2cRe6Q|4{~wG*!O!)m6ITIMtsjw2tOy(Pt&vVTr=xQuddcHV>l zYL{u~U2SsWz5)9y?(wY98T?251VkG>j{h9ph_$7y<51x3LL;%Eh9R<2VEH)lS$bmv zO)3S{{!5!qPYoJ6Sa#sjo^rW%AY{ef=UFFD1WPi zgh}+CyqO{e5FB45nZf?#=PrB6`{HyBVcfK-;=AG#j>U?0*=d_n-iam`_GbRu@&xWU;qLcoVc@JhEy-j|t&BQpOh^!+5-U@Z` z0Txa1GrfX+L^(I=0yj{#eR3=Jp_XPRNG1?<+81mtd9rpR`6p$AR*ZT?^Vimc_R!n4 z$u+AP54ABx8EjIuO$<2~Z8cSYmUWyz> z9dGt-c}x?S`m65HkC-wG${Bx5W0D^M?xvE6THvO6y~jn?7&G2Z;D5kx>y2aJiMc&l z_%Ec3-3_o$l$l-PraM$+=bnn&w1Lj3ymI=Ljz@_n7+X3UL!UE;by?k=n0t)2&7RD5 zaUbFR<|oitggJ8`;ii!$_b-Bmk&$z>jgu$~W_OfNq3)aYCPzy?_ zkXfR!a~TWt_w5Ab3DGlfvoJ=S1FdB46!#+_gm%dYbS}JABEh9K1xdY#e&s0X8A@>0 zJ=rn3?@Xp534ly(R3~yyIJoHsWTWJ-1alElHs!D&)H=o_;YMr$ewe5XzX^Ir^o|tW za7etIvaBpX!lq|tZjy4D*JqT;9^=my^%QxnwdBGqnIJU3;qS77u!Lw9D!#46mnaZbH0k2s@`%xic<^L z^L|KDQsxW1q%DyKAx!psqFMA=6>1*~9)-~?O{OO?<ZJ zRr+wY%YnRS+>MH9Nl$qjm5$+;_y<%f&mzG=EzVBhKWvM*SQhoEawJ=!{+XM}p=cTti@7!0QDHNA({vjq`0^eY%IpLdjyBm;PHv)S8=s?* z45G0ee4fcN=GR99eB;Q{xh$mNUACB=ZX6#kXMZ#94k_j^%;(41)XWS!>;xu)TGRz4 zR@2Cx8Y*MRYCW49_P}HI`L2e2W&bJ1nI7awdd1I_H2mUhY4}=S2xhx7LC7hNav11TfvK4q*%VOC# z;=Sq-atNid;Gz6B?RCmM#S&&`uCU!%_c7>HU)=Q}t2n{xWj?E*)@fHmy zkELdcgp{3Fjpz%F37sxxFuWU&i$5?2E8r42OOZ#FhH{#cdZgcZmEjBJ(SiX_o$`{T z%H9vG5lpz8vKpuBF5aEh?B6eQd$s>!y9$YM_X zLve=WT<8=@rR<>lBbl#iD3gWW#f=qb172zykz}`Gz@Q-AvoqJKf+k&{|_H!zCPxNpi?{KWhHK9dA1u+o~$$N z5nwZ0Z@p2^;`my7%8NNGt<=0=ZlKkaVk-mK9uT#Nd%WYVZywj!*)a;ipP^~7w*r3% zpv-bYq_QUWHMX8&9qip#JHRgLtt+*#clS=qA#nVAkx9!q#6EN64i0@5Y05|Tvd$+X zT6vDDZ$o3TTDuiINQ%|spcd49tuF!vzNmSQ_N^b#9KgOPGitUI266^9XUJ<4gS1Vw z6=5y9+05?~W|@|8Y#wjLEZeEQt9k%_pRiJGMHL_^Y9eL_h^(&1yVpU~1w=tSegsA4)5ZC1#EQ<>?CGwiLg$CME6>EMYfk^mTYS35%T$W9=AlU2~k z=%X?c<2YnMW(J}gf66wn+N%;|S8O_LaJeT}nEp#nZ5HwclEG`}At&Wo0 zo^F}#B1TD$vdUt3WZcH2+H3rJtnM4L&>~Fi)VPt7D!S9 zY}HR?y>1=KX{w?42RtCg3QG_v;+3M|AYbuo(V04mBv9O5wn@??LE7po^+-!omPl^P z;L%8Fk^GL|W$9CuWXvkLt9IxN1*;P!$bDfL5nrxqL5lXvzts$gzAFeNzs0eN*Exk^ zlCnGLr+B%FH~oP4t@@j9xTHisdDL_149!-1E6^K-VcJN@EFn!>&@^ATT}!F@E_|b% zQ=BdG*WSz0i>h^?#7q%S9~JRQG|%v6YJ_O1SvhiyxKmBH6Og9_W#)C@bporoyoH3>e`r2n=NqPC$gl_cl{jK+wLXQwtbM1uPU4m+bSjD|_ph#w zwm#*VE|2jgdYi77#q^)7U&R%>jx_!h4XsEqqjW@K4zyl3lJvIusCE@)RSn-(qYqc= zuN}uo%GsoO28>T$r+L607iC*ta?AWi>e2;KV_Nj@q0hi7Bea?YG2KrQDrPN%A`3F>@@Y0inqjoz+vSIo2%5Zl!?tT^y^ z^*DB8gH?5wqpSq0I=Nemrl?wY-!hM@G6m%cw^eDvlMzo;3i0BpGIhO7Fbbj>_FqL; zxTngAU(*Uxo)yH`4JzjegUWlAc+uE`I%T|gOoo$kq9izeigJvU6&|5Xl9&1HR329? zAF)dLNo~uFmf0?7w&IH9Qu6}EN-3e%-==NlTKY;+D%+U1OfgwbOly&URaC{&<@c51 zP`Uh-nlt&2B3}2##arQ{^0yP(1oG1=OXCCiV%5EByqu%XFG-T;tJmkevh7}yQ|8GY zX#UPvFWaq43|=E!YFIPzsceDim@`QxPz>$$K+9zB42K(r%MKY{R?1`@#_2^>vO1$E z+fg>!_#Eim4J}t?=^cyeie*k6J>}=5 zhdWjlER=FOK4;cSr*!rvyqBEp`a1oV1mE+-A1nUW^UQs=m~MRHa7Z#BQ`!k|NOyHx z9>}??4tlcwVrMG?TydpCf_hqbs(lkync3a$PKZm`Z=Fvb8!=$LPIH(#v7>?6Fp}QY z$Qz1>fqw1mglwEn`u3)-!Dgv}Ww%U1H#_|=wr>Zb5@7Bho3 z#l`x8wQ9tb4kzIRyA2Ry`$P1D=Cbzj*n73H)*SrPvTBQ#_#z)>zE1v`UTFr?{Nomw z$1rGNYs`7T5AVMg3pad3k>!f`!q8Yuvepo48?Re*q;b^;%!kQWOJ12hsPpp1m}qon znyojPpjfhT6N?;bGTJIDO#WyN=09=SZ#pMK*a@In=0VDx29(*22C1qyRnwmqn~kfO zjGUcDSC(7Kal?G}?wKiuW^P{y&0yglne@)MPxR2G(C}F?U?;TvGNG95bw`a`fr}Lz zj4tfJ!j}djhnDTFzr;P09Hl4l3u6}Q0|oDc?(56N<0rxmO)|~!sk&E6mYvW{G5T`r zYJ&|j9-{20{vlsl5UZ~dv}ZQ!4hpv<5_HX?A5m9zt`c?NWZe|meou++rK)Gx9L*!e z&~CADt^T`6Qq9(*#YLrH-5H5rUWYDM@;QB@cDwXJ{61}keAx65%}<5gAE9}r9y?*P z7OhKjN>PuM5AD?If9bx-A5@;u;S`MG4caS8&zuL^66N01ADUe%U7UlaSiLZ!RsB?3 z=*v~_GJwY~R?jnLJM2;tWDe6(6+T-QlwPsyP;W^DW-SMp78n_;v;-)@gNSW!P z&NSMDa#Z`wZ>RdG7}ot`-IUw)|NeWJ?e@QCvxcX|TdKalrbIVF*g*Gb;InxwcndC{cGB&H5=zNLH{Wao;?x~ zRj{q^0&0F%Z0}lZKoYCx0RBLXYtJ~6IViEGh|2V;?yF{O9Conh34eo~&^T?52fVzR zGV2%;D1Fi=Lodu%^tNEHWsd5}CHN<{bz?}XXy>k@RIk8h_#L)CtUAM_e36)*rsPHJ~PAPpyKzipEpvEJ= z+r*jc^tyvC8MG7X487m*Wfk{&P7y~GgS!`z26IPs87XtpmUT*L{CJO!0R|)TT1ONx z+uy$f&T*em*yYKWI9aSTxsRPt8{8u!v&!Y&ZIs_d!@AOG?b$m!V;Iq?kd8>^o!G1G zc-E?j71mpv)qcZm)f7j&H+OW32AphBSn?q+YxTPBF#4I&-(4QepaOcQBcRL*YX8f6 zm3+8;IEOSd(^|qC6F$mvkpE&D(ehl>IPSjnt4!{gYV46+vfEHq()p2{Q6lJg$3f?v zYJbP=&tO=;^DZO}w~i15#IP;3!v4@W^BFOIir)N4<~4SvCE{Ntb3OXM`B2f-aYrz& z=t}!z!S~!G>uceMwCk4NqVEZC%LIvE)G;$$st9J7?#f%ecbM*}X1gvhh5oxHS1bM_ zl)Y=71$uGcCEqoTVKzbE~OLmmU7uC^t;?M;dOJE_qEc z>@`0eY1DbDkK22|elM0-8x5Co_gc_KVurh!X_}eXZ{nLvW4;-MmN#L+h6NoEU!wkc z=Yk3U=zC1tT>3RFs-ZYoJ7K|Q#LdRGo=K>^tsaJ1n5Avsq*R;)BU^EtBjPaQYL#`RE<(FCh1D zo|?UIBf%uRj+#h1K)-=mMfr_>gHNYVZlMz&GPBG4DLt&R)SYw@hZNib^zyQY-4*+a zAhSNV_>)nVliQ^FMnep7)cRJOGBqG&BAsO_6Ln52hK z7B7PRMY&5R)jz3Es8hLKtzY)X`LV1qIh0F$F(RvC7dLDRQmgECB9YOceoJ?RqqB37hK|Y^VAREqBJXr`qjl)ZtFNt?xWuO7T)k!ymP44py+wil0mS;l$&T7xp!e8}Wi$);CeQPJ)Lit$Pb{l4~u#SyKEFj#{R&bYp5^CedtlB8B_pQ(R7c_C-#@@WS*gHP662S=+^_!@>2kV<5Pt@e{XLI@>JV* zQw{nb*hd8qdl}`*eT6@QxlSn|ZpUv!Y$l%|;T!eT-_+^FDh7gnJQ>ak0EB^#Tn77! zlZy;0T-+T9TZb+%R3V397szI#(FAu+9JZfSO4^3MLNUSfNz-T>8nP)e#+@QC?Gx}L zsg=2elN^x2Ue3#M3YHuf<2t^y4UqbD*)RyDMzRd)PMg9)q2=_WL|5!PrVzS^0A)?C zyFt3o-d`9%#dE=lbqpW=M1L7@U2w!HTU;S^vmR;v&3vYbYrDtt6dizFVplL1Az2(E zo`P}bwnMUU3v5+Tg~U|;@%%UBD}vhzt+X!DSicKQcQM+jMKoGwH5;1e38GbQpzVS| z!3M}ZAwXXZUo3LPwxilaYr$g7Z*gJu75q~1vpfgPPrnj@NK0nlCc~;B{8yH zMrNZzE|!098I-Ge{cVx*cItB2F!^fq0>l~lnbxIfzWhU#7cM{%m~+%tgAoynBYjj{ zo{A;kQH9$_Qy*FXNOwBhQv&%!e8ELFm?BSf;(nxW^V=#k0XheP za<<^NI+e6R9%vCle)5peGsIr7I9M%rBhn zsK=~4%6RMyHW$^5=W@2UEF^B>KC5gd|KNw^MANDT@R?5-r-l2bidkV|yn{j-B5Tof zw+VPF#NDtsK8CdgVXKEs3PGa;j}f-a9^vw)rv!Hqs(dF2A&$vfPgy7aHA78zmVER1 z%-AC9vX6zz0wPP-3eAuj>22mJc#+J55P>`*tB3Vr5@qun-Emsk>(U>DtMbask>nBb zBhl}u6BO#n?`YYop?8!5+;UoTmM;Qt(OBubper@?xGF@f#s~5bYQ6edeJggj`dCRb zzE-_6T|h*sZ%0wc6E(bv-zn+3RJ#qbyk?fgo67@%&1C9HNVVxOh6=l4nhO4btTGB~ zXQAgCJ{2v&-Y^(bPvZ9)*pVvRw1*-&WQ&7lnfE z>6{O8KuqdbUA+ob)_$j8I|k97pL`Vivpqf>hSPP_yZ|476f$oARWTMA*HXR#~4AYJ=-`NL7adoL#b#uWDzhSp&mdasUKO*m_qWhdzO zQ~R1wvJTqe*27!{{R1SQa*{a}u0Z_(%21bEQ(0@VzbhYcQi+K<13V8(RV+(Dp&O^F zB(8wa=56i~9nkJ0t!ld^*+TJyZD*gL&PA>vN7F}OU`R28iw|hN4!95pD^{>}P)ym~ zoPK($Ed%s1FkwoMD2~0)wjMhqVXBYfZ=n#PYs6m67M3d+jQ1vXQT`HZ5F=?T$sJ7^ z27-E^+;&jTaLN+0gMi!_P25)YHlK}xN?x$76>c&I@mpl8HZUCG$a945N#+A+sK^aKtfH?87{%_hlYTu*KdF@^z?HbTfZA<|^Yp zU5a-Ha&hIvF)Sl=IN6bXr~VM-9XF!n4ebR_l@ZVQ%)b-ez={^)yhm_2Vv?O8?M1M- zGq?_@LEb2;0UOJEg(2Y!`G?ywh;@P`brZ;yLV0mBwL-*58=#kq3De&(TO|u7kyshB zq5Ybp$ox4@;RfImCm~7lm`kJ7v67cj_E@NMs|u zNfGB&&Gc0b%_yN9a$U6-7!C)k))1E>U#jLKmSTKVT`ldnOjSpfiIA>Zl>e19T{W02 zCqGjshM%UEXi_}#>3Hp1dn@?7HmUIt!xiReEW__XSPj=;r%<+tzNSN%Yx>_6gSbKc zmb^T|D!nCfkd&l98|FZsV)SqyPjfbWw-dM^FsI9(`Wf=6vl_b!F6vN2jv%|+k2IV_ z+v=5--N2HqmYiCAkhLWKAOU0D5WJdT?QkC}qdeCSMRBkzL5un)Qk)@fv!9_a!DO?J zg8w2EeLL&NqOiRuN<%OKy}?=i*o{3OW8dQz^ga)?Vqf$Iy4I4v{jchiZO5s|1|~PH zvFQv9Z+%05&-wzX#I0vPhO?lpoSUfi4P$st*b}8O{3gP;41?eeWkU2lu?xM)yI8gz zuw^bN&P&$G!1SWFQ{2N0A*`KN!Q76dVuOJPm`QEV*dDmSx}6*(5h(u6y+nymr`ReX zJc~LZ6fnlB#=_iPZ zWE?XY!KAtYJuM4p8(Dv^5-v(On`RDiJ#%>cKYQUy3I~HWLTLOB)@@JV{o03)N3@H`kALP&y~kiBT<+gsx%k zk>7M*!7fx`?F5zv<)~OkW@5q=htNXX+WR*62_Z`9RG&lqsEjLJLGDwsv&Ga%<+XSk ztwW^^nL?kV{yuIepwYycR_I~Wg){A_jpC0AbRz-_--I1b?+aQLMLi6>;!>@d#dRNvzo^P z`4i*#kq{Vy$iD@rwX_R*Q0-L%LJ4+mLA9uda3E!x_#^ph#BJ$ax}R69@;(r2BYd~z zE$(G|x9y|P=Zu0e@r$_*w(>RaxzEs7n`3xaanedA{~<9TKSDTxd?$H?h(((neoRuq zGNJC>~A;Wk`vM7%=kz*}Lrp%bW7NfyAz%9V>gq>0m6# zxx;-5SQ8%b8`#R&PyecDtGs&z44 z#%0wuGH&zQOGW_k{0&)QtPa7mxEA(zQEG4@S1f)t?x=twAKGWpkc3x)D%?EM2ElvS z7m8Rozxe?5t*E+ML~js}E6QRl7hlgHGe1iX&Rok%mfj1T&xXn8x?Sc0Dzd#5lmIUl$p9-}&6vn!D4z$o05jB&UB`0P zYKNXp5(fKQI|((2Kce~5Rz>X6ylt349;ta%{*yw~{Kz{`U7?Lib*CNI_C`0;SLo*W z1<`LA{)`T1$7t@@Z6J^_x6L0B=Wz?o-JnVW!JJJNr^SRN}faw zF(am@Q@2^3PF+sTX?Ga$4)~~s+6g!m#<7PBdxl-pZHr08w{(Zqun9}MHk1?-FLWWZ z14!q(REaI*?rwMlhUqN(VmwY8!{xU3Qvv5s&pD_p`PTjQFg%W37oS#mbBXk48-)s`0WzxO1qhHiv@cGycEz<>g_?qV{0V=Os}9s=>^v5v0`Pk zZC(980!789;`*_}IShgTx`Hbv;hI+SP?YSdMf?(4aG_O@!5ESLR9Fl+&rB0Z*pqD$ zgMM74+je=OFxyTb4FGwR2y_z*O-@v87S@z6&9_t1NTt0_=hufLAh4YYi zHZ_6!Ne~gekv~ni%I}asC|);aj<{QHv=i`-G$T(6UrE2quWuzW(*<$0i-2n3h|*K6 zR^juUH*ApTMlzoR7Qc-e#%+^U`+D+P<+4$?h4cT_E0) zDy@FXI4k{A;>ElrGi2ujSLAVtS6D|BVfFa(P`@Zq9z7Qt;^IiA?hCqzCes-Q}_ztgl>k95;$%+?qcSFRaCnT z$V3v>2m?Eij~espA5tTXNfk3_(Z<9A41JQZK7BU*o^c>9grPL`g{l~*Ec+(CWURC% zIO}-L|79J*6N%!^1+D(1fs_dy&&v2z$BsjJo2chHF4`jfc%A5(7}~S0hrzRH zXS$zx>FJ>stJ67Qmi(#R24aW&Ve=dmOfeRuZmU(~K;#W31p$t%*rAw>s?R^J_=U|( zOH#HI3S$TmuTkN#FADS@Ibnqfd3;kwJk$Dls<+ffL_T85$EfZWWDHya*FH~ z_Ca2k97o`!`q`8qBcf+1CsLpIb*nxw9*usZo5}uUC*WGdm58d^1k#(6o=Wa9QPbtp$1KYKJIyWRtttn&U-^p*M)4L3R;9P|D};yQIQ+lj zkzu)lqmnh=ZNfEjq)VnmsYVGjybeAe& zK&pOp(PZG7zA9@w3##9ql*c-6U`G3}gN(-lRLeEFLpx9Alg8w^e1N z_J=Xm0ArGOofZPTatYBr6hznw5RE(s^SybBoP)bjb4k9LaJ2N4`~hiQ-g?Dk%F;BN zf?;Ree4wtU7+W<-wb7*Jl?};xlLMzuv zl9~FV0}>hV+*Wby1iLkPo-~qkDdxO%8IKcmOhy%ez5bD37kfJUDN_`1JE27*9AsUq z3ln9t-jVXY{2G+tkZ^oivamq-GQV0lM|3EoLikL)HX&A&CD}V2BbqIn=noS+E8->; zi}$JlN4C@=8+t!9+~Pfx-mRL?C&?%!LjHUCsN7ybzI=6Bmq4q)#&HFMN@&Cq;YigX zUzIRP%NSoH{H#xL7%zP!8)LVj?gMwP`fbH#Ub?2C$i&;FIiJ0n_d^R#S;Y_0xzAMd zOZ1Up^Y}H!QB%|TVP?47MM2Adu~l|L?KIASX=T}KZlvj2!DVj0IV|%#_k?+4(l_pP ziz((b_iB4s$T{w^&Y3=u+;JV7#@N(xwJ+_zwclGi&Ffkc>oMkH(5*_a=_SNeWHy=L zso85ysmM>s?IwTBj+lL>QvB>7fw_{z@%+*rK}9$nw?1ZXv=dr6Srw($t%wZ|I^hknorWnRl0$^dOzrQZ$T zS+hW|L_R1R(AQx+3r6YvahaJ#y6*&fVzquaX>HUJeL2-7fNMyj%O`v?Z2)SWoQ-|L zp_O@Kr1m1lyE;O<1~;;_Tx-Dp&0DL*5?`l(*Orl=BzR~M)MwMV+Kr5n{xDr1(BS^Z z@DC@q2?)VE2M#gEh{C?j(l)a$8x(l)63>5{nX>fOxJ$a2kC zRle5*Lf zIgnhc*vE67!BgDkvqGOK{e+XJJXP)$H;f&t!pUtOImNdB&h@HH@&KND$zoeQkI{J- zmib8Drmxxf7$Dkd4#4#srN*wsD_?-Ewr z9!u<=I=ll(334-Zou(H$IG7E>NV_GK{PuTnpOP`{t;poOL)JkwD8p*a#Y&R0El2R{ zVwPBXiBCc^EW0RaQ=F}LX)9chcB}?Q*=lEai?7-V6`|HZbVSj1%WSNBF2OPx?~tBl z?jyWU_+kzuy^Y42{!qS#j5bHnr+GiNlrSl-j#eTkz^1Wt@xS>{w%3fn*AzCH?h~DJ z#+z`Y1F3I}?qO@Mq-?s!JBzGQfF{v=>lU7aU9YlUt=6^>u68IO)=l*9aaBF zDDF2D((mL=(LZHoWo*~C18b8^`gr!3nR&X~9AWr&-BI2c{~FyJ{vEF{{h)|Ea+z+W zJoNvLX5mTQIriKfs7}k-pYEp1=e|#Pp#8uPh_Pyy3y7gVv_|10U!``X_>f1gu3q+d zM2%*Z%4UPicG>Uwf3#YGDQk|lM5s)y(z=SQ@&20q;>A%%G=StrNU)|%hMC%}DOL2l zr)ZRF)$l{Af0U2@FClNdhARD;u~ZW#d!AgOeklJQ>!UU+y&|`(6I4Kuv+9|K;Zvcdg@-*t$zuE zou;jIQtUBhZ6hAPU*Oi#N<2v)1+F1)!#syJQP+XaA}Z**>S^e5CLy;A7tczFeMlV7 z88!7Sc_~-)FF^z~5UL%hx$?NW6xwRultwPYmzveGjVVMIf&T*cT5DiI?AXfv$b612 z2Zt%-o}T#wAH|bVVaJROm_H(d&lkK(T=K6CG6(hN(oAuT=yBy}F%I}p^HjW; zSl>Vse}T_y{wQf|dIfzE7Bqk2kEB)g=65A#l@-{117pJHe367SJ zRFN3Js~)P7@sc{BY7F#I(|F~hhVoXt@>r>7+e+oujFGTb<+iAk2yf-fN#W?(>Y@FG zTvI4B&EV}Vtu`9z6Dq?EFR<%sjv9&~(G4*Dvbwd+8};7BM$k>&qBJ?AOjkcW7}~6( zdW}F;>xR|YRCu%Hk0m2z z0QARvJz_NIlLa?{gjAZ~_I?nT=7-OXV(lurG-nIBv`jHO6Xj7gs_#nc-daPipc>iG z-qTtDZ%*sxCx^Bi=&lb7ZyDLmA0LZeWEjdjFwI45t2v;IMWr=p_>a*8Ei~E{EWT|5 zW(__7b{eE32BJ!;{vp?5Pvyo^uMj=tV zp+BUNZR-&2oSD$?=nOIs(Tp8HE<+t40SSYf7}PUNRx6%fMHtmq&e#pp!V-b_hF{3htiIBV z=tmrGs-fP@lqVteq)3i5uQ<8F-9uXqincCY)&t zhMP$>u%nIFDbr92AtA+|ZWP`MQu-uyyv6Ll3l zj2VbgLzD0;akYq8*aSitI;}xPiopexLMdS4#Eeqf4)Uw0mrN|}{3H|mC)4X+f*2uR z2we|d$$Jamf=H%Ak-JdWac<}<*jmUE>~H+#`V2w_DXS!l)I-^vUO@Ry_nQ8VE@xUN z9tS?KI{qa{U8J4hB8-^p09k~y>4w9d2xbfx2_xy-LeWPkowW~fQ8Z=o2*Of^BrS&Q z36Q6|Q1xu)L|3K&qF{o9O?}09sL<-JJQ5t)pTJd1Fs7& z<5sX~seZ&@&XY(#vYE&5YNMn1f9yRegf!*?LBP0{NvufXeb8ri3gRbZ6DPmr51h_z zuKI==%R>}2W0vzd$$Rnc0$un8Vw`Zd$9d`^ajBiaZ>U=%aAJ&a+$NCXU$mSMI>IM{ z=Lu&uM?tBgjLIB@hv;tJPSi4SXHp{OsiZNi4yThgyI&!{l4sco+@zW=*>jpl{d~Ct zZhX^5`4nhPYnMEyk=F*uDdkIGQ{^jj6A;VgUlR_awken)577IR@bSY*Xw}f$o*i3t zNc)`O$K2l&>WrY{;uijjR~gve^Q-b_SWoqJDe%k_qX-Ssu8%}rgZB2(*%&Tkp< z;5D76W|-S(U5ET$wQcFbkGep^{-=T^`Ak?l(i*;)2Itz zyK3Ijvr%JE5_8}BO z15m?=cM)S+FOXGer|MPIX6&7USM++qKPh=kA$d_mE$bJ}=<$ai$hiD3K}rz(Mma-a z%%$iv@Fzqfb~Z|i5a5NFcP#)BhbLDt$YkQh{OeQ;r8K#aK0w^lN#tLZ|BtQn0BR!o{=H%s#4aj=f{48U z0*a`JB8v3hdxwMs5+H3i+tPaoz4s0ZNEfBp0Tl(rirBFCUS8f0|MPxt-b;o%ftmeq zH+##u=brmLTciE)Uo0DA(+R&#%<-4ve{75(&LS^c5=6!&&72}6{`75(am2p~m>2sr zLM12^&-M=rIYrQLs|ue*Jayttq)o!XLyG7W(unci*ulgweGvaGS#5Du!ez?SDFW%G z*C*mo>}Owk{Kv3$0rN>~eA9y{IkJ#dFigg5Fo}aNij~zZtjB9_! ze>z6DatXA=1p922*;#vb?hI*T1+F88s&kgle}K#TpL6c9kDR^TrU;J^$$5*ueGt(Cvmn^95$wT0wcj3v=6uhp>O&Wb_lqx|9nc zhh1FdZ++U`zRGo7AWvIa(upnJi1fvweqW-r*0j%mru5}jyuXXwZq4+79vN@;Q<4W- zIdvDws<<=GbK-jN-EOfFX>om?FZ|CDp8J|BvjQy*C^+#ZffGD&h(I<9H!|Lkv?(e| zzmifBTep}1_{ROm8U#xdb))5;^YJrc9(w->pMl%q_s7o;uLvA*1qpLPI&9jB<>6wB zzyxv>dAB|}GWPg}(xmn{<3&QcJ@KDUjARx;^u(edEA9)zk|NSrr4WCyAq1yj_OsD&k;u#worpf|9s~0wxNNcTcb(grs2DTJ0h1w z+IYJuH3RIN#$pCyeUJI!TJZh{j>VlO#2FeA%j0S5PbXB7%G5t3rzg#t`W^^gL4;_B z$m$Rv=6#S(m<*Te`7k0i&fHNDl}C7DZ4i?ikL@?dm5_`K%;S{G%DPvHyrgt>^Tf|o z^?&Ul(7&4ih4%&iB{l~f4>=tF*<)Q;C~1fNLEdl$nn_=j%}L+q0hu#oZIg%xxh2ssfHLIEZ$ z4~CII;vOWzhPh^2XJiGmL_0KUAAEUU7E$pZ4NT=26Up^-M|y)+dUqpzUg!J_kbb8# z0b$7FU0c<|b+P(2vhW-1XLDY}=VSj_B`J4;*zOm2^#QBA zHuJ(fdVKgiU5AT)rQ8qJ^#K*!kpsCw0o+f!p9S~wf;asM*~f2QtrL1ps5$Fd;%wyK ztQV?qBgjns4tlgpQ{1O}PnZ0*U+D8!BCz`DcUN-2{AECp#NB9DAXz$ZS&qiD z5MRmWnFh%(;NgEy^I`l7XF}BM_}6aDLB|q$y_S03CpG)pIQo&B0;EUpCVmg@GVe@I z3j4k5GWBrO23-mLWUSu;4ur)0Yf*8Uaq~R2BSHxJ-roW)6RrFnd(h*P0;?QWBs7Eo zR*mGf;Yas1CpJgv?!2B%kNKd(r#9n9)LKCzv3;rzxFfNee&@qZ;SvJ(`X9g#2DiCu z5X{1~>_&+vBX~#B6D*_Nn01go$A<10Pprq^UMESeBN9}q;j=R8acqan-k2PG#EGLgAHo{T<8e!f{d;N&LkZ$--{M8&0&H_6EX)Ef+?N+VfM^;TMXp6I>sLnhVXIaiigsbA%^XYWN35sn5b(q2 z8pqdj+;5a~$mxE-eU5>RNl+oj#F7|d%W>aZ9a_RUy=z}sA(x`Z3#;IVEmuaW3M^Ir zQs2UJrU?Fvy#vGr9_qd>;=PXR{4GTfjsXFaqI!$gAe^Ym^kcA4ti6L4vQ6TyTNKrIEg2nF9qu-xw`%F9#8t=W##-bxy3is<~{`p5FhHI%7aTy zztA3r^=~s|$RZzVjWe}lzRcT#=Ewcp?~Ztp(CN7)u#i;f{mmG$dj~<{JKQrK^$B%@K z!QqbkNG_qh$HK|{h|LF)#IY!@@vr0)F+aCBQXb*)n$Kt-2tVgcGG*lLQ-sh2{QBTW zet~hg(9iC%gpP=1_5<;1QCiko31Kn24tS9+;12A5muL~^zu7J6IuTg?meP=LW{xM& zm7F+52(F1CNBa46#!f_Qy1v4@$4uDa<9cveR`-Y|alZRa;>(DujGmL$$G_MVM6M;Z ztX4@1Rcf-`WGthlPZ0vgB0u3?d3}n;;+$Q!#%dC}Pjun3<2M{R7^jsW-&aYHkW~zE z@zWEz`d<^mlGm-wCJj*M&g!6<0r#f}0h;0Y32e`;kA#?hTCaTS2e`gS}Kyt&+s5CThQET>+ES4kS%%sIVwAX3g>v1ka# z;~$+i1N_PS7lYvu8vqFBI<^Jr2*z#J1a}GsEN_J_5WL!l3o{WOG<+TQTeMR2-Op9f~D4#Bf&au)-i&2$xa3s)SS z?m480P#Z@*a(H;)vG<8Fk+?%;NwjEmuX%E6Z2GQsl&knoy$ad^!lM;)8MX;pGkPHw zg*{aV9~R+uguk0A@m-XTeSLyz^lR%3(x%vx7SUu|JadmmB8gzTb4gNl{MPj~l%=Hk z%U96mC92Qx1BdA`Qv|P0d}3_6i)~yPexdDm!ksvY)!X>l#JL9s6O7{pCVY|~X~}jO znNL2YYo6Gf6uGoGd5FSLiDvu-NmB&RX|el>Pn_5|R>GnaoAK94R!8&*Gs(pLbBVhX zD|cUscTRe@bvPl6;VHMbZL4H!P!lf<*&rbP*)33%@`b#RiY^#3!JZ`VDMW(*g* zr%?*VxOH{(JAh`<61xV}+FOL%1Ku>iQ<4h2eKXF%MY*`bn`n*-uyBjkV&1sQD8oIDS+A zeX4Yf3w_5sVY4-SA1~_g?+B2Ww_hVNfxo~+HOicSW_y2>Qh80UJ_-;oTR9wUAg-Jr zLug|E>(^5RZztw;mn@gB&>VNjt_wQi6?gPBB=Pk;D1}}I*qQEtWx*ypW+Lpc?Yel( zG;-$B2u?wC&UAO)dg4FtqUR`J>}leh2FSf{+9m;C{3uowkPx`&fG_wnxXxrDvn9-K zy9#tN;Y5_Bou;e};ya{MdP7o=XHxND z6_$fE{fOp$&uOost{e5!FUCCE@}6-CufCQAnh*>Zl|$lqV44TIiCQ{Ea9x&I8t!Dj zBq=yj>zF~ZPSpEDjO3RwXU(c8UAQd6Vrpqz!sanr713WCR%)`@EF1#;$g*kbFo|I| zMR0Z_`Niz9^&xMI?K#RM|G~Q-97((x_h|2;q?1Id!P4aPgyox@C=${YEfs2WVvahG zv5oT2r#D4#%#Yts*khBOpiKmiG?AvqUq7&bbf2`^)SBE$j@#*wn3g!C&reE74$$16 ze3WXjK%KUl(KB`JRB3;Xu#wC?c7wPwk!|@WetweJ+%Nt`vcfn$;XI{sdm%|eeW-Vb zY(;lk#U(caajLbH{m_s9CfGj4ThL}&tHhbo`VN^9w$bHgdBjQlgxJ-c?k|k+5Ck`sn|bjc8X&&8H+GqTFu2JKGmn)c@Z9-;V^}=*vqy_qGB2Tp z3aj4NWA9SWyvlO*ZF1)C;wAUTv&0dXqIh*>Z~D zK!!Ser^w4fkpg*=@n*e0t zCF>`cGySbX!Y zXVkwW{mnYGN^;S<1Uf#+X4wlyD8+rQ8W<1!vmB-f)~gb)Cd3|sl6*<2=F^g1ldl@r zB(oF0?%YYyPd3~bNjXCiY1dO-Y1@}-(5x6`v#&8yp?~(z6v1k@GMAbBU>O;t@XZVo zms90Nif;HEY{(|=wucsV?FU<0yJwB4?$1g{ z0axrBx+!GP1DQ;{&Azh-4ge2Sn_ZIWEbX`4PwfBHYZ%_+|D zMxm~&+K~uBzkAogeFDfUVXvAX+*il2Q4r&QbIUtHZxEupM<@#2y+TW(77i#C54J|n zR_cI_Q$nT)$J}}6J$@cm=ZU@J_CMtX`93x6a_|5oz?j(;G|gvW^suHI$K$qs$LDTliz zV$0f(y!lZw>%BFJVmf-VYvi+w;-^N2G7`M#j*%pWNgCn3)k8? zjU|mV*yzL7jyBV7;jD~3vg8(TJKkvaCT?HCzqQE};fO2pCsgO)QgmL}r@e2`RS{Q> zo}!1M%C|QwbL5KkHL;~QycV6cEY5xLIreknp;;yD+{9B;*G`p|)zCns*ZwHzQ`FBr z2jO)w#fE!fFPy`+`EWtpY`r+dl+dAh8QmPuUSx2*4qw8Zcny)*gvwob+h3PT@YFsRqHuQCSd!ONcm+5n=u5cmr{oUR7mVmAFZ z!EAy`q?sAlQ!D7+yF}D`j0~mr+E(C>-fy^>MsOWE%fb%l27jx_W1{Tb$&W?6f(jdKih zcjj%)-&nA|aBb1*;uR%JO4Z9$%jZq`;QG6 z4QgGReeLb_ksD1zvYYr@$A{Ms{~EbDT6vo}=6Yx2oo{z9-Alh8@xb`u^oIlEnUBII zc1`?z-1kKC)aTiTXK$a^O~$;?e=+_t`<46ag|9EZVZJqe`}$qcd#?`*KlFa2eA@Bp z@#oAhj$h||?fRDVedqV5KeB&1{!;mM>bL)&xqs^adj9X$GkuYY?hMnJ_Oqg9v*(o0 zy)^HI>U^~=3vAS57m61(F21vL#)rL> z4fXoBH%;HXd5gT`bR^2=?NyRnC}XPlSNyUOR1@1*~{ zfDM5Mf;@xcLjVdO}0?3ow7}_H}zFozR@vlF&+M!?nkBM0G}<3GWI!8+I@x0eAtEXi(!|-E{9$Tz8cu? zH{dXM@Y;^+Yi`WF@p0(x&E8v;!{U+nQJ33BV~fXL-??x%?;iQS%>%6mZyuf*7e4Zy z(4YA5xZ?@-)bi<{XD!d;C$~*Ld6Dzd_0{}WXJ3=vYE4Mcdy@Pe>m~s`^U0R zuAirWuKVKqb>7$JZ{gpUeeeE(|GDbtxnJSG=lm}IbKuXdztR7B{)<)C&oG&3J1cZH zFeh_v)4aj?&()?cSgmfn(0LJIv1G}~r8k#-TcM?KXl0O6P^n0>Z_RUU)wMgOc@cYm?VcOxw5ho%;qNvfbn5x)5+HD)s86H7jei z>-6e3p4@tBXM<7Wo~He$Et{=d>{?ygyxRjiB0BMB$X)ca=sAA3yeG4_u&?rb^@XyF zg_p7~r(O|XW%V-#5(Xo#d0)4^v43dm%~iK%-Fi1XHqt#>ep@(3yyJ3r_q}EJKHML8 zQ1K8McX_1q=*>jyW8}$+r%RrWKFfX{FsU>7=taTHfLCi?jlPz@v3ooFZRb1E`z`Mu zeo%b0`S|D4sn6kGR(~1%ihSGi?e+JGz&-0(HqCR8g zO#NAVX4}t+mi^E(;O{eY77B0@N zVQxw8T#szeTCa27Lq1P@zxvM)SQEG-$RgM|Bs7#9#tzSjsElln>W{u3^AVbu`NNkuR;pXzH`E7!W z!eP;b_?_gpY`$D0MNhFS)jaK3x=V(CW>i)}HY10fE6GdGFDR%etS@RV?kwpky;yd& z{947$%8{zu)pu&{*50eTUw{APy;FA^?lj(R8aaKd`9{lN>y@^P?Y$jco$Y5%cbz(0 zeXgv#peL(W(I-C7xxlrtHrOLzwUS= zc^mxB=>5$1H$N18jQ@1#^PoQf0Ye@ zseHd#3jSp3-P;I$X4+ld$DGRq+Z~zfnQfKfOnXQr17va_Z%#V%0@R$;1TBX3!f!$Z zIK}N7^cKlF-D|& zPd@>)MMI?+Koqp6o&W}UP1tX659c|#9;|2Y47<$Sf+^g6nDyxNZ@cN-0<&ip^uCMZD@j}v~m ziz(f-BISt@omgUYb0xhhKfOmpf0d0jtYhp*_bbw1pedDdd&YCA8X^aLg)IqRfN@@Y zXf+tl#<>lGAJN25vGkcI-%lK*AF9s0{+c zbfK5PbjgzVIsg!?43UA;I6kgTpcpOqK&I=qIgKBtTQ+JAzNY)vq<4AIv9i9}NA&7~ z(Y*Qe_t^}wka0B4oEgBVkwp;cfUfXlFb^o?9&~904bjW*Qs^<=Cm*=biS4rfr*uN& z+De7FL-mW(@6$)hw{x@Uuk$I? z5ysjKt5_x@TxRWG$mr+iJNW=k*tU<)vByB^V|DB>@Z#oSGy^p54M&%Pf<^@*0^bz3 zAO=j2lqc|W<~8&?Tn{;u)nN>J8FmnkgfX`g*azA3VI%sAMSf(5hGOG4K;#By-Q9)w zpaTs{;m4?FQ6!v#&XfSH^cjKN+Mrhm@-7KoEIRx!8%Y<8 zUb~EF@O{p0f~$EePZq!yoSTIkpkM4RSs!$T)r#zcDzQfibx;bnA(RQRQIgwL2t_Wv zsY3ixSKhx2zm?w_cnwpe30)!ZGI3PhPpC%donH^d@wrkyWX0`+4?{aRCJECaJyu8P zW@sJe?{*(rkIsK}1s=-zboV_RmieH6CG;k(u(Jf>rChD`g7l;>^URqq#hwyJ=0(8} zWXEjdVe!671w^ZmG3GheKDRf_OX$%Tk6^51aO^9*qG0^W94I@dyFCjs%+#*-Vs@wE za{`!{e5I&}=`S7vpEDf=%2Ve|7w$-iD$|R-#?6WuijpTaVb7YP+p5sZ@}Y~bp@gDK ztu*HEJkQEKOnT;6mM7CVwO7#1oGt4D?7{cqxrC+QYkow~H}F0Cm#ZQ89nE~U1!gs| zMpi;!>K>i{40%-iX-1d>#m(ghnEUerGRWY|Od4MWY*bX!2f+;KKKvvo7EA_y10|g6 zE~cOY?R?@2-{=g!WejgPJ<$%&(WvmlBAxK5E0a|-w)zTuAp-tpX>Qh}G~_whR9P5ebeuWpkwz?u@JDkZo#*DEO*_>fi^y$0x&?({PTYWXuAUjrrBlIIQli;RTZuXr-X zwJV3XCjg@kD#rvUsJY742G``xWEq1c5_`;-c?b$di4^DD(hr1D% zr{la2=%rCj?f|Mh#>vS*-nN}%OOUK;Ll%mh$jQP=5M8k@dJ9>^j6?O1)x>rLLJo#F zz>`Rrn=kB+q&?Zl+ab^#4&tuhy|{3a{fb-Jx`y?ZlT}%Ty=4os4`ZuYwW67*EA|-V zAQhN3Q4LW;`-0!XH1vd95cCcinTX&D?-AQu9Niqu3KSMqsA9qV+nF~| zIq!tv3UWiKhbTdIu_1y#oW(jGtbmtdo7}=7DY|sLfV(X7`i(a4B0*vg@oCDy zYQb#jH+U#(6m5h)q+U!q1s#?xikZ)>64L!WnL1o8r)OX)dS#T)&Fo6O6wA?TnP@x6 z;+_0lbs00P%E@6P{Uv7N3AioK39f~DG6dwy(5w{gC>v&oXvFsqc%9qtv>7~vP7HVR z_MZQIp@^gC!nMS+&No+A{JM)We*OIG{b z0QtNaM-2Fae!CYZt)qtzHjBsU_q#U=e=+his&J+cbX($5sUs`Vk2b6*(jk0+;^&%e-4(F9Odc5L1`VF zGq5kun;ilZ>20h{a7mmV`VIaXbR8K*Y}{tRZAj&qs>GVN`l^$N&(%NECOFO6cybee zGuyhTo14K3PYvUkVXfSKtY?@m?K*Z6ZN`&O7>!nD3yVV6yZ%)6izlQ0;**kZmvep z!rmX)3g=@juCJkD)c)oh@toYY3u}c(vI<)x`C;j?)zi8C3N-gRXNN3B`h?XleutgF z=)%C{Lez!#D|R!ohf^Bx4mM^nT@OR1X#CI-(Ss6kpPNv#ptU)XZ<^CtsmhgQ>Sm9z z$5R=S*({QLCnCmHiN7Z4BQFJCqW{7Jym|gFq4Vs+F8i5hQNeY*cusXv4=h|)_N=Lh zzoKYI`ChJH?nu@gc4lUR=r~I^l?c5@&&c@X9)vG?7NyLB&iD8G2KlppIomTG(UQR$ zv3-N%xfbEE+L;ag{8i<=(je}!qNI%NY+SCF0Kgt+lrRsVM8#s#0mM{tF)|lkCMfis zgj6`CPBicp+SdP2e6?*;*RZgpQTyZ|-?3(**pC}fzB)~p9aLz|V_;{pCjeX2IITE7 z5`H7A3x5ms2_O07Fl)Hhj^{ubI&gK1B;cIN8Euhjn_>MDKGLweFo#R3u2T51JxaAW zU06>3OnN5rH*+On5Uxp~gi#<+Jl~ta4CanF>VQYkhc^zVmC*!!QiTm&y>+SVIz6pA zN|MLeocCH3&ghdL6GQ?4tB;omI#TCw%9-XkU)Ce&MBoT!0Q1+N3l#k_ezd>UZ4bFDhB({VV0iO(vL_3gOuJy=D zq+@VhY7obvJ3K|5jWpes=CJB3?8G$eclH;dGiEC(C^o@tlA_@k$I^rX|an5|ihx3;` zFUgW^&e|1YivbuuAP;$hcDr(6A5`zkH$|*sao2A7O4+Ydsgh#JQ0Zn7D0-gpP2eo} zA$-RR;U9-hI54+5(Tml`*%@7hEoOBESRp7zb4`Zlpw5@=6^2=fofO${dQ1IziKpUG zv7cz8+$DWC|CQvd;5hfQh{$Z>EEJfMHCWEPwNXuIA!nIC6IsDBb{T-uQR2lG#lnKY z_Fh?SZbuYvORPrYCdxf>xGgC78w&|-lW88x&C<9?zOV#4NFj#mw zf{R?^75b*YX6$sQ$IKEmv(G}2T$|QnE4xuKScMn=DSn(cT`0|WmfhlOWVN!_bH1m6 zvd7lN5^&S%2Z8LSG$g}AloP3eiyT4b%@i?;&=axORqf%nn&b9Ymt+Z`K+$|Sum{ijTe;Ue@COM%tUq;MhdJ8=)MfjK?8gyRQo z30Tk4g*{ytA(Kc!--Vo|%(rdonH!k*Yei`q%>KgnDW1&!G@(?&91<)O&x2H%*92lH zknGGehVDguWM@rSoL zf4ba?tCrF!f!H6oe9?6F0-%sDW?3XixCgMT$ST%5Y?0qr^ah&gG6-Krjn5@!$z-yo zlJo+}xyo4zzUWb|Kz3DVEO(d8;Bz@gg%D4J!QrcO+T!auJ#1R!ViuES=U0FduwyQr za1t8W^(@OPozgfvJs@>axwFDto|1h}MwB{BYsHyjbykaTk#HVei~FV9JNm)v2?jg9ZM)AyGzl0dp09Fx{Ly!d)l-6*JB{BmNW|hysFT zo=;#Oj+?_R=6i5E zE{evp@KSQnd~};o&Eq~io73-L0X|31cX$?!QX5WI=I^7~mmSEa(cWeYGd9!NvZada z3|%%(*2Z{A|01pdhT<&+=fR1H2JQr;>8Huog#(?Rpy5bgyLOQYb4R^jULMn|ey^ra8BY|?VGD9x>?YgX(O~u(@*`#zaSWur|^!$H4=P<}Koz}}k8*CxoAS41e351-vQy<^ z1>Z%kFBC!+l12QUB!N(!w-k4ucYwnV1=#?5ksQ(q=ZotHL)V=bf0?*SfSN2Mb6O~HPVMGVXhm7YP%4UnoTCNe8oy)ui`kMwczOgT4!z<(sM zj6T4fCEOK6WgX#Jc~X&bcA`T&v;;j{cedbr6}h-8=V{sUjL8gnVUgHJ@gUb5TPoAa zTteF`x|F(_IK-FAY$6*tWum&k+1NP$fQK(~i2cDqlUaxM*P0ai)!!^Sn5$oPE1i&0 zReC}ASaG-DIg%}#ma~9zNtBw-CgAwTQ+7r8a@-_~{ChF3K*v24e#TJ>05iSN(UUEe z8q}L*UrQd->~nzvA?<2PUrrv~i*J)rL4O0~E50+@lDEiQfpR=qGz#{GKII2PYCeXX zRdA%!AbJORR$o|=1YRs1D6s~6b1d@TgJEcuM?L~pj9O`#kJ^;?1lLbNR7-VI}ka}d7T~wPlD8x zbMW~@d+ApATDZ?7pC% zoC#LC7XiDA$(+oU{i3Y0y9`O+o1b5_T``{8oLe9VgsPch=^msml_+{omCKq1FNycW zEBVu+j`5qhhl3V#;@O3sIanx5$1xhlq0JRuW#XJ;d6q@1G6NLBxlw6R{I<+vDY_5n6n9c8lBdh&N{i$0%CWyYLWB2Quq4@n_wa~r zuh2DYxjjK?M?EM}EjO=To%y3Esf;hx%#AJl#HMD>&XoZh6tc|yWFu)xs!434uu&Ee zO5_=cT7C0aWBfyIDo7{$o85b64?0=qS&ySR<|bDa)3OzhOPguWgewcT(F0LwPCETD zZ7jocL(#?F?N6%ViqxFh*{u)C0JRywAW{4mW8EhU_hZ$WJ$Ibs8JYhWth z7B%qXv&&IO#|P*Z6e>!oJu3K{8CT)Y&zA~|t$6!5oq1(kb>_azzwF7RJE`sL8F3>r z8Eap}u&4+t3EaRNz;=3iun(el9Vd|6XmKG}^Hz$>I9@SLTqbcXx+@%G!+E;}2SJrg zm{*v+s$*s?XwGuzB=2x6dbvx91Q8}p1ld*EU>TZM@)OLbPv#GS1?2Tv-@s3}qBH|0F6@I$0d4b7 z63vD+-T!d2kxdRCmHom#>voe6`7ST3UxY;SyDB5$QRGa?Avl3PJAXO6g5;QG0ndqj zo{GR)VL{RlFzCNh7>_J+zsc1`S{9^WXygcrs zik)0n=w{ImjtO;n?pgNQcras<^GXqgznY?&yPI1;gfcuhglNB%Y<5scpkyP9?c2w{gI#l1 zV|QVP94e4rbRa#wVL*OavZ8jE^cwqCxrg`~c&=!n@J;gcoHK&O1SoxsM~jM1(d5nz zW{XSNmwgxT{aAHw{_F!-i~VQB1ihOEHx#6eh}CP}DR8VikFVe|!RXlWfSfopqkI(cTGeP_AVt4cx2|(d?Q_>A$d>WtURd zGA2hmT8&<0W7 z3&E3`v)TD*Nm+e{8$G-5V5$-6Y4$n!IvhRiti(ASkUbIB1~iMj`3JqcxxYETT$W=u zSx@bbKqKg%6pM!3qG$ZUny&nHNOoCPwjV9CP&55%!i#K?!Z8+017)kj1hNeAQvXiT zG=Zh32Up51az24YvQ2GAAqF-_?$~*h5g|}-_GKK#R-JTaXadu!WQ@Z}1|^pnRKnr> zBf!$Al*~b3EVw|y24DLq*QAi4n<0M#T;ZU`Qb#RilN}7^Wj^mTUun@K)sw-;47!b`qdOjj?1-!~_H7^q}cF@Jj&`24%{T6D#``I*% zBp_GnYT;A#^onQjesV+cD(Dt|B)1T{5P2fw81yKpEJYi3^|2PK!r$Cfcq@@M2UE-% z6-a-!A7U5q0-AQSvJlnU@0g5swPG9EPkK<~fiA}{$a#n~MkvyG2sKDYjz=Wke?=tZ zrt52NE^6vvgT6s)q)~01d`)gkV*&R(>`?2>!P91z18i^7g2G~!3+`ynRxCGsJna^? zC@@!c0lnbeE_{ZTxZdV&N2?ut&}{UoNF!(QNUN(HtdJDxzHO+a>aA1FfIG9s1Ev2V$ym;wvyxAP%GKYY^ZS% z?Vdv`IwTdpWNUum(&u@hJeG;0`@wuT)|D&A(tVJp7OM-6Cy!hiTzsn ziUu~?;2{qH-&8-9swStGeiOYTX6649JdJ*mMd5D_%}Ukfrut_}*Ktg}<_kPoe_bru zW!P)GHe^2fO$4-hW*lHuHE5)=!PV6Y`SqlWrP)#+LVtd$=zH{% z?eY;|2{w*S15RQ3Buy{?rG$!^OOR2wMCNVez`GGjUCNe+!&GaT-nB96Q^|~TYiS(O zwv!Njx4^OB7k!jhE=y-X+U?*Fe5DmO!tqsk0?T= zOy&pb?$qcm7wSX#nYvrFH0j)YCf!PuF7>2;6&S&)j0W!4_-+7XpAC5i9>+S|vY1-P z)mQz=q+;UTYn0Xbbyu%Z&S!UZno|=pENZUMHY!f#X47uTXyOt&SM0znWE>TE5SxJI z-0+aqz#~?z>o>3!o&DlXvR<`x>{{~mvWd&36n5dS_J!0PxfNCU)X~gi*+OOL*KuJN zeW%P5oJD^wsw5;a>iBbm=L1xBj>~J%88v-AnY^>HVf1S9*}5GUb1Ci>F|G3{?~2VU zvZ>PC@0mq3qs$HbAGEuQ5C%e*NIu8eF`Sf&E^5Fk4%7J?@Bs~f`YSoGy0gvGDGw`7m&vGvqSW*n+N_-SJY8C0dI;@4{e*ls?gc|dv_9YsqmS$EtOI1D zlE;6NZ}s-yJVV*nDd-KP?{)HDSeFsiq)c@ z6W99-7&P8Sr(nPVJw36U5`XpXja!u3-uCVU%Hs~_Q}?K5jf$cuYHIa`lw9hc5;n_} zhR=;o-bwqAb}E`rXGz!lc{0p+j~%-JRdn=aG%TT}-NnHtXpa3ncshN>84h%lK310v z)i7%Ec~B0JAO)c;@G!g&Drc(4zl3_2&qI2kNvOy51-uq+n-oF_Y%`V$xxofkS|L4n zb;mHI3NNZ%#QX{`$lIwbS4je(S+F5w4{5{h@kWpp%nR{Trkg#d+yOa>%zZY#_W2Of-AhuzWunkNcGZW1wV$7?kUhpqy7Sinc z3$j6+pZo-sne9gAfW_jM7dL=8B8}E$Fkir_`~a5lzGf4^F0M$l2zIDG+Way< zAW!}@V;j&VoxwK(UWv9abinO=M%-2q;EV*Z!0W7V*GT4ObpAtoz_PsHx*1?o9NWDG zaLk|EkOw$rZ!9?qIHd1S+XY0X@)@KcXb*0NsRsu^4!irph+1V8ePheI05q2eDCVxd;3lPP3V{ZY?{6_&8 zsKU{5CV_5fz};v7X@1!63b>wHd}c48Sv|k5f$_UkSm4iiP%uMIW<1WijZH9qq@GLW z0vn}2V?ZEO=gG2&G)NX z0rUDxIev^671d%sqqp!kyoOPijVJwKbfg+a9%9^=X#0EuGOYa6UQ{xCC?}GO&dZs*DV254MDFL!GW- zm<`{)Kg_mcj$M1o;xixhtj5kVUpMW+)<84MsQ-(hvkY%4>!L6=xX-}g?mD=;OWobw zEqZh9T#vgnP3o?c3NFP86k6Qf-Qh#O{LQaCd2-I(cdvJ?MToI+W;^(Zxl8YWOiU+f z1^uu`Ddl)QzBTMR9*I{wQh`T;@wbOiaZK;?)5&Jq^+*Wui&EAbh*H}kp;^2Z6U-T`LRPP!cDfQ?k+ga zJt_2JmlyTr{B{lMgmAgLVlrA~*oU^B>Vo;cPC+_{=V z{vjwcpgd`QGp{5XCWl$VH_p5wRj+slLTRW@BtPb}Nwtm=V{ zF?fR@v_g}@Ye54PN8{ts(bDO`y^&}1KDRGO1L1q25233cdCaj-sJhnJ6~9;-S1QEE z7bIp+#*%DNiY4d+a|2d_M(BrUtwQ^#j>L^aPRekH-YsLY9D27WA!wgT{MftT=m4Vc z?m6{eL652*#R>Sb()H#cSX4eHTZp#gj7A#KxyFkb@kpztHHL?Xu?=WbNQK~i=gGyCz(lDuz#L(j7U|plzkx1%#UVDp(uR_t(5pNDU<{b z5zinQBr)j$VMo=W?Vtr~@?3_$z`tBtE+6iYg*Ho%AdP!5&KG%BWnyQeBXVytT~Rmf zZ|WXibC;fI z8p{0Q&~iWeF&mT9PPH-4>TTpj+MoCzafeD51QT7!vV?XppLiRRgJ%)jJo{pYLEZV0 z(r(%VN9VAI)mIzhm^kI#(!;ceVwBZ|S|#&Uz9qMChd?{w!!F=w0E#}8Fb8jO_-8gb zNRojbf3O7bw9T0-v1A?gWkZd3>PhA={oLZm)N{=d3qqb#IV;u@mlOl>?cjm*4sSO2 zn{AC>ihI!egK?~oyx|dm{v-ySF>*0^6Am)$*qjS>2KuNavhWLKH*PcONr7&fEQR2! zH=$MlD^fEL;^opKal^1D?3f@Ln@{Dshod+#zqN@=F1fzHmhDw=t>y$Rvo{vZq5`s? z7|xN?P5rsU#5f&<^aJBmKQm(St@7&F-WbMZ1X|HkbbuRz4kX-8zUBIXD*(0fqh2OM2iM#fL^uM6aa#^gz)rMZF3$bE#nxl#7l0#bz zK?gAvuH6x5f;#3UP26|9X#-o`kXyciK2zhLQ%yOSC9BY%QzbWn^ z_d%9hoTWJkr%2_xBj51@OeTu*_E0~uQSnDf8tVw@O3c9-k2d@+a5*(b^B+;Ve}c+` z*i;*+2m|*EaoH}QG2N4P1zY7aSsoaNmCPKky3MT3>`cOR z-`KOnH1b~1E&Ky<(}Tp$fp;zQRK>>hrs;~4`q>pOvh$j&cDr<(s#!OWO;(tgNAzP^ ziR1|t#T`#SMfPC+7jqjl(2Igb;W%k>zmEkGLyo9aQ8@(-sS484R3?;h#)h2JT!-$9 zCX5}dSwzpGab-E=LVlP3mzF@7xQo%Jz(xiHPR09DZfM^p&~PwJ}_$+?~- zhh*;7GV8w_XWpRN#T?XMCw25>jiVWyG$^&HlZknOLxXMR$t3%2wvFmJlv12U7fGFmob!OWn}hg`3GW>SxJEz-2{fqz;F<_x{_k z6?CraPUJfgzJG)2e(k2(35x29=)!R_&*DTA#0BN;laFLVb9&;#seDs5A0$tuG^ey?S9f!B(^jF=(Et+se4xU2i$_PA8GL%ch`RVJKEW9L!p@jJRz+XfO z*x>%#!T#m#_c5aEu(}QUfy~C@cnwL%XDd`&san-%MGx{jmb}HSXu|l|+|4YYYXtis}iv>6*rZ6>62L-ju1_p|~mk zB<~{c0@U0~sgDq2?y&n)e5fzXqNq3ri`X2X0x@Km`+wLeVq()iL#QR9lF~jhUd;pQ zt@;&)gNpxY&dWB)3RL0PSB_9j6?9`#q`#8~QUv=hGJ+_f-}@KiZ>fH6Td|GA%EqpS zu-rxEx3sM}eeF-wea#*EX^I-d8E%(shxQmM;wGv-@(P%qilvEns1Z_oL?W?@9p!fx zN2nUt3WyQ&OFDoRUG?Z=XxR!H?d|F-&=BF$DrdrI$GQY1?p z6Jb^cp#3zaxF2MY;%?|w07*Cb9Kf3BHkW@KJgum%w{du#Pth~ov`T-=8+DJ8ovP)E zsC+(oM!GMjMBK~`yNMa@k zXy|WifgY8=&n}ZVvQ0V^8Yj^U^!Tz8ikA#Cdh@zxfFlyJ!*}LVG=Pm z0Hy}uxO-1<45;f5+lJr^%5p5f@qg_HjIG#DeUt7R_E7pkGX*(gF4^@lWJRIt6_4zd+6bFWer3p5Q}W59@E)#o}A$+tS_E_l9gvt?jHm z#R^y-)n_IcX;S#oDZD7@2}+arhV>)QN7PdPBS-s_L@S|myMpf~#?)x7`I;$3!Dg`o z!;Lolr?{quwBGXN^bHjxwZIF7*p`bJYT=cd`bUM+f(^U+e!6^a#4*??1yg4(`3goj&ql}`|-6*tRrpoIn|$z z^Xm+5l9ybQu|0%mrNQcHJ&_-19$@Kh^4I4X*C~XWI-QcZuRNr_DaPajl>X@$mn3@^ zXQY2|6=B`T0!HGy2*gwIE@jv%BCevpH6p)%?lp6F+Y!TcJ(L|I`>laY(?GmZq;|c? zCOZ2xc1r1F>LkErVqJ1d0lQcABl;!1TwWP$Ag*$d_h#Hor#VNW352}lq4j1rkd)+W?`r>XyYKT19^}ju+2?Pit>No3hTUED~WNA(y~y5k6cr zy3xNEEyOz9{vm7tEB{v54k_{u=S_f~n=a(|N;WGi%uglt)Cof-JVnx^T?C)Zys!L? z5D7m1Sa_~BSBPyfTC5e=OaUa|n}clavS3s?KaQxur*))`y^4@-**RMc|2kNq}TZg92sB8SPB znJk2zNYqa!ri=CJPvCCGUy8G!B7URvG{_BWWG;eQzX{Y(aMkr25E27R;tK{y2iZp2 z-MIn!f!XP7Pg!SEXJ!OgrIXWhMX1`3N=qNCSVW$Tqok|J6=6#lKjN70U9y@;bA1OU z6U&N6=GQ1+TaVgaDzdZ{*_~uxxjZ8yb@b-w`f;;_D^*vRFR9Pvwe-bUDYu_$3(chO zlGlAVkW0zlu1Rx@E z*^@B>ZZoqpL_^0>Pki{q0W!y>2%kzM6eQ$3oAWGvZAr$Ns#lgUT{ZpOa9QJoEYfaP zzT?%Xy2x9S8CkouI-1X3V-Ex$q<+$mz4s8?9V*Nltc*bNd*<)7@lBOB?`%k^u*^3J zDV4#bH%abkergV6#VRXRLz3KODRL$%fK8W<4LU+;nTuXe!ELI@+1bIFt8&%(u?5?W zb8Vsac12IiWUDLL-yk%-fxOe%SI*Go$2Uk@)l^Q|+bZh9}Qco<@=cVJmRk)5P^1$WXN##4y2gZHHUD5qY zTVA%KQz1ApB`J2oLMm(u0bgx`e`DS+#76{i@Uryv;ts4TE|aOPQycOSISN zM~VAX(gcl{c3ok2m5F<5=PRz@yR!Y{ z|B22Umq=9^eYKI?*o1s#DRVq>qii}YcbMl-Q^{WM$s97#`ITckgjupn*BLrAy$eq2 z4D5dU1dT5yv;0u45mp*H6tmO5XuipI#@m!jI3glM+Qi%o6fpj@uh)8V8u`L`1Ky9& znj=c5XD?J;DzKYShO#};pGN&HyS1wXumMr+OTDPED&pf<#YNeo@L&f?GATewzhdTl zB1AJ4Hl?OvrL*itC0d}jrqR=EXU#j{KNilgl|S9EQR|VyXxvq**lh~F{B_tQ z?vXUk-=F5Q-91#qM(U)~EC**^XJ{$iT<~16vcQzPf&6T1wB|`JS)$F;cwG#G^hcB9 zH3K!un1zZdN<8!*j*+STTKPBV9KUx~2SF zxk}QHsViA2S%odjw@Y-Qp0;k1Pw5TjTv(fsr{9LSM>?s8pj(5c$X;Vn-d&g%c&^J% zvMcyxXsOLW4=N{BP^g~1Pz<4osDIuaG+H<#X9F6O_T2OsEslS!Gh- zG9h)AQ9`_l3)ik7q~U7ie}rdXU+G3-nHNq|#737O@P>%jt*SmC!(_>22c*u#^Fkdr zT#{^m$^7DN$lgFdOIcueO81I|G=bXZTb(=9?@0ma#j+$NM6W{ z@*lyTqON-!q56@#oJ#OmqF6n@>XpffjVwK_e}Ua95Na7wtZk2aRmKMMcg2rHH@!mk zHtL9at+ZQ+w|o)1)^8i@>Ck`%kVa~R(-`avv0F8)>bi9`v%a*_%tvbroDFrtwKh!q zD}B7VUhSE%Sie$nFS1JYK&A{{D?80aIBv)rOo01*attNhS%j&GBZ^N|S8^xQvr8@3 z$4Gg>40DxWtQC7`LGpLuY8DnArax`2&2X=WsRvtZ>#7KZs@W?hUU9Z>m>q8aRmflwSdp z1qDTB{8;+x+(0}z;ZAlW9u(DPpz*|za`g?o+3&P`2bkgUo4E`2Ip+~JB3KsNu#-MX z2GpFS?!(6NvE&c_ox(fh&NQAqhbT{&XelAKL`~A4Bf5mlQqKeL{7BgW@XO;dlSIsS zt|Yb+nDoHz{nD*OPR)F7h~#(~VD9mI7Otjmr{>tcQBUJNEM2JCk>UE8q&k>Y8OVu# zJ!Er<4i7Q?k|=fF2HFUdbolPIidyi%vBg;oeJK4S-OHO-(8PtO9JeL0f5+kGET(fr zwl0V6?@+6IQ(JtKrKP0J{V^Ru{_9i*))J-M()wqb&7fbkvnmFfQOYWqtoVYJvP;Ro zbKXd2#~v|#Vq3x=>P9l+pm|D`4)VDzok0b=`%#Zc*l8GkfM{X^>x=X)_@e4gT0-nq zI$OOh)0lrvxgvRX4v?>m`C=la!tgQLGWL34y7F%(!eyuXJ%u)Ks^fgVBF9}y6hGZJ`;OcQS$h zF2zR9*=q}Xh;epZMZ%PD$0>{@ZoFP4yvg^yGfI>u5S$+>?k}u5^jf?}bgcF&lqP8P)?&f1b$qq6If1 z1#_s|XVQg#Q>*t=!cSyXRg>sGIm&iNe2U0ZjfR?uc~}ogJ~)$h6*htRh;E1){O!35 zwd2R0X7aWwdDqhT%jLgXF~Jg9`rdlsOzH5-o}%gO{+v+pScXvCfX2|CXb;ISYGK+W zcpN#zk={9l=DR*<$y(6qVI(oqt@!dtrLsc#Z!~|D`lU z@JsX6(ofV)wOsmMJXp?1DxnG7`;<({I>skV3j339JSQOtFy2qkbSYVRA=vRxT-f5m z)7pOTuI8Jw*A%Z16c{s2J%uIOFWgX3y$V3X#fRl9lGi}j+0UV*X#yGz#E@-0U;^PGy-@2cYO$gM71BXF_yGE5b^84ognB7ZF^$`?l}B}toy!(&0Ag(Q(MNLQQSFyjbK79qgyQ;k)1)QMZ*ng z!am{=>iUG!&}4b9U{tb%F}r2L{=~wYL75c?ZD*HfvCWeY4B(~IWmJp!+bcHa4iZc+ z>ZTbl>}#J(NQGa_sr>1p$J#IP|A_A>G(q#B=WK%OVTaxway>q4&I!NM&RI_m_1QO> zm)As9>iJQ%xNWvzZds~ohu}~C1^kros?{Tl6g3z|#2UqR<)6SoP$4(Xb+Y6HK|E+j z{CUKs8YGs#>qG;>6MSk`BO1}Taye2j4zlh<-a?q-Z*--k8WEv7_;~6`^at`Vd^;9{ zb@7~!J;Ybvdkas1$6UA$JHyDaXRsK4+ISb(AGpyOmukX+OZlW2FW zPikLOh>>CU(D!&3&v}k>p}PC8q#Ie@(O0saT-`EBq9fWHmPzgr86{cpJYs}d1M9&# z=}Dv)U?tfI3|vzJkY8YYnAky*eD|D-4a9HVUI6u#FF8LOijn>}vKczT?W*TV#f(k9JCfpy17}rMz^ocMO>iScZdh| zRu$JBhEf!5h0CEUvJZw`5;y4z)=P4OWyO_n3jHj(8#0*M5PA~XMYMX(Mtwo_^_`+B z>w+`R;^F4F1My=ga1sx4^{FDo5j@o;E+QF3Q-TTWlp4lOnw%lrqb(bUIWkt~!q1++;{FrQr4 zz>$Q;2%+&;Va$_{ly-_ zEt2ifP@D%N$)0!^ax}C9_rSV(oWXbEVONfTCg??LG4PZ`?ca;Pl02=+!|iZn{w~}b zex}#slaVY&i+4f?ipOIw(DEb;b{BIEjlynWUpx+C_wmY0pYUDa=g9|nB-p$6C;m6! zS9ij$f%SRwFgqBmTaO|5dpZkCz;B9{Vd412#1~iuel6s;OLLBWUpv9vE z8v_=1Y{v#@#va>>UQ@+3rJzcmu40S=Pt=WGoM1+I ztXU=wGy3Fp173)7<}{0id+afR4%?d6(oew0mB}$n;G0r9palL*pLI<} z1`|_GwxJQbukNiye$-%9r3hW#Bd;?uzwn7p3*WFGVgzuR!YjON+IqM>BJB%`cP|R)x9U|#f z8b+xkR%y$9p8eVI{lFe#N!X1 zr^UGUuKSbY+6z(3S(W^>&n@)8XdO>?|`oH0ib@ze;p6m*aPdji%GU$gGuErc-cI_^Yt z3!dZn%ze z313Y~eopeuhPR2$I!}tuheR>i^~K2fviR3}b<_{5Pk> z_sb?b7_kMMcSaL-g3-o0`Z=kNprP1ca*;b9Jp$@l9+LmFHaG1e|1-a@s3Zc6|JbjB zVqLm!J^oI8nmLF2DcvMRSexuYx;GZUu`%<}ugrqLNvM_l<;I~K!Sy5G$p;1N8m^OF z?Hy(Jh#}VPwjsdB^i9LyW_=z#3;U&kp@~?MGA^wz`c0M*JqJ~?RKP}bF162f7t#*? z9G*tLDr?&9U{Z^+OaBHR^P;V;U}{dBsud3~N0J!UpwAX*v61SBDJ5vG!a4E}I-hIx zcS73ec$d#eEHUojHfm<=gk6)!2^E3G8y{3y# z`h&Wu=0!lrZCP)>Nk|4W(8USqL#){kQDmdEHj?zO8(f%746OjBMlh;)u6!9jKKD94 z0Q1Q{!QY5x8_p*x(Z1?W;j<96{6F7`$RwuN`2f6^@H@6n`8=~=PbWo4*30V7vXlJv z`MafI0?ue=zYFikmN2`;i_woXAIi;-2o*et_#5lt(I51~^Nv<3-iWR@ zCCjtKcx9^eHMAga9%qJb7^birB@Fk1=?`y5u2OfA@tOYQA>>c&eIgHi8`E}_u>|c8=dk>qYJH!~Vm23r_jK#qxshwC+hL~J}eTZF5 zOu}7*7J*s#F84NkBN%%qNxqeyy?dVY5oIWw$EA}$Z6jGnIk0vE{g(J2<3*h#v=Ten zNGwlR5Y^yqj2x7M>c9*55dgW@V$Xr!ffh%apX)A_bfs*3iGe-Ey|C&SDchm$pk0_| zx(Bt0J^;bwB370`2c1o2pHzJ;xnW7ZjakU6pN? zE6gCp2-O6tLl#Z)$wuz7_-~?!bx9S1YPuu3JAQ=n3fPCeB!0Mk#U_9~d&8us&5o)# zF3~u+;0N5=Lp;WT+J2+1|$u9`y#1d&^%5<=bEsy+xJJALH?N}PwXRpxgvU2`g-4?b4$zpx~1igcyVb95D5?0gULAr{rIlP##zmj26SR+i)pXG|p( zn(cJo{JZo%Qeqn_Nh7A2(F_uQr2i|f3cH}n37v^vkvVyPKwdC&ojs5)#Lm4d^>AiL z%{^^OR#DMewHxnicC0c=uvWcF&J*gXR%w;!GsI_~LkVeznPrkEF@IB1L=XrO-?2gN z!GMpSXl~INMdPdEG+NP>LT?o;)|h`O@}RBCyRsI?yeyaYklYZ*v99pR)O&OVawt05 zL6Wou4j^#suKP+b5Oi(YsBJ|qRlZiYA>Z zfK5v6OHaV`Q7t5mj|eCu2I58TqwpHAvf-e%A4yk4sE3jx^L8lv5!J?_^3{Zge3CQ; z`~bt*;obLwt*rL>Gm7<1nIl~(td{Na=m7=##?$=wS`fzj}=?s>&yySd{!2f!&wqOlcSld;k6DA z>}bDW+?5o&CONp=mo+=oLhH=J_sV25YH646Ftn;#rSZB&bT5`t=SmXj%gT9~6R7#J zj`$9umZQR2z;b4ruN=Egjdv+P8KP%ZzM7YJxWHBEW5djgKlTmO7ZpF^G{jEXl+arIG8^GjhGkOC&L7a>#KeksYGcXHJd-l205S69L+vGU zSUNcSEjY*aG%Xdm(kpc3X>&+eJwJ9Rcqcy{;)-W+d~Y*0kly6%?cfHNm#0W%>L}caUl<3d%KI$fDg9J;s8>&}A9NVVI6+PhJmjyun$wRrBlG~Ai z^iM?WpGUsIrn-58clgJet`--ewTLqA5=B`(^j*Y@HCHrN@h8@(S_17xC(FM|bi60h zgRm@V3u{J<5eMl^bg%z9G8235wj9u4R#k~v2463nVfcuQvwYQULgLj@^;4vr2~o1h z3#7l?6Wx*ZSvn0pl!&u^F{g-W)O+ls-xJ~wUf?znOa>8^8%)=TfAd=m>%c8DtJQ*h z)hzWA5KaHBxD94X?#pVxfXufX2f8NIF%anI@K&dTX?|)#4ZPj@;irJ1{Hkdc>zWs& z&t;6JshU^xZN)W}hMr8GS1h9vp#8D|WJktZ_C2{N{)vMmIT7BQ{7$&}ZE!FHzg_=_ zXMp2ne#YYp&VEBbMeb(E(WJe&6%SLW|fcd`eS=W`Y;A-B2YVtj{()Wx{g^uc;jr!-V*jp`$g-F3LqLo)*7$sQ{& z3W~WJd2Q+(hLhT3swtK&2+1N$bfZr%yoG$={22XCj4wQ9oM#)J?W#-8-liF;mYFh` zH_Ac!Vzjr+pt;W9!TG2bBtK=Q%X6b?YNB*fa0c-ov(I}0?n@;*uSGdxS;1`M+Jfcg z23@lKiAtmvTV=GT;*EJZERcohpJ$!q251f@WzZeUim1utQCVrwG;oUD>$MPjL%nmV zL8lTfc{*cssjF$e4k}Dg_Ejh60`k4$ytPC!QZ~nQ!I7TPuAh|nA5EyW5g*A!MgPEF zAd$=W^uaWAl+yyFod_?+bH8VDIgfHqWi{&!7LxZy_Qi+`rV=KdL>MoAr!Ekk&B#!6 zKwIKm1}fi&%L zC|LAR^+mEHU8?vGc8$9%#gUY-Wz03S)K^LQV;@|1g0H}{aGX5_9-EC=*TFH`nWo=x zEoU?ILOS7I+J6vF;X{=RayG3>u19_2#&Pelze4L6H|(tMTJj;D@46Cb0iFNIb^w27 zS(UB89h`z`8?Iu5_1<_IHc1nSdkfAh3-G|yeX@6WW^5?uj~9o|q|f26eLj=vV7u!a zun08g*=-Z(D$@_k8+xG1Zp@|9nHjoD@*(m|y_fXnw)9(VPc$RyUb-fy>l$8D}1)NTU;yYo*62 zb9B8!RlF4Zj=DsS@EK013E-0FP(Zrd{^YDxPc>||^imefI}DAA@nnp4uY>g4q1rE< zleJR*gT0(2kvcK5s50g>?HN3T3ZSNYdlG+>Bb*;#_lfa2Tuwjz58Zw9G3_^*#1N={ zPmI#~D!)TLR33`%nZ4vn*@DC{2ZNX%S;zP>CxW(;FXsw2M z7Bw493#8)>WAxSdDQ$o43ejHWZ&h3R8Tot#p0Jn`$#zEM((kw#fj%V6jP$$$=2Fv~ zve8e3i>2K9#-5<*YG$n|tj*BboPq7sJTQ>LEy^QWds?*YvFc{rU2e2uZn!VaN>u^l z$o^~(k0}X#(AMp<^QE^*+0pv=6duonBHevtbNyUzLL^v3G(ax;RJi8tv#Ii~Rw8i(^Skx_j;~Wpb&yf4bPTyJFo&5-9P!eVNkpXc6UQ7f-r!d-M)61yXLpus zsiWDUvUSKL<5}(x|B7x2do)#}ddw8Z+2rMPcDR|#qY4AA(Dmd#&wIpc;;r*Sd;_se zKPdmYc87ef?YkN$^_E}CX31}3xS~6+QF~J6pMpB(tM*vC!(HwdwwIete+?K#uc1mk zmk~TN%}IkDCtS1_^UI7T>1W$PeE<<+sn?Ey&KU=&erCzEiHe8Gk*YzmS20@IIccBJ z7WOc^%6~O=jwU@2q8s_t=`YNSh|qw1ef9&+Zp$?<16?eRz$vl7a83I=bCq_Anx8aY zc~ChhI#`x0J04FWbu#WjGt@RyGzGcU_IiAW?H0ue#0u3?xL4pBSt3&7wT3x_LC)pm zED)ywmE(lO)0Aq`m{`$3b7 zJP9ACc!o9y@T4oSGS91Y6JF5XC7^H^&mgj;D|NY!#zfF1nk6U#qY8>b|!tb z@H-QM{>n|KvqeL!uGE7Jk!c|{JMoc&A~LNI zrVz^&{YpQ`K2cW-f%H1^+Ww6@EbN|ri7iP_HST8A2~Qj(Nq$tdY8cfTk|txRo_=C> z1nKV)Mz#^HP6j-OaFu;5HLG5bX9~wF!{OI(cg508`^98 zqU)3Oz;Zy{lHzM%lw|B%ja8l)en-(JO$}_5&Se>&9&|mu*Ug=Xq5AIZiEVQ%kt$33 zSs`3rAT&3N8y)Q6@61OQROg%=VpylHiTSN@QZ5SnqR5in40y_&=d|7v>8(tRYcBXh zMeZmWqlXkPq4dsJikoRR<=ms#V;#Fh0D`U+uKF666&)zibJE?4JV+65Thml zUg(F&zabYr#B4Q|=k$W4fsFOuHCyBd232hp9gvJD^%jrgeJIEi?@1eIdk+O9^sppJ zR!1$>|Ag0sj8o?#DSmV1?&v`eZ*~Gc-{~DW4D4f$)Okso@MMSD-T}px@FmZAYw}OP z3sQq^BVal{+-yhwjV#eGLt27sRBzCH--ogWEYD*;W5o|RIdVL~Q)XhV1{;DMtSClb zic5-%(Zg9#-UswhiZy2=dLpjcbRKiW^XoFPpx}k7mDmGclWequ?jFpH18beW6VAjS zI=$wR!;#jb{4LQ#^sML+&}1ISn*}x{-?0ior`SKHUijOHIBgUDDd>Pw3r707NtM9c z{S#dY_B#CmpNS<@Q_Xt%6S}(GnVu&aShS8x&Ulndk>`_pWVe&cV&@yfh>q||?cW3% zG)D22aPqk#?L^FSm(tUT1x_{~BHXE-)pb&DL|Ar&+a_FC*u<{N=x+bXY)_h*y@?Kv z2{Bxza>E{LDDqoivLc>L^;ygD92q;`sXU_CsT=-|h$6>UyDBch)-q3dtRSLrrSwnw zGCR!GCx%##v+2=Rg9j57He1t`4h=Xhe@+2!hp(7Crbu&_IwpjJKxK^`GNktCRkC#UWA5xu^ z#`*=xvRTY?1EZn$I3|aa)X*J^u?`H`J0x&W8Ty~Ll9aQLQVINCjR3+#+mguOrjw!`Ba+J=3 zcaJYLE7{ve`())XPj*k>-DbKMhYKdt6HR(y4CTYU5H*l0=(+e8 z(UyEm;!gAkn+O*I7mrWqU%2g7&$P!H)4ARm+f=s>&&WKe?7u6NH$Wa!c$6O_Z8lC2 z?BV9JRidFxh4`&Fot~9EAG+npx;YK6Ay#{QK&tSk*Wag&vpAjkkZv*_IoLmQynbY@ zR~DqH$v@4zrCO?Y6D*Q{VEPEn(t43z^n=Bc=0OScme3xOi{t_iUt}|wdG&v(bl%t2 zC+UCN)cc-h?9T34y)f$^X!vsqST(lb6!Y7A5R?nBki@rgBAQW6pS63-4d^5H-!u&^r?v!8NstUnE*8 z{~7;AZ0Ayf$4k1>z1$RV7AU%SIdxmz@Z%TL8Y*Wt-Ord;@=y7?Oe){mdOquJ4o_Lh zUub%bUlV9_X}qz*7piG-W#X;UH$h{dGWwot8$1Hs=s257HDfIY(jM+3ClGBAp<*NYt#j>3<0t zz^1#XC4g9XV=}Zb9X@*rGGvZER0sXYy0R-=63CA!S}r*v>}hO;*NbQ_9KHedh2#h% zNl&(;^WeLox6mi(CJ!7d!%kjXE4m>3disypPt<N##h97_VjQ#N zPlm>0)%t$WMXZGxC^2DoM5S;b_C0A1G7}#Y`WNy8U*{2zUd0nG#R`PX>606UOPN7? zw~IQ{?p3a$8mcmv7Kc#1v^mgtGKIPXeI~96t0ZTM&507Y8Z?F!B1$mdBNP?j4HtNP zMm6ntl)y(((<~9rmQSy+3tvcEZJ$IXT#ROsn9q(R?T|0sA!wGYrDO?L;AP~xknP9} zVu*(~Iu8Hd&gWe+rnf}$YxPSS`2vIHSy`ztKy@x>plFPuPQ?>_lGPLa#f}7Jegf3W zoQS_IIYG4tbMSuRm-_*v0W3SG<8884A4%db$S&C(BbaF-OKgIV`ugla!e-5Fg+gM@F4G*;7bQ zuZ&YbriKL;&RlSfxtTXtAJjFKgQ_=aDJpP)a(c@mQ27Q3f zbAOC&#HrIS;jYx9gLUvcDtK2p97bL)R>B+^Y$=C#6VDX+@Mi+Sk0G0gQ9L1%2M)&1 zK>L8G;JGLd3~|4JKEcnn_Lq#8pWFXP5+F0xzL7Zm8-=eWXSs#uNpKf-fP53|O#j9V za4Gd6ONtC7pT|*-Wd7Shm(W4rmHQD?3HqL#0P%EXd%r^aHHWHyO1h~|7W9#$i>ykXEyty!NW8KNG>wo9TEd*KX8i!3btDZGFi7K6Zb^tr$p$Sl(CwgD*x;+7ra z1CElKiBMC1+7;)jJV%eFy7b1&uype@#S>IYDkxjV&&4(Xl50gmsJo4Q0I zRt$`Ck-X-l{{C6w5d;wfNlq9}f1M0Vmzn5Pv*$Ry=9+VA3tMf?Zd&uAVfv`YY zlUAsQuIn}=Ya|O){UR<%EYkaaOW^MGU6)~wbMfZ@3XN$TT$ct-u5Boyps5w>&8MKn z#oZL^q4l{f_)jP)dyk+mRA@M!G#UD+eilwkT;!vDS4f%}!dVVaC&r&RM;%UcSP`gE z8H;L%lNp&`3zfuUp2obG@D(hRE5UPN2i^rxVnNn#uuw7}?k)ZbZVc{)SED}edAI-{ ze0(S=7Yy4|LjEQEKSgI59Yxl)QQTbz8Qk6788q(h?rE3uy5;R2cVZ-jKnU*c?l8E$ zxWiyyeLwq8_gcNGYTY{LdG;Q-Nkyr(v;u}6)I3|H{+`^}hulXgi!YIh)Ohy>>Fl?mj%X{&r1J4S7KiB!o@I)o+u}5k<|L{v$f%Uo3xyZ_2ry^B9kEwlxmNyV)iH1$Nsk)AYf% z8IEPYLKv}`!8Exh5HfRD(F&`Yu7 z&O5|i%xI%jIasuLLB?uqt)X4q3`{)rg>=GZFc-WQVB^5GWNf+1X4V*bE<_ zmm^J*yA*`pNc;nK;$6iaYgb~CZ(lN#)a?Ale@5aP)Z8!R>V~=OFVrn>2iqUrZk91q zv9a_oIv%Tpwu%0ZnUa>^6@D@?P)wm@h20_Z$(}y%$gbqh9lm@wAgjN~jRb4U&FnPr zckVdGpZsq8O)JS8)Fx^>d0cCyT9XH}`-5=uP{Jm1H+eQpMNTE}`kW;i$uG?%+*)2! zH;Ikrc9wo)vf0nB4Ris!)L^5IF#<>u-2~4x3Xn{DWX&QkQB4Uw$yL;luz|#BP~@|T zhyYWY?y(IfWo;^R&N!@O7X4U%$nl=;sZ;CTQwxPD#1p`C-_!%hN9?K0o}@2R96yyf zP0K?Q#A#TpPe1%Qh}t@vo#}|HZek*A(xMC+u_*1cs2YXF}@dX@LY z{Do@oy2uU&gYCPKFfz?Z?z9>&z*YW*?hW985C zWcpqCy4+3L*OTqMoz_&cp8S3t<~MucgT4ugb8m<5ci9J!1%BQ+-0Oclfd4T52HmB zNa_b_JpDc9BN$G13;s$@r{;_MZZDv$4bxw=7L;t#C7b_qE$82xd=0n7e$H-cA3H%m z5-O(O38m6w)DeDc$_cQUZH{R{Rx#^>hZ0+;*IxNzZm^&_M{mm+Q`|;3*zv`&nRnO@ z=tHDvLy71(!U@0FT{Wm$ARR#qSi)e@EZG0U#Q29zPEp!#e z3$OET*$4AMIsJu8>{CY^ah}PtHmGmYDop8MV#ZTfhc}~ndUhY zy8-TRn5|cp{g=N3931c&ni#qq4i?sK2U7hn>bRO0@O#G zCDQqt02EJW4tf-0GVrUM)SIfk^Lh)^+qbcVR1 zTI&aRlJhU~8Th(kx$!oVPHoh`LR&!(bwkkxnI|8CWu}I))%emFg8od532vm~$)4W9 zGlTr*LhVrF|0zoOsL zGBP|k6nrL+c`qgfu&AQeM$uREuUoQd+~#TWpeG9Xh6L(7Ia!BMQcXF3m>MSu=K6sD zC7)sl&=j3WeFsc%XJ7!?-lND_Agg?=^^Nc~&)@v7Fxqm$xR3YaN9eC{8vKaxhAmPD z@Uxifq9cG~1}2>mnIv&hB@`rL9@9V{YOq%!u@~f&ZnH|vZE~)eQ;gfpON?HIc(zoZ zpznft32I@B@*B5@&&Yhi_TXkDZl?*hW#nGbQ*a}&lyp#sJZ}=S!S0eCqMKlh%gx-+ z=4(7{cw>Q>MY`XnV&sd^#c)v3#Chue%h=D92ul*S(LFdz#Q%VSc^B}6970EWj>UI? zJ4J-GW!_}R3DZ5-HG{vQ#sO0ob(_UqjFaDH-Y-vL-x<~EJhMo@G`^6k68eOH1|!(7 z0fUImB7ahcuLa)7bPWUV*tE7>b}8`2A-i6^?CycU{+{8DG7 zWGfqOi%t1PTg|g$r-9doHldrzQ2wz<3VP1Ga@S!7YJADV0z@LuxtM!G`rXpg)n3kW z-|SLl4`Qh0wyIS9(UhuLpZ(s@8tRm+7dFFJqZe^;==Pu!%mTdDYa=y=+*4eeZ&S{3 z73Vxwxtkt4$E%ari?(8o7H?tcr!}kI8n;5nvU}=7kzPrcg+6F@)F$={_9#d~?E6^rblj!IfW)t&z4l{o%(t;H@IV(d1&Bb{ySk1t1#nDTL0@y6hepU?Eu zbta}Irf`pl4UuKcadKkdCF%lsz$=aX2x9Z^bS=Us9n*qJ*mXSkuv zGSorn1wPn%K_?|Rv!4*6ZELu~FO#ZudTwFbEIx=`9(S5u%lL*D(C&14z(SBt<#~=J z3cw9llk1{2+_b|n#(aWnXH7EA#Fv|%7)sU04RQLO5>MSg!I3(gd%};2y~A8(kAz*P zZZKIQ7w$7X!Gj=%g3r#it~}>YW1#)9{S8xR9caCeelVHM*HxsUo$*rkKw-Q7K}stQ z(Y1)V$)xZTLf=!#Y@BEzq38zpccQtnyZx*S&$sJu*$?LSrl(k5IUNXM3bOZ84$$wn z6lES1;!X3Dc5{F0pGKF_zXeCgS@4r6r z_Pj z(bgUNS2Dsp6L(7uFr?ro;uZ^gh{$j^ZW!4%U_HH&-0!&&_yfkau;@GJtZ$jWhkQ); z%gG}5A-^2aWQ}UF)sM`{USxvFk`$eO7r8CANMv{43=?f|phG}6dI|9NEGGX0Tdf_6 zB3LisbpCMWIJo7y$}ELX*^knPm2E8BY4@yg#z)l4WQ%?@<%~JS+bH+2dF(){i$6;p z1kXJulO(uqepGl(hw!evV!=V?xPth4NN-=wotB@s%wb<FZnfz zI^8sGNOT9TkZlukm>ETX^_vHdQ$O5a5Gd8v=vO$y-j4k{_kY%f_zb7fEY-}jDU8ih z!5nUAmG-~@bTJ8xaD=}QHHe$cxd*?aH#0YUIp9yr-D8RF)M!JCLNS|1AJ5(CY=_=( z`q^%%p4z5a8YRokT}-yrD#JJf8y_x2=!_A+*u8vi(0zI?yVa+eyiY%M`yXCU&DU)! zcvTQY>2j^PjYzF?xU0AFkoA)t%N}hyZuyqt(%&>uaiKyR!?=j{Y?yF7@H2ImQ~R_e zwTzn^g$Ge?#+0h>(nIXKijndz#EFtsiePAcL7}o)(LLvfdQhg$0cq-zXInc$K{1T6 z3K<;wS?7uV=kL#n#8b~c)N9bgV67Ugbh7=*SE>y7%i>ryqs_`cpyA|ma>iuu8wFa*Z~gnNgMjwZ+>O@ld74n)e3w zmc_fm;9nUXZ10gPiBHWr=z(aJ!5_O2I#C#mfAxFFwj*bFwx)UlweI8w6*`+aYywrn z^@?3&J1U^$0r3kRUhtjxqB@uxL41vR?vi8c(i{iq&@}g^+B%EqU7y zX9fdzkI%ptT;i`(^rP2yCT(ESbROLbunmj7h{#N6WL`Xudt`N295d5vqA zFg>%}K7t>RTx>qc4T^ng(6N&uh6)PCFDRGQ(t^)zDxW&<9!XrKMlqYp_E|jf@kI|! z=QMBgJ{f&w=mZAp=$&Oat0owS7+wj?@CUvwX$zv&xI~ ziOH$fe2;rzuY_!oUCdh$ui#+)NoD@7byJ@z4}^@e!Np_YX&GDdTf#SzN4Z)f+hWh!2BI|)(@dg$CTORQ!N2+Xvk%FY z9^s;KDHjB6T#7tI=*oxaaCMt97>$yK6?vdL(!b}8!}=v@oztOJHAG zdXD%;nb^_352Qx_&-@9*hSeK{-P@qX4t3DbE1cv6RDe_zw}2bYhZtV6&2?5m&o;==blKGQKRr- z)lE8uc1cB$ppjP>zvS_(&iT7JXUa~Ojctlgv(+;1qmoPynWdqj`W19lfRQ^Q&QF}Q z$ToAkM~1TTL|ODDRu5+_1oh@z^%;ZWJj=h`fipG5~OIq7kE zoT)0QkJI09Ear|iPWL*(7$X=WePm-Mqe*XhEgiB4oca&z&8w z7@2*4|8Hf0tk0Hm6|88rAxphU`N#ED^Fn<_&_i>y1@KPT4zI{OkM=;GN58`e4DpK~ zS`ia(R@LmSlEC zSgcs2F1N#teqOkPV6PQqKS9$@W=NCJ8++1Z-!ZR-^@Y zv~9PlTzm?>)T{tUHOI8KL0oz<49K5R_2>xF={E;EPfoi;XGR+iAH}nW=^Z;NB_DL* z8;{CzggM216f618RuAQK(b?6Y&Sh??&uG`t`_n$c9jLr0Z)6W({U%~661tF?p>V7| zoSx-r^KQ0E7FpKT9Fe{^#TAZ|*BX>&P8q7JqW)6%<8P|8nsZ$D)NhcTSr};O_Mx(hpS6fgH&x#%^xnGXE|srRlGGVCc{(>`rXRbnj~Re z%5`WwdpV*QzE5ZSY(+~zr!#Kp2^GEeduO_pShuLMR~LNQa8TMI*OI$LcHTKue^((` zZ{zz^UZ#9`rKY`JlYCNpln)Qz2Wyx>@5ktT;C5v@GV_}kAnL(8BOTx%~A zB7j}TW~W!~6n462#%#S>hh$IL)Ux=QXihpnmeI;E%p++H26`n&n2W{Dc9RcgCx8jDtF z?`hvyPD97xesmgq7+I|@M2@2|X$R1|7!lPGdyQLt4-;*Py0eIKEHe1uRMiNia$7(3 zXmmmKRZVYnXTcF|8*GtT1GUGRsP*vQ_+-^)WENhY)&&g_n~#Np%eL4#~i9WfNRPzDf;6Zjjp}=V6^l z!Z#mZPP&~m%g*SWdsF2d!L89{H4(1lCQ`j4Z8jX$lLfq1xWqK+0!`zYDL6tv>YV*irog%cHAKSXx*|qRX*3!x4?2Wxb)^bwYJn-$VCR(@r4p z0PQ;Ny&Q(DY+Ukw_yv6-Vi-D;^7i?Rq2%?WmC_Ztdv?lXMXt5=nTq!IgQc``j#cTn zsfsa=6UM1?4R6r~%{^U{tUolCXOe1QEgKL%8#zFW22ZR5=zmx*c~{b~T`F5rXxd20 zbMr!qH!4oLg6v(D-|ZfpRz1rSjf~YGMw#T4_K2=9u@dgZoec{`0+{aJ9%w%BJ7|#{ ztrE83vQFhYYx3lw#TN_DE0}_T)+NfVIibuk)l2(c$flWU8JV4=%{Ejez)-U=J2V~s z!rbvHKo?!)4Hu{S?`(?Rf0Tx!_@rK3b^F7d95wh}#5qEF7*^^w@O^ zX`@VTa3N8uOBEfFW=-FmI<&hs+RzClpdy07TEkBjJZ3|OrQrBXEH0u1KaV?o7mN4B zg(DOc4L#f02f7aH>mS0t$f7bCd<41bnup9mWx9jN0jx8gj)q`0@-p-%zB>5=wh4b7 zF$)hP7~kPUSMu*erP|r#uI)>;$H>~c0Z;^4SaKYCL|Q}(eG175QAk@7!{#HKNwusF zO(JEiBJ_&!ncL} z=#OX@q#M0jx)-@gVM#3UtOmm_QT}&s0?ZWy{BYi@#7v%FjpHzFD7aL2|w0&D8 zq4Brs@>4ax%sR78TV~|x%}}sD2kHn95^Az%!7sT(2^?~gxfyyDEu?;WlUN2Ax$Ctm zr7*5xi+XfkMMb^(nd@3^mB#ECZ@j0SZ>PweL;;YFyAZ!G1)14({zA2_|H` zYDy#@Wc{ppM>?gWiU*Mq@&R@&IaWD<2V@s@YqXO1qxmNDCtE?cl75rDkTc;s$uZbw zpGV|!qH1q4ab6y~WfxJcI9csW;Hu??Rw7<)wzVhLX`XO%iB-^SgeN>B(ldlC-~wWfjz7bo(M+!gyDzD{moO5(}q(Un~*p9 z+ENJZrK4TL#k5AUp`F<1UrU}t_1sMLIrJhsEYpCEXS&B{V@B#%XbkoaeDyw#dz0Ur zQjjUO-!;#WSnK>^(W+z4a0DWIjZHca$PLA_Ycc>J#LZZf{H$x{CW0bQR5I7J72%3t-x`11_svR1pjBEUU{~4WBFSZJr1} z$)_0~_=oEwOe3T1YFR5J#L_M$6Dcy}MGp{@B(nq0p^KR39v@L2Y_Gct@2MMGRs`>> z`k7M#?=2U-q43G#BI+c3C0_>hfIqt;B^AgJTS)SFB*f$&`3@=4g$2AsUa-JJip~bN zo5yeqGS1d5W3jADqOIznFg!oJhVUI1_(!v zg-OV7*a06ISwfs?!kM443$@ium|{`sK)PAk?3yS#4tp5nltGgX;;CTlTj5i13twQL2oiCH zu!($+H{n0Y9Q>O~L#`uMW)za`347d4;wi;Ur$Eggv8+*NiLAsR?gH^Pq{py)>oV3wy<;UDR=*m(Rpl@l^pWG0;T zULulqI&S<)7FyPqttVHSF6G=Jo*4a2p#-ge#0(*Z>m=}5{I<|Zwi7SqDpDa_!>)?S z#KY+4!7K6Ql*ua#9|soJjwF}4`j!}oe;r+2^9Z%|kKr`Y&-|S#!5fY5p;SCg|5>WU zrwPAP;_(iA&uBq(XN(WhVyEaeo{d;7NU4q@+ZG%xxHEl?|j``|sk&Cf0JQuJ5{mocBH0U+3y<#`nuIg2O z5CJOYT4&<_l@Qzy947m2=uCu?|%xdVTZf_ zKv8hLevBb9<61>G{lu&bq6hVZ>FI^5?OROj>Uas4$6V=Pc?$;#N3z-U?{OWct5En7kIBH9+JB%AMgR-b>UYo z2po3=v;Lr5k1|OB22W`%2!e)E4PdU+1m1zaQ}%#WphHYgas&B2IDza#e()Yc7|0JB z=5iH$Oo1P}Nz6p;WVUc!#Od29HkQn!?lapp$EX2JZ%GJoZ(hR62x?-I&cbJNO$)fEan)YlKE_+$XkFJscW{WEv>MBVX`RJ+KdhX z4zp5mm^@`%no&=7)%Qq1hy?y=gn%Dsj|D{I)988+1j_{_MJVfC)ZjSE1mu4(_|jgv zv#7IFpi=^yK(MV*zFtH>eNA^Kb{SX4PbWI*%;Elc0(Z|p3p>TEaDR`@1P2R_uwLcY z>=T$(B^KRPdRn13h@&RvwTEVd5zZsBHslH$n>L8ZHV4J^!gm__hpoZ8^Y{FUF$r_r zU4z~h$(wVm1sQ+x@0%ZHeY4#*jgYp`DGa3S3GmQ8Qe4oU5~5TGr0Lva&7qVntO`0F z(}U@bJP3B9_G3T2?gEUQQg+h9%f{pZ(;a!K)nFW_94pM$=c#n$KwWqB2hDcAP@62l zxmnQL1dCSC1U5408MOjG?6m{*CbLRI%&dBT?oi`1&3wx&!!qr1?xXGiGzot% ztc3qkH*gP;UfD&g4jq_0lUat%hWp3jENttv7{yNH^QWEx{X&{VT=%pk*$)`m!;}J5_ z>28=wrWvKWTydfwCX6FBD9`OARZ51%yd$h*g$tDOC!&M|HS6wJ@O;@+$)&) z0tOenG4^It?5D);)i3=A;VWaMUhzEh7cz+(Ocy9tGuP>H8ToWEwKHK4MN{69U4aI? z4qQp9fz$IEfdaRDl>yR++dOo?#7tDCpb~6A&UfaEp(AV|S0nq%gs{8PQ|Xb+h4?0_ z1N}B)Ci$K26F?H5sb%6d`31;wFB|$=A}vRC7Sj)*rO?`#L;l4%4WqS6cATz3Bpy5# zR-}1R4czUx{lLaz;mIUmCi|ZwVCtTS3|E8PoR#|1&ei6Bbj$6DoQbcuGWa%bq1mY! z!JIU1kdQQ?-X@+j#Ypgj?Q{} z@k_%b;ag#E+QEC}Ekkazr(L1S1ZI_8oB5jhpQR*eA1E+hjh2wfaRVOo(bkj7a69K;( zx)!;UjYB>M?xc(GAzrP)Yce|btMj|8x0SRXmJ_;2E35bdu9_vPP*`V-R3DOm)hBD0 zWtasNx|DE%t3V`?lbFlc$iOIi2!6}+DL~1hoJMC0)ppBD+g0^8VT`3*vy*Hz}qu3gA3&LG=T(u;!H9q<_gk9QKm`)r?>mgFRf5e?&&XWtnYv`3E9Uue8 z$$vfb$Pn<4eVffe7aD>s2p!CZH1dE}p`&UyIpOr9exbyNo{ezhKr^ev%qZH=(uudPWL2N4GTb31@7*6CJ;#>)-JB& z>`v25$3Fa^VV`Z6W{Ym8rAGRSZ!#67|IOYtI1?PqU%LFrx0IC64W`KZY?+T}jG}kB zUBbJF$qvHutY9J&WZIiskEsldYmQo})7rO6_VAh3`KiBIqv=RINAEX8MSP%o2`_>~ zC<2FwOqKS`B)3$onQCkGEYxPc(-r15W!KV6T>q1%plZiL`3%*2t6AAf($m~d^)fZc zz-ykzt=0{NK85>m`_aAuBN!B4<++gZBTbe?1(f=aOP4&M@f5*Rgjuz8}r_3Yr^{ONu&bg$H0%M)M zHKDM^hH68VUCnQxh^%NM0c(>V>&3ZWY%l%>`oFM9HXmQ%ucu+6*s~{4fYzo~c~wvm z7w-B5&mr487Qh#wG;1v)RrE3sMf+!BhCS%{MG@OVWwffRjN?ntUN)7Gg5_pt4@V_=VFj%6Xpm;N$t1#o(a622TZBq&3)ms5?`AREAUS26$n;Hv zbT{bSgcQDj9vwBArK#N^BWaon_5Bw(sFv=xiEW@!7@5;k{2iSmO_z==x9%1Y3=ed7fTg@2h>F8)0 z33syk8BQrGO(*rTES+J6ZbVA7@Rq+8r{S77TZEFyV?%@LCz=zfJ>l(z2-etwBkNm{}Jy;_2c#BEwlClOYvq&1oE^XQu@$YREQW2D;8q&L-k&51QIc?&507dWw9grlP&_8%X#3B;_Pk zx14`egv8A;QGGLQt#yhvAVF?g20e}P*2g2}5D(sodHT&_?hu1Kl++^f6T72ygvy;b zQFukY9v+uRYSt-dxstVOvPpXgv^v#cNr98&?-+R`FY=OZFZv?*CEo&H@B5tzA+~!Y zfpcI2bE0Gc)EB>2@Bumi&B(2SGZY?93(`NU*2W+QQ?8mzP(FT^;Vc#z>8|UGuL~Bq zY_W-Rkp7o+7dL}RAe=r~oQ__@?iGy2rfL7lxrqt#495}de&$Wc!*{h9ks7$t4Phfm@gqWXlCY&C+lSKj{anA#%*g4 zvMPCsX&%`eyIZd%&qws<#gj`=85;qH`wpP~2V&iyiN>V{aHOac?#TyHa|3@fSEIjWrCm1vV7(Go8z(Sj(f{dW^zSemcau&JjAw$VXWn1Ib1L5L zC}9H62)=NT;RRHZdryB^Wc%mo4rQ;l8HB3Ti)NO$Cioh*acp!y;TOw=9^+yeS3m=O zk8bvk7N-JN-Q0thY_qlee2r z8au~%>0jzsM@|#Q3AW(xEW_RL`%V2}XL{op&em#c%qJ_P%?xKvtznVtt}8?lpZnZDc#ZpAx&!$LA5yhR zK1}OYC7W1?0SBeQIQTZIocx+C?0&xCJSx=#b! zL@af`LYcupETM9bN~RrO_EsIFSXewtGe5h1zE(RUt*`4YG&$joJpvAh{%-z&n8J1# z3eo3*IYJoj=Yxwh#PjZ_#e9?}TCm}^_JAh3tQ!<3&n{X4x64|amk)1Gjd8U?QW89D z26TCJhIu+RE^M9tEj})AJ%5Cl;}gJaB!k=!i}@%NIbZPy?WJ~=&PFq3b%p8Z=}cqp z32bJ{R&m>27{A$i3?CEq*rXPzQ+M_2iKxI9{9LlD&tzscdCh&dxZ~Lff2&wb$W^;a zR0JbEUa*UM%K;PT4$Qp)X1dw_J`n2Tqg?v=Od$xE5NQ0n{FuB;s1^M z3+(q^N{4Iyagww9*UQ;dD%bmwQSe4=dK3~nKa1mPydWvYW_y^5oLxw z^zh)fLLPO_U&=Zu&g&3WLoIjnB>n}zwBco#4pHX9Hu4xMV0(N6@K~bdnWq{1HIEKdW*M}nnhGRo(1Ge0 z**KUl@Rz?q0?fUXThZ>|jhaT!suHz<7?gS)o{vw83`cw8$9-2}KZ%G_m&870_P&jo z3kZJ8&g_*$Rb{DkII$ydm%JTu(paH*LR=;rRbqognXK7O+)W(?Z6j_(d_&5K6TWk? z0%FUFQ>jn5|LxhI(SlpC`9;=LHmBmfWE}H4ccN@8v(&ImF@$yyuxdEpTMWVHlITDHtBohXz~x2YRA?zKgU0H7c&mqT9o|Ax^I5w zh?4v^p5k}QyXz04p2~5;cIj#Le6A@;rS)Oz!dt*$RIT?ZG@UFtRFX^=Ih$)zujX&9 zy`QllXJ7H)tVqZIY-R~->%w)Bm73k)V~RrtL4vEU3U?Egn*VV#!zMx>X{&c9v<>;< zKz{Pd4fdvnR9)$x>UZfciu?-~Wp&LvY1uEC>zcs?$$V^kp;-!v*&}>mABKMlpoEXmHE3^Z#pg+n7^LV%Er1TYZQw4 zw!bnt)dJI?xaXSry73`1pr!0e&of8>NZ7+AXKkIod24F%rbQdtr$4HhkSoc2Td~O4 zGy6~R8uGTRWge{hplI*dpD{)}=MIXkSHID7!K<|&xi+5eNLP?^Vu`YKYTBLx<)`#V zjq_BmvfvFS^=-+ey#AW=^7+O!+Iz}0l84)=OO%1gN^L`Ge>5LH8gU7Gjvn&4Pb|hS z91D^ANUC?8SIA|t4M16{m|6Z&wOe^6$DzKh&d|RRx91;-Xvhyj6tQq6{5~Zd?S`gA zL}TgL37-@AC1T={6zO60r5)epy)+l@BubK;k-6Ej7Pd#m?eaWJ9Qdf5XMC?oRXx;0 znHM#z&^JCCn$9+cT!YWh0bX)6k^Hg)$*`0St53>uD|%hVN_yvSbd^i%b13}}`C5_j z=C62aU7&icGMa{FkeaFb{&6ANOZ;EKU*S|{l;?T04Vcl4W>D3|8NF?YTt!H&U9QjN*o_ zHB{EhTE1w1_Qwt1ZGWWNQow8EtqMD1trhy58u?|_-*)fRjp|BsyXdppX}Z%voyA#E zna4pS2ITDDrM;LM)btYaOFv#41Kr39C`REh$p-s5_@TTFe-vSq3q=CR617H_fOXX7 zCA|^nzsJLs_;K{MPn2l1{YA zTHZqK;CAd>=rQ~qE`u*2?(w!sU)}-H=+R)#)Q-cu(f6Rg@pwoH565?BS0U4h?gI3J_2-nn)QfWQd#H-siJ~1k!uU-SMD?Rg+Gub_>kX*^k+lyl0@D+gA=k)zp|{aL zq~7}tK8l>*>?aS@HE(>P&zBgUNzc~sH4=gb$5vvjkgf0 zl53UR)r=shiuH?&g&)&rL;TU6)H<(xY#w=di&FMi4p%)??&b6^YOgTZ``NB4t1K`0 zhpPRi?byHSdj^ZLzqX?;HGML)koSmH!b)~}upTK9NqvvdqoCDhi}Xy<>B@DoU-{n( zmMCWD4z>Bw-phxN2NrbucBX3NApVMguD_)u3F@p1y`#5ZC7Q3G!iqMf@tlAanXaIz5K1f zX81mn=dlfK4KnKLq$fAFD&uAMD?jIy%72#KH&!Y;6kVsDtNP@fgQlrRIWJ50YUW!X zCNI?b7(Ye+2W9Dc2Hb|tV#8}8vK8cPUx<~by4BCcwx(|{hp{7BOLD`odlKFx!G6i^ z)06O7%7IWTT%(T2PQ)*04GCw6x$x<*aYQlt$@_`8-J7_LK!;>+*l0q7q?x5pP@8<6 z>kfKe@xj;;>!vCLFR^IND$QH$fc8@sz$e2w34`z&bZzK%Vifkkdp}W5z+3mhhm;>` z?jeKJ154H+N{y#83OT2Z&~HM=LfPaF)DA=H=U5lSAet}CXi2;bACB!0^}rkOr4K8QRYvtl%evfb}*v=ogs6Ux!i93!jAaB0nk{kS*lZ z^oM91xlQa=k0c!-2J99o_YT7ir2nSX8a;2W$kmSG9_P={9^mF$av)EZ<`zS@nTzN) zF&8&P5si$b)6z~Mcd6#sP;>+M6Z{B^1?#*n;R8uW9icvJDk!_CfsMYo3EC-!)}}k! zW4b+z6ABSz$Q0-&KSlOOXc|t@A1Ai3X`xs;gvo**Q&7$smhGIiO zx9VN$_W5M-BK5}HUe1;pUuU7dO!L}45|CQXQmOTarkG|*lAzoA!^vT=T?mb$5kK~G zAd0r9T^@VUCa|LNmg;G#M`5g*EpoR{)J(`x=P(L1Y&;Cc; z6knBg$sbPU%N|>9l1U0Xcbc57T90Ltz12UIbBQ0?o#}{F=r5&n*XEd9NgpD-ZosMIJHh~p7vMUc5IuIv1fbl zwK-NYv6{3=?KZW2ic{ORjc*z0Y&sJ9(T6gYV#rsU>J5{d8&xHd1<; z3dfVv)Kmsh9@~M!#Z}#ls-m8+JWrM*KPwNB`Dl5;Z_J}ps6eYWGoa^T0D zBvyfr$W7u1=&S8byaXe1yNf&X^wg;$Gb%VHj9dkh#5MUA$X7(-`*@)&8^0jBh!5gV zxI*hA{Il39SVH)*l`u*SW&5cgib;}Xk`6=>GcZL;Jfc@buOUa#{{$~3A+V}u1>V9w zvSd3xO60q@$D^!$EDLd&r7N`$C(P}k_IRz(LRE@i;~QmvC3>(wlW8K0`4V-PSWCYS zG86B?!)0eMm*;$O18kFft{WC7QX9lO?^llQWEk#eql^deQI;1yTFuE`di}uZQ-o^}h1NfPk)6)>Yi!FEFG~{Au?Yk7? z@P^j1%xm}@GnKdvH}koXvG@r#DsT?rM=zTHzkY9D?5*EvA@l5VXv(76Igt>P!yrSbJ!mNJH7kxcz!mII)oFiZ%zLYLn5o=D# z<;!jfd9o|{oA{&3srGKXpW49e;^t|0BY)UD{Wom}^V&2&S4_jhmQ*Kw7`-3E(F=(Y z!KcARim&-sXs2pcn$9Pw&*m-VR%vUjhq*@jXxhZa8{5IRnIooC8aXo&&XZKqo6)3{ zm-Iw@N=$cfl58XrZl%=O>Z#may}tN9H_uS-xysgS4 zLm%Yaq`TlFQ^LSH!W_K?M3Vmnn?Q5WscId25Pn#cz)nG`+_B7hG{fAC8HRNsztGFE z)28L(Uu0C2m_M1F(+0p|^Klm#MqY}Jq#jcR!J*VD5K-BMIZ7@qxXLUhS?3e_1bLWW zPlu3Si5=hyHPXlf6P2dq!62$Ad!a}pxtKhhS_e8s{Suuup}`}m2;eH0(Vy9B-xQi< zlN@1m2hmbK3RE#?@lY^|VGOgVYs@4?8s(s$X9ZEwbY)Tw^*=f$Dw%3bw+mWD-UKH~ zFVhPx5Av$PLrX8)EdHhZ{acIVMlL`iqzWt zb6=CgEok~;;*+p8{wi^ldl>N#;bVIQ)D!7+e8C(w4?Sqt0@=jads<+yumU^v=tu`0x=ZjV+#PHoPn^&85DmK<>_InWUSn?H?UOpue+VjSEIp2V6toiPz~Z7p%V+3?r-AuCe8N&MoI=)$&F2%S z2|2@^#OCQHvk&kNvh!>+{8?r%W*TuS(L$TZ9g#P|L8>yyB4#CD{Q^j>;lIz@LB-!#L3NREp5PTimz z1%9OFfsgrv1V-3mU(V+X<2f}~#fw%gb{pT<)QCCBnN^4AU+jCy9(p<(pC$kgb26Tx zJ~A^S=8MnB2GMl9n;z)pgogHFTYtX2t&(lU^|aPvhuLwK0>c4jshL%l(4?Tv*$58t z>8X{VI~NysghJTZ@KW*?6CSXJoK1(gzw@P@3`-ri%Jq(3#%^(vsEj#f|E7oOdp4Cq zMt8A17E>rO=G2rrYAt^!_660F%Lsc$%9-Z@1Bm}bw?-NtU(nConajza4mz_+Z#?{# zq1?&34z$~uA@2e9*|V}TsBczfGD|HoOJi=5mApKxE7_QZ{8teQy2NpcA6Fu#1h`2> zndDA(d_ildj+vcTqPb2l^^BB$1sdn>%xG%4JtD~>-UVEaeoxL35<)YGTK0?oJfa)D zBVXqwr1Kpn_fC=je%kp#xrW^Bn4$g;dS)|ge`>Z{UKz$nSD6z`hKxo04ftSU11N9+>L6<({hpwg%23{S{Vge`6ej^R`42Y`ktc2OU;D zG{+%5b9?e{P$KOImxq0f|H95A;D{4UQ}SEj3veAkZii?!?q=EHsD>Le0!!~}XU2nyT@dVm*> zn+_IC5_;Hvfe@W{oB0cXbS{AaocuNaKj6)#*e9Sm?8+{W7d863B&?8(dqc#+=1&)Gif!IH9tGTs8A9OU-65-sIQJTxMEq z2|b#A9_|MQ(ggvlL=)K}TXTDmbsQUKJ#SIt-z}l$jiwyou5e$|i&qI9rK`C?{M<}E z^McbQ|4pA@*T*~s+n9G@+0-g#R6tjX%!`9+>&XZa5$F4LR%&9;QX z0BW@5f^W9?KU|PEQ|IMRdxj{qT$HP8&MfAS!!Ip>-fI1kFcNU$o8~+!o8KD}NlMr) zOOF$PK5cJMxLf*+`&aB0d?KIa{ZG{tE_Hv@bl2IP2Xqq@eeHFI^z19v5>r*`RC5*l zDsC6Q3G)yCz}_G>24*u|!T+p}3zmtQm3{f?>a)aC??5epR=ED?M`z$9S`PT~bc>jpyfl3Qe$_L|@XWNz)y*_n zv&-=pWR}sk4)E(NlVvEHlG0fS#~#O?<1AvoESb4NwGW(5PXe{((tMvuM>Ad}l!@(e zFM?x@)y~OCfclhuG&)^Xve=y*3jPCk1x?;s zvn0*H+*aIPRv&praWPH=yxC_ zu#0HW=)_O*-X-@@Bi$#-uZYgMnHr}@?Hj0U<#Fpqs#J2*e1p1_F+k`B+KEXR7=*_p zG4DZ1SURl+F9J4*4e>c5=W---n)vJdF^#pvDe?zoqSObMi~%oTZrC zo_$0(!wpEA!FOT3304+n+eEjZ-!ksdi9o}&@%NB_XdA8Y46`@JAXgt-TjPI@_SW9& zAGU6m!7{03pm|KzZqZOMHFYUh%`b}I%r@cTqJqTiu2Fnv|HC-^dyskbYS71h&fO9n z<~-=EHvszvhfKB2y3O8BI@Y|;x-&DMe{D%lnaqtgw~E`sIQR{bX>>y_F8B%MWScMD zL{6ZOlb76F-cR_0Q|FzfPqZhx?aDH1vh#HA0CT3JbB2$1+2WJ^*?%poW3MoSg+~zu zz{d{`_NRukx}~wi1Nttrw!EQiFEO}ef?_@NrckC@rc21*p{Z0h^S04dOX6Ix;XwL% z`v=pT#Gm5sH!fz8`ESe;mc;EMUIy%9bRdr2QTjuL;`53}X$C^w3$nDQwa&bQdbMJf z=YPh(bLyORrmN}G?PK9JiG<}e>WjW77;$%4A8s`130O`40)^mU$$Q;QETU+P-eVf? z(;1#uspG|; zjDOI?!dXxwl2XXDzPC^4bH4L8)466XJeCE8!-& zD(WP6f`UR}W)Fx80N^k^mDo}=TZ9Bf_zH1mQX zjs$vK##UQfdTjCm^EG-xTsgmso*!AuZl+^H2zo26^e+(EXdLD$c*Z?7jmZz@yxQKL zt=t^>J=YBOPR>*N85T`HYvtMANpHmS`jOb@{4@rR?97g5CI|nbr_yizyHerw3RGK= zZOJ$G%sXqouW9d@XdW-S>D(t6vY*>S`CVyutu6URNgae+TyX4Q?jTziA!By4ErL~I z!YXs=O7b~<5DD`AcFfd&&dat>QayE_u}zZhaE4p^WSzC$wX{gRXz>Z36FUnT{PURU z+!F3)cs{d`y(*qXBoGH=*K;&aMN z%V^7igcmhd*uF`MF`I&DsF3uR_A)%(pCMO49iodkEo)4YX8|hKSulD=H;qBujuq|L=5LI>|J*ya12Vx=NJzG37sn zfyCroYyKRfE^DM`9@!Z7DIuK;w)T;Q$*<5NyJ&VbYe%GL#VV_KT^;6nI5?j_wdIEc~G zN&bC67kZfiDx1K3S060y%$$}-`hGCWa`tjD!ip% zgwGNi?hk{m(VyuHOY5jAdY|4~S|iL=-6}Hk2W3j1nqQQC%d6#%q&r-ITbMk|zJomz z_s80rO^n(lXqX>iwd^~lIw+22nVCyxQOOFkdidXK85$jb+_2KbCHku&s=+Pcf#1jz{7NRX4#U5k!nO8I zxt{zIn=7laC(oLjS}!sOgA%iBC(L7FBP>0IK9M7M3*Rzy8ry|y6gW?$hJIV(BW+B> zV|^6qSwXuHRVT@$4IR}NWQ%LGTBYK9QFDDe^-g=B;h=6dRcA6APUzjR2I?=7p$vj0 z_P{OJmXP0M74h{*Uzt>XcSofnQPpr=qAFQ4d)ZaZSlzG!R@cJN-TGet#Q2iLjhCP! zx-#f8g5_*MK4TLTHsP)DQz4(o@nq_uuDL#a()N1ULBozUd5S-#AypIAeo(ZpwYC*( zvDE6@Beg`DaS(c3yA_&+UCC*RDDbBV!I+P@9`cGfO&&hbI_DL7eCsi302a4uuY51| zse)BL!!>z8(+PiTUaXr+q~c=@GUB}Eps9+SkR1;{BlF|mV}r@NA&&_e)puX3Y!%aO z^JB>u`fc4$nU_9M_DFG?c6pnq|DhxJk6H=c8EdKE3a+ZJnwkMi)-G5I#>JPSd#NiS zcSJM0VNa8+$<|pLpXEHZ#Md^Lt~P5+|5CIS1owQEk}u-oG>5qjNSVGrdqlO$NHPCq zUW4A!7veskf#70DD!zs~x2s#`c+Z0MpL3eK%9ppy{p5IA+*>ZUhdY(ZTh{GNt!B1m z5Zp<(O7JREjBWS^8P_0`&5rAXT&GV5SK%|ku=>v#WkrM6e#(~nu2+x9jmRSlqhwb+ z6_NPhvf=U&FfA!XQ zeOVPOc~$h(XOn4tFKvE`&)z2#s?KqJGmg{VakP;=F)X%DNV{p;D5S-(NC(yz6oX;l z*p`PG{Z}Yf{>pm2>|BMvT0 z1oQQ10p80g0{_E?(=9eV%=q7$4|P4Vp4P1><0ZRl0z5BeBP$yURz+#aMtq9uR{^dY zsZICBJ{de&|KX}ydPX^*s0lv4ukq;M`C9XTl@(^f?Wxrs5a#2JrmVk#WvX|N(SL;fILhcmrXug5X{bi^8GeJ6XMRVw3Jvh*h_F3i$|1C?W*t{2FpAL-wK zFlfE;449!D3e|(289R_I)Tg)rteiR?vWQ@)qOB>?`Q~w}8^~pXx$>@ZIe*hvqBirx zZF$-p4gv{!fA+8`)Hs!GrDzU~W&G3cAd_i2wif#z*b#h+=tjNTjOPYAZ>;PtD|Eo+ zpA?_%?eh+)URrlsE@-Y=vdO)=W9E*An}+@TZrN$mZZ19T8GL|k8gmWZLazvJhc5?n zHcBM*zVzCmvW9sXW&bGRJPF=5syJ7Yd7LK9kwDDU1=v#czz}4~kghZZ35qm7IGlrH zdZ3FKE+`A10-WnLl91Bl%NI+FivKA|kiRRy-O}{8TCCM3l#iX0s>MJM;gb zZMEw?Cp7u`HBO(Tg>jiplDr2hG0%&NL!8{ez(9et2lTnTf z*oe4p#4-G9@O!Eyd1y1x4bq-p>C@-v7gW4AY&IPCH8Wl?^|8g6-a-gShI_%sOjaZo z?WUNER%7YuKd|3;ee5N+7K%4h2>$ge!T;RIT5d1ms% z3{*EL03T{p!Ik)Jc{1up*wf=Mh@2H0huT+lsaB<>Is-M) z^G<(`3OBRHL6n-fVPYu3kN~}*DrGDpqt>P!LVr@*W1HYGwKI4d@s8TL_J(Q}Kfh+Q z`Wbhs_>{Jc3w2M?w`4EyPYoJ29M3S`W6tZ_LUBy6R0Thz52wBpr&68Bhjy*$7WW``AuMH&rZz$S znB~#sB13}=Vu|J;dQ~&UUT=LRp<+Fa3#MseTubd2#eLPoY|tm#E+cZoU28v0rb%L! zNk&88`JE|45ii#~>JiqBi444p7lO*V!HS5YW96GvJqnO~pnjP@%r-`A@LZw$>At#1 z=%)d9j8Xq>`pfz#=P#(pT%J4{8O6s(^+C6?JpzOAap2yHDT;q8ww9h#zAU}ytyS+X zdTo(vXBRZ5G`d}R{Y*KAsqQ(-a^pTnX4Xb%u~kU?0bdr@MovWI*_#1pvFmh?nqWnr z<<628%8Sc7d77y`z7|gizM>WdaRRdv3DLuDDGQYV$ak(3E@&*J7aVFr=eOth^U78 zrY|BBku|Z4sIGXg;6my;S+dpwD`c-~CL&#xZAwNUN7eJ(=g~OrEMY79LO+LCf;o&6 z4Sx6xXp$@l|Ah=ot0Yci!(#4`r9_)xm{O7NS06LI(DqyAfOhF>iYj5JVS+0QnQtuR zrN|ek2|fg^hcoppF$Vcp3h+d1Oj=`N9$p=Tk%Nh^!AVprYW}K5MivUJyk#=MV+tEW zYNWU02|O41z_mfzpeNC{$WyFX`y2fiSLCk5_7byFv+=!T=a_!PcJgZQd~!YIshe(C zNTgScF-8!ZeQHxS`IlV}1(N~HPIxToKn^1P$kUoHXb-BDl z(uix9y#wvVjz}Jc&0`itDe+i3KBys)4dlzVYEQX)6y4Lea&C4<7{VP(gfe5A?GpJv zlf;^2^g%}R3*`*hBEVUjk(K;kNzv$8wlH!x_J|o2n1a6t8!I1alYAEnhv>@lZaFvT zA9)_~?F?UBckoT7hK|dIX;6FH1w})6u;pTADKcNUoS2JBxa$$WFr2v;Z~-@iR~0R^ z14@;?XkBK}EBkZ(+Jam*#jqn!bOIT7djfQOOvjx2WR=im`{axm_>HA5VIJCAG&c6e z`mw%%Xz^ZkK-pAntEx|VD|K_r@7ogfSjm6%GXp5xf^0Vu`NdkTiS+=f0&+RE>9gP( zTXg(#t{E% z8__3-kNRdv2XdIPsfHzUpbnCJax>B;rJibz4UOJTWfKE}TTo}I-Zh=E9U8L4i+9nr z_9o&ceXZp(zTemrI0!#e9`u`tf}5*F!8gL@oF_YAjZ^xNIPQ#&B;Sz@gPu|{O1eyr z=9uOeeMcWcv)vc540ygd7dwQEqvqkg(1E6_I43qAi}5db;~YOii+@fw6W@rpQQt^F zUJg1=wWYRJ?nkC#UkbC3)40SHgQns4gqG+f^#YF^ZGvWM8mSxxSwzLx)iXVX647WfHGI<_JnTFwEq6CI3uQ3pNRAji7WZ4@xJ z3cSo(ga?AdNz?Fepd_jlQ3>QhW5@+yW?49tWA2gP3jRkx?Csze{B`CXV&W%Y-H{)h zOWz5#vCrfSuz~E{%$cGUs4y{I^i8~s3>EVmlLJ{|KL91T>9V8Pn*e$3Ix7Q5*n(*s zekyjDb|YHzEA2(Jg|J&T7+t~JGZteZTtY%I-jE#;Q6tXdz63lY7J>ss2Tf_-ukP(o ze@~G4GxW$+1De9H;}sl_G_z08IFSk~p8E%#VLq8Y4}BtZjIYNExTNrx_zY%cKni{h zd@J~6>Q*$<`O9>>pp&o=TAufkl))1{TTIvBT`pYx4-({9DA|fUv2{pmkJ`=W;wrEy zyd%6bc8d-7e=2^X|M}(^Kb9*Tsiuu3d$?1OvZx*L7xc{+X|%vbZ@Kav($w`JrvNE+ zj7e>Q&a~#lt`&_iRbh#knSJ3;;sfcZ3XGLxPbt9J_L7Uvv&;?|!yjX!lr4xq^gDHt z@g`lW>#e*)2OBnJ^K?6CR`ODC1Gy3PFW83X1bIL?^!;wx}L4YQ5|3DPNPBUp+}h?0OQ#M~eS7*B2P(>`DUbq?)GSE=iMC5}W)Ci&!3>A}IWnhxVNNfUg zq+><;nSc5Q;ui={h$Sb0_=t<70wf2PlC>bs*9JH6Z5%p$BUj50!C!N8iLD~3*LN6Q?6-Kda3tj>?%*S1zv2I~&%(|UO&G}k z9x<72>u!p*_YE_z$D;BgKn+&np%6W`!BwhrU^^T;Q;xhnJftqS z7jO@?bGiLoi0(B}#%?x1rrm5Olb_nlFi?JO0sR9Roj#XF(JKkfX+PW^Q3Z<0ae-zq zox0>*#Dy8`wlVBE<8D^U2ASUD>C6GRwXuR3iwsc}&|A@Y;;eZ#mX+oK*Kl_{4-n#5 zL^v2iz7JGWH$hkTRdyy~v|M5SMaMA%nRxUgHj%!Gl^g7I9KJwV4PN7~a-IPj;Y)o6 zW{~sZ+fd)hPZ2Gt-PH2HIEn_5u1F@Bj5H_HZ^;T!PrJ!i$Q`;DHBcW2mQyhb3e2Z0 z*-xq0)SlE1)N1OT=+4lAA>kY~3nT=*6$w-x$4xOq@;CpSp2WPN7J}!@DVP8xl|*(7Qd$7S9iAF$_=L&-X}SIlS9z$n5Nlk@5A{-;HAQv>TxkSm_U ze}jH@0(Vf?Y)a!B%4l7n&ZpX1dP=*JyM?zIS4cH~JSmr)%vHpU6s^gqnG>^f|GJjuon@(*>JBYl_a_g&d@&cu(q=l4srfm0ie0=dPUNWMljKwC%)Z z>zV{Dp*Optl8CvyK4c-$mCar1#6QuvbGfrg&P4Oy_5-=A!4(@O{~tQXIzgGQe_?*D z@l#F}>UCJoI^Jq*mijNJhVtW^uo>w1@Fz?T{$Ic^8Wy|UN%qaM3;Y9{S#guvVNF%N zLdIFfXrAg`nH%XIDPs5shWFWTxYJPU)Di44WNaMAoW`=l3+abMe!x?@1$Ers!A7WK zxjL&v^Nn;`!gUpJfAbW>IPDjqxAB-9@SUNo>?vGlq-~0i9fY2UYs1XIz2QN0HW?al z2~>hs*1gsg{e3pw5^of3I_4--G~_2Ng;gi3q#;Ju|@Po zVrTeYK(wL<90D_dzeQn*gfp1I=450dK0=V7t&H#a9Q304JC})-NcXWAo}RgxSw@UZ zPNeS=e`5bfk039Fod7hoHeeHVPn_JgG0X8g;Ecc#0q8BhlGtU~%B>{3tIo6QNmK47 z<~(^Z<1o{R8k6Ls11NWlQ(Wzz!bD38hz$s(WMD79Q>dY5Q80g+UWD-67dlKY=l-G> zDNEQc;w&bgnN1H*KTI3x-if=x5xP_K9nhC<9lDL8>4yG?$(P^*H&qvW+EwtG`IYbDm^|7c(J`X4(j)*(5!O-q0NLhGa#7OO}Qy=RkX*KE5ZF&Zk8B z$U|I<;Ctjarhci4SWoLf6YgjpkG5w&dTtsdY+v^@m6w_19TSIgQGW(m?8RsT_5&A)AW1es|s5FdVClf6LmeMz=dal5;Ti%Pj;clnwgeaWZ z>bCj{`!21Ys*SCK?nmxO3u62$!z8?c1|{Y41|%fLz_q}vVbhq6#KC|Ww1oP_YTX6u zDa2vtcg;mO(~+W6>(<(i8d@mFTSptKB`WheC@}qsFbQdt_=x)tJsH!AHR9EwKbbM4 zHefXP31%^iT(~|CuXemM6hp!GY~u~>TI+SFn-hjmcX1++4&&_K;W*P=8-~o)Y_ohr2g#*o6V@#Ime3J8_zF&i3UAAol=cCc>7Yt=r>6k?bxLD)~M z$$BjImq(>ma=ppT30;}@)QqUD^fl^aXm@Y|#QN{24uhxSUUrhQi=={VYQJ7|u27#; z5_3N2CY>P+1XDBbaOXjM%4XIL(D-0R0&1c<(qZ6ih#f2hpZsS~3+S#yioG{m13k1J zWL3JYmTY#WGF&*yrIzCvLX97S7F|ec9V@1RwaI5dh)Ac z?tmX$dH7fAC7Ty?oBYUFmNq2Y&^E+vJ?J(Vrdo1b-P9w@Z5&6WANl3>)U03JRGVMw zOXjtuDzP)Y#k?@4Bgo?~gwLdSE-fgGEMUGb*-Y%CR}qg2ze&!(`+d7)E%ZDokB0cTuqdA);*njIsr{-9n87t#InIFRgqssY@XnklCPPCQy*D;f*SNQFMt8yMX zm%mI2>)U!YYMJt_J4hQXZRH%NpObmpKE${<<(hQ}loU^xCm}-AEItZ57;;8r-F)}2 zr1yhS*fZZ&^#aqQJeTI7Zlp(}1Im7`L__!7P)De7edcsq43v-(YLO#<$F~uj=%dKT z;_5maQq24&%lwP!P@q5`<=5)I8J~L{27m1|H)1SP%ynu^4<)=^4gZs2vGNF(TyI{B zUXRP?ALEN7?V=s*K!}6^)MS4zcn0c_8+ofus|{~GrOd2{VEx9RV2Gfo@?r#TXa2r11J&301@463Qf2-#?k6_1T zx%RVoPWCzLUBWNzkEJb9my{%gl7X=(w}$){v6t;Z)dgRtogl$~I_N~Vfev}zlMQqi z-3`f1)hK62@{}~uKA8GD>#TJa6)RFB4Ainjjz2)Xia9EJ7Uo2ZWIUiKIG%0=UMxLG z70^>mWuEEuZtXr-1ifGRKZlY&oSS7c)0;EzSys{&sS|~#v^`-TKaIv?db1TY9A3wC zq~V~)z)P!^hEoISR3qzN&L?U%I1liCih=g~+_ zujm|hAhR;OHC@I82jz$ftLIBZ$2QFvGTp;0-_$PW5=)T0v0ZAe%?Y(~!lU%N<`u%A z=1nK`^9g6vA~HGV1YlY3F? zF3FTVQR)io6`!Pyd=1onvrc#;w1H_eT$}Y}i5DCLjK5;LSgT=Egx)+EYaCp|T_!yK z9T*GfZ5&(rMlo7*rFgFLkK$;-GWDt4guGwcx~yTI3{ji4(RszlCnnhwAfGrXev9mn z7$Ov4UxQ8DB65^}d!{`|G-Q8^n-E} z-q^~JAu;im`RJeU+oHYhVQ>h$pFHBBF2v`D=kpTcRPa!CE*0+Ih8A6O;+^6NlbZ*ThaDi^3 z-Cy_siBmGZ479J*>3t(w{1V-ItSUX**$j_Mo?+Wc^o^fwL5U~Pjf6OId)PxRgc5=_ zF#aHU=^>CrkJY>`>?!iSYw~M|KDkxii9}hJ)^(U{okly7NMn-3)|q?}hnt^LsZlBX zDe7KWCVLoU1kDslJNK7{QV-}@^^1Z;>b-nZ-W$+MvfpC?OEODb{Xll=Ci_7^C$6y4 zV1?*eNCKxKPw)%D&(JsQJbGN||az+bZXV`xEmlW4F`E z)Tdmxk7I;{86g*{)l|NxkXwLH?i(4M>>B^_Q+O+cT?`RJk;4WdFH{n5A>)|ZhhNbT0v}*& zK*zP6QpOaItR9&jQE;+|&obvHIuA)O&sT1yOyjbn<;qaU2<=48DC-$Xy}p52m!dYF z<$Ff`2RoU=fiYM($X?wh`DdlRYFv8nGIfD3E4(<<{#-J*AcMhWqw`YXKgt%O3vs9V zp+ldOq}yNx$y1Gx;EH?(&tS^~ZexwXrj>suKV4B>k(l;t+3)-ZSpzG?8%jy5lFi_| z^kZQMs6cT_bi}CDRj!ZOV|6)pNzw@82=l|pzR*W5Ex>^81s}GqRy9qNuP#+XnR!*0 zG#_*B797(_rH}2O^v@K(=o3buz7Oq$M(h4njzav5_Kb4$2OJT53V({e6{in(h`h~5 z<*y_uE3YY6NH154oi;_5Z=SZhYM0HSJFo2y%!VR;oT=8NHdZNu;S}gp`X^M1{D_s} zQtVIgKvF~e+IUsgP_?M8jr@zIb-7jfS^FsOfcmE1Z5^jQVq8GQ=(n408>@`lVMGo= z2hrx~5y(BPB(@#)k!TX!i)=-vu78?4$2efcRGGpwzVw1(ITYd@soDa^nvZD?BNDQU z?h2Y=uo*sMNwQL?FTOOb9*H9+#O%TtvSDy%Vhy=(?T?&I*!>!nv^gGBGF&dj_qtar z%ZLF&j`|E?!SCuC5D)c)VH!DIddx(VblM>J26-Sxj`bwp2Dc+3sLpGeWoI$QWp>F! zW=2t*OvyBMep2kFk8|hM&1gHO(gxE@byM`^v|sK{<7cowH4aVy!O@q|TIx~IGW;2( zTQxc>!1A(kd(JzHUjZYnF?V%LP&5~2vBOoFd=Bzjvxl>3?&y24Yb1q6m^qYUgznMj zqr0J_Mbgf9+(=!h8=6_@o?U(=XS(x1{>j|ej+r)}JlS@LUamZCT?7l73FedP3SFhJ zG{<6W#+^v6fmG~*C@FG~-W8aNw*kXe%*gCiAS?6B-kBef*FIP7oox9ed*tp5dMIO^ zO`%@u&omG*@_J*&SV#Ih~X`u}a^h;v9QHYFevO9cCtWn}EE z4lYW_j;d_tDvwQ+V-0FdR69`lG_HWM0BeeS4e-G!%at&&585SZ}l^S23f4TAoHSI zjiqUu@R_hGrjXc=^$OZUEhNsbp*69Rh1GMk8>QQd{q=1XGu%xL$toBB+qg;d8n1!= z){oaKV9v-&_o8i}eQ9m6wP@p*$>MylPtZE@Iyqt029;fTu*#|Fs&*9a)UMX%It%qf z_5HZ5hC0I?j5dukS#(C|1UxnOBO*ucrs}c&m@E1={x8ujsFKu^-nuJ_Cx*!t|EZQ4 z6AC(uGhvIPtL`soB^#$-1D`=djFHGgtpaL}{><$QpTPf0xs8?(U8Bu-0{K^vm+VZw ztZgippx*LcN`I_ZKBb<3t+g%Jd>1_cB0mA&jSMybVwy&73M6()BH`iW(3B9gC+Ufv zhJ7Gk2Jyr`YUc9(vfEA5lacSm{cTsE3BOLgsY=b2Ivy5oljYf0xWW}jZCU&w)lutE z!l*f5es1`!s~6TNb{aPD@~j!AHQdm|r|@d#e&kZrL+1rN5{V*nDg?=+y#2mUvi6?$ zj@63!?*803)e>h2_DADy$MiM2CDt`^U|4LvnK|6FP-vdmSiEZ)ACZraWRe2X@fN^R zwok8KA3mYkR1m4ACx((WgJHlHa0{fr83(KLK)HXD&O>bGg2+Gdtn12l(B$;II0Y8!rWJ-~h z%HGHk6sUh_J75ys1IbHVV%(H+n!sU4w3>8dOM)V)IWKBYM?TWDvR{yBLMAbIGl+ zYxwV|bYcYAE~tx0PUu|ORx=O@E;z1rBfp%d^^MRCyxS0uMG=L@P1tW^4AdI0P%eaJ z#O$oAVmJ3v5`)E(nNgkbBjl5yCgdP0y?n0f3pLEwN<&ji9Q}12DVf;bq$w63Y&}r&K<|8DKI+u7Hy+WOfBGWS)M9P@9T_5Saw#5^FDT5 zRH&W8|0i2Ye8k<#Nyei@Gfg|?UV_(s&W<3v7*8hsBDcV+qvEL;OdI$C_>l|B|3>CY z{^#q9oR@kXFq)xg#o_2DRU&=>6Excl^>{yhbH!D00-l}aBc#x-q-?Su+CB0oc>_-j zyh4?bWu+=;wc>hSA)KMwZf}G1(NwYHk&8MxR*aerGxXcAxu&M_Uw8xPs>ty;iqs`u zBl0j1SxsgTGXr;1lgPKlXG~*tjJE~UPJhXo54|&v6tm}tOhz2 z4jPd;03U!ACk7I&@kf!t#7DAAU^RK2npHH+a0l+`2FB~~Q_C>Z6=Vl+LI+R+nGDxq zi?t<40sfb4IBLO9WymmrU=mK@c5-TDBf>^L2(*z5#TRJw`-pPqEyE?^k>E4F7A;Jj zO)p6;bQ5|^)@#z>N91Q|SL6vbKAl59QCSIH@V_W;gpp`3_Hp`??Ws%or*%iz#*SI~ zFU&#imvIEc5MI-CW`X!rE?}CgyTd{BQOPGHhNjb;sGOb{AB^$fVfbm>4Y&Xc;Q|Bl zn(6+wB-%>#OGL&bW*~%H_()@s(A7A|w2qHZzJLyLww$N%MfPy&D&!6GIW8Y-!wd=^ zjd!P)1T-MJ0jVcOD>(D5e!BgRNcxxlyS+1d)Y#2>R)5hn&LSx4p#bx&?2B+3|21Vh z0=T-^BWN`n9cIQhG7bC%d;?hRs?rY4+hUH@WqZDYBz>)W7BbUt(241?jhF3v<=LiJ z)~{KWa1+bKBAR!sw zRpPj0p3_3SlU55hvWKEQHIZDXN`d>48qHSCezIEMLTV+i7-i|-slTC<34n@2$44Bd z>Tou2KJ|yZk{^OER#+T8@O+hwpNK!u#E}h%k-8C3Yr6D^;~snfdI0HJ z@`*vB`Ev+S&elUulg+TcSSsmug|OS?L(4YYNJZ+J;yZgZ@>}9$w6j_Vz=N@%^8+_Bw`F6Amdt^S z1;j39S>jeQjd4deAm1^wLk8%TcY;s>S9!KmT@aaPBy2?M2~|LCbh*&Qq{e3Q0rhX} zAy<-o%>tM&vlKJ)Y%hqj8JSS|qBq<0#1n@mzfOR=U^CUBk44 zOr?9#%kYrmYc4H(w(z-i8lowvtNRaa5^Aluk8TMJ$PQsjUyoEJ-oeu@ei(j`Z!JkB z^4I}I9r%YTw_m~|S}A*$Z*2(28*-aXA3%{CZmqViXTLc(-4Aw^D_j17)j-3u>ayWz z>!clQE&OTpeC7sqs$eyjqc?lMavh9knFZ`6%Xst!TWn)o1e@fzU^&8ea`n}XV;;E$ zc|5ZlevwHt^RTQW4MPxnqB-#lbZy>eHIwd3ps9E=cHk&b3rKItUJeD{0(4 z4*+N@T;Ehf8xV(P3#~&R%G%IYJTs$^Mu{7VSLhHmCt60Ypf>~*lmn{EeWnn&C2@n| zkRA|2dBx|3jS6C2O&zI)cn9@sYBSL~52P-V%`$pWU#Z54Wpq#Kr`Q>crr-LWkZO^c zC;pD(dK@N~6HVNIlDmin_G#oPvY)X5`HbACs-c=vV{?C;maLpm$3@ zQP-JKV)6~4A*MUAnO=ppA)e6JT~EkH^k-WgvOm*C|AdTX1}kgCy*D%G3b~0%OS>w% z!wd;tsyE}1+C<}$OL&SO5r$Hm@L&8>(_EFj>(#m?`f0OIk?vgL$BW5daz=!w`l99N{-xzk_>wPJJ4ZrKnH*X`Fd5&w( z5YvSkMOOk6MrDs9_VB7y@eaq$jW?6i+5M7y5@(*XPq1ADGw}1+ul(-f9PrFg9Y=c{ z2%I2JIk8p6 zZNVeh^Fq${5^taX(3p--4oTEY#nq~0J@JkHCYf6NlQ%y3s`#l&<3f_k^NVswpYeu)`tY$?cU)m97C2=!h852*bq<=H@=*Jw#N4vWdN4e|J z6gZhv!!n?feS^T3(JX`(>2S6cwp#Il*^2Ma>BOjr8)>;rck)Yuj{cVplWwKgh+T*Q zTqNqlo$OO=Hq?Uk;Po61wmZJl-0A<5U|KN=Mz&M5W}1@+vt{%d%A9(hE~7ig|DaX$ zL8+V`$EfH#teU)m4PrY`qrfA~Nvgm;j(b#5<@5j79Q<+QTfP%*+~YJaUbZbNyWTOlPj0tsQ-m{baaDyV-x#Fg=3ZD4R{a zXMLHssC}$DWja75% zP-+wZG*3>s`0UKK)Ew??@*AorH#N>o)nZpl+KEZnrub^QAh-q!rxOBafZB9x|3~wB z>Zrewu7Yy=x+zuEc<+#01y$QKC1VhIU6`EQncT%sh&@j(;YLU8C;jYrES4TpcpQ8~ zy(~cO*Qs^+<4tp^oZw^aJgRx1Tmg_5{IhZda-sKgx{P#td`U_&Tj(4+hm>$zqCj#I zo6E!&^jCkvK8J4V^4+h3MaIDnE)Z`%Y0mJsx0$q8z5fC|6>iT~*OTo1!a`_UT35ad zElg<7%_X$bacm_WMUM`hG;~E@i=F-q@MFMYnP*?*pJlsZVtqY;cG}L~dM>?aa)0kW znLUYrgN#ev&V9wU#NXnYlf9)Q*l@ap3JVIB5y;Je!PeUK-k)UuWZUMO23$98^^SDy z)o47!-5cc7g>i6I)_y(`-I|)jDe<%Mm27~#E*&B=J#G-s0tpT&yw5KIE;;}8&2eQ~ ztG%`0w^lZkStk6*s;0jSacLcB649E$2xVH<|Jo~P215Zq!%&#JrCT-_<@?BhG zRz*({SBPVH*W3Jlu+k0(_ab>_Ngy4~&^__}z#>)qy&|zvmhDj!-LiWNBgn>SEBF@V zx1^cuH|lxp7Ul_kRgy#BVfH$ohGvWRY)jxJUS*o(pGTx=ANXby@02GzKS?eR7LHOK zv(orQ)VkCk97RVY?q|h$!`SJJnlVOwq}9w@V1E#$Dy><8q2kSSs_zjk(R}bOqWy}8 zo?QA^?rPC%QzvsF--el-nk%OJiNsl=*XCf1SQBJEMU{!9t8R{}z&UP=CD!ldh8w2% zBDo>zU*3jXd-)IHEc-L(5?{qW%(%f7uqRWtvoyOoVHZQN3t|l7gq1UD1~r$BvdFS|Usv3D3`Z~+H^Jlzy*&Vnwo`vZ%*tx>3+k+B+iMue+*tVLN+4-lb5D zvsc!^z+3Q8TDtEYj3w3a*28ATT7+(7T}ewWn%?QSInQKFu{ z`%0y%pet}PFDldpY>^c&-a2wpYkX6XV~M*xYJ6gB6kkj(m$YXu(>0FfbEjGsTl$m^ zw>b@DakwKw6DSxHKf?7Z_joYE{W0^AUk|@aUEwXo8Ya4gv&6vI{(N(4vZO1k zWG2~1ly$Q|GRKv415o{zqQS1_>T?C7!BvW0Aqg}ocVxf{KhD(ns?fsJ>7M6!T;gzH zBH1>!0ar+!m-J@7F_2AK+R!!7vDdtX{1Ee;>q@6e28i^B%~n-O6G$8oD;fX?bhQf-k-4frLvD1bY;9l- zwj%q1?-jl&W4d=Hu{$MGSVx{r2=M)=t1*k%#q@)yS4@BAp(Vd~7+P)EB&HU4ZQJ}1 z9-~YO{!KK=JL~^O9L#R-ixO3oUe88qO!7gYEA=^{1Gk9Y9y6Zp#u%ak^k%lTStwGF zO+;kyJd)Ck4qYQZDTrVzN|{&NpGuv{%Jgob$EV%#^rn|3kKz|FZR6K*-NgFIZIQI| zENT=T!A>?67yiXe(Ot-Y&FIt#q0vl{d}YAN{FOVxcYwK&Ip5ohd7U;yC}$fdmGd3h zLGeS`DmFUWEgC?wBcD)@Sfz1EVLRTgy_uiNr>W9{%lN6Xt^Nmmn;eO6822ROfTx(- zCOQt9aZKV9u7s1sh1j87SafarANF+Qa;lK!3`+}WZ;|G8=(M+w5({?s?9F@VS9l__ zS??y{d`1ILTOl!J7hlL}XJ^dWWwPr!BUF#hy%txUiuD_K4as#@VejXRlBe4loB(Y=j zP0cEG_^Lj-_qw`^b{HcJpGv-&7n+y*-PRwrTxzXD@A%>tiDRz$rWbAx)LwB3iA3h6 zBX}e1acl;8gB-T;vPx@GuAHs;VZkeE>lfJ87u!su9P52uEZ3adNYsvi%fMRB0Z@^t zGx!uSDJH;wW6|k@up<0ttc2)vbb1^yIx+p)k7FiwP{!5ob6?SaE;*nW zE6$u>R|n~Y&<@>ZTBKYU|Dm<$Cd*^m;MivWM(g!%S8F;=mI;leC#JPT=g=)OM{-9w|KkQrrKT# zceFZZ7rs1qzgxm3rBowg=OX$6&d{5d_s#BA%9l^eTUq>9QKfQp;Z5%qO=&@0N}~TS zG|*jWo)}25Hn9;tSd#^8_bko113u%ArZhpCvd^P6_#md~vf)`5%6;>*@>1q^FF31s zQudeU56!HSNMfVDvhXh0!SpQOZQgDh6l|^T3&?ycvyXr!p0UZ};cD)f^c!}Y$ypMa zwR)*xZh2mhMTY#5ipp{WzexRao&k^2ryx^iuqb3Rq9e?PqdqTi1Qv@-}Rc)o5-`#&X4jZNL zKd$@o#aI`(e%fk6hW?CsN^K#2t?gs@M?Ga(6VqW`A7zY7W=nKC=_3yV*yhZ~7MVxE$B$QxBTn!g?U#FYJL z=ZMl8<2KjE;1Ej}cV}_dhK2HxeU7*AD@P-j3YF?!yB}i<^By7~{yKFJ_Jiyi^Nhr) z$tz&h4>*0{N$o0RaEaQGh1T=$HN8SFGD%hfTLv$3G{=?pFy}I&k8Y4Vg1D5I1Aiuw zR2No4wG>zALzP#G*mLsmf-jm}@=MVg{S0cTSPAWOwN zxRt6AlhIDPNy;0n8{Ig@OH|XfmL69`2#x2DR!jM^f|t5%zNZH@4&weM6U-mD9Pp`a zGyBo99 zawu9kH~9Bt#<~e_ox}h#osX9e$KEkpS5C8!$$eI_#K9^grP07;^{GIWYmB}vI}Kc9 zvLYPR+q%O360UaqtGkP$V4b`xcm^Dv8YIVHV`6B!137cK%UWBVTK>gWuIo^I!ZFV9 z&L06>H7{Ulxe!|nY;+HIys-U*{&N-Ux*(UJetFZeOfv);L!O4`ojTOGzJ)0(EjnxU%7pb%5J|*40$P9?Y6M z1l@w)OIeIxAj4zK5Do@AEB3RDB7Hecch}Bwj#otJIuR+Q(+v!`C`84{Dxsk;Mgin5*xQhXKVZg}wN`g5iwJ48+e(Z=Lql>=DM6Ud7wmRVw9X9uYdvn?7OboD zIs5nr$eVyA-pLtTpr1l~;$$?QQ%ZZ_A%-qVQr#=B3Y^vg^CP&Bp>f$$yt|1k;as0B zZ;A$37TIO_N3;lVDX5XP1!wp^reA?Jd6(@O9FQf$3sIf0%78f!Foe{e`{8=@4>PC==9m?@?w4Us~{HDI*b zQToye=!S)2T-y!5`8@Eac{#onin7JKcEgp9x8~<)eb)l@CXuc_E{7*-BllDKlLD@Z zX+t+BpD!F}Pc)iKavdkl^8)`mXIRg39bJ3vPq1S5IA>kwK4=fv#@r5>0S!{uL9Zf{ zvw!0NmYsZ^Y(b>QG@w>fkqeyG61$@4n0<=lvtR3Y|dQwqmeuR?RY-|g$*G#Uo%NH#Lj zH3n5Wwt`*JvQ2U=WK#9R+%yv@zXIEtp_z+O71J~+9G^ztjc!Ob zq1P4{8Mb;m2WFeDi6yy6OO5au?__Tvh~EOxls{_?b2Z?{>iU7-xy7=t&`0)n##?b( zFDG#^c9z*J^%Lbxt-?Eoun^>1Z~8N+WKLL=fp~O_4fKz7K6J3YKgfj)^JgrC(PpTGox%i+a(6EcFYDk#JkP(02fHbPH-s z<>G!mqkaSS^^MN`4Gr`J)5jr$`1=WQSSxOnWG{Z7DGIstx_Q?GmodL=KY7r+wPXWy z-@3o3)G^zBq<}Tz!0C`d^~!ZVke=JlebqNCO%31l)Q#VU9^r0F40tJXcHU(;Pb7}z zAx)HneSac5H7I=qwd<>pLM+^L2WW=Zw$(Lm!S4d2mA{G8U|P1CJPLc05$XiCH2OGw zi99-Yirb`KnExC~(8YKj!sCpss36kMycu?(oos22_E;OoSHnZRwQHp^ndk~hvhIlP zx9`dQDG8n*y_MEcy-L@(Rv5>I9N^z(xe#z)wazEgpbz%#kQ!+LT(u8Ihq^u(x?-_V zJH=nP3mKP{LoCBoN!Q6sgfn^xU5`Rb!hqkl6M>Je*$yM$AIx{QC)&Huy0*Ea;3n=g z+bARo`kQf0p7ZG?0Ip@un_wf z+zD?2$3m@T=G-KX*`U=5-$=2^)0$5d5^Z` zkGJ)pK6oUXqxn6Rcj91-mP8^GaYS`zw4-v1J z9k5|-*sz36xR04D?L)j_I{9B%)&;~ay-n?x%)1 z(fQf`UQd7_U%65Nb@k59sSj@#?xmhXCA=%%h8^b`Nb(4=^5jsb3>1GRxmu+USW10@yBKNhx5GV)P~4c!54QMgSaY57=D+zUep<9 zWM%%z_%-Ejb`vp7^A5X06c`$VlZlV!q1IGVYm3sAlMeugJVfcilFUWa7x++8GF^<_ zi=NDkrJ59!qnp)ty?3#3I)Slc2aFTZt$2d@ifb(X*ygm@30$mN-y}P@4$0n-yCG9% zH%gB7Olm;4!4E|bq)$_d{GLc1V|x#U>@v@w!%?dhMvAfi_HyTV>^`v1JP$8-J=FFl zlA)HeG_n;kC1VwN0fQ6wQVWQR==QXh+7Vn1xomTU&Tz8*EBP-n3fKf|&?c^IARN8# zZf4qy?Syt|^6-2_m$!$|V;wR^lC$tLiEgStX^yT>H>T?c`nX%T)Z8AZ8MusC0ylR5 z3(bOS;7*QkM4SUMUPSMrf_fQt0o$F|8$XFZNk2*)Cc{Mk*Wc7gu`{@Zj`fwgt{`@H z3itsXhmVDtW3|Aqa0l#=?HAGo=M5rJgqWe)j`bma=F0GJa%1{1Vj`89aD<#e{gy5k zT^@_Q?VN{5C4JoWOQb{`caJB3x|TpGl*GCpHd6ET%MqNqr`(MO=)O5YY$>fww#&Eq53+Q6MIc4r;tT^)y9cP#77Ql~Lo8kge!%oRQ zf&IZYNPUJ+V9v&GC8Uf;vYCuwCUIW@iLbRdd0XrS;P$TTo@+pNcXQ8Zvl*HwlxhR8 zoPQ&~k5IfM>npm7Ta-E;JIB6_AAmn($4O#{rwqxO9A`tKbIAEeaI1T{OCMNcKLjrF z&od2hpYZuKO6a}UDZ7lc^~kdtpwoqkDY=-1Zx!dk1@=MIXClb#p`SSL;taF~I8t~4 z%yl&`h_{u3e}>K&!$h`8f?5gX`_JUPhIja4GRGj#JX@11u}(s}*cyB+2Su$XCNppR zc6y~emg_?=Qz?kP^b#%SeoC)21nh6<4dw;L74&}F8Z}E_1&-ylqHDkh>D9~-q*-D^ zMvV`WQp^f5Ro#gEp&8BGp?d1B;kBtqBM080T$T>DAJj_Qdc#HPIuND$hi>8ekW0}q z(312>x&%#6I7~kvYD=BWIBKnDEuk|uq8AX`%@fh9WL+!hx;X}9TGSVaOutBDIzJ$-@tAvJ}4vsGZfsR981^ zXJQ?ALqC%243#KB(uc(7sL7vLYjNffz;7qarrwcrrFpcKp2OWoE1V0-x>$eLf3OqV z;*JA0;^UyjmLYgG{8FbNW};&hM~TxIk$scQ!jGl3Am5P96IxO%6(>!h+tVT=SL6`J z;+1FzWFpi@BybFNxUp2Mxw$3w3VWqh;{twM{*35BEY0pq93-8oEUBhu#aB@c=~mK4 z)Jpm~(;PP9Pq8`3AVLeCN1hYU>|@X}GROD`n?#=1q+<`LNwOMTpjKz)5hLlal&8d9 z+7;i2^w8%eWz-<1Hx-2DF%0q)mN7-He55~9X={c&U{)B;qw|<5bsi=W>DfK8ugtQ{ zHTVW*VM?0lxG9TUPqt2nVru(0K z(0&kF5t?qIU`?=|mPLB_&nt3}2fl(FGg|3QNuP#UJ++d?Hz;xD#2 zyMli$_VpX_yt*y4hwrXy3-sU)7#o?7acWC#T_-NgUSCnn?ss;`-o>)+VX0r(WF#s6 z0y_kENG`HXsR~BV<|Evzh}OIJ+enL zm!S)(16gV)Ve@nx#y< z>$NAYYKC!GRgj;-QwHJNSeW#r<|pW@t5&~=ndpv$x-?o%@GT!KYNQh{UBc@UM z8Zw+2opg`Hn7r7X7W0aiS%baz8M1T9*01dHBZ_uK|ws@Q9=VQM- zpgIhnExwIsi&UKGtQ+`qep_01Vm9A2(NC=A@?v(7joI~49Z3!I8(fYShdS9WqR)f< z%yUGJ%>-RB=J(H1{efNbrRCvxe{W7!OPug%Q}y^`AvNI%5zo(vnM&;D!Xs~zf3SnG zd;U4fhVK7-F7>}al6ST4Z%dZvfw4lr*wf2GsDgsp?#x@lZ*anynS4{XFJ%Y^BUK{e z@-@C+GJ-Ww_t5j+Gupx6CvR8%YKO+-F!eK2!U@YN-4&s?eW3C#&jS1MT5!+6yo^U& zHrz7#0(%oZ8)p!C&7@>B^MxLY{N>RZ|8%_&E}L`g79qk)o0juC?5lNc`JuoC<)7Rd zuzoJb4Th#>IN5DTelo&FU@zk)G5?a|Bx9KX4Z-5|c}^;`2J4va6`xZjNtc;{WLWHT`V-}sOr%fJKiwnP zqwXX}1q(nq z6&g-mO>L(yiyqho%&?fFlpt!hXHyVU4HVOp*v8f&bZfSwu{rge?XTG*@cqTtBvX~bb@LYr7mD=%QW-*w zdKneYe~~Yy>hqO3R`Mx7E5k~j=boiZA`f$D!eDYg*EISDd5|rM+({l~yV<)_1N=p% zn^bMzQ{64{mT#tN1G&{(BHK&)JCoINv2Nqy|oUI-SeJtG|l#VHact4ZVQ#}-$^t0 z6=Xt~Z)=;jX=I<63(Qt( zQ`7;b0~2l^?*%~0Jjk=seL$}e?m#taozNK>Az#bqpz@rJ+&ZjSWaHPt_owV(6~z05 z-OL%PXNsjPekc2%~YTZjLZeVuDS1T#9b z22z>QgSkviO_<5dqC3X)rT5TJqejwWm^IeM!cu&Lu^s=Bh}3HM7~+A_$5oN0yr*1! z@_lw&)=at5jpEzlr{p5h^MS@+rB5=oqfgUw#CXdC>I`$w{DJ?M9%X3GPo*J^iL0dd zDHe0}>5q9$SrgMQE1J2@q@?X)QW+-c3w?>%9G^j_GIyd4)LrI#M`FeZUn_} zsI){pU(X{4iw=%lD^t==9c{c>_)aSV~w_n&u0W~cbzaYsv zOizYh+Z$*m21^{*6x#x$om=x{zJEb~)-msV$eteU$wktVF<}6f6#qB(i%5z7m%T)lmOL#WQ(Ku5o;*i|eTNXyCfLy{g#11d_`K`c&|yoX_4-$mdMK(*m2G z_9y=p_a;?wFNrJhgV|S9_h>)!f>uWLq~A014Ozj#&^OHk|5vdhwc2+cZ7+-RR$?7< zdU;5^O~z3{PlTlgc{$lIsWX>LHHbUJYUn!AqZl*&F7g6RG3WIOfoN=&`mKKeURQC( z*BsxQhj`u)w(MNt2H8EMHGhFToAQdgLV=0%*;{n~IJx-WuSy@%KNuj=Lw96r>r(ta z5>VInS;;5zm)=||HMhzWMeWO)D@>w$r)Tq%Xf7p^lZpxVW^5)iBlaBwFiWKYx`=rd zIY<0eAF56E-C-7~>UmEv=Vk9bd)Zn!)xtWqN9G=W1v@dVm|MlhCl|3hS$TqWyQlWSVDx@We{v(Sbj3n> zy7tS$XR46~TM4agYx?a!qJLpcWoDX=+PA}qbv^LYcGIy0lxlCd)B@<6N08@}#qW{o8eK#5p)`wXW$a{*m!8U5 z%ghbll`m&B+-~($W;%9Ncbe(p+-8cVznKnNPtq4uC4hupl${Trq1DNmNF?1i+KyLK z_ZGHJKj{5bQa^j2cXA*?cEH24GgJ=YC`#!%2z3G0xQU-;+-aT3;mYlfOYHWn`(O_9 zJn0mCpXn-Q1~cjS1yj=N<$owj$Zi_i?As)3A2icvl-B|skipu3?{7zfafDZ6SYx^1 z2~(VL82BAoU0gr8tfXOL$g;ka6Fu77=V{XBmhLLZ&stgh)LT1mM^Q&=vJx#A4^?Z2 zhtllz4Oat@p0NPF3i$y?m}gsNU)MVRbRq~(WS>ZTV>_9aWsA~u<+-8PS(0WTu)FXF7QL*`_qK7Zc`bd3*I%~hEN1#c-8*_c@C9uD3fwlou=4_oSMF+aeQ*!VN z$nWSKlt9>)nzTpdedf2**QjO|HZ_gY;-1YGy#Xc5Y>UjCJKXV~4X}I=t86AslKT~y zlyeN32S=uK#1pZO(fg>5#M8wK)f(;jxhCy9Lu9_+K$UwWgVET=0kPg`*w!$+#G} ziHBQaTve{__C{`*c|33${zLT{T!LK6J_j>cD0v}fAcjSsCF99Mdlkn^Stpbq*@C2`f@4YRZ0+CeYMS=4n zJw2-tRG%K5l!nzJt)~HI*9ug zPR%+w@1n19o~CRY(@j~YWD)XRlUU?(cG4FXB$(@(E`*(>%*u3+iV( zr#gj<72gL|V;cA6)#B`Q47)auh#u~Y1NLj}4SkeC+& zH(e5&*A(u~0BBV&*bmyW2cef>YjQiHFBTV_NfG4G`4xIvyRq<#af_j!Z>jl-X%qd! z*3jAtndj(dhaE4R>A*imJy;5kRCyFa{Am`1!ueF+=73Aoj zSr2;$niTf6l$fOkaM)pQ;!3r@0W|JjhBDW2=)K|&G!faGH5sYK3X|sJlL={b7P*uB zQPxvk2>cG6)Xj9o3I_~dz~!XTOt_yy>DC%}nC-g*M-2KC&fn-N#boz9>{jLlWCGD5 zNrqh^$A~NBQE4T4%3tuCU@y%hWFtRPe;Nhw-(p*Eu)Bq|1NO*z&AuHk)17rD5VPeD zcP-*o<~VpKnVSsEl5dPu=X`37F?eXcssH(>^A-*B7I;fC{E zyc04nVLzCCHX~c4ISYidBl1qWzB6aj-#|wgZNfbip=+d_iB5D;{w&#B|2jPgk4EIg}CYqaj(oH7o6Tz;&=-9~zbN_SYbCu~6AQ`(mArbw9IWO6P@1akNcKF>`QjQWAZZy;Grmdu zdNE&IA<4z{%mn{a*|@SqZkSS00^)}>-lAphZhBk6UfVuXMCguTptV=vtMa7%r@vE9 zH|GQIz|?u}L&Ajku86=TNLu5)7_#h({c+Zbd=?m$m*dHG(#q!KC)XuS2s-cXW9VX+ zL5s~rhHl6pdn<((z2Wp`wZIoat&$X^4dun@K?&KQG|{?7zB|;wK3#QCXymx5y+a&w znhmGj`&_@w2W+5wjcuJi2hIbQ%U_~Hz`0@qv=LmM)RlOT@zNjEUD8&((_E}w90*yh zh7Q~odyHujUIKKs)&_SuAKDGpd0;hgTDKA^2S>@%5CK|}*&9R9&WX1P1V^PGDVY4H zsFkt8?DjV?S6gLlg7v075zDk+2S&P90q0!pEgM~D!1vk*?z7MZF_nA^*_5#jeTS7L zE+ra^*@w4OXKF-&R(~59D>7k+Im_u^76Pn~4zsOt%bZIcN1?suGtMVSn6|IGKB|!o zgvVlAGonQ|O|3*7zLcCTeNG;xJfUix47x0QGu(r>QoK0}DT6Ott56f5wLipWnsz(8 z;cYd4f+_gpJOi|dSf9QZc}Ch2YVd*7Fljj{<{yKDw5^E*-mc$ARFVx$TH-TgwVWd* zj_&qeMme%(ir$1Ga&vOHkp1c*-kj<&ECgq znfDQ+*Y)&@X-UH!Pl@ZMSta~y-EX}q4A%n=2~Q| zr`Cc;aU0^UpgtCs)WP>Mar_!pY4Iacp-m~832O~u1*?H6rjq=+<_v4ypjtcIj`|PF zb--(1|EyV{*@LFcfu8c`;$qS1T;Hf_9AF9y?zr}5)IpfZo8odxC3oAKQs46>e()77NB{+iM*rOF>qf-8)6iEBylvk7274P6gkoxgIDdV zwBEmUUlv;6~a@%p_b2%7w*M&nJESC0vuPrLl%PL@+M;4p^fRQ@D=FDgpcGz zyi!_5U8b4^B-XR$_S_MBk+mTa1d{Bvq0Y`vj#u{AV)y)(5r>9>N7a+zv(VPu4Jd#t zPoIK!!pakN5+?~(>Zd?T<=br;;6T_MTSwqM9xGD6{Ow5=Hed{NJ37gN=d2*wcXp-wAX!%zHhk-9YCMkUc!I7svQ@RE!IoU zHRx*nT9CpPD7Qd~xHrd!3@5B_5tE-isR$-1-xL z;MCe{h#X5f@PfFhD{=ipCMx#3w~;5a*T74u38_0#AGJDu9TxRG{Cns_?afe zC({k4Aw0m^o2d^BwU1@$nqgo(Q%76u8cF|@-*fk(zh%9HyU_oo4nSMdui|@(nfJSr zbmAy|h7IUX314xaScxIr|5!kwf&IO$jQ5*T9F=@aP0+cTE0KK#E4fZtgP>JxMGA*h zu|47{u_9)1)K5ae{6YWHM+A;zO^qx3w?LKor|+X}p{=X0zOkcYkhhcCbxq6$+Lffql>(*erp@DtB z|34J~ob#3Bb#PtwPRzjEFNKTAjp5(CHa3WUV1GpE@qNq^-+s6vCz8!Y5@Z|kXtbfK zFIa=_)snWinBDNuuoRzenW3VHKkOTGdy@5BUD95X|3UK;EYugQrF1A$pPcJWa?e+= zOnazMZNd7(9-Y?p2?2}|w)$wcrJw!=mTYgPyp1OSzj7*w6!3EzMP|b_3BxEi_F3AK zE+;<_s+NTS`K?}FNZYs%@Ec-PG7if@EYrF9|B zplR{%$zS*tX*+rh6~klBhNjab>M~f4!Y9Dfwqw9usJUaW?Yu~yoIx<)PK8adqd%fwJ;9Uu={;_^9PJ8polK)X2=ig16@ zmcUD4xBMsa4f&S+2bPJsQ*-fZ{9`;%_9PwBS`eKnQzmQ@i@$oUt>whUlZ72Mr+(%4Wl>$gIpA=wR|gN;I~f^2Dtt2GH##F=QFN zlw4%_MgijQ$SrEIbBALmb;>%~DWg6b8oR#H-Bc^w0eW_x0~T2&nT?PYVn*y3Hk_`G zn~ZOzZ$!N!`_TUp!z^R?&d@qrFYYqnbTsA)EUkfk+#KB}mz=AmTo3+YcZyGnLe`cM ziwtG^Cl5i7G52DRDqOIbf=%RC~htP;_>oGb@<-907cCdDE% z;~UY_@aYmzB#KO@Tf=v>=THRMWS9vKLn+ff+j?w@wV%;~eX@ttZ}Ba_57{EZ2HG=! zk;9=cDHQn*4a8lcju34n4zZUpk30xXFqI-R;0cz6t}tYrt;)Iy?ci8xC`R8pm#ar( zr@)o6y7&rcO(svU$WC!$P=TF|TS>(ccO({i67_^Ig8S@q;1=%t4siw=`t9^u_QF5G zZucqk11F~FVpdQh~@dhr?^~Aj&-0AM- zIPCrirI{DOO<`77jkHJBD=X06=;hos*bwYn27pf^{z%RxlE}$%JxLuUmkgp@G>dL= zrXgC;>Dqygu`}*4te(jZO~Q_8tKbZrSFA+b#EhIvXg={X{V=wP-1R^9-YcrAtBo2q zi6$D2#&lyev1^PPYhsU;-VSj3;q=~n+kKxy6-5LQPlu6Pz1Di>nltzecnHz^*FXd4G_P*>PxQ27tx*i!F;6p{ zfPHkKmSu3Ul5KUsge2cqhy?QY*iRuDoDq)K$OHNWU05l2cDgwhU#M7TIfaiG=h{BUKjEFRdt&$4e>kkzDVoVyiS4Ew0j^_( zewU#yu^6w(@UNKM8e2J^HLlf^aX;d4AMLFceM%Vd3W%zk}<@!RN|s=cPz=;5-F=Ce`Lg(=o= zB7I4vA3Z|B+-Bbr9vk|~amAe;gp*GCmA;QaE#B&x55;3=!FW`}{mB-FS_KrN1&tQR zX#CO5vR!g1x>fl=v;ZyD&gITP4;m20Y4nZxd`KSlo83EL3Wfs>UMI2B$O1qC7Yoy^ zLGWFP%HTp~%U7rk2v7B~ECbo7IV_AuI`xHN>F7tMScV++vEm_tXsRR9|2g^wjPmNm zq)4>$H|R6jP|NR-O<~Zxpew3=)n<69cD=L@-lQ)P+=OqM#)bWWthOZ52_(xtF_=I< zb~gJTL_sLf>m2$PId6XpM5^@WZ@_OgcAW#v(P7FwXsjWcT&Hd@#R-gWnCM=Zb{{~YvVc%)Y!=_oS8*6AFtJ79d{JYcYB0l;kfQPBZ@V(yaogYi~1 ze+x9p{uO5sRPAV_Plf{kVXz3k2aWWH$r;t^b&}NZSlmfv+epVG+ETOoSPS0A7X2adekuo$Zi)m42(e z+%Zo*#}VtCB+GGn1D}W(&ey;V?rESB>|i0F2+E?~gC@WT1%~<%j$aR)iT>slh;Xst zria!uphL&E9fAg{zO(OwHcGP`(eQAg(&-DkxgP?fVS?ES97C*BI+%()p^St?sLsy- z&q1$w4T7Iw!NyYSaCEbF9;pwkR}l73(SAvq{R;X@;B=H@UxfYagt4EQLjfObb!Z(p z0b>WnfX^_C-zew+7Eaz7Ov2&~9E;MuP5sbnar5PeY9CXS?hK&=KJG6Aso*jf*LN;71uyjUB9$bst*BeXn`gN19wS_> z$#Wf*gebmr0dkGF$u(6K&HoC&plxDr#ne`iQ35L82d}?gy|ZMi#1zMQ}$vNjx&C@ zNf&}sUY=MR(qook9x|r>Lu|dGNp%HVuO1_Vu-~vECNJc?N~nE_JlANI575y%n=~ICZ-@{kqti`Wxa-ix zmIBtdsIRSsnu1Cl*C~t8Nbp;~0<-~MM z3tVPfpy~v3>>jdP(5DWX=psaSviM&@=>UT>61oS{7<1v}5G8ahycMPdO@SXE0ls&T z5Y&t84Ax;wwH1IjFhN-ev;!xkH^8N!OZX5>foAX)fe)c>wkH$-E9fq$1Q`|*2aiTd z1DjzB8swWy>S*qGCL@6usKJ~7JfMgJK0?+=E&~xrif|C{5V^{wfx+l6ljHntK?f4y<-<444kBbB*>fK&SA{9#6=uf$#L&qXc}J zIxezB#F6ih{7D)h?ugJS0{Ab&_p1Flec@wuO2!qp-MA$*$#vUuDv0NjJAU@Pk3R-& zo;7$h(yYsjxFh~nRTd$XcE|^X_bIgEk>P&o@%#{XtG1gH+~Z4~KuNoGx47u28!~4EIv)Ro+flw_zpwpo?WH zVGPEfSjUG9;G6B`f!FbcfS+#*b`!ebc>>EPQ&(!;(^Wdfb=OHvl$7mq>$VHGxn>y3 zc_Z*1QxkhB?zEhsZ@}l+?uNu+H=N@FOUN9a5Z`=E1LK}ouvKJ#vjM-P8>1M6XX~#? zqH&qAL~tITXx4MZ*ahosRtc7Edrbct(>ZEFe#h1VXrLJz2l@MMA-@#kJRhJ}(0)}B zR%P5RBe0F;72+gJWvS=CCKXw~gl)q!p99+iZX+1&yGDp39JIEJtpFuRvV!3-~2;L$C`ONp{;qkWuh8_C(Tq zmPT(!Mj~CI8%h7PMU>gd_h_O2ePlBBy^jo8gu$NV?MCdZj0Vp|4~wqC0oW*hC9K5! z!#J=3v$6hw%~%@kCG5nSL(afB)*G}DPQmW@3*epD8=t{&FFwTMDEu1#RJs_7ch3=C zg6iDg@VcOLE`k#Y-E^I0g3tq34b2;R?Q(^zfQPy$K||o5T_gQ&!!*3Zy9|!R9Uggb zJw9KF#iD|0*|ZHdF)kh+W0QIEQ==uySz*j5rsi|zfk;37w=`OWm+9x=m~fgkEZ~sa z;>h;7M!IU8@mz?XL0&0pHhd!)EEUB}ktK7Llb!>%>VOniuQSKzr0Z)4_w>aDsE7PQbelX_k{LCi%oFBBjZ@#_(Ic1ZJUGiE z1cnqwZ}>*@VCp7!r&UXN;v(!sfWoyJ*zU6rkB6st^07zgCi$o+yDDFNKC(_zFSrr$ zM%T(MjhJgV$<7W}nl3X!+?5uBI??^1eJmx%MRigFmf%(3CZ7iUTX?sp8H+}b%YKVo zseK~;Dq^F4uV8lgHDe@qNcbExjs2M$vi?Xv?mBOK5W3T~-qB2;1 zjKg>c2vbjBmmyj3Ys?0F2foBcAdCFJM03#z-gn5I>RXQ+$bGC!6zuW=PVr^<0Jt%1 zC%y?<#X5*jgl;gtz;?nB)R~w+GAUS!-a#4zL39I3^D9T^q7S??k&77MQH^ZFUXh7Z zTj94nA-)8$a+$NUxqW%6zgvo=v*zY$DxU z_aJl}^m>WR!bKijWEk$dXhmYZWH{qM>}lETuwm{DMVw$Hn5P~jnPC=bs}*C^ zJ_fhuD^Z_0OaGW1W4mj<67n@5w%7PPgr9;5+eh)gVOJ!K67Jyrw1F*|EG%~U%dScY z03y38T$4;wq%Ki``g;8*qUEMnra<<0Hnz1e_>%L65lw ztab$@u95q>N*Bcxur$eNu6U2G!ZBMu({O|g^~f|`RP^h9usjz0X)LyX#9C?fbp8;G zIR}Abedj@q@TjdgL#cbdX$WVC!4`3nx5M-S;w$nrJMAAzpITn(waN^eS}|1XVZSV3 z8$WUeF?%hYz@A{5BN>|LyB6ZXKtejrX_d#WW$|o&;lFWL*%v~+!XF)Dto4!?4nh~C zINKb0~PM^`UMmT z7DAv!CHWaTp`D``3r~^#sQCys^A79p!MhlR<`XbMk=dJ(l|CrA1pzmI7;=!zOS#P$ zifi$oILq*#fzS9%?1p)XSb^ngCd;iDU%FIn$Hw!%)RTVKjIYcx)D<*fr=v@Kz5wSV z&o_Anzlnk(gXwD{Yta%m8gbXr#H)(r{|KAzT>u85!8;}|7(Hr!3CeJ%&yy1|@6m>{R$Tmkh#az{n zh?!w(U8VaVE!ouKk_C3!cHtwvSwI5X9&39(-)N3Y(yC!gj4aU!Uj|PIV@3sX?qo`n9hFs2sqn0Q= z!!l4e5@~Cu~?S^KZB1IpfyQ{t`ziTYf|1OwsNiw;ZN%mChWy(FE z)j7o{AHEC85_St#2$N#PqDvBXI9-a#=Rz+PYn3;wXVsr-@^uF7Lp@c#$Z*Z{89> z$kM_5)jrZ5OM1h40ZV*#lJlZ}%V2Js;)|F=g1xE*uB+lU4G*l49n@i#7Uc;;u@==l zFm=hahS8QA{1Ijk`zMTUo7?#-WuvnfT<5bFo(%hMUcpHsZ#6CC_35AD4$)7>7{DNv znZGj^D~c?Inyu<*wqKw1_OI3BBvf&>2nx50M~9ZvJP0V$XITG z6-J*44%$%XSCTb$*kqJfI#6|_dXm#2*{9nGn7DgP!$1lBvegCADIYio!E1e@AQ3Vv zc0Y45U<`l3c?FzAO#B+~cYBqX0+t%*%PvCGR9cl5N)?~cK7l_A`_qWQHoBK}ID9b( zb! zu5@LK#%l&#gE`TL6g-SJ*0Kz%58Pny!M^tn1ec?DWD~6}b_C|dDu{UmOyR~xpEvIl za-v$brP48x1@d6UsfcLdbd5V)!!9wbAU)xO%=cVl0-oB#Nv9nGc!2gtjHB`6*C5AP zfpG!*|jl+Nq}B6sKk1S@fDJUaPI&5Y32o zDlAUQ5@@u8N@kh0LMt|ZD%;3$MZHmM6dsAdyKGG15^>5v&E3iO(yQ@+?qsxOrHO&o2p zrc`Y;EZ6fTyG^G}u_+%QQSxz` z$@U}4Bf20XLxUJxs#N`IQ>kRQX^7=4cZ#LYK8((_H#^q`HJ#cGPr=BIgib0;1Zh4 z)&O}0jddP|Lw&|V-AGtucNpYcfvNcCo$UZy{43yX87Wf%7j=V`$)H2tsA-2r3Dfmg zp={3Y<}cv+)Tg$kWM)&AlY#hpmq85VM8qVH45>lx@J=AD&W}V3kb|ZZ(hbNt%?-s# zWAH=#2fCwp80(m60(K|#q*a1B1DYILun}HQz-?$2{+jhB zW+M2Q8y>yb_M7m7s9?i-i84~I+9q#}z$KOHAHtJ)Z*&TG74x~V)72XKrS&`fP{1z^ zFYJO>0qB9gz%;C_aT9@P?u3nvneH~y85q4-uWDfl6_CU&VNnLZ_4tNWDo41TD$ar^A^jU$Emh6Yoi6jps; zft0Jo4x2*zd036ZX}CoH4oI_f2eF{@jvVht=y+&jOtxxq*az+*>KA-(s76~W%CY^R z-zvSJ?=;$#KPeZP-5R#2*ScMw8#dqGV|qfX1%}zEK~o@(v(Wo7=_v9h`WyKJ;XyoI zNl2nWvu2o_Y8|SZqxw{L!4RTpSC~y(^bXMq%PG_EoJRXJ>jyNN(`i2!_!ztfE>zg>gO7i@={}}DP6eT@{#2fXQ|C@|C0K~ z@xaLp+zXn(MDHi?9k?s}sraaN4st{$*IjqKRJ<}|nflcmO;qhr-5ASo*jLl#>KywGXj$M2U@I)~u7+nIv3Q@L+VK^5L%h?`Vp}dN zb;=EVWi;@ks#`+^PD`Hae*|OsRO2~lHA`j5hMt7x+r@BBz#(89Lh<&2YLT~?FFzCZ z0_>t{7_dB+*1;9}1&T8Gy0T84fczl&SZ6|ld6CAoNHnw4G9GCQoo>5_yb2II%g|rF z?vainBBY1c;R;mtauH zR$C0V(*KDw5dG6@J9rn}4SVrsMJ={x3d!w&X}!c6aYWN1MG3FSC+rZoe0fJ-Ef|J2IPw7SV0^hVdCnrk1ex zI7Oy#UX*#F`MhWunF_Q}`dW6+wp&>#7;vz(Ms@@6nUU<$f}PfH0;A#Wj{DvPs0BI` z?x(#FwgLG`&*krRtTOb8hngmuY_dg~^_DM`D%nEoAx*Y`Vc)F3!CvF!ndeg(;9T40 zzz}$x^M-dOIvif*I;n0GzJ`uyqa-!kGNi|)qH@(#KNy9By^jrBow!x84pI)(ZHkmdL&Z~~MAobuj| zN6mLl3H;^OSC*43fn&IRd}uN7jZ+)&5SkA*c_$$r$RPBR{IaGLn5~+kGg-PdJi`k8 z6kW3EL*-sWm$_3i$@JD5#jCW=u=_Hf+PTgVp={@7vX9dN?uX*N}8*S}YH0jUUzY(u6{p{d#A6hidA|~6`0^AF^?HmUE8lVFyu-Q8Z z#*qg2Bgtjk6T3+sWp6e8s+#PG)pTgGoI-iJegv>owAN?e26~s@_|;M=NuU#Rs_$?l}-=u)yd@7!-JJx zsyO$4iAp=!y^gQY?{u}Xx0@EaR?`wKU3d$n)*gs2@oR9_U=?0N!JDL`^Ah2$n1`nC zB-POmwSUN!Q7;s~tGi7#BZu)K^_~%9SSO4<;d80iEL!(U$`AHWT>gGOPAyLJ z>;cm;Ip%3DU=9X!mTXRj<*GG>@1vhYCc52F=GmKM8^wIoGnw?BldC()x722 zcA5=~nRMWq84Y;|1>4RBNZ|{>T<;mE65asE>ytz)9G@7!lsqzZnWE)oT7S#uDvsh? zYrJ-(sL(!1zmKbO)R-a|kAOd{^pFg&-LW{}cUS~|pWsI@R z_`Uj=hHdK6eJS^~I1Qnq4{dWysbM$l{g!Lw3Tl)6_mCiPk#kGH2V_L+M1y4(|u>i)HmxNs7=Nc<6c>mS!GTX@~x|^vM`zbGy77;G{)Q`C2+z2 zDijITdw-7vBJob6N^6{A@z#W!V)QCqy!oMuV~DecO5;q3txgba(K^O(s%*hdJ3Yzq z2XHDl4VVVa@lS+C!JEDM;mgPa$Ir@dtk=z-sF}9Yx;ff-dzW&NzSPky!HhM|Dt@ZD z0mx-vvzCEdX^-tCvb zvEnGhGboL>+dK-Mz@BFP2F|3h?30n{l%38gNQK`Sa6CHSYXS5YEhhu;enrXq6UumW zvHGm~8tN(kLN^sD3Hg%Bej`W6hn=4Uh)pxsAgyUv*D2|z;i0Cn!TXV6);|A8bds~c%Z;su5oe}#HTS$lXZua?QXg%fAsMey zI;P6!OJkissk{U>V2)P9*#fRIq|r?f!+epDAkr%WJpuPQWM+XV(Hv^o zEcMcDur?_^P{!Hrs7fTK9N%hb{3}jh!${6J05%<q zk>BkTjhS)}(;V{$$}QS(3qyUG)FV~vrc1uH4>73u>m6)UJv+l$YWuMOx3WP`O|PpI!1M;jxxCp8<)pXi(Ar!3*d9b&%qmD#~7v+J!)_B2Po zeKCyz&`8B#3Ai74W9mLy%Q0nuMDtT26`RvE9FQQ1*5W_cyDTEDPq zxmRsj_G>J_G0jP*9(UFO2PnSaDrlKs8JXEs@5Mqq(0OK_cD?1Eu0%iH_K9khVZi>A zbeAd1F;D2Qcsf^d2V3s~e#|Dj8)Q()j2lQ6bOG1}oBcweAjIu896pY2G7Zrzb_%sd z-Be(ta)x0DP$$`CJO*+EapqWPP}oB2Iw*%Z%ytj<2rYG_!4HG1z-nZ>-$&pjbd6^l ztU#|Cn$#S)T(eqBhaV_D*RMl<6*n4xLNxpw(=DW!Beawww;2?h7@ZdSwPOmZ4kVnt zXpL_Hh>$1V82lM|(@mwS$1kZr(lp|&vWvP>JX4fu*oXtXY!eG-umQ_-d;vY&dJP{P zBCywDcLPOE06XBj6r6>ndwN4nm|jPIF(aNTFKT9!qN3Bfsp0*?GQ)^)8n@lp=RU!z zHCMU=X{W4a*WutU(rer^;G**vyv^qVa1CGR`8{O9imeLZCVQHp6r^zDG)q8o?I@3e zW=YiIZ=f`JKQ9cPrRK883=7==?Gr>}+C&kf-`UptMWg3{k3DZ(r2=O?ACZnC zznGWU*NH#SRXe_u7N|^)8;U^bOXn`tb72#(QM;YH3KScHm=B=e&BLioc(k=Y=n{O> zvB%E`=>>B=-;fUHnCS~^vYe~Uvn44Dl$d>!`o44;c?)N;aF~;frU)wqtfpg32Ph|3 zFM}X~Jt`<0W;maaC#3>N;xzoar|I!<42D%am3F9tp`BJxevU(BP$ zN}I@%#>egPwy7Mxqs?BykT`ESe+&JE+~@8I`W*6xJbim%5WYZm26IrIF3#w*j8gGU z{nqs|tL1l_LnO0C+Vgo^ZTlTP>`ji5&gb+>rzbcrB#lg{@eC{mJ7K+V1Uwi?_e?<+ zpq*NOgTk>)xx#qeIYMeMQ=Mmoc1t6W$=zl992B#9>{4hZeYm3vx*swY7!2A=zV`ePHeoE)8Qo=Uw(NnyjI9&aOE$5|~ z2HZbzCR?bk;|$2!<-({R+Go4wQCN<0{G9)3U=|+kGZ);7&+s5K3$Py2&29r3fN>8g z;*}~sLG}sni_arBq-*%M(T^1=oHBHU=3_=83hBYnW#}RE7eOCl6Kzeto3V|6!jpl2 zi2R`c5jw($)t|xNiFEQmV4gHgJRL4qgz`P$w`w2GRD`BuFlHjvMqS7NI>wS4xDR#P z2Yel53dTH71-1z>>BfR{#BSA(V5aORnG71Os1vE7C^dsu2oc)n>|EGp$ftM0_s#5( zG(=;Y6BviwcYf|GLL`hJ^UQd+aTNOoR*k>KllTg7Q71(N^>;%?FNgYE-e*aZ+oO)Hx&c3c({_ zrBTQg0*}n0tVFQL>QB23aqMe?U&CXaYXYaiXTa6IE09b$&~qD^7r;_ou^rXx1BeCc!MV=+YK3)2?wZQR%u)~(;9Kl;@&vrgz-*;>U&M?%@7_gN(8n8jx zlo(J6#|2DbP79OR zf>9}J4S6b_Lwn>9pl3rmodWE$AU$9rcbdyV9MgH9gkrH|k7U@5?UF7x1-K>)Z<)hg zU-FJy%E(j1&DJjbA=70$hWF7t?U(V^khzXqczWP{;8Wb{cMzP3`+0{$tMPFjMtC)L zPj$t$D6B)i*foTIS9}ydB_1W1is#8Z!YXi^5@J5YshZ<7ay4(57c9c(m}>$y;j``D zK8g4W;Jn8voQepPudx(?T_(k1#7yy57$jTB2QiEC2l7s_UQI9!m`?YWdK)vCJ`5g% zLDrc8Tx_#L>=TLAf=M3tuuDjt@*6U%dzv%>ohfS(g`j^Z{dp%)mih)K3N`B-jF)JF zaRN0Otuh~=97j*tQUd0oZ=6;iC$<3c_8fwl$oV%BPL>~#)WJQfal#GAhZ-4g60$^B z%f6534X+qBq|EG3oq!BjGbj=0Ovh&dAEPP&^U|9Rv(i1qm>Of?uam=IjG`w&TnrV83G;EejGj;gBTgGH@h_0}G&8 zqzlIdIKulW!bSQ$P9hhu8IrF_ALgloCr*QX4Q~`M*g;R=9 z!=PYD9C#nVF_aMZh#-74v$O(z|`Uo>`$DD{AZ4IK**iyTn+xrp6t9s?oWe( zI4Fr40{#kn1>3-V@UuW0BtVM&5~1fP*V_cgW1o7MkZD+}HV zhO&NldLUL(kMsoT3nf$G(LX4?;39N;zyNp|ed;%se4ahMe}tD{TRnW?^VkK!8Jj=G z`$;-rrNQSR0-~PDzT>_uYqszVHAI$9v>561daGu-zsP>{;k(3=q^6m z<7ap~K3tj-IfOS}6dR!z&g3_TUzN-Z+ZxW1d$6{<`&40cs++4#4gJ}5&2TxWz=c|Z zNXLU;?8m)}@XMg52N%yqawLbsEy8Hwq3|J+ApWQBWchH;bN52!Mb>E7X-zrpqRXM* z5whR)lPNApgdek(`j5glI?j3L<8<)32Z+x?o=QG-eqzEo@U$@qQOO$--0ILzt}(UyMw)Sp7GAcPC;oN$yf`zO6-FdD3%KNxK@R7 zEAhpeCiWhDnEqo1fn6|qP+wrX%qbzmu}tf&z<$i-VEA=oa^R?UCdP)Bc~q17s7Mix ztx?DE^RXG)&DcGmSIM(nWLyUdf6HmT!LP+Zw}mnUUTM?%BZX0F7GsS z0PgWPfWAQY3%8+zbZ2>8=nz9{*gW)8Qy@!>j^vB_I+J6Lak{pcr*!{97bMN@%s=-$w|;63asN)NOMV+KY-dMw%hbEpez z_bG;_VpqN9!yE7+>uhhTfSoDAFEccS-Wn%ho_gfkFTG9KwuChI3$!xqcfN+HYbeB;|qi$ z@~W;(u28Df8m&%mFq+I3tIh6k0w4qohH*SjC9KR(Yack1H*Q!}-Xh04aEBc6z5Dkckb{2o`0*2R+|QmrfAQiaIri6Y-n@PL=Re~ob_C2PG6Gi< znG_0<9V{fWL(OlqY2nYZ8AFmrC_uqvxd4i*db4AAwXNyn% zT@dMH9kTpM4gmo~eqb0;NYT753I!jO&|+?u(9$lJhL)YF31~P`8NBCc8Kd(^F=zkb zLf*li0zpqtzVJv-p7_|`1(EJYa`0P8gMf?MY3WbLb7KnQOE{F`jxkR?#3L?+XmniaQ5yceQ zqtX!D&C-yK{gpu(r+2R}J6a!5cep0B`A{Wu&%ts|`@u49=YbM_*MVYT_kkkOfxinP z!*?!`qy&b`MZEdu|J$slXdv>!+ z_q1@zTU)pltbJaGB=iH$9PR89#@|%^xtG=ElYPhmp+HyHn-gYrX)!Cn{?K-#3aG-aa z`QWK!>w)(Lk?iv`ksk0nks0VgWKpO@c8G+?p<4dTVT3==VQzVp!%n}O!zsL#!>ziW zC8)oeA#S;xE^E8EL)m$LyQaH0)o|!Us`=2dR7=nM;=eeoC$dQnIsb!0F5Ueiml^*k zkCk>Wk5h2FAgtm>0l)5Qo@m#_9O<45S&EJ`ndTl}<>-%e zXPJ+YIQqW$HwXXUh^&D1L=MRzH&{gEg_?+b8uqe)vFS-MGv!_>JNsrCxA1bgpscS_ zQgyaM(sZ&yy7x%2eE@^UU#^Gnaw32RR66gM8Nl(Zcxk#_ITmmTiNRUT{4(;R(Y5ZnKY zLvCO&kxvm21tEH(hzdU~VMO06XKlGr$=QCXnv;LNfm3m+fm?U9M$p_-DQY`dD(Tu^ zC_U7fFF(>w*5iHg9}e06Yl(kxCi8eYr63Sry+Qt`g-BFTZSLfN6t0!7dJg4p3VgUIw-MC6bh@&YJCVGxff4%R#` zq1x}2GhEjz8C&{m=^1BshZG;%MX&CuV>cWmIqa_#v~`z>I=V_E-Cae}1D!?k_Xd&n zKRNiVA@cnLiDL2`q$EW7xQu4LT|o=KTun0$Q6L;<_k#@D0$hzMbM4ImmBFlFnk?XsfDD(>;Ij~=shDh(1Q_a^aLnHedf|E|} z^UXd?ayUrVp}U@4-?fw5w6B`q(pg3Bxhq6_JIW;;d&{Jq?+YT`XF8GXvw+C+`GY9- z@gqtD>CehT1h*?fY!`P@qI-MRZ9B5hFZSGTuL(9pJ1*tn-wv}<>*xcPlSWO_{_@;v7fB_2zOGQYLY zD*}UVRtL(?x2*?`^)8D!aM&YhUw1%ydq*g_|7R5ad+#6i?|pw0zq++iP}9;V+_|ek z^xhz{Jf;u@>t_>X9*c-dzh(ET{6qSiJru_;%?A#gSrOfF)GMLwU|?!%S7_$$PDV~k zJ3GInEv&G454Wg!53gibtDv-Tx1g-PMOgm6Aad7DBuZEROjLT#epco4$CU;T+KEeZ zln1UZa<-pe714UqdsFk#pu}B=s3}bc7&{vGv(g*8IGGLmxLFPRc-eKGyqww&er|P# zAn$!a6s{UiRIZ*#RD1q%t8V?8Q~f{F58j-o*n546wYh%{+IZF{vi?-i#=7Iw%{z}V z5_TS8ZLK}bNvb&La#FSYC-|Ghz!t@w_pUiaMMG)L!&OsxMGnRp+P?m1pTuWxdRpl3vz^;!~{HqEqaR1t&S1@=u0s z$~(c0dtVUMD@MJlT{ZsFfjRSfZcJO(et&LA^OGg~x(BNiRRbRS@*94ZvTGDa(UlM& z|1uTIy+nhvFVc~$iwrcgpNXaSv#_*27QUm8?RsAjwJS#5+OzPd!`CLv>%2d6b<4Ab z0d+6Q0O@CI`DKs1r1|%KmDzU#G#LXyx*fNJ4XL+6jVZUNrsSJc^R}BbbJ9(^W$O)w zCGiH+`o17Gt(in@5B!x#3tB;BQ2dCDP&Sc4QxX|W$J=yv#EZ1B_$S+W+aDy0v+pL! z3kMR_Ww#S_mA4WM)i)DNwKukycV69Mt-G|vUf-Vp)b}NT?~H#q{JUoV)Zw2x{P+C% z=Xv;l=y`}E-;+B6ekIZa|Mi~qB{D-;L?-#3%w*W#X0XCvWN_l2q;XRpq>8fdCd-Nj zl2m245_MHK6AiUD5=?bh6D;+Y5^N3q3C_mz32?)?1mvATZ2k|2<)m)Um&hVHWKk7F z7Txw|7R&uIi?jJjW?1TjbV2sr?b4##Da!I&NxJGATMav}Z8bMsO0+ihB|3JIe|uMN zqI=ir#PD~h|Wk{p73$i6$1$fnAPY`XQ&Y^LjFHaqS~PFTvrY+lyg3~}M@G)4K% zR9(%rWMloMBy;11t@h@#iAc+-Bv;Gvr10Ix-UCGZ+DT-ucMg#eu$=6>|BC~I?ETA# zT$+W*W#F%JSsS0`bGAJ!;AY;-6BP{P$jh#0Xsa*nFxFp4weC8T4DCL#4c~J#*}bPH z<^4cx`45L>WZ&JJ?7P#6T=Fa?k4EnQ8R)A5R_wDP&elgoy!5+8qP!c0@{-GWnyL%g zhWg$NNAs~ANb8|geD8tn_}=|H{z4o1?>pf?95Mrzk$rb>vhPkO^2l?Le5#2kpd+t~ zm@&^vISKbm_}g!mh_bJg$_o2RRF%C&hWexV_LlwGa9d{v+TNLtc64T7?e7C3;a_#| zn?q#!lN+1KH znOpW2I`_8ZA)T$+NavnxwBvn1a+pZ=y#K{vDcN`TB76T-viC0{ibC~7F&%tX#tgq- z5w`JWr6BQgwIt<2y)^G+v%KO^y}G`mTHn%KVcA<-26fgK!26m=F1zy3j&}u-_!o!S zWbgl996ZV1Kb7qL3yI=T-Rn}i^HBxUb*G9OeXT~gslQH~a;8n3ccevHvA3v6?D^`8n)xwPEJH$b6EW8gWT;$I)%CWcZrp6a_c*TNcxMzEF#-?F_G`Lp41;uh!RTJt1_zWK^0wl zvz7r~Y+^>AIYdu9x}TkXpq-b$Z?~|ly-8fNr%uwayGGX1SSjDLvqH7Ex1Nj zAhwYlGJR$dIX=IW`h&GZiC-X5N?|^$pb7`7X}ZhxH00cVO6;-2A=?giGc&vPh848$ z=9jfK39DP{#dW)PN}8H#WX*NeiruxHQ0-KlqK*AFL)y{r%pS z2U8zbh4Qc0h8i!l1!5;o`fNJX6P(=DMbB*C%PweZ<(0NJ3o3UvifUU(9*uR(+UN#uJiBuczi5@i9NFDfa4x2uCi{ksAzC(o~T9XjC?*VRKw zZYMeHX=mr{-oq_!A#2gxEUav95>+=eN@{Bxq&utX<#mFF)|SlP|(Vfnk-ctuUEf|91) zqO!Ucad}O%q_T3Ctg7NYKxBA~C-T-$BQ+3nhzg&DFRJ`k-Pq|zJ9l!4;_%hQ_I(%D zxZ6(pZrXh$crAK&4#fSMxg*}38 z`8~qq{6nIYcLhJ;h?#yGhK3pPg7+9sRz3yqNx*Pyi z_J?2<7ijL%bBxHMv#h9sGwkU6UQSGIZ`g*MQ{33BQ@o9tC;6K)-UCGW@{vUCsxR&~ zuAF@Q(xl(I@67Vr^LP=h@!1MN&4aay@&PYh>CFIh(e+?^{?$-t&J`M%b(s!jTw=iK z7n#V8i!5||KO0T$=U~ZwVR&*M_nkr1EdTgv{qnC*_Wdw*|LtkN?Ros``oMVC4dqEEg}H6-1l8Moe|n-Xs_%n3J{<}Ei_miQZN z%jO$w>$`%eTRQao=`r6Py!F$xy^m%tYD&XN5S=YXW^B2u<&v`T<|XVhr_??^-mrCsl$KIoBt=Chw%Tr9~Khn|Kt6T zLFE$Z3>A^avj4e*<9e0KjeWjNlK3Q1nfhppF8#q4L-zeGro4Ocmi#;Mw!&NS_9F7# zP(;2PiZ8~)Mg8&EJAsHKIV5>aC$-)rhoIF&MsOgJNev@1>Hj*bwGrtY{8bvsVY?{t z$u>pm!$fVy{RBhqy#!Oioh{a)n_FxpSL2pGr?MN zWs9Ti;ufgl{wZ^E}>`Ct1>zhiN2-6hq#vZRVmYTkU222~fqkE#Z~Do8ziZY}rzEG$FqF z$UEYHMF-WIVVUKaD>9uX?4OXN`)Wba=>6w=7OHv@Q6%62~~<;UJBktAL( zQEtCjs?Rx-Z!bBLg;efOi>U2LjjeA_-O#X?MBDb*`gg_u!XcaFkV|sNC(l6&LqtR| zO-Gb69M8)+`2BKz%&l@s{FMqt%K2(-&apB}$^Lw>YHv2avpF-Sp*cOKsW~mCsU>Yg zBZ-E00TD~qVLMreOj38B?Z1M^4e%j*|1_c~L`alSHE+ro{~vqr71d^S*@b$-vH`e3((&Ge>9ZZ8A7GKB~&}RKrNOy*@*WZYbE&(cX@;9+(M;htC2VC2a4?lm^J@&+3WYxh_RBhj3pZxB9 zjPmx~ezh�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

      D6+xYLnd{3DS8q66XK;=98VBzJ^nNN=5; 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 z zfIqp__67I>JS67+ls39Xtb3I*={ zj5Z8Y84OpQ@q!+(=E75o6$ZmKmj7qNvj)qYB!>Q)*uBw%2eMTeJ%wN3Q}w?LRF_lT zUJW~o!91Z)38s{7Lmiwc+mqalA46pb98qw@!I4CMpfx=0h}Ape4L#w?=QdJ7Zy849 zJ(-w&30}JgWgiefH})o#Su6x<`vfl4l@EaRKyl9oQ@{lL;?Mj;6>TyM-x!LI4k1TY ziH^bO;E8&863KbAhBX7OE^zgNtC;c!;;kw(Gl#suCcO6oo}=Ef`|tNpWbyePT&F=D zSOORxsb6FMfnk$U^x#nW2kVCXLm9qNN{*}#d5{wFAVugX#2)$BL#=^e)d5`H;L4+A zD)>}IPGC9~T8#%E=IECVIR}+@=m0u`_u<(GRs(fQ;1?50QE;;i36_L948*S2+HtB+IbjC+JlB?@L z1fM}hfv6w8*6?-Y-=6RllIs}6Uf#jb;Kf^LIrWP}KZC~nLmXQ*)UVUP2jCrJgzb%~ zdlR@pPyX)4ZKta)&pl`uP_ij}*6=w{TQ~T;;q!+t1imQh7Eg<$vZ^fu&h8B@)Pk0b zq9>{+s=^sJ!^jbaG4iRAS3%_;_M>4X{8Ql^Zif9WxR-;Tpo=+k3if4iEZtB`wAD2d zY1-zZmA0)&)o~Wdx*j4?*H2m1LUl*v!9-WU<6 zJ4Xa)Z9wrUde)b08#D3&YIu|H_V=S0BQ`{Y{q z&Y5!}>~uw#orwssvlc=24kFOrP59gU2w#UF)^|h-Z-jN;tW8BIl7UY+WjZjq@mB z?PCmg*(g@ad&u=7e0&AjMAUcH2+XPGeb7%7^%&k;>r zHwa^=)56&PD`7(J!<0OX8CsUo<`du_07t$j^GYxJ07wCGAPR(mAa7zmA7ZZN#2n;e zoc)>zM?c;{>1QwO{M>}CpO3Kd3l>&>(ZbR%NtpX(h^Bs7qKR)GVc2{)G5!pp=T$3o z-H!=fm-|AW+=n4~7-O_7#J*$T?+Z^h9G&540}??DhycNWbdR8_=A2FaiU#>~d4`;%{&fMYE~&px!=#kpRg1r0vL{?u~-9C^Wvi*U372_PDTu`dYt z@!11z=LqKe6mJ>B_y6%)LOYScCCL=g3@*tIfJRNGz~peyl4I>?)GP|DV1OBmzQyR; zgMrZyfrbz?1QPqhQBL{2xU2&lsch9cq$u`rVBc;4#KfT$EG;56^5jfb;ZHDVvDX6(3K0i zbmCY6=M3lkd64Wt*GK5V2Fai$^Et}TjpH=X1|;ye$^k{Tzy^HwhTEB@<#k!Yv@QG@ zJb%y;e%wuT!xlYs8*i{#rrc;~lWa!{#L058g?i8|hxW+M#?XT}Zx)r^#l4^sTGV9OXqR?80Y?iMl?)918v(4-uB(;6G#om&b%I8IKpd2J#`!EN7;&R8cp-lA`N$j3ywY_hk=G2JW)bBcf+sJ2jh<;u)}!lFcmvsS5xY!sW{hy4PY}+ zJUfBn+5`511KA~YWQ|v{Wk262!2MC{tfeJ zl>>PTsQkx&u7POGKm0rQpzPyxgJRqi0&!T)mJoN=SKEoa#64Bfs%DGA$ahYiH0y@s2<1{*s zV~@i)@P1h8$r9|u0$WkK0j6a@ zJ3&-%g!u9>I@E8H93qz4Poz^%1iiE&_EvRQU2i#{=QIp`)#M*0kc$~hn~WjW9W7k2 zuoq?f<9Q(rn^CaDF@z?;(V7;>Ag|IDo?a*@#u@|Q8po#vc*_=)si&A4e|f1F+duIU ze5XMjSOR8%319>m3I^k!1L-II>96Yfiwb^g49p&gKC7LZEiY^w3@bFt0v`ZfT zkwd@jjfyOkswZ{2(Hk}r1!W9KqJY4(+ z1fSY)CU3{UYx|*W3_W@tN4KH$8hF`|e^9xHmf#>9%KxSTZWE$hi(5MArP(-5>cYN` z*rEfr$iP3_(I)Bi*S7dZ8hxb=d5~6&VX0&ilF5T4(IyETX^Fx(Y7j$>qA6LeB#OY> z!yEDs-~TK35Qzpg^e+Mv;2o&P^uz#uL#BeDy*~F5U8bZQYb|u)GNxYUaM{4+2%8&R z-qg<@z7Y7L$ZW^+Z!0)eb|wo8m5|jOO4eu^7F)%cN9f@X*f!=L0@C2h!A~#e^TFD1R1dYz#vTc8^j1-gJj`jm?69j zdk7DMBH?CGDO~icg|qH5;iS0-Z@LA3r3Q`P4y?e|)zoz`JcU-wCAi&ZfL7dY6WGRp zDE5b2GPgiasHu(!F)br!y+o}#&_pYY~=EuLmAgu7X?a5c*i&SpJ@ zqbcuSH0Aw^CR0T-;~HUOxJTIN+!QvNKQr<*emk%fJCBFIKRmh3@B>?H0FvyeKU*HN z5d1u_2nK=Z@wZ~_ft7)1ZpH6kTG=tSWXpY<|~D%=|N#?#8Z*_KM4yR)*onb55vZzsbe`Dz2WWXfd7G(AR2^& zV0*$t;LCAu;7KmV-L8pnwX+m1_B{V!??SG{oAn)m!p8c9cc$A{J@!b4@B}g1O$NQ zfOH4Xt`K{Zi*e!^C3_chVdv6JG;?thHZGpR%Eez;x`YdJaxtbZZA257F2c|yPv|=j z5V}s|g^t4#p=GyIXxdy8+Lk{GUGgycXJEiAP(~r6FeIa~$5sk@hsylO zmzT^OSer8*`}c!C+XG*q{1nQM1>qowzkPuha0kxpv-3fIbLRbiTEZ~UK%n`0ipnSHi_v;oC84JH1K&=i`{ zdN__Tg9x2F7RQdm7I7Ff4v}$@AesFgIiAmXm2~u(=-Py%y^WS%(1M2M%%$MT<&ut+ zp9*3?7~oYvtbIZQ+^+m>4>!x=glPovZ#3UOQ%%uQhk?uhN1(b{xxQz!}K7)2QSINYKy%4dG~DT}*ipv405dz$J-5<$!qXOz>)G-s6i6_^fhJ zHdKotko7)7=uk8_EjYArVr-FSM29k^5NmEU3@9D2MF%c!&jsq`D(!l3^Xtob)ttW$ zU6;B31$IJ14Bsb(Gd5DUHgLqVjpXkTI0Mn*!`3B=HlWVtxR_BQ{3&p^25mum&=DP- z(9wl9$)ruXGuZWXrefHF-!W=<$f!pb_V?lVIFc=^(RTq|XlRRu6y|o6-vOk6SY$`S z8HN^rw(iu~J^>$u*9cynKY2UB-4%2PJwY#YWTPV&9r+eGm>m-^cLqL;SrSL?BZHe! z0mnv=ms!sFXSo&)1IC77)@`b9OY7LGym;VpWQvR+01Hd3q35J0xFiMw6DLN)taYJ@tVt{i` zr6DI%iAh{EemdvWlmB>zE;RJxd$n{lq~Tuh#<#&2Fq;?6XOE4|sH<)ffq# z+74T%f@s>Np&X2IE0B_!k$S=Yj=bF<1sx0Nk!&q4H*QY{xhD z`jP{ovG?>K-+;mDR&o3e=b?c$DP3vf_8Pq#1h{VOZxX?_ber9x#Xh9LN0x z9Ul^*-o!cI!$IE0Nau;@PoY$;JyH3OML^{rW&xFhP#P5f_uy;rWdk%>`(a4Amdt=1 zh>1Oj%l$zZ^@$-;N~HWYM6elrYuklaC!w;XTD)KVqTAbrjFH^Ls?aeEdkn!p2J?U8yEqqOnH@x)pR>2|4L7-Lb3isw^;i6i zT-38M-CNC84Gn5297@bRg#1G#vF>1eV-Pw9qGKTbF_0LuKapiWqUZ{Iq?{XSDLNXT z1IgodQck|03a%Mgrxx#hn_Jw=h91=g?mux6o;^SfH)=Rg+(Q6E1tqB4kv3%-VqG)x z5WIg99R>820(2ChBM%)p=*UJ#FLd<8S9=ht^Ck*Ep`By37&6xbfI~cHN2%Zx}>>o%k^B1SV51=s%9mIAG9MgdEfnsf@U%K#vG?2nA zI6;ehx(4$b{33>2VGG8LXxbzS--yCDBJt4(#txo3z!JgmMZwn+zBcrp&g{)aVSlVO zp0k#cb2xzN2mi`Fc%wnJ!$hFI3d+~V{)W`w2!0UH=N1Os%k-F%>u88@E!G`q7{X-= zmlce*@HxTfPQ85K3nViX-e47PtmlO_J?If`_=GDXgfsULCo(@ytdnx0J)Gco1>8l& z80udRS8sSbnqd2;OxuCVdxSFu2w_?j#IZmF)*a~S34a}9;iqLTe6?&ub1etqt?4Sf zv{-+j#cxn*g$g$&{;t|7!dbh$aMbQ4?6t~-o#rUKc`nwg18;+$8uAaeXqbbYtEhho zJU!rTXGS<+&XgNOfM5{7K3`M95fcrbU(puch6cjRz(jcHTMBmrTk`}2s51xc+^|m5x-;GxJq(5Z7>A>LO3!l z@B?o33094{mr%9={Ot?8IpzV}%{7G^xfqwGM#9;|OgJ^Q5e}w~Z{sT z)`T85*Z>3pU*OF?ci;+~Srg-Er6uew^@XjKiD+hJC9JLNg_X6du(0+KX4bp|l65gn z_)^%&Iz#AN_Y}IkD@Mn%N@!Wk5?W>(gr>=9p=J0;XzQ}}K!ZF!Hs}k#`ii!FGupux zKd>X#0{(pV0Up4WV@|*U*f!G?*0wsr(#}Yj*_jJd`)0z#-kJ3sp2E=HUl`bj3qAXI zp>3ZgG|9yXyJ9XH%0ztzLHk+)mQzfa9}zS#b07~h1{;*Y-xHp6coXdD2M+iF@CBay z?FO8I1IKNFwY`QgcO?JdWFQQkP06!Z3q5BCq2tVZC|#NhO_vZR#xbB37j^*!RA2}} zBcp&l8k(WO>M@g6G&JEkPTIN{{%&xzaikrb=nFvQe|&&D`&@t{dh9?mK3lNg)LB~? zx$3jF#6)O$SPBgf#Cf;?Zx95cK{Dt_A$edB#+-_tTJ)Txu&*f$4XlS5f^G9DTRlFJ zN)a(21o#0j;O5LFz=7j-fF)7F%oX|WTI755gr+x*=|jh9uAB#fYSE4g*nJ~FBKzBe zY|h~>=rskyuA$IVXn8`Rl0unJz@JUI?I}0OjsD<{FM{TL_5d#IcS4H;u;H^g$4oqF zMsL<&_%fLCTTUW?P920ngRw<0C#eNA!J#0Y{plc!bNX@aBy_FD$xox_TkL`c*2I)k zc2CM}i~M-X4hR0go4?(G3&&I*%$BVs`shH3D_b5(FvT)Zz+kEDeT8DsHZ2K?&xsjxDETv1L4Qrb;IDMXl`DVi!EAe zlRVL*Qybw>bh0*dvbNZwEf=RDG%bOB9jIhJH=z-nw*+m+x%LOjKtmL97Gs3qBZ{WV9;(7*s&Qh~m2D5u3*>-2PzZ`OnF!J@6(;05 zXp_M%OwO={dROegj_fPp23^f$t&a1*LKhl(5D5_>7A+Ogt;tQaz?haDk!d7=b-To02P_O(x^eld0UKHbP85@R(5?U&D>^ zW3E9%8EbptYDryV(GmgFvsljQv_U7H!NGh?L9iuIoMoUdP<)kO7#IOYgK=OYm<*0Jj_5)|kssaZdnK!EB)F zxC|)1wLtN00)KMu;`2Um7@P#>!By}9_`;Y)1{KyZe)zE5Xb}~?rlKQr|J5Uj0A^DRs&KbzLRYbNE zxpp3zk6LmF2gQB9$Gc8eWgl_gM$WDQ3&BjF)*?u_6+gX|^BZIE2k3Z+j>qWumf7!j z%#fclXI8(9@|0-eJ9Maba(v6Y`7s@aUy~H~aNN6el-uaIj-y`1IWH0QpC^(%&8HKr zFxZTaWvErpfGBR22T(bP-~Qmg&-P<*8{7gPkbk&AT=g!qU-c}?JH&PBcUdo>;{x`$ zz(DyHF~nI0jZ<{q<3xl<7$^>+V=ocoZk%^J4zz{L!AAD3qgKnv7EQ+%6X8`k2=xw% zA>bK&pM#s=3b+XHSn?hk#KML|1LkBf>?q3>_<$e~0b+24M9ObP`RQ1_6Iq7t#LnuS zpz2wa!Pt8|Ei#{aZ=&nGL*0MD#eb(;zb2+`d=G`nL#X;+2g-#M_ZF}gtN=@}#X{O- z0c|p$*lr%t%3O5JrCsLYAM?0z&Ee*ueiwBH(dRS<@5bLn&B2{ZvGY*sJB601VJJ~= zEBS`u>^HjnD?CVL(;9zuNY(!gs0Zu8A}|wFg9%_P@!e?JWE3&xD13AzI!4egRYX=* z+`xwu+YQA>c*7zs&<1blKxEgQVMV>XYa2>!mk>@1RI$dk`K~|G8i+P~41UWG@^A1e>Aqnop zKfq|!FuYD+tN2TR;_VK)0`7K{r-}FLQ)Uxj0h&>^BX9%WaQMR!!c-y>jySv{1&$0j zdg3j-hZ1jyrG;bYoh|5fD%%?M2h?X}1Jwq@K`F=vid)?-+kjRe1tj60iL^-~F?S+) zkOX4xmW&{*S(4_7l9z=r(jmGI~ z2;)T%wg@CA6iAx{;2Qz>XaGLyCtToR{Q;kRP~weZFOkTecBoUHQ_AQvlCu_IIko=b zJ}s$!oxAa=MAZ)Jwp;{PrZ&?hU8bCR@PjZA#NYlpOvAMZQ#7>T(1U~b9?&LUw22pO z;z@}fF!2@!{tbjL0={^-(m0Zd$|5W_6fc^C>MdCCBhdKkVfJjNz^|qxdGPQGL6K_6 zd$M|kg|rm=9*FoVmQ`q;zg0-tAtRqSaUTiT-;-ef~> zv7*;nFhZF#QkyZdn&J~p87EZ!!2(Qxzc2Og4M&C%zSjgBfDpjr4Z;h!bL(~Cn3ExK zzk#-J(AN|8x~x6WH4%0?mcmwt^#?kRtnY9a);i6Fm2QZz)QJ)1I^-a9ItdeGRQ{cOX{DUDHM$-mr8rlPnwkFK$Oz{B_Xol_Cx&xP{#2Fm3Z=xY=n`jFg zV_jiwq%W)ujfJJ5nXoXl7UqTy!pzW>H6Hv9rcp5KD_RI6<5Zz<+*#-v%HNLcw*$>gHH4L^mauH9 zE6h#wg_((=FflO^O`2MgYq1kXrY^$3%vwN63USE&`XEf8lAm9VsfwLv`XMZzbWv(GC%(Yq9qAQx3 z^ZrTR7h_;)EcAI!Ntd-TI;@S+w(<~~Jg1~#9nOS|-fi6u^y1>a1WUBM*>Zx`18Dh- z3F9lixa2!`+BygR_HZP^sd7L8fJbc_az75%#9HjP29}nZ!rW3@m|E(JCYE}_z?%Gn zjgio@H5D4_Bs+WH2AU&06fnBjwFNyXq=Jf!qaZX`a)&VgydnP~SQFEi_RfMo9j^Fh z^haCz0`LIN{B4gG8(_t83u`T5W~C!ctaVvmqbu}m^@Nr^4XK>Pi9(#!Mb5w*1OY}j z=hmPb$NO*|cO-i>*d9X51GGrmi0?7Dv>P0)xje>>`8`$f0V@CF$ltc?w?>O)Gupuh z8vr9)oxkm>v}5;Rrl%rU154AQg1wcnRl?#=)1M=P+6xQ8*f` zn2l1u&Tu6=Ft_IN0N@2&fCKxQp~afxR<@eL3^XAZrSGUo?uqwcxZ=?6bSh75;e#zy z6493nd}$9~Uw}{eCJ{Jw0)-4TBPe_^*Py}mYqX%jk=UP0+B-2eV!|*NE&=X*c4D7B zI+~%whI1^~n(#O2P@&_>GYB3Ul*i!N99#G?xCCH}AZ)>NN`mK<8WI^HA#7WM3=Evh z@u3X53pjrtdY)h(2^r6{a(WtN#v)xUsqta!#@~);A>Aiz;k81KDSsPsOxF{Bnwy&g z<)I^p0WJg`Vb~%PTSQ}v7zC?_%haM0^*~9BH1_xA_#g)0xpe+|u0w-A8d!_c1>O|O zRnLO)b5sp$fLys;<$oOD{WAw;#4%kT`2FCfXl_lE2cpo?0(-=vqa`|$aPn0AqLm9< z+9M^BhE8RF4?12y&Y4byccSSroe&MIMaiJtmeeVX)BV_b^0zB|&S=5YC?G zLXLq#a%hj0A6q4$ln&R@F!AcE1>Gy0btICiDnkt9FPx+KnW-V495)2k?s;Dz+2@E-GdcKZQKP zZqECGK!Qj*5f{bQ;c)xF?MR(XJ8>&fyvnv*((py6;v5YA}aH-kF}-(snwuq~o5!maryx2mtI>vW)a7XdE+S1x1|pSJ?VxfdJ)C&63bUGNcj zs6+0uEo~iLeFH^$Q3L3JwhmkBo|L5gQlZGBGJRwN>jjZPVMe@6fSRm#&%Jdi2cdot=}L zUr<<7(x@elj2$;&;-u;+Q>RUzIcxUZdGi-6TD)ZG@|qQ^ zRLM&2?M0ZQrqT_n!KF`wtvEeB|h{6DLodIeYH>g^QOiUwP;1d)Kbtc>mVz z4?g_p<4->Q?A{mmAAI@MqsQMo`S$6v?|=C5r=NfM^|#+&zLx)g|NF1%i+}3>zpVW= zG?mBeDVI0K=S`K1bM0#6w?jLR6ppiIzlBqVYuoFqv;FdRcDy2dczF5!yMHg7OD=hj2^L4 zb&0jAPi&%7Y*oEt7u{m7>KBJp$2d;UIIX(ITdHroP3L%5^^TjWd)%Ra+*KXqb9%@_ z)kVHmedIej$#d09UZ`&J>b30OXK0A(16tay+yMToH~fG7{lDB^LPJASQ%g%5pV8IR z)7Lk^Z;XtMo8UT4O-;@49t%tS$Jz!DvbDp9a3Z`2H^Pr_B;`pBuGHvD|K&^#zJx1f zv{yqZBWbVf-2B4gK4lgC2M!)OeB_vM6RW4rm^F9)!X?XUR<5pHw_y{*r5Y{w?!ze> zeB!@cqR}TBoI-g8Zh>Fm7RRya z)vVzUujkD8>`MNMJLd|vTt8N@|DFAXCok+Qx_EkX(e-1s#UKA&$Z2R;jD|JAW^xM} z_Q!e26Dd)@z11$``>S0FzP{CC_`Uag&%Av#XT`hcbL%c1&)a+YVE(ZqdkW6iZ!LId z>&Bw@|1RWoZv(jm4Yg?47HKOFqTzH()GwFQ+kN|f=Yj{Hb*uX5PS%X~-p#JL@K(;I z6DME6L$s-)+qcDYx+=`#4lz3vnDe$Z=99qmzjC1=gD3%MKTpUvAk^HjmE>SM+G{x0M^ zPkp({*Fe^VG?DwFEMK0Bb9wqfV(6z&Qqpeyl%8|`N#}tFzvw=8+ecY5*4@lrQ1f2y z@&#A&R?obczkc%h!n$#1O1A%9$OWEyat#``g&50&(dI8M#yfuXd3@-dACl6pzG&O~ z#CM(g?Rwa4dBp< zhVp0&)9>Gjak~4sMcDOU6Wg5sJuPeh51mRkKkhbU)%~n7i$2Y+p8ZkojHw^w&zbOk z(frXjN)``$uXNepgWcOln%YRcV#8ZS?T>)gBJYxd4}fi5RxM9^*-8@E9ww^=GPI?s94wda&yvvSA( zoKraZ$NZA29|}u{eqUTZ=)2Os{hyZi|GSV|yo5Z+8n{dTde_kIGjCJqP_>)T{q*eX{%hT9)&7A$NO;7pHtR zZhdaA|JIN07W-v$$Bi=BYnhA+nk`#KO_FWmN6U^$!)3Qtm9kfxK{C5-f0>)!R~ED@ zmqqQ%WJ!m=i`R$U#V5BdG%r83GdL_=%<80!QX})%ROsmb7Q$A&{VDoZzk(v+~v-cP`M`~Megm^ z{rA1OWk2odGxEEg1EzhwZP=nOH;rEXMeT%5pRJg@{o|!G>TfNWckuLtS;zKOO+WEh z@sEZ^+x=sQf9&v|edr&5_{Sgq@rVEWz9PqQ&zi+OYbp1v+Hf1WCB{weP6?6w+oi~Z zncaUqlwJP(VDad0_w}9mXiw#``&);vzqeu3_PcAw?Y&b|edN6bQ%@fnH|hNLs=p37 zo)~8~G0rkHtVP2%G}I@D$V2HV@@UuYzZ~yf@$7ivn6HnP&3<^G|H{vI4X*oS%h39d z)>j?5y?XSSD+|Y7-aTgI)w;3cFaA}?322yuhUI}x<+^Zdxjn{J?oSSuN86^nKG~)F zPiL|!o}SGg`_8@Z$>w8*ZM+ufKY*=-9i4?fD8@bUHRMb|IpuD^6LZ}*vl zc}I`d7o6RU@?dB2h{#D4yXjp)TRcP3ZhWZ$1c|0-jw+n5Oo?YwE z{j0lO`+oXK&j~k)H7{MxS$pbq?v6u8au4p_mwRf<&b*6jw-#QlsVlp-WJ~3{e-&~H zG4Db&tPX4<>%uMN-WVr&Dly=fx7#E>xzoPe{fAxpesHhH_;+sgo_FR-_UeOYbGGh0 zp0juJ!Q7*@^?7HO?aaS4Z(GSbv$pm7%aBviu!vt8T!V(K;TCd#jMMA0iT=;uYn|}b zy^PFHzv*0Yjkx>#?Ot<^T+Lpwi+s?gQ#rfV9L*&Ml6P!=eZiUOyGq`w-dS<+uR=~k z!xF}+wSmTRTe!JA7~}B!g#^E+w_3-4{wO{3&bOV)FF)uu`oxD>GwZKqFRQzhy>899 z9C9GJyXPOxCkIk^bke?(lVkUmpZ=?mGd%RWw~+_#_MEouX77b--^p3I4Bwo8E^o_>Qw2M#j~DG7bEMC~5r@kU|5eCY zXsGelmm7l&p6?( zU(H)N<8uDm>I;P%$DS+RQgym?$B;0GfRmdf7+Hym4ZMi!{=jDlL zgD-D}HM{X`MDw>^#l{?!N$J~Ox9hRy=PredzU$F<<~P}u)nDaRjeSrsYUCHiV~5@A zGhy&&Ws~}U(sxS5-TqVmD&$I6O}WKaQyvJ@{Nb%I!&?viZ7=>D*8GT!iP|9(Qfp<~ zj*DM*&YJa0kNoQA*(GD2<&}?kTG(&cwp$9}S~Q-v(eE_`pLcR<=V*(hBtmP&8C88Xmiyo~f5CgXeu z$kc!enGswnJBJp_Zec~TXLzCP6;U9wBl2Z#WS-2A%9RCw8FDydWHs}LIsQ%M(oie8 zriHWIkmN5nw~LjVyS0;>@_NhlH`HDmyMF!Ip=&putbB9)qoL7e|JdOlJN#$=`NtprAM%GP;;hMxlk@ydU18@uSsRg+hJv2^B!&lb+x^6}ioJKw2ZTz{-;!T#Mt7VX_NbjhAK zg&awoHI*1=AsSYoVMDZ|+@9bocc;b3y`3}U-d?#c_7)BNVRyy&Z?{*@c~m#D=E2%= z>+h|YyzTCi8TEI_nV+37>*$`L(@$)zns;!^h=u#!6mk?ArmOG%{aC*kY9TkGVJ8~) zqTyhtj8}(x=KXvqfAF&dr4zr|J7E699Ya@tzG>u^PuGmy`_b}AM{X{hcItTbl+)Ws zPC2u2^z0)W#>_kTrjVnFag>I|XjqMg&Cw2WcS3V{piK*Tq+`bK$9v>GKapGc?eUW8 zM@RZDx?ewV-Dg`XcYVBJ_~Bc%V^6%da`NdTv#ZZ-nNWRh?Sz@f)=ZpzwtyNQ}pIk9@=CL=09E*mT%psQgvHk!JTcYjdzLq}nXsZ^l zPq)wb`9in+rKAVnFaP9ZY2EE3ee1998+7>XUBgbE+dBH(q4g6ktY0wU z!t&WuPc550r|R5+UE?mSTRHyXl0{R_ELu4IF!)*HJax|<9 zHIv(;?c^cW)ShY;{o+zayYH@d$$Rus&!L~)?mhk1yLmP5yj8gQ{K=9%Ck~e#KDfW% z$vt}po!h#r>O$?7ahDdZoP2g(&9qZ*3OSy5a}FA6{8$5lh8<`)9Pjn&Tx!&hSKFn3 z^I_+_`}eyKz4LLeX;ieEuvup5$RHIwj9Ynxb8sF@fCafoL;=U@A)~qhFq9gUwwA^uBoTr6mk+8=A&VyzmeP& z+Eng|ZYEF0d;I)P3hOZ1rrrCdL+-7|nU$A5?OA=C*uVaAcJ1b~+1pkh&)K*1Q0|d= ztPz?~-{;JvJp;~--#hyBgnbiEzA0oi8W!M}tNjgSU8srN8*TmSOuXCoH&R0HKWvls z@%Qa>t`c{jy4PdEzFWQKZXp-5=0eWKC1-NC&t;9!v?B$FCLAm|HgbQ(iDCPPo)~su zosm^Bc!{;YurYr+}`s}~pIUB14X7<%_n96#o38#y8jyln&e(14^eFKjUJ}}_u&^Lyhj)tYIfmrXaFL#C+ zu?E8Yhj-$f?mdbNz4cQ{>np#dXB~UixqRoB-K*BI4rAG!?Adc~>dsW>}$TltwGZwxuhO-I&vvIZi6H4xzjzn_X}`uJ9~^9N63L$AI} zY<2o|TKD=NJC$twru*QU2U(-%eVS7}?W6n|6K)sI9d)y0;jrtaO9s7HvAplq{wqqa zRIcuGWyqR0g`DTAEmwQ71|m>f9*ER^ej&>AqX(fbSAS{|dPXKBACPT2*ZtZtcjfop z%IAO6Yw+|hb4E<~qG0T(dqoq6f6{02;E&6u_5Y~vjPg4JW*6TcGPmf~(0OkPx!6TZ zuJ_WEyMi=d9*@v@@P44#d*6n*o_!S^d_cx0Y?ZCrt$N*|`@$F9@@72m)o0>&x&1~z zDI7HX>*67mk4lFR{IYyR--rE1mE9jWrud7>aYdgG8ULn`E1Wgt7T$)jKUh4w5U6+a zp|{2PUxHi?%E*8%GOopHnUcCtX0)FnGczZ??A2@ZuerIye=aPj{IR5X;PbLR{eGw@ zEC0S|gYB$Qwhh<4qX5yv2(X{u;MGbI`x|gO|l&>F>N%hBaR$TZAo? ziLujVdddXZC2gea*?y?Z=`>j8cNrjyGW)(R>0bV-tVij~imZ~C{d*PuKB#x$Z-cYn z6mkn14ta>rZ#2`q^2EXL*lTx-?XtQ3Y8mXYKt}mbmGPltWt-?K*)gtCc2682dnNak zIjQ9`zg4L$Y|}>;rxnZ6wuQ1hJzw@~moNLjF=V}icyiH3y!(}z_Q_xE40lOqvo+GQ z*#hbBG*yOqjFB| zxw>tbT%DODSLSt;H5J)%$*@wnVEmxp=gg@3W#+=M&!?@J_-yjpDNiPDp8oatZ8N_b zvwQZvk^AP}9I|iTm4W-_zX|@)&}grJ?C_5r{ywn-(V5c1@PGIi2L{vRqkHS@CMgn4vEgOd0dz+LRxk6~5fmZ}2bchK~Jy z)!6AzmQP*q)#AC!AIw|4=HAQ|>pvt1a%t46tw#s1*uJ;2cJrR08`ixEU;M& zY7GP$)}Uc?oQK@jDpc<5kSurg==yqRLGg=i^V`jXm5Sx;`$xKS8m-pV(rE^L4$^BG|WZAvLM!BL^P9I;#fPF8Y=7C zC(C`^yT06;Tk>;#pJC5-4w(GS)?o|2+AwDI7po?1{&dOo-FFtw-+O8Lg8hfb%|Ecc zYX1Jsqn7XFaNV0g4rg9J84dGT15ty9b!gZY>n``CvKAyGSsu#F{Pl2lpXY~)tDf%f zJMHnF$|VoBRIUGP-PrASR!`n@y=M0Q^YiB&+&5+Jq0M9F9$GhU$?n<-E4RG~WEC2w zpkY25R-j>hgpJ%D>n8WI9_3KGBzdfB<}W9D_xb)r;fQaJmCg9_K>y{R?;5i4!!4tB zTw6b({_Qo>4xFi(b9m3}*+ve3(&AKh&2#s*olS% zDXaxaPkME#OXg4KvPz$x&mZ~dT*<8a$17IcJveCNja|ccyj?eT@3{@t2T!b{O;!kgP>iYCr_tHnVdXK($qhR)jS4(TI zz145yg=2$uoZLTr-@)Bu4(-`deXOo-#);+2XPlU~aPFZw3l`VE3FIj3FdYqx(Xa*$ zbrDu_FB(oH1^#*=E#doX9lJjMs9Wh5pJk2y@J`;W_ueh8xp1*;!$}6hL&q!k?m0B# z(6;^Kk8RvH{lwz+(@)I8H)bqbwD(OQN4x9E8TjSW<_5Ahh&2!qmU4fr^Xt<|0Y6=7 z)AGrO9lG3q*tPVdFM5u8@57u~Z@pKr{Mf~k_5040ZQp*p|K5#9Di8f1_TDNk>a~0S zA3L_X?d}c~0fUf~?(P@{m|>C`1_lNgVrUo|hVJfAKtV*rK*f%2cPA(+2Cn~_=lT5) zMfTbE;5m4|+-LW-Z)V_gt#z&SDQxrW$ZieoN@NJVdg=b(#r2A)wT^>(NTW(*wF0$dvlM=&usipqVMj!*Sa}Fo8`FBRQ3Xg;}BpeQ|N+fEu#5OvPCg%s}j!3mr3et-vC1N{*wGbKF(lN z$zTRz@2uh8eT!b*-nZ$_2Q{V3-?fcTd^I7qy|whJeqt*qxZ@C$j&mS!7l_$mXGw*D zr`=0^Pf#k^$LTfnW1Kq5F@8O{C%pFG0Fi4ZK{{$E+BykpWv0L(`5A*}6fpy_ck`7m zDvD=8)3D>akz*ZZAc|hv^2CoELPd9+VU!WhjEUXPdURWbnEjk zcI^u;`8Po9>WPrGZX%Rzn+Q#^lfFwb5Z87sy83p{=Dr`w3P(XhuW7{4ru4IgTh=>U zR^kgsUgQ%OLGS~T(C@BCl=p4VSk_Ith z!3@N%@q?%2rr&tFeev1PyEk`%(%u$O*D42nv+VEY4oO3{?ol5c=^<~3Z2n6(U+#0V zzt>Z0ApJ2z;Q7ca#QgzR=yKmL!s%XMB78q0GyeXqjWhb+OD*aC zCAX;=y?;5Vs^);MUNV@ONB^|33mJBF;eU2@^ZDdXW)D)R%nvj=?LC7@dF$on_Qsn- zeC@||dKKXFZ-AWT1gOOKbGL3Iyg9RJ;-#1CX7zmAx}*hU)|cZ9Mm8wRCxNzl6qx9Q zfVGi7IGXtY(TY9dX2bYNwx|7|I#9mRojitF&ZMs#qRSUwSEtYZq<;exqlU({grQ^W z30EI4nsj1l&8&m4X>kQ?U!4uRwj_d*Oay4`4Fbb`Jg`vbfSo1_oOI|w)bj*4eKL>@ z+`-d`1axB}uuPnRW9kS#X8#7LUPh2)Aa2~5HtzJmqABgLa#kg*TaW`=mnVYEx^R%+ z!UvTd-k>AP0+Zb|u-Z!jI|UDLQgR2EeIy_$yMnul3y@WufU4>U3^jZ3QvWx=frW&B zE=(buef`(?j*20ax4MC`lq*1yC`k=7Sz57@zH+Yj{}rbv;316q?;>1s*@HZQB6VQYX`Amt`MC-frw1T&#*%Fx8Mry=fFDN zNB?I30bX0cJD<+L7o1~)d(7j(SE;=rV+H8wZzMUbF!Y;on7L2J%)J=>MYfg{WSc5L zrh_(Qkj){L;{-`TWDrHOe#WNy3`gehhlC}9fsm@ucYzJU*Zcz!&v=KU?r=JyFEBb{ zPt%S>j}>5|21))P9DSB(`)o+Vta%RRyz@1spukuG^6hjW*WC)TSgw%4r;j9u`wS-} z1P;ZD!v>-XBHswhV_$~Uik=2FC*9(;B=@tMQ+t^$DMwlDqOk%je69~b4U!B*;&#ld zp@w|Sc^B=Mf)XPID7MjsB3ElDpu7Ld@%8#94ha}ai4hJYq{P07%}IO_S)BSrSSh|0 zRFi$qr#iQrS(VqpX~<~vK9D?Czza15;$1{bau}!~OAfOjsG&?_8Ph}l=*|6-8yGw&j)-}invnb=Aw&Em2J>>^rA7Vz#iiZe#ii|>vZ5BBn(RhiQ`%So zHfoUc-D4#=jO~~OK@G(UE1^Pt8&vBnK#ipy)HvDwtRj1UE%)MmEbU}e>RRk6E7loId z%!{u+mYrVPnwnK#jdh2Du&nyr@S?Kph>C)-0zT;V!capZem63=V-7kC z>+BurGS>atW9@)h5az4nZXpkk&_(~WdS{-m^DjJE5mJ7%IJ)LgK~jBlj<~TbIioQ< zTHGj(E~re8DJvQ);ENh0efK2PkcAqGQA3TwGB~J$J2|xXd_QiaJJe_8@V?)H_3Q#E zqHAJ8W zN$)>rJ7yr{Fax20ISiGJBi&lNzw{aEe7Iy`|LT?<>)}me@bwE6(YaoxxTnLr@X!JO zispup+M3$vhVts<=G>yRmZXfd=J=GHnz)qW(y;=5s6o_GY|?(phIQD zw-Z{s1}_?Dzq)H~|M;EOjs;!pI`#U01lg)N=F%<;+%Q;3t?J4i_(jNbs{I1Z3%+8qRl*4#_by`bEQC59$eqs4o z0X}Mw^#0RPL*e#mP$f4D4k#@Aeq4F&z?JXc*t_3=kTn;DULtE zsEEMKK``pzcZXtHNz~}wnO)0iDJ&l=AV3WwN&aBdBq-f61sZn!HPWdtci_D8iia3z&%@@Z}<=~Q4D@pMe7>)Fi0u>#?% zCPEtK4+=L=fEwwE(7tE#K;PcKZ#|V;d0|LN`ULJiI1D-_wckx03kR(|(_h$eb{7*f#|lKRoB)}t$3y96+yk+5 z{I{;%lOEsLG5gY6*;OZgDC{^4s>%(ZtzZ1h#9I8-iYOYir-r|EW(VOO3SZno;q{mr zOn=A-Bj0C7knZ|KIo}D0vAZpdwZ0V_H&#HjVm!`)UQKx`&_#SFwh4^~V)^I`M6PS~-s0d{XG2Blq@pst(% z23iqdVJHB5bH86M*50^-g7uB;L>s2LP`)r--9NM4T!*+G&Y%3r4ub+u+d(09tUwOF zg|uol;aA&w!sE+J$M?TpF|F&zhIx&!ZFvdEZV-d~4iTvC4hP+RfncWY3$|JuaKb$l zL<5`wF{S{;)E($%Bw$()fn(_eK34X>_%^m9!M0-siWd{0X$9f!sYQf~&*w}y_I3I6 zW>`C?1hWTXoWY2P-J8N--*$h{l=TLqJxs7vzxPwC31Bj|_;I8fpWDOUf?so#F zrUS6G?7&Cc2K;r#3e+ql3>}?IxO{yop?7G`!~?K+dKs+zTMX+L#KX2_p&+~359HUg zKy@<>bheSfc)J@|O1pxsj0-r(I)k&EBe?Ez0Jq(CK;CT&)IHX~+G`0M`LQz6K8tYW z++@P3yOYPY!OV#jFn?+mESVXPdpSa3(?TBXSn374R(OKqYIjgyO9bt8&S0>?5llAP zgT*FWu-;??cAKriVT&a=Z?OQ^t>)mq)f6b(#>%x56A68nCKC=nm@uyT=d_7AFl&kk z>mZ@9d=?LXCM?)8p90bgNw9mdGbk=~0M%u7uz$G?Xs@sWy%m;VxY8Uk4Z;Quw??aSfuP)CaW-oP+-ba5!JYS%wbH0 z0Q9^_I$gNI?zh>Kh^5 zP!`f`R3O<+4-#0G5XX0d=ty^nOrebk^Sr)=l>NUtObh?L@8Q6g-ra%+te)U&Sc5s| zc~WqSdWJt1z!QD95Bg0>4kJdA6~o+rI%dtY)HXu4fh=TMtAdzl0I75vNaDGU#D`J8 z$A~z?QJK8Y!s5We;OdZffsMjfe(jMDygQ<=Fgs(;&^n`!GkU^~GEWM|0#H$dBm*JI zVZ@<^WSO}jMh$tY8z5g_7V<1rA=lXuvZ!_=>0I}3$pY3FQ4H^6Ose2RWM25&u=40v zg1Y!em{Yrgb&pewmXsc5yQtHvE2^E{6E+rrjvhh0^*$o+o zIR}yta1X~e`5cWH3&6m>qNMjP$v`Bah76fGkh^yYl&GwSG94KxH¨d*kn=?oOYJ znDl{Mp5JS6i11lbwCG`6a_XI!oQxZhWtkU+wb?xZHQDXHwb{+Sjp=oMZ3)%bb{z}A zL=FFc?>`Ci?wP2eVDDlmS6&BI+B>1fMD=H_t;yFKlFMKPjrFG3JLqXnK+OG&@T8lm z3F(&;#aaFFg*m5Vu?`hlmDdB%c=-GkX#ycC~hnO3q6*k=Pl{|r=W&x8QjT% z8mjiKg*vUB&}gjst=Zb-Q?m>4T?2*vtcn$Kzr-*0Mt*4W#jIHIne^10-jv+D?xeDU z15xFL)gk4DrGo0*qL8Mvg3z{vu>fAEAqa^@4XN9vLyipY!`Opa5Ui6nX-bbAG*tQ0 zZfP=b$jS9(ySw+pCPv6V)jqKoN(CvW3nDWy1CrY*78kUo7ZueflopppmKI}FrXVMx zAtNi|VA5CsHl8o(yT{>YA{{m4p@yAJR0n4r zD38joD@iP>EXu+QC@RZLD=JGu9f_ivoCHx*+E@T@^qP{syQKG@i5d!V|6UR+vn4IO7AY28a=yXL%e;>g>&IFIru~uBet`Rn{uEjFsrUkm|sy9S6oz)UY1*4 zSe}woP!W?_R2Gv`l^31TkTDj3iyFd^MErhaZ<`9mxPS4#8Hg3%deyfMT+~&3e&5*e z{&OprtM{GQeV5z?U8iU<2aj@6>JIy5l^?_^LsN8dc71YLdR=Zsd}%?2FuR~4EVD8{ zOk6J>3*d{sI~++y4LPWxOy)012I5zT(z2nmYMWl&*4g{;wW0paw-(O*&m34icU*(o zFL_2coM9zb^!j8LbOq*Tc7zwFw2R8(TQe&n8VV`{QAa>wML|GbUDj9t9-c4h{iovo z#k_4(ph9LkH0_=J{ixEC50}+8JbtdZ=k}n1-lb3GjwjyPF%Lg=324M#d&PBnQo%)U zapqb7+@w>XMKQgxrNW-{a>3EU3g5=Ua&A?50k^z1Yb=02djDu79rrI5;tt4a*{N`F z@2t-!_APjEM|s_y4;s6#4D0IleKWQ17_gx?Ja_ajyYCvFdy_0myTV9|zu=u6evY3n zI1^UncUn}!J)K#~I$m7LXsgI)G}UE|1qej%ABSXan22*A6QNFa%E)2)zuuo!oPYPZ z{Q4_HYP-*Yw$9NJ6WgYbR+O@rcD~sUokEjulVYQ82dAH($2co2@I0GP z=y5i?(Bn*XuE()@@mPRh^!^D*&V~t4E;Rv~Ma2F=}e<_@SkQsmH?uNh4zuU2>=g02#2eI#84eBbmi$X6Q%q`-++d2wAJG%u8 zlBnEwWES%^&D--Oi|6*7%XfL|AL#HTSYY!wGT7o#Qi$oJtT6%cOUFSjzLE4l8HlZf zS7$d)xb$M(jNUI&i`qbLT{S4|C;(Lj+(n@g52pG;ur&)DakBCKPIC16N+Hrd)7{9Q zyvU?MuBXd@Kh5ETfMN44oMrho-plN5DtjzIDtiB7)X=b&@afn(Nd{u#sgLVs9)hil zYGCK;0@$-P4QDW7K}#_VjMW3cTH6O4^}WE=m<}Fh6x=`I{)=htI>NDa{^@J)@FT#% z_Irqv)wd{T^Wg-Su>d&>um*w|h(pT>H*QTEcjo=#$sNB|&#Z-w3kpDLMHF=cZvDBnG5c2E(59KA^mr30hKAFqZZJOBpw? zlXC^9-7dI$!U^2v9l%q;4j76yz*e#ZpMB=QS2l%Um9YSIa|kzkClbzIo{{Xq3QL_pb-6uguCN8&mDXUm$`VXhTY$xCGq7G`3U+Ia!Evn-5Z4)i z`#L?KtRD-Pj!z(*xG;&(dUrgb?A`eBVwgHH7V97aSTK!?KNC8vo#g>r=D5I)xeg#V z-v;CtSi!!97NEA!4E8TF1?@$~ptslv3>O=M@e%_tTcQV+OLf6!sW#Y;32?w&K^~i@ z0u%Q~bFr`Ij~*vLaR~(PUjspATY&E@13bDsc>AdUJ3<3kDcZoy*8@hC0nl2EfZAyc zlw&5~amp0j&Y6w4UN-+myk+s(<$=Wqr^lAB9iRM>|7rN|9sQrU2PgbIP|*8(VWyWS zH4_4GzFL6&tT2r=5Mr_w1dg&0Kve`^Up3$gwSbeP2kcxUU{#m^v&jq?hb@5CZ3&bU zRwEu~t-rZlviU-~X*)o?Yxm0ef!$N5M}Gudum&Q@CwZgy=cDHhM!zYrOD+);xh1Hnh%EyS8s z4DQ-bK(Cjoyc$wz z_3re0&g$jgrkx7BL^&OB#O>E9B4nb#R}lHD2I#X1_<&c=~* z&KZ6qr{DKafG3_W>HSOQ{v}zEWX#-)F>{}%v=TEhTcFrz@6RF|t*-^H79Vrz#J3qf zjOR%Lzeh1qA$KE_BW?(DqA!P*#-0zZkM9d=k3Yg|k3Wbtm`0!O@LJ!Kf-2uL{67Iy zJl_}nrX+t5kG1nO%-m<=?!!W?QI=_JfeOPt-zu!MK9##zzAN!`d!EPUJP`8(Zl#2W zT@i_*`eVg$eNly?-iWHi?(hRi2ZIhK)%vw2RPm2Qm+_B>mhevn{RyC<*YraT;aCSr zKn)qV`!El8AC@RC$2`jBpLP1Xztmf3eW-V`dRgP)@vw~LeKX%L@KR=o@Jw1v%!#BF zQMV{JsUxl|xh=LarC!*aS{BrjQY<(WmoLDCN^o!Rp8y7G@JA%Q|0MkTnTdM`3vl;g zx#BXYSKIilS#S5pgJzmhWk&J|d_SDSemgM5J zhNRl`irB{Vd|^|1j<78uQ`i+H7WRbw31H&+0q8fQ@GeqNL-vlpa6c=)mqcOduNKt} zU)y!$J{&R8d~wXy>VBuI$JG`p=WGop@OUXdyt6PYwly~{u`w$xwMLwuUXf8LE=;Z$ zXT~&$)1nU~r$lweBu90J{|R8>`I5eS3~EWmza6R zHJ+Taw!C%1#r^zY3g<)371H!FaH{+8KeZP2BMM+JLyqs_>-Za#31dsaTv@T%46!Sd$%_QJWo=(wH8R+%Aep zJQDpUfQ_Cz7?JEA5Tk}d)KG=_gBFDaUyiA)et%JO`;&+Isy82)oA+OHAoZMa^J?#= z1~eREhgTl(iz{jjNy@2to!p8EPz{;8&UQvA}FYjOyFXwRFp8y{`Ux*~3hMdhf ze;_>>GZ53ibt=q$cR_i{gI6kBZVc)uoq16&ZVl7caaR zk{s9{o925qL(J|g&Sadd%cLA?$e=VGO!TZf6!#~{mGa!$80Oi-lduM>|T^8yD}Sryc=O4`{;RJDh00n|u-b zdUz83YGNwoN=};FmC7_?e{(AFSi6YW(Gl|}APDOZ@#z1va0g`BmT}N1J?_iVT@&u# zmYR9-joi|c!%ACl7p8n8=;@UGGPBJ7V(Xgt-jNaUlIR=wgdD_uKo4Ww^^PLn4v2NV z84>SvGf8CsPoBu;X0^!ndS{Gn|Ix@l0inyrLo((M@^A+vW*~mG?jXEABQ^2Lvn{hu zf0A9+2@0DVL3K|#XlvwviE%Q{U_{}&I0OT(G~YL5HuEKoM|tWM;QE*s?C?+!X8j;a zXmLL!-1L5axaq@&P_xHJg8u|WV*Md~Df)j&24W-j-?tEO55(j%?>Eox`nhvi6YSko zj@~~P_fV#Qu}(Btn}+;ywDJ2!a^ifZkmw&76psN8jrfkoa(F9X+q{nOws@7`WBN+$ zWAw7r*Wgv1&!2$!MFhw}4V9}1Kik$49$Z~8?)h(ghRjno>&bF zr{=-(nMqg&iNG0*K-jt58}_cIfyz2EXm2Ee(PkI0*y;#&Qn-6!yDgBUt%1DL0_ZYk zz?L-uUpXTP*rg9)yY(RIk3hpT!quJ$guV-t2_5$*j;sAOeL^10nUVyHrbpmhOaN?{ z%K@o{G>~254hqYNpt`~lv{u=H!D<^YSz`s3Yc0Tbof$Z;Hv!iTM%c790P03PY#!_2 zV22j?|B>sR1j5-q|{STNNSmQN?a+8K_pX{HTG{cQ;{v&~@lY!gtJ zV+6``4M1(KKJ1^T3)=H^KyRKl7|z!Olll9>e7-tZFHi-$KY}Ht$>1!hgW$WPXqaVX z;vOrO;zID+zZ|^G)&YaK1*r5L;NdR|ZjrlzlqwIzd_{1nRs!c1WpL_L0mqZbMOCoB zp$0bh)xi2G9{*bXr_~4bFP4MqLlz%L<$oIfdp}@}&rU9q8U)VLGNfhz8~d9ag@xd) zu^hN2>wxXN6&N&Wpz?MBIb0sxla#Vx)stASAgTg;ETN@@`3ExfST?1P?{C%+K<)Ru$4;dtHfgZ9Cs3KLMWN84oR1-Yvw85=S7u=5Nf$KSaaJgde%ju56H^;|@Lk`ak-`l-1 zdSUz4=&9{{!_feH)ZmWw2L{$bxR_7!L%$iYcL4;cE(d}BdI+$U0zZ#kz-21}J4h9n zv6?_n*8y6gK2WO-fzo0OKG!g!Knc zM6#2EkDfOK_x%fT#yfJ~a){R60Ff3uKhh7=?K(g?M|$mX)%_9aru$9Tdv2FWk6q4@o;#c&y|5b%a6#`+L%4VsL6`** zqK0Vnym3m)@K4SL%;iX9E=K_(C>kT7-Ui=;g3Z7B$J!0~raOP+7LY!$D?Q#Zn>=6B zJ7_Pcrx_2)7g^WcuQ4xp-10o_anHSn{D|01e&ReD;EFv(26{~%`tA^{2SwrRK^)E= zB%ydvN_Z}~wchk4h{~EWMf62Rxf0o@B zaEx(=-@&|q!`@d}jjUUq4Xiul(ZKThBw(Y*3Pc@}JrE+?`Im~j4>Peon5VW5^7MCn z%e7Scl?A6OE2hF>Q*>E9mQ!#fe&#yKfy z;+*xb^SD zq1aLXWj@*VQKpys?G!%qib%*kA06-C7m*&=8&(k99a0(EDQF367aR*~@aqYy;++aA zwX{u_%LQcyz{?mjHQ_dk{^uO6<_**;ips`R?rUjK2q zo89d~ru*eAU*_4=V4o9-(fsbXWI;!Cc4%v4X?SyZLqvnHGonIpG@>Z*cxZlLA3rDX zA~!qmGJ7<@6Eo(%=sCksLp=VjNW;B@Ik@|JAr&o(xJ4>Gw?w zxxgI_pyByE^qb-MZvtu%A zWo*`w0)OAuoY25VacpQ!T53c^N?ufPQbkNbVoPjRTt{qb?D{C@p+>QFYDzds=dru9|3_JY#3o+2cxTKJ3Y;Zt?OhsrL)Y ztqBRssEmn9E=!G#FUc206;~$+3)>O`QAa>}S7boSNkKsJ>A=wdFFao$@x7=aVbGEsY{9#*5rr;RTT;R$^!{p)WOX?62;Bx4dIGU1&s!9P(vvC?u1q7y>b6y3FZ&# zWF~z+yl2|$euckpzffF$@y&ke-lv8d?RPEB>aRLFm-V|-^G?yc(|b4p30?fqsKa3q zA#L$7{DYbCJ}sppc5_n#qo!R%FFO)NFYFDW7n~G~2Ke9|2qoSd_b=vd9ETZ*@gq$# z69$g$o_zm~?BAE)D6HuFsIk5Ct-fmGb90l5hxU&7w_PdeS3TLH3toN^XL$m_sSu&x ziP$JkPkJn)yExACXhXdFp~G=*OWGsNp{uh;8G(w#kfp zbygZ@Af#uX8IWIbbXZO5z>w~~$`7Un`LAtk)1SMzi5`0}!tXPXp<8_e+IQ#0&M&j{QfX9FBE|JG7k?I3741I2sVJbUef@83&oTfAK#Vh^>Tyqmmhj zwNv`v?wE7z>)w^Ept7yzr|R-m?|vu(jXh#8&=7&8VfcuHb-*`QXYV132YrA+cYo{c<@`E;Yx^?7 z*YZWOpXu{_KjRm*env05ct#KVy^Zc%~P8~A{$8S@v}hVq@^KpOUTar(@6v-u<>TYQZ7 zG#M0A4F^hSdIL=~-NECYx*yMt3dCXkAsaIgl}iZ2hZYj9U7begd$(}Hk?(7!H^7#; zC9rdu81}3afwGhkw08x7sUjEba2KYF78Ts}+<|7~0&G(U@H4l;hfj-NF*YV6DYk|` zbM5qhRM_kMXtUS;(KRZNG7Ilu9?pTxBV0d?8Hn3c2}g$)PHciz(@SCFoJ^2fECRVz zLQvf32kP6{U?4*WtKAgbf$0XW`-nhMaRjEiEpYc+L4cMS2(^tNUe^H9_4J@XUmI!+ zw4iBJAZG^FKxPqc9K}5l=cf>kJ)1hN1?EpGgJsh*u?`}F&GW-RdZ|C`S;Ye7byU#C zU6{sOiD0$e2^^*E!Bxf|AlCWK3=L&A17NEwv}%>=@w?(u{Z=Oz)_ zZjUEaycs_(3#LsJ!R#raSO?+3%9$+KFq;BWbBQ3kz!4M{*@Eg~E6`kG4th&X!FZW5 zSS&XL+ZB4?v{DC1tF(Z!N&}dyu{pg)1sfB}IFL6QS2_rU(>RNA_|kYn^*sV1`z2wV z2qsPl#X5*D%$vf5CDX{TdWH*ZoN15s2WzZ9n8V&Vrl2&}2-M~ofaZKX(4DUfh6}X8 zbb%&VF4O?qg{t7R2u);1lp*aIX0eft9A7J;MOxX6nJ7nL402OAC}|X@c4;4bc2s4Rroi z1%tnp!FaY3n9o)K>)G;PJ7+Y&7;7NbTc&{H)~Vo%bF3tMjw30~1LFS0;AFlWoQP|{ zfw2K>{WpVkho!-^R~k&t?*x(Uwwct$K2o8Q*z%D`xY?60? zb*?m6RqO=IMj5a;Bn##}vS8LP2WGeAz~qS>7`>GP!=YVZ_{qz_xBT z*tG5e>+Zc^eO4YUugin^Lj^EfYk$)UzV>`zgvD(9kLiw{b2q@^_9hU<$EjpIZ-UKC~WI9}QfwGYN=Te~`>!cws%r2YojW`@DYp76V^v75G_f z1RvM!;KkSl3_k^+hARUlNgX_LG)LS^wSSQ6bicc{=?yz~8+>uICK!sw;l zYvV_D?+x$Tf7H8f|5bZ5zz%nryJ7u7GKaxM@9&Rwu|S-47bq@&rPU3m zx8|3e2aV4NBmaKQS5hs6I&Y7m%#2*TNeQ1rY)g+&mlz6v6YHba=b3<$^yKm0lB z!#+W}L!4-%kE|5)5ATyzKhS;jHT`o0Fus zmffTQ)6oDYJl|8|z0r3E;LjrzzZ;R5`;WoeT)gT^h%?v>F*dT_BS`x`hcLAU1O1KO z@r0JIy+!uVSz?zb^g_1>)M}5ro(IXdJbTF3DVNC?JnoQBdORR?lb9d%m;cPv-t<{)CifxTQT0_4#o%!a+vZ+)fb)%z2)E0D z37-A@OnM)$hNv7RJ(gLsFSX z1$pd_fO79PeiQeAf0s{_-vys4pG%xFpBwZd?p<=8_aowHfIFVemUvDi5&mk@SwpM6cHHOz-Bf zV&D3ZT3(IdkYA;s&#%b8-#5?yidVM(O{&=MzFWp9fCp-j_&ou7?-<;-myCZuGV%S7 z`Mdu9R;IXUpjLhD%SL_a2X&Sz*UMcD`wKj6PGqr(U1@wudr}y)MHI)Wk4^Kbj?VWh zkF4SshaU_m5cURS3C{2{1Q)$igRV1@0`7W@20rpk04{0>LC+V58dA4R!u_l`hp}tc zmuiIt?^;w>KRv9w{q_NK<%_kB1}DqNHb)Cs#I|f6r70trS(_T|U6GW`D^AGa=f{@? zX2&)KiDSBhlEY60CWf8&6@^}9#RlK#ls$LsjD5P`_44m8+6yWS+|$biA{xE&zjsoR#{ercVR|?Urw4hK%7z> zl$um8NK7~q92IYAQIC(qeyBK|vTdD>v3JEjukRQCuL1 zORouuN;?!HOzI5@5%uwd<1TUq(bpNH0d)NT_eb9wi5ik|_hAm^4@!4T`dTM9^=-%A znUBvaF1&t4eM?`Tp<-9JweG=o7t7ific47?i;`dE%gQVd=BAWH`HKpZ1EceEgN3=3 zp~1MEG$8YMs9);oK)}WT%qA`~xh{|!R~_ybQJD}JT$UBgFD(o8 zEp7?(E<7IUm3=D6OWe=%O1fyF;mLW~ z$=9CA&Fy=vvf;>W-962h%rz^|*qarcAUS4sQ{9s~*!0*oe~$1#C@-ifE`ZmNA>h=N zgfMFwLuu7Lp_G!7L7oNYc%C^|*q+%}ynY9G;~j)byf=E@Y|I~&ZX$eb+(vkHZ2P!> z9&Vb_|9aP)p4a=5UGiB9DdrT58hYH)3D;IvdA=SQY9X@Ey^{18gEc^~g- z{x+Lt{HB_2@T#4z_p+a+cmD=O|I$5o{foZ`gy{QIk-~+9k%k3?8>glc&fl3v=owlz zu@yG{RRufd=fmz5DX?#2G-yhPfHA(0!&;RM&e~M)FmV6HFm)c`TH1~XY%PAoIGB7( zcQP0*an>DfanTw+?xHnx)k*8sJ%`bN*uM#og&By-xrCcXCJ`>+97gY(8RObVmQJdH zb$=DWws~nFyEFzA)(Svvi!bO)dx7O{DmW^-14)GlR1L}A32Wf%nnQ%XF(eu4L$0w7 zE@an&L#F%Tf~h*(H5m;^nT|D(nS`e;6A71&Pa>SUf_oS~&m3O|izgStYMjH^G$#gj zEDFZE@PU168KAX^0>;}&U?c4U&aw{RvC9S+do936!32VoF!-yi3u!7^P^7vamvO1X z5p@-~id_3GkTaDqR6CJyr4us{eUk{CIEPU`{MYy*tb?S(GMvL$H!B#n&hrJCMGTN% zMg~>fg{iyN2~2PYru9ZEaM~={Ibj0yZHD+zt_wjsv>-}a15#wvumPY9HL^<3DK{EW zHlA>;6*CaWClZccoIq&2H=a=ZWy<(;m^CQ|>mUMH@s|&5_?veh z2B5n@4~!RTgT*3Euw9JJ@5L(Mu|x?NOBH~-bPohBlYkMPqiS>uwSbtEMr41^7Yl6n# z8lXK}4GdnKL2B~S9uydLQ$W2#+z0*}dar!<` z`AZ2j{!#$#zxIOuj9p+dLl!J%NQ2$X(ZF@DlfY!_WU$29O&iQ_+RDuUYsJ68QfnTV zn=b+rm!)9HSPuIBD?ul6HE5@-0nNNMu)lmQXfz=0YeD_kI#4@@+(4eJ1C@8{VBhDp zp!5@gwV?P1^iYE-K0{jJv#cHN(XyAF0k#T%gSF;7uryl)X3opNguVg{{Z@f~#2U~| zS_?Wk>p;6~9cb0B2hBF5dp+zwvmP|ABahdE+S~P@GKBnC56Z9}_Wc2Ue0DR(8icK+ z9)vwTC+w#=%FhOS_4#0Hycnz;mxBd$6`1+10h6$GV3e={46-(Ye#u7AtK9^82R4Cj z*JjW;ja=Of+7CCw{@2K-&7kpPGpNIV7{Pyk2N+_0)e`Fu_L5o*&NUOIX8>`}-{7n| z9~=yqfStn%u%)a9EAMq+5wa1?;x~b*cncU8Z3W}%tzgu=4GcTBfx$^BFt{uQy7#3( z=N0lv3bemV{nP@f@5mQz*!DZX7;7Nb=>MHi2MKqYyJNoEWB1?SrZOLhx=X;>b|pBu zuLTG8Mz9Uq0@g9xz$#4&EDCmjd4)8XHDXQd&`zw2$$;?%88Eyf^UL6+>`#M_vfuQ- z%YM-Z*^m0L^SuE`{|+$4^CkYDh;|OeV?D^Kb2vwdCLiSojep3$Gl9J? zOtp=LQMxfBPfg5ipxQ5Ar zOTwNJr%d^ujzx;!?W^|<+qEcvu{omh*{VOZy})V*W-MeCZ~ca4j7zf{lJ zf%5MF8}wEZ?@g7|Akg#jFryTJzB>?Wb3v+0F_*Ijb2(c^cUJK{ z_#I%6=ewczW=LufSO*Ej&t(XHH^Q(s7p}YnB6QaL471$&ML?AM=ucOA$K~yR(9$TQ92J~`j&jz@*{P4{NoYi?b(mr4D$=UpGzo_2j>-9!3dc7*iFsGamh{~&2t z=XZc3o=-;K>xI5sG6NBU-_Z#CZba{%4Y5j#N8&Zte2F#NIuPZw`*kQq^%K)rzRNLorRx!|7Sdr>H>r(ziPX$^K&oXtbF8GlvMHm#H!r3S zn*0uMK@AemDe=9*cqdW#`$DuG>mYJ7e`Y8w_>`lz@@J*!2Cgm?2O@@z4Ja4sVsk9qPOXOzUA&~na=9{DV_!= z<2e@H(R{nZ;X>!uuy|5aaJol*PywYnpo&_~Z>8Y^LRyjEO=^zsJ@-tX$1dsI7j~)M zZ>)a@xZxeJ(C_ilZ$+R65$+vK!~8+E%=FKNduG3>+_&U$wa$i{<>tH2=R2yO%=9qm zN@ZEJC-CfB;zC^Nqhs8vBT~ra!W?RGXgNJUxS5e7IL6ErTxFyM-1bcNe?Us`d+I3S zy|nus;Es2|#`A-aDBSs%guQ>U)TE#JJEsno@1FIdL22Q=Ce8JiYfR)$m)fg!=errS zXVER1(z*7v$w9=5gb4TIxCGDqm`r+hR54Q=QO`;ZKjM`nyyz7la)TZ#xaS@n_}C>f z;JL%^05W=hiRTQ)o^vc}NX6cN_O^+`#XG0Gui5q26P&}ic}RV2f0L1HPqnS;;Zj%q z<^rlkO*Y5AT+AmHriFRn`(UWz#B@fgsF0NySHq5vIn0TPKF5iOxW*KQ-JyhrJai2S ze(Ll)fPy~n7Q04|;abzI;@5&8aqnoktq2R1Q=- z>(!P~%*%>c_Jw&oVs>`0N4hwgnv|Zxj8DyDM9$sjef5ow zy5%+QW`z|DyX;aQVp?I4M?!uCEhZ= zxX}-ZzXRx~LE?KOQAaZN{&Ut7ew1w{yldJv?oscy30JR6%{VvF~Qiy=$Grkh^9*!~Co2s;?Q|r*`dcRZVjBSZjLeXkS*r@XFkr zWt;LchYsbX^`Fm4>%N+n)_F4_t?h2ipMZ4y{H2)vn=tcs#J8QbQ(Jf3(`f8qpxxk}NROpE5(8VeW<=C)EQqaGUzt?At|={dvO6nd z&5E3qRnxhN^P6`1{7vHqYB`yY%+lXn}W$$jjB zc=3T4<=A62wwXJIqSJrdD34!oV+@`0w^@2D+^zLcykFh^w9xY1dC`SC%M!A;H>9L) z?MhGBJdzc&aVk4vdT(~v)Wxi@)z?zPSKLg97`_|xCm`$J`wVaqlI3=27TicXF`<0Lab7SpDGs&cISt|!p<#Z+p^Cp(qe_wITnZ~e`3Ux(YJy^ME_ zf05=D`7GZ*}n6k5H5N z@3B@<-%{*DzGgf7eJOSK{M_K>`l;K;@#9KgyARv^Y~CI7wSIfY$L7g1FPl5BJpTkV zvEdqUkk1oza(O3>oWdG}{nuE?mfyV8)gZw#1PUB@4+QUF=!+ENJ20}q4&TS&sTL1G zT2T{2+IPt7@EORLld}VXbi9a2nLf;uI0yohOnm(Gk}gDL|Ks2afeKXPjgAs4q{4a5N^vimfZOkE>n`F%n< ze$lD5z>W7Xgy~tB`;$PCGa59wu@41rAeiv`g0+ArI0|9k31RFxA>sg`qBamCW{JOe zO(9>x2r48EphZd#o6l&&_+l;C^hYkE138IzQT839k`0*uM{nZzj|i##PN5W`2gv|l z=0p&oN8&t!(LeZs8mA}dE^-4yE@v?3b^se5J8GqB+km6^Aqd*W1=%AGM#qo~;$V1392n2VLI0yT z==~G}JrDz(e-Xu>3uBLGM{^Fs8(qwt5AxS$2VcWQ;BCW$*A)4|Ekp>M5=FovR}5?` z#lgB&0<3x^!E#g*EG8wve3KNI&q#sU5#*c{nBI~Cn_A z;{Dk<2jPd=CJ=p45S}Xr8Y}{TOCIob6#%awVQ`NZ1D9+Ga4MGsho;3~-@O>@hNaO- zNu!gJ0qY&eK^d?*BLkNI$bk7188CY<1E$|)ew%{KPZN;-ZUT$H{Q+>nzvaErLCn=b zgwFXObW&k>uQ|k=2ZEdgz&}6)d}77HD?bv3>D^U1k1@a%PK<@n?05_~9_QU)if*xe9H%K)4pcwRG z(WX2QZZ8NSzM>EmB?*D4GT>Jz2R=0l;MJxCp8d+`gH*tMQgzmCv)XUBJ!(IlkE{Q1 zx~%@y@uB)B$G7V59KNf+MhEoL5mcT#g7Tk0?M(YO|IayySgZ$0z}%gLUM$g=2jXo6 zA;wb-qQVzLM3NkY<|;vOrRr>8i~3Lh9?c(q!&={bS8IRq*`V{uYnSdvk0W~T-7o6B zaeJWu!tJg86Sp6_kK94~0Ty-L_5h7r9-zJu;En!aF8|Lth(xTzNJAf#f#=;BhCGmF zDF`X9;*b<91M%^Szhbh~zDJg7eF<;S{TSM*|2}w-@iu78=ykx9@k_sLrq6v3nmzS7 zXa3Opp7~wxw`Mneei&c(1;%AR&_Cw~x@YmC-9q5CLna8v+&g#for(@38}}m*b9Wwk zu{?7@tjiIHEPvVW=`kvwlhd`{ClumlSlS9E^crX|k3xO?{m>>#s?_B=R#ChbSpDV`a zvJ~GrP--dwWwzqqioNANS$D5>1yUVNkNt=LZc8!&fsNuE)Y&xEzZ3=CBX_%dQBp+!hIDTO+}AA@F~_Ob~;)ckaA57w1rd z-;YYXdr*zfWsNc4_d08_4>j&`FUv#J9~Z?L+|A82|0k>1=1O|4!-bS3&S#Q(-A*Qs zcpQ(P@H`y1#p^)qL9cx=7rbX;9(nDE{p7Ye_M78$+%LPev0ybB3ziE3q4@dZF>_{M z_AkW$u0T&$i@&QHbvS-C8}fc^wG@5T;v)N~Awd0hbu{B@S*peP!hE|^c@@sbur}v# zW~b-=^g*9JX)AqqrcC>7OWy6jIq8)DhQz!6Q%P^V*Cc&%8&CS`v?B4R-DuJ;+l9cg zOQwG_XEx@o60CQx!G3#9`2UY3+HBuC4Y=QQn+ZMcc9g!|?yG*KIl}O4ZIb2jifo5N zB_*zV3u`=g<+u85%kA;soHG(Qoi!P>E^~YEM8?sORp~c^$I@Q}45z>I8cO@*Hjwts zsXz6*<3d0LuEAX9%oW8mXMEpZgFHG2720fud8?i63}YN? ziMQNepW(2py1;E)MWy$~(ni0j;?BUyqM_hb1*<~G@-~Hyl3H|DypuPgPLtf>oFRoNE2qP#zBxO6OHuw**2uXs;XchR}1 zu7ZaV?fK6GTl3!dHs^fsXwLcQz7P4oAB(vONRU& zR3LB1l_?K4sxV#Mt-*0}tEuSz^-fCL*ZAnIUm0e;dN|HubTG|*s4v&Ix4Sf`v#Ty_ zNk@BRPJ<{a+upD_YDNpX~mZ4lYsLFP9##ne}i-W?(X)oQ0$zZb;<1zMwE0W!MmS_94 z4;2SB_g9D2_qIk=b@#=Vc8$dsc5F<@Yde^jv*cPrcJuwHtcE9{S+y?%vT9%XEd(Uv zKICKWt-(38;n{z`6#0zj|Bvzh|MgS6c=ubGb^k#_!L2j4a_hEvXpe0SG#y$OY1ciG z=-M`(;nTFDAh2enGOT=gQ&bVQpU4{+jnC>^pP1IOFEOS2a$<7l-I(OI$6?9MF9MUB zUj{4$q~bmlVcxCBd32%&Std^2V*US}y&UAi1x|A0oIK0Uzx4U14_V8s+Uu&hY^T3b z&(?68wvF*FjZYgCv#+qj5aI>bu;y2eKK{w+h>d{KvY&1nm% z;bYEfy@z}lZF@s38)jl0E4L?m6mQA)&D~TSl(C^UJb8V4RNT6u*r>_LxUe-d@xiOl z#RZSuiw+rn92Pq8JTSEXMZiKpHjZ71*}DxLz<>bxw1$UV*@5>Dj@?QwZ$2F+Ky9Zt9AV#>!^$pDA{2mspzh@!4 zo-ZOBp35?gKha_zcxWu#ao1L^;ikJr#ozvn!YknxSr_B&Q_iKk#GT3aj67B88~j&G zfdBFSV6P)<*q(An>{>k^n1HpTjS$!Wv8#*rE|Wv=bw4o{q^3{{@^D!`~9C>7Xqr#KXkB> zA0u>fbv>1wnZf*j0{bvtqm#A21t=pwrJ1{bsB$!a)8ni7YATlh*_ z3OoXDq zRx}jc@I4%Ui}Agq*!MDC-UTm+J3^tdE!3)7Vnc80g)keNgH6p7d?FGtqvTL)rOn0T5xYcuCFHK z>=vwn*o*o51cgjoBxC>`L<>5I3ZPT+fCukkh%m>2G~UBdVhaQf4qwn;3b0XQfR`y0=iv{Fu?9kc?h0zGPN2hPkM6++%sDKF#K#9cy)X_a?qkAx*Gr)vZAFNn){`C&- zY%1W#rT}5=vJlU{7}D4!pnzQ*iWlVI9tzoVgpl#mSO;^7kb2yQ0;~l|enm*c4?+Tf z5KmyDxBwf)0iRJD5TsgyD3cjTF&Tp_lOZV53_z8p2bwf(&}G&HLuNHFW5&V*W(=e( zGT^}?1%52z5XvG3;R}M-0cl{14#Gi=865HbS&n+FU}wq>)^?m=;l%|e;oQJT<^kP& zUeK=L184jn|VQHh8L8NAm?~N=@#;o2NXW=fZR`RtN{5Rq=5?- z{{bsiCYW;&b1udO&(fTAS;5hm9qep5!Pwd3>N>#Sglz{Gi>-4_YJq zpt*)0G&UkT`9b{eOf}p=#5cF0Fg6?``yCCT77Xi`*yCBE8)hqSWUeN~AJ13)(2Mz)Ednnm9&91b56)47;E*N^c15CK zQ!55m=%g(B#ld0}nGi=GBmrhK$WaL}xhOGfd`|+aFT}qYeii@B0PznD5POfjWq{~H zfD`5_Ps}xQbr3=5K|;{QgrFA-LN69z#|ysR=!3%12PKPvYrX_HS4o0nixfEYpc7gy zJ!`j0`j_pr%um}LGT&_u$$YaqC-cSfuFMCES2AxczRJ9^0O{uzu=uG3NIkIt$%Oz{ z9N!1?e-QeIxw{xqczLw4mvu@Xus-OW<9_8g4ri2K+22-vX7^J0k^NVt`}UxC#~$Qw*@N6a4j{V_ z;DO@@VD=6}qUY)mur4MMvwxxiC&ZcaVqK09L&ocYaG$ z-}v;Zzw{o_cfCd^rE|;mrS^5VubP+LK>dO{sGf5N@?4O~>0cq%@lI?_kCi;kfiHnqZADyE3IwD{7d03_9 zlaMBzhe2I>_X36tZu^fjZu(6dUiY0byy|np=#uvhqqE*Gj86G{H8|l5x<`FM>#!ea zU?*Mmg}~O+R0zY|8;6;1t_C3spNl-KUCYO3BF~8XXO6Ytrz{VNH|e2r&yo{V9wuaI z-Hj>HyBSr-xE9%Nd^x<&x0qbHv6KcZFfiRw%ZkP%5Gcu9lOopZ>={( z{xV-51tx1F!EhoH3>E^feo`SC$4|lRpNn%T!G3!c_&cjwlm4w%pW{uPDc|E7N3lB< zzVcT~BGk|2C+VHc&M`ikQDS~Dt=4L9$`ad|{MB(V`L|795?J;of!RVp7_LDA=DjS;oW=Uft=RT)WbLICP}_wrNWR%Y}dlJnv4zHORrdRfc)99?#ud z#$!Oun;=Y?J9eqJwSbDbEN*}`Xtk-nk?&y$|C#mvMT4%l4iGM zMN2&g3YUBL=1=-8&E4+Xk#oXtN%kGz);af)_0_p4^QV17#;o;1KqT%%3a&x^T;9St zG~&5?hb(#5r$Bi$tW3Q=uEBbG#7ywepp(o@kFVP1j&S{{)_Bv^P3hJv>hm3z*Oa>q zR5iHwRCIWCl@0o~m#p@0DcTaySa>9$zTjp+UBO%Ln!Hc0)w$mst8#wXEd)g4KBVCq z6yh9eF!Q!ZlAlYZ$*Un5a(A^1<>I6o{rI>E|K1UY#ajoxRi}DG^;UPqnvS-oS`W44 zIP^7@xGb%&^=PkM;@wi+=hslVGN876V^CGu!JzWeYe8ituYF64K6sQAesL}?_~Eb+ z5R3bef#Vlr_O8RT|2A>*wNHXP9Tg}4;MwcEIK6W+B)MZ(Xky#h(1ayV zf)bkF_#`xZ@JOip;<6BsjQfy}xwi&$cN;(Xf%X44R@2FaO>}bnAol+|w3xbauQunJ zo#rCLTb$(kHu`9GOocF-CS%NNRwvt)ugrEXT2btgJ5uA5vAoScd1xRgeqc>VO#hD1 z$llW-5j~HCBD>!BMz(+Oh;04rx)6|tdr*YgzhUnDpNG5}#{PqAS;(pFc=nEG&s+Zz zr>s4u!9IG>M5up{y-deWPqn6PL3%ZtqfARTBw80tWjJK5EpSbpsPar$-QpXwsxKgX z<*J~N72ARXN3fa8@`r(egKvBSdp~#tE&c4W5Ri$VzZ|o73)Ua>age{qnaDYG5Jz|8 z**D$+n7SxPR-RK~9Xw^o*LmDVvgxp!QuP6U?UKFWhIzZ=%`1RiK`@!i+$=COOs!*$mdPp2IxJRP<@^l;q#+0|+4tCRD@4~K<-A{@Vwh5YQL zk!$0aJvT6sBQs27=W!ZYdzns#p9+wkC-O`!kF?pV@0$t~-?f*_zU`@ydNW8Z{zjBe z)Za;rkSkfH{+CKDy)M+-xSd;S=X7Sw!S2)+N1MO?a?er+wB^2${* z?xml6#EUSM;OFt0eoxbNJ)aaBxIC^ga(LKjV)J0s%<|qQbMw2$&CG5+G&8;a$<*`; z7@M5~qlJJ5g1?tB|F6P37@P18#BM6tb{zXaTwo#tw^>O0tN^9%_hMSfFBR78pSp{Z zewgybe76@4|L!3k^eu3)@7E|f&#%dfu3vIg96pz;+k9@(wEQ%vW%hBMw#kRR+D7lM zY8k$Lt;KlpOUvLHXf6bF5^`e{YcSRma&!lU%pAfRh|?6Z{3?~SKcJC1;H8v+I4v9V zb~5IEd><)S7+7Epgrk5jcnNz#kf;kpW6#SJDI3U>#uoy}m_mn~5sb()V6(hFoRrst zTk^W_R!-;F&jq=?3?0lQ?!i{f-{>Ib^7jg?gIJ39AZi~|NHK6yvOtI_85T1~gA!{f zXtDc)A*VN3a=GK33%vh<{vm+h8r_3ABng>d!4(6lM0BA;R2x=^X~HHkbvQ1j26vG6 z3vvY=$SJJDI5#?7t}1sKHP(ihwvG|HRw7=NDbEH26HBH zuwxPiHzt1YrQwAR8XlrA2)>4h2`tb-SfLBC(qslpJr*!Cp@X3v8|ZnmgJu{9s3viO zVjd^RRdIq$D<>@OK0TR>5b`B8VkDO!&v1{xg`UrW;27*7>Kmb_(g%9Xx zAQr|H$G1cWVS_Hl278HF>#%@@F)NtZuz{fm2k3@yf@T6IsO2mIrHVzM(7Xubx{+mz zKz1e0X^Io1w<3FSZYOYFmyriJuQxcKZ#WlV0}(_B5&Q$@=pU>RJIoaJ=!5LES+GSj zD_B~wftecz7zS~IUfd$k&f)@%GA>YSIpsR&ashT4Xa9DD1}h9bE+S7m<65 zK;|{h>nqL+IIt1~=L8(T#TN!Fm2iA?5RO;};f(ppNrMI3BcYSBKquvlPRf4~7)Nsf zBb^)cig`e%jt8{bkv<;K9N__tH9Vlc0olm|YKM?>+@NxY8f0W=K$Ps9`2YmUC~Lon4u4H-~>A#F0hK=0rM1IFv;fwBXm-R zE&Raf<_Cji{GdOMO!0%>He^3P=$z)C)xOF9Q|me3SItj+pEQ2+y;ld`x5(>10Cw_J zaKVh}i4MRA^R5p%Azv-54>Dp058Fjp8^jGxp}b(9$PYF-f?!oH1Qv}*r|@sH0pVX} zD};ZTP6~fF-7NCeWUt5qPRhp>>w^NZJ}6dj);Ux7r&F=$H-}oWFZN5sKiTz4 ze6SsscxSU(@{P>~$=6mhk}oZfOFg%^CiU3-snmV*Pm*`cXC-c$gZOm|5W8XlqL&u{ zTyT6JJZlfc{5@9#5Q%FMjeagl5ASN3aYC>o4+QuL{P2wu`Qn`__Q5M(@~ubZ;#Y3X z($8JHWS+VV$vt*nDfiH6z5G4LoeFmxjw;-;zpC)J-BX3j_Mha>+k@;G2aq}GfZrMi zkUG8q;Ev<_WA+Zk>^pb%9gq8xgsw74hZXzfaLz{C@O+K*6nq~RCi*HQQR-P>w#*~{ zQu+J7^@?|V+Ldp5_p4m@TA_N?bFJDXkFDzG-4Cjtb-SQ`((R%8F}IJZhuvqD54eNk zK6jAc?E!K#9w0j(@WRg@gt<2ob7wsMOvUFS1HY%4nsn?{!|^r6g8OZftKhTvAn^w= zvC_9A(-p3V7b;%~tya4b(yVbdXsOnzz#;7u0pmKy{HJvf`_1Sc@I9%w*XOq0E}u6# z+kJm&Zoy*1O@5%V(GQe1ECBewd_A_exu#rCvmFKQ zX84I;Pl=Shn3$||CO%i~ub48eqtSIbha%hb_DA#@>`-mHImpnhdwbbsBGq9WO0DR>b1)^~LxvZ0ed9xUEcZDqFTa6O+ zRhfXOXEOyJ`jwbJr*&BE9~KYKEcpF5ZNa6KA?$fq_T^01eWTp8gdCr1=%`-d2dw)NSFtY7Lbv${P{ zWwbR)d#EXq(OaKs(p6Jn(N|S>dn(?yFTl)Oh3nBQK;CxYy9bxClJnzOdoV7~v};tKbK^2A zp^1K1=@mWx%0pcd+P&@Z2AwVGCQF*~EF0^~Y-(%k9V)9koXe_~xfWGSxaXJc^vEea z?U7ad*e$!{t3!6tZ=0+_u*fO^^Z7sw`j>RfyTwQ?FPUA!L+yQ(A1RCd~Mkk2^~CuJBgu7!KBG8H(1g?@uzW>dmq!U0P&Q&{^e>)86Ww z(bngd(mL*u(7eSnuIadEbi+N**!oY-v9&+#VynSAwhAog1Bv(?oAJ#N$9o7g|^MMrHg95Dk zuVo`&+v()mAQjgDv-cDe*@0)D>-Gqcu^DCN!5s{)t}WIgEgM~BYS;Uzl&=lfDx8Qj z$XT6gl0KemnKV{r8#mhE5IMZmIdu7`Tj1bEcfWxn?mm6D-F$mKI{7XAY3JVo*8c5a zH6KXF&tJm)Z~nj4gSl^nife#p@3;n=_E5>nql?JU5jm!%2X#4G_F4$m&NxYy?eJD8 z*cPImwIxP3bz`z&!gRK2^!gIZuyu8|L6e;herraYyv8>;yRSU#;=1Ctv+KwQ2e;+F zZQKXI(xV?N<^$Pu+y^G|t&NInfc{~eLXJ#R$*#FI!1pl>on;|Q&q`8SPHVE({AI#h zddyxl@34n-=D|RvoF3x{zqb65$c^ML~N5A_uC?;4C^{lQua*}oOfez6zA_z5OF`=w*{6C%|& zl$lGe8F1!awiZag=pvqY-cKgxT$p0`nK-qe)9G5iCkymEPE<2oj&{H3oam7D$5Qx0*B^q)sSjzuyw5<1?6h*gNd8$q~D>dx?Y16X0 zzFf!r>a?!u<-@wh7w_p9pZ%z9bPBYMj)NAWIUlGez?k5?h)Q{>cu^$-h5g)9$g5JCE`MvWM@_ZL2>iRZb!tqV!V%yin zvX-wK<;`C8DHy+;P&9nLThZXzRR#S=Zx!_J|5DJs0}8sg|I5oxbTA{B|Iq^-LBCgiU^ziyHo3BBuXqxw!7njpEur{u0;veqUVk>jyFQk07r8;lJF#Jvh4t9Sq*b znZZ4nI*h$A@h(O?)?!p*4M5Hl3Q2)QBo>6JVVJc8K!w>0?>e}FG1fp>v)h9+hc&tf zGYH|rmqKtGplsBEGF}ZVxKe`=eihivuM8*omEaM-0=(x_fG_{y0(z+9SckC>9mJ*s zgp8qwnakg`n7{Mx5|V_q7*RkcA?SpBL6qtNGECTmf@Tj|%r?Nl8VGZ`DcGTZa6|v# zhyEdgT@6y$6`_bj7MeJvvGJ=Etml-3y_^zog;N~v{D+g%gd9Kzv2`Ch7~F$ibPx^b zAPR30l7jUp5m<{cR|DY%Y{V7k;Q%5OYmlO1TL-EMsABztHccNGG#xNU|6s?g0&dLm z5Wpf0F)ZScNf(9+x&XA%d0{!78`h(L*!&+3<9(o=y9t@ZJs3m>(So%gCD<1v4etd- zqKEN&OVEE1;(%BK3o*xiF$RA0526%ZkfLa#d(Z%7sw!xrd(fxKfeDio*f5ErcMyO8 zCT@tKVbMB`4ka{vSvd`xmi>p_cqeN503jo|1|3)nQiZi3+4vm9VJ%1?u7T@ELTqt- zbHo@i04mV|R-%b>QNw3d1%!zrh*RW2nj!-V6e&=nh=UGA5DY0iU`1gEXDSQ$Q1Op< zDuFm8@jn1VjS9x9)PG%wi6#vU^=P1H!VDUAETH5`2boYhNG8%jG?xy7m2}{1Mvu{r z3?XAIz%|JNoLi7REWmM$8Q3o}1KT}jV0}#kmTxqm0n@+#Q1IUbsL0&U|BE4xZ;Ji9 z%+Q0FVJ~wN9U3re1${p@ z(28OQ^;C9HDPRZ1YIcxsMY`ERZipRy5VDpXWVW!O4?_N81F64RvC@GRBtEeI68lB} zE&}u~!a)Bl1oTe}02VmD4d#D)!~y3qSD#~tPRa(on3X;HATM?>L@%a~UQ8z!-BdXz zXf!SY^$v7Y{m3XM)(3H7n&g~Snc@7ce2n9l;$@ESijO$H$iHX*Aor8~tt_y=MqVN> z767d0#>V{bjJRUnbwwBBihj=7kdCiUX9GKT4zLX71T%C}#+h7TSc0`mwcNiAmT>>n z@8SNgx19T{-YV`dy6d?=>F(hEsC}6Gz1BtUH<}N)UueAJdZPZ5>ybKe-AC>rw-*5H zaBLUM{~nmXz3`_GIw4kz#r@MdmG_%f0pDkfD!vcqP5kf7 zy7=Fi4GO$69TRwIx=!G^@iu{{#s>u+8=e=qZ}>pqHsig(4aP5ls|?`3gq&vp-?;?< zN6gvoSYPgg=k5OJAA)f$LU2EVaXx>d<^wKR=kJZ#I{i^lzkV6grOvEuj`=*IoZFPQJCPn_TbuMCkp zo<(9e-K!=3c59Kk;<|M4Mb~AE&%2CEpK+d+Ips7XbHee2%u&aiG6x-A$?SFfv3R#5 zNbSUne%l>Ee5)gf%?I01QNRz!55deAg+CK8`zPUZnxsbinV?61A8W?`Jj#jtL4-g5 ztlCXf7GW};gHXW;sNgorM+HTm1aB-Dev^Sti09z zsq!X|uL{%XU#9SXcI!M~@uUYx%?G^jvj^h%5t#GhF?XlpzGPtCf2K0^V}=&<^Hf9D zd&zc-t|xd2T!;-5I~AQEbv!at_HcNi{Qj^ir9Gid%DX~3RksHZs%;HgslF*-T4UOO zkH(bW8O;g52b!z>KBBOay0Rdd)y2_D zD+-d;mgi+@4dxW-_GVWZEX`~->`3o6UXnIq+MKe^tTB1Uye{dSc}>C-^XkNJhSiCn zhiF$Ng64c61lK6!%gk#sCoC(|cUYCDow6!Pd1zUZ z`o*Lq6&Q$aaSCY92f}b4;&J@B>|H$PAh^h*Mpkkev*+n<4sx(Zma=21F6(r=CGYAM zXVK9{U+KZRFvZ@QIJM5oRIRqM9KGg}5=KK&tw~K`n^|T4fMsdkDyyQLt=0wECv0*v z?^)+&em2X^1f#r6(9g{P-T6QSu748t`^!PfILVhfc5;0QjhtJ`Opf)llHG%gDVzGW z=#$-MJS#dKMTXkErF&XJ6gwJY)LQG3wHj-(^lGb$3@a>{df*hN&mvx=;oHH)eMqo{IV%m?D}ImpD^TgpscHBiVE z%w4AksN~Qno_nvxzqi-&lNFOnOarS8IJ#C^@wbe+h}RAK%2p1ADwhnzYUKB&=w$cg zFw&Nm7$SVgrhw+U;VvJGzDXBXIX%{H*%tyNINtXXh97zft^V?L0CdytEN z>SF%C*^0Rnv*(HB6tWi`z{V-eJa{i=aHAY`>3UtZ)^+B*brVh^6|1}#7p)9d$Q_GT z%@|G6N*T`5OITK97(G~H8a~iw5!^Rq<=?Z`+Gpur8?Vl*HlFQoEWO))n|dz+BcB#v z%m-5E_JNR3^_abJ4bEWpJB)j<6Z7Y~P1yf$C;Eq-Qk2&1nk;o&O}NT8*$EbI@Q}z} zA0V5yE>*MH|Wm?GAZ~wfsos{1{eF#Ka3Kxe}a%Lcm}-+JxC9}m!jp6FsVJLLMz+PV9(!U z&6_pjBAl|*S2BJ_sBF}>Sf#M7scM0n^R#?7R_J<8w-~rg4H!DEoiMhW*kf$7=8CcP z_!~o;u~`F~QP8s;0iF3kJ|W-g2)W*c*>^eKKfq^T2J_!E=D!gFor_iJ12n$WS> zv0KM%+f^OY&2P0$H_U38t_Ka%b)Y^UC?n*~5?q4;Tmy6v`|%mriVk4S9_&GYcM+OS zF_EIHtR(ZM2uZoA!W91xgC2R^nlt2@D{sJ6KSA#+;iB%B5+s~2W-YcqUn*;Tu2J6N zY@ed(=`~75C-*2Dp17vOIPy-3aR3wz_91&fVLo5*Irtl0*cse|!}tu$paWQscOga& zV)nxfUWM=G$i7J@$uERR>?^2Y2?+(8Xu1EtG$1~r~3LcpYn6ySAO7b!Fr@4_zdnw2e5uG zIvA`4X+Mb$<^tw#bO3SKpEL+Ph!1)YH{cDWK^P9xh2R!l5MKX>W9Y&5;xo7j9mE*cK`ccFQHu^D z4?RpG)}w?x#u|uM|5F2Di}SDqZej{T#1JGY`XEQq0TqfSXi?OFK~)3`sth<#CBd6X z1R}8RA&rR(%4uxSL1Tp#$QJYvNB+ZsEre{_h2H~w2KtX-KUDNEMd)FYZxa%R9>(hh zA&&0|v79A1HX#h45nW&>TEI)xaV{z#f&M{;$bk}(1`Tu%`V_pJfbPK&-GeWM22uD6 zCf#{=y(8r&8 z8dT8IV*(Wu8pztxK+J;%0wFZuNOLI*Byt^jf@6O~e*f=z{D1%be}B%6Z-frQ7(Iy5 z+&nayK-+)@>XtN6a%Kh@e`b(~W(JWoW)LW32EJ-^8ZFGgy%g7HkOqrZ(13H21{|B1 zfPFU;upMIp*2`3&KcoWfJr$UK;(UNIi~K?t^b`3p4;-HYrdR`EHpkptutvu~7oC(D zGiW(7gQ^b;C`7P;Ofm~d=COcy1q+BaA{{Is(#H(KBg`PQ8rNzX=ePs+?hp+VHVt_0 zGtKh6Vfw-Oo#`t(P(QN*(?{e3@_rsTJ_Rf=+gV|qy(PK`bIiMD=z~m*nZeMO1#~@G zKr@66s`2QivgjaRLI=4zI>@#n=*DE0(Ls78%k1KHEWZ|SW%((!pXIy6S>~_ecbGql zzG8kS@{RUN2$)|81M@TF=>mYc3TU-x2e8-**1M8HmSisa3>y!dm zK`(|CwA0u?vw-cFdKKFb^(MA&YMpFf)cV;zsgAOJRGDCVud<2tt@2*h*Gi{YUn<;U zeJcNo{!s24>plDe-9~Q81MA<&wRwOQj&F}S*9r5t3;uM)^>9T;=ZyQ|XvPAzj&!i} zVf$qk!T!xSnf;StF2{RD8OIw&9p@{9HqICNy`0bVhdH0%2ByOHyO?rzR|+9x@0 zYu)0!q4kRMiq?0|3tGT=204YC)CA7I<^gu-ADq!YxMTM9M0{~hzW984<9>LcBXqT; ze|7R;`(PKs@!BSy^SM>#qQ{m+Tn{X(x$j!EaNjmx%JYx;5YKh9ao($@)4Z2VcJW>? zInH<1_y*re;}?9#jKA|9G6LQMM!>TV*=+>e^8rWv{O*{0y)k$CWA+chIfddg5~9X5 z8=yz~>|;TH?dihy)GdJXzH2nsE$398>rVN6R~*avFF4iB8O}ai0rqyAhO5$vB*yA&%)cRL1?oz2yV0nfelu`KOb;G|KK$@KIYv}%$`x0 z{bTSMiB_h5j?iLy6=KBlFvyoIS+!_KT(Q&Pm(9E6I7`WV)SS?qODjjM7l3J86L!UBs50oKya$)o}gUuU4f;N z+XHGBZ}D%H-ssmYGwnMpyUu4qZqj?J+-k3*^5dR2WP88o9 znJG0LQ7FAGyh3&|tWkb-NQc78kO9RNLE}opfg6>V1?*QD^uMIi=l5K>$M1(iw;#xM z`GIt&A4tsyU%QTLfc_&2vrZDOMLIwEnI%MC8C#+-8eOBbJgQZBD6&VjKVnp^CwxkMY3Oc^&X98&ZNX18 zmIQxQX$c0!=3tORWSWEiFW@)#9AMsy#mt+ExjUPOe9Ge?4+|END~0^zWU(UUK#>7` zXTA;B#vFHnbyS@IYKhvR z-4uCJr#}3Fc3t>q_1bVysR>8Z91imH`F9^8a19bLZ)M}x=OTwI z4VN0qj+gDvOjGDi&r|M9D^+bzsncjpZqsT?9MGvx zSfyJNw^gqy_PAbo%w4^*=#ScE(V$)$4JwG@d?0A5#@f`nU){Dk+q`3azz9}jAI@t`~(ECt5zBA&UY;hA$DD|u4N zM6Ogbk<;~f=e~(fcH-Tb4b7U&YZ^>BMr$4T2CFhcTJ zt8*)~Dsq~1OS8N63o}O(^7si54cZ2W#LrcZiY6b~W1A5+nAZW?SB#26vH;+5pLx>Im6} zig?AEvNV;7l05a&;xg@`!g}4jf=+|%yyb=&IqQs4v-cS%XI(K)%6!d8%J{95oB^82 z>7X_r2%mcv@K3yKCi1R?Lax@weCPk&VDn}!~vP3((yjCxxwA~=JWXLeFXwo>YaJNZJ{w0&>yjO-X zdB5~xazQI52h`{DKhFaGnU_Z;cW@0ZH)7ss$8+~?3fbI`f9nqNk&!_KYJa~TYiExo zcT1PEU|olgcx79NbZKj}d|`8va&BXmdS-o*c4}R+9ARZk|HX*Mu`(DL0INeFeA^iM1hB0$tKZHTN zo3nJaBxzlxL91J7%wDm=mbYlcT{w5SzeMIxxJ=4GoI*l>no3M>o_a)2xpv6XCcS{p zUIX9uRfe8Rwi~*)oHcZ7dd6^X{GsdK0NNh)pfMjv#(l^~|A1?7u?-zeFXm4C{97=C zubRNjgBhr0TA0+WSEiP)Ghi*8wBpKM<06p0`u`#9J)okx-tX_{PJ^NM-mB78qzD2c zy(7K%-g^@S5fKm+!HS5z_uh>yc8w)|lW2+>O=61C#Au2+|2-Nb=3VRkE!JlZD9k?R zIcM&iz3;hqrfKJ|Nz~6?ooSN3vd}zfq;hQB@N}D~p-%hoWrO2`m#mo(uxPKN-{56O z-v!@J@SXpMgWo)6=ike0fc0n?#^FU1@`pK?iv#d|L-5|v-?kCs01wy)57xF{k(&0K zay5I$3Cnl8%M|YNQ_S5Fu9mSqPCI35ntsBTJmct14w;{`)-q?+Mg@FZ4IU122PqH*$db zlOn1(sY4|nSo88uIE%85d&{OC4OUDz60I6@I7Kt^V2*C+fl`COef7q^duN$?@9sDE z*tyEmZTp@vu3Il#x^Di?(q;Xh7A|X_!b1VgJDh<|6991N~nO z4?F-5+KwEe>YRXbuPRXHRbxuM>cC65;wFl@>?e-A6fPfnF+nNtLZ+(Uxgrhk4{NkN z&(73!J3U|D<>X2OrxSY&9gkf$m~i;9!G!&P8I0e{494$b`r~)L&sWHSZs2ur9&_*n z_Cf4}{zm98gMQBm_UKA-sM%e8tY&lZ4|SV!Ox^knIL$Oh^GP2v z7|elF>)zy0+fo0O(C>%-Oz2l#BFec5|Nn)Mrae)i(4P${@MkN|_veW`@1H&S9!~-V zZcm~_E>BXV9DmA}9`{p?jQvluWNm&}C~NioCb_YXPs&<;`<1NugWu%LzG8BwpELRY z@)3>$A0mS|hWWn-9(*0fe-ZRMk%QDD2PwRcYd}6Dip2dvf?vsD4}unX!)JTo{JtBT zz_~DYo+I<+<3mXKwz$4wEXxy`vucqk>kt|Ly+maAYMYe)Ul&Dse?AiFzI-9l`IU*Z z|HB2m20lOzb^!XDp+5xu9_UYpekpR0j8BMSkb?w$gKIGU5+Z+4ph?(o;LME35q^Ih zv&TLJXKpO>H>{*b}b!ogpiwIhRA!dGTnun*!avWRzsbS2 zBZnF}jvNg7tO{1Z~$N<0L350KD-7t9KkUeufc9)aZQ+m#W%1Id0kOkX0!lmytm(BR~#9%o;cWZx8`eKq06D4e!D1tT<*rmV5nZ zZObu>@jPba%46!@JSGzg|DFKvo&(B26LNzNFc%DhA+QSh#zwFk90BLRO>iGP0dV~P z*OvqI$BlV|oi)eCI`EjOGmq(b@tA55kIBaIm?)FSxDvFX9?S&Y(C!CIzzVP)?10ii za2i|#Ux1$g(uV)*YrG}LCg5J~6Ocnl+G2}5$ik7wOeXV~ZUCRDNAsCt8uE=ow51xE z#tgKl6ZAoMA&}H!E!YC~f)h}@4DNs*z)OHM1|a`<-J;*|I2z^%eJ9-4&KXR^_v4Vo z*o@;bD>ptf^W`&x2tLzJMqBduOu2&35Uwd+Q~7| z5snGZag6sVQlRgk^&7sB3W2A{Vtxh~q4!|U$Uj`+wI=~r_)I6X!_f}8lrx{%dGpzr zP(Cw_7cj#t0n;lHFzq@%(`w~2%}&tA|65}b|CRbM?@zULyx&!~@m{JP;Qgk2mitxd zHuqHS8}3Kh=iGNPjQa*z%tP=1;Hstfc&$AdUfToNgXGa2ZE{CWHwok6?7?T_0|m@B zTENDpAtx&k{AE@p_}z56;5U<5f?rK~1ka2I1W%2Z37#0O=KpB8h5x<5e*Sm*r}^LL z-Qqpa`G)tU&U5}<9VYk$+|*@)>i~DseUI0=Q{c6y;yQZ?uk#qp5pT>*&q;_FeFc9z zMF?L`ND}_)kSqMzu1xf!UA^eBZL8=T+c~0#HuFUfY?cV`S+5j+X|+lCxz#@5ow28d zpICk@ylMH3=$hqkqKjjg)Hxhb&Vtk6l*RinFYNL6h4=P{_YD9cxW|16@`oVggnkqG ze@yif{Nfob{Lwv5^zEcf(F2!asjpmWr0%*jOMmJ-Tl%(BpZKQJLh*H{Vez$z>t!xa z+$D3-@wm*n30Gy#On4x3V*D?%N5?bSLtsAw-hJbk%-;Wik0XaRa)%Ij?r`|uDAXd# z7}4q&?)NYU-p@g9{BQjHg!g=+M0cj9N`35|FTOsdT=vS82Dyt8_Pc+swA<~8(hj#*id)^7B0gDJVH4Qs%H&7G{E@wc z!1qSLZ^fV;36d;EpZ-cPr6)1g+`|Y*9zGRLa4R%S>Pl#W%=wTkxii5<3LgYjDIE)H zQa&8mu5uu-M|EGofZ87aH3*02jDpumRK(#OwMf^dUsCnyQIZ+miMQuIigy>Bj|-GO6&o#gG$vK? zV051H-l#IwUDImSw@0>UY>k+$xhcF)YeV>A?R8DnZ{rMQy&OmYNL5wgK6;o@$kH9k_WCP$5|S5H%*&9${5R?%Wx5# zNcR;VOpTD=lai>sJt<3VOJb46hJ;G3b@2^4tK-^qSH^bh4aY3dABtXXuq0}u;i75# zjRqqw81;wWGnyCvt3faFm$_j~yC;lk0nO3ia$Jl7vWFyi-YnE2PmZ4D%h6YPGITRn zmChHK)A53dg8g|@#5;3B6!1}~D(f@T)K{nHX^o_n>MT#K)mxgT}waLt+1{;HG zl9=IWSPbf)48I4@_g68W?!x!osKuW9dOjU*5YgTyUE0!Q!&}?nDm`55Bfq3NOl6=l zR%2dys!mU7j{cmIV#AK2YLl6T)6Hh&cUVr(n?JTOcgU(PXOm5J)?u5<%EBzI zr~hSHp3cn5(wRwF8Z#OVZn=)v0+v>J96c?A--7SEiVWZkPW>F5fqUM!V(&rgSl&pB zlhl&wQ{)C3f|dK~qBXi}l67WRW$DkXC^VW;USTr5w86ZgqH>r!7ZERC>m(Fyb!S7bt1&$LtTHa&IE$kX6?CYE?(>2RqY1YgL^%<>k+D$EKdUextjjEeUOe-2{EK2HI z#unCgS?AR(w9T$wZJ$xO$04=if0`5-JFPRC25eIrSJ@}l?{bK*J?9Wx{lFov>V-{QB^wi8$t>b=^MKK? zG}Hk8|3Njz0b_6x{XfwQ-`kH2W)S=CaedHy+^eN~p$&i5fQwX1zqfqDykM2;-YAXo zxk)<3-I)djT?NKDofYO8vm3{x&g!sAoY`+1*EV7oJ!7YRWb;{v@TU9r5e+YFBI?=C+TC>Yi^M(Y3-hv~#;%P{$d&fcAT~ zfo;E81-7y=K{J>|Pzy5~&FgW%T>KO@xQy{Xh5jEz4)Zz(S_#j!2KmEUWtzUmlxkOx z6I85nmo6UhmCs)hrkp(-tDZiTs-3(nM=yR!sbTcuI+KWnGtEN=`z!+&43G7jzujtT z-)SrFx%aHRyMG(wJ%?FL?PO+CXEW2$NS6Hf>XC(Yzm@*cdFIygo`fVO^41%-Sri$koNVp{r^P0#~*g`K{s8L6IU?(iOZSZ#G&_jfO&8WuY(Ji ze;+`9|5}{?N8eW}Ky)QrZgO>_pjxhzx z!%Wfg(EHrP>+p3B1^xZd-va&NeaONNp$72b<)?`OolQy{eK9?~EPhtKYhW<|IuZF%PhnjT){u?6j8qqlT!09Bv> zWPvnt86lG=4r4^fL5P_H2jBt1Kq`>51;IGOo6;!QSmX~9#sD)Lj_Hr%n3@ax^Az~_ z5D*8l;F?Q8J(vl)K|fdwR)95N3)lzVdjGrl{xNvt{r`V62y0{xHt?5Lzyg_!kv+$> zoH!=yfh%YNp&tX%K@py>8nl2;&<6&=GO!A40=vN5Eao=8{|3AO|HqddvJZRsOFMXe zNjuDt#psPkN!>Xn?}vI!gMJFg2Nig>CeRN4TZ?u0w{746I1R2N_jrWdz6MBsu+A;?1FhwnlTv3my98(VCm|Ozdl8s!W6z!x%`nVs|7t&+(Vft2W9X(RrL0_vJrTa>k=}Y;0^qIm_ zx~=$%yROVQ+{Kr>3@#}%-e{OBbls6ZOh)$L2HcTHxSJE3WQSY`ua9xw+#fcf+^=Ke zc~2}ddEc8A^S(8!<{p|&=kA-%;=VHN;l3~#;O>|Vai1EmvGi*{Hs(f0qqywLZl$Q^uE<6A@Kp% zwc>p)JH@-5kBfIYU6i7#a~Ok^_a9GMuOY%E^&AMkPL$bq0A2)`9BkNgF- zh}5FzVFvVVfH{5P<3P83Cv%s5gZLl%#t2XPrb-?2&67UlQzqW;Q!BIAr&)H_)DF2F zQ+wsNc`uUR>^-8eamr?e^>t1xLaor1pm;ig$-)%5D!Wl;09k zp|CNeL2-R>tJ2z_Im)X7`&C8)hg60G)~gQr?@?XicUEnY@8@a*K2KHqr!wXFQ<+kq zH&g8W4=e!QKNQ}78vIrQ9+PC~8Tb-D^d|O3oR2f76A6yI1MyRYyW&Emx5mcGZj4El zUl*OLxH_std1P9(%JON`RhLE1Qd<(ytG+ONk;XvSD$V}T9a{53KG2#Q^gpfcz@Ied z1pckwiTq`D08{PoXDXw?$DbjKf_^L?(Yla+Nf*$aG(O!(71G6I1v-&tO#9OvxE<+} zg`3g>q}QfQlUtdbq%fS6rMxt;P<3%ah1y_zy~cvLR?T^_U0S^{13Ep?D|F{f+oC%= z@~Gad@EdwFG^D)Km{x5h(-;j4NBv{)R+>We3-mwB z$2spJ_^o0d9VryjF6__QRAR-gE_N0yFZ7mPTo58RkQbvkFE?3bZg#eMS5~3s?958- z_VfnbwzQf0Eva)2no^b+H6*Vyu1(x$Qk`(gq%!WINk!c61{HBkw>*~V0IkumNX*4J zv>_dyGZ*K)i*e4o9Ot|%ah|ap_q(gW-h)a@Zn(lxu(;e)dO>NRTyOC-#je6cmDvRu z>g{>?nytBII?XwCdX3qw2K8CpMl~4=O)AsZn3kvQF)K|uZ&sB2z^o|gg;7xw(=SY9 zxda_K?Rfrzn#oeVRsOPbDk2nT zmBp#FmZYgS7w2d;7M1AK6;|t4=QkTx=5-pEq zIryN!oK&U{bVtKtFc&Zm&ryTV;C-(`{|uIZhp^n)3RX^6q@~l1X<)iNzqip%sgRBdVNKfR!w=4PGxDOepyMAVR3PXNkLJ+S#IG9^Q`>s78!Y`Ez@$o zut>}P)if=O83BW|Or|%Q*W-{z^j!h2eL(#$LH}e6yarBzZNw6As7;mzXBtpnn=Nn7 z3>VSNW^b96reKAJ#weBA`b720x=gLIngX5T>T>;pss^LniguH%@_Av6O14@i z6`iz9DE!ks)qEaY{;4`TIwvwUE(E`xj0ZZZBe8` z(!vDg_`wXd=miCuk^PlAq4TEe1@?6r_|08xG_`w!@sv47OguYp8+*+9*~oJyGw^I< z`kphG-e~^DT)d0d;Z=;mnYkDT^m`|?*A2sak05`57pz>vqrx@nl()v5vR04hrLA@s zB(3t3iW>=&iCz&aA32<+6uLZ5HE5_@-EUcw*3>1PI-ZLc=}um_UT@OC5q;PG+j=g2 zPjy}9G94Fuu!u_+(;m&EGQ1uz4=;8je?b5DFT-mR+AG&!FAOYE+eX|2atnOlHd#v9 zrcVjmtSNS@GcRh(6hZjrAW_JsC~@GXWLdur+4A1&OO-s=HK@3+ovr4&dZD`0s`VO< zBS$nQ4F6AK{IaJS;}m<+)-2%w zk0KALP}m_83O-~{fd?mXeg}PcQxAj*y!OY5ChyCTcH3Jds{(}?n-X99d>%1CyoHrr&^Y%39{3LQY=gT>ri{KnTOyrOIFh^j2wo+(wrd4Eh zYQEH%57tOo96uywe)NA*W(S^0neJs`lU-m3lNrr5%z?8@Py^`i*?<~s#Xgjsr~!O% z(*c}+hZj$U7mxT5-t!7aP9IB=!yOf}yJJK)cWlV&jx&wDGnFjwgpTU zxp*A@`xN~5Ir#4@xCY`D_8;8k$ojFE#{8sC=06#c=@Tn5dg4g>PdrKYNeF2@Ng(wn z1*G;iK*P`$F z$YGK$5`|qu4L*kd{v7`QKK%a=@c*x5u>U|6*@GVTU6^D4fgSw6D{>ECc<^ZC54nUJ z<->>1$3YMs{1b(I@erZ(??lhodmM%SUg&Rx{<4EOCLP1QIMDYZ^gZ=5GMF2f2cKXM z#Fy9u@io!dZ;6b4B+~m!viCs*Z3XOo(0H9aNF#gT;o1+F6%hJnK_JJ&eI4?7{dR{eOb|;Te(opM-uB zvr~;C< z;6OAAW-oZCD;HY`NLuG zA@~?b@`vZ(|M;@BBxV7BX=Z_@qaB*I#AF=tSMI1Nxx52z?ud)>>448}@u0fYur4e1;Z$ zPd}n1-{UvG1Cr5s2)-T#vo}P129Ik8&u@iCQ)AQvwJ?}KOk*-?g7FYfBPK|}U*&=_ zXx2fq1#e~D^%fi_JP0t1W0DeXxMmY zPk{d)uZeabhp<6AtT8t%?J-YXiRn%yrXEIrDaX?b`AqsnwupX~siGfc8tHqPHu_FH zhrW@XM-QbI(>>7$eIeXPcLjUsQ^85P&AUlAdEd}S{1);V%;(*tP^+fv1+=HGQ1=3G?(e#~8Dm~QBqx)KA^o3R(-PLNLPc>)L zZOvY~rMZxeyY_<+u--=xzT-_i-q-|46Z;|_uSnvC0r$GxLqt{TW+ zpgjq`-wpoP9Y0S(Eu1ar_wn}h#MYI*8RJ9uEW+uIc_Mvmo<-L!is`CF6;GgCU!DFi$0D!}m@VAbUYO0_EwIzY6^{MU(DLGN6xLtm(3wE1jL}%boCu;2riz z5N`9R7j2n5Lu%9HPN@x(=S!`1Un;%YZH@Fww_V~Dt|!IIT|N;n zarsHS$oX&apc9iGn8>6Tfc{b7wqVGCM9}BqZ3d5F()27?hVJ{w(kz|*Dc3!j$#%Ij**We^W{%rCm@jJZTAyBL08gTLbSDz``wv6@ z5Tr;a!i?!agahr2bmwi3@E5F)h!m|3Pm~@B%MdRQE09?lS|+zRq)vWeNQ=UP;7-N) zLGu;+0*93525eOB@;|8D>33PV!{?E5yU*`RZBvE5x!WpJ#4L7TgYDZmf-X1(*y6THwL~?Z3tk>^#M$&9ycYg z8wCp#zIm&Uf#-zwC#hKHr(>O;hI`#73u#9R?z@;amR6-X@s_7f5iU*%k{U>kl9`{B zB-fjmDc_w?px7B-uG|qeAg?%BF3$DD?8Ch!(zdkFe7{iS*{ zB4oPKtte`pN}GqaQ$GYVDe(<{|#(i%0YQfFzEr_9qSO~l}PgJPO%TTJx%~!3=DN`@cuGcKdoT*)y(W{%E zzDzGCZIgah%29)iwwI20UTXVCkocL`OUZUo*KygE9q+Cr&yh3GhnsRwzu4+j^iF#pvtyW%M zt4>aCk6vcZ68*I74F)NhhYgd`Zy6@0{iL6m%5)M_m=@4XOlBHyk&J`H|9^=ZTrWcw zR)h1s4e*>z@H&lH<6&RU+y-r$-7tpQ>K*yhYdu7DHGbmisxaB|%2qAtDU!bJuN`Rfeh@(votF;0| zhv!)8-9ZhmV!3x3x(8b@7h2&pz`Pk8&2CYr))q5rY8l6?o$e;AZ1RyVYY34os*je> zuS-(Osm)Z)tSMAatE$vYuAHuuP|>LuTeeU?s&uVkWbpyR@WPJ_!wP;d2+R9hH$0bV z1Fi5Jrui1h>){)`7XF7CT&joXn}IwI%g)WSalW$?dk;FW)}EzIjUC2RGs}*vXm=Hq zw0VmPT7$&7Gp5O9wInE}H>WEnH|47(G?r_`HZ*ES)y>w8s2$J`tzK;qT)EF6pyH}Q zK-u^D0VS_=1B#h;KoQdlEMl5(k&MGV%>SDh`*Y3ke6!$tyKv5TF6Kfn*4lV%=t2I_ zgZ!b#ii)}?^76Vog;{g_rPDjZWm0Cx$tQNCD#frpmIP!MFSd?H(*ZL3&wHj{cik}`97kAc_GrVebF*ey~*+sbF&pgdrDLSyXw^Z z=Co@}ojqU6t7E0MNBbUa_qNO0ZZjThyG{Q~)2)eVxHT~K(R`DKalkyhh_U|w`ukzc zwk|{#wFKUK8TQ_T(jlDtA5x&yAwx`IQuU($5~9(u^r5O$34{G`gFV= z=3pG4zk3mUA2f$oVE@5Noco3!FI)r9vrb6S>oh2Gtr>-{b)b;7Zd~9RAD-XpP=U|t zSkaVKX;L05^Tlo>RkAL_t@0C>_bE&m8c`g#bho1Y;>(KmgO3&L`d=y9&SQ$UeW3Rp zpVi^Ggn4%o^_T3$*)fdc0(2Lz#kuG8xDUn#d=ABCc<*gE_r6n>e0S>7)E$;IWyb{a z+%cIZZ};aWZI9%+Y)j-jZOsu(*itTX*xW2-w`s1l&4yvI)w5Z1$E^BZ+H&}n z*kXvuSS)2S=1bmjqYX9aLnaCRz3BTE^mzo@^Ebi&Z-w{V4(|y+IBg%i_hF7)j?2@; zOa$}Daah8W0c;<(?_@)Pj_{RHo@D2A|VFXWJJI)b8&Lyj&)I?V@6ayT3;%x*-V=V*^Ax=I zc|KWQl_9fhnq+d#l#H+0li{^VWN^)o^sYsb?$r#^zEVzFSK3J9(jci_*i0%Po+Xu2 z-;m1jSEO>7aViHHr+k3%-f|Z6@8}3>unsjq--prfK4`a~-(}FwfOgae@c(CV4aP;B z|Nn@{>^6^dzK|l#uT@F?YeQ1~+KQAPI+4P|sU-I>l4QQlAn6BHB>Jk81YayC-rc># zeF77G>nDWre6hjtcOJ$3$|^B>Nut$R6a7J*eT0#{i54PQVW&f^yIa@FM#go%{P1a+&YJFaNR^V=uWk z(Q@d|MN^y6_mVTX4h40O{D{c+HpbvCkpr|XA7cNq^0A(nJ8i`)~e`ith`7#B)yvvp^5%2aACue^?DRgZyD} z#%9Fy@u-2e$lBm9#sm0W@&%IoAqhx4cR8pBt)LV1f&s7utNkI1jV2lNNO!7EJ77+l7;8yOY$HO5CEb; zD#!0PN8CpiA=we~W)H?!c>MA| zFl%^hD_!Ib$N-Gs`*qM3$(SgO!`v912PNPyv(V2X=vG0i5mjzQpJpRtnTw2N02#|N zWGt(pw-tLn4npe!t_=E;ZX+SNi7H*kGe~C1HE?wl%nrJC@cY(kn8v^q?J+_vbZwE* zVQ$KK(koFAz2IV?n+DxH^sNjTOAUHBoxZ}De1S2!gIauwTHL0U(Axy9{iwo+bP@k^ z4i!0z5jq9k55RG7bQEkH^vA*P+bN(O$RDin^H_|DBrh}=N55%Iq9@9}^qqVJJ&;YL zFJ-gnGnpc~En7)9W$Wp>+zh%VH=8cY_0dJSg>+tS1)Y`KM5pBT(+SxR>6q+YIwbd$ z_RHZaG6bqS!49x}6l@~$hl%js6X5$N$iB&99JJ|gYZH2AZcX1AIMP?zp7g0!Fx}LS zp{u&7bWtyt&gqxX8G~v%Y0yL`3}@0&!)`ikxPT5C4$*$Yb+pG|H|^3tMceg0r7ikD z(MG+$X`LS9*61>B6<9e6=7PSvK;M~<{6+dr9)n!ynS%~J9BV>%Ol;}8nJZni^rbUn zBj|*60v)l*q=PmEwBM$j_Sn|ZF54DvhiwP9&9;x*Y_pi#XtRo2Z@rCMYjuoUJ@y7S zGWIcVXw09yrIw7h*pl%V;f6;G&ELV?(06y_A9$-_UU>A9rsw##hvOCL6Dv)+VsA-j z#yirniC%QTDVX*+$IuSv6mF|?4!6ms3 zCczTNgMvj9t_TLkKN9wjdnugfz=XZ_OgIo1&@>7<)69rSRZ-Jb5W&C8$L=oP_R=as-)?UlhF@yZtrdzA{8dDRG)cs7d`d3J~f zJ^G{;cr1~cKY5*WpZi|v9=CJSU9R_}J6)ekcepUAc4sCv(+Ny`2R?f2jlMrlEd*hW z9gKB;2-dj%xaXj^EFJJg{@`y-n*v>EP2f~+Brt@(JRnA}G$2K|C?H!j;9n@!?_VJ` z&#zv(*RM_79mDim-RnVCfENV}Tl4?yz6gS6b$TY>}%hku0$=AlzDOSg{Dpf@HD3?VoQ7MUB zkF4X6T0z)#wY<a#=USnEF&pRDa(Q2> z3^^Li)Th2oYwF5$;yNe(^-)ia~6YGh1%tezhEN+mslDW``srL=Hd75Wda^DvD4SE&DuEQ~`w z#-RvnY_J;NFUl3uygVK1${RzoavixDIUf9`Y(HUrR+v;xW{kKpBU!dAJxi`6tx%yT ztx_pJb-GG!N~c;@@}PP~(rS&=guR-{ahEldV!zc$iup?|DVnJyMlofe^cKl!o)?%0 zpQ8rX@{om00_?Y2L}V=kZum(ll=74V!jSYy^=jfth#+zO7`asS>HT&LAgZbvm`uDpuUDT30H zK&hhQNO68qylhTkntWD4o??1InQ}^gy=qc!yIOqCe2tjw5zVN~U0RXp=e5Gq9%@CT z{GlF^%v2+imUeVHv!*73aL0;W?+vP{njz zDxE%t3Y#Wyc}CU^vVBS-6xN!`s6YdpB$$AmKO<_3wRA&#TcAIzYjup+bqn-*~p?g z;W;~S{YATwirSGsw3|_Oy91@qoWx6M^A;qw28rTkOp}gjNsyV=oFNxJy-*>fsY)rZ zp+&{7ey-}&+99 z?akeokG)v$gO<6-AA0Z^ls!t6)?-M?J=T=a?Zm})dGeyV`~{J7!bM@7aZ>s~55*DxjLYEZ=#-*O){xKV|1 zXh9x_e(#3n#(wzD0pwwWxc>nt#P>;q(iA(OMN!CNA_vA%*n&x1$bzZ7!2S@v-~4Ey z&-@h8lzF+*9=+ukJfyhAf+ddFS7 z{;psSoJ7qJqTk!0w{9`AsHHgfy-czf2A&7R!jc3JD^b9(0r@S*H6Y6!$$Pm6c@6n< z9zzj4w`B=@*QHqk=OrZ~$Hfg&;}&&F+Yc@g+YW3NTlb$5TlL)+TlKsYkL_YIV>>~| zJ8og#pKnM00R6q_^A>2Y8pd20!F*f^-?a+kum<_VTI3HK1mwO!jV5g{B9{#|$55a!zLVq_xd--a79w{`N*TZ{m#QFct@V;Ad?t3SE-yRX!?o}h} zy+$;4uQgfjok$jYyvS@%Fq!U&CF9*$WVEZC40g7X-i`&Nvu!QB{-;26$Mc+rz@A=Sfg?7aO%!9+&ivuqn0Bv_@kGlx}56iB93;Dxm@ZRv` zgwGMC2TDX=>*9cGiO_czifg23h2*=e%le`!XID^&SDIp?|%dH5dF4Cv&|nN1A2@-AkdZlnMm*p zG@pYP;3bf>;a~XpUI7>Y2Y|8pHy4_P?+3t&e_^^fzpjPsK?RS}WAQZbnXmH)iQkpv z50M}RNIZ81XaH?s4v_eMN&c`DjDYoE8#oLugRj6-@c;dKg@2P|5)zm`G6x-aTy-Fe zwh*!yvIovUl0Sq2iRaD+C7=d0gLcpb=7EJ^2&@8|z<$u8M{*IsC<{!V| zdkN3~ff*U29Y&}HP{8-Rx9xbFKLp`7V?a760FqirvX~j519T&cm=CQ*=+koOt%Kf9 z=pBQ`6;$DCOqu8ZW*^_!d=tuUk1bVBWw;4M7k$rrKEaDEbh@W2P9-reG?t;(2C!=5%$Q#VG zkOjf>YiObtXp0PL!Aa(Y6PN-*(APLpNZU~3pvYt{wHjL6pmPMd$5r|O>C7?o zKr&Mgf&*axD3~qut&x9N$RLA(2RFgb`lyYT8U3MPOHW14xa+Ss`WJ#4#?r@JDqZL0 z&{bYBUE){L1%5q!$e%%H__OJxpqEYv7SU1u2p#5c!QF!o(O%wV+Rb}FJNUoSRzA{0 zun}w+1#^JDofw%Ee5bWEG8p`9u1+rv^yvq63%W1wK%dIEA#d@cOG*)RP9=d(t7gy% zwR}3NUP_16Yv`ax6YbY%r#%`yv`b@vc4!RKR*g-xS^XewP`ga))R0nPbJ>U*qhWwg zH-61BJW6<-y^KfhAUTwbM>`yF{{<^~dTgvlpKI#T4b3rhL3bjZGVr3KM!|H@B%1b` zCetp{EZSjKNL$S+XtQ}8Z8UG8_2!+l)_fkVHeX6B&DPPd>0TN#IY&!P?$ILS=QLo< zxCKUxn{UXtc?R#mN1?xobDhuz7aZ;Lk{iS5{J3mB8NrXp#3Utf!$7SzU?Wl&*m=I zWBrWRWyN@%V;OJu7{==u1#?B;q0QWJ?ZaevZ*a>EerF;+bJ1R&4vp8RT@$Tov$Hd; zbMdCtuEDgzHJXMdC2>n9Wpaxq6>x*DWxNHhb-ekmE&M*$IsCaU3;5kG!-6@^TLiNw z9v94Vye(*(@I)|UJQFmJV}j`pZ)mb-0tv4#vxKJPmQ(kqB7g9Qz8~J=y|KP@lcF8& z*#F>({K0Di4Nvi)rQZIu&^v-#;2p=CKP8pdJ0*wTGo@J2Fd-jQ1 zJ(h`DCU2CQ?tWOR(e1ia{iN@uYF+*o)i~qMM@~#s<-~+)F0@>^#+FUx&xy5a{`k19sZeucK>`~n_rn|hF_i3 zbl+B~M&BOkdY{GO+NtZr)!zGMD!s1AlzVFQ^<@QR!ooBu9zBrRw+63 zzEV=iONFFhCYKb%WD^75fo;I_V<`3>U>SM^`X_TR4tW@dT&(fYmU(Fc>P%Cowlq_k zo@P(=sV-bi>J(l@N+7>1IYL;R6elW7N|nk_%n|1%l*nWy)XHVVx5=l*^(rREE>}v7 z-l`NIbxJul@+;-oh!={n;Y>azjLF4>zD5?0vXVUN5$3@s$!~I?;|1{kMOfc~WmuAS zXJdVpr9w^FMpTz=LseN$Tv?_kuQ=0>Uzial%uA0E<)kM|XQgF{(^HFNQ&X$ul2c|V zBqa4H#w9LOicZ*~JT2~|a%9XG$`R4ODMdsvg@|cPJ|dFIy+x8oJ-{5ih1yGUpd%%C zJ(R=mfyJd*y;vzQYooG%#xZ5zv^&baslO`uCNo9fB&Oht4{>T+%2XP~55DTewhZYQcJ?DS1bgy>dQP^33{0(KC}N zc&0OXue5i3i`U~PsKJFYye6TyXFB#IwPLN^hP5_mX@Td&zhyQde`qqGrfCgD-DdLkK^-K3W)Bmn;gZ&6f7BDUtE1u9x+$>X7%W7*v>CzE07t^oZi5;!hM@ z3!f>t<}-QMJSOLw3v%A@AQkxo=HFS={%|wq!c63nvyn^A!Fg}cgzpQn98YeSp}2N! zif%WjX)_%te5Naf&YZ#pwFU74TBq^-W+V!y&d3x^X(^WWm|iD#YnmnF+BhKVT)$Rs zV(nqM3Dy6Tn^5^oc0xImolpu&K=B(sM-8rE3{Il<2ikF5=)$pSE<8^keCIrzcgAC0 zFMRJ@9)-Xt%t<6Ew`m@o1RJA)H7+DS|+xsdB^Qy92;SQjzNEKH|7F#SHXfTT8K;z z)PO7y1$-8Y$!nn&c`P&~_l34JY0#Nm2EE96Fpwq=Orr?{$=tXFc|806O1{nfR)JOD ze8HIB)k4djLqhX8w*}@M&jjW(nb542iOgoa<5~^!X^i`!9*jdjy!Rr^g{8M6QGT7omdRwNFF5cv{Hz$(jrhL-a zSVwB>yGR8WI4Q5$OA0HmlhW|dq_m8Y(h^3>i?9#lA5LTZ52NVZV;lA#>?E?;gLCir3}3awVp2MyP6|hiNbayT$sTqlnM2+reJGqn z2UAJ7zl8YvW)LU2*lX8D9CS`W;64id5|f^xv+p>DU)hJ6Z%4n^L3=TD=Rmg}x&_;j z$3Zs~x?cNn4F>G;m}AHvK0y9(hDhqX2nTp&pa(3$1mFe2G0D<#;KgJ=ix<{u2z-Di zId%&jeuBl(-w;I`_P*gDYQGD8--LcIhj#B)(KYbsCnmJWYf^jhj!vA+>aG~_ClW}8O&Ie(dbj`gZTp2pxj3d9zypU z@E!O8JOR(ZbBxdLsziSoV}Ujv_<$sUae2M}VkI6?T=o&T{hCeCU%m@tfV#IpzYO{r z(4Pi<->Yvj7#lR(_#QGK=qf=|N}~A_cnW?2=nkwLw81NY62r6t9bgSSK@2DcZD0Wy z0jpobG~jQQ&5(Zp!ukH!`GW%7&L-RVk4%;0qC5=kbQya@(gLro803O9=`?;z`cK9 z26`Aa9poR{xCRH0gdBu0KCkzqyd95l{G5P(Wuiv~=u;VVYA_X=@a%2S>V(!@^lJc9 zbQ$u9wb0oKjpN8ZZXl0%4A1@tGJ-dEuDy;&2_O9fGuDFFS4S=2`DFkPZFyY_D?B;^ zPxLVe(=HlX$#Z z?(rLT$h?^)AK+2KiGN^bYS{OogzQ5O`%i#8+9Un87WSyEE9&TjQ4K@R5(lkRXywrV zFgI=?o4SrUdKDSjC1hk5kb``PF*$>L>?G#J3EaC^l7bw>+}w{I?1APkuoLVU1+#>{ z8S)2xA;tvxgC>4f)jda}pnn1ATO{-n(64l8<)L3C(5ghm>#?_F26C3! z=y@M@1ucg9YUu31?EC-~xs4g}16uXx>#Mj{L4V~am=*FDO9A#s5i%G&8lpW~%Jj2> z7Jbb(rvLpvw%!9es`Kjp-ZP_u5MX)}2mulj5)u;Xz1LAkz4w9&2+@1*-Spm@0UH~P zZE(fC#<88(iGyRuE$&I2II&}U{=X}c*YCI1w^*Ay8jbEg=RD^rXW!@EF-_4MmQcN9 zm!R7YRz2CLKsTMr^+?}3U3YHPL;YszYQMScEm@*V{nzMX|1CP-f3ME;KcQ3ouIPmG zQ##uBcRJ+!jrQ|kp?zQv*xmP6*!&#OVBnwJi+{VD_2n1`eRxklz2!7QFZcJ*(}M$a zb9j`lk4(|kQ8~Iix>y(4lX8Ac1N%$bbZShOPK;fkV`G==$k+`!Gf`kU55MD$J^`qQ3G|$b)2q^ zpQ0=7p}OD^uQQV}bkZ|l$Gl2)*sDedCpT;VJ-yf+vm|7lwHFmROci7L0Ibz=#eZ`?Y^0q@;#0L(o;osZ0gxTzyLjhmR))d?eZo$=$ zF)Ra8s54l0JfFu>C!gyoIb2ss=NV_o&f1ycqRpwETAwyetJ5O2JS|B}(yXRMsrjb) zsio$*sWq1Flx9m;N~hh-s;0~nU30&IYMi*+_fTWs+MGj zX<=5p=4GXsx-)akU71DZnbt~6hqb}3&Dw6?nlZ^ldX54fxPWvC{qSU|lElRdI6(-sG6!K+#|Amd^#U~jo^;lxO0PoFO>Wn(p zRvh06k4#(8@7qt5x6?>OgK|LUBZVROn&>p`E~R9g>zNn}i*?cXfD zs{=K%#%`weZ$byEXOAs*EUf6K?g|&pteB*>3V*ehhpVYP-c(O#AcstWs}ss@LG$_~f8iuq1C<*WN1>ZQQDSJ2#kRh2MK-6nLQv3)&&d7X5$_j>|1J2hc9W0usQtmVx$Hf_mJZ&pZ6Bzr_Ax4N z_f$!HfQs59RM4Ja%4cck`owDL zUa(*V^~N&v2foKCd+`uuF6KKp7Ee~{;y@)Yid52~L?tY;n&K7~m|_-Gm?IZ7S;FUc z*@ezqY9BObi^H_;BaZ%ER~@I$eARJk$Cr+NGk$UOYqdH0HUEltiNTAs`{Vfg5PTQc zl8+nE!#2?`!CYQ9tfTJb{ggHRl(1%$;?}q;W{sbsR);8Zb*#cyrz&(+u0mFonSxd} zm;zSJG*4Z=#NxYjvz^b9!*-JwJz(dx;1xTsxnJ0McK>4M*=4i$ocSx>B>!*Erybyb zU_H68g?!x3y*NAQm!ON+HQU&G58}636t-=!Lbi=n&^GP?+3GLK!wH9@{xteUc= zP~MwsV1RHjP{Ug=yT9U(Dkc+05e>u!_HnSIB`U ziT`!{y$sLkd&$Q=~-=(Wi&7uftWtPkU+DsQ?W< z6{*1|Q#A18bPYIBqkhLb)%VzPIUU(0$3y4ju>UDJ?EOHF_x?+cJ8kN-9c=5xlkh*h zlm38@=ioeYj2OVR9IlxsX@^s^!x^sspW_(}7pQ&jqxQbcvmYL?ljDN}Wp~v@ma85z zKj2SeG6CM7%0SD&f0@DU5}o_vMsyDxIeVRn_$`v{TN?Wpid@_O;xYIi#P|E~^Ax;$ zPNNT>B^Tjrg0lq93^=3j=N^m)x&F_oM&FR`c}%iAZpS1yfW{mJCIUaeV&qBec(Ry8 zZ(-1(gFi-%YkUdywHFwGKF7u%un`+B_2T-$UJd3P{vL#TGap?HZ`&1~#rXhQ*h9qN zVZICYQTAZmqW*u9eJIbc|KK_9zj#p$u;5iE2KyoC8LlkEycuvp(K?s}-eLeYHo?8Q zlHcLzt5*?Y5fPsM8v_#jw|j9F-!BsDW9J#0FQE!KAfY;Dq+@B`~ zFH`@&#vYJ2;U=_{4(Ko7j+up!GmFv@=pn@9FVoON6455G+He!EjkpOec?3y3EmIE zpTQ^KFW@Witp!cu9`c+<_oBQ&&HNEs!T;wwQD`z7P1pN8j88b)h8g+?*ZJ*$ z&?1CAJ$6jx7zt8AJ}_cY4`zT_U_Rb0L6cYo-v)GvZ7}UdlQ@Krr)Zul`1v$Z_#ZTh zZ>XJr)jj^i>pS2NcVQce?lIV?vxoDJ0e zfMEx*>Cwjm_{(TGjXfB-aFxJS16LCfZr2CcaR)p8fE~s@jJNOZ!+3+-c$F&uCGz5V zV(|>0c#1PT&RLBtxd|QxkKBdL6}@4UGwtC>DpU8H2l1QUSbUE*_9e0Sl>I0lqQ%_d z-k^7RPRm<7BjpYBhgY%VCG>|Eu;V#&kY~{9oG^V7kdbj?VmS8H)cdM9>3Xe|(HYJ4zycS@=}|S2-F>9X>U~ z(1AbQWZ*({mgRW9o=n)m9a0D3I?KQ7MC4^M^<%91SC4{t2>yfr2R3)~2ZmT1Lq3mz zMkln__fF2ldNA4Kitgf#pFu=42H#TgEr)L;D$-R`rLLIk*Ix?(Hhlb78f#D0a zZ}>{>VNc4gVSBY>*ePur`jEB^L8%)2vDOd%L2C!2t`1^{*FbvqUG!)$?hKg>XP-=B zozL+Netv$eS&t9tr)$Gqba|AQ&W#Dw$+1y7Ixbm<+_JRat$_U{qPud~&tfr&t?(Dz$z}z1B{d zq198mv~tQKEuXSROMSL$vCm;G^uDC|lb_OD&p)br(m&MY!RX=+CNkRHMbB-PQ)z=> zrobqsR;HLIqFLXDQR`sKG2ekY;P0w?1H84JdxJIyMx(VPYi(erRs~Jhil9<03#!qQ zpk^%!>ePaud72lrLURJQm}UnaFwL5F!PM#hxT$06yQVh3znfa8*i5ZHHd6}^B>yiA z9qR9aZ105kH;GK^DO_d&mlIgyW7ED6XYB|bt*8KYEEQ>W=FJ{W<_+HIwO{vI>I-a+rsynTf@$pn?oP7GzPzIsSox*#m0RC4pSpH zn6K=MqHOkskv6-+2oTntVNGwh18=hziwt+3C} z+~$yLJ?fa9an&(1?PW)6%IA*OAh zOLj@KU1o8YeMZqzht$H&j>!dw922Ks>64K6LZA4YPaWg4esYY@v^m6EK}Ih=As62! z2G7Iw82tCopx$d|jR`jMdT}HB&9SYfdVngbT~u1_p`vO(6;y{PzdA;_)yc}K&N5|H z6_~75mFBd{MoUV?OuM9t#r6s1n;haw4?4z_Ty~5qdd@Mb;1kEl{Qo#a=Ghz~b3slo zKFnrZAO_Fi^Nlvjj+x}+Y{mt!X%<=(w#;BDTHe%GMU5jgy>Wta8-0}B7^KX`NM$r8 zD!tLF)P{UhaznW}vA)3)SJ!D5Q@6-Is&<2YMD>1$u&VnULMxti2r2v6A*AF-hmazh zLr9^`KBS-*cjybRk^@iT^EEgx&ZQh%K)nSv%qJh`pg(l6*6*-acKZ-n+g+887L(fU zujKYHCAGyVp)E~uZMlk>QEG~sQD=^5ZMTHAEU<($ueS?o+Gjtl;i7#&-EDjSnvd-L ztA4ciudvzsmxHoiyh{vTr0s9Pe{~-DxR`Qq8MXg%`X$G?{M?8=1^g~`PJbnKk5YX1 zM8$SbQFM2(qPn9L(VeXD*;xvmU8LZy8dG4`3{$|YdFH7z*IIl#_F8<}FIc>1JY$*M z@@LEB#vd$`>ur|FbvC=nwY_+gw!YoL_zcJWOUcJol%kYGyVh|J2*<9~?1foL-HSc( zOC1!kWQf9+xGH3cr-GLFD{x7e0v5-~e{s6}7U#=%QKftqwrKLgIVR8ft4$vBcAMPi zoHtFF{j_PqtPf2SI({%sXtS9o%m6LDc$GGIlK5YT`S<-g8ZzUxNFXWe*tuk)7Ix@q!U8>vZaljOcOTNBolX#DC1ja$_v*Oev^0~$a9NCu$? zsJ*Gv#~w0i(2;%`aD?yOI6Pj?hkexdaIpFuibe0R%Kl)9EC-ro+D`-TrN-QSm_heJ z2E8{B`@W*X{Y=8!NVs0yg#V%Kw8I|S0ggj_e9IB$2+)3%`u`a10Ai1GFV0D7-&54y zXSnu%&Ls2sekAd5z(Vl6H((KRE{>$4!=J6}9cWH1@7?5c>;j4QJOj_Cbo?K&3;uh1 zafA388q9gPPr$Y71akyj-EcLW<{pT%^oMio!Qd3W_i_FIGWx^))V^0mXEu{a&R`gD zWwP-CfdD%m&fz^e{X;bNRTAp{<2d>l4Sol*@39a5Q@wZy-!I|s8MybuxdF}v=h=q> zXBnKCSBSv_#DGwGUZ?)Q!95_H%JFe*cmg~Po^fQ-9mFDVGy|>&ojrgH5wR>tayc^j z7@MD-Be`yKvL|0gpZSs`{0{>&HUPuC^Z0xO?yc}Hg|~x`R>PZnjeCI}CJ*5Bfz$0N zVsM-1fIP<@kQd?Rbd=T%wBWaZdxZ4+p=cuG5#s$=6vVJl&SRn21eWphUUU*p`2PER z?i(&%VF$R6wmpI0yWn00_iX&F=VJwrqQSr$@e~@&v+RR`bJQ#7P^6VZ4v&g?!HOYx3l;#N<0~w2&yY5bXF*3s^}3LEwLcoZ_*egR1L9xdcMj{gQfTUf9U2JRpX zkRLYeu&n?jppC%WXk1|HV`vWlg`tIbfGHpt7&UheClC;3HcXCL;v^^7#hT9z~*f1y%@_Y14g~=1}1?35CbxRu?M3PGy+45G4_Hi z0L#D{un}wr#=R&<&?C;mdX;cIg(mSXy30S%3V!`Q6odEA;C*lh^ynWBqj>dSxbWJD zhc5^R$-sz338(?hpaVUk8?FUtAIsob1Is2PsU7&Z4^84YO=H}PasyxApxXU{X#D)Y zobPdlcff!5Vf5%9PV9lu5P%NRqd$z}I2rWr!T6cy)c%MT^DpZDe^B@T4LiQUjxVv} zFWB)3c6^K-f5wgv*c)?)`;^|JP2Qyne+yOM4HS`AiH4zhya=8L&w{7HQ@}P1-hTag zMa{3iz_7)Lg*&mFinbGhZ;AMo310zR74X!ttD*&t4*cPH7})U}?06kJUPXU+32o|m z+T!$3Qrv z@hb(sYP?H=IVE37o>9z(K^*9 zS;w6+b)@ff_Lr1uf4^$&?boQ?{oA#xf46oFSfp(O)@aLs?b_7;kk-bPV z9U2~{eIw$udt|D1j>^_{o|Ce5bh$QMIR6^H_oq>FGORxn!MZA(`8AfrkqfV&qHdO{HhwgK3BcxFRGiw$d4XViymXZxYhG7`2KsiUyh><5?NcuvmALX^T zHe!ycI%2u0DtxP{BJ8lKEcA-GB;anL8`qQL){3j=JXLVqx|7k?+-A27wg0sk|Z zy-TqBm}ZahdRHpTPGYhsy1(Yej8<2SyEd8&ymQFUyM zDq~wr<*~C(rLjv*B{7@LMbQV%1yPqQ`4P`r^1?r|k%}gAjw#4yjPV!M>QlRRRB2<$Uud1X}RU~Dr zJgG>fNmVLNYBCii&N3AwE;i>UY&7R4?6+jcU9@DzK4Y;)e`v8r{$R<7uvs#~ZRU)y zUKm=`?}@=n_IvlzF?P{_>^5r{0DZ)asRd? z$Ji{%(IBc9pOJg-WUv&)|Ht6IQpJ+Dn)PiZxqv;3dA~i!tcI+Cs>vFoiYyP6X8EZ& zD_DhDQJS8WsQj!9|$15v8P1gKerRSHJ((-FfDfw;Yq`Z0NgxocjxSZW~G1+JBqB9@2 zi^{lT7n%0GU1X}w5}6E=dhr2y_d32lh2PiVz1U3c-%9P@!u94xYX4f+`TVY|)JX*; z!<1LzrtA_gWtR9Wqa;k}C9z5^Nl{8kwvtMUlu%r4iYsn4#T3moM-{EML>Am@37>w( zE;R3!T}aM*mXNG}T0$~ymXHjP-U~yEdWD!jj{gtBd%m68zmpOOtZU<59Nufemf{*a zWmR$iMb#LkRe30-%1=pE!Ah)(R(w^G;;J$gQ&pg-$|^-xwwS^zy3L{GE6u@WJ1v2w zr!CWpAF~7${=pJ3{U4TqJewsT7vz9!o8@=p-3!G0G5mi3-m|kAo90j+f;GIJGm~r1 z*j0!vsg39ljUyG078Bd(t?0&SifW8dL}R?d8`Blqkgt%2as|~lXY z*|++n*{AYRvv>KsW}ni3n0<J8q{pN0O=;i$-tp$cywtI+mI3U2pPP}>JvrDDJCB-gZh!gD9Vx%L<27Zjw|wSK)8si3@|u$%&pB3kbQj9KyH*oscgU@4 zvBu5XqOqOFG^YJwxy*Q5E-inTOCwhh8$i9yG^WmGdV&1A+0D2B&jomouVakfz}T>n zx^F%GaxFE_YVHBSo~RYnz02+8v3!swE_cy{W$toYHbvu>1<7?;w8kt=k;~FNjapKv z5ld!h_~Hc`x^R;Q&*wgnxz{wX`?nf2>u(y|$?CZswDscYF4_V9EAVjJh>mWhPi&{| z0`s@A2V)EOA8aNUHc@-?dv7pyqoamz8mwU($7sk#4-MYvt3ew>bkD{(_1|EX^ZF9? zUDv2SYv;&e^;+4l+%L=W%d#waNtT6wk=^{CWIvbH>zrN~+Y=sILp#88dI$MU|IHzk$H~?dV(JaqeCTvTqYX^o1G-tb{cmp zf4un|jy=tV{f{VY|Ao+GLj>-{BgFave80fCPf!N#Kfu^@kg*B0f-+zQQHRi?4paLc z;r@rC=nuz4!}SG2fD2$Da(pU?01W=em~@UZ*c~Q`4&mVb;|zR{V&5N0_ix-I{B$0q#@q?tyO|T=Pyd zCcsw=S2|o#7ugSVnHXH*9t=*?|3UU2T!a5%@CbO+jsd10liqL!J2xg^9|qoV^bsba zr)ZNW8E76Sk#2J0M{hGAe@p`WKu5p^U}!LB;XcT(H{;{t^Xx-`v*Hr>0^QGjC|Ah? z_`GhAi-dCUEn@Hlyib8=z_Z|a@Dg~%k%6C>yg3FD+zWjoltm(T+^I&VVBq;58vGqj z`u5vQQh(*M*zwxWx`5xu;NF41E8v~QM{4mi|2i5BoS`?-V4g&Sfp6Gzwi86n)Gf*s%2fko`o*vkbpocbGo^tZ3T-*t+3 z@1b4S5$AdM+zfXK-06>_!4NjT7x+G!S7?JbXoI(CgWtjNdvFJQ06qjCflt8~;2ZEA z_?H>oWiW-yL=X(H!}zi;+Y+z`;JA(8+Mc+(_rjHm$G|u+5qJZm=8gxMpa@ihCeQ)8 z!9uVctOc9FPGIZ>ISwuW^c5PZS7G>$`my(Uq~CG;3VaGa0v`gKow4u2sI!f0{RRwM z+<`xc2B{zql!02%0%n3aU=dgWdhbQ~NxRS_4x&k%qGrEL-FyqJ;5TRmU-j%eF}S|~ ze+GX9{{!9zHiwb?Z|r#(28P~!?Z(jugn|TM#G(LH0ONU}t?dep4Vm_rJ{xeDYCo1SaV%;D3>vzFhz|bO$DBT7&ry=}55EwPT0pn*QHlAP_ z6>1dvM+#MY4$WK)S0!FGphdKD=1$@{hj=c6XE`adj_P_VJbUo(7!kNg>fVCyU8?`T zp@#Ho9*=W;3_JoJ1~zASO-{VB2M&N|P!N}YqmzAyHuf!hFuqhA+EqF}<-$|U8LOzG z8;~Sh(IYzHnS&;=knXtx-`3M*w^OU{hy4^>*U>&+CL*7*5923VsP~(E?&Ek77@5w9DhzaT7Zp!H(<1 z<015it5o+_$c_8hb#We5!niBuBoR7}S4Uwu0uF;icVQa@zrDfViyvh|?{UK4VZ_r7 zUT=Ie_FzQeR}x&Aa7|}_Nhy9+!BCGst#Eac0dvt=mY_wfp(VD$bAW$m(LHX^IO&(?$F=VkUwT_88kvM1#f zcAUVDWAxc0w96s(EbT|T+{@mW-Q>njVzC|OtwdlGf4zbBSVw!TA)8mjy9%tliyr;M z8Gi8LJq&r^WhY}Ow!`Pa=q_XN)024m6U%V;;&s5BrhS%d?Y1k>F1s@Au&>cJ`zCF1 zXxAo(Ioja3L~9+_YqjGpt#CN5W%gIK#O?(xvV5ckmhUy+%r{Vhxu#wi`pZwm;?q(1 z?+U*gQ_NVV72dzp*HNeKhw7-4n-28z*6sm;+Bq;%+Xf|Q^Wb!C7@VVZLyEL!NQG7n zt<#F3ty(s8mX-`#s71rpX#UV0nmhEEx`$j<*Ps_QYv8Bq9QdO;2B5U|??qcb+F~Tb zE7Sj;(Hd)KYTD8PA zPYYd3G~cyK^IRJ>XIzJ7kDI4i<5sBCb*tK452JTnR*TECY8w5K8b|%8hLMai+!NFT zbQv4`e}Vtqsa$4YSii+oca`H=f0iEDvU7r?HjW>rH51*m!rdFKB~S}JA~b(eyyi?w z)$B>xnl-6FGd;`I;aR6P&sMd1&Q`PMQZ;&RQvIX@s`a?28uzDFHQ@tQj{mnR+}Qbs z9#f7UW8j~}{v(zh#@5f<(ZnE@7{sv52xr+7M9s-_T2@ZxdnbLyX#SK*nlojpx_m=5 z(>EHOB}p@UGt}anr)IxmHTqSn-mh7;ezR2Lw^&tv8&u)DPi0fitCY#Nc=8<;d3~=! zPoBht4pZpP=nK9j2Jgf58oW;?vb0E{)=Fl16Hg4HSpJ2ut_$d=IRT?IYuZG0pvBAx z3{*>Cgc<|m(OFVe83w zr*fvCfcpS%o=!Cx4d0ig21~D(;J=m5+S1CB3mi;i$;W#uh)s8BA9aKdQ)}2bHHCSp zKFnXWVWFxHk5Oe!s}ER-lpl{^OP69TDf8ODm(PFDKq#nlQrmF zQ^vG^m@?2|($Qdg;Ab-#+g^W1{GW&O(QKB1xvcB*Sc39;6E-bPqRxr7Q*+c{)klv} zO|*w9qkUB#9i-CeNEJuNt1voE1<^Umk1keTOpS74T9p+&N14&9Oc_x-O=*!QO{o!& zn3BVOXG#wJyD2HyW=aYIfnb`=^f7txTX=3~kqi0cLLs?O#JZ+{rFafH5KE7?B$Mjm z`R<8?(JD)rsNw`46~<4~^!PC4#m6cqK1JCHS;|T%lr^DB83`>)OXyZg!U|Jz{B~1f z+zC^B%negq)Z3=G$iJE5!fmG5Fc1ntY^D!s^EZgW)A)Y9m?dx-YrAqvg;Lg5*fXEF zw9+<}sm>}%8KJ@yH|3{zDK}-RvQk2nnG&sxlq996T9uYMT`8#*N=|K3VrrM-Qwn~aG!3aPt2f1 z1FM?p6WG#-ZG{zFYb@!f#NrW(D|S;%v6rHYrz)~IL=nX?3M)=lXmPfJi;ERhT&rnC z?FuMbq^X6QOuhw&O;hr(ntXC!Gx=nHZSu*qnS3%pI!LpbenTESgRc+6ZzN)TUjli z$~JjdERa|E26>hpl1Iq{axZ#S?gd}TBcH2>xi*tW4#>8dUM(RP>KU8hy3j?bIG5Ug zKBXX7&g)sTsW-4Im*2;=m=)O6Uja=cHMPl2eobDQ(&R6nM!t)*F;-rUY4U8$mq%lT zCSv%6`gwAzTc>fg2Q;?&ipEsFtg&TZYHSHB=VDOUix+5v$B6p_aGitq*kbzSGHNcc zj8dRuA$@}Pv%1;$j*WgZ9p%|MSd%(kr9*9;M|wtI*$$6UFI zez}EtVl(}6Be}4FT;ToWHPqhNGPF#yBApcmKh>oPu{h4a{M=Ig!u377|(K`}_%LpyNv1#bIz1_kJ|Ul{BN z1_JCjfE@=W118}Ev2?C1lABoU?WA!Dva!Ks`~BGW2KIde$uA7V*svD;0iQ13OFQt9 z!v}He5aByah(HxEp2-pq0&&Ch80~PJdq7U`42qN3KzLc~f&L`ZaNvqF#N#Y>oQvm} z$9wgBZa$r!fF8dxB?ykS4|A`P9)Y~M8+{pJf0*vc08JhMpDRYI^M%8_#F;jy~W?Y zPXd0A^Vo2KS_kgaaPNn6<7rX{&Q|!!;IqONeTh8~gwW$EdoUj2StK;6-3@pj1&;wv z*|R6*DUQ!r7JK?RuzZ^K@;R|}0z5v%)xCTGT9*k$;x(%KOFWtqf9A5{&1-}D-bU>RJ!oCnU zG>HKAgd|ZsRI+$pzy&;#>r0&a@(q6XIrv^D@Ou~BtMRv+Uo||)J`{M9;SGHP4F=9} z@C}2{={3&JpY~`k?{It<{2sgq2rmU`uNLwp$G?Jq4(Q#yZrsFfBOW&FuwjR7FQ74P zIAb%a|FOWRvkeWxIJyC&<_-k0ARSBx<)9wS0JFe6uoxKCl5y48sNRe#*+w;a7CZ=^ z0e_&<{TnrO?{~5MmE&jNLvRQD9`x!SBRCowgn`ju0x<5$i2z9;8x(;m&svfW-|~l7#VD!XaC1t{vSAg3ht;6y44VP$Krt}Ly$jyg`*wC!+> zT0|K>Rik?}z%@h1X_uqu4~N(rbAa5~i|VnPcXwjlHaysZXPZ#BHp08%|G?I#*Z=R~ z{sb7^-5743Q$KtiL2Hhu&Aj0ZgfEi#C2-bs{K|o=0Io9ps>Yv27~9Cm+3+nwv0M$; zHgu0eMCCqu@RKrBGh-*y68Mc?ZD0{FZ1~ws?d?d-$1wYvGqnc8+#}@1{q&Rb^wm?e z$x-yNgX|sKOK#lDo|K)~u?;)6@EqYy*s+29ScitX8ck>=ePucSmSD*uqCX$&=i<>E zvUWB-$>`O_2xF+61`Hd%h5Liy4Czcax4|Q$n2rWBk2u<+DGksO>D{VKGuf4%1SpP{+^yVX5lsk-`a)Xe_-)Y0#p+SrfM z>hwFcIQ>=4>_2I8WTbKEg^g+VFL1s)k*S7h_vU1#!bwcKXK&mJgezCBwtDaCn^Nk4Vwn5t-^9k*}_iC7L<1S{);s)i!dbT1PEZ^T>5-9Jw2< zoUIia~(;g1#HZFz-$be3|x`=8SEi_c6^J=jT11EQQ8d zv~o22AI6N)g0UW&>*|Nj5{%9grB1g5wY#NhhFi8;+zQn+zCsP->s2?tT{Yw9scQUc zRl4m`x!XyVy53On*tb+P=5H$EUZ6sr(Nc&WW8fQ>9e1WMod$E6BZBEYk{ED26hf`V zRI`S-ES!k`;675bJjScT!&@^Z1*pX{Oii9KYVb@_ou^ebo_VVBDp7@3jmo`RRq8cI z#a=7WJGQI9^SJUot}EC5P327ZRypGt{oMdsOg1{q=N_~J{=WeCV{zm`0?VFw))Ubz zyTYh*_+7V;quRZPs@2C;jc76TQ~Xrp8>}i{?tk!&SDA0BN`13c>|3NFzbX}=#pL^S zDc5hAa(uTc%lD|PJ`X8l^6N_X`daCpjQ$?Ly%(PlgSX&%7Ty~vv_l&0kV-o+m?D#Z3EBG5+k#oC^GaFZ(EI_g9Jk6B#TCb68vE(;vXjT-G(% zF^|}^U`KhBlZqmTX?moqaw9#I6*)!L$Uvn>hAS;HPN|WpN{-4=QdF@LqiPi&)vmax zg^G#VpyoF$jV?E2(alr^57+SZo&UR0n6ZG@)2w=q8!L0 z7c!~+X`7M+2j#{MR#u#gGU6sGEsp0u#sw%TE>wweF-nL_R$P3RV&jVx6JM>U_!)|f zpRe$^^$LsKuaKBa3XXa~!4ZE^aM&*j4rRA&2ngm{3T^&8{ysXLd@La!D<}`ZwsP_j zTW0fqV>Z{D)6KFb4^V3INF^t`DKXhg@yULQO%7H}a+IQy6BU_aRYXdG!cwXfn$oJ^ z@{j&m{*hcMiU8qUQ=!do6ZaeNUt+m;vX(vpw$xA( z@pD%xYs^B{`FtjY@AZzi4pXevRnb-tMOvpQ!WyVBYlK3r@d~k~E6B=oD6JI=ur|v- zV~+eX*2p(~k9<-u$~*a4c_)4<@A#kO6UUXJm|na=9y|rdHTW*p(I=WHJDMqlI4*0T z_Q#fbepi5viPIg>Sq3XS&qbkm6BL~1t)M)AP0I^aKwhl;(PI42Vtn(;L5NbH5N9sP0Q{viD4Tj&#Q^ve#$$9C$i8I-2j zQ->}2*b-lER!|B0L&*sFmyDBN$t3xf_{pavSl%U3np~13Pqdgx#U*ktZqUS{E{!i* zA-95Ea-DuoWAmQY*zAwwn)x5OW^ffT9i-Xx0&V^nvA@5S@v)OyV>bP=o3Q~H&qV3u zy=v^r!IoHTnOf6FldA{Iv)V{J&eW)i zpZHvxi1E`)Xu!utqdTYgluthBoDEa8s2AHMZ-X zh9&A>zfJvWPpNP9P4%s~qkd)oQvVWGu4pj>idfsy?hkSPi}T6HCFo%*7#mhHK7skm z>6g4$j6JFRJ`8)jiO-nX_8Q!Ej|O#()ID8p>fhz1ezW}5cUHKZW+ljRX0{w=mdUQO zMV5{QGPP}@fIQlJ5xMbgnd<&3Qw>+os#(FJ$2v)7Re ztJ#CG3O$V92Q6do{Zi^q>~db*N0!Bd2-avY0eGV+1R5Ls7+li;iN2toK@Owmu4SM( zKqq^E#$}b({xvrJ%;0CkF0Kd@`^)%#2JWMq=@Z-Nmte_OKDveL|F~e?NbQSFQ~AsU zFbv!JtTUq_^aDc)nhRh7vTh1s;9Z-*gqwpSbf{G%_(}+t@8P8PVcSat_zU!ypRfxX zX0z8CAB{(LoZ8M9y$iWwH-COF9{~;gOiC+xC$%T=2CiTbum@bs0@$$&J9do$?!XU( zgA^K-SnQy&w~<&|AlP&cn{Pw#Dfayb+pu97-+PGf=ioW9mt5G-xBwOtwl+|~>r9R@ z!2cl6!2lx)-}>1Uv?AIWY;-Hcz{;D8Y^w zV?aJ=Wudg1i2=u+zRg9WFTpQ-o|@}8V*);Ifp-bMwc}R>oLTV2z-8PE#4@bsc`O4S zWe>(JF|dLs!PDRw@GN)%ybN9gzqPRMgqYkJ!$nhH3YU0_rxNa4>EgJReIhva(Tgl( zKjZg5=os8P@pmP>UHDoHZyx?7;9D@9Uhs{9YY;pR|K)iFp4Y)|?&2+u?|?smKY@?I z7vS5z=pdum58^{16$i?}0&p+D$zO2b7ej$C^ai8OHZ%z1XlNoHz#l|{6p#Z-Kn-XD z9bh(C0G0yd>hUJ96C40WC3^)tj#lsvRsXkCS6o8`UxSZ;!E9&{uY+FQV<<;MgD@}* zxB+7iMhJ)l8NkqD%0Mk>M$s_tMVXEMv49G4DHXNx{ji(i+Qq(%L)>9-mb(2K_4A9= z?jKRd{z!OwzYq2|91RWPHZXLEUhTus91IPjFBk}1z$6d=j94VWnFUV)zLazRIx4o_ zdr`i|jxVX^KF5yFu;UY|KjV8*-lsZzk2>>RRF1c)px^9KWSAp4+f(2sxB;$%UT#DC zumD2`FzgtPf8&Xv4?YF+*D>fhsc>ZDOA$&!1WBxSEsw?9Yq|7p*jk87O$L165~xCjhA!iL^JFa2NqNA~azqTR-zAMsrzXfc0O z7&=5e-lU;@aN7YtVvJc;mRz>|wlh3vy9gR2Ig8sTcA(w~h!un?|Q^pdS`93WFK zV$qXC=Y3l0Up>8O70fH|;=eY01^4^F=;*YYZX6^> z_hH8#?6?;@c4EhN?AS`XY$89n^8&7=aBa{EKD7*`W-%?aklr|-emW2Cx&H@-4UF79 zUkCPEhS}%(FyvZ{;n)m!fBYOln~jHaGJFB(EMaiP!j%j|2EOIe8w&Bd9KKqZTi}~T zk6j4Y8m!q#rW{A>co22Oc$&+XMC+FxrL`413@~ErbA~hHmdBSE(r$sP!NU^N*@A_3nPF#)j|k`_D{uzj0&e_h1SF7bi0Hx-yUP z{^tG;TGM9;_wtO@;(n9RS$s8jK#*p$CuP>acy$g+QTw1wwGEoCR=&Tdd2p>72e+zz zNVjT-ELZiAt>_&`R6gjcN(a26lK!8oxZh7Ic1HQ_3!E4`@&At#m~Om@!BpD7pShfA z=HO(ec5GS0w6kbvKg}IBQeDHxt8>I;bQYffI4V@lqoUO~IzjcL(^NY;N7XJxs&c7R zg-eslTxO}nWr>PhHmP9rA?1&{qP!6=DR=ni${EJ!&%Ho7=rP&oF@G7$bOZl$)0lok znc~A(&#)ZZ%g>v!W%(qQT;tFm#tu=d>sU37^H9Cp6xF)%{Dtx1>@A5^`S@g&j<>3K zLcWS7l&N4sz49k?D0jj_G>;9+8oysww@b=!eO~EfKULb8pOuCdlZF=}a25{1r^ zpnT6X<$C5Q2Q4Pct5#O8Hf4CtSDM#4rFiaD@+5k-`)wsm{8$O&e^P=Qy8+Q*63}7( zL=22);ywZIgNZDUl38{o(GE=cYgh(x*-~w^PqmM;%J^RGVzih-pGnG}GDW#l0@+u> z_diVG`HNGMmBD>VX}*O@^{rB}Z>y4g=PJQ>jpC;4QLN8-MNfWO(Ow@ZdeVOsjSdry z4ih~Q9iQ{R%+l{B{P(A^#L6HSz_wJ@6bYn=kKCy|B1@<_g03# zztRFiloAl7TVVglo`6cAU8-ccvNxS8^eU53uEUEa~BG&%C7yu$Bja@fD* zjRxb52IGw`^cs2aL^kV9RuDOvo{zv-Cq_8K$Y$ zvGTLJYl_uJK349*u!hUa8YfS*7!T`o^p0vx$Y|I2j78`STjZL0Tw{|T(U`!dW?wC_eguxo@SSdCo!`Pbdj@4=E8}A`Ykh2~sbvoawh&?kOz$J_{6X@{ zAFWCGZ8%6ff`jBsS%|~8eWpEp(SM+QrxUT#q%|=Xrl%c98v%LYwDN# zmilM?UH4d7xuV4kLW_Bvc7G853mwc;v+0*}sr~0uI)eqgZtY?Z2DW5iO9XM5Labct zxd)_fpoZ3t)R0;?4XX9jz}l%AP#dcLwQ+K;vC65YSbeG+Zsk$y225SY*n~ZitI?vc$qhS)tf1}#THyo+fe~OF1FI+S2Mqqph{e(( z2AM{Z8^afFL6bR&jgMp7huHP+o_#24ry}EA=hibmZe^ap)LlD~PB_lqj+xu2|3M;u z9t^wyw+d?jFavEd1MJv>9b2$t3wCVr0<_8IIGiCC8>v*rks&?DG)2iv}< z^Am?f=nwdN2F_#ml8<}%lf9VCu@#g8BvwVzlztp1fMLK1u*f5M{tHL`cmNmk9Ivo!o7{1-(e>oOlhV zvEdLlfV1!(hi5k&YdQa%lzQT~U|a?Kg;1IKAPI2XY;1HLl& zGT@1VXDS>M;26RA`x3?;-Q{79oTf*2xykVf@Dz9kJO^F`uR60p8^whx;&CUE;wcZz z03`o=5WV{Xdq%!sA^D?@z`gwpZ2<2~c&jhd7w@Mp!WVcQJ@QfX$XkpD@R*MfHu=vsUSHsOBu{~NS>2BW zhW=pedoYfMCNcr|f-sN(te^mtgF0YTCY@joFs>G_0PDb3um>EaZZV!o`Y4s%Z_o?A zqK>wq8T38}#Mp!J26zcP4|=%`&7nW&2Mis=*n{B(0zouL0okAkRHA*ddiE@AM=RJz?R=67_kQ$(+tkp1qJIB3{~OsU#Y^gdN^9q2Rcy}y5U&}&kA@ppcU+(Ne-d{ouzqh z;PdNf5?|AVy*p$K{lm~cu7dkP@4Y7`j{nsl`rxPW9L{lYdhwUj;E6!{NI?6@pf1is zNhpD%5{`N}T8MTB8bLQa3rWWnq~%7^a~GBNQEKN)Sn)JE!Jpv#i5j~1J``gg#wlQE z5x;Wx+VDMk%s1>u`HWb6K#lo(O+otz#*=9DfFx4Uia&XrwHS^{IO^yg&2*D?be7p@ z9}D4H371jv??wAKMb&+cmU#`0;5+n)Ufsh`&h`Q$d;YHtefw~56o-oA<*RBm|4caosToTuJCOWl7OJ5CahV^rRUskslLKJ24v-_56X z5}EC^*jBQ2Gpw7yMqup4_^%Crh1=*(M%QA7=Pw4pI}*;`Js20M`>7D%i6wr?@L2IF z4~GB8-g|~ebzN=$OT7#AIwOr{B#kucWz>5|NT`AkDhNpk5LNWvd+)u7jxiVv7#Cc? zCGK_-mnVK4$Bs+fyAyZ&|Jxdf?Ywz&JscvpYkah*!&a`ucp?0^mHFb5zu0J+)*fU})fx4Nom5r@JER_+7RoJV;-U#fC zlJQnOGS+H}jIo+0T~>Iy*RZl0q5l%zY?bs-?@NQ94{( zq}{bkT3si}NY^k20iR ziNyyj$NEi7_mRwFyuX-fXND)&U$}cquZKp)dWK84SB!LeCrO8QI(tiUrOl^UT6_je zvu~|5`8LTg-wtW;>y#{f82n zdQ+L^S$Z5uA;(By=>wN}29|;vYZ>G3E~5hiq&-k4twBZ^85EDsl8Vm4^B;oqrCw7e zb($)v(KJf6rcH)u$4aGkx>RVFN||P>lms7_VkW<$fY+qR?`tVSiz!5lDMX8T4I58k zPhAUiK8tq9VJ_#miNBX6vjoI9y%Ef(q0TZg)JK|hT4~gUOTEq{wP8szG>qpzgyqPP zFz&youapXXos{WYq{J{riVahx(6C7I^_wLx?5O01-YePK|CVgcKO`rZr*fmkX0u^Z4C4oh8XMGKiVfd;d(V0ChK2n$vEcpp~$xVoo z?1Xs9N=TKA#B51VERwXOA!1HyMC%wO$w?C=F=;Lu!#asiI4E)PmnAm#1&K9%A#rFh zacD4ck^GK=zaPZ^7qNM2D0xmTOJ9~LW7AmabI!T{eJwfegZtvz%q9jePTF$qLDQ|d?pSd@8zNMhy8QMV~)bbon#U8CFS1?mp3GUl2{^ z^P)-rRJ3R?A!slmDcoC(I^K=%&tm^*8~w6_HSTCqqEYCAt@KN{jDkx&TngcuTyBrP z;vrF`0TNjn%6^UrF_gxNzBEO`O0y&sEheP28ogtL1ec7Fppxlm3@gOHh-YyWoEP7` zXT>k)6Y)of@kfUVK!>?jO+2#Py{(--(M7);!`LvEpQC%=z~8-a8U?o+xa8A5i8a<@ zsB#e<*C>Tn1&g+d`(Rc@OEC8k4&old0YeJJe@LbH4jC>!L%PJPvJZ`6xeThvyJa%iJC z{H5c*y#Wm#?C07)TinLJFy&K?(MmQ*i2X zM2)@hy9BqF;PoW}0~~tLAE^6rY#&-jpV-LQun9>8Oxa*@Uk&dUz$qC{5g?FrT~=aW zf!DGU9xLIo5*{nzu`(RQgG_)gmec8$(SS>+z@nW@Lg(T5Jp4X`8yse!KT!TrY#!K3 zpV-bA4Q7L}+wcMJm4nPJ=y4zvcmsRD0u!g*ge?O+?Xrz_*%m~D!ed7Q$6Wp%%6X$1 zba41aD!Jh_jr}bAKVcAp!*cWo%ISyR{@t9i2by3KXam)_jxB$Z#4#KM?866ug)UzJ z2f)D_IK=Ug10CFh0s{#!cpOUtw8_y%{>B%FX^#W_eD`6>_z1_tVJG<(HV#qdcFJ20 zrcq`mbtt1Ti;xd)KNPC=rm2OmO{e%&=#$js&w$wh9EXt3id>v)`oI``T z0~;4^;3CIM;4&c8NntFS$O9a&fkz$DLVVFB;PIlF}Y#1b7+{ZX}8~ z_Jr8-=B zfVvh%WhlKsWlS@{e6SR(A)DMncCGHmp?>ARi~Qwjw2$}E3@lH{eVgNp;3@D3xCSiG zA5r@+9B*I{$6#=CKT0OAl@?QpCQwg?)J*x7Yf=6IkFUtuzJ$l;@c4|(>tiw^_3Qq- zOFY^~IyUmLq3#D-P5BL!-%R=K__Pa6VmunbWPCdV zT|!-pvVwYUB24$v8mG|;uA&vZg3W)hrOR>+Ns z^eCBZKRgbR_aA`AK6V}Kmc``j>rjMtVdn&`b02@Hr}+NBFmJiD?lO)lk`)I=3K&{s zMb)()MH}PJ-`Mq~UTP0UB(~zQW5$2k*eGPbM>(Zep>Wh;XE-%(#a1VJ#5nYbDfEyz z*ji3>Y?dXkTgbpNj~1LmWX;CvETDRnQWq76Pr>Uz*}o3dkaLIFGZcDYH;`dD40}=7 zN}xnDcCx8cA$H2}_z+sZ4r{}yQ!BOaLLcbG-ZX42#Ku})?WPx>!9x$D4ZOprKN3L} zl~W!6fxUNt8de@ofTiAA@p58=PFg6X?Gf}TZ?4(h84$)VL?oo!VA=If3 zEusl~?Ra4fiqK^Cd(6QrE6_c*(SwfTC9VS@vPYpms8Qx7n7!mR2ZlJNn)?~jE_gE? z48lG`Eh9U%aHWpEC@Na)h2z5*Y;hkNQ9nOw z7DC-3WSmv3^jIZJw{^O7+VC6<+aeidTOn?j=(1UMY2hxCf-iNU8SdmLVQf&^s1LxyJ@6 zbw4B}Zro+p`FSaF`bdf#f07~xMqqpP9t5MsVgJ5(rqU#)`ef$OM3x${tZU&iGmK?d zAZsdbCmHF5{@|^VVLk?F@QIc>-vo4)RH^pMk}AIfsq`zC3jd)}=HDcx{-dSXf1(un z&y#%rb&}_IKyrL9O19VUCEN2e$@X9;9$HMc8ydErSd60`QfY?_+JWh9XF74fw7)2U z^#s1@!6zd%cI;{KkeZ+XsSXO2A;A$cI5#NOpBmLs_=i}G2|mR~WB{wWfa>5EFOFvjL_4SgW zZ$s}GC#i;6lA>QF$zgjXQFmSvLY|QX&Bv064wHxulNdnmPa8Z){qMx?$s(3oCG>}4 zmU{&(J+oO;q>&=fMmz>ZDk2@FDBMd5A_Cb<5-Qmd5t0=VBN-7%k{+2MX_5J2MvF-? z)=ILm1-+w35{z8`U|cD&k-H@(;+&WaPl+k)BZ)zSi9v&j(USY)gZpz>T4DEiIm^7k zEI+}DQr5PGqz8O9inggIPDm^_ z$$5vewj4rgP)0oBn|6G}?JlGw)mkzVTqHH#Tax30Br#qm3GrP2kPs)a2`LhjkS(Uf zVu?+OC0=fY&p5Z+r#oJKCp?wkf7<%w|XSl6XpNN`S2{lhaXILVdl;c?f?GToZ-O zLnG;zZREUQNh=(h;lTTCaH)k$A#sviVkO}P&gd&%5}F?<+I*d8@*^cUKTZPkQzd|X zG5+~w;>-Pmee&DID}N$71JB~f-6HPUC&exEy11pkEgt3{#4{EB0UhQl{=Pu{Ph#_6 z2kB84V>DRO2?zcj2cI^$4TVb{?L$+GzQSGt%iP7k%uoEvwBl1{5brXRc$FoKM_CqH zM~S$V)`&}Kt2meTqBG1BhvJQ5UwB09@~?`0E?3HC|3jS6VVu!n?xFq9wa_Q9xxa_8 zVLTjq(MLH>9}9dWQ6i1$|ZC{;^ z)=?-n)m36$g(IsdWXNoOIA2TWK1Aobn@0T;PW^%;?q{(=i@A$Bs_T)CVsqal(!;5Y zk$rIBIDIm*!UUv(as2L#Z!$))_a81AiXPNtCw9Z##cH@8Cul)9h(*X`z#T?M8a9|g z1?Q<7s?^UQs8^wV>?e7-#E-}?z~?gx{TWW^57<9Vz5B7bms7VwdCeTgX^wp}kuTtb zoFhe?lR}ju#*lZy$7QrNAG!c<29Q9Y0}Q&O66wqgvh8%XHk{mw6I&>JsdH`0w*|dP0;Pri3MyOTtdHG z!5E3lR)Lw&9Z4xQu}3yB46A6P@bT+bM}fp*|Hi4baAjjQ03$LEP~ zGAtwagqIV1<)5(SH9Qu>V=+7yhk_{HOW}ww7S-ZZ8hk#a)qa%OC*b}&xP8Ec_!Hd7 zH?Y&sNBcI@FQK^-%-8}={%+ia4>sZhK92@k-~m4yz~b2g-jfYhz!A_c8;H@3IuHXg zKsoOb#Oo#zXe)7YKa@yEef3a3pD5*Pcs`HV*0%@=lFp~7!65a5R`=ns^2kTSOJ zV|)fv_Y>-1U?0js`T~eNgbsC>JrKaEAA1T%Zr~Wl;{X@`Qx~}npPZq;oP)=}bvXr= zflzJ4I=7CAftWb;BIke2_kNas?CrwND(uX{Mh|5VKT6l7Y_$)?bdokWO&i>X2E$iL zdfGUy*vLLWUqaa2egU8c}po|}_MgfBRiM_mkHw(Bo&@jH0eb`-( z-TBy@KwVl+(FWMdK1&;5BaHHWF3}fnmVXcBE8M5-+`xkzuY*Uyl3t=CIk#8nq zBLf=+)T4s(Ybbvh<+o72%G}1F5%iKPPQ}tJnqVQeR*|=FLHjsJ^PHu=4^!W_2kc&< z^b0`g5XZq$@H5T!YkZF{zT!9TkH~f3#utAf$9#pn|3&iLKcERc%QYZR!Q*%Ec$9W| zn2hck+1-QixS#CrK6uFa0WYt}01mo$RQ^}WS z6AeqzJ~p67>_sb3J3_9*=xuUXi}taR<2tYw+~n{X_TK@o0JR6>5qxn!adAa-*owkV z0{%socu+@u3FdbV9(IVENMeM~hXV3>8BSRzgW>}|>Y-0RaLz^r|H(g9@EP%&c z_AAYX$4ug5Iz0N|F$Erz@yA5krI-FP7K>w047y<0L0@gB#8%X$kwkVgy=?@xZ{j^{ zy=2D_=f*JW$uRH1dd3y|_LgaJIc>5~yr^Fg_QGgsBQ=a;R7j@fxef$>^uVJV9-YKT z2XWd?zir{2W>_`honh3Xfyk_*m((&s)S!N;U1vA(S8P4&g%5&g11(bs*vIS5zRctB znrCN4ZCtR+Jt&BcG4$6?VzdJu?ey7J#*UHjXeLgZ=r6;t(m)OC7{h9;CP=jvN|Dt{ zKG_Y+GmLbPva9HC;Co=XBhstX{c-Hx6OImLWI6=9c)ec7G6XI&nf`iRY^2l9P120JxMxii;bIFCp3VAqWE3MpXo zX`bV4l56*{k7KzJ&GH8>eId-H{>){b z?0<0ekXl!N8R`}yRqo+Z>28vWK?zdkVU|*^5i0g9lp@c;Qs7x9d0s7&PoU`Y+tNs2B~l60|>s7scFuuO?Zi-}`jOpLx! zO!^Lq(sTWTexXE!ZIN)@2{D8`BnHi!5+3}$LTn1OWTytW*HGqk{s?SiQzndB0NN5!wnJ>9xbMbM2U__m#D~mF-BHM zq_JMYjqPGEa{YsGf#@PPNoe>n3DG|wA-XptH1s>sp~2`h>eJ>xWH0p zT_wx%3etmOQUN||p>1k7ub8$;i?x?Hw3wJ^Ux|(m7Grc6`ifB^Oz{$q7Gp5wN?1%8 zT1TCP@=R-OOs{BS=1H(=qXco0c%YG4DB^VqGJGq+dVa0Zv6i8HbxqVM?5pMP_FD4I z8kXJFaNxZjxV7Mu8rr4^pQNSQNEBL31X_$CK2Y@Wp%NA!A-aTE2|0usiHU&0*mjbAT5asA>QbDwx~&tPBUH{yp5Kc8g4Nl+aWU^c8>6q-rHN)gVEsCJ8``@kfjCODz%~bG3M< zHj5X})b>c7E$%7n#4Y)dxF+5$uJNykdn|V>M}zT<=KkuGeFt?u-blY3!5V)gV*^;& z42R+5I&e|j2x{O`SdIol+=QdW1aXa$f0mEJ zquEB$j)cKEJfccs@kuCLyee(Qp~6jUD}2SeB3P^{^b8;-K;TvoWaV_Q@_G^#3ND=j zmJ-xEapqb0JVgTc0R?`~kLj#0@&74KJB-cU6W}lj4wK=)QC+^#Jr2nLE~T84*2?eB zoF7cQxHnjfO}z^PhZhI{p>$vdyxIhiLE{nVH3auioLN1QL3R;|%Xavkf!E{kd7l7- z16s^E%07XegV^1L%QnqqoCXVKkQVdzDBkDtA}PQ($#4nBFaG$&nWClDiG~_P!1w_T z4l{rlz+gXuU>`vcHPM*E$1~8*NBh`9VW;8s7@Xe4xp1i9I&VHcHkCdxi?LxIW8?xj zfO&kScMiqDg{?i34VO5o6UzBsaJIv5(ql)!;EOT%q8ndy9H3kfxjoI!zo2jPAdZg1k~@8O32u#z)>$#EJk>)e13*5dz@LxUs1HH=tcs(Jrguu{sz;Fwi7(Ead%q8h9*)bOz#fn?`~uD)p|}Bjvcr+U@*u$BvD*mJcs-c+ z2;v>IhpOn7a|HjNX!vh&Jo>{e+T8Rq`Vn4 zRX1feQf4t_nSt>rZE&16I6)kOfrbAmj;C+nHjcN0v)~SJ0bB&QTka)B9)QR7SbjJx zV9_`NOh+5Rk@sJ|aZS#TvIm>%usIid6Lz9?JmLkXd5Ps+AcW#0)d-2g=l zXf9Vc-UIFf4}fdn5kNHul9m^p`2iIk@5HmAzMOl7bb%!#b{Kv0n#db(h~*v>YX61O zAe?~GM1nv#hzIE)A5?%EFdVd^4RoSvjAeyBNxozC{|y<)-^qf$)Qi9H%@@EE;2O9OC@sKp{mHNMf5pQWgo0@7Bx55B?W2giypjy5mhzh@ zzm@Vk$rHztEleb%p2j|jIr4@qL6=yA)$Qbu{p7G0&?KHBv-x=7+M7ox^JSltP>0ksd~CI@;dKDOLm=1<~4-8|6&f~boDJ0@%-QGN#H=TUwMU7->`)?lL% z8_m>f6y36$x=q09G@@ZXIr}QKf*rKVactd3{`?x=`GMTsawXLYj>~Rv_y*e_g1>;@ zgU8Uv?nfKDOkCW77IPbU{|VaUD6w&vJt;Tug|UY$au=EFPBP5xX54t$9{W{-jTU*o8{y&86o5EpyVEVrY@SoUD(u@!}#czR$8b;`g_E}4B1bt=bJ z6*aG?6`Gk&J76#lThqwZ7ZI@=@XkSc(M3M_FIaw!Qet`XQ7gv}u=gkMJ8(BpLtZ~% z_{Ohx)YA>SzSz`IF9Wus(IMiolY*TL>XnPFB6N>(tX5;M0eda5-qm+47q=Q{DxJ_~UNq4^B)gHkPSzA#K9d(bUKvn_BD{ zuoaEB&3(-Bx34ueL{tiwAs)S{YRFof2vq_qdr9u@RcwF6G! zzwOW;JQ;5N@j(zi06TfT-iv7#Uh1csNsOQ4=qFuhLLCx%;4&3{Jx*5AX3g_2(1eDeoz^pM)Y4am(r2sSQE8PbgRQfq+`2$YZOWzCW~da} zj*xuYPRX^MEZMdTB+G_tFs!)-!|Dnn&3~aXegWA30G?&}^?-rgKbm%6dfN*&nOJT_ zvY!%Oli=6s%M#Gt2Ccb>BsgA?1p5~y!S*vrut9&YM#I)I#bWbp0(~KcSOgoA z$o=DJ2YB_uZ&V0NVti8JWiN&9?vn5BCpm*O>?h&=3m!(v@Q9N%&tx%sW=e`zfh2oz z{eyRdBzU(=oc9EY@t!9puMHCA*)PUH_lVK;Wr=e6Oro5ak*FX4i{evIZKlrCf99m3F zK$(~VY9%Uw>mLHfqcO~p@PKuq_dg_IzE>p7>%TXElrZgBbcR_HqFE!_-~*xwx=VunUlfhsm!d_33GpWPPh{Cc-A`isKoQHm zVwR#D7vvL<*(}9b4mKyVwxex|Xq)tKTZu)Bi4OG^V`!j6goa3XXt)@3F{0NcNf=s; zF04pG!>UB9A0Zk&*FS{Kkif9j5}?~J{vnsdPxFHK2Yn#{=rDo)6TaO%P*Ds8LACx!SV4WC5E*-J>Yn`okaBse-q0;6>jfEMF#iW5Jy z7++H!T1SO=#S9aVm`-sw^@*ElxwuB{5f|fmagKOaTn!(KTNpcO*_(3@ZEzM_N3px7 zmhris^=%y-cs&_DU4!Ak=hbj2o*cXoEA&3|&Eso|S zu{URlotbBGm}|w_+)k1-2`u8v+ej8pBVs(pg83bOxco+}qFL8b_G#*U2)nylNIUq- ziZ(d3!eJyFc)uBL)o{s$YXUwYYY5O{l)S&3bVGlHQfoz@?OfCvx=2=t-?0O_J;95@c~U@lt2M))14poie| zCVb$K%GwtD$FQS*j^4qk8z#U3%!N9)6P2zW#z?r7z|l-Q8SzOF?dAq|L~_7nTjdLa zNs#rx1Q={9a{*)(`3edtpN;mh9)3sR^Z=aRfDat9(I2pXgj4oSWPF;+d^rscU@n+E zh148AL&s7DI3{(l{{Sw2w2>2h*d&R*;R?La69NFfXp983M+3pzKmc)VkksMS+8GqI z7S4y^brnvp!wC+>+;gAu`zJG3O=o<9>UvzZY##H~9LDLHnCYV$e4YuH82l14hP;a+ znG(@AtkDthMF+kZ2g~O*TWHGQ4-WM_O z3KIbwy2$;py?+h;asy)|VY`&$)OFCM>1uhu5I)JA69EF?;*LO0QPe{01jHQ7;&b<`O)#i zS)kD-$B2s~opb=&;}9nuc!2MG$oI)PDQ6qyET^1ll+g+5IHmBAWgkk!Vf4s;G?*il zt#I@Pj&W2t4o-qo;5KjuoCSA)JBg9I@W*{dG!NS3YCW&<#TA@(=}ta>l}Y@cy%2iP1p9d84PhI3LUf&Jw1yqs5*pjq7W6w1> z0o;cqhGdR5d996$+UW?dQt?-=a%1~9S=Flj4%RoIbP%-%!yo8?38Vn^3t$OQJG1M_ z4@aO$w6i+zB2OQOE-@LMU6>^wAvYP)p*E6t&1`h+J ze_RG?FT~H#{VfzHFQ7sHh`>%f-%e*Go`;Px^oT0TuSfS7L8j7%CebCY!{arwkXOmT z{zL}&5?SsG1nut$lBdb7euveE`Nl((`T)2D&Vo}w=@7rQulQI~M>pyfKz(%7BN{tN z*vLftC_q;!qwFf`Q&0I#WNxi!1f$8-$D(^oq6ucOA7cS}!77?&8}^RST$gFSKf>l8 zNNEj?JnneRM%2n?W=(Y)pm6BzW|~V>~>@ z!lMTs-SFsyM+ez|J8{b0Ft9h4SJPp&lwP!z$T?1{U4!YnM6_k+nc97(eDJsp`UAu2 z?JkyK{^lN#C44qV?C_`?cGVt?AnK;WRs^kXVsuELZmC3LCUwihUNQD6u~&z^X6$tl zwUdb$t^=VLs5`o-Cmk2j>x$5A3$d^8M_Y!~LF9YB!~jG4exU9HvdW!l){%MKilqo+ zX%~By+KG*kXs1o^XoN>SJnG<41CMHW3?V)SW2u6_O6e=bFfAk!@~KHKEt-vov*^j0 zD4v;&KpEIqcn16Gez13hG9866C4vpSUKYeW4zG!D8O^ewnSRnpY}BHiRx@r?vNwib z*6E=!*h|Eo8GG5-<35xy$$?=OUdo^bX+(~S;uLySG7+DIMwmn-CSqUVai)`duzNdG z+hG&yh-jvFUN1JV1Y(Igp3mF8SOU6OOQoH&lv#U9u@%q1wAM(THTQt9F-o>gtYq3I zNrr8@q}k<3s$H3+*w;vs!$?VR=#e;w=@M(dLSpQ8i^=9JBkvR7J@5nI8cOPXIf^_d zj%h!Uc^s^XC+~(&UnEOG__YMHrotzs9=4L>>>`daeUr&kj^^`L z!`zp^xP-l<*xr-Rny!$1ljEFR;t^h*_+&WkGlV5b0dYcV%ib0T(FeJSF33kh0=fPn zC{#3DrxY96e4)m*u1ZaOo(313uyQ5>kLq%=p9<%R1ZWD8AwD;vMdb zz7i~+;bAf;B1+sN62&z#LtG+@#3^#9I7YUJePplLMa&o5@J(W4I4;&<4~cEa8)B#Z zS{%?}F3|?3v2_UBJFCg{YDfpbY+g^`y^bU{vaI~o`phQXnc6pGgqYH16&42Me_Kao1=jJyeLtM;WfQ}zY-;(E!npQ6ep4nxsEXsZNxgy9okeBzklBvu)NScEfpq-y{Hn{EOGSvn3*=L=~R zoYsv4XP`B#p%Nqw?1>Tf#7Hb0&|z+;?4!f!m)PApin($$9Kfs&VzQln(FzCnRKO(@ zt}#?Cg!b`-i*2C;4djL};0*%#VVKUF7X=8KJUVzTL6+MyJper&6KD4Q3;fzy_NDf5vk=uSiVtN?yVoEHvPe~NO#H!P7X=&^#VJz4^7G6o*q z0YJwfZvtsFW{D-RJE&|sg|=>o>pA%S0nG>w4d@Tp*@w-Y%NVCuz+ok0Ex2k6F?IQ^j@4hZWEkugXeSb zqb=IW{jt4wHDkj%IIPD99H*?|qgD6-K6!l3Wrt#bliynk3d(6d|v)7`}94EaTZ4TLjDgOd>i z@l`j#lI(vE_4!)bW}Or8X3z~`0*YY*$l-M@pV1zxmoPCOVp6)sVE7T0Mt|5wpV+}^ zU;&t*nhR8dY(9$xA-whkwt&P&E&6`}-ywyufN*08e?uFwC(yhYfOT}dBm%#b*YuD5 zw8vh)wCgUM|2E~Y|DW${-2)}i2Ril=wjh5$aY$D-aP&QZ26K?IZ-Q!&zFE-E@d!8y zjse^}poyI3csp&Q9^80Qj}}6kT&^a87|((QXP&zaz2x^ym|QV}jaAr~Mfp9HJM1uR zK$&LBGlIYq=wK%)PnD^_SAV0ooaJxA{GXc0C0<_v_kjn&BQ_*ZJ|r>3#*4XV9!+Q> zGx$*z=RNfRiN*V@D6POv4MJ%ljzC=xqXkBwR=#QlUcd^p{KmB?jp!aD$x}z6Np!P9 z?nNhGRZ{v%CM=MxE*1d=Q z5ogJKpQe?*WO%dOS$7V{*+AL<82kl13$6hb*5~lWDRNBpERqA{+k40_c~T#BQO_eu zLtV+nMgcY~&m>t**0~ZM%i*yUe=H(S7od2|rA=nRXgcis@aANqbs~0e?!)NiHKQdl zX0flj(nX-UU_ZXF?7{HDUJ$l))F%=fG1y4NhPoF<7B$VsP6_oHjIE(q9fqw|qN1Bz zeG*LO;*~Yz>wAgZ^LXhG^d`$547CqK;a%)0|33^agHwQ^f;uZn+MaK#Js3XN3#PO% z>=>z240aN+W5!Arb;`q5F+F22(`gOXhvSKM>A-p$XOD#S2s}89h-t)9JyECjUew;e zYuI`c+zZrj(+`w=rV8rJ_|14>*@L0(gQ3Be9y>6Uh6>Z?a5bMM|?#OzIA$BG2&j-`R zhW2x&Mrsd+KlU`((qk)<-Vj5L6RBG&b<3n)`LsqUy`>6!jo53)7SH0qdxf-QKJAf5 zd*tHz9F*5=I4C@0gOu$?404#lvMB%cC|s=5n-{T4G}e+EfKRO5srqk3!ld9}P8^{*sNA zEM8^6ggb;{s|g#O1Cf(}q83N5jV0n@h=~|Rz!*mV7&u(V{zYt`j9^-2TG;|tg|p-c zV|f9WF@DVD9xPXBr!pJvK|z1bBSv!=zcSJ4(iuC_7{gE=u$KapOw=K+!N5B)R$PN& z#WfgKlkgbVV9-ay8O6dGRSm?10lm}!hX<(l`ADW*mKuBGSxbQxyq*)q5)3X~eBKnu z@|dsi;}6Ei-E@v#%Vhl_-Ic!}17>mNM0{=t*$A3UQa&?`v-yt)3tyGVS!hl;m% zi+FjD7Z3KtxO;6BH_v0@>VChtxx6aw&R>WJI?P?v_ck-}n8ng6mt|lcOS~M`mHa&( zUOe7Y8aQV#T=Vcrs*W|b#tOZ~Q38Fq|AG(KKllcTub)nQ{EXu5A1_}1>EaPkAnpNG z;>z_&E&*f3DPXoZ`mYxUzkadzxmO%KUlGSaUx_n1%q9GOin<@nr%x2I>?}r;D`e@* z-{Z1bU*nSod@`72dLC_-icd@ie(Mai6Q3X#@eJ}35AGS`9uy*OXfdvuSaH#q#aWvt zj@nAG*EXRuj1e0W18ergSOpy-X}=;?elLlQ&!=LG4s$1UJwe?MU|T&Za!mz4Lzcs# z1P*X%$2Sf5WH9ID!`F;YVu+KF2y5}uIf+ZChdAl{#8Iae2c1Fe!(zlPEJbYexnixS zF#RylMY28}tb#lXN9|=UUic$iJ|SuPQO;A>610&7O(czGqydc-Y@|}g1~8iU`z$}y8ur2I zB3xL{YMHTve~_~UEQztN?#Z&HmgRpv;}e+9>v6o-4wptguf#8fa7m%)2zUe}v(}Bb z7wb4T5&&;Nu*MQBu{2gJBx4~Q%a>y7z$lzIl}21n1z5aCULbLN4lW;~!~7^`pxTeE zJ|wDJs6n<=g~#gy9n(OgN@7fTp@a%nSGfI!+3Kn-T{I zq+}eN%$JkfNfahq61Ie0aJmCN&*C3AME)qJDf=+Cb~iIVwJ}C=`a)<==QzHFzRCN; z;Zsg^GC0>n`*1m&c;Y|XTwC-FXObZg^bIDPEZQT}00`bpI$I_uWl+Hk3QC_yLoOzu zcEaf#e4asz`3V1T?F04?a>~vQICR5d3>VKop>{3UF8fjhRnH@_KRPLilcn+gUh04IliF^3%XGqW5EK z$5_V532>MM2QUNL6Zl#Se1>#VUHlSHQ99bohjw$oFHD{!#`X;4E;N=WC;AaMOfr?U zMnfo`Dk_az4R#tnsP)K5TEF0*C2vm;nbc6O7@#M!1xY z!;PF5g-?Rv!tg6rBe4%B8G$dF9B43C0*AO5hA$d*bZ8SuL#LtP>TqB!1q_`7*UfM} z4ZkNT_)~ny-UI5a_MvR&a$?c49$e0Y2iU zVl*0U(&0uB`v82=jxXAinE3P1J!rs|4meY>ruFbV3BM=c28W^K{w0AI;O{4oI@6Wj?TUl0oL#rO<5c?Fsc zj_cve-D}``6rPX5@e{a_`(tnSN;vS*hPC)$HAVAx8(ga3luIbb!zT=$-f*&?i#-MW z^c%pH8?XW5V>Ucy`vW~-te90m;}S$O#<4J3%EIIzMjnLk2k<2K$FACkvUL+{$c>!F z>#lV)Bkvc16gWk!VoUFzk6?i!#3tiFb|9;Y@2zn0%UGxJOCQt4y*vl27}qZfOA=m8KyDnaN_Pn8-1Vqt{-> zBS2zDc{iY5E9?gc0PZCLWWWPQz%g(FoQB8kAuN=L&$ENkJ-S#dEMc^f zEi3ckWJ@h*9v$RrW6&igkV*EjQk_F~y_D7BdVbm7L;il6JoaH!koV9dEYG36o1@Y{ z)Lw|=;D6=FbOXQI+lFNQOU|Z=Q{onxD3;vbE*ZAclab)%Hg}q=j7CqXE zY2a7U-;p^y0*`C(;OPlm$xwrhMs$g0a`krXbfXpYVrLr7G9TG$HO;kyx}GFNt`jmJ z5I&Z@AKN+J)FN(j_zv5jf;Yj-u9Zg~px$Ane-2>RWNXGdR+Q$ztvpm^&3CG1iargBxWH z8e9kW;EN07m}kgkPKXZmAd>RqC@ls5Wl(-Dd z7FjM!IAbBcm`4lEp>=0rbq2V(7em=+q!`$P@jH(9f%D)LzUXJ)!G3Zoei@|{JvNNg zMLmxsnYyHt7w0fE6_QDoVyBWi)naQnw%V{YhF`g-;0^V3*0p5c$~%|Io&U^Ug`fG< za<^Z#7vn?hy#kc|dw}X*sw>i68EPD;mpdASAGWmEF<>JK8?o3(qCV=^^la=D5Q(MO zs>D_;9%v#eMxha?dtuBV<6OpHJ79Jj5v=xLe8Cx(Js9fv2DY97svE1Wt?V-_QD-Gf z+wg5?Gzc#=hyY3p!H$9HDvCPAlGP_+$4tGlu$50Fl%PjcVy_N;pc#8z*qTh#&L?6v zz^)%{;3_TmHo3Fq9-Qj<61E-&m%vG&hCMa(t^$j|Y_ym@;&UST_Bdi=3_LpFF^YC+ zgGVdqfW2~<)L^ff zzq;u~eMHVuKHWhytGmoR3BKSPmb(!>W{v*f!m#eiknhbL?!`365Wm0)4V`IcEIdZh zCco^#@WEan9uL8i9$Q9wX)N}Vu$P8Ct^?tnEEr`lhNUr%rc#q+S~QUsPGGc%$MbQF zu5oZsc!()hJrnpuFmcEfw;8MmWNE-MWHQ5iH(Z+GSu3`b>Wp0vEcjwCh~61OL~qH4rrC60e%@NhJqh@$l) zX(e^_kO6NhMNdbRhca4*p!S9ki6P8BN}0b$%hZb9!_iFlO!Mo&5?-rE7mkOES{gR` zvjnBB@@ca)dk0CjcEy?(_WZENJs>DOk{Y3eV2^7sthfflx==!_t3+cnLV|3@NTBr$ z39w#;s>EI>?J1^1M`AevsMznT3gTg*af*s-|&>>9%9P`D`k!Mgi4Hs{xZt-%QE*=gm z#lwD|46?mIi#{iVn3>cs1Q(6;No*cSB_7il6Vh2`nOXM1Wo$f4Vti7EPs(+0z$YrD zi}tn=ox7t1IlD=Kv$yy=2coZph>vT8c)P}mr(3FcxbqAO_X=?x)F{q_I>pI-nmD?z z6bIM6;^2IzI66EdPPQM2v-S6KA(nVdAs$&?Y|W-mfCX9f3Aps|ek=Uy@JSh5bMT2u zDY@)JbbdDC=f(XOxK7EDSE>$zQ~Ng zo*409rgZyO&SK*T_VyIAT;(e(OIhx6oLU5jJUHN&I=Gb6R=J7916*R@5(*bDv=|4C ztJr85R5Sq~l!Q1E(1=xF&*M0?oVI{V3!l}&Mcq~+k7CVmiKcxt#POgATd~#CS@fR3AJED4;eZA<5L^bF zYN!S+yf=Xb@3<#R27y#KQ$VX9dR5Mz`c#`%7e0eK;PQwQd zA^1V_ot&hu2dl`t>lmLJ;V=viU@EVBc&`mU>iNKx@X6)e1bDFRM|`NJLy9%ph7-xC zJ0CEZajzC`lmnsxK@^`0aH@KcOWZgbah@e%i8=+JN6}*5p|J1eI5hXyGd46aSK+ed zt#AN+ydDevcHSQbpK`clz{7-3w6u>0#oJ_A@unkMf-8d;F=3`X%mk~Mm{1#txHd>q zX;ig&Bc%uJV-9>b!S@7O%p(+rAELgKquAevt!?da=!8QT96%qh$8|7Hj$*DDiKL;5 zsl}D}j4fc?_f<$lK%pItM0@1Z9(levi}uK+J#yjz!JLEhvK!DDx=Gw-!FL0EkHZHJ zNyJ0K57JNhdqy)hjA5Ln$(HxhFD5WXaU75PM)K84c&N*Z;)WAa6z2^Wd)kLdj1O%H z76*bBUzFpEGWtiU4$vN@#6$^BE9MJD7%7|q*L83_2Dj_@@ICnaB!{}_6WHE52@ZX5 zm<9(ho!4Ew*T82b@H10{5nlzt#g*n|!9pVe+DRI030x;S5OJY47}jV&1lmFpi6f0x zjq`@^zSOd=^6nYI#@56~aVc@>VtLle3GVmK^^!zwte#s|=xz~3!Pa2=mz!zC7uq44pX zP5upM7Sl}bVEV6)>b1f&8vu`K-ardX1bCKZz?njzPol61yWxBVu5ZJWd=I-j*27@~ zKHxZQ9dy^=F5WMIPZE3#z;7A(H&q~s_yzduH-F#!Y>5?%5aMI0k7Yr$l(<-0!nt(7 zML1PmlQZW$3#Hen5BI^~&mCJ>H-I_39t)Z_5jH?|BlT?JAm9R6p5v?=fbYO-byT?d z`9@wV@O{~WKeiGZ+am#Sv8{&pXpc=eeZwif|2&I@Z)DF7-U5rjB+v$`K=w}hBF7Mp z9>97RWh(G`05|`}tpf?kUXBX;zyWX&^n;`DI37&m7RN%Rn1uoXe0(kwB_|$!gmXWY zZF^_~FrDvr@^(Eapo}D-ryQR{T#t45MtQ2to3D?k@^9cc#}k06Au9Z$hg{(GWpJ+x zT1N;s6igwR9m@WYiEOCGS@)givo|>5xBpq$*xK1UIyt+zxexO6^7irb4+sj@XhU^j z`tXRzsAyA6Tzo=ea!P7idPZh;PHtX7VNpqGS^40~A=N``YU>*shc%68ZfR|6?-mR3Td;7^lBLU*uUxfy&ARm)Hf`Rrb^DH;yY}qeci`Zm z!$*!DJAU%i=`**VJ$L@XotG}(b>*IW@4NcIgAZMQ_>o6{_xKY}KK;zI&;R}pe|+(! zm;dXP|9db@4o-xr=S0)|NXZ1Xl}Ra z|NmC|TUo0XcTgekO3Ztxp!X%}16A0EsJJ%}_(m1^u`2YFh<&pP{wx*!`GkM5ivJ2a zK$YqNb*c*trw@!&onVye1>JOmajG9oQXOF$Jzp?bqwy2D1*AGWCu zv6~*TUv-Io)hABSDQ;7};tsmSMb$6vRvqJhdd4-?H6Bxa<0(4FbELx$_^z)>i84T8}yR5woL6U;9g}tgNkVY;1`cdj|(cM7_6;Ysv(`w%~V z{zOn<5HUm$;TOV)I3kc#Bn^a;C6@jrm(1v zbY8i2-YpN@^1v+*-15LJ58U#=Ef3uCz%38l^1v+*-15LJ58U#=Ef3uCz%38l^1v+* z-15LJ58U#=Ef3uCz%38l^1v+*-15LJ58U#=Ef3uCz%38l^1%P89{B9lPyaKuSFZo* zKcDc?%OC#d6K;Ka%LBJO@PDZXzIx;D|B?CUXExma)qgtU)peuS{pCNM@X5*5CqMuH z+B*}lD2^-uw-G$nD;}#N8V|&H#QTbisNjJhL~cb8L~uF81R@~b;uYcz3L3dY)&msq zLR7)Kx%eU0Q^kp_K;y2Q(H?Q&xc313T6Oq4QR4FQ zUah!pq2e#vWvz5~bobaMssNRoO*x)-NmC~#eyk*sEFf7x+yW2tPlSe@6_pppuK9W_ zHz7d`cogb1v@)Zmj=P%V=v z!n;W*k{>%xf_HPMPu|a&8WjBt&&;i20jq3#D>clhU;wq(4=kF}TT9NE+-Cr|=uXNy z$MO9-YH_2B*#JWCOEUJXnLo?s2Qffi{`5-bTaADulq~RHwLnF|@hnk=KV8_n+S6kA zDiQC#IB|vjaJ~a@yT?>fu--;rac@mwcS1Xi@unp5H1IG>!-KgW)yug~yI8=bkCk#x zD})8`JEbVo5*DBo@}FNa09zs8#sJm|0S5+)-m%yXzK#|KMjFGt<=3)LX!3&?7a$e=nJrNLefGb^uK&3#aa)j!iAg#e zxE32=&F{C!=`#lqb#dMX^-t#}%UBwc?Yi(SUY_RuNE4Ob?UZ7?x7TeNNXGjesnQ5W zALOQz;!Lj-w1zf9pzS^y_*@7yW^_{SLV(*uYuHWzt7+ge0W78gG*U?TF#x=YmpUzA z0FUjAhW2dVOaZa_LGCVF$(rLV**<%S()}NuLEG{5$}#GViFD#j;(qA3y_- z1Mu91D%sQb=3>>+JoPuqfyh;kP83Rdo`ZGZeHn#`ZuVD&Vw{hJ8ftow#6}1pQxc#Z zB|j3NpUrqTNnx5xRgv3LDCg)wOq~G%SWy~~F9BH4z$wC(W;B4Tges;ofU6w^#AMc( zR5;ojU&l~^E*^}D4BxzVS)iALDKi`-IEbl0AeXZL9}CnxdGM57Q|XEDC38%Nch%;M z=?5!9rx%;*DF@d2=P4D{D~0_-lXwbn5wtg)T?c_>q@0@%fsFvLg}`|LOn{^RpNK~{ z-Ws_Qs+dfw=w1wgFG=9zs}SIKvK1sPDjt-H=YWLiB-BtbR4B$j6aoP>hXiO_^V{kQ zQZ%LEd$Nx2C;*Xv4#pGXm7$;pE{xWIWO@Q(0|P+C{nW%F7JyJueqQ>~gL|VxBN&bp z`w*$LAuMozUy$wSp1L}n{@S@)KgJ(3jQ<@zRWhYc(N!grX9mMK2@yNQNPFnJ`;!Xr zFPnfmPC@`W5Kn~9L>{K1pp$@#AW#MR3IJXZz&leD$q52ym7}zJjPegEh7bz4DNqBN zMFNHt@GS|9q=3xs1TlyLkRt)~r-5XC8d;U}86F1S!(5#{c}=T8_G&rTmg!-53J9vR zmTNrTMc-ihycN6CSfgS_ol;Q)S)k--qX<7c>C9ig! zGEA>?>!ylk)%=rtBw-EjZZ4e!qKNj$e>p$`kLp#cx$Pu?!1x0Hpa%f(Z&{EDHroB9 z7%#*C8m@ss4rd2|8Y7^>3;@Uj023gv6#%0k@XxL!K{*iRrX-*bHGlyK*Np|X8`E=EWOdDPJZ9SWl9bP%RV1YS&b|yVr_u8tD~Le zG&6InIYCL}wI$3L44%!P!Q54~C1pmB)PU5jt)6HPfaS^~m7gEgkVJ}7p!x(sj*?GR zlKM;usR2=*)C~XxLJb!HK=qUv0LZRi%A!(~3V*L~b%K0`;eu>!B_ycfAg(fme<(E99b)3TJTjd%$Uz6f_MeiKF-7o{rSE@i3%q_% zkbCC%;r;P@V)h<9eg%#WVgei{4(-)R>7sDW`s9+=E1VZpG(6B~R|=b>Jimt2aE1Z` zNZ`pZNO+I{a)E#&0O0U}gE5R`&`(k^j6yhuF$7iA%?2ki0sv?o00uzdSbvh}1%V1M zV$^{EiV-e}!9T4=0X4$-1g?$(P?1UfS!j11Y5C=58bH^k7}>Z7Zir30!CsTgI7BM? zur2Ve_SMVk>bLYoR;I^pTJGoJJk#33)MS#0wRr4PXuxR{^7g5%L9~f@^_ZPA2SwV8FQ& z_zxU4r5z52LDZVKQpFoRsi z;P9a{SIek?8WWWY|Lhj1ymcYtMACu1F_Do`F^5jy0=>-R#V+QCLq6@U)2?Mxyq>&q zn?BRQxObeY!74M`NSi{>9skTJ38cVV6Rsxvf$D>xk3y_P<YK6;@H{HbYDDv>Pk>nu?BbMe=5_mbCylp4|E&U}RUI!9n73d<>&jFx{>Vp7) zLSV!h0x4s_NxTQd9asnTl#djSa$58m4-_EuXg==7acbS$aOR?jv?2;X+0(|DIr^*$ zPrg)63*{v@Wu+S5lMy*gDwZtpTP*PJl54pcX~&WeB_t*!pUeT>2SP7`-0Vz^$BrI0 zsQ;(>eFlt}=KBv&&ELU&#c6{OW<)bc#F8q`j)1@p5_s$c0T@0E7EVs`FmQv=KDFPMQFd!m1;B4bQ92k9{ANSXze)I%zIPvwPz4Or>E); zFtBh9+Y?!qEZG!WieNF9;1? zMwb8$#eV8#dAbwkeVYj62<=q7)!VekSjUz7^8ZcA(PhsTo%voBY>nsFUA`H_xw8uI*9&O{?t0o2-P%-&UlZ|vfXLs)zek8klZ<5JAe>~6mo%5V?-<+4nFYp1y>;3&+7kEAw z0LeQWL!kWlKLIG@R7|9w=a%49^p>Bmz%Su-_zfI@U!`IwWS4<^>En z_rdsm=lJb30x``w4tI_@X@s-~<2C1)`j6*y4&nW1EQPv-oJ&g2%*MXIg-D`qq0lm^ zspxF%mUL3?mRxLV_7)li`=Iupmpu>-SfBtEwg4G&fduK03E9ru-gn+YbY6dO4+Ut> zTd9x==!f@haaNI>)mxljSm&+T&JoR7_1IJY^GE!D`%Xxw9(eE!Kl#ajI{#cxJlE5% z|LDg*`RUL8gMj@>E-R?>*pU37!({58WtWA85JFah>eR+ zNK8Val2cOAm^5rUE+aDwpG_c=$T_(bDlLzmUr@+k7O~izVlIy_C=rUpr4p%3u28DV z%GDK>Rn?jrtxjKSFxJ&KG&Y%V8=B?Xz?tb*~z5Abh`q}4SeEHSafB54! zfBN&cfBEa*{_DH%9q_-e|9|%O=Wu?+E%*ta@E>CIFO_k>tqOlh8}LT0*Y>*8yBm)l zY~FvOb+=pF4&RQqg1cUg?0MmtLcuQ?tY=x2-|{k^7o&c!K)hKVy1m-(J)Qf0!-=B} zhfbUJc(%S9(6%+K0Lso96t z?@X`T8k*7+nra9`SB0m^BXIo4tios_89~9t<)addVo=2)sU<#X5|<3+k?e}SWX-#% z#8y<2DH&-JSm-=oP}skAtm!$s5i>BN#utcZv#&5f4k1Y(N^;D-G|IMp$H#4f5z3IYOm~ z7b%n2WyyKv7-9tuTZK>3kfODeU_ITtCTK((G^7pg(}r|vLtAxWb@~X6K3Z9e5E|lH zb;!K>6hdQKnkgfxB|Ey69BlTRH2aO4{fEr~eXW5VtwAl85Thlm+8Uu~i!N!8E$T?1 zbt1FvscGHVq~6TvKCjt6@9948i9VmO<#jirty zW>26nQ|QDQ_oW&4g&FtR8IQ>s&*53Go>}kqIbYM9zkWWjVj)#e$&lz%cJ3zm-e<#`5nK~yMf$~LJB_)&;5yj z`_mG}&%~r($kU!xCp@Q#d_@=Zmcjd-de=Qo#}2g|IBD7K-nPT9V@rtr)u^5qpJfSu z&Efo(NBf;H>m_N*tE$*76=6Fx{=4-a2aG3=H6C_p-s|-s|J%YkUU%mIb*l1>Jn@?a ztSv>9x49Yb2$SEFBK9dm4_Ek}(73tkk9*Y}2x!_J+Oi|s`c}N{mAwSbUSiq49N~T{ z^I(4Nk)n)a#mT2i5N?tXFQu)JSa|LJnEG7_O>ZZg-*Ckl-7++8SxWb8fhU>a zP0jJm$N3kbg19lE!jMR*4?^jZP;nIH%zy1pT>Z8%v?&Z@3{R^LPnSnz@}sf~qse3h z6&GKCN@T^LxFM-RAFR|RLv=K}VjsC?XEM@~j4~xB8&Xm#Q!!FBmWRnKz!J!~99$+1 zg)fXDvO;orK2(u2|3?|By~OwqV!V}<&_qhqlacD26iF_cOG(eCWs>p;>G`=xMqW%2 zBZR~D;qhHcocWLLE{f@7#aLO0Ms}Qzolwp}I`d!5!#vD?R{DedQ(~m_U&-c~_k7|R5v>|=k&`w=g zt1i4=AE~L0RvKc3#sv0*{HHqekNsEv{U^=-W=0EsB{;kgZM?T2EEtd5l|ENdu z@9oV0OrOuc@;?yJJP>3U40)LUNWn-<(P$iX+?oI6w14H_9~ng95I z=HKParpx2`_q3k#ZanX+JMZtzzw}}V?@~D9N|ZDI`0FP&ub+6B|C9g9|4rA&^Y8z! z{Qp8Oct*kcWm)d8D{;TmAYazSyiptScAf98Mz?*Y6GzR5PFweQw!iD&xi!@OT6FJ= zzY~@|C+58%$$v>scvXdYQ=Ra3b>vQM;9i5*;ri1jnvS@&?DMhg3TodL(fJ0V`{gY~ zWm{R2Z5+;a9_<}r)-Flv9!1=N^6;Zo{-?C=?uHXS^#=n@?}wS+iD`Q)q2rbP)SCUY z@&kF|Lj|nEOv*7%<_STHi#XO@9_C%<=U?R(qCFmAIDlw)FVVC;rS%Q>>^cuZjR#TX znIrU~GJWW|evFJjPI3qz5iSmmlKIA#xh7T~OV;kk7L(rYDNJKPo|S_ z1r!v69>ZdW6mxud0+$l;Q5K?y72C;*wX)-y*akjH8j@nypS@*V`Xp8whM33^ojgRt<&Ahob}|h@!E0>UdK2WJ=l;CTYfFX~tt=#&dSob8^;e zc-FgT&bNKe&om!UyAV{d5Gq>?=PySwR}fTZ{@0M0O_$Y8*E5^0OPj89n{Jb5-G|P4 zbf5Eb=D*3A{|f=?i$T&$p}fm~&wnib`pM1fCpWI2T)Td1`NpZa8>c63xC}nXzq{p@ zXTxo8?QP%kJN}ZpLEMi+3-3kb{->t&cQw4{wfQgUvR~0--ZUhn>)R^qm6P&>6Tdul@t*7+Q3bUodC z%(L}?U)y^jw(U_}Z^rffen&~=J3{%pBHpgj{M|C*US-;W^28%mktb>bU28o(>rVMK z9u98V6JdEbwtZ_-=WBFTA2@BS;73&Fi~8jG%QBx7q50hRv%B*9l#pj z%WQl*GP^l4yFQ9g6HQXauSm4f2MrV7K-B!13=DZKg^v3h^5ZdWSS zipDmh(~X#nYD|_qEt{WCV&HOfGV?Oz2|1VCueCHn7xKd z+jLvqbUU-@wsh8g?ySe;SiN8oL;`+GIzse;->51O?Ue(56dmDhTA^cJAUPN10^2?^F9tMyce1KnnCrt zq4Z57YfBwvTYbhm4ax5{A@(+h9y0qLx45~q9rv;w@bBCm+Px#H_s#hJSGHAGyj?BZ zuHn8@L*J>(-d&5{XN*5oA91WP;B>Qxhxw$h^-z#)Pk84$i0&XRk%QzG8! z(tKAb(L;gtE=%;QhzisMh3dQ_ji(R|hZ9YEl3U+NYun<-X!K*&`WIFBvq}RwoFHyq zh#)&mjER&c#3&=;)B#CV9?9C17{fta{cgNzM-0UrLuo)zwFp{SEL{{|z)E0Jlh}9^ zFEv#dk12H?7WrqExf3c+kZTT5Yu`)5x254*(z5HZ1Wh_gfy*h$pfWS*6ntSOft5lk zj>{E<(ZqiFGIvJVaaQGl+_bJ-Y&!+pLPo_`lvB| z^sqjhe3*2vbj=(_e8O?#ZumLTdxvb$39>=p6eUYx11;@HwBJ^S*88 z{hKZX>MsUYTnd$5j^JO3Vt#<2UX91!a5;O!W%Gv1+D+Hxn{IPA-6n3j58d*#-}18F z_G!H1r@I?aem6++Q7G?T1mk`*<=w{WcN>*En*{GQ6})dE?Q6y!G$$TyjXG%!a&7nW zvYqztJQC8qH?sHL*#50agRi}BsCnN|zQ-WkXJqcL%Q@75JKBgkVTy5S3Grz4@wK`H z+Kz^G?u)kXitpWq>VN%kRqf%b$|Kd%qnhI5HF+m>*)FwccVoO)eS}|=e^9eWSnG-C zwu5oD-N>#T=$<#-Wc6-xt-D<1p(ycGF}=%keJe5os*{6i5Mla|NTUy;!8O5j6lLCr zvF^m#wgvH;gZai_K~+eJEL6w~6Bk5CNl|hvLX{M+j!vo$O4fRzYfq=wAI@spLu`2` zzOXf((G<_nCot8CtkNV72gS`x77$WJX=#$gbVX!lSzvahCrNXXqCZ5hdmoo;!{xT( zC=D4@Z3a!1Nf+V^S=me~k&P#F(YYn@RB;4d7Eq}2D5^NYsXj=<+i7?k4R6lNuFE4< z(@Bc_TtNYq$)Ho1g;}hkR8Da`j~^}&`HQ6P66FbAS|2a1n}==ZW1IOngCL`_BuggD z=8H%Sac-`JmMP0mQ843FoUn49U!~Apg&IGPKlWeSWNg5mv|cGsKM<;zkT{1BQ6JF~Mp~Y^+0S>yyjtQ%f7uiks5&O_`(? z0?tfMwonmm^iXT$bX(M9ThwS<^gvroS39D$J+|H!U(=DO>O_jVQaE-Dy*r)Qo0;C9 zjT#^$21DitLuUs=rv^huhr;@Y!aIi}&BIZ3BQe#ZvC6Ro;dl~jA~|mgO`OJJXETxW z0n76Ni}L|<^MOtU;q(4I7XsQZ1ez`e*Io*(xEvw75+(Qm!Mqwzy_S@H)BWsC_syH` z>o?t3Zh6e#@|?WoHFVp%`?jz3j$h;50Nvdn^+%!7kHh)*q8OhbCabz>R-(X)Z_(gvqSah z2t#~yeMD?yKw`58s`UigdNAF#8{f4(LTZkXHbly5B4x@bMM;d3i73mBQ)eVpB_nHM zQ*@yigKv7hYgW@SV$1#<%Pu6h4aI9l@r)>bWwJn)BIKdP1sDklD^Jf*A+yvmgsNb2 zjWVumfLc#TPc=8TxEyIe}G52NpyKsp(?1T!i!UV zil;lApVOV6+mWAZDWEhIP-_bFRE&HfvyjDN(%9_mVlIX!NDzo3Mbf}hg{Q3iq#&!m zB&(+c-%)}$3kh{XVzr1Y7v~B}sZ1%IA}h>N6roj|_;OxEg)pF6;!%znF2@X%r}e0@ zHg$S)1+KOtqp~tfRz=`zNQ|1?TrDkApPy=A#MQCG8@T>;$niSlXdP;>4%JlA;(P4uuxOl=&`oKu=d#L_SnhxxG`JYfGyr`OR#h#HgqDj zoylcgsbYItaZh@FZzicP8#h2o9-_n!M=lIU&J9OS4M&X)M-7Zbca9)hM`PA$km-fc(Z#U7#qf@$$d;uj<8n;ZO042c zyl^#%wU(T>fhKNZvFH8Q&-<^Q_g^{hzi=U7>O$big`nPx!R;4AO_#!IFGo~fiI#tW z5L}Hfx|T@$5JkAA}Lx?Sheu5xWJakDWzI>=s~INvU0fITL-J2<@8JG##$Zs17L(B9OM zchg6=y0tdBwd&n15e49%BO`L#cT2Ko3U>3zGi2DgXk%^~{w zP`xI!RuN|4M;HsE>c}w->9I}7gytBeIXK1QjcIeibsWKW?IrcR8>_a)s!effeO!e) zzOpo-ik+m%Lus>9^cb`u0b3W5(HMX?c@WJfbFBwyw%zDb8%ENKktzSUfPqv?ZX%J6LJQ~8AFtmk-WGO#KK7I{Ald-XzciC z+`wpj*I0sOJgI&hSu>GbHkm4(O5;qY=g(%6=dy7Nq~yhjm8FQ~rHF;4$eE?cv8AZ~ z<>=03gn1>l?o533YNB!tDOyiqZ=mU$Skk$S^ozmk7lYR>2CrNUUbq-CeKBS9?)aU#G_9}n7G{9aQ*qs;LlO5KJiRep+ z?vIEa2uK|ANFF|k89j&_+l`;t9$+&E*y;m1sslS@L7m)?&it@0VuU>{syh+U8x`Ld zi0t=F89bFXd?;h|{p_(FA+45BOJk^|Cd{G;w+bTK3ZvR{Vr;nB4pc%{4ALHw(&LlX z=YktJf*;&V8h$sXp)ID-6w|0jG?vFUiQ`PHgl1}D3m(;qPO-*g+QQRq{+XTb+1)3| zy$7iM@1e9dl-7*W)g|kyQuH$C5j5IRkXA=dug7IHqOwdegq9Gp#fQ@7lGkyhuxoEd zS!YI>HKV*Kvs{;@F2`4hv#Z#I>O4|Sc8(51sZF5OMdmjIGEAPVmXpPnLlkj0Rop=> zZKamh(IA-yE=}m4d?6qg+}+%hT|MgKc~2xQ*7gKn~S-% zTz&;tAms_U0#QMUge;QbN|njdGK9P$R8{R;u632>4@vX;r3H3bfmK%6C}(ID%rXT_ ztm1IWxb$*9u|kNgDn)8!F%$sFupwNIQDYj-Iw-ChVADds)m!rTqln0Esb}n>$R)8lk6- z6~>PxEsiHGj3>>EBPYg@Llda(iDc_!YU3nYJC#;GonAVV!JWky%oB1J$eD|jlx4)3 zWyHz~VsRyQW+irfC2rtMeAk(T*43o?HI!y8S+$N9Z=`X~rsto_B%ja5T?*g06uy2b z;>_iU#mkX1mm|k6NA+Kc?)U)F@af~pzFK2pZWOsXHcXL#aKB}iIx<`cQ zEsE`<#P?+-^{1i+<5Gvh(uVzTqi*=Iz-r!ptUCRx>rb1y5{EC0pVt zZQ(SVe}1Psqx%HA_W-e`n^~FiTYwX?d2sB2`%(Use;Y*85i(Je2GaC1+5{ z=}~doRmG+xsP z))qF_GPH)GG9yb|$Klj->5Y71lQ6wmj5JGQEQ$~_dD={#G?PcoIsL6UovpcM3#HCN ztG4DT+wz6&g{%%Ht&>gYDo*R>C-n-Wdot&HGG}`-CwntTdb9d^@wUF~=6-^qpHw-J zBOA;W4AGb)bn0jUew>M!U?)zZmnYGSljylg%;Xeicq*-D3fnfF-ZYb;pUG6u;-zy0 z-U6Ain47yq%UYqMR})uPlg_LrEv+Wats*B@QG;tJ`&x=+J+)y2quop^JDXm5E`xg> zUvPntbCH~RC1&#qV&e*8^#jDx2eGps#EyRuH*ht+^J=2`T2kGID9!a0)eW@hW*X;K zdj9Q9^2gy9J`O+saroxP;cFj9EZvKoxfeNlFRJf;Ovimh%O`QhPvfgTOH_Q05`K}w z{t``(AL>jPYE2lbOB}9B8kQo5xu}u+lu;sj6q`1dgd2~_ng}9Hd6B12QDzR)=iW~m z=t>%}Bn{Lf2dYtnvgAQt%1{A%n3Oh>o<54q7>mY_2NNf}b0$yIrjO*$>`CtFO75|y z^fsjQ)};0-(0u|-9|PN;gB!@m98AU!A&4WPIitSRaaa1pQO49hY=<4&(T?pfrFZDk zJIipLqRcK_E1;C)?bSZEhi$4TRQ8qD4xw zaC6%7bK6N&TY6q6vY;!P(H+d{^)Bu|%^y5MtLvlHb|W zrKu0nHhQUrV`|}Wg|M$e)L9`iSBi~QrB&4uxke_aQ82YiioPtXwgPReim%s1H0lD3 z>`5bg+{hlPWB1f?+Utr<^;~@ePu(bxG?j2oqJrkq9J4gTqDW~|#kQ-%tn^tceacE7 zZ=(;k<=fi|EbWC2Hb#xDsH}q}?&5IlTzWU3)GJKy6Qc&Chz~_(oDwuOy<-~=E!VT?=0Rn zm)$%^sGTQOF677-DS{;$bD2&(Q;@yN#H^>TucxlAqnFpw^Bb7S4b1RHTK6WlZ4=jY zHbZwVOMMrbC^FI+gzT0DRq?ZJ-Pu%pfCqk7zEdB&J1bBvWWPRpLa6DQH+$#}|i1Z^fDf7XLJ zcY?ieAY-sMW3VG*s3mi#Hfu8M%*_+h0H#AkzlZ=|jlEkr?J^2z$(jJK-XjIzqAaQ*3ss z%}TX3&^l`JI+gU!lKifs0y~A#omJGE%I=FR?hoe=`U{8MOGl40ngb*MqQ?rlL)eG_ZFg=@T(p}U<`ekWUUm&p5w%($0J`84s;r->IoO+5E$;>Kr5E1xCJ zeTJO)95wiPa@Q9rtzV$)zr@shg)RFUC;mfb@gMO8+0z4rX**%sLYS^2PFIm;WaJrM z&TIi?mQ0&Vr_ZAb7Gju-A*>~z;$;{9$`Rt^0CCbzoV1cA>&a8qJJ!H2u#B3M3}<6K3?x^u?ba>pBT$2F931$9C|n_$ok{3(r>1w^a)|6eXPkVHZ*O0R2F(!8&Tbkt?WQncShIPgLOUL>e>l)?WnqTprW>` z!q8f2sH-$qSJla@>jj!drnZTqGiBAbppC8Z_11{S_JG=o>Dr2k+R9-=Wv`*K-B@KZ zR_p6D>iQZ2ASjPf1^ou%lPl+$%Ell~(pkWCK#c zpqx3Rq>Pl|N7b0|%7n3^m9e6w@uInL*5o*Ac%0oc!ET%6G);1KQ@rwNzGS9^J1Z)j zE6rJuW-iK8muPECv@=V2OG|lk%Xt&a^ugu)u9bq;GllhM7&WU!sx_8qox|DS=AY%0 z&XwRU5H~LnH!cuYFOZflkY+BD$1allFXePx%5Aw!HC~}rU7;&J$S=88$oi0(cb!eV zg}ZPIckUK$^H#>{t&GLnnbWs3M{Z~J+`+fsA(-wG^&gQcKF*QdqX_QPn4i$8U!+|A zBK6W2sTaOT-TWf;%opf|FENu}rVV|CwSSdv{TkQ!hfM7svdaIME%}DX`xBXwH$R*= z-1FZ2b)_CiK{rp5FXF^&$ z$>U8G@TbTn(>T!#s&p11oeNPc_^1|Ld4r?8!9m_oH*d(wA8HT`Yf6R{!jTfu2va;t zk&I=@##0rO@v5ot@@fCdS$A>wcxm@=X?JgFce|v=Bgx*<>)93{}lWc}u;(+`zOnQmiI?dkeb5oX};7Y*#O|t7qHQ zlkFA5wu&BGWm`vOQ%9Aqv%0)XQ)<^1ck2pzYsr1ajDfo3p@!Ig=~BORVL&=NARQl& z4Gzk?2IZ|oin<}CW>}>hDHo2a+2fUY6V-%C4R%_KoZ_FE;xAA07pD2s(}K}yLElV? zZAREUE2^CnSI$dh3sS+NoVlc=uBh;5)RGZz1lIsJ#s;Xh>c{1M;w4Wa29 zqW(|hia+PbzNPU0LSwR*$Jxt6?B#CuvW2r!SG-cqU6J$7@cCy7OICA)s~O_8WXXE0 zY$H^;>05r*m9sR?SsLOjbr&yLiE|5$s9{MPm?cXD;6=T#f0+Z$jX(#>NB2_@kz<}sARlf zGTtE_Z+Fa8NbaRW{gK zHe@Uxs!|WjDn|H~BaG_NT+LXfb|OVT8E2RZubc6&wog~vC#vnk8hek%-lpkptm)Qj zdsMn!k-m>z+n;9~Ak+`0H4G;;jYKz(1sg51M$44ZGFE5pud{a4TU+Ye3=Qp-jW%gh z2hY@5*wU3_wr5&;QrddsZ2jTphIw8Uk1cOHF4S$`dWpq@F{NEvRz zk2Isl%n2jqDouv zDf5!GdC8f1$W%aU3xl$%Pqh_sEbNBPcKcNqNlHd7hf%((Iy3ZJz&x@2_utZ;SIA3w||46v{4dH`t2$#Mgod1Tn z{ta>Y8`8|5$fJKE_x(A?_ARCPTdLtNw5q?-<$o(E`L9BjXl+WgHYQr@7p--O*G;AC z`qK4s$%a_A!I5v|DK-hJvuWk$k}A$cRhx4@@#bVxnS*iZ^_EEWMy2kG9X#$l&-YM&eY1zsO4uQiq&G( zYJS-oNxhz4xq+K=)A)goQZShMjIlPS&hV)|{EFS)8nynbM9;Y5S&h zwrO4SjJ|fZwsO`Wn=|qk>Y0lTl%*#8N;77;Y-71>eYtF9rEFoPd}^h9_>8*yjM}MWy(lOn6nz`miGJdKK{|_u@_Ng`3>7H+gF}c}q8W)3^8|w*O?O24 zyW)zEN@X8Q`S)bZ`wHr3j4PipE`P?j_!;BuXN=X)md+lrC$7&y7?__nEzH- z_g{?a?~0V)vqTOK=YRV@{h?(xpK$6Mzf@11+1dG7J!_}}^O z`kw;+J%~68$4|o+H~7iF^Ur$G9>{iu2wylJ1Y1Mkr~l61>-U1l2eQK<55M?#cEVIBG^K(l8?q@7Nrw{!u$=+F`gbB=3I|Oz z5V3&3he#2eEQK8s_|3lqub+oE`ru6syv2mKQecZOY;m?ezu@d>e!Bl@^}jz4uk^vI z8hDKfucyH4zVP}Uc>M)<1D@_T=ixv5;5iLE&x99J;RWBHzPRVb7hin!MR+OzXG?t_ z{8R%!W5R!=KL2yy?Z4Qw`xh_n`2{@HgL>!#&;S&@3aR_R_c-ivftOqXp6b8rUx%XO zkm?P7fv`6eUJe6zs=wF21~qO_6bh-a;FkpZQ1JU?`0-OY>tBF=Z>WidA~c{g!Jh#8 zNbm|7e)d$(dOzq#K}|Lk(E!Z=e-`X#!)qM)#Z&pi1uXQ_poRl15ul|IpnwBPctZux zK2;W6U_rkGv}$100HziKjBv0H-l~V+J{9b{2m2RczXcA+;Xn=?M8LsQaBwRegs1!e zTm9a9u5J z?6?Q-EW*21*eQpdIj|D}yH3HbZ9m)f<7alk55XJv;jKm3Vuh`8*qQ^|5HD;yy=~jJ zo!fr0Yn$_NPlDgxhuU;D`RZ{s_neAr}F$NN`Dk?Pz$$c`k|{dRV`70<2M>NQK-ih$Vqb zF6^Mfv(9r-{E)N$6f7lx6%UF$pcFwI7hL)9t^j^p0zdtsQ*b{8mZ;Fi1w|=Pln|!| zw@TPq1v3!p!PsQ zKX?ql?m_tdApGu!!1Fusx(Z&S;B5qNE_kPdcOdxe1E1%>2cF{pcD?&|;Bgf^M#0kv zo?P%u2d_Zz+6P|Gffqc5%Xi><6a8C#KKycp&?$3ieJjIFc;N(>}H43MU zaGDFJ)8TX=oZbg6&w~p*#o_PZ$W=Hx3P+7_j0eZk;aCtH-~Yn#7hXFKKLqc82Yau= z-ci_Rg#A3&pZ@m#p#A&zAKm}riT&_Hu;n}0dJVRX!rR8*Z08-`j`Q3R6u9F+=#H1d zcfbz;d=Edp20tHr?HQx{uXqv9;u3xxocx=E=->Q4?Kkj459;CC78nbJIwbHi07rsg z3LMOXSLgsgyvmk>9AwoDLg4e_VKlCbm9}CyWFvfv83GmAxqY6Sb za99g(=-@{`lmOr7!?jWvtAaWs@J*1}3ZYgw+74UV;pacZg73@W!+IERgZgd|3_#`x zgpI+mao9Ei&;F1O99H;n0LCYwejZ9zAZrc6*Wtt_Y~O_Eeh3f_Kzs$U>k!-ZU@pex zL0kgFxj@`o5C=~Y^ROQAus&7|v3U^t|5zX8fatFvdL3fAAVv)_c@UET2p2$X0R%in zgaabKg2;7<>VhaWMA0EC0is+XY70ccQ-nGo>?;Uchwv^4S3@`*!V@6edFZ^L}n``)zyA z58nR)IPCzJufSy;T)V(k{hS;9pj)Dwo13rO+W~G6_ye%d0SCT@- z0AIPm1`6yXs9-=o7m|eFA%=G)@QeiD3C?Al|xWC4yY;co`&~l z;H6pk$rGx;(F$Mp!{!upFGAHC6rP3T^Wb|C_FjZnF2OIK&<&1h_`@n}UWA?xq3Sj; zK7y3{;P(ma{}kT%6n^&v$aFxK({0F_0lW$DLcnJMJ{a(O0srF%?}?v)b3lgEZOEK~ zOy~3!LS`0Z1w+PL-C=Zp)sKc;=_KM7zR%OHwU;oz~c^h&bW9s$9Rb`UfFoB zFtXP{ir4R`Uho9itD5!?Q0NpM@v92##cMFyW2@W_8fg1f>=rbU;KG9PNhJ zdH|k)1xE=uv~br9v)#}#1f>%|oQB9bI6e<=E&x114vr>p^upaqm|KFDb ~(j|zx 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 K75MPKe*2$AJ#1qD literal 0 HcmV?d00001 diff --git a/local/recipes/libs/lcms2/source/plugins/test_profiles/test5.icc b/local/recipes/libs/lcms2/source/plugins/test_profiles/test5.icc new file mode 100644 index 0000000000000000000000000000000000000000..34583ab1cd704fda2bf6f39ef42de9a91344729f GIT binary patch literal 3240 zcmb`JcT`i!9>?e2n_g%Mkxu9x1t|ffhF+vf6BS4T1VVt204jFG6FD&m5x zOOdr=!NQ_gz`j8q0?N9$im0f(8+b?AbKbr`_Pjag&i%~y_nY5u=Fa@ixd2d(2sr84 zumS+-La`{!$AcLi6U)T+02mMf4p;$@z{$=G3iplxf7{;m0Z3-NV8s3u?Srts^`l%d6r9Od}g^`#@uuv7xigJ zc|A9si!#DOS)3!`$@mz`g*kj)E&v!Cl=TIYbUw<_DAUt<3Fsa$0+}x6anPI?S$v8p zB8-i44FCj6@*GZ_!(v{ZZ0%rihM1Wx;foUz1w3X_hKMQRB?y?3Y#wTx-J{G4m`Cuk z#mr1mMiO7ZGiM6_$E+EDS!V$v01spXF<^pBAOaa63Gjgc)yz>vh>m5JY#>2ZF-QQ3 zGd3pbm4SLQ(T9hs0+b}Emux}*=O(*9vmxJv&fE)#(fv*Pmh79BQ3n8P0zH?~Z(8CW z0NOSKpz`pWrhfnc`2ql1Z_fFKlt8{%jDBTyQ25u_R1i3`d+~qv&IUo?oAs;PKZiN_ z3D%Z*a|029HLwJKk>;BJInT*y9>z=JiFiT|j~R*HV!kk$$<7dR`C@*CkjWP^{k+(A zRt|P{7S@(%0e@}(aN5`TvoKpXDAVe{0Qw3`pm388kl(ujhDHWR+&v*yQxF898hj2+xOEusa+8N5ISAWH<|61sA~E z;Yzp;J_fhK7vLN4Jy;6AgeMSykP!x=gIFLegpC9vu}BgkLe?ThNCi@dG$9>G7jg%Y zB4fx03=TuXFfkSwCyXy<35J8o!mPz?!&G68U|KPkFn2Hmm~qS(EETJPHN!e${jky4 zWNa?B5LyjPFp=3UJJ-L#6 zoP3o$K>k2cqL@F06g{tMM?Nhs~Hl|KjcT(r57pb36f2aX# zm}-P+tkyWF(XBC|sio#WwOHci__o3CB2eNOuYQ<>?` z6fi59mzd)^8alo@5}jI|9-S#&Bi$vs8+Ds?pXibFSb9l%<$9fZ zg-vZuQ%tK(Z<@hoc4mCDy=J}USaSz+p?RHozXip@-6F@L(PF@oVHs$-(X!3*)qMT= zvGaG#@0$N*f$ajpg8BuItdy+$tu|V9Sp8{jYR$2(w!XWNy3l*!x`pivU)z}3@ND+k z+_$CK2H9@0?X>-DXKyF6YqA@)*SC+iud(lE(ODs^ZLF&fSO*V>bq=Q;J~-MriXBfl z{^4Zdl;(8QX=IVnBHp6oYe!H?G?uw_$e^ z_f+>|?yo!+c!)e&JSN$W>^1E3o`|Q9XOU-*my*{KuPU#n-n!n&-i_YlKDIuqea`!0 zeFJ=V`1bp0`f>ak{Koz5{nz+k3ZMjp2UG<-3p5QB1$G3%LHa}#&(xEupxWc%;Wk$>LmR(z}wp_6M z%nJDx2`f&8FHB!ZhKf46Tg3jNVMM z%)(4*mSfhgtZ`9*=ukG4y)3(3OhJR zIlRhy)eoyNt2wJX^L6q!`~7kK()--|BM$@*UO&uvIQ3}#W9;Li zCkjt0o@zX;`_1IHW~rU@%z)=W_p|V4j|Mq|FaMSOuTMh-&#BKVhP8(qMyy9pk9v>Z zda?Ay(96u1Q)7j{EB;>d%J|jKf4Ke8Jsv$i^jh?K`p<1|RNowaYxA~qB4py}yYzQc mlSS`U-yiwF`q1?;>f`WK?kD`G%FiaBJH7;bc|4syJ^gQ+!Q`+2 literal 0 HcmV?d00001 diff --git a/local/recipes/libs/lcms2/source/plugins/threaded/COPYING.GPL3 b/local/recipes/libs/lcms2/source/plugins/threaded/COPYING.GPL3 new file mode 100644 index 0000000000..20d40b6bce --- /dev/null +++ b/local/recipes/libs/lcms2/source/plugins/threaded/COPYING.GPL3 @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/plugins/threaded/Makefile.am b/local/recipes/libs/lcms2/source/plugins/threaded/Makefile.am new file mode 100644 index 0000000000..625c93b51e --- /dev/null +++ b/local/recipes/libs/lcms2/source/plugins/threaded/Makefile.am @@ -0,0 +1 @@ +SUBDIRS = src include testbed diff --git a/local/recipes/libs/lcms2/source/plugins/threaded/Makefile.in b/local/recipes/libs/lcms2/source/plugins/threaded/Makefile.in new file mode 100644 index 0000000000..6c5df944f7 --- /dev/null +++ b/local/recipes/libs/lcms2/source/plugins/threaded/Makefile.in @@ -0,0 +1,662 @@ +# Makefile.in generated by automake 1.18.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2025 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +am__rm_f = rm -f $(am__rm_f_notfound) +am__rm_rf = rm -rf $(am__rm_f_notfound) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = plugins/threaded +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_append_compile_flags.m4 \ + $(top_srcdir)/m4/ax_append_flag.m4 \ + $(top_srcdir)/m4/ax_check_compile_flag.m4 \ + $(top_srcdir)/m4/ax_gcc_func_attribute.m4 \ + $(top_srcdir)/m4/ax_pthread.m4 \ + $(top_srcdir)/m4/ax_require_defined.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ + ctags-recursive dvi-recursive html-recursive info-recursive \ + install-data-recursive install-dvi-recursive \ + install-exec-recursive install-html-recursive \ + install-info-recursive install-pdf-recursive \ + install-ps-recursive install-recursive installcheck-recursive \ + installdirs-recursive pdf-recursive ps-recursive \ + tags-recursive uninstall-recursive +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +am__recursive_targets = \ + $(RECURSIVE_TARGETS) \ + $(RECURSIVE_CLEAN_TARGETS) \ + $(am__extra_recursive_targets) +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ + distdir distdir-am +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +DIST_SUBDIRS = $(SUBDIRS) +am__DIST_COMMON = $(srcdir)/Makefile.in +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ETAGS = @ETAGS@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FILECMD = @FILECMD@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +JPEGICC_DEPLIBS = @JPEGICC_DEPLIBS@ +LCMS_LIB_DEPLIBS = @LCMS_LIB_DEPLIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBRARY_AGE = @LIBRARY_AGE@ +LIBRARY_CURRENT = @LIBRARY_CURRENT@ +LIBRARY_REVISION = @LIBRARY_REVISION@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_DEPS = @LIBTOOL_DEPS@ +LIB_JPEG = @LIB_JPEG@ +LIB_MATH = @LIB_MATH@ +LIB_PLUGINS = @LIB_PLUGINS@ +LIB_THREAD = @LIB_THREAD@ +LIB_TIFF = @LIB_TIFF@ +LIB_ZLIB = @LIB_ZLIB@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_CXX = @PTHREAD_CXX@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +TIFFICC_DEPLIBS = @TIFFICC_DEPLIBS@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__rm_f_notfound = @am__rm_f_notfound@ +am__tar = @am__tar@ +am__untar = @am__untar@ +am__xargs_n = @am__xargs_n@ +ax_pthread_config = @ax_pthread_config@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +inline = @inline@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +SUBDIRS = src include testbed +all: all-recursive + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign plugins/threaded/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign plugins/threaded/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +# This directory's subdirectories are mostly independent; you can cd +# into them and run 'make' without going through this Makefile. +# To change the values of 'make' variables: instead of editing Makefiles, +# (1) if the variable is set in 'config.status', edit 'config.status' +# (which will cause the Makefiles to be regenerated when you run 'make'); +# (2) otherwise, pass the desired values on the 'make' command line. +$(am__recursive_targets): + @fail=; \ + if $(am__make_keepgoing); then \ + failcom='fail=yes'; \ + else \ + failcom='exit 1'; \ + fi; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-recursive +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-recursive + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-recursive + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -$(am__rm_f) $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || $(am__rm_f) $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-recursive + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: + +.MAKE: $(am__recursive_targets) install-am install-strip + +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ + check-am clean clean-generic clean-libtool cscopelist-am ctags \ + ctags-am distclean distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + installdirs-am maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ + ps ps-am tags tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: + +# Tell GNU make to disable its built-in pattern rules. +%:: %,v +%:: RCS/%,v +%:: RCS/% +%:: s.% +%:: SCCS/s.% diff --git a/local/recipes/libs/lcms2/source/plugins/threaded/Projects/VC2022/lcms2_threaded_plugin.vcxproj b/local/recipes/libs/lcms2/source/plugins/threaded/Projects/VC2022/lcms2_threaded_plugin.vcxproj new file mode 100644 index 0000000000..135a58641f --- /dev/null +++ b/local/recipes/libs/lcms2/source/plugins/threaded/Projects/VC2022/lcms2_threaded_plugin.vcxproj @@ -0,0 +1,274 @@ + + + + + Debug + ARM64 + + + Debug + Win32 + + + Debug + x64 + + + Release + ARM64 + + + Release + Win32 + + + Release + x64 + + + + + + + + + + + + {71dede59-3f1e-486b-a899-4283000f76b5} + + + + + + + + + + {6A44744B-BED4-49EC-87BB-83978458CE19} + Win32Proj + fast + 10.0 + + + + StaticLibrary + true + Unicode + v143 + + + StaticLibrary + true + Unicode + v143 + + + StaticLibrary + true + Unicode + v143 + + + StaticLibrary + false + true + Unicode + v143 + + + StaticLibrary + false + true + Unicode + v143 + + + StaticLibrary + false + true + Unicode + v143 + + + + + + + + + + + + + + + + + + + + + + + + + AllRules.ruleset + $(Platform)\threaded_plugin_$(Configuration)\ + ..\..\..\..\Lib\MS\ + + + AllRules.ruleset + $(Platform)\threaded_plugin_$(Configuration)\ + + + AllRules.ruleset + $(Platform)\threaded_plugin_$(Configuration)\ + ..\..\..\..\Lib\MS\ + + + $(Platform)\threaded_plugin_$(Configuration)\ + ..\..\..\..\Lib\MS\ + + + $(Platform)\threaded_plugin_$(Configuration)\ + + + $(Platform)\threaded_plugin_$(Configuration)\ + ..\..\..\..\Lib\MS\ + + + + + + Level4 + Disabled + WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + ..\..\include;..\..\..\..\include;%(AdditionalIncludeDirectories) + Fast + + + Windows + true + + + + + + + Level4 + Disabled + WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + ..\..\include;..\..\..\..\include;%(AdditionalIncludeDirectories) + Fast + + + Windows + true + + + + + + + Level4 + Disabled + WIN32;WIN64;_DEBUG;_LIB;%(PreprocessorDefinitions) + ..\..\include;..\..\..\..\include;%(AdditionalIncludeDirectories) + Fast + + + Windows + true + + + + + Level4 + + + MaxSpeed + true + true + WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + ..\..\include;..\..\..\..\include;%(AdditionalIncludeDirectories) + MultiThreaded + false + AnySuitable + Speed + true + true + Fast + true + StreamingSIMDExtensions2 + + + Windows + true + true + true + + + true + + + + + Level4 + + + MaxSpeed + true + true + WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + ..\..\include;..\..\..\..\include;%(AdditionalIncludeDirectories) + MultiThreaded + false + AnySuitable + Speed + true + true + Fast + true + StreamingSIMDExtensions2 + + + Windows + true + true + true + + + true + + + + + Level4 + + + MaxSpeed + true + true + WIN32;WIN64;NDEBUG;_LIB;%(PreprocessorDefinitions) + ..\..\include;..\..\..\..\include;%(AdditionalIncludeDirectories) + MultiThreaded + AnySuitable + Speed + true + true + true + Fast + StreamingSIMDExtensions2 + + + Windows + true + true + true + + + + + + \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/plugins/threaded/Projects/VC2022/lcms2_threaded_plugin.vcxproj.filters b/local/recipes/libs/lcms2/source/plugins/threaded/Projects/VC2022/lcms2_threaded_plugin.vcxproj.filters new file mode 100644 index 0000000000..c0bad06c0f --- /dev/null +++ b/local/recipes/libs/lcms2/source/plugins/threaded/Projects/VC2022/lcms2_threaded_plugin.vcxproj.filters @@ -0,0 +1,42 @@ + + + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {7d5b1769-2be4-46f2-9e35-6260eea79d7f} + + + {012df308-35db-4909-b035-b1cd5fd1ee5b} + + + + + Header Files + + + Source Files + + + + + doc + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/plugins/threaded/Projects/VC2022/lcms2_threaded_plugin_testbed.vcxproj b/local/recipes/libs/lcms2/source/plugins/threaded/Projects/VC2022/lcms2_threaded_plugin_testbed.vcxproj new file mode 100644 index 0000000000..005a452267 --- /dev/null +++ b/local/recipes/libs/lcms2/source/plugins/threaded/Projects/VC2022/lcms2_threaded_plugin_testbed.vcxproj @@ -0,0 +1,241 @@ + + + + + Debug + ARM64 + + + Debug + Win32 + + + Debug + x64 + + + Release + ARM64 + + + Release + Win32 + + + Release + x64 + + + + {F56B9CBA-A34D-4C68-9003-A6919236399E} + Win32Proj + fast_testbed + 10.0 + + + + Application + true + Unicode + v143 + + + Application + true + Unicode + v143 + + + Application + true + Unicode + v143 + + + Application + false + true + Unicode + v143 + + + Application + false + true + Unicode + v143 + + + Application + false + true + Unicode + v143 + + + + + + + + + + + + + + + + + + + + + + + + + true + $(Platform)\testbed_$(Configuration)\ + $(ProjectDir)..\..\testbed\ + + + true + $(Platform)\testbed_$(Configuration)\ + + + true + $(Platform)\testbed_$(Configuration)\ + $(ProjectDir)..\..\testbed\ + + + false + $(Platform)\testbed_$(Configuration)\ + $(ProjectDir)..\..\testbed\ + + + false + $(Platform)\testbed_$(Configuration)\ + + + false + $(Platform)\testbed_$(Configuration)\ + $(ProjectDir)..\..\testbed\ + + + + + + Level4 + Disabled + WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) + ..\..\..\..\include;..\..\include;..\..\src + + + Console + true + + + + + + + Level4 + Disabled + WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) + ..\..\..\..\include;..\..\include;..\..\src + + + Console + true + + + + + + + Level4 + Disabled + WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) + ..\..\..\..\include;..\..\include;..\..\src + + + Console + true + + + + + Level4 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) + ..\..\..\..\include;..\..\include;..\..\src + MultiThreaded + + + Console + true + true + true + + + + + Level4 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) + ..\..\..\..\include;..\..\include;..\..\src + MultiThreaded + + + Console + true + true + true + + + + + Level4 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) + ..\..\..\..\include;..\..\include;..\..\src + MultiThreaded + + + Console + true + true + true + + + + + {71dede59-3f1e-486b-a899-4283000f76b5} + + + {6a44744b-bed4-49ec-87bb-83978458ce19} + + + + + + + + + + + + \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/plugins/threaded/Projects/VC2022/lcms2_threaded_plugin_testbed.vcxproj.filters b/local/recipes/libs/lcms2/source/plugins/threaded/Projects/VC2022/lcms2_threaded_plugin_testbed.vcxproj.filters new file mode 100644 index 0000000000..0660190e17 --- /dev/null +++ b/local/recipes/libs/lcms2/source/plugins/threaded/Projects/VC2022/lcms2_threaded_plugin_testbed.vcxproj.filters @@ -0,0 +1,27 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Source Files + + + + + Header Files + + + \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/plugins/threaded/Projects/VC2026/lcms2_threaded_plugin.vcxproj b/local/recipes/libs/lcms2/source/plugins/threaded/Projects/VC2026/lcms2_threaded_plugin.vcxproj new file mode 100644 index 0000000000..89f328cf96 --- /dev/null +++ b/local/recipes/libs/lcms2/source/plugins/threaded/Projects/VC2026/lcms2_threaded_plugin.vcxproj @@ -0,0 +1,274 @@ + + + + + Debug + ARM64 + + + Debug + Win32 + + + Debug + x64 + + + Release + ARM64 + + + Release + Win32 + + + Release + x64 + + + + + + + + + + + + {71dede59-3f1e-486b-a899-4283000f76b5} + + + + + + + + + + {6A44744B-BED4-49EC-87BB-83978458CE19} + Win32Proj + fast + 10.0 + + + + StaticLibrary + true + Unicode + v145 + + + StaticLibrary + true + Unicode + v145 + + + StaticLibrary + true + Unicode + v145 + + + StaticLibrary + false + true + Unicode + v145 + + + StaticLibrary + false + true + Unicode + v145 + + + StaticLibrary + false + true + Unicode + v145 + + + + + + + + + + + + + + + + + + + + + + + + + AllRules.ruleset + $(Platform)\threaded_plugin_$(Configuration)\ + ..\..\..\..\Lib\MS\ + + + AllRules.ruleset + $(Platform)\threaded_plugin_$(Configuration)\ + + + AllRules.ruleset + $(Platform)\threaded_plugin_$(Configuration)\ + ..\..\..\..\Lib\MS\ + + + $(Platform)\threaded_plugin_$(Configuration)\ + ..\..\..\..\Lib\MS\ + + + $(Platform)\threaded_plugin_$(Configuration)\ + + + $(Platform)\threaded_plugin_$(Configuration)\ + ..\..\..\..\Lib\MS\ + + + + + + Level4 + Disabled + WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + ..\..\include;..\..\..\..\include;%(AdditionalIncludeDirectories) + Fast + + + Windows + true + + + + + + + Level4 + Disabled + WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + ..\..\include;..\..\..\..\include;%(AdditionalIncludeDirectories) + Fast + + + Windows + true + + + + + + + Level4 + Disabled + WIN32;WIN64;_DEBUG;_LIB;%(PreprocessorDefinitions) + ..\..\include;..\..\..\..\include;%(AdditionalIncludeDirectories) + Fast + + + Windows + true + + + + + Level4 + + + MaxSpeed + true + true + WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + ..\..\include;..\..\..\..\include;%(AdditionalIncludeDirectories) + MultiThreaded + false + AnySuitable + Speed + true + true + Fast + true + StreamingSIMDExtensions2 + + + Windows + true + true + true + + + true + + + + + Level4 + + + MaxSpeed + true + true + WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + ..\..\include;..\..\..\..\include;%(AdditionalIncludeDirectories) + MultiThreaded + false + AnySuitable + Speed + true + true + Fast + true + StreamingSIMDExtensions2 + + + Windows + true + true + true + + + true + + + + + Level4 + + + MaxSpeed + true + true + WIN32;WIN64;NDEBUG;_LIB;%(PreprocessorDefinitions) + ..\..\include;..\..\..\..\include;%(AdditionalIncludeDirectories) + MultiThreaded + AnySuitable + Speed + true + true + true + Fast + StreamingSIMDExtensions2 + + + Windows + true + true + true + + + + + + \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/plugins/threaded/Projects/VC2026/lcms2_threaded_plugin.vcxproj.filters b/local/recipes/libs/lcms2/source/plugins/threaded/Projects/VC2026/lcms2_threaded_plugin.vcxproj.filters new file mode 100644 index 0000000000..c0bad06c0f --- /dev/null +++ b/local/recipes/libs/lcms2/source/plugins/threaded/Projects/VC2026/lcms2_threaded_plugin.vcxproj.filters @@ -0,0 +1,42 @@ + + + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {7d5b1769-2be4-46f2-9e35-6260eea79d7f} + + + {012df308-35db-4909-b035-b1cd5fd1ee5b} + + + + + Header Files + + + Source Files + + + + + doc + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/plugins/threaded/Projects/VC2026/lcms2_threaded_plugin_testbed.vcxproj b/local/recipes/libs/lcms2/source/plugins/threaded/Projects/VC2026/lcms2_threaded_plugin_testbed.vcxproj new file mode 100644 index 0000000000..e07dce78dd --- /dev/null +++ b/local/recipes/libs/lcms2/source/plugins/threaded/Projects/VC2026/lcms2_threaded_plugin_testbed.vcxproj @@ -0,0 +1,241 @@ + + + + + Debug + ARM64 + + + Debug + Win32 + + + Debug + x64 + + + Release + ARM64 + + + Release + Win32 + + + Release + x64 + + + + {F56B9CBA-A34D-4C68-9003-A6919236399E} + Win32Proj + fast_testbed + 10.0 + + + + Application + true + Unicode + v145 + + + Application + true + Unicode + v145 + + + Application + true + Unicode + v145 + + + Application + false + true + Unicode + v145 + + + Application + false + true + Unicode + v145 + + + Application + false + true + Unicode + v145 + + + + + + + + + + + + + + + + + + + + + + + + + true + $(Platform)\testbed_$(Configuration)\ + $(ProjectDir)..\..\testbed\ + + + true + $(Platform)\testbed_$(Configuration)\ + + + true + $(Platform)\testbed_$(Configuration)\ + $(ProjectDir)..\..\testbed\ + + + false + $(Platform)\testbed_$(Configuration)\ + $(ProjectDir)..\..\testbed\ + + + false + $(Platform)\testbed_$(Configuration)\ + + + false + $(Platform)\testbed_$(Configuration)\ + $(ProjectDir)..\..\testbed\ + + + + + + Level4 + Disabled + WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) + ..\..\..\..\include;..\..\include;..\..\src + + + Console + true + + + + + + + Level4 + Disabled + WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) + ..\..\..\..\include;..\..\include;..\..\src + + + Console + true + + + + + + + Level4 + Disabled + WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) + ..\..\..\..\include;..\..\include;..\..\src + + + Console + true + + + + + Level4 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) + ..\..\..\..\include;..\..\include;..\..\src + MultiThreaded + + + Console + true + true + true + + + + + Level4 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) + ..\..\..\..\include;..\..\include;..\..\src + MultiThreaded + + + Console + true + true + true + + + + + Level4 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) + ..\..\..\..\include;..\..\include;..\..\src + MultiThreaded + + + Console + true + true + true + + + + + {71dede59-3f1e-486b-a899-4283000f76b5} + + + {6a44744b-bed4-49ec-87bb-83978458ce19} + + + + + + + + + + + + \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/plugins/threaded/Projects/VC2026/lcms2_threaded_plugin_testbed.vcxproj.filters b/local/recipes/libs/lcms2/source/plugins/threaded/Projects/VC2026/lcms2_threaded_plugin_testbed.vcxproj.filters new file mode 100644 index 0000000000..0660190e17 --- /dev/null +++ b/local/recipes/libs/lcms2/source/plugins/threaded/Projects/VC2026/lcms2_threaded_plugin_testbed.vcxproj.filters @@ -0,0 +1,27 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Source Files + + + + + Header Files + + + \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/plugins/threaded/doc/LittleCMS threaded extensions 1.0.pdf b/local/recipes/libs/lcms2/source/plugins/threaded/doc/LittleCMS threaded extensions 1.0.pdf new file mode 100644 index 0000000000000000000000000000000000000000..007c5fd924247a5557516e30aa67a70d421d09d6 GIT binary patch literal 190980 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�giO$zwCUwMx9seH!I5x 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

      wNYa|m9?2Mm0ORMSv@?-cp77UyYdEF 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%0Aav7d)QF zd09rEho8rvFOm3khjfE|0DFLXfOz;M6as*8Tqg^o!34nshXsm)LJRWI{8MThL~Wx0 zToPzm*!c8uB4^OtAwRj9K_8~$9{lDMe-R3375pEY$2#NPEi;B1= zc?SaUR_o$cNtgb#bwbJbi%1UuIvP(t{f`2lt&voMts-q*T(JyVMdk{xc2+=U5~?p0?gxZ& z(6(Yoemwf;(Y)??j7oV_s%DZ++5Vq^p!NU5+k1vJ6>V#y0Sh8cML=m00gN0eiJ2k3Z+v5{s7~QXMtZbNZTd|7`yL=d=8_-yy$F ztg^xZ8{V$U5y^JCwQrw3*wUca$x5@!7Z|SUq@xbV?;UEjoF`@RP>}+?GUy|M1DeAd z(ycxq(k<1sFEIa6OZt>Z?SJq|5j~hjWU0xUHIumT0$E}_28(KmiMUME0bTV zz|eB2dAIeQVRG`jY>~ms(VI#cnBLnbT$2@X+;~izlje~6TH%K67WYl`4thv6o?R3! z-h0D`Pf+WQm?~w4d)aZ9H7|^o_P0l53WL^#`54EPM=r}*IgU-%ubtNV=BsjvOj-P_ zoUrcOkF1<)*K!Dt!V4VH5sdv>-6rW7qN z5L`thSURvWAc0C;l?Y3_DGV9&#K$pq-7H{w1p(fWK>mS5oYTgrUTSc-eQ3Lzx?49_ zeTu8DVfN*iK+>_u)(^^W`VD8R!O)g?r_Osgflq6l*KLhN?;9s5cD#mGZ^m zH3MZ6{GvI=!OLrDYqt8um6=VEJ*j$sCLX(e<_q8aTACqLpHomfo849%TT!rZQ*o=3 zsDT<17oCL!Y}N043pJ3w&9D8?{7Hq*7(d<0<9z%txQf-ragW%8o}{&+Jtl>RD|KZV zPUy{XU0vSBr%$PAj?ioDtA&^oo-7}W3xvQ+`1iIm!Vm7ZxJEcX_khQZe73!Q_j;~| z#S!yRguvtJc>6QH-sqJsk9)vmd7*c&4yoP_Wt>%AsHFkh4)bI@VsvM_3~O1p7!4IK z=Z(?-Vh9w5x=j0r7%>*|r?_nXT{)Us=5ejmI@vtuG({SFq36=-yl|Hzs$ZLVah@Qi zGJj`Qx+7j1ZY6oYP}8gK-Q5k9b`J=hQ-^1|RQffV`b`KO8U;jAnZm36Iizr{&rjxC z^*XT*C?`$}0ZGdEJN(zmNV^}+#(^%LS@2QUJ&8KcBe)o?+_r`4*6B~nz{e6SO$(9Xi0~c&!=q6p42%I7jY}Jt@BInF*<|u z$0f6>8`nn*6M6GAw;05htO|8p9eldNg*cNfmMkSaQ3qz-lcqFIv5u$^u~E0sv-UMs zuPwb0wZej&74qy>90)|ru1z)}~rz3?*of!Dvpki)Pp+RUc7{kja{&sjFTK68{7B`0e%rbuj~o0)I3c?jzP*v;!PvVx#x;( zdqzdH&=){XA%PTl-XmyafQY9+QOGDI`)_9|8A2m|x9qJgaZ z#N#wwaP=#6Qv_s2a=2A>E^*hTnO3Y_qDgN>1X?XUp%g0wYTP8`szxcKtcMZ?3%x}fZv))^1un!jcvc z8t&GA$Ewm(N>&rjAP}D@GH^<}&Kd}o12^{co&3cPQv3)dbA~!)vCF$dO6N!ZTVoY* zA@1#25l!dl6CaguXk^sWZ)LTQoQe3M)N6W|Iy8z{W*c#_MewDJYblU1b$kX-n;0< zA#f62{hMrycFJ}OJyW##zwHAKT`aSX%vXc?Rn3h#!3x$sgAeCU@fj)884KA?dFfbz zPprV}H=8+5?+Vuf-BWONP$9;q&*COI2O`1j@^7%i*IVn@wxuHIOLgnZPRksAZRJ@S zHHdI*zdHUi+>=xgX`~sc#;zn-w42)X>ft>Es7@_2drX(7MLoQQS%c@!TG8eNO)#P_ zg~eFi1E$wjTcSnTOu&;DqL-ulZv6ZUX7BdRkQYVwZy$d<9UOuZ@>CxKyt3|Z1qQuu zP>8H8WJtfh%yMm&OM*_(zXXVk#1vCJkaSF3Mnf~V$npB#GP&e3(TD^Fr@0Ts2;cLZ z@ecNZ6v*oZ72bFHop%;H>a6)T(;f(2@CiZ1Uehk#Q6Z@oPVBr~fpBxD@K`X$>l zIgCPvk1W?ii4!#5)W&%l{_u= z>j>Vh%37ePxojI``ZZg%pvs-eIa}}L9lFNP54RBFQ{#S>p%1)>p?Hlq*dFPE_0aH7 zoDSv)Y<=GTueK~hjK3c}N1p8Ai-VYtheo;b`auS>tBq%(0c<7(4=2$?tjm+;w9PQc zLPSZ=J?-P{?lQ7PR;AEqolMj;2&?=25MHZ3`Mh86Ad!)8`$I$}HkV45Hrw01Rofx?rSy7` zfh5kW-ZeG6iq8dm60HocA#VA!wBM_7fCnMOqZK4a>fJ1?8?ncv6(P$Zh5FY{)mkS4 zTfKAVdvAprGT2cgaDBV5&77fM-n?E|0?BbV%Zx)d^47Mja9YW9iSr-FZ>mQ=W-HgP zMtXZ!bO*7*fh6VNoXC26uYy0Xd%D(d$&eS*DMihrQ==goX>^=~#w)s(Vc6_=WUFuqwPb--y-YFUn z{WYQmsb~RBh}HLxj0@0djtc|*GCbZ5+K#0ozVA|LJ@bxgio)VSQ;Eg}NMh5A@0noS zDRivB3a5Gdx1z?#Mj|1i#+(l#!`53LeE+JQP5-a^KM^jMpNY7!7!?hB#?wy|v35N= z6xYwdE*f|Cde;+w$t(RYe3Nzp-fR}+nIX?y#b$>49_)m` zUs@Ir1{zOWbu1UqZ-kLfja7#D?Vss8m$xN-|CGRiWnQFQD?j25+#!E<#%8{+);*C| zA<2`@eLGVhl_~;fZ|+D2!XP{;+!+ZY0jUPSwc^Syo3A<`$0V`#V<t$RjoWYr4J9C|KiUHV~ukhw*Q& zOWx59dh~EP1>c7+J9*LI9*^upNg*W(yLu@Px-FVm4PIJ0Lwxd*C&vO2)Ws|c!V$;m z9*u98dicZJJXKk4^HSCvAPph}Uks|LhZKyVrPY`N#cMN~YTI!)E4n^yw|C_?FCU~Q zMP-AMGjV^m8_7w_SpB853BO()pzN!kx3*&SKJh;c^Wagt)~+mWM1FO@#%2E^j`Q(W zXRO@Mmb8gSQ$Bjw#`SpRjN%-RcG*_~Ik7ri9QJtN+|iRW)-}^a6OfE1XWe`(9{*}U zzViOMh@AIOk?KQP0+z*lVG44Et&E$-GUm(k)w|1epOb*%@nVCj0~-;+a-6C{$E3oy z$z~s%A1Fw=gEoGelzeQhx8w;y{f$%nS*y&2n=ts|`AKm}Lyo!m6YupaCy7n8MmDUb zZOl4y?L>RfQENMTs~|t5m}mV=L`Wrg>|JvCZaDgyPK=%I(^+<8ZO#&{cfW&1H@Cn4 z_{76^LRS>9vSf?-ZwmSGAJx^}r}t3jUopB2VbLA=yL2`iVv;gY15qwnn0Y`^-{F(? z6q7`I1g_4$1G$qG?7ugBn!1$HoUg+wku-5YW{t_uzgV`!eIAr zmuQiXR})fLd~PCtMx_$$^1?!qwu$K4Nn5ia%Wbxgs_n+fUg(d#^=Ka(@9W@DgD-a; zw)eZ|#Q(LspPp5TStNhk;3wQ*_SJaBxR`y76C|Hm?@YkYZf@FlOY^*wS$+BzS_hj) zaMrf1$-^jI7;o%s$P?K=V4A8F&#}JW-_KW76@53dC+_4LS3ei|_uEdm5Y^5`?99zT zhdfgfM4>>)+XFXxMZs*`X?+k}{fqe6Hgmz3KB*O6{VajESGvC@{DxVxz?V)4`3-}%_e@DK|R zFwt)jrp}vxJ$&j+O2CGvSYYm;j_ztFjQ@KUJ<`iHNc(UsBAVOFRSWKio;C4o!J0AE z4jPX&kWDff6#V6CSks?lOuP;AXO>Jm-uDbNqUHdryS89Wnm{Jy;Gu(F*8%Qu{D``Ag z`u%1j9;1^$C(SD+%C6x=@tTcJ>NjC?F=+;6=Y709g1C2D;>19fJqH&`pK5nGOTrJ(wybm6 ztGC93Lku^`$xHuc=Mf`4PEDQl_deG47fa5bCi$f0t{`g3Rb^I+*0jhpxR zu4t!$FHBzVRvwN>yl2b6_bq`>)~5N}bw_#gh>35&M;aI5jnB6U3BE7qs6^frW(m1)ygI_ew|8Zl0_TJLjK$qa5vNU3)}t8?(1th zT1V{#=eafJR{Qw(r{Jvi+_S;DAtq6&brG|6kz6<5wvnv0pug?y72|a&E^m+a4(~g= zr6vcp};V%ultGaSh$g>}4$CPI(k# zjJgm)ocB0$RO=4=eMt=bF6*|LC9!ezScrg!IY}ZbM5f_*UrWkzgW|)=nZ@Kh=ih{` zdAe#dvNrSZjDNu?i!<808On50clm%@y!j~8eYkhM0H<#LjM*=D_vMa4Md#*08cVsQ ze#v$nxOu5MEPCNEnS?IH4%RClKzb^odV8hkSuL+b0|3L0B_0e{?cMCWeZ1@`d)86T z+-=@5$V%UNaOWQ(6=N6hy zG7kYi1#%0jCLYiMVkUnMYesjnvfQ-Ep#@yHdWZTtKq8=6OjMDFW--1?tJD-lONh#{ zr1|F5boWJH%Y!}g7g6LE1K{y(Ihy;4RbCm2o+Smcn=g)UX9VOX-HXs=#_V78td=T! zm({dE+3Rtp<7$lI#|lA*%%|B8_MI|}khhcMc=P4_C-ReUa#o$wxqW|hR|u$^g}Qz3 zs2*?KYj`3k-aXCaP_HbY6?#Yw=<%6QG{-Y?Br;qc%jKJ>S8FnT?bd=?>;xwcsvn5M47t1+oA=+tRDZR$K7{~B6vOfGbi}K?`Ju6d zfx4_G1Uh$D(1wxH)erAk;e+^^>QPZZH2h-A!Ma&`|2g2nelu6|=@9rdFF;WCmd~5! zW*iQu{4N*OZSYqX4`oC=#x@Rj`=HVftUdcAQp@^2q@wS^OA2JrWu}=gN;*D)xR$NB zP7ed#I|%kC2IjKH^|ZrY6u(~DnG_no>|4dE?@ZQbhS*Q(NP&>GwYG37_!Ld4*a6_6 zh7Pbc3ec-$Sok=9B$^aYBe5sFuryCV4b$RJ^p}*!vJH#Vq7v-Zti7_E-9mJdO7HNI?(IxnuD|esJf2K2e!uU;i_0pM&&HWo+ zBlUiX`~e7kH2B6U@l^Eh)ju@o$cSHDf891u{_1XC^kJ;O2)^|43DZyP&y)w$V{f=! zXc}6ZOK-(~)L-O$Pg@k~ym+sc*^-8-HG5C_^g%GSGLu!9z*6L%2=z7gHg(SHJa^Uj zo-62mPUH#9VcAl<{9V@$Jz7&Bi*k1-S^o9#}bVUWL`gx`MLf| z_|MKb4>|;W8|{i_W{+8aMwe?pI$pU}$uom>gpTDoif?k(3s^iA|IM+5*#wTpjUj%6 z-aNSF7VW6U)81m-JvAuTd78G5igsSNy(g{zqbfD#2bWBP%kdA5H}w*>KeSR`4m?@s zSyx@>Wes2JiZ8V*GMv1ExsSQ*oIGeBHMQl!(2&v;362FrRhDZ#m*uZ&3v65%5*)G+ zYx7;#to7Qxx_j${-ak!!mG-@!+ zNWMc>Am@f>sz!&8+Qf8*MD?={i@1tpizX${CDVw&O`0p)ik6Foie-#r%;w6}ij|5b zi!sGDCeX4FyY>p&n(wndvz(Q6PIR+@GjFG5W<#ulTKy)6=EX*|9cnsv6X$q?n!%Oe zaN-9d?3jtOmhn5|yGW|YVNTN5RNIHfEHa-myWVoTawTxa#42(Ma9YXJW_V>PWH8Fj zdFClZW%g&#Wauai*UHuA)K%7Q`_^q~da^VmH@NvJVekVl7n8BoeXgjT<`%s>EK;<` zSKS&UQQ0VGl=>Vz@S0KwcM`XmQuEO#rLaf+O6rfq16wUyE#JY5EmIn4DN}w;vAS4} zr}Yoij0I4_83#+}Ie4Gb=<`R%zWbs_bBjTfCskJ8tdbUfEQnrLPZU94<6;JHV7J6i zfcpscmMhP%IMT`8*mM19^i#saY!Mn(`^4!#b8KHEF3N{-l z@TT<0_5+1}vt0N}(|5%labRik%mgwGe*NiPHu_0`!I||LZ`CuUB2x9;e4C)oioT;h zCSgcXA6(%lkF%zfdKIT@?y*l5*jEL|pP5pkC2PWLSdsr$4f=b*gl! zz1x-4m0#ae|Gj<#7l4aopJJGapo__hac0L#^Ggx)Zo4MSLR~yvoZM4QSu0%Bg~v^2 z0?P;MiYr_L1C|dgcE*qUjzPYszDNGSh`W%^GVO+;wM>7bdnKq@`^j8veVI`3#PP)D zI~@9pG?jC8QNUdBCh2!K+@W+M(lP+c=B(-*IZ3K5ahZE&<*`tW>%h(6kh0HQrzVDX z-O-4KhpsD2R4zY*7SCUHrVlY(W^`M4G3SDMB%g@a0pw7bk$%*s@}+)DC8Rl~O{71i ztQ^jn@g?IV(=Kx~>v2{IlnWXK#s75rIrU5ZSM~3Ezmu~sXZvNZ=NRU6=gQ^g=dtHS z(DI^YaTh3*ri?3w;Z>ip-1t7C$SlEfFpG1!sjvl>$nAOVMT4Ws~Jv zNM-x>J{s&8pIl4jXaI%O)O1u%~zX0 zHIos62waOt%XX_n>q?td+ibgW`*??L$55wMXHS<}S9|x9ZbXk#Ph+n_Z(W~UUroPE zfAxU$K-Hl1VAYV!Q1!6vaP43Dzx5-JMw&-Kqpf4l#=6Ee#``CFUl-7Ej?QrSk_;jU9nxkta`5!);_H> ztS4^(H}W?nHXFCpw*I2c&}$eE%=vc2&h?#)-TS+h*vHs`J>$K#eXo7;LGFv`$XL4uVcq9DAxj%u1@PjBwtS4!aP-Is!nVKGO^6BvWe2kBPXun?&9vH@A1ag{*K%O$}jc)lYKr@G58Pe`P|;g z!O`cA#6t;j4L2W3HE}(A3N>}|v;SvhCs%tPFDKjoq^J+2Wgk#D>Kj*kabt0PUmKqQ z4|{P9*EbIK;s*aXHP*3tXK(8xZscS~A+*vmvj4?p$y4M-z%@-Z4K)B2HGo5bNBV1YbadBlGBPkQ-n?~#nVI>zvoM#k$mnJDGv&1=_hT)%enCi6`e zmVX{t{!!TfStxCBbMsOPr8N-|5poOQ`W3)9wd@6|y8!CzR2QyOkvpiKQslct_0K{P z^&jN|r6ZKD2xzX*UZtb@_nTAz>I?sQ^BREaBGm=zi`18BE?>EHfnJhw^ZJF0JU1R* zdZPP=`L5?jiOV;?|0;XR%g3VEY9lG-6*{6q!ym7|x3q8TEzSD7JnY`H1Oq$Owrn36 zw$azi_6HT8+Q)oX4%Gw_bHXc=I>uLza;rKg)^LVz{UVa{s=FrFk7d=39Q-3wU^U&y zjg#vDYHEtK7yl^}&1GuEe~Q5K@Ww@o1fF-9FG+m-e)As^wCauQN%Gk&d4{ zB$hu}ucHdv;W82`GW5f7T^czr#%rHlOq|mQ=r$q)xRijm>YL-fxH(6J_UmL@bvSN7 zf6&FFfh$3nkT<-ykE|>A1dHTHh|W#V63>5g)r_e4TiFV`N1@n3EQcXhlM6*>hsP!P z$$J5gRfFzl#XNrN0m|UXK)pA9}yLIO^ecA4(t@u=( zG4%K?;@~hD@W(l2Xp0ZF;7SItLv=ALN|V4!Emsq@^>GB3J_3?A+7YrI2ni{@D8iEnn3FGQ|Y%mXv-BC@| zLtZDOeGofe@|%+-Xda1paE%`vNOH@&dTKHC&tvf#g8Mli_*%x{zdaD0WWYEIpv0Y| z(t~|3O9pH#<0|4lhDGo)v!?+T4Z12wITsTNW9n*{+g2l`UT)AMpQZ(zs1OdM7gA$& zq@ZREUC19G0}2_ep7X^+v(RJ!E5c$2uOzyHKQ>sv7gASQo#x@U$$;E1uOXAoh;vLv z(-vRiDHyWsj`1cXlwwF#C1gPJog*Wg18`aXf4|SQ6Rs)d37!GUHzeU8;wl?sUHK1+&4Lv2}FPBvK16_l>}5){*%Zz2m0z%K-(;DXCQb#EMqYU7DS&iJ!3gt>B6We?`| z!lNjrHLr#k(nC`H@;8$Sk@sB1&Z5wB&sYtezrEtOwiZ?j;jdHzlkX|p((tF}2b`VH zk^!oI790du@N0BBKHN*>peD->w}U!V+NLP# z%Ks4u$3S1;vrrDcLhwral&{3gRU=#5nX~i53mV#Ztwekk=^IoI1K-=V;Ci zlh!h2r!!Kufe1y9Qaa-ST=6c(xqS&6E83Dbv{9IKagE64_~88f62B5&s~gk_pF|Xa zjW8CsEY$y4B&ZZr4V83jX*ko;P5q-f>|@1)=JLHW>=F(wJ4uR?7CKMcTAbo4S5q1WtE9G0 zrr2U~@?InDCuP#oC_iSfHRY@8XaR_O;v-379?c~qR=Vh<8s36N8m(W0-OxdJHI@xL zAIx-`vqg`#GM!EE_BR?U@Ozx4q``tbahp4^ME`f(s&g+{u-sGrvl952J}cY#ZHBea zg_E6Fj#FqSzoL>m{0Le&_jbJ7?*`3jUUH$c*Ho2Q%cEcZNoi0SJr ztI_vX!IVXqu4i2l6cqZuMezf~{>D+Dc(*Va;ENO|34!+A!--mCz~LBDm-L7fr+T^u z*{xqA13J}7qI-yZ2q`d76TD9u5&oeF`mH!JU|)5lzFW8A&x+mj2X{~K#KT|PVhVKw z7i(NfveDRy`E;CZUQM3QorpQ$Dn$m^? zDX2Iw?z9iTG|`;@dTe2IRx4J&m^E-vjO1c;y=sTJwmj!hXzx1&gS;N3XIrh6UoJJB z2FO0v*wfH~lL23>2%4*8z|uMBa8dz_9JVqiz??=yg4`Ayp7un zE$4VX`dU#Q+6A4otiXlQSjPf2QIVmFsm-;bOo27mywnWs)`^|^~jcltg@bnN&;RovBWPmG( z4A9Jh%_37FaZG25xnw}M85y8AvB||OF`qr+p%A|G8&zcLUMi*HZ`{@NS9+AP>i}SX zi3||%L7ZYBXw&#CeS#htu#Ds&-NWKTo0i^#PAScFmdFxbF5oT&wQ1^UiU$eX7L~O| zTZ?&TSOcW_;u|+G;-@Put!1ZBqd&JNrCNJSlgD^ZOnHXS+cd#E{EJ9P47{Yeu`X5m z709dJSeu|M z(w9GyTi$b_My0%iyNB4G{depB-!uh!pA6vER>Vsxs%ek`!*u-=c#ad&$j-52WIx9U z;M-tK_@vb>L7ezLdslk>VC0r`?I4hbqn8ZGw=8Xh5T4sz##zF?D9pz8+mb}jAxH0y zFa8JSC28l6mnndB5cwO5_O}Ma19ojA;v{@%1v~JExPA_F+zT8>HHz@TEJ|ZpT?TX} zN_cO1DKj%=ynJV9s0wLkxqL3-&zIzm0a^~=`zK1!b+EZNUoojHlgeQndxZL;@&5r_ zKZxC-;@bpR)J!n#TTC>UR;A88Yk(b{JaNtdX;H8#?9C!@9wca4^*01Yw8Yo8D7@w6 zaJ=Rva)N?X??oTV8uJ^wA=7k!D>>3ZP8cL%$bw1yJf*FZo_bw!UZM8kOT`bxCT9G7U-@U0MYF6tH}Sg zO9ot7SS9V95duPLM&X-aGvS<7=eME}O(-|cs)ZS+OL`hQ6ZAnMwl2l31MeA~)9kMK zUS#2?z{qkG=1Vi;tZ>{)#$c2{Q;Rm1_61F^HR~@nJ)zL@|6zRjC(f)vR)#l^tYVEw zm=Y_30c3fB4xd7yUa*pELI9CFYQK*RnDgx?1HQ%)%$6V&6($@VC7v(;2lm0%u_chx zVhr%qj|{-qh+B{WH?2;iVI*ZNK6lm1oMHrKlc2pFG63gh*+9CF*uSkq059M)1n2Or zIHTW02UmKGRQ*!4`Ma4D3A*E5{Kb$>O9tF<-kT#x(HT*aDxxvizpAP-ewoUat3T(! zXq0XPx*tadM7b4Gxce~S#8fj7y6=GFMQ==MhlThXb^9VKM31Tl%eFZHMr1LjE8EQ3L$Xhw@3^F}f*k2AzEhYYv{(XXeO7!XTwO)f_lrnkTIyo`+Bz%1y+XJ&x*)p4@i zKl`^DME8r6QOEHiEbMJP_)gNjdf!?s0zC)s?s4R=Jy8U^#|<(nuR|p?krZ(CM?2u1 z$$*^{eo9xd`2g2>jjlRk$lOg46zS`f+JrDd8QKRjR4~s)0JHA*(lK9+%>eY3- z1ZFL@L>v#xzCjLWG{OA;ZY+-kPFLFGK?bw&BPHA~{g@Y#kp>X9@MXF!ono-;F=C=Q zdn`>>dD|avOS&Egh8(4_4LS*85S@naTk#uTyKlLfiFA3AD*S6m3DhT@2iTW`6?r&L z%U?!gopmX)17)ovr{b_OY@yKC11H78x|p)qedmb9kmdMziYS6wJ&11cNn5|yAj5}N zc!j%!TCDA-$#$Y)=EB3pCZj)Z$HqLo6e6B{EqezZCKXb75~9}Ka-k3d^ldKn`-63c z3P^(aTbgegFYW%7YKl>yHV^}byS|oc!txY5Kl_Jo$W}^xN(Qiu9~~nnmCFrh%LkM* z)PquWK2}sf*IG{ZtoEHq;^`w>aJX;U#vjwUalL&aS7aS4rjiy&OAn>$C6Ul*S^cF+_E|y zFdBx?f`?PW#bF;NKVPx1DzG`SOih@OWSsFV6!-tayIC1fyLm%@39+I#Q;f$#x75oj z%U1n8@)L;t35E*EV50sXJ73NOnKjdM=#seN&wxu7{P$W1d$y(%H}CW!L)Ei5lml z`sgjb0vvb#SiPEjKRQ5qc@(5fS=V*XaTR(eK3zjxjuMODB;ISzR+H840#8Lu*6@lg z*crZ%pFkePreT1WHV3^e{~ljkucaQ9zR11AFZS$?V8K9)(3;Zv17eE6|Tk!~7I!A%;jrEoBS(PY`+J21pW$2A~=@AQODBN~=d? zKs1D4=4*923E8Me{_SrCbyZ*b0Wm+=dC!v?U4S3{JT)^%255xyD{Y)6QRd$?o>vUbq+dnx2^nCZoSdaT!TAAcR$UC_Y9Vt zG_}ZNILIJd6>1|g0qp4btZ>S*6bB@SY>1h_!KKk}V>weRoA!!BIKpiI}5gHOp1L?GBFn9+?2VWtY;Rj>JCHZXS z6w*-_ldD@fe!joOACyV?$h2tWvv(2tNAo8)M%Q9bM-B#n>DAABEKH3-U}dh{72-Tp7+^WV{a7t;p%H?TjLv{c-eDCsO!*({r= z4Jb{9_B3$Ekc1SFW?S#)%$OzV^%GldO;1c}{dh)nZ(N~_?(AfMq39M@0MRlTSmrCs zAxo9*4jOtu2AFLz9p8mS4ev)U6uu^Pqj!8W<%h&dx)_Fj4dE^4w*@S2=s^f}q%tx9 zg%Uq3CIdzVAu9s7IMVtOB-5Sr-4Yg#qtI>LKW35RWiC$4+=Zq~#J6&hOg~=ZVMwcj zxw|lvl<_}e7c}$VSGTX;wp=;MfenK86Yvy=#M=WgMA4w-Vc(i3wuu+_IbEX><=J_L1yX+_gw`Cm(SWl&S z^;Fa1-yvQwcn;T}L+YS76$kojGz=dTXvFl}2ZPTGI@XPDJK0;2i%u#FD%)p7kdXG+C0Ku4pXoYREk+N@U(x~|Znp^2fQrrXJq;-^_CWuvnk$~vLv~xLGRv+*VtebR?Y~`98)fM{bk&-f_>k&M0#cv39$GT zTHg_`mm-T>K))47GG@(0h2O3{*mmyuCXfs|6N`)Ax}l*n#ASrmnaqmwF6iGv*8Oa$ zPUdj-{{gm+Ll_W+|8b|x`CZ2rvMLATIv{QMsDGOQ=!KW(OI!sTY@UHH{9HcDKtZc! zV@H)9-vPXckn!bdq%{hJzU)AsvK^t01Am-}h?F6|g-wP1F^t#H2_@Q721=lD{XLbr zFcp0A%>;`|S>F%uP4w+s&SF?EgC-C~@`hhM@o&xMUp&sm2Wz-oI_lF9T%-(Wk>f)( zxHqY{Eew}l4LGY$nW`KoXL6q~$UeDC&33x5Nz^Y~JX-f@)GD8QT`j+y%$6KF*{W#t zGbbKOQBhVa!{$<-;o?er9AjoejLN%84%gyANB&O?&n*Wid@p|-Z^>lRS_AVHN)J(L zpmG!1YM3S_BpqLJONdDzE!o0m~UNt@&TKIYAWVSB=q}F>>^?hEr_yW zHH<^QDcm1y=n;|!euoyP@7yv`d+(c+mP!IQaGb((C~o8rA_eZ5am%I@Z79OpW8W~o zWeG%r_TXdwIJGSMKxb3-3#I_T;|q@g+W%9^q65D%0@|RNXq-Uqt-TnfUWChM(@&Ft;m5uSyP;ebCO2bg z{%9W)prHHa<(eT`TU?s4Wn&Km^BxjeU%#x%Zugjg4RBqpZR{s#5v_5h2O%Yv*pP?v zw_3=6?0_hCP{9gl#xgA)dW}M*CfSIt`H^4u3LMXxk&uOyD-H1dzP5$p0Z#%!Ap4)hpt6Rcv|xY#AKP z-14Dd@C<<`@CK`llH3oR%}S+2!L1p}=IGL4&gv*;`{;xy$2QU1mvRiOj#Oel4jpjj z!1_U5+z@^I3XZbBPbO8~%-&oBUl={^y?2rS+e!LhhhBe>J}K`ATOg+#`^X~25$M!+ zm-Fzvc+YX01zHF-tcOfAs_TAbs6l~W6ctKWV;FOXK+Hc)w*D4r&1h{b(m+Z8KM+?J(5D&l1s{$? zY%onkzv$;`pzL8D3>e zk37S_gJ#bE3m5jtfE8y-ZfVE85L)TvMw!O-vQ1v9{!;cD)dK%gAv#L91U>hMB{2A1cBP#P{ksHUc?VRm% z*Te?YT*;#y38@_lH>HsG5FQ7Et<;g+DQq5O8A|a5)ZkKvP|RUqM<+u@$5!P0f(cn?E9HvaR1-rvb93 zeLl2hA3I|irvSbZ?&NpK0=_ssqHDJ~kC+YY9xp@zNTtaH$-7O(bkZw|*75jSCRn zLs->Vs#aG2zBHV+Yt5a<4qn!>XgL(F(4YjRCKmRsaL&J6>+xiOlYNbq5g&C6z`1Xbb#v?)ov?-5Nm_dGp`uJw>3yrG zRE)c*H{`Ma7m_M)wrB@4Jkp6v;U~&Z(Y4O-{N0;%ffNNMsvz|V;2$L*I@4w*a;5^s zbLK~NH-M$aB5eOqL+2rmgJ6LCvW0UmrgyE`M3=shkKU8@^F}0ecLrJmuCN0#`4Xdq z??sC^dmUs6{u^ofcEYBA>|>I#P!W&*rZNj z>cVUM_bu>~3FVenYhN+cD3Y1x)s>Y{R?~m|qqRm69q?zeIL_uKXYh}rb0t19Ag99U zJJIk8Y4k9#p#0oKRaCsZ`|`t>@w%Z0fYYQS$OQL?;X;cGY`Irt${G$hK?=z8tPpdi zJMo#6&jh-Ymqk1XQVC1f)TfO*xK$?eg-BH8aODW)tGyLK> zh>Z`n`RTudW->${BbO;!_GZE9#!UKf$LYm-q=CCu=lqnc$xc43yCLqIxl;8sm=XkH zYg#v7=@r8A_ncEGMz8IysgRRnses*}T}sBKTb+kJ>pKalBaRW!@8x?)3R9G6Vmd<= zovf`HzwIyb-1q)M5;n>MoAeAgA_Tj>W)?mRLMd}4&p`|WRW2&PjDyWjbci?pmT0A| z$=kNx3RNQjfE~MIae_nMDzRR7xN29`7sayFineE7On{?LDWQhIi5C1sidLB9WbX^{->T&fs-ykj!L&QJpu@=$F0E@F;NfuXeJOC-Ken{q@ze|3%$f2i5g- z?Sg24KyY`51b6q~?k>UI-3|eQyF+kycXxN!put@aa>$(g-h1nPzp3xuJ5}?~Ox3CC zv#odU-n-YcdaY-zo)HN{=W{~F^Mikp|FyT_o9g)Jpe!Zj8LiCLVYS z+7V?v@~?2+%z$pFa!H%eMXGoTz2f#4pQG1jAVb6%rK#kAnQmbwS^ zXwLBVEGx9cF0me$e4ecC$R1|rXouK?SSl}hJADCbaV|vfHbS>wdcd~zl!l(`p_~VC z6$VF3rw>R0KDfVKSH0}@_J$P*P18p1DK^F~ubq9%2EsCN!b_dPGn__9 zGE5;Ktapd#pUEPie)GV`R!lrxRb@#&7B#tU25AV;ED(q(>}?lbh+KlrI7gbxD6eT( zciMj-;BDipj`!z5%@$tPRD^A+2+7h(v zBe@e4?^4g`H}m@-=aE4nao%dQ(DYy;D15coNSKAnx#7^OCc=WdR;nLr6sMnCQd^^_ zgHX$hUepT?vpu81FDUs;m#u4Ip9(*_C`9Km@?NyN>ZeslZk;6>?Vzf3x(blN6XRy`P3bIs1w_fKtQSPd8y%nZ?y|{5E1% zUB?R$Z|=;0%SHUMR9EVB?k{U+^~R~UScfrX|49P8xXaTkzVB*3wLn(+6hTZ^29ZP6 z{Z+-5;B?92`Ta?a@P}%jSR@ml)*4)}NuI;M-YqhFI?L)LEfLA=0|Uj-Bk1#cC1cK; zji2Vr%F?a&V(lLY{S)A1h_MPvnfBY$`P=gi{xhS^DGIQy>C_Ck#aV*w<63{z za>CKjOEfdF>sEd1?q*-%(z2BvZ_?xS*fny+sFOu;HnW@^X<`_;$WRxQ;Y?^>8T+Y* zT2QI0gXENE@l8h@>ps(h9sZ{lgU9ouy~kdw;!W&3L%WB<$+Fvfz<`)#P+}z2G#7(?_pj2sV#bh$@mw?QS`^;v0@}1C9ca4YWS*yNE3HA$i z<0{;dhQbB`c=e5w;Qz))_*dSUgT5Vm_GrCGNJ>x4wY01P6Go!7Zm#LT#Dlk~D+X0ZA{bRgbqx@4RRyT!UG1F!uZ~fut9x*w->GS_4+o0eN*%ALng$y+ zwzcngC4{7^uNppLRDRI!jNSG7AfuO#Xv0!u^G|joW0g4`wRR@& z$j~`>(uyiSk`pDcIoi@0u@=OL>|*&p)Y?0}27bA%xoLS=F46EWzn_2}BRyIj$Xz#8 z6=bXEzQRm;URg%2^DsE$@iTZv9;Tu8nRk{Mf%{a#Js3QEY-WZu}}VOM_hndp55AbkZ893O2m%s@wOv;=ymw zV7<^lqh0=pp#0lG^d}xHEtCg?6#%R{1}=`N+VZWzte`1n$*Jjo0G;ZfpUDJ|zRK`S zee4{&uVCt4^n*ol1KZ~{u1`xQeGu12*@C~56ZYPI8hE*EDo!RZgVc;1WEly&S1@iN z0I*F{Qn#CFQS9@~Jp!8w8WibANF}9h3Z2dFD$-OD7iDZ2D~)wKJk_Wo=zkyw>SkHh!he9GHiyb*?yqXt`r5p4Z z67)LHI~{ifPw(Q%IUqiYcMfo8hAfD1?$r|p=Jq@4t&e z_giVi=&7Qfp7((^Kn_-4E=srHV6f>gXBXIoE>lgSJUm5`&wMjMl&6uB%^x>`#_xlpO zoidee*jD#7O;HSDQr#Oa=alK=oSC6z85Sk=VVNyK4L_6oa)^J!iT1Mqe{elof|YH{ z8=C9aAq9*9db2{i1QUYZUWFy;8r~i%GbcRqQztDw_>WFz=186-Xb0-1399qvU{knZ zwV!BEEI_rclAP$cDXH}jgmp2?cEsTr<=A32n04`Q+OHH)3$II-tThc&JJIJo+Ks(! z+EL(RIH*P4`hZ3nj5Y?;OquX6n{IQEYrTVgG_QH*!Ca%l84C53hlJun{ zg;%})h+FN7(!IxNSgyZ*DwPn&Llz|Xw1L%e=SpR9?!^WY{N^QfBaY`0u5a%(~4?qA~#yk~) zy)Rc5%bSl&QACFFLp0~-?msSh2@LoZzpYZ1B#|a+nKk!Dy!9EizHV=h8Lo} z^6M2Xw_@q{cXn@X<@f`yfk6S%oExg8d&*>6;=JfZD;$${fLF;0I}o+9Qu}Lf+9;~T zPDgxP8hSVkQJ9J}eRtW)4X+gz%7Q+H3%-BY70t*PA2HAGR3vg!na%WX5&T}1ws~502{D`wdMzQuE&F2 zAOk31LPnKS*Z=yMgRkQI%D{Wcvw-5T(1nK3ODYKL>Ct@w%e<5`8!#ep*7GpDJ%ZNX zQnNHoPU@PMWerB)I0oWG;xy}+m|v#mdrTj6zZgX@fEWY`^q+gycxm4eCRbA#1XF3f z{Nq49HYjiUN8AO13g)LrF|Q;ULM<2453w~JRXv34*emizZCzcOC|*EhsGKF_VnXBhqtj8 zR)C?LoV53IAs)f+4|MOsB`=TQK5Vb;E&_~#`@#SWe=QmweD9|-@AHN~lW$0#EZE+c z0rwGc4uivE@BYm_lhOX~>Ovc71+=plbohuqicelu*lpF2Q=~zq6iVu}W_?o#609L2 z7z4CdE#FV}258OtMaY#XwfJ~E{0xWu8@rZrPzr^J09fhi^Uk&Fwk&2QsVyyojCm-e z%j@)PK+&?vH=5)z1l&R6IG7trkp}`*PGTQ+N=Sa=M?O$T=MQ(mp9FRmf5}?y z=Qbe{0v^#^jp+O+ZX?wN1%bS7q(JVs$js6=Xv(h5)~oq%Bk!oB{>v+ad)#C~^XR)T zsEX(I<oLw^v;Wflu3JF*_(%*9aCC#;%jHE)7+7xc6LsDMA5oFUL4RAn%ul z)Q1+P`4TrG)=>Yzpov)GqWI@u(DmES%P$WPM@(n-79|>|yk^Kk76l#u92{v0Y?{GOx1YFeTX6FrFK&e+CBBvK)PfccTLmlLsa`HwTwWC9 zd6ph+4u1;nx8>ZYHh^6$nQZ=rAls9JsO;oK=v0jX8^Cmhr#9!_ZzcC_`D7Bf#>RIt zKbfD|Dyp}wCgA}Hf+Bju$5}S)-$TDA`re$(KLHjSYf7MXxFLKo3QKyuJ%H6OM~m<@ zNXE?X{;KPv@4cH~t{Ywb@%EnThlCC9OPgD%#km*(PG7_=Mv5K$_ShOjT}H5x{N$9w zgo}2|Gq-7m9tunqi}tu={4jH~wTyD7&xhBu?6UQYsG@qBMVIfI9V)rjuE5~g^t384 z9sA2GmG4mf_g)GhCZ~$=1$PxZRH{}L_q{7DfZHzzV84gC0AQ(*a^k*dS0Zb2md{Cx>mSa)L5A{pk|H zw(tF>+S3;tMYi?xk*|Q|3YzySFB$323uign-rLK3Keh}%KV7hnzen4?R}g$6A=WUK z1)R<-W_LXl&pqPHdp4j$yJpIZi`v$cu9-CX%nZJNELjpN+oC&7AuB=hZsUYJ`_1ojPEiY52Eum! zR|czOytuYncjQKUOPC{F#OW3eMX{Fthe>C@X5?QA*K}=ihfPxqjxa>mf zsZ8jq)#T{Qz>+h*)>$+AEgfV}*vgF>?gWFU38c@a5o8%DcqH|7T&>l|H-h?t{NL{8wABu+kv+xZy+vP#L zsoHV3B(4}rg3BYZw<-P7^qp;H8RpKv6sqZ!2jKTZ<}RNV|HH84Zm86ApeuAe0H*TL zDNnt`M*d87*R8L#>K@V3!H0(({$}H<5Nr5#(49(yclPYl&rAqbv9DGj^|I-^RW@g* zAp{JTz9O{SXoH|VA@tvEF`~FElbJz*BS@j+9E%aI*fh)2F_%>f#UYntBYdaOsn7*K z@7@vZs8U1eYfWRcd}ld@QX``$j&c}M@ao>cTcPpz{3uH^<l{xe_JPiWqoEn%N|-4!ul(hAi|8%K~dUKd{|moG&Dm^ zgU6}n+jqr>bMVNZGi3eA%Car5c)z(z&=UwJbrN-gOW#*@I9%I$=@@j$wx+MvHh^rx zXiPsqS+q%vXSm4jRXH~{Wi}PHX$IDRDe{t|5l0S;wt9j~j5ciYa$2{bW`#6~cunEoOWsYxHJ8@$ z&Cm2L;s_*fY#%Adk6Ut0@bO&j%x3c6}8(692tnC;`CUZZ+%4{#1yOV{)Ae%HB)04GZ| zaUWqqz0ghENzStc0MtBlrKxj;6Zy{O-?D465+0tY&aN^$er7HJj$_+Fnac<4*F5aM zA2z(Nf;l(R)!>g74;jp6Nbvx(MQz{jd;X&$X+;t+fvsmH_BCVX)wl*k-Q@$G(oUTL z)E&KZlsy}$Z@$&-=H*^A52M%!6S6acc{Tr8*Ta^d-f^;@{_*M-{!e`$mZ09c9Vm~k zWox*H1Xb{S45FVse+2BvAqpg~4{q=$Xp~ zaKdB>#&i!cutC{S-CM-2W%07W$89?qHsD!p)!})*{gEZPR#R6@XYP~DR|q&GsQ>Ug z|L;3g<^R~_|Nl7yoD28Ai3(@=cTl*9y}g60i!LkM-{@~rR`!1tf720xxBdo?gA1;I z72N+Sc>XEa{s|W+W&2x|3Mm`w-$EZ8PySDcxC`k&+e~844vwM@p1Oa}<>2991fRyu z&cevUs?Q|p?BM1I&UPfG%JkLD-O9vFMN*VWl}XL{o4t$UH)k_@6R&?ojQ?|@pdgdH znW@#c|3zg=e=l$)<@~3;;P`YG2RCOEGnc=~l)w%8dlyzia0~u<4kk6Vzm56ZUhrQQ zQqF%K1bhP}X9p8iGgn6lN)J@#%JpYb#mkOUuHFQ{DM(yp1Ai0pfdE1T&re@iJgh2^|K*11I{@El> zOJqd>1a7XKWU!mqwbU`7gzslE9pzk2AKe9JV*emjasDRdBpvu0T}QA5yxy4{0#zkY zy*psFZfj5X!j7 ztC{jAl@2>e6DHj!8|Pg@2ZUL_vZ-4fj`+~3XS~j8%2X%k>zGn-=|tD-{oFcn1-`Jl z-&?S}G_be>j}Tu{%tDrJuq_8zpk9zurlbLYR2|Zs|)+p zpYT(+ez)$F)GT@^8M}85ePEPteEoqso`vVBl}yYk(1}WoWKhMIIE(p$WWm;~6ep)c zoC|7aL-tPEUH>*CD5}zzR+@%L=d2=9#R~FIM?xiq~Bn_!CQ`qNR?w5;IPWIyWq^J>w zKiqP#6Hr-P^d(sBbB+B3ZT(U<>5Hx*+a}256BXs3<8@tYjp z+sx=C^JhaKo|D^`y^or}HQb0bgYJV%_idJCJW$dSv`dQ?JEs=Z(XEcznqr}tVQDo^ zUbr}FAA#*KmYYI2sQg-`_f5aiZ{)2z`1mZrhY(5mi-4WQ>U4gSwh$B+=JU@by~VOO z(bY}lgs%>xZbi2Mie{WD;%4&a+Bses+X?Ktp|6}h{hcYJ?mU&*?CNb`I;&dhpw1?r z@fW@5Tl^%K%lKOzp$Y`z^SHz=l9KmyvWVaO9{NkjBeYzV>mrgh&|7lB@Gw1}?M2Iv z#}1)#l3h2J>$+Gx9luIZ{Ulmv_(Z7W+5;EE0f5DYm?9$(lIK{<3;~Si#Lemh;xcSj8Ds_)g6LRUR0M zt8uRk7<5Sf58nv2#Gx2GKSC|3#RwYAKQ$+=`q3y3|kCnD5hKeVhh

      RI@Sy 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 wW?Tqw{%%$*wl;8EX^&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +am__rm_f = rm -f $(am__rm_f_notfound) +am__rm_rf = rm -rf $(am__rm_f_notfound) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = plugins/threaded/include +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_append_compile_flags.m4 \ + $(top_srcdir)/m4/ax_append_flag.m4 \ + $(top_srcdir)/m4/ax_check_compile_flag.m4 \ + $(top_srcdir)/m4/ax_gcc_func_attribute.m4 \ + $(top_srcdir)/m4/ax_pthread.m4 \ + $(top_srcdir)/m4/ax_require_defined.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(include_HEADERS) \ + $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && echo $$files | $(am__xargs_n) 40 $(am__rm_f); }; \ + } +am__installdirs = "$(DESTDIR)$(includedir)" +HEADERS = $(include_HEADERS) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +am__DIST_COMMON = $(srcdir)/Makefile.in +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ETAGS = @ETAGS@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FILECMD = @FILECMD@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +JPEGICC_DEPLIBS = @JPEGICC_DEPLIBS@ +LCMS_LIB_DEPLIBS = @LCMS_LIB_DEPLIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBRARY_AGE = @LIBRARY_AGE@ +LIBRARY_CURRENT = @LIBRARY_CURRENT@ +LIBRARY_REVISION = @LIBRARY_REVISION@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_DEPS = @LIBTOOL_DEPS@ +LIB_JPEG = @LIB_JPEG@ +LIB_MATH = @LIB_MATH@ +LIB_PLUGINS = @LIB_PLUGINS@ +LIB_THREAD = @LIB_THREAD@ +LIB_TIFF = @LIB_TIFF@ +LIB_ZLIB = @LIB_ZLIB@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_CXX = @PTHREAD_CXX@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +TIFFICC_DEPLIBS = @TIFFICC_DEPLIBS@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__rm_f_notfound = @am__rm_f_notfound@ +am__tar = @am__tar@ +am__untar = @am__untar@ +am__xargs_n = @am__xargs_n@ +ax_pthread_config = @ax_pthread_config@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +inline = @inline@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +include_HEADERS = lcms2_threaded.h +EXTRA_DIST = lcms2_threaded.h +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign plugins/threaded/include/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign plugins/threaded/include/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-includeHEADERS: $(include_HEADERS) + @$(NORMAL_INSTALL) + @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \ + done + +uninstall-includeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(includedir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -$(am__rm_f) $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || $(am__rm_f) $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-includeHEADERS + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-includeHEADERS + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool cscopelist-am ctags ctags-am distclean \ + distclean-generic distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-includeHEADERS install-info install-info-am \ + install-man install-pdf install-pdf-am install-ps \ + install-ps-am install-strip installcheck installcheck-am \ + installdirs maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ + ps ps-am tags tags-am uninstall uninstall-am \ + uninstall-includeHEADERS + +.PRECIOUS: Makefile + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: + +# Tell GNU make to disable its built-in pattern rules. +%:: %,v +%:: RCS/%,v +%:: RCS/% +%:: s.% +%:: SCCS/s.% diff --git a/local/recipes/libs/lcms2/source/plugins/threaded/include/lcms2_threaded.h b/local/recipes/libs/lcms2/source/plugins/threaded/include/lcms2_threaded.h new file mode 100644 index 0000000000..4b67a0af6f --- /dev/null +++ b/local/recipes/libs/lcms2/source/plugins/threaded/include/lcms2_threaded.h @@ -0,0 +1,59 @@ +//--------------------------------------------------------------------------------- +// +// Little Color Management System, multithread extensions +// Copyright (c) 1998-2026 Marti Maria Saguer, all rights reserved +// +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +//--------------------------------------------------------------------------------- + +#ifndef _LCMS2_THREADED_H +#define _LCMS2_THREADED_H + +#include "lcms2_plugin.h" + +#ifdef CMS_NO_PTHREADS +#error "This plug-in needs pthreads to operate" +#endif + +#ifndef CMS_USE_CPP_API +# ifdef __cplusplus +extern "C" { +# endif +#endif + +#define LCMS2_THREADED_VERSION LCMS_VERSION + +// Configuration toggles + +// The one and only plug-in entry point. To install this plugin in your code you need to place this in +// some initialization place. If you want to combine this plug-in with fastfloat, make sure to call +// the threaded entry point comes last in chain. flags is a reserved field for future use +// +// cmsPlugin(cmsThreadedExtensions(CMS_THREADED_GUESS_MAX_THREADS, 0)); +// + +#define CMS_THREADED_GUESS_MAX_THREADS -1 + +CMSAPI void* CMSEXPORT cmsThreadedExtensions(cmsInt32Number max_threads, cmsUInt32Number flags); + +#ifndef CMS_USE_CPP_API +# ifdef __cplusplus + } +# endif +#endif + +#endif + diff --git a/local/recipes/libs/lcms2/source/plugins/threaded/include/meson.build b/local/recipes/libs/lcms2/source/plugins/threaded/include/meson.build new file mode 100644 index 0000000000..d38e63df6f --- /dev/null +++ b/local/recipes/libs/lcms2/source/plugins/threaded/include/meson.build @@ -0,0 +1 @@ +install_headers('lcms2_threaded.h') diff --git a/local/recipes/libs/lcms2/source/plugins/threaded/meson.build b/local/recipes/libs/lcms2/source/plugins/threaded/meson.build new file mode 100644 index 0000000000..8f0114e963 --- /dev/null +++ b/local/recipes/libs/lcms2/source/plugins/threaded/meson.build @@ -0,0 +1,3 @@ +subdir('include') +subdir('src') +subdir('testbed') diff --git a/local/recipes/libs/lcms2/source/plugins/threaded/src/Makefile.am b/local/recipes/libs/lcms2/source/plugins/threaded/src/Makefile.am new file mode 100644 index 0000000000..7a204d4efd --- /dev/null +++ b/local/recipes/libs/lcms2/source/plugins/threaded/src/Makefile.am @@ -0,0 +1,27 @@ +# +# Makefile for building lcms2_threaded plugin +# + +# Don't require all the GNU mandated files +AUTOMAKE_OPTIONS = 1.7 foreign + +includedir = ${prefix}/include + +# Shared libraries built in this directory +lib_LTLIBRARIES = liblcms2_threaded.la + +LIBRARY_CURRENT = @LIBRARY_CURRENT@ +LIBRARY_REVISION = @LIBRARY_REVISION@ +LIBRARY_AGE = @LIBRARY_AGE@ + +AM_CPPFLAGS = -Ofast -I$(top_builddir)/include -I$(top_srcdir)/include -I$(srcdir)/../include -I$(builddir)/../include + +liblcms2_threaded_la_LDFLAGS = -no-undefined \ + -version-info $(LIBRARY_CURRENT):$(LIBRARY_REVISION):$(LIBRARY_AGE) + +liblcms2_threaded_la_LIBADD = $(LCMS_LIB_DEPLIBS) $(top_builddir)/src/liblcms2.la + +liblcms2_threaded_la_SOURCES = threaded_split.c threaded_core.c threaded_main.c threaded_scheduler.c threaded_internal.h + + + diff --git a/local/recipes/libs/lcms2/source/plugins/threaded/src/Makefile.in b/local/recipes/libs/lcms2/source/plugins/threaded/src/Makefile.in new file mode 100644 index 0000000000..8852edff22 --- /dev/null +++ b/local/recipes/libs/lcms2/source/plugins/threaded/src/Makefile.in @@ -0,0 +1,724 @@ +# Makefile.in generated by automake 1.18.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2025 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# +# Makefile for building lcms2_threaded plugin +# + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +am__rm_f = rm -f $(am__rm_f_notfound) +am__rm_rf = rm -rf $(am__rm_f_notfound) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = plugins/threaded/src +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_append_compile_flags.m4 \ + $(top_srcdir)/m4/ax_append_flag.m4 \ + $(top_srcdir)/m4/ax_check_compile_flag.m4 \ + $(top_srcdir)/m4/ax_gcc_func_attribute.m4 \ + $(top_srcdir)/m4/ax_pthread.m4 \ + $(top_srcdir)/m4/ax_require_defined.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && echo $$files | $(am__xargs_n) 40 $(am__rm_f); }; \ + } +am__installdirs = "$(DESTDIR)$(libdir)" +LTLIBRARIES = $(lib_LTLIBRARIES) +am__DEPENDENCIES_1 = +liblcms2_threaded_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(top_builddir)/src/liblcms2.la +am_liblcms2_threaded_la_OBJECTS = threaded_split.lo threaded_core.lo \ + threaded_main.lo threaded_scheduler.lo +liblcms2_threaded_la_OBJECTS = $(am_liblcms2_threaded_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +liblcms2_threaded_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(liblcms2_threaded_la_LDFLAGS) \ + $(LDFLAGS) -o $@ +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = ./$(DEPDIR)/threaded_core.Plo \ + ./$(DEPDIR)/threaded_main.Plo \ + ./$(DEPDIR)/threaded_scheduler.Plo \ + ./$(DEPDIR)/threaded_split.Plo +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(liblcms2_threaded_la_SOURCES) +DIST_SOURCES = $(liblcms2_threaded_la_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ETAGS = @ETAGS@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FILECMD = @FILECMD@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +JPEGICC_DEPLIBS = @JPEGICC_DEPLIBS@ +LCMS_LIB_DEPLIBS = @LCMS_LIB_DEPLIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBRARY_AGE = @LIBRARY_AGE@ +LIBRARY_CURRENT = @LIBRARY_CURRENT@ +LIBRARY_REVISION = @LIBRARY_REVISION@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_DEPS = @LIBTOOL_DEPS@ +LIB_JPEG = @LIB_JPEG@ +LIB_MATH = @LIB_MATH@ +LIB_PLUGINS = @LIB_PLUGINS@ +LIB_THREAD = @LIB_THREAD@ +LIB_TIFF = @LIB_TIFF@ +LIB_ZLIB = @LIB_ZLIB@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_CXX = @PTHREAD_CXX@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +TIFFICC_DEPLIBS = @TIFFICC_DEPLIBS@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__rm_f_notfound = @am__rm_f_notfound@ +am__tar = @am__tar@ +am__untar = @am__untar@ +am__xargs_n = @am__xargs_n@ +ax_pthread_config = @ax_pthread_config@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = ${prefix}/include +infodir = @infodir@ +inline = @inline@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +# Don't require all the GNU mandated files +AUTOMAKE_OPTIONS = 1.7 foreign + +# Shared libraries built in this directory +lib_LTLIBRARIES = liblcms2_threaded.la +AM_CPPFLAGS = -Ofast -I$(top_builddir)/include -I$(top_srcdir)/include -I$(srcdir)/../include -I$(builddir)/../include +liblcms2_threaded_la_LDFLAGS = -no-undefined \ + -version-info $(LIBRARY_CURRENT):$(LIBRARY_REVISION):$(LIBRARY_AGE) + +liblcms2_threaded_la_LIBADD = $(LCMS_LIB_DEPLIBS) $(top_builddir)/src/liblcms2.la +liblcms2_threaded_la_SOURCES = threaded_split.c threaded_core.c threaded_main.c threaded_scheduler.c threaded_internal.h +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign plugins/threaded/src/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign plugins/threaded/src/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +install-libLTLIBRARIES: $(lib_LTLIBRARIES) + @$(NORMAL_INSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ + } + +uninstall-libLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ + done + +clean-libLTLIBRARIES: + -$(am__rm_f) $(lib_LTLIBRARIES) + @list='$(lib_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + echo rm -f $${locs}; \ + $(am__rm_f) $${locs} + +liblcms2_threaded.la: $(liblcms2_threaded_la_OBJECTS) $(liblcms2_threaded_la_DEPENDENCIES) $(EXTRA_liblcms2_threaded_la_DEPENDENCIES) + $(AM_V_CCLD)$(liblcms2_threaded_la_LINK) -rpath $(libdir) $(liblcms2_threaded_la_OBJECTS) $(liblcms2_threaded_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/threaded_core.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/threaded_main.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/threaded_scheduler.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/threaded_split.Plo@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @: >>$@ + +am--depfiles: $(am__depfiles_remade) + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(libdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -$(am__rm_f) $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || $(am__rm_f) $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ + mostlyclean-am + +distclean: distclean-am + -rm -f ./$(DEPDIR)/threaded_core.Plo + -rm -f ./$(DEPDIR)/threaded_main.Plo + -rm -f ./$(DEPDIR)/threaded_scheduler.Plo + -rm -f ./$(DEPDIR)/threaded_split.Plo + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-libLTLIBRARIES + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f ./$(DEPDIR)/threaded_core.Plo + -rm -f ./$(DEPDIR)/threaded_main.Plo + -rm -f ./$(DEPDIR)/threaded_scheduler.Plo + -rm -f ./$(DEPDIR)/threaded_split.Plo + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-libLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ + clean-generic clean-libLTLIBRARIES clean-libtool cscopelist-am \ + ctags ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-libLTLIBRARIES install-man install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am uninstall-libLTLIBRARIES + +.PRECIOUS: Makefile + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: + +# Tell GNU make to disable its built-in pattern rules. +%:: %,v +%:: RCS/%,v +%:: RCS/% +%:: s.% +%:: SCCS/s.% diff --git a/local/recipes/libs/lcms2/source/plugins/threaded/src/lcms2_threaded.rc.in b/local/recipes/libs/lcms2/source/plugins/threaded/src/lcms2_threaded.rc.in new file mode 100644 index 0000000000..eb4c9d7c69 --- /dev/null +++ b/local/recipes/libs/lcms2/source/plugins/threaded/src/lcms2_threaded.rc.in @@ -0,0 +1,52 @@ +//--------------------------------------------------------------------------------- +// +// Little Color Management System, multithread extensions +// Copyright (c) 1998-2022 Marti Maria Saguer, all rights reserved +// +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +//--------------------------------------------------------------------------------- + +#include + +1 VERSIONINFO +FILEVERSION @LCMS2_VERSION_MAJOR@, @LCMS2_VERSION_MINOR@, @LCMS2_VERSION_MICRO@, 0 +PRODUCTVERSION @LCMS2_VERSION_MAJOR@, @LCMS2_VERSION_MINOR@, @LCMS2_VERSION_MICRO@, 0 +FILEFLAGSMASK 0x0L +#ifdef _DEBUG +FILEFLAGS VS_FF_DEBUG +#endif +FILEOS VOS_NT_WINDOWS32 +FILETYPE VFT_DLL +{ + BLOCK "StringFileInfo" + { + BLOCK "040904e4" + { + VALUE "CompanyName", "Marti Maria" + VALUE "FileDescription", "Multithread plugin" + VALUE "FileVersion", @LCMS2_VERSION@ + VALUE "InternalName", "lcms2_threaded" + VALUE "LegalCopyright", "Copyright (C) Marti Maria 2024, GPL-3.0-or-later" + VALUE "OriginalFilename", "lcms2_threaded.dll" + VALUE "ProductName", "LittleCMS color engine" + VALUE "ProductVersion", @LCMS2_VERSION@ + } + } + BLOCK "VarFileInfo" + { + VALUE "Translation", 0x409, 1252 + } +} diff --git a/local/recipes/libs/lcms2/source/plugins/threaded/src/meson.build b/local/recipes/libs/lcms2/source/plugins/threaded/src/meson.build new file mode 100644 index 0000000000..dd0f96dc2a --- /dev/null +++ b/local/recipes/libs/lcms2/source/plugins/threaded/src/meson.build @@ -0,0 +1,35 @@ +liblcms2_threaded_sources = files( + 'threaded_core.c', + 'threaded_main.c', + 'threaded_scheduler.c', + 'threaded_split.c', +) + +lcms2_threaded_incdir = include_directories('../include', '.') + +if host_machine.system() == 'windows' + lcms2_threaded_rc = configure_file( + input: 'lcms2_threaded.rc.in', + configuration: version_cfg, + output: 'lcms2_threaded.rc', + ) + + liblcms2_threaded_sources += win.compile_resources(lcms2_threaded_rc) +endif + +liblcms2_threaded = library( + 'lcms2_threaded', + liblcms2_threaded_sources, + include_directories: lcms2_threaded_incdir, + dependencies: [ liblcms2_dep, threads_dep ], + c_args: cargs, + version: library_version, + install: true, +) + +liblcms2_threaded_dep = declare_dependency( + link_with: liblcms2_threaded, + include_directories: lcms2_threaded_incdir, +) + +extra_libraries += liblcms2_threaded diff --git a/local/recipes/libs/lcms2/source/plugins/threaded/src/threaded_core.c b/local/recipes/libs/lcms2/source/plugins/threaded/src/threaded_core.c new file mode 100644 index 0000000000..c3d06aeb17 --- /dev/null +++ b/local/recipes/libs/lcms2/source/plugins/threaded/src/threaded_core.c @@ -0,0 +1,165 @@ +//--------------------------------------------------------------------------------- +// +// Little Color Management System, multithread extensions +// Copyright (c) 1998-2026 Marti Maria Saguer, all rights reserved +// +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +//--------------------------------------------------------------------------------- + +#include "threaded_internal.h" + +// This is the threading support. Unfortunately, it has to be platform-dependent because +// windows does not support pthreads. +#ifdef CMS_IS_WINDOWS_ + +#define WIN32_LEAN_AND_MEAN 1 +#include + +// To pass parameter to the thread +typedef struct +{ + _cmsTransform2Fn worker; + _cmsWorkSlice* param; + +} thread_adaptor_param; + + +// This is an adaptor to the native thread on windows +static +DWORD WINAPI thread_adaptor(LPVOID p) +{ + thread_adaptor_param* ap = (thread_adaptor_param*)p; + _cmsWorkSlice* s = ap->param; + + ap->worker(s->CMMcargo, s->InputBuffer, s->OutputBuffer, + s->PixelsPerLine, s->LineCount, s->Stride); + _cmsFree(0, p); + return 0; +} + +// This function creates a thread and executes it. The thread calls the worker function +// with the given parameters. +cmsHANDLE _cmsThrCreateWorker(cmsContext ContextID, _cmsTransform2Fn worker, _cmsWorkSlice* param) +{ + DWORD ThreadID; + thread_adaptor_param* p; + HANDLE handle; + + p = (thread_adaptor_param*)_cmsMalloc(0, sizeof(thread_adaptor_param)); + if (p == NULL) return NULL; + + p->worker = worker; + p->param = param; + + handle = CreateThread(NULL, 0, thread_adaptor, (LPVOID) p, 0, &ThreadID); + if (handle == NULL) + { + cmsSignalError(ContextID, cmsERROR_UNDEFINED, "Cannot create thread"); + } + + return (cmsHANDLE)handle; +} + +// Waits until given thread is ended +void _cmsThrJoinWorker(cmsContext ContextID, cmsHANDLE hWorker) +{ + if (WaitForSingleObject((HANDLE)hWorker, INFINITE) != WAIT_OBJECT_0) + { + cmsSignalError(ContextID, cmsERROR_UNDEFINED, "Cannot join thread"); + } +} + +// Returns the ideal number of threads the system can run +cmsInt32Number _cmsThrIdealThreadCount(void) +{ + SYSTEM_INFO sysinfo; + + GetSystemInfo(&sysinfo); + return sysinfo.dwNumberOfProcessors; //Returns the number of processors in the system. +} + +#else + +// Rest of the wide world +#include +#include + +// To pass parameter to the thread +typedef struct +{ + _cmsTransform2Fn worker; + _cmsWorkSlice* param; + +} thread_adaptor_param; + + +// This is the native thread on pthread +static +void* thread_adaptor(void* p) +{ + thread_adaptor_param* ap = (thread_adaptor_param*)p; + _cmsWorkSlice* s = ap->param; + + ap->worker(s->CMMcargo, s->InputBuffer, s->OutputBuffer, + s->PixelsPerLine, s->LineCount, s->Stride); + _cmsFree(0, p); + + return NULL; +} + +// This function creates a thread and executes it. The thread calls the worker function +// with the given parameters. +cmsHANDLE _cmsThrCreateWorker(cmsContext ContextID, _cmsTransform2Fn worker, _cmsWorkSlice* param) +{ + pthread_t threadId; + thread_adaptor_param* p; + + p = (thread_adaptor_param*)_cmsMalloc(0, sizeof(thread_adaptor_param)); + if (p == NULL) return NULL; + + p->worker = worker; + p->param = param; + + int err = pthread_create(&threadId, NULL, thread_adaptor, p); + if (err != 0) + { + cmsSignalError(ContextID, cmsERROR_UNDEFINED, "Cannot create thread [pthread error %d]", err); + return NULL; + } + else + return (cmsHANDLE) threadId; +} + +// Waits until given thread is ended +void _cmsThrJoinWorker(cmsContext ContextID, cmsHANDLE hWorker) +{ + int err = pthread_join((pthread_t)hWorker, NULL); + if (err != 0) + { + cmsSignalError(ContextID, cmsERROR_UNDEFINED, "Cannot join thread [pthread error %d]", err); + } +} + +cmsInt32Number _cmsThrIdealThreadCount(void) +{ + long cores = sysconf(_SC_NPROCESSORS_ONLN); + if (cores == -1L) + return 1; + else + return (cmsInt32Number)cores; +} + +#endif diff --git a/local/recipes/libs/lcms2/source/plugins/threaded/src/threaded_internal.h b/local/recipes/libs/lcms2/source/plugins/threaded/src/threaded_internal.h new file mode 100644 index 0000000000..3c0b2031f1 --- /dev/null +++ b/local/recipes/libs/lcms2/source/plugins/threaded/src/threaded_internal.h @@ -0,0 +1,79 @@ +//--------------------------------------------------------------------------------- +// +// Little Color Management System, multithreaded extensions +// Copyright (c) 1998-2026 Marti Maria Saguer, all rights reserved +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +//--------------------------------------------------------------------------------- + +#ifndef _THREADED_INTERNAL_H +#define _THREADED_INTERNAL_H + +#include "lcms2_threaded.h" + +// This plugin requires lcms 2.14 or greater +#define REQUIRED_LCMS_VERSION 2140 + +// Unused parameter warning suppression +#define UNUSED_PARAMETER(x) ((void)x) + +// For testbed +#define CMSCHECKPOINT CMSAPI + +// The specification for "inline" is section 6.7.4 of the C99 standard (ISO/IEC 9899:1999). +// unfortunately VisualC++ does not conform that +#if defined(_MSC_VER) || defined(__BORLANDC__) +# define cmsINLINE __inline +#else +# define cmsINLINE static inline +#endif + +// Holds all parameters for a threadable transform fragment +typedef struct { + + struct _cmstransform_struct* CMMcargo; + + const void* InputBuffer; + void* OutputBuffer; + + cmsUInt32Number PixelsPerLine; + cmsUInt32Number LineCount; + const cmsStride* Stride; + +} _cmsWorkSlice; + +// Count the number of threads needed for this job +cmsUInt32Number _cmsThrCountSlices(struct _cmstransform_struct* CMMcargo, cmsInt32Number MaxWorkers, + cmsUInt32Number PixelsPerLine, cmsUInt32Number LineCount, + cmsStride* Stride); + +// Split work following several expert rules +cmsBool _cmsThrSplitWork(const _cmsWorkSlice* master, cmsInt32Number nslices, _cmsWorkSlice slices[]); + +// Thread primitives +cmsHANDLE _cmsThrCreateWorker(cmsContext ContextID, _cmsTransform2Fn worker, _cmsWorkSlice* param); +void _cmsThrJoinWorker(cmsContext ContextID, cmsHANDLE hWorker); +cmsInt32Number _cmsThrIdealThreadCount(void); + +// The scheduler +void _cmsThrScheduler(struct _cmstransform_struct* CMMcargo, + const void* InputBuffer, + void* OutputBuffer, + cmsUInt32Number PixelsPerLine, + cmsUInt32Number LineCount, + const cmsStride* Stride); +#endif + + diff --git a/local/recipes/libs/lcms2/source/plugins/threaded/src/threaded_main.c b/local/recipes/libs/lcms2/source/plugins/threaded/src/threaded_main.c new file mode 100644 index 0000000000..b4e1a71fee --- /dev/null +++ b/local/recipes/libs/lcms2/source/plugins/threaded/src/threaded_main.c @@ -0,0 +1,43 @@ +//--------------------------------------------------------------------------------- +// +// Little Color Management System, fast floating point extensions +// Copyright (c) 1998-2026 Marti Maria Saguer, all rights reserved +// +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +//--------------------------------------------------------------------------------- + + +#include "threaded_internal.h" + +// The Plug-in entry point +static cmsPluginParalellization Plugin = { + + { cmsPluginMagicNumber, REQUIRED_LCMS_VERSION, cmsPluginParalellizationSig, NULL }, + + CMS_THREADED_GUESS_MAX_THREADS, + 0, + _cmsThrScheduler +}; + +// This is the main plug-in installer. +void* CMSEXPORT cmsThreadedExtensions(cmsInt32Number max_threads, cmsUInt32Number flags) +{ + Plugin.MaxWorkers = max_threads; + Plugin.WorkerFlags = flags; + + return (void*)&Plugin; +} + diff --git a/local/recipes/libs/lcms2/source/plugins/threaded/src/threaded_scheduler.c b/local/recipes/libs/lcms2/source/plugins/threaded/src/threaded_scheduler.c new file mode 100644 index 0000000000..4048b817f4 --- /dev/null +++ b/local/recipes/libs/lcms2/source/plugins/threaded/src/threaded_scheduler.c @@ -0,0 +1,108 @@ +//--------------------------------------------------------------------------------- +// +// Little Color Management System, multithreaded extensions +// Copyright (c) 1998-2026 Marti Maria Saguer, all rights reserved +// +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +//--------------------------------------------------------------------------------- + +#include "threaded_internal.h" + +// The scheduler is responsible to split the work in several portions in a way that each +// portion can be calculated by a different thread. All locking is already done by lcms +// mutexes, memory should not overlap. +void _cmsThrScheduler(struct _cmstransform_struct* CMMcargo, + const void* InputBuffer, + void* OutputBuffer, + cmsUInt32Number PixelsPerLine, + cmsUInt32Number LineCount, + const cmsStride* Stride) +{ + cmsContext ContextID = cmsGetTransformContextID(CMMcargo); + _cmsTransform2Fn worker = _cmsGetTransformWorker(CMMcargo); + cmsInt32Number MaxWorkers = _cmsGetTransformMaxWorkers(CMMcargo); + + // flags are not actually being used + // cmsUInt32Number flags = _cmsGetTransformWorkerFlags(CMMcargo); + + _cmsWorkSlice master; + _cmsWorkSlice* slices; + cmsStride FixedStride = *Stride; + cmsHANDLE* handles; + + // Count the number of threads needed for this job. MaxWorkers is the upper limit or -1 to auto + cmsUInt32Number nSlices = _cmsThrCountSlices(CMMcargo, MaxWorkers, PixelsPerLine, LineCount, &FixedStride); + + // Abort early if no threaded code + if (nSlices <= 1) { + + worker(CMMcargo, InputBuffer, OutputBuffer, PixelsPerLine, LineCount, Stride); + return; + } + + // Setup master thread + master.CMMcargo = CMMcargo; + master.InputBuffer = InputBuffer; + master.OutputBuffer = OutputBuffer; + master.PixelsPerLine = PixelsPerLine; + master.LineCount = LineCount; + master.Stride = &FixedStride; + + // Create memory for the slices + slices = (_cmsWorkSlice*)_cmsCalloc(ContextID, nSlices, sizeof(_cmsWorkSlice)); + handles = (cmsHANDLE*) _cmsCalloc(ContextID, nSlices, sizeof(cmsHANDLE)); + + if (slices == NULL || handles == NULL) + { + if (slices) _cmsFree(ContextID, slices); + if (handles) _cmsFree(ContextID, handles); + + // Out of memory in this case only can come from a corruption, but we do the work anyway + worker(CMMcargo, InputBuffer, OutputBuffer, PixelsPerLine, LineCount, Stride); + return; + } + + // All seems ok so far + if (_cmsThrSplitWork(&master, nSlices, slices)) + { + // Work is split. Create threads + cmsUInt32Number i; + + for (i = 1; i < nSlices; i++) + { + handles[i] = _cmsThrCreateWorker(ContextID, worker, &slices[i]); + } + + // Do our portion of work + worker(CMMcargo, slices[0].InputBuffer, slices[0].OutputBuffer, + slices[0].PixelsPerLine, slices[0].LineCount, slices[0].Stride); + + // Wait until all threads are finished + for (i = 1; i < nSlices; i++) + { + _cmsThrJoinWorker(ContextID, handles[i]); + } + } + else + { + // Not able to split the work, so don't thread + worker(CMMcargo, InputBuffer, OutputBuffer, PixelsPerLine, LineCount, Stride); + } + + _cmsFree(ContextID, slices); + _cmsFree(ContextID, handles); +} + diff --git a/local/recipes/libs/lcms2/source/plugins/threaded/src/threaded_split.c b/local/recipes/libs/lcms2/source/plugins/threaded/src/threaded_split.c new file mode 100644 index 0000000000..b06f85a99c --- /dev/null +++ b/local/recipes/libs/lcms2/source/plugins/threaded/src/threaded_split.c @@ -0,0 +1,216 @@ +//--------------------------------------------------------------------------------- +// +// Little Color Management System, fast floating point extensions +// Copyright (c) 1998-2026 Marti Maria Saguer, all rights reserved +// +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +//--------------------------------------------------------------------------------- + + +#include "threaded_internal.h" + + +// Returns true component size +cmsINLINE cmsUInt32Number ComponentSize(cmsUInt32Number format) +{ + cmsUInt32Number BytesPerComponent = T_BYTES(format); + + // For double, the T_BYTES field is zero + if (BytesPerComponent == 0) + BytesPerComponent = sizeof(cmsUInt64Number); + + return BytesPerComponent; +} + +// Returns bytes from one pixel to the next +cmsINLINE cmsUInt32Number PixelSpacing(cmsUInt32Number format) +{ + if (T_PLANAR(format)) + return ComponentSize(format); + else + return ComponentSize(format) * (T_CHANNELS(format) + T_EXTRA(format)); +} + +// macro is not portable +cmsINLINE cmsUInt32Number minimum(cmsUInt32Number a, cmsUInt32Number b) +{ + return a < b ? a : b; +} + + +// Memory of block depends of planar or chunky. If lines is 1, then the stride does not contain +// information and we have to calculate the size. If lines > 1, then we can take line size from stride. +// if planar, total memory is number of planes per plane stride. If chunky memory is number of lines per +// line size. If line size is zero, then it should be computed. +static +cmsUInt32Number MemSize(cmsUInt32Number format, + cmsUInt32Number PixelsPerLine, + cmsUInt32Number LineCount, + cmsUInt32Number* BytesPerLine, + cmsUInt32Number BytesPerPlane) +{ + if (T_PLANAR(format)) { + + if (*BytesPerLine == 0) { + + *BytesPerLine = ComponentSize(format) * PixelsPerLine; + } + + return (T_CHANNELS(format) + T_EXTRA(format)) * BytesPerPlane; + } + else + { + if (*BytesPerLine == 0) { + + *BytesPerLine = ComponentSize(format) * (T_CHANNELS(format) + T_EXTRA(format)) * PixelsPerLine; + } + + return LineCount * *BytesPerLine; + } +} + +// Compute how many workers to use. Repairs Stride if any missing member +cmsUInt32Number _cmsThrCountSlices(struct _cmstransform_struct* CMMcargo, cmsInt32Number MaxWorkers, + cmsUInt32Number PixelsPerLine, cmsUInt32Number LineCount, + cmsStride* Stride) +{ + cmsInt32Number MaxInputMem, MaxOutputMem; + cmsInt32Number WorkerCount; + + cmsInt32Number MaxCPUs = _cmsThrIdealThreadCount(); + + if (MaxWorkers == CMS_THREADED_GUESS_MAX_THREADS) { + MaxWorkers = MaxCPUs; + } + else + { + // We allow large number of threads, but this is not going to work well. Warn it. + if (MaxWorkers > MaxCPUs) { + cmsSignalError(NULL, cmsERROR_RANGE, + "Warning: too many threads for actual processor (CPUs=%d, asked=%d)", MaxCPUs, MaxWorkers); + } + } + + MaxInputMem = MemSize(cmsGetTransformInputFormat((cmsHTRANSFORM)CMMcargo), + PixelsPerLine, LineCount, &Stride->BytesPerLineIn, Stride->BytesPerPlaneIn); + + MaxOutputMem = MemSize(cmsGetTransformOutputFormat((cmsHTRANSFORM)CMMcargo), + PixelsPerLine, LineCount, &Stride->BytesPerLineOut, Stride->BytesPerPlaneOut); + + // Each thread takes 128K at least + WorkerCount = (MaxInputMem + MaxOutputMem) / (128 * 1024); + + if (WorkerCount < 1) + WorkerCount = 1; + else + if (WorkerCount > MaxWorkers) + WorkerCount = MaxWorkers; + + return WorkerCount; +} + +// Slice input, output for lines +static +void SlicePerLines(const _cmsWorkSlice* master, cmsInt32Number nslices, + cmsInt32Number LinesPerSlice, _cmsWorkSlice slices[]) +{ + cmsInt32Number i; + cmsInt32Number TotalLines = master ->LineCount; + + for (i = 0; i < nslices; i++) { + + const cmsUInt8Number* PtrInput = master->InputBuffer; + cmsUInt8Number* PtrOutput = master->OutputBuffer; + + cmsInt32Number lines = minimum(LinesPerSlice, TotalLines); + + memcpy(&slices[i], master, sizeof(_cmsWorkSlice)); + + slices[i].InputBuffer = PtrInput + i * LinesPerSlice * master->Stride->BytesPerLineIn; + slices[i].OutputBuffer = PtrOutput + i * LinesPerSlice * master->Stride->BytesPerLineOut; + + slices[i].LineCount = lines; + TotalLines -= lines; + } + + // Add left lines because rounding + if (nslices > 0) slices[nslices - 1].LineCount += TotalLines; +} + +// Per pixels on big blocks of one line +static +void SlicePerPixels(const _cmsWorkSlice* master, cmsInt32Number nslices, + cmsInt32Number PixelsPerSlice, _cmsWorkSlice slices[]) +{ + cmsInt32Number i; + cmsInt32Number TotalPixels = master->PixelsPerLine; // As this works on one line only + + cmsUInt32Number PixelSpacingIn = PixelSpacing(cmsGetTransformInputFormat((cmsHTRANSFORM)master->CMMcargo)); + cmsUInt32Number PixelSpacingOut = PixelSpacing(cmsGetTransformOutputFormat((cmsHTRANSFORM)master->CMMcargo)); + + for (i = 0; i < nslices; i++) { + + const cmsUInt8Number* PtrInput = master->InputBuffer; + cmsUInt8Number* PtrOutput = master->OutputBuffer; + + cmsInt32Number pixels = minimum(PixelsPerSlice, TotalPixels); + + memcpy(&slices[i], master, sizeof(_cmsWorkSlice)); + + slices[i].InputBuffer = PtrInput + i * PixelsPerSlice * PixelSpacingIn; + slices[i].OutputBuffer = PtrOutput + i * PixelsPerSlice * PixelSpacingOut; + slices[i].PixelsPerLine = pixels; + + TotalPixels -= pixels; + } + + // Add left pixels because rounding + if (nslices > 0) slices[nslices - 1].PixelsPerLine += TotalPixels; +} + + +// If multiline, assign a number of lines to each thread. This works on chunky and planar. Stride parameters +// are not changed. In the case of one line, stride chunky is not used and stride planar keeps same. +cmsBool _cmsThrSplitWork(const _cmsWorkSlice* master, cmsInt32Number nslices, _cmsWorkSlice slices[]) +{ + + // Check parameters + if (master->PixelsPerLine == 0 || + master->Stride->BytesPerLineIn == 0 || + master->Stride->BytesPerLineOut == 0) return FALSE; + + // Do the splitting depending on lines + if (master->LineCount <= 1) { + + cmsInt32Number PixelsPerWorker = master->PixelsPerLine / nslices; + + if (PixelsPerWorker <= 0) + return FALSE; + else + SlicePerPixels(master, nslices, PixelsPerWorker, slices); + } + else { + + cmsInt32Number LinesPerWorker = master->LineCount / nslices; + + if (LinesPerWorker <= 0) + return FALSE; + else + SlicePerLines(master, nslices, LinesPerWorker, slices); + } + + return TRUE; +} \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/plugins/threaded/testbed/Makefile.am b/local/recipes/libs/lcms2/source/plugins/threaded/testbed/Makefile.am new file mode 100644 index 0000000000..8ddd7cd188 --- /dev/null +++ b/local/recipes/libs/lcms2/source/plugins/threaded/testbed/Makefile.am @@ -0,0 +1,23 @@ +# +# Makefile for building threaded_testbed +# + +# Don't require all the GNU mandated files +AUTOMAKE_OPTIONS = 1.7 foreign + +AM_CPPFLAGS = -I$(builddir)/../include -I$(srcdir)/../include -I$(srcdir)/../src \ + -I$(top_builddir)/include + +check_PROGRAMS = threaded_testbed + +threaded_testbed_LDADD = $(builddir)/../src/liblcms2_threaded.la $(LCMS_LIB_DEPLIBS) +threaded_testbed_LDFLAGS = -static @LDFLAGS@ +threaded_testbed_SOURCES = threaded_testbed.c + +EXTRA_DIST = test0.icc test1.icc test2.icc test3.icc test5.icc + +check: + if [ "x$(srcdir)" != "x$(builddir)" ]; then \ + cp $(srcdir)/test?.icc . ; \ + fi + ./threaded_testbed diff --git a/local/recipes/libs/lcms2/source/plugins/threaded/testbed/Makefile.in b/local/recipes/libs/lcms2/source/plugins/threaded/testbed/Makefile.in new file mode 100644 index 0000000000..ed8de27ecb --- /dev/null +++ b/local/recipes/libs/lcms2/source/plugins/threaded/testbed/Makefile.in @@ -0,0 +1,657 @@ +# Makefile.in generated by automake 1.18.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2025 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# +# Makefile for building threaded_testbed +# +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +am__rm_f = rm -f $(am__rm_f_notfound) +am__rm_rf = rm -rf $(am__rm_f_notfound) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +check_PROGRAMS = threaded_testbed$(EXEEXT) +subdir = plugins/threaded/testbed +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_append_compile_flags.m4 \ + $(top_srcdir)/m4/ax_append_flag.m4 \ + $(top_srcdir)/m4/ax_check_compile_flag.m4 \ + $(top_srcdir)/m4/ax_gcc_func_attribute.m4 \ + $(top_srcdir)/m4/ax_pthread.m4 \ + $(top_srcdir)/m4/ax_require_defined.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am_threaded_testbed_OBJECTS = threaded_testbed.$(OBJEXT) +threaded_testbed_OBJECTS = $(am_threaded_testbed_OBJECTS) +am__DEPENDENCIES_1 = +threaded_testbed_DEPENDENCIES = \ + $(builddir)/../src/liblcms2_threaded.la $(am__DEPENDENCIES_1) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +threaded_testbed_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(threaded_testbed_LDFLAGS) $(LDFLAGS) \ + -o $@ +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = ./$(DEPDIR)/threaded_testbed.Po +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(threaded_testbed_SOURCES) +DIST_SOURCES = $(threaded_testbed_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ETAGS = @ETAGS@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FILECMD = @FILECMD@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +JPEGICC_DEPLIBS = @JPEGICC_DEPLIBS@ +LCMS_LIB_DEPLIBS = @LCMS_LIB_DEPLIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBRARY_AGE = @LIBRARY_AGE@ +LIBRARY_CURRENT = @LIBRARY_CURRENT@ +LIBRARY_REVISION = @LIBRARY_REVISION@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_DEPS = @LIBTOOL_DEPS@ +LIB_JPEG = @LIB_JPEG@ +LIB_MATH = @LIB_MATH@ +LIB_PLUGINS = @LIB_PLUGINS@ +LIB_THREAD = @LIB_THREAD@ +LIB_TIFF = @LIB_TIFF@ +LIB_ZLIB = @LIB_ZLIB@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_CXX = @PTHREAD_CXX@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +TIFFICC_DEPLIBS = @TIFFICC_DEPLIBS@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__rm_f_notfound = @am__rm_f_notfound@ +am__tar = @am__tar@ +am__untar = @am__untar@ +am__xargs_n = @am__xargs_n@ +ax_pthread_config = @ax_pthread_config@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +inline = @inline@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +# Don't require all the GNU mandated files +AUTOMAKE_OPTIONS = 1.7 foreign +AM_CPPFLAGS = -I$(builddir)/../include -I$(srcdir)/../include -I$(srcdir)/../src \ + -I$(top_builddir)/include + +threaded_testbed_LDADD = $(builddir)/../src/liblcms2_threaded.la $(LCMS_LIB_DEPLIBS) +threaded_testbed_LDFLAGS = -static @LDFLAGS@ +threaded_testbed_SOURCES = threaded_testbed.c +EXTRA_DIST = test0.icc test1.icc test2.icc test3.icc test5.icc +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign plugins/threaded/testbed/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign plugins/threaded/testbed/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-checkPROGRAMS: + $(am__rm_f) $(check_PROGRAMS) + test -z "$(EXEEXT)" || $(am__rm_f) $(check_PROGRAMS:$(EXEEXT)=) + +threaded_testbed$(EXEEXT): $(threaded_testbed_OBJECTS) $(threaded_testbed_DEPENDENCIES) $(EXTRA_threaded_testbed_DEPENDENCIES) + @rm -f threaded_testbed$(EXEEXT) + $(AM_V_CCLD)$(threaded_testbed_LINK) $(threaded_testbed_OBJECTS) $(threaded_testbed_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/threaded_testbed.Po@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @: >>$@ + +am--depfiles: $(am__depfiles_remade) + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -$(am__rm_f) $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || $(am__rm_f) $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ + mostlyclean-am + +distclean: distclean-am + -rm -f ./$(DEPDIR)/threaded_testbed.Po + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f ./$(DEPDIR)/threaded_testbed.Po + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: check-am install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ + clean-checkPROGRAMS clean-generic clean-libtool cscopelist-am \ + ctags ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +check: + if [ "x$(srcdir)" != "x$(builddir)" ]; then \ + cp $(srcdir)/test?.icc . ; \ + fi + ./threaded_testbed + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: + +# Tell GNU make to disable its built-in pattern rules. +%:: %,v +%:: RCS/%,v +%:: RCS/% +%:: s.% +%:: SCCS/s.% diff --git a/local/recipes/libs/lcms2/source/plugins/threaded/testbed/meson.build b/local/recipes/libs/lcms2/source/plugins/threaded/testbed/meson.build new file mode 100644 index 0000000000..a5121ed0d0 --- /dev/null +++ b/local/recipes/libs/lcms2/source/plugins/threaded/testbed/meson.build @@ -0,0 +1,16 @@ +threaded_testbed_sources = files( + 'threaded_testbed.c', +) + +threaded_testbed = executable( + 'threaded_testbed', + threaded_testbed_sources, + dependencies: [liblcms2_threaded_dep, liblcms2_dep], + c_args: cargs + ['-DPROFILES_DIR="@0@"'.format(profiles_dir / '')], +) + +test( + 'threaded_testbed', + threaded_testbed, + timeout: 600, +) diff --git a/local/recipes/libs/lcms2/source/plugins/threaded/testbed/threaded_testbed.c b/local/recipes/libs/lcms2/source/plugins/threaded/testbed/threaded_testbed.c new file mode 100644 index 0000000000..dafe17d10a --- /dev/null +++ b/local/recipes/libs/lcms2/source/plugins/threaded/testbed/threaded_testbed.c @@ -0,0 +1,888 @@ +//--------------------------------------------------------------------------------- +// +// Little Color Management System, multithreaded extensions +// Copyright (c) 1998-2026 Marti Maria Saguer, all rights reserved +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +//--------------------------------------------------------------------------------- + +#include "threaded_internal.h" + +#include +#include +#include + +// On Visual Studio, use debug CRT +#ifdef _MSC_VER +# include "crtdbg.h" +#define HAVE_TIMESPEC_GET 1 +#endif + +#ifndef PROFILES_DIR +#define PROFILES_DIR "../../test_profiles/" +#endif + + +#define FLAGS cmsFLAGS_NOOPTIMIZE + + +// A fast way to convert from/to 16 <-> 8 bits +#define FROM_8_TO_16(rgb) (cmsUInt16Number) ((((cmsUInt16Number) (rgb)) << 8)|(rgb)) +#define FROM_16_TO_8(rgb) (cmsUInt8Number) ((((rgb) * 65281 + 8388608) >> 24) & 0xFF) + +// Some pixel representations +typedef struct { cmsUInt8Number r, g, b; } Scanline_rgb8bits; +typedef struct { cmsUInt8Number r, g, b, a; } Scanline_rgba8bits; +typedef struct { cmsUInt8Number c, m, y, k; } Scanline_cmyk8bits; +typedef struct { cmsUInt16Number r, g, b; } Scanline_rgb16bits; +typedef struct { cmsUInt16Number r, g, b, a; } Scanline_rgba16bits; +typedef struct { cmsUInt16Number c, m, y, k; } Scanline_cmyk16bits; + + +static struct timespec start, finish; + +cmsINLINE void MeasureTimeStart(void) +{ +#if defined(HAVE_TIMESPEC_GET) + timespec_get(&start, TIME_UTC); +#else + clock_gettime(CLOCK_MONOTONIC, &start); +#endif +} + +cmsINLINE double MeasureTimeStop(void) +{ + double elapsed; + +#if defined(HAVE_TIMESPEC_GET) + timespec_get(&finish, TIME_UTC); +#else + clock_gettime(CLOCK_MONOTONIC, &finish); +#endif + + elapsed = ((double) finish.tv_sec - start.tv_sec); + elapsed += ((double) finish.tv_nsec - start.tv_nsec) / 1000000000.0; + return elapsed; +} + + + +// A flushed printf +static +void trace(const char* frm, ...) +{ + va_list args; + + va_start(args, frm); + vfprintf(stderr, frm, args); + fflush(stderr); + va_end(args); +} + + +// The callback function used by cmsSetLogErrorHandler() +static +void FatalErrorQuit(cmsContext ContextID, cmsUInt32Number ErrorCode, const char *Text) +{ + UNUSED_PARAMETER(ContextID); + UNUSED_PARAMETER(ErrorCode); + + trace("** Fatal error: %s\n", Text); + exit(1); +} + +// Rise an error and exit +static +void Fail(const char* frm, ...) +{ + char ReasonToFailBuffer[1024]; + va_list args; + + va_start(args, frm); + vsprintf(ReasonToFailBuffer, frm, args); + FatalErrorQuit(0, 0, ReasonToFailBuffer); + + // unreachable va_end(args); +} + + +// Creates a fake profile that only has a curve. Used in several places +static +cmsHPROFILE CreateCurves(void) +{ + cmsToneCurve* Gamma = cmsBuildGamma(0, 1.1); + cmsToneCurve* Transfer[3]; + cmsHPROFILE h; + + Transfer[0] = Transfer[1] = Transfer[2] = Gamma; + h = cmsCreateLinearizationDeviceLink(cmsSigRgbData, Transfer); + + cmsFreeToneCurve(Gamma); + + return h; +} + + +// -------------------------------------------------------------------------------------------------- +// A C C U R A C Y C H E C K S +// -------------------------------------------------------------------------------------------------- + + + +// Check change format feature +static +void CheckChangeFormat(void) +{ + cmsHPROFILE hsRGB, hLab; + cmsHTRANSFORM xform; + cmsUInt8Number rgb8[3] = { 10, 120, 40 }; + cmsUInt16Number rgb16[3] = { 10* 257, 120*257, 40*257 }; + cmsUInt16Number lab16_1[3], lab16_2[3]; + + trace("Checking change format feature..."); + + hsRGB = cmsCreate_sRGBProfile(); + hLab = cmsCreateLab4Profile(NULL); + + xform = cmsCreateTransform(hsRGB, TYPE_RGB_16, hLab, TYPE_Lab_16, INTENT_PERCEPTUAL, FLAGS); + + cmsCloseProfile(hsRGB); + cmsCloseProfile(hLab); + + cmsDoTransform(xform, rgb16, lab16_1, 1); + + cmsChangeBuffersFormat(xform, TYPE_RGB_8, TYPE_Lab_16); + + cmsDoTransform(xform, rgb8, lab16_2, 1); + cmsDeleteTransform(xform); + + if (memcmp(lab16_1, lab16_2, sizeof(lab16_1)) != 0) + Fail("Change format failed!"); + + trace("Ok\n"); + +} + +// Next test checks results of optimized 8 bits versus raw 8 bits. +static +void TryAllValues8bits(cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut, cmsInt32Number Intent) +{ + cmsContext Raw = cmsCreateContext(NULL, NULL); + cmsContext Plugin = cmsCreateContext(cmsThreadedExtensions(CMS_THREADED_GUESS_MAX_THREADS, 0), NULL); + + Scanline_rgba8bits* bufferIn; + Scanline_rgba8bits* bufferRawOut; + Scanline_rgba8bits* bufferPluginOut; + int r, g, b; + + int j; + cmsUInt32Number npixels = 256 * 256 * 256; + + cmsHTRANSFORM xformRaw = cmsCreateTransformTHR(Raw, hlcmsProfileIn, TYPE_RGBA_8, hlcmsProfileOut, TYPE_RGBA_8, Intent, FLAGS|cmsFLAGS_NOCACHE | cmsFLAGS_COPY_ALPHA); + cmsHTRANSFORM xformPlugin = cmsCreateTransformTHR(Plugin, hlcmsProfileIn, TYPE_RGBA_8, hlcmsProfileOut, TYPE_RGBA_8, Intent, FLAGS|cmsFLAGS_NOCACHE | cmsFLAGS_COPY_ALPHA); + + cmsCloseProfile(hlcmsProfileIn); + cmsCloseProfile(hlcmsProfileOut); + + if (xformRaw == NULL || xformPlugin == NULL) { + + Fail("NULL transforms on check float conversions"); + } + + // Again, no checking on mem alloc because this is just a test + bufferIn = (Scanline_rgba8bits*)malloc(npixels * sizeof(Scanline_rgba8bits)); + bufferRawOut = (Scanline_rgba8bits*)malloc(npixels * sizeof(Scanline_rgba8bits)); + bufferPluginOut = (Scanline_rgba8bits*)malloc(npixels * sizeof(Scanline_rgba8bits)); + + // Same input to both transforms + j = 0; + for (r = 0; r < 256; r++) + for (g = 0; g < 256; g++) + for (b = 0; b < 256; b++) { + + bufferIn[j].r = (cmsUInt8Number) r; + bufferIn[j].g = (cmsUInt8Number) g; + bufferIn[j].b = (cmsUInt8Number) b; + bufferIn[j].a = 0xff; + + j++; + } + + // Different transforms, different output buffers + cmsDoTransform(xformRaw, bufferIn, bufferRawOut, npixels); + cmsDoTransform(xformPlugin, bufferIn, bufferPluginOut, npixels); + + // Lets compare results + j = 0; + for (r = 0; r < 256; r++) + for (g = 0; g < 256; g++) + for (b = 0; b < 256; b++) { + + if (bufferRawOut[j].r != bufferPluginOut[j].r || + bufferRawOut[j].g != bufferPluginOut[j].g || + bufferRawOut[j].b != bufferPluginOut[j].b || + bufferRawOut[j].a != bufferPluginOut[j].a) + Fail( + "Conversion failed at [%x %x %x %x] (%x %x %x %x) != (%x %x %x %x)", + bufferIn[j].r, bufferIn[j].g, bufferIn[j].b, bufferIn[j].a, + bufferRawOut[j].r, bufferRawOut[j].g, bufferRawOut[j].b, bufferRawOut[j].a, + bufferPluginOut[j].r, bufferPluginOut[j].g, bufferPluginOut[j].b, bufferPluginOut[j].a); + + j++; + } + + free(bufferIn); free(bufferRawOut); + free(bufferPluginOut); + + cmsDeleteTransform(xformRaw); + cmsDeleteTransform(xformPlugin); + + cmsDeleteContext(Plugin); + cmsDeleteContext(Raw); +} + +static +void CheckAccuracy8Bits(void) +{ + + trace("Checking accuracy of 8 bits CLUT..."); + TryAllValues8bits(cmsOpenProfileFromFile(PROFILES_DIR "test5.icc", "r"), cmsOpenProfileFromFile(PROFILES_DIR "test3.icc", "r"), INTENT_PERCEPTUAL); + trace("OK\n"); +} + + +// Next test checks results of optimized 16 bits versus raw 16 bits. +static +void TryAllValues16bits(cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut, cmsInt32Number Intent) +{ + cmsContext Raw = cmsCreateContext(NULL, NULL); + cmsContext Plugin = cmsCreateContext(cmsThreadedExtensions(CMS_THREADED_GUESS_MAX_THREADS, 0), NULL); + + Scanline_rgba16bits* bufferIn; + Scanline_rgba16bits* bufferRawOut; + Scanline_rgba16bits* bufferPluginOut; + int r, g, b; + + int j; + cmsUInt32Number npixels = 256 * 256 * 256; + + cmsHTRANSFORM xformRaw = cmsCreateTransformTHR(Raw, hlcmsProfileIn, TYPE_RGBA_16, hlcmsProfileOut, TYPE_RGBA_16, Intent, FLAGS|cmsFLAGS_NOCACHE | cmsFLAGS_COPY_ALPHA); + cmsHTRANSFORM xformPlugin = cmsCreateTransformTHR(Plugin, hlcmsProfileIn, TYPE_RGBA_16, hlcmsProfileOut, TYPE_RGBA_16, Intent, FLAGS|cmsFLAGS_NOCACHE | cmsFLAGS_COPY_ALPHA); + + cmsCloseProfile(hlcmsProfileIn); + cmsCloseProfile(hlcmsProfileOut); + + if (xformRaw == NULL || xformPlugin == NULL) { + + Fail("NULL transforms on check float conversions"); + } + + // Again, no checking on mem alloc because this is just a test + bufferIn = (Scanline_rgba16bits*)malloc(npixels * sizeof(Scanline_rgba16bits)); + bufferRawOut = (Scanline_rgba16bits*)malloc(npixels * sizeof(Scanline_rgba16bits)); + bufferPluginOut = (Scanline_rgba16bits*)malloc(npixels * sizeof(Scanline_rgba16bits)); + + // Same input to both transforms + j = 0; + for (r = 0; r < 256; r++) + for (g = 0; g < 256; g++) + for (b = 0; b < 256; b++) { + + bufferIn[j].r = FROM_8_TO_16(r); + bufferIn[j].g = FROM_8_TO_16(g); + bufferIn[j].b = FROM_8_TO_16(b); + bufferIn[j].a = 0xffff; + + j++; + } + + // Different transforms, different output buffers + cmsDoTransform(xformRaw, bufferIn, bufferRawOut, npixels); + cmsDoTransform(xformPlugin, bufferIn, bufferPluginOut, npixels); + + // Lets compare results + j = 0; + for (r = 0; r < 256; r++) + for (g = 0; g < 256; g++) + for (b = 0; b < 256; b++) { + + if (bufferRawOut[j].r != bufferPluginOut[j].r || + bufferRawOut[j].g != bufferPluginOut[j].g || + bufferRawOut[j].b != bufferPluginOut[j].b || + bufferRawOut[j].a != bufferPluginOut[j].a) + Fail( + "Conversion failed at [%x %x %x %x] (%x %x %x %x) != (%x %x %x %x)", + bufferIn[j].r, bufferIn[j].g, bufferIn[j].b, bufferIn[j].a, + bufferRawOut[j].r, bufferRawOut[j].g, bufferRawOut[j].b, bufferRawOut[j].a, + bufferPluginOut[j].r, bufferPluginOut[j].g, bufferPluginOut[j].b, bufferPluginOut[j].a); + + j++; + } + + free(bufferIn); free(bufferRawOut); + free(bufferPluginOut); + + cmsDeleteTransform(xformRaw); + cmsDeleteTransform(xformPlugin); + + cmsDeleteContext(Plugin); + cmsDeleteContext(Raw); +} + +static +void CheckAccuracy16Bits(void) +{ + // CLUT should be as 16 bits or better + trace("Checking accuracy of 16 bits CLUT..."); + TryAllValues16bits(cmsOpenProfileFromFile(PROFILES_DIR "test5.icc", "r"), cmsOpenProfileFromFile(PROFILES_DIR "test3.icc", "r"), INTENT_PERCEPTUAL); + trace("OK\n"); +} + + +// -------------------------------------------------------------------------------------------------- +// P E R F O R M A N C E C H E C K S +// -------------------------------------------------------------------------------------------------- + + +static +cmsFloat64Number MPixSec(cmsFloat64Number seconds) +{ + return (256.0 * 256.0 * 256.0) / (1024.0*1024.0*seconds); +} + +typedef cmsFloat64Number(*perf_fn)(cmsContext ct, cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut); + + +static +void PerformanceHeader(void) +{ + trace(" MPixel/sec. MByte/sec.\n"); +} + + +static +cmsHPROFILE loadProfile(const char* name) +{ + if (*name == '*') + { + if (strcmp(name, "*lab") == 0) + { + return cmsCreateLab4Profile(NULL); + } + else + if (strcmp(name, "*xyz") == 0) + { + return cmsCreateXYZProfile(); + } + else + if (strcmp(name, "*curves") == 0) + { + return CreateCurves(); + } + else + Fail("Unknown builtin '%s'", name); + + } + + return cmsOpenProfileFromFile(name, "r"); +} + + +static +cmsFloat64Number Performance(const char* Title, perf_fn fn, cmsContext ct, const char* inICC, const char* outICC, size_t sz, cmsFloat64Number prev) +{ + cmsHPROFILE hlcmsProfileIn = loadProfile(inICC); + cmsHPROFILE hlcmsProfileOut = loadProfile(outICC); + + cmsFloat64Number n = fn(ct, hlcmsProfileIn, hlcmsProfileOut); + + trace("%-30s: ", Title); fflush(stdout); + trace("%-12.2f %-12.2f", n, n * sz); + + if (prev > 0.0) { + + cmsFloat64Number imp = n / prev; + if (imp > 1) + trace(" (x %-2.1f)", imp); + } + + trace("\n"); fflush(stdout); + return n; +} + + +static +void ComparativeCt(cmsContext ct1, cmsContext ct2, const char* Title, perf_fn fn1, perf_fn fn2, const char* inICC, const char* outICC) +{ + cmsHPROFILE hlcmsProfileIn; + cmsHPROFILE hlcmsProfileOut; + + if (inICC == NULL) + hlcmsProfileIn = CreateCurves(); + else + hlcmsProfileIn = cmsOpenProfileFromFile(inICC, "r"); + + if (outICC == NULL) + hlcmsProfileOut = CreateCurves(); + else + hlcmsProfileOut = cmsOpenProfileFromFile(outICC, "r"); + + + cmsFloat64Number n1 = fn1(ct1, hlcmsProfileIn, hlcmsProfileOut); + + if (inICC == NULL) + hlcmsProfileIn = CreateCurves(); + else + hlcmsProfileIn = cmsOpenProfileFromFile(inICC, "r"); + + if (outICC == NULL) + hlcmsProfileOut = CreateCurves(); + else + hlcmsProfileOut = cmsOpenProfileFromFile(outICC, "r"); + + cmsFloat64Number n2 = fn2(ct2, hlcmsProfileIn, hlcmsProfileOut); + + + trace("%-30s: ", Title); fflush(stdout); + trace("%-12.2f %-12.2f\n", n1, n2); +} + +static +void Comparative(const char* Title, perf_fn fn1, perf_fn fn2, const char* inICC, const char* outICC) +{ + ComparativeCt(0, 0, Title, fn1, fn2, inICC, outICC); +} + +// The worst case is used, no cache and all rgb combinations +static +cmsFloat64Number SpeedTest8bitsRGB(cmsContext ct, cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut) +{ + cmsInt32Number r, g, b, j; + cmsFloat64Number diff; + cmsHTRANSFORM hlcmsxform; + Scanline_rgb8bits* In; + cmsUInt32Number Mb; + + if (hlcmsProfileIn == NULL || hlcmsProfileOut == NULL) + Fail("Unable to open profiles"); + + hlcmsxform = cmsCreateTransformTHR(ct, hlcmsProfileIn, TYPE_RGB_8, hlcmsProfileOut, TYPE_RGB_8, INTENT_PERCEPTUAL, FLAGS|cmsFLAGS_NOCACHE); + cmsCloseProfile(hlcmsProfileIn); + cmsCloseProfile(hlcmsProfileOut); + + Mb = 256 * 256 * 256 * sizeof(Scanline_rgb8bits); + In = (Scanline_rgb8bits*)malloc(Mb); + + j = 0; + for (r = 0; r < 256; r++) + for (g = 0; g < 256; g++) + for (b = 0; b < 256; b++) { + + In[j].r = (cmsUInt8Number)r; + In[j].g = (cmsUInt8Number)g; + In[j].b = (cmsUInt8Number)b; + + j++; + } + + MeasureTimeStart(); + + cmsDoTransform(hlcmsxform, In, In, 256 * 256 * 256); + + diff = MeasureTimeStop(); + free(In); + + cmsDeleteTransform(hlcmsxform); + + return MPixSec(diff); +} + +static +cmsFloat64Number SpeedTest8bitsRGBA(cmsContext ct, cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut) +{ + cmsInt32Number r, g, b, j; + cmsFloat64Number diff; + cmsHTRANSFORM hlcmsxform; + Scanline_rgba8bits* In; + cmsUInt32Number Mb; + + if (hlcmsProfileIn == NULL || hlcmsProfileOut == NULL) + Fail("Unable to open profiles"); + + hlcmsxform = cmsCreateTransformTHR(ct, hlcmsProfileIn, TYPE_RGBA_8, hlcmsProfileOut, TYPE_RGBA_8, INTENT_PERCEPTUAL, FLAGS|cmsFLAGS_NOCACHE); + cmsCloseProfile(hlcmsProfileIn); + cmsCloseProfile(hlcmsProfileOut); + + Mb = 256 * 256 * 256 * sizeof(Scanline_rgba8bits); + In = (Scanline_rgba8bits*)malloc(Mb); + + j = 0; + for (r = 0; r < 256; r++) + for (g = 0; g < 256; g++) + for (b = 0; b < 256; b++) { + + In[j].r = (cmsUInt8Number)r; + In[j].g = (cmsUInt8Number)g; + In[j].b = (cmsUInt8Number)b; + In[j].a = 0; + + j++; + } + + MeasureTimeStart(); + + cmsDoTransform(hlcmsxform, In, In, 256 * 256 * 256); + + diff = MeasureTimeStop(); + free(In); + + cmsDeleteTransform(hlcmsxform); + return MPixSec(diff); + +} + + +// The worst case is used, no cache and all rgb combinations +static +cmsFloat64Number SpeedTest16bitsRGB(cmsContext ct, cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut) +{ + cmsInt32Number r, g, b, j; + cmsFloat64Number diff; + cmsHTRANSFORM hlcmsxform; + Scanline_rgb16bits *In; + cmsUInt32Number Mb; + + if (hlcmsProfileIn == NULL || hlcmsProfileOut == NULL) + Fail("Unable to open profiles"); + + hlcmsxform = cmsCreateTransformTHR(ct, hlcmsProfileIn, TYPE_RGB_16, hlcmsProfileOut, TYPE_RGB_16, INTENT_PERCEPTUAL, FLAGS | cmsFLAGS_NOCACHE); + cmsCloseProfile(hlcmsProfileIn); + cmsCloseProfile(hlcmsProfileOut); + + Mb = 256 * 256 * 256 * sizeof(Scanline_rgb16bits); + In = (Scanline_rgb16bits*)malloc(Mb); + + j = 0; + for (r = 0; r < 256; r++) + for (g = 0; g < 256; g++) + for (b = 0; b < 256; b++) { + + In[j].r = (cmsUInt16Number)FROM_8_TO_16(r); + In[j].g = (cmsUInt16Number)FROM_8_TO_16(g); + In[j].b = (cmsUInt16Number)FROM_8_TO_16(b); + + j++; + } + + MeasureTimeStart(); + + cmsDoTransform(hlcmsxform, In, In, 256 * 256 * 256); + + diff = MeasureTimeStop(); + free(In); + + cmsDeleteTransform(hlcmsxform); + + return MPixSec(diff); +} + +static +cmsFloat64Number SpeedTest16bitsCMYK(cmsContext ct, cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut) +{ + + cmsInt32Number r, g, b, j; + cmsFloat64Number diff; + cmsHTRANSFORM hlcmsxform; + Scanline_cmyk16bits* In; + cmsUInt32Number Mb; + + if (hlcmsProfileIn == NULL || hlcmsProfileOut == NULL) + Fail("Unable to open profiles"); + + hlcmsxform = cmsCreateTransformTHR(ct, hlcmsProfileIn, TYPE_CMYK_16, hlcmsProfileOut, TYPE_CMYK_16, INTENT_PERCEPTUAL, FLAGS | cmsFLAGS_NOCACHE); + cmsCloseProfile(hlcmsProfileIn); + cmsCloseProfile(hlcmsProfileOut); + + Mb = 256 * 256 * 256 * sizeof(Scanline_cmyk16bits); + In = (Scanline_cmyk16bits*)malloc(Mb); + + j = 0; + for (r = 0; r < 256; r++) + for (g = 0; g < 256; g++) + for (b = 0; b < 256; b++) { + + In[j].c = (cmsUInt16Number)r; + In[j].m = (cmsUInt16Number)g; + In[j].y = (cmsUInt16Number)b; + In[j].k = (cmsUInt16Number)r; + + j++; + } + + MeasureTimeStart(); + + cmsDoTransform(hlcmsxform, In, In, 256 * 256 * 256); + + diff = MeasureTimeStop(); + free(In); + + cmsDeleteTransform(hlcmsxform); + return MPixSec(diff); +} + + +static +void SpeedTest8(void) +{ + cmsContext noPlugin = cmsCreateContext(0, 0); + + cmsFloat64Number t[10]; + + trace("\n\n"); + trace("P E R F O R M A N C E T E S T S 8 B I T S (D E F A U L T)\n"); + trace("==============================================================\n\n"); + fflush(stdout); + + PerformanceHeader(); + t[0] = Performance("8 bits on CLUT profiles ", SpeedTest8bitsRGB, noPlugin, PROFILES_DIR "test5.icc", PROFILES_DIR "test3.icc", sizeof(Scanline_rgb8bits), 0); + t[1] = Performance("8 bits on Matrix-Shaper ", SpeedTest8bitsRGB, noPlugin, PROFILES_DIR "test5.icc", PROFILES_DIR "test0.icc", sizeof(Scanline_rgb8bits), 0); + t[2] = Performance("8 bits on same MatrixSh ", SpeedTest8bitsRGB, noPlugin, PROFILES_DIR "test0.icc", PROFILES_DIR "test0.icc", sizeof(Scanline_rgb8bits), 0); + t[3] = Performance("8 bits on curves ", SpeedTest8bitsRGB, noPlugin, "*curves", "*curves", sizeof(Scanline_rgb8bits), 0); + + // Note that context 0 has the plug-in installed + + trace("\n\n"); + trace("P E R F O R M A N C E T E S T S 8 B I T S (P L U G I N)\n"); + trace("===========================================================\n\n"); + fflush(stdout); + + PerformanceHeader(); + Performance("8 bits on CLUT profiles ", SpeedTest8bitsRGB, 0, PROFILES_DIR "test5.icc", PROFILES_DIR "test3.icc", sizeof(Scanline_rgb8bits), t[0]); + Performance("8 bits on Matrix-Shaper ", SpeedTest8bitsRGB, 0, PROFILES_DIR "test5.icc", PROFILES_DIR "test0.icc", sizeof(Scanline_rgb8bits), t[1]); + Performance("8 bits on same MatrixSh ", SpeedTest8bitsRGB, 0, PROFILES_DIR "test0.icc", PROFILES_DIR "test0.icc", sizeof(Scanline_rgb8bits), t[2]); + Performance("8 bits on curves ", SpeedTest8bitsRGB, 0, "*curves", "*curves", sizeof(Scanline_rgb8bits), t[3]); + + cmsDeleteContext(noPlugin); +} + +static +void SpeedTest16(void) +{ + cmsContext noPlugin = cmsCreateContext(0, 0); + + cmsFloat64Number t[10]; + + trace("\n\n"); + trace("P E R F O R M A N C E T E S T S 1 6 B I T S (D E F A U L T)\n"); + trace("=================================================================\n\n"); + + PerformanceHeader(); + t[0] = Performance("16 bits on CLUT profiles ", SpeedTest16bitsRGB, noPlugin, PROFILES_DIR "test5.icc", PROFILES_DIR "test3.icc", sizeof(Scanline_rgb16bits), 0); + t[1] = Performance("16 bits on Matrix-Shaper profiles", SpeedTest16bitsRGB, noPlugin, PROFILES_DIR "test5.icc", PROFILES_DIR "test0.icc", sizeof(Scanline_rgb16bits), 0); + t[2] = Performance("16 bits on same Matrix-Shaper ", SpeedTest16bitsRGB, noPlugin, PROFILES_DIR "test0.icc", PROFILES_DIR "test0.icc", sizeof(Scanline_rgb16bits), 0); + t[3] = Performance("16 bits on curves ", SpeedTest16bitsRGB, noPlugin, "*curves", "*curves", sizeof(Scanline_rgb16bits), 0); + t[4] = Performance("16 bits on CMYK CLUT profiles ", SpeedTest16bitsCMYK, noPlugin, PROFILES_DIR "test1.icc", PROFILES_DIR "test2.icc", sizeof(Scanline_cmyk16bits), 0); + + trace("\n\n"); + trace("P E R F O R M A N C E T E S T S 1 6 B I T S (P L U G I N)\n"); + trace("===============================================================\n\n"); + + PerformanceHeader(); + Performance("16 bits on CLUT profiles ", SpeedTest16bitsRGB, 0, PROFILES_DIR "test5.icc", PROFILES_DIR "test3.icc", sizeof(Scanline_rgb16bits), t[0]); + Performance("16 bits on Matrix-Shaper profiles", SpeedTest16bitsRGB, 0, PROFILES_DIR "test5.icc", PROFILES_DIR "test0.icc", sizeof(Scanline_rgb16bits), t[1]); + Performance("16 bits on same Matrix-Shaper ", SpeedTest16bitsRGB, 0, PROFILES_DIR "test0.icc", PROFILES_DIR "test0.icc", sizeof(Scanline_rgb16bits), t[2]); + Performance("16 bits on curves ", SpeedTest16bitsRGB, 0, "*curves", "*curves", sizeof(Scanline_rgb16bits), t[3]); + Performance("16 bits on CMYK CLUT profiles ", SpeedTest16bitsCMYK, 0, PROFILES_DIR "test1.icc", PROFILES_DIR "test2.icc", sizeof(Scanline_cmyk16bits), t[4]); + + cmsDeleteContext(noPlugin); +} + + + +typedef struct +{ + Scanline_rgba8bits pixels[256][256]; + cmsUInt8Number padding[4]; + +} padded_line; + +typedef struct +{ + padded_line line[256]; + +} big_bitmap; + + +static +cmsFloat64Number SpeedTest8bitDoTransform(cmsContext ct, cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut) +{ + cmsInt32Number r, g, b, j; + cmsFloat64Number diff; + cmsHTRANSFORM hlcmsxform; + big_bitmap* In; + big_bitmap* Out; + cmsUInt32Number Mb; + + if (hlcmsProfileIn == NULL || hlcmsProfileOut == NULL) + Fail("Unable to open profiles"); + + hlcmsxform = cmsCreateTransformTHR(ct, hlcmsProfileIn, TYPE_RGBA_8, hlcmsProfileOut, TYPE_RGBA_8, INTENT_PERCEPTUAL, FLAGS | cmsFLAGS_NOCACHE); + cmsCloseProfile(hlcmsProfileIn); + cmsCloseProfile(hlcmsProfileOut); + + + // Our test bitmap is 256 x 256 padded lines + Mb = sizeof(big_bitmap); + + In = (big_bitmap*)malloc(Mb); + Out = (big_bitmap*)malloc(Mb); + + for (r = 0; r < 256; r++) + for (g = 0; g < 256; g++) + for (b = 0; b < 256; b++) { + + In->line[r].pixels[g][b].r = (cmsUInt8Number)r; + In->line[r].pixels[g][b].g = (cmsUInt8Number)g; + In->line[r].pixels[g][b].b = (cmsUInt8Number)b; + In->line[r].pixels[g][b].a = 0; + } + + MeasureTimeStart(); + + for (j = 0; j < 256; j++) { + + cmsDoTransform(hlcmsxform, In->line[j].pixels, Out->line[j].pixels, 256 * 256); + } + + diff = MeasureTimeStop(); + free(In); free(Out); + + cmsDeleteTransform(hlcmsxform); + return MPixSec(diff); + +} + + +static +cmsFloat64Number SpeedTest8bitLineStride(cmsContext ct, cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut) +{ + cmsInt32Number r, g, b; + cmsFloat64Number diff; + cmsHTRANSFORM hlcmsxform; + big_bitmap* In; + big_bitmap* Out; + cmsUInt32Number Mb; + + if (hlcmsProfileIn == NULL || hlcmsProfileOut == NULL) + Fail("Unable to open profiles"); + + hlcmsxform = cmsCreateTransformTHR(ct, hlcmsProfileIn, TYPE_RGBA_8, hlcmsProfileOut, TYPE_RGBA_8, INTENT_PERCEPTUAL, FLAGS | cmsFLAGS_NOCACHE); + cmsCloseProfile(hlcmsProfileIn); + cmsCloseProfile(hlcmsProfileOut); + + + // Our test bitmap is 256 x 256 padded lines + Mb = sizeof(big_bitmap); + + In = (big_bitmap*)malloc(Mb); + Out = (big_bitmap*)malloc(Mb); + + for (r = 0; r < 256; r++) + for (g = 0; g < 256; g++) + for (b = 0; b < 256; b++) { + + In->line[r].pixels[g][b].r = (cmsUInt8Number)r; + In->line[r].pixels[g][b].g = (cmsUInt8Number)g; + In->line[r].pixels[g][b].b = (cmsUInt8Number)b; + In->line[r].pixels[g][b].a = 0; + } + + MeasureTimeStart(); + + cmsDoTransformLineStride(hlcmsxform, In, Out, 256 * 256, 256, sizeof(padded_line), sizeof(padded_line), 0, 0); + + diff = MeasureTimeStop(); + free(In); free(Out); + + cmsDeleteTransform(hlcmsxform); + return MPixSec(diff); + +} + +static +void ComparativeLineStride8bits(void) +{ + cmsContext NoPlugin, Plugin; + + trace("\n\n"); + trace("C O M P A R A T I V E cmsDoTransform() vs. cmsDoTransformLineStride()\n"); + trace(" values given in MegaPixels per second.\n"); + trace("====================================================================\n"); + + fflush(stdout); + + NoPlugin = cmsCreateContext(NULL, NULL); + Plugin = cmsCreateContext(cmsThreadedExtensions(CMS_THREADED_GUESS_MAX_THREADS, 0), NULL); + + ComparativeCt(NoPlugin, Plugin, "CLUT profiles ", SpeedTest8bitDoTransform, SpeedTest8bitLineStride, PROFILES_DIR "test5.icc", PROFILES_DIR "test3.icc"); + ComparativeCt(NoPlugin, Plugin, "CLUT 16 bits ", SpeedTest16bitsRGB, SpeedTest16bitsRGB, PROFILES_DIR "test5.icc", PROFILES_DIR "test3.icc"); + ComparativeCt(NoPlugin, Plugin, "Matrix-Shaper ", SpeedTest8bitDoTransform, SpeedTest8bitLineStride, PROFILES_DIR "test5.icc", PROFILES_DIR "test0.icc"); + ComparativeCt(NoPlugin, Plugin, "same MatrixSh ", SpeedTest8bitDoTransform, SpeedTest8bitLineStride, PROFILES_DIR "test0.icc", PROFILES_DIR "test0.icc"); + ComparativeCt(NoPlugin, Plugin, "curves ", SpeedTest8bitDoTransform, SpeedTest8bitLineStride, NULL, NULL); + + cmsDeleteContext(Plugin); + cmsDeleteContext(NoPlugin); +} + + + +// The harness test +int main() +{ +#ifdef _MSC_VER + _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); +#endif + + trace("Multithreaded extensions testbed - 1.1\n"); + trace("Copyright (c) 1998-2026 Marti Maria Saguer, all rights reserved\n"); + + trace("\nInstalling error logger ... "); + cmsSetLogErrorHandler(FatalErrorQuit); + trace("done.\n"); + + trace("Installing plug-in ... "); + cmsPlugin(cmsThreadedExtensions(CMS_THREADED_GUESS_MAX_THREADS, 0)); + trace("done.\n\n"); + + // Change format + CheckChangeFormat(); + + // Accuracy + CheckAccuracy8Bits(); + CheckAccuracy16Bits(); + + // Check speed + SpeedTest8(); + SpeedTest16(); + ComparativeLineStride8bits(); + + cmsUnregisterPlugins(); + + trace("\nAll tests passed OK\n"); + return 0; +} + + + diff --git a/local/recipes/libs/lcms2/source/src/Makefile.am b/local/recipes/libs/lcms2/source/src/Makefile.am new file mode 100644 index 0000000000..227d79d823 --- /dev/null +++ b/local/recipes/libs/lcms2/source/src/Makefile.am @@ -0,0 +1,31 @@ +# +# Makefile for building lcms 2 library +# + +# Don't require all the GNU mandated files +AUTOMAKE_OPTIONS = 1.7 foreign + +# CFLAGS = -pedantic -Wall -std=c99 -O3 + +includedir = ${prefix}/include + +# Shared libraries built in this directory +lib_LTLIBRARIES = liblcms2.la + +LIBRARY_CURRENT = @LIBRARY_CURRENT@ +LIBRARY_REVISION = @LIBRARY_REVISION@ +LIBRARY_AGE = @LIBRARY_AGE@ + +AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include + +liblcms2_la_LDFLAGS = -no-undefined \ + -version-info $(LIBRARY_CURRENT):$(LIBRARY_REVISION):$(LIBRARY_AGE) + +liblcms2_la_LIBADD = $(LCMS_LIB_DEPLIBS) + +liblcms2_la_SOURCES = \ + cmscnvrt.c cmserr.c cmsgamma.c cmsgmt.c cmsintrp.c cmsio0.c cmsio1.c cmslut.c \ + cmsplugin.c cmssm.c cmsmd5.c cmsmtrx.c cmspack.c cmspcs.c cmswtpnt.c cmsxform.c \ + cmssamp.c cmsnamed.c cmscam02.c cmsvirt.c cmstypes.c cmscgats.c cmsps2.c cmsopt.c \ + cmshalf.c cmsalpha.c lcms2_internal.h + diff --git a/local/recipes/libs/lcms2/source/src/Makefile.in b/local/recipes/libs/lcms2/source/src/Makefile.in new file mode 100644 index 0000000000..429b7e5826 --- /dev/null +++ b/local/recipes/libs/lcms2/source/src/Makefile.in @@ -0,0 +1,809 @@ +# Makefile.in generated by automake 1.18.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2025 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# +# Makefile for building lcms 2 library +# + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +am__rm_f = rm -f $(am__rm_f_notfound) +am__rm_rf = rm -rf $(am__rm_f_notfound) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = src +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_append_compile_flags.m4 \ + $(top_srcdir)/m4/ax_append_flag.m4 \ + $(top_srcdir)/m4/ax_check_compile_flag.m4 \ + $(top_srcdir)/m4/ax_gcc_func_attribute.m4 \ + $(top_srcdir)/m4/ax_pthread.m4 \ + $(top_srcdir)/m4/ax_require_defined.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && echo $$files | $(am__xargs_n) 40 $(am__rm_f); }; \ + } +am__installdirs = "$(DESTDIR)$(libdir)" +LTLIBRARIES = $(lib_LTLIBRARIES) +am__DEPENDENCIES_1 = +liblcms2_la_DEPENDENCIES = $(am__DEPENDENCIES_1) +am_liblcms2_la_OBJECTS = cmscnvrt.lo cmserr.lo cmsgamma.lo cmsgmt.lo \ + cmsintrp.lo cmsio0.lo cmsio1.lo cmslut.lo cmsplugin.lo \ + cmssm.lo cmsmd5.lo cmsmtrx.lo cmspack.lo cmspcs.lo cmswtpnt.lo \ + cmsxform.lo cmssamp.lo cmsnamed.lo cmscam02.lo cmsvirt.lo \ + cmstypes.lo cmscgats.lo cmsps2.lo cmsopt.lo cmshalf.lo \ + cmsalpha.lo +liblcms2_la_OBJECTS = $(am_liblcms2_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +liblcms2_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(liblcms2_la_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = ./$(DEPDIR)/cmsalpha.Plo \ + ./$(DEPDIR)/cmscam02.Plo ./$(DEPDIR)/cmscgats.Plo \ + ./$(DEPDIR)/cmscnvrt.Plo ./$(DEPDIR)/cmserr.Plo \ + ./$(DEPDIR)/cmsgamma.Plo ./$(DEPDIR)/cmsgmt.Plo \ + ./$(DEPDIR)/cmshalf.Plo ./$(DEPDIR)/cmsintrp.Plo \ + ./$(DEPDIR)/cmsio0.Plo ./$(DEPDIR)/cmsio1.Plo \ + ./$(DEPDIR)/cmslut.Plo ./$(DEPDIR)/cmsmd5.Plo \ + ./$(DEPDIR)/cmsmtrx.Plo ./$(DEPDIR)/cmsnamed.Plo \ + ./$(DEPDIR)/cmsopt.Plo ./$(DEPDIR)/cmspack.Plo \ + ./$(DEPDIR)/cmspcs.Plo ./$(DEPDIR)/cmsplugin.Plo \ + ./$(DEPDIR)/cmsps2.Plo ./$(DEPDIR)/cmssamp.Plo \ + ./$(DEPDIR)/cmssm.Plo ./$(DEPDIR)/cmstypes.Plo \ + ./$(DEPDIR)/cmsvirt.Plo ./$(DEPDIR)/cmswtpnt.Plo \ + ./$(DEPDIR)/cmsxform.Plo +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(liblcms2_la_SOURCES) +DIST_SOURCES = $(liblcms2_la_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ETAGS = @ETAGS@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FILECMD = @FILECMD@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +JPEGICC_DEPLIBS = @JPEGICC_DEPLIBS@ +LCMS_LIB_DEPLIBS = @LCMS_LIB_DEPLIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBRARY_AGE = @LIBRARY_AGE@ +LIBRARY_CURRENT = @LIBRARY_CURRENT@ +LIBRARY_REVISION = @LIBRARY_REVISION@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_DEPS = @LIBTOOL_DEPS@ +LIB_JPEG = @LIB_JPEG@ +LIB_MATH = @LIB_MATH@ +LIB_PLUGINS = @LIB_PLUGINS@ +LIB_THREAD = @LIB_THREAD@ +LIB_TIFF = @LIB_TIFF@ +LIB_ZLIB = @LIB_ZLIB@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_CXX = @PTHREAD_CXX@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +TIFFICC_DEPLIBS = @TIFFICC_DEPLIBS@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__rm_f_notfound = @am__rm_f_notfound@ +am__tar = @am__tar@ +am__untar = @am__untar@ +am__xargs_n = @am__xargs_n@ +ax_pthread_config = @ax_pthread_config@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ + +# CFLAGS = -pedantic -Wall -std=c99 -O3 +includedir = ${prefix}/include +infodir = @infodir@ +inline = @inline@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +# Don't require all the GNU mandated files +AUTOMAKE_OPTIONS = 1.7 foreign + +# Shared libraries built in this directory +lib_LTLIBRARIES = liblcms2.la +AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include +liblcms2_la_LDFLAGS = -no-undefined \ + -version-info $(LIBRARY_CURRENT):$(LIBRARY_REVISION):$(LIBRARY_AGE) + +liblcms2_la_LIBADD = $(LCMS_LIB_DEPLIBS) +liblcms2_la_SOURCES = \ + cmscnvrt.c cmserr.c cmsgamma.c cmsgmt.c cmsintrp.c cmsio0.c cmsio1.c cmslut.c \ + cmsplugin.c cmssm.c cmsmd5.c cmsmtrx.c cmspack.c cmspcs.c cmswtpnt.c cmsxform.c \ + cmssamp.c cmsnamed.c cmscam02.c cmsvirt.c cmstypes.c cmscgats.c cmsps2.c cmsopt.c \ + cmshalf.c cmsalpha.c lcms2_internal.h + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign src/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +install-libLTLIBRARIES: $(lib_LTLIBRARIES) + @$(NORMAL_INSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ + } + +uninstall-libLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ + done + +clean-libLTLIBRARIES: + -$(am__rm_f) $(lib_LTLIBRARIES) + @list='$(lib_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + echo rm -f $${locs}; \ + $(am__rm_f) $${locs} + +liblcms2.la: $(liblcms2_la_OBJECTS) $(liblcms2_la_DEPENDENCIES) $(EXTRA_liblcms2_la_DEPENDENCIES) + $(AM_V_CCLD)$(liblcms2_la_LINK) -rpath $(libdir) $(liblcms2_la_OBJECTS) $(liblcms2_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmsalpha.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmscam02.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmscgats.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmscnvrt.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmserr.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmsgamma.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmsgmt.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmshalf.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmsintrp.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmsio0.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmsio1.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmslut.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmsmd5.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmsmtrx.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmsnamed.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmsopt.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmspack.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmspcs.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmsplugin.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmsps2.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmssamp.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmssm.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmstypes.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmsvirt.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmswtpnt.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmsxform.Plo@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @: >>$@ + +am--depfiles: $(am__depfiles_remade) + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(libdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -$(am__rm_f) $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || $(am__rm_f) $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ + mostlyclean-am + +distclean: distclean-am + -rm -f ./$(DEPDIR)/cmsalpha.Plo + -rm -f ./$(DEPDIR)/cmscam02.Plo + -rm -f ./$(DEPDIR)/cmscgats.Plo + -rm -f ./$(DEPDIR)/cmscnvrt.Plo + -rm -f ./$(DEPDIR)/cmserr.Plo + -rm -f ./$(DEPDIR)/cmsgamma.Plo + -rm -f ./$(DEPDIR)/cmsgmt.Plo + -rm -f ./$(DEPDIR)/cmshalf.Plo + -rm -f ./$(DEPDIR)/cmsintrp.Plo + -rm -f ./$(DEPDIR)/cmsio0.Plo + -rm -f ./$(DEPDIR)/cmsio1.Plo + -rm -f ./$(DEPDIR)/cmslut.Plo + -rm -f ./$(DEPDIR)/cmsmd5.Plo + -rm -f ./$(DEPDIR)/cmsmtrx.Plo + -rm -f ./$(DEPDIR)/cmsnamed.Plo + -rm -f ./$(DEPDIR)/cmsopt.Plo + -rm -f ./$(DEPDIR)/cmspack.Plo + -rm -f ./$(DEPDIR)/cmspcs.Plo + -rm -f ./$(DEPDIR)/cmsplugin.Plo + -rm -f ./$(DEPDIR)/cmsps2.Plo + -rm -f ./$(DEPDIR)/cmssamp.Plo + -rm -f ./$(DEPDIR)/cmssm.Plo + -rm -f ./$(DEPDIR)/cmstypes.Plo + -rm -f ./$(DEPDIR)/cmsvirt.Plo + -rm -f ./$(DEPDIR)/cmswtpnt.Plo + -rm -f ./$(DEPDIR)/cmsxform.Plo + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-libLTLIBRARIES + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f ./$(DEPDIR)/cmsalpha.Plo + -rm -f ./$(DEPDIR)/cmscam02.Plo + -rm -f ./$(DEPDIR)/cmscgats.Plo + -rm -f ./$(DEPDIR)/cmscnvrt.Plo + -rm -f ./$(DEPDIR)/cmserr.Plo + -rm -f ./$(DEPDIR)/cmsgamma.Plo + -rm -f ./$(DEPDIR)/cmsgmt.Plo + -rm -f ./$(DEPDIR)/cmshalf.Plo + -rm -f ./$(DEPDIR)/cmsintrp.Plo + -rm -f ./$(DEPDIR)/cmsio0.Plo + -rm -f ./$(DEPDIR)/cmsio1.Plo + -rm -f ./$(DEPDIR)/cmslut.Plo + -rm -f ./$(DEPDIR)/cmsmd5.Plo + -rm -f ./$(DEPDIR)/cmsmtrx.Plo + -rm -f ./$(DEPDIR)/cmsnamed.Plo + -rm -f ./$(DEPDIR)/cmsopt.Plo + -rm -f ./$(DEPDIR)/cmspack.Plo + -rm -f ./$(DEPDIR)/cmspcs.Plo + -rm -f ./$(DEPDIR)/cmsplugin.Plo + -rm -f ./$(DEPDIR)/cmsps2.Plo + -rm -f ./$(DEPDIR)/cmssamp.Plo + -rm -f ./$(DEPDIR)/cmssm.Plo + -rm -f ./$(DEPDIR)/cmstypes.Plo + -rm -f ./$(DEPDIR)/cmsvirt.Plo + -rm -f ./$(DEPDIR)/cmswtpnt.Plo + -rm -f ./$(DEPDIR)/cmsxform.Plo + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-libLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ + clean-generic clean-libLTLIBRARIES clean-libtool cscopelist-am \ + ctags ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-libLTLIBRARIES install-man install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am uninstall-libLTLIBRARIES + +.PRECIOUS: Makefile + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: + +# Tell GNU make to disable its built-in pattern rules. +%:: %,v +%:: RCS/%,v +%:: RCS/% +%:: s.% +%:: SCCS/s.% diff --git a/local/recipes/libs/lcms2/source/src/cmsalpha.c b/local/recipes/libs/lcms2/source/src/cmsalpha.c new file mode 100644 index 0000000000..18c84def1a --- /dev/null +++ b/local/recipes/libs/lcms2/source/src/cmsalpha.c @@ -0,0 +1,650 @@ +//--------------------------------------------------------------------------------- +// +// Little Color Management System +// Copyright (c) 1998-2026 Marti Maria Saguer +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//--------------------------------------------------------------------------------- +// + +#include "lcms2_internal.h" + +// Alpha copy ------------------------------------------------------------------------------------------------------------------ + +// This macro return words stored as big endian +#define CHANGE_ENDIAN(w) (cmsUInt16Number) ((cmsUInt16Number) ((w)<<8)|((w)>>8)) + + +// Floor to byte, taking care of saturation +cmsINLINE cmsUInt8Number _cmsQuickSaturateByte(cmsFloat64Number d) +{ + d += 0.5; + if (d <= 0) return 0; + if (d >= 255.0) return 255; + + return (cmsUInt8Number) _cmsQuickFloorWord(d); +} + + +// Return the size in bytes of a given formatter +static +cmsUInt32Number trueBytesSize(cmsUInt32Number Format) +{ + cmsUInt32Number fmt_bytes = T_BYTES(Format); + + // For double, the T_BYTES field returns zero + if (fmt_bytes == 0) + return sizeof(double); + + // Otherwise, it is already correct for all formats + return fmt_bytes; +} + + +// Several format converters + +typedef void(*cmsFormatterAlphaFn)(void* dst, const void* src); + + +// From 8 + +static +void copy8(void* dst, const void* src) +{ + memmove(dst, src, 1); +} + +static +void from8to16(void* dst, const void* src) +{ + cmsUInt8Number n = *(cmsUInt8Number*)src; + *(cmsUInt16Number*) dst = (cmsUInt16Number) FROM_8_TO_16(n); +} + +static +void from8to16SE(void* dst, const void* src) +{ + cmsUInt8Number n = *(cmsUInt8Number*)src; + *(cmsUInt16Number*)dst = CHANGE_ENDIAN(FROM_8_TO_16(n)); +} + +static +void from8toFLT(void* dst, const void* src) +{ + *(cmsFloat32Number*)dst = (cmsFloat32Number) (*(cmsUInt8Number*)src) / 255.0f; +} + +static +void from8toDBL(void* dst, const void* src) +{ + *(cmsFloat64Number*)dst = (cmsFloat64Number) (*(cmsUInt8Number*)src) / 255.0; +} + +static +void from8toHLF(void* dst, const void* src) +{ +#ifndef CMS_NO_HALF_SUPPORT + cmsFloat32Number n = (*(cmsUInt8Number*)src) / 255.0f; + *(cmsUInt16Number*)dst = _cmsFloat2Half(n); +#else + cmsUNUSED_PARAMETER(dst); + cmsUNUSED_PARAMETER(src); +#endif +} + +// From 16 + +static +void from16to8(void* dst, const void* src) +{ + cmsUInt16Number n = *(cmsUInt16Number*)src; + *(cmsUInt8Number*) dst = FROM_16_TO_8(n); +} + +static +void from16SEto8(void* dst, const void* src) +{ + cmsUInt16Number n = *(cmsUInt16Number*)src; + *(cmsUInt8Number*)dst = FROM_16_TO_8(CHANGE_ENDIAN(n)); +} + +static +void copy16(void* dst, const void* src) +{ + memmove(dst, src, 2); +} + +static +void from16to16(void* dst, const void* src) +{ + cmsUInt16Number n = *(cmsUInt16Number*)src; + *(cmsUInt16Number*)dst = CHANGE_ENDIAN(n); +} + +static +void from16toFLT(void* dst, const void* src) +{ + *(cmsFloat32Number*)dst = (*(cmsUInt16Number*)src) / 65535.0f; +} + +static +void from16SEtoFLT(void* dst, const void* src) +{ + *(cmsFloat32Number*)dst = (CHANGE_ENDIAN(*(cmsUInt16Number*)src)) / 65535.0f; +} + +static +void from16toDBL(void* dst, const void* src) +{ + *(cmsFloat64Number*)dst = (cmsFloat64Number) (*(cmsUInt16Number*)src) / 65535.0; +} + +static +void from16SEtoDBL(void* dst, const void* src) +{ + *(cmsFloat64Number*)dst = (cmsFloat64Number) (CHANGE_ENDIAN(*(cmsUInt16Number*)src)) / 65535.0; +} + +static +void from16toHLF(void* dst, const void* src) +{ +#ifndef CMS_NO_HALF_SUPPORT + cmsFloat32Number n = (*(cmsUInt16Number*)src) / 65535.0f; + *(cmsUInt16Number*)dst = _cmsFloat2Half(n); +#else + cmsUNUSED_PARAMETER(dst); + cmsUNUSED_PARAMETER(src); +#endif +} + +static +void from16SEtoHLF(void* dst, const void* src) +{ +#ifndef CMS_NO_HALF_SUPPORT + cmsFloat32Number n = (CHANGE_ENDIAN(*(cmsUInt16Number*)src)) / 65535.0f; + *(cmsUInt16Number*)dst = _cmsFloat2Half(n); +#else + cmsUNUSED_PARAMETER(dst); + cmsUNUSED_PARAMETER(src); +#endif +} +// From Float + +static +void fromFLTto8(void* dst, const void* src) +{ + cmsFloat32Number n = *(cmsFloat32Number*)src; + *(cmsUInt8Number*)dst = _cmsQuickSaturateByte(n * 255.0); +} + +static +void fromFLTto16(void* dst, const void* src) +{ + cmsFloat32Number n = *(cmsFloat32Number*)src; + *(cmsUInt16Number*)dst = _cmsQuickSaturateWord(n * 65535.0); +} + +static +void fromFLTto16SE(void* dst, const void* src) +{ + cmsFloat32Number n = *(cmsFloat32Number*)src; + cmsUInt16Number i = _cmsQuickSaturateWord(n * 65535.0); + + *(cmsUInt16Number*)dst = CHANGE_ENDIAN(i); +} + +static +void copy32(void* dst, const void* src) +{ + memmove(dst, src, sizeof(cmsFloat32Number)); +} + +static +void fromFLTtoDBL(void* dst, const void* src) +{ + cmsFloat32Number n = *(cmsFloat32Number*)src; + *(cmsFloat64Number*)dst = (cmsFloat64Number)n; +} + +static +void fromFLTtoHLF(void* dst, const void* src) +{ +#ifndef CMS_NO_HALF_SUPPORT + cmsFloat32Number n = *(cmsFloat32Number*)src; + *(cmsUInt16Number*)dst = _cmsFloat2Half(n); +#else + cmsUNUSED_PARAMETER(dst); + cmsUNUSED_PARAMETER(src); +#endif +} + + +// From HALF + +static +void fromHLFto8(void* dst, const void* src) +{ +#ifndef CMS_NO_HALF_SUPPORT + cmsFloat32Number n = _cmsHalf2Float(*(cmsUInt16Number*)src); + *(cmsUInt8Number*)dst = _cmsQuickSaturateByte(n * 255.0); +#else + cmsUNUSED_PARAMETER(dst); + cmsUNUSED_PARAMETER(src); +#endif + +} + +static +void fromHLFto16(void* dst, const void* src) +{ +#ifndef CMS_NO_HALF_SUPPORT + cmsFloat32Number n = _cmsHalf2Float(*(cmsUInt16Number*)src); + *(cmsUInt16Number*)dst = _cmsQuickSaturateWord(n * 65535.0); +#else + cmsUNUSED_PARAMETER(dst); + cmsUNUSED_PARAMETER(src); +#endif +} + +static +void fromHLFto16SE(void* dst, const void* src) +{ +#ifndef CMS_NO_HALF_SUPPORT + cmsFloat32Number n = _cmsHalf2Float(*(cmsUInt16Number*)src); + cmsUInt16Number i = _cmsQuickSaturateWord(n * 65535.0); + *(cmsUInt16Number*)dst = CHANGE_ENDIAN(i); +#else + cmsUNUSED_PARAMETER(dst); + cmsUNUSED_PARAMETER(src); +#endif +} + +static +void fromHLFtoFLT(void* dst, const void* src) +{ +#ifndef CMS_NO_HALF_SUPPORT + *(cmsFloat32Number*)dst = _cmsHalf2Float(*(cmsUInt16Number*)src); +#else + cmsUNUSED_PARAMETER(dst); + cmsUNUSED_PARAMETER(src); +#endif +} + +static +void fromHLFtoDBL(void* dst, const void* src) +{ +#ifndef CMS_NO_HALF_SUPPORT + *(cmsFloat64Number*)dst = (cmsFloat64Number)_cmsHalf2Float(*(cmsUInt16Number*)src); +#else + cmsUNUSED_PARAMETER(dst); + cmsUNUSED_PARAMETER(src); +#endif +} + +// From double +static +void fromDBLto8(void* dst, const void* src) +{ + cmsFloat64Number n = *(cmsFloat64Number*)src; + *(cmsUInt8Number*)dst = _cmsQuickSaturateByte(n * 255.0); +} + +static +void fromDBLto16(void* dst, const void* src) +{ + cmsFloat64Number n = *(cmsFloat64Number*)src; + *(cmsUInt16Number*)dst = _cmsQuickSaturateWord(n * 65535.0f); +} + +static +void fromDBLto16SE(void* dst, const void* src) +{ + cmsFloat64Number n = *(cmsFloat64Number*)src; + cmsUInt16Number i = _cmsQuickSaturateWord(n * 65535.0f); + *(cmsUInt16Number*)dst = CHANGE_ENDIAN(i); +} + +static +void fromDBLtoFLT(void* dst, const void* src) +{ + cmsFloat64Number n = *(cmsFloat64Number*)src; + *(cmsFloat32Number*)dst = (cmsFloat32Number) n; +} + +static +void fromDBLtoHLF(void* dst, const void* src) +{ +#ifndef CMS_NO_HALF_SUPPORT + cmsFloat32Number n = (cmsFloat32Number) *(cmsFloat64Number*)src; + *(cmsUInt16Number*)dst = _cmsFloat2Half(n); +#else + cmsUNUSED_PARAMETER(dst); + cmsUNUSED_PARAMETER(src); +#endif +} + +static +void copy64(void* dst, const void* src) +{ + memmove(dst, src, sizeof(cmsFloat64Number)); +} + + +// Returns the position (x or y) of the formatter in the table of functions +static +int FormatterPos(cmsUInt32Number frm) +{ + cmsUInt32Number b = T_BYTES(frm); + + if (b == 0 && T_FLOAT(frm)) + return 5; // DBL +#ifndef CMS_NO_HALF_SUPPORT + if (b == 2 && T_FLOAT(frm)) + return 3; // HLF +#endif + if (b == 4 && T_FLOAT(frm)) + return 4; // FLT + if (b == 2 && !T_FLOAT(frm)) + { + if (T_ENDIAN16(frm)) + return 2; // 16SE + else + return 1; // 16 + } + if (b == 1 && !T_FLOAT(frm)) + return 0; // 8 + return -1; // not recognized +} + +// Obtains an alpha-to-alpha function formatter +static +cmsFormatterAlphaFn _cmsGetFormatterAlpha(cmsContext id, cmsUInt32Number in, cmsUInt32Number out) +{ +static const cmsFormatterAlphaFn FormattersAlpha[6][6] = { + + /* from 8 */ { copy8, from8to16, from8to16SE, from8toHLF, from8toFLT, from8toDBL }, + /* from 16*/ { from16to8, copy16, from16to16, from16toHLF, from16toFLT, from16toDBL }, + /* from 16SE*/{ from16SEto8, from16to16, copy16, from16SEtoHLF,from16SEtoFLT, from16SEtoDBL }, + /* from HLF*/ { fromHLFto8, fromHLFto16, fromHLFto16SE, copy16, fromHLFtoFLT, fromHLFtoDBL }, + /* from FLT*/ { fromFLTto8, fromFLTto16, fromFLTto16SE, fromFLTtoHLF, copy32, fromFLTtoDBL }, + /* from DBL*/ { fromDBLto8, fromDBLto16, fromDBLto16SE, fromDBLtoHLF, fromDBLtoFLT, copy64 }}; + + int in_n = FormatterPos(in); + int out_n = FormatterPos(out); + + if (in_n < 0 || out_n < 0 || in_n > 5 || out_n > 5) { + + cmsSignalError(id, cmsERROR_UNKNOWN_EXTENSION, "Unrecognized alpha channel width"); + return NULL; + } + + return FormattersAlpha[in_n][out_n]; +} + + + +// This function computes the distance from each component to the next one in bytes. +static +cmsBool ComputeIncrementsForChunky(cmsUInt32Number Format, + cmsUInt32Number ComponentStartingOrder[], + cmsUInt32Number ComponentPointerIncrements[]) +{ + cmsUInt32Number channels[cmsMAXCHANNELS]; + cmsUInt32Number extra = T_EXTRA(Format); + cmsUInt32Number nchannels = T_CHANNELS(Format); + cmsUInt32Number total_chans = nchannels + extra; + cmsUInt32Number i; + cmsUInt32Number channelSize = trueBytesSize(Format); + cmsUInt32Number pixelSize = channelSize * total_chans; + + // Sanity check + if (total_chans <= 0 || total_chans >= cmsMAXCHANNELS) + return FALSE; + + memset(channels, 0, sizeof(channels)); + + // Separation is independent of starting point and only depends on channel size + for (i = 0; i < extra; i++) + ComponentPointerIncrements[i] = pixelSize; + + // Handle do swap + for (i = 0; i < total_chans; i++) + { + if (T_DOSWAP(Format)) { + channels[i] = total_chans - i - 1; + } + else { + channels[i] = i; + } + } + + // Handle swap first (ROL of positions), example CMYK -> KCMY | 0123 -> 3012 + if (T_SWAPFIRST(Format) && total_chans > 1) { + + cmsUInt32Number tmp = channels[0]; + for (i = 0; i < total_chans-1; i++) + channels[i] = channels[i + 1]; + + channels[total_chans - 1] = tmp; + } + + // Handle size + if (channelSize > 1) + for (i = 0; i < total_chans; i++) { + channels[i] *= channelSize; + } + + for (i = 0; i < extra; i++) + ComponentStartingOrder[i] = channels[i + nchannels]; + + return TRUE; +} + + + +// On planar configurations, the distance is the stride added to any non-negative +static +cmsBool ComputeIncrementsForPlanar(cmsUInt32Number Format, + cmsUInt32Number BytesPerPlane, + cmsUInt32Number ComponentStartingOrder[], + cmsUInt32Number ComponentPointerIncrements[]) +{ + cmsUInt32Number channels[cmsMAXCHANNELS]; + cmsUInt32Number extra = T_EXTRA(Format); + cmsUInt32Number nchannels = T_CHANNELS(Format); + cmsUInt32Number total_chans = nchannels + extra; + cmsUInt32Number i; + cmsUInt32Number channelSize = trueBytesSize(Format); + + // Sanity check + if (total_chans <= 0 || total_chans >= cmsMAXCHANNELS) + return FALSE; + + memset(channels, 0, sizeof(channels)); + + // Separation is independent of starting point and only depends on channel size + for (i = 0; i < extra; i++) + ComponentPointerIncrements[i] = channelSize; + + // Handle do swap + for (i = 0; i < total_chans; i++) + { + if (T_DOSWAP(Format)) { + channels[i] = total_chans - i - 1; + } + else { + channels[i] = i; + } + } + + // Handle swap first (ROL of positions), example CMYK -> KCMY | 0123 -> 3012 + if (T_SWAPFIRST(Format) && total_chans > 0) { + + cmsUInt32Number tmp = channels[0]; + for (i = 0; i < total_chans - 1; i++) + channels[i] = channels[i + 1]; + + channels[total_chans - 1] = tmp; + } + + // Handle size + for (i = 0; i < total_chans; i++) { + channels[i] *= BytesPerPlane; + } + + for (i = 0; i < extra; i++) + ComponentStartingOrder[i] = channels[i + nchannels]; + + return TRUE; +} + + + +// Dispatcher por chunky and planar RGB +static +cmsBool ComputeComponentIncrements(cmsUInt32Number Format, + cmsUInt32Number BytesPerPlane, + cmsUInt32Number ComponentStartingOrder[], + cmsUInt32Number ComponentPointerIncrements[]) +{ + if (T_PLANAR(Format)) { + + return ComputeIncrementsForPlanar(Format, BytesPerPlane, ComponentStartingOrder, ComponentPointerIncrements); + } + else { + return ComputeIncrementsForChunky(Format, ComponentStartingOrder, ComponentPointerIncrements); + } + +} + +// Handles extra channels copying alpha if requested by the flags +void _cmsHandleExtraChannels(_cmsTRANSFORM* p, const void* in, + void* out, + cmsUInt32Number PixelsPerLine, + cmsUInt32Number LineCount, + const cmsStride* Stride) +{ + cmsUInt32Number i, j, k; + cmsUInt32Number nExtra; + cmsUInt32Number SourceStartingOrder[cmsMAXCHANNELS]; + cmsUInt32Number SourceIncrements[cmsMAXCHANNELS]; + cmsUInt32Number DestStartingOrder[cmsMAXCHANNELS]; + cmsUInt32Number DestIncrements[cmsMAXCHANNELS]; + + cmsFormatterAlphaFn copyValueFn; + + // Make sure we need some copy + if (!(p->dwOriginalFlags & cmsFLAGS_COPY_ALPHA)) + return; + + // Exit early if in-place color-management is occurring - no need to copy extra channels to themselves. + if (p->InputFormat == p->OutputFormat && in == out) + return; + + // Make sure we have same number of alpha channels. If not, just return as this should be checked at transform creation time. + nExtra = T_EXTRA(p->InputFormat); + if (nExtra != T_EXTRA(p->OutputFormat)) + return; + + // Anything to do? + if (nExtra == 0) + return; + + // Compute the increments + if (!ComputeComponentIncrements(p->InputFormat, Stride->BytesPerPlaneIn, SourceStartingOrder, SourceIncrements)) + return; + if (!ComputeComponentIncrements(p->OutputFormat, Stride->BytesPerPlaneOut, DestStartingOrder, DestIncrements)) + return; + + // Check for conversions 8, 16, half, float, dbl + copyValueFn = _cmsGetFormatterAlpha(p->ContextID, p->InputFormat, p->OutputFormat); + if (copyValueFn == NULL) + return; + + if (nExtra == 1) { // Optimized routine for copying a single extra channel quickly + + cmsUInt8Number* SourcePtr; + cmsUInt8Number* DestPtr; + + size_t SourceStrideIncrement = 0; + size_t DestStrideIncrement = 0; + + // The loop itself + for (i = 0; i < LineCount; i++) { + + // Prepare pointers for the loop + SourcePtr = (cmsUInt8Number*)in + SourceStartingOrder[0] + SourceStrideIncrement; + DestPtr = (cmsUInt8Number*)out + DestStartingOrder[0] + DestStrideIncrement; + + for (j = 0; j < PixelsPerLine; j++) { + + copyValueFn(DestPtr, SourcePtr); + + SourcePtr += SourceIncrements[0]; + DestPtr += DestIncrements[0]; + } + + SourceStrideIncrement += Stride->BytesPerLineIn; + DestStrideIncrement += Stride->BytesPerLineOut; + } + + } + else { // General case with more than one extra channel + + cmsUInt8Number* SourcePtr[cmsMAXCHANNELS]; + cmsUInt8Number* DestPtr[cmsMAXCHANNELS]; + + size_t SourceStrideIncrements[cmsMAXCHANNELS]; + size_t DestStrideIncrements[cmsMAXCHANNELS]; + + memset(SourceStrideIncrements, 0, sizeof(SourceStrideIncrements)); + memset(DestStrideIncrements, 0, sizeof(DestStrideIncrements)); + + // The loop itself + for (i = 0; i < LineCount; i++) { + + // Prepare pointers for the loop + for (j = 0; j < nExtra; j++) { + + SourcePtr[j] = (cmsUInt8Number*)in + SourceStartingOrder[j] + SourceStrideIncrements[j]; + DestPtr[j] = (cmsUInt8Number*)out + DestStartingOrder[j] + DestStrideIncrements[j]; + } + + for (j = 0; j < PixelsPerLine; j++) { + + for (k = 0; k < nExtra; k++) { + + copyValueFn(DestPtr[k], SourcePtr[k]); + + SourcePtr[k] += SourceIncrements[k]; + DestPtr[k] += DestIncrements[k]; + } + } + + for (j = 0; j < nExtra; j++) { + + SourceStrideIncrements[j] += Stride->BytesPerLineIn; + DestStrideIncrements[j] += Stride->BytesPerLineOut; + } + } + } +} + + diff --git a/local/recipes/libs/lcms2/source/src/cmscam02.c b/local/recipes/libs/lcms2/source/src/cmscam02.c new file mode 100644 index 0000000000..1f5e6422e4 --- /dev/null +++ b/local/recipes/libs/lcms2/source/src/cmscam02.c @@ -0,0 +1,490 @@ +//--------------------------------------------------------------------------------- +// +// Little Color Management System +// Copyright (c) 1998-2026 Marti Maria Saguer +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//--------------------------------------------------------------------------------- +// + +#include "lcms2_internal.h" + +// CIECAM 02 appearance model. Many thanks to Jordi Vilar for the debugging. + +// ---------- Implementation -------------------------------------------- + +typedef struct { + + cmsFloat64Number XYZ[3]; + cmsFloat64Number RGB[3]; + cmsFloat64Number RGBc[3]; + cmsFloat64Number RGBp[3]; + cmsFloat64Number RGBpa[3]; + cmsFloat64Number a, b, h, e, H, A, J, Q, s, t, C, M; + cmsFloat64Number abC[2]; + cmsFloat64Number abs[2]; + cmsFloat64Number abM[2]; + +} CAM02COLOR; + +typedef struct { + + CAM02COLOR adoptedWhite; + cmsFloat64Number LA, Yb; + cmsFloat64Number F, c, Nc; + cmsUInt32Number surround; + cmsFloat64Number n, Nbb, Ncb, z, FL, D; + + cmsContext ContextID; + +} cmsCIECAM02; + + +static +cmsFloat64Number compute_n(cmsCIECAM02* pMod) +{ + return (pMod -> Yb / pMod -> adoptedWhite.XYZ[1]); +} + +static +cmsFloat64Number compute_z(cmsCIECAM02* pMod) +{ + return (1.48 + pow(pMod -> n, 0.5)); +} + +static +cmsFloat64Number computeNbb(cmsCIECAM02* pMod) +{ + return (0.725 * pow((1.0 / pMod -> n), 0.2)); +} + +static +cmsFloat64Number computeFL(cmsCIECAM02* pMod) +{ + cmsFloat64Number k, FL; + + k = 1.0 / ((5.0 * pMod->LA) + 1.0); + FL = 0.2 * pow(k, 4.0) * (5.0 * pMod->LA) + 0.1 * + (pow((1.0 - pow(k, 4.0)), 2.0)) * + (pow((5.0 * pMod->LA), (1.0 / 3.0))); + + return FL; +} + +static cmsFloat64Number computeD(cmsCIECAM02* pMod) +{ + cmsFloat64Number D, temp; + + temp = 1.0 - ((1.0 / 3.6) * exp((-pMod->LA - 42) / 92.0)); + + D = pMod->F * temp; + return D; +} + +static +CAM02COLOR XYZtoCAT02(CAM02COLOR clr) +{ + clr.RGB[0] = (clr.XYZ[0] * 0.7328) + (clr.XYZ[1] * 0.4296) + (clr.XYZ[2] * -0.1624); + clr.RGB[1] = (clr.XYZ[0] * -0.7036) + (clr.XYZ[1] * 1.6975) + (clr.XYZ[2] * 0.0061); + clr.RGB[2] = (clr.XYZ[0] * 0.0030) + (clr.XYZ[1] * 0.0136) + (clr.XYZ[2] * 0.9834); + + return clr; +} + +static +CAM02COLOR ChromaticAdaptation(CAM02COLOR clr, cmsCIECAM02* pMod) +{ + cmsUInt32Number i; + + for (i = 0; i < 3; i++) { + clr.RGBc[i] = ((pMod -> adoptedWhite.XYZ[1] * + (pMod->D / pMod -> adoptedWhite.RGB[i])) + + (1.0 - pMod->D)) * clr.RGB[i]; + } + + return clr; +} + + +static +CAM02COLOR CAT02toHPE(CAM02COLOR clr) +{ + cmsFloat64Number M[9]; + + M[0] =(( 0.38971 * 1.096124) + (0.68898 * 0.454369) + (-0.07868 * -0.009628)); + M[1] =(( 0.38971 * -0.278869) + (0.68898 * 0.473533) + (-0.07868 * -0.005698)); + M[2] =(( 0.38971 * 0.182745) + (0.68898 * 0.072098) + (-0.07868 * 1.015326)); + M[3] =((-0.22981 * 1.096124) + (1.18340 * 0.454369) + ( 0.04641 * -0.009628)); + M[4] =((-0.22981 * -0.278869) + (1.18340 * 0.473533) + ( 0.04641 * -0.005698)); + M[5] =((-0.22981 * 0.182745) + (1.18340 * 0.072098) + ( 0.04641 * 1.015326)); + M[6] =(-0.009628); + M[7] =(-0.005698); + M[8] =( 1.015326); + + clr.RGBp[0] = (clr.RGBc[0] * M[0]) + (clr.RGBc[1] * M[1]) + (clr.RGBc[2] * M[2]); + clr.RGBp[1] = (clr.RGBc[0] * M[3]) + (clr.RGBc[1] * M[4]) + (clr.RGBc[2] * M[5]); + clr.RGBp[2] = (clr.RGBc[0] * M[6]) + (clr.RGBc[1] * M[7]) + (clr.RGBc[2] * M[8]); + + return clr; +} + +static +CAM02COLOR NonlinearCompression(CAM02COLOR clr, cmsCIECAM02* pMod) +{ + cmsUInt32Number i; + cmsFloat64Number temp; + + for (i = 0; i < 3; i++) { + if (clr.RGBp[i] < 0) { + + temp = pow((-1.0 * pMod->FL * clr.RGBp[i] / 100.0), 0.42); + clr.RGBpa[i] = (-1.0 * 400.0 * temp) / (temp + 27.13) + 0.1; + } + else { + temp = pow((pMod->FL * clr.RGBp[i] / 100.0), 0.42); + clr.RGBpa[i] = (400.0 * temp) / (temp + 27.13) + 0.1; + } + } + + clr.A = (((2.0 * clr.RGBpa[0]) + clr.RGBpa[1] + + (clr.RGBpa[2] / 20.0)) - 0.305) * pMod->Nbb; + + return clr; +} + +static +CAM02COLOR ComputeCorrelates(CAM02COLOR clr, cmsCIECAM02* pMod) +{ + cmsFloat64Number a, b, temp, e, t, r2d, d2r; + + a = clr.RGBpa[0] - (12.0 * clr.RGBpa[1] / 11.0) + (clr.RGBpa[2] / 11.0); + b = (clr.RGBpa[0] + clr.RGBpa[1] - (2.0 * clr.RGBpa[2])) / 9.0; + + r2d = (180.0 / 3.141592654); + if (a == 0) { + if (b == 0) clr.h = 0; + else if (b > 0) clr.h = 90; + else clr.h = 270; + } + else if (a > 0) { + temp = b / a; + if (b > 0) clr.h = (r2d * atan(temp)); + else if (b == 0) clr.h = 0; + else clr.h = (r2d * atan(temp)) + 360; + } + else { + temp = b / a; + clr.h = (r2d * atan(temp)) + 180; + } + + d2r = (3.141592654 / 180.0); + e = ((12500.0 / 13.0) * pMod->Nc * pMod->Ncb) * + (cos((clr.h * d2r + 2.0)) + 3.8); + + if (clr.h < 20.14) { + temp = ((clr.h + 122.47)/1.2) + ((20.14 - clr.h)/0.8); + clr.H = 300 + (100*((clr.h + 122.47)/1.2)) / temp; + } + else if (clr.h < 90.0) { + temp = ((clr.h - 20.14)/0.8) + ((90.00 - clr.h)/0.7); + clr.H = (100*((clr.h - 20.14)/0.8)) / temp; + } + else if (clr.h < 164.25) { + temp = ((clr.h - 90.00)/0.7) + ((164.25 - clr.h)/1.0); + clr.H = 100 + ((100*((clr.h - 90.00)/0.7)) / temp); + } + else if (clr.h < 237.53) { + temp = ((clr.h - 164.25)/1.0) + ((237.53 - clr.h)/1.2); + clr.H = 200 + ((100*((clr.h - 164.25)/1.0)) / temp); + } + else { + temp = ((clr.h - 237.53)/1.2) + ((360 - clr.h + 20.14)/0.8); + clr.H = 300 + ((100*((clr.h - 237.53)/1.2)) / temp); + } + + clr.J = 100.0 * pow((clr.A / pMod->adoptedWhite.A), + (pMod->c * pMod->z)); + + clr.Q = (4.0 / pMod->c) * pow((clr.J / 100.0), 0.5) * + (pMod->adoptedWhite.A + 4.0) * pow(pMod->FL, 0.25); + + t = (e * pow(((a * a) + (b * b)), 0.5)) / + (clr.RGBpa[0] + clr.RGBpa[1] + + ((21.0 / 20.0) * clr.RGBpa[2])); + + clr.C = pow(t, 0.9) * pow((clr.J / 100.0), 0.5) * + pow((1.64 - pow(0.29, pMod->n)), 0.73); + + clr.M = clr.C * pow(pMod->FL, 0.25); + clr.s = 100.0 * pow((clr.M / clr.Q), 0.5); + + return clr; +} + + +static +CAM02COLOR InverseCorrelates(CAM02COLOR clr, cmsCIECAM02* pMod) +{ + + cmsFloat64Number t, e, p1, p2, p3, p4, p5, hr, d2r; + d2r = 3.141592654 / 180.0; + + t = pow( (clr.C / (pow((clr.J / 100.0), 0.5) * + (pow((1.64 - pow(0.29, pMod->n)), 0.73)))), + (1.0 / 0.9) ); + e = ((12500.0 / 13.0) * pMod->Nc * pMod->Ncb) * + (cos((clr.h * d2r + 2.0)) + 3.8); + + clr.A = pMod->adoptedWhite.A * pow( + (clr.J / 100.0), + (1.0 / (pMod->c * pMod->z))); + + p2 = (clr.A / pMod->Nbb) + 0.305; + + if ( t <= 0.0 ) { // special case from spec notes, avoid divide by zero + clr.a = clr.b = 0.0; + } + else { + hr = clr.h * d2r; + p1 = e / t; + p3 = 21.0 / 20.0; + + if (fabs(sin(hr)) >= fabs(cos(hr))) { + p4 = p1 / sin(hr); + clr.b = (p2 * (2.0 + p3) * (460.0 / 1403.0)) / + (p4 + (2.0 + p3) * (220.0 / 1403.0) * + (cos(hr) / sin(hr)) - (27.0 / 1403.0) + + p3 * (6300.0 / 1403.0)); + clr.a = clr.b * (cos(hr) / sin(hr)); + } + else { + p5 = p1 / cos(hr); + clr.a = (p2 * (2.0 + p3) * (460.0 / 1403.0)) / + (p5 + (2.0 + p3) * (220.0 / 1403.0) - + ((27.0 / 1403.0) - p3 * (6300.0 / 1403.0)) * + (sin(hr) / cos(hr))); + clr.b = clr.a * (sin(hr) / cos(hr)); + } + } + + clr.RGBpa[0] = ((460.0 / 1403.0) * p2) + + ((451.0 / 1403.0) * clr.a) + + ((288.0 / 1403.0) * clr.b); + clr.RGBpa[1] = ((460.0 / 1403.0) * p2) - + ((891.0 / 1403.0) * clr.a) - + ((261.0 / 1403.0) * clr.b); + clr.RGBpa[2] = ((460.0 / 1403.0) * p2) - + ((220.0 / 1403.0) * clr.a) - + ((6300.0 / 1403.0) * clr.b); + + return clr; +} + +static +CAM02COLOR InverseNonlinearity(CAM02COLOR clr, cmsCIECAM02* pMod) +{ + cmsUInt32Number i; + cmsFloat64Number c1; + + for (i = 0; i < 3; i++) { + if ((clr.RGBpa[i] - 0.1) < 0) c1 = -1; + else c1 = 1; + clr.RGBp[i] = c1 * (100.0 / pMod->FL) * + pow(((27.13 * fabs(clr.RGBpa[i] - 0.1)) / + (400.0 - fabs(clr.RGBpa[i] - 0.1))), + (1.0 / 0.42)); + } + + return clr; +} + +static +CAM02COLOR HPEtoCAT02(CAM02COLOR clr) +{ + cmsFloat64Number M[9]; + + M[0] = (( 0.7328 * 1.910197) + (0.4296 * 0.370950)); + M[1] = (( 0.7328 * -1.112124) + (0.4296 * 0.629054)); + M[2] = (( 0.7328 * 0.201908) + (0.4296 * 0.000008) - 0.1624); + M[3] = ((-0.7036 * 1.910197) + (1.6975 * 0.370950)); + M[4] = ((-0.7036 * -1.112124) + (1.6975 * 0.629054)); + M[5] = ((-0.7036 * 0.201908) + (1.6975 * 0.000008) + 0.0061); + M[6] = (( 0.0030 * 1.910197) + (0.0136 * 0.370950)); + M[7] = (( 0.0030 * -1.112124) + (0.0136 * 0.629054)); + M[8] = (( 0.0030 * 0.201908) + (0.0136 * 0.000008) + 0.9834); + + clr.RGBc[0] = (clr.RGBp[0] * M[0]) + (clr.RGBp[1] * M[1]) + (clr.RGBp[2] * M[2]); + clr.RGBc[1] = (clr.RGBp[0] * M[3]) + (clr.RGBp[1] * M[4]) + (clr.RGBp[2] * M[5]); + clr.RGBc[2] = (clr.RGBp[0] * M[6]) + (clr.RGBp[1] * M[7]) + (clr.RGBp[2] * M[8]); + return clr; +} + + +static +CAM02COLOR InverseChromaticAdaptation(CAM02COLOR clr, cmsCIECAM02* pMod) +{ + cmsUInt32Number i; + for (i = 0; i < 3; i++) { + clr.RGB[i] = clr.RGBc[i] / + ((pMod->adoptedWhite.XYZ[1] * pMod->D / pMod->adoptedWhite.RGB[i]) + 1.0 - pMod->D); + } + return clr; +} + + +static +CAM02COLOR CAT02toXYZ(CAM02COLOR clr) +{ + clr.XYZ[0] = (clr.RGB[0] * 1.096124) + (clr.RGB[1] * -0.278869) + (clr.RGB[2] * 0.182745); + clr.XYZ[1] = (clr.RGB[0] * 0.454369) + (clr.RGB[1] * 0.473533) + (clr.RGB[2] * 0.072098); + clr.XYZ[2] = (clr.RGB[0] * -0.009628) + (clr.RGB[1] * -0.005698) + (clr.RGB[2] * 1.015326); + + return clr; +} + + +cmsHANDLE CMSEXPORT cmsCIECAM02Init(cmsContext ContextID, const cmsViewingConditions* pVC) +{ + cmsCIECAM02* lpMod; + + _cmsAssert(pVC != NULL); + + if((lpMod = (cmsCIECAM02*) _cmsMallocZero(ContextID, sizeof(cmsCIECAM02))) == NULL) { + return NULL; + } + + lpMod ->ContextID = ContextID; + + lpMod ->adoptedWhite.XYZ[0] = pVC ->whitePoint.X; + lpMod ->adoptedWhite.XYZ[1] = pVC ->whitePoint.Y; + lpMod ->adoptedWhite.XYZ[2] = pVC ->whitePoint.Z; + + lpMod -> LA = pVC ->La; + lpMod -> Yb = pVC ->Yb; + lpMod -> D = pVC ->D_value; + lpMod -> surround = pVC ->surround; + + switch (lpMod -> surround) { + + + case CUTSHEET_SURROUND: + lpMod->F = 0.8; + lpMod->c = 0.41; + lpMod->Nc = 0.8; + break; + + case DARK_SURROUND: + lpMod -> F = 0.8; + lpMod -> c = 0.525; + lpMod -> Nc = 0.8; + break; + + case DIM_SURROUND: + lpMod -> F = 0.9; + lpMod -> c = 0.59; + lpMod -> Nc = 0.95; + break; + + default: + // Average surround + lpMod -> F = 1.0; + lpMod -> c = 0.69; + lpMod -> Nc = 1.0; + } + + lpMod -> n = compute_n(lpMod); + lpMod -> z = compute_z(lpMod); + lpMod -> Nbb = computeNbb(lpMod); + lpMod -> FL = computeFL(lpMod); + + if (lpMod -> D == D_CALCULATE) { + lpMod -> D = computeD(lpMod); + } + + lpMod -> Ncb = lpMod -> Nbb; + + lpMod -> adoptedWhite = XYZtoCAT02(lpMod -> adoptedWhite); + lpMod -> adoptedWhite = ChromaticAdaptation(lpMod -> adoptedWhite, lpMod); + lpMod -> adoptedWhite = CAT02toHPE(lpMod -> adoptedWhite); + lpMod -> adoptedWhite = NonlinearCompression(lpMod -> adoptedWhite, lpMod); + + return (cmsHANDLE) lpMod; + +} + +void CMSEXPORT cmsCIECAM02Done(cmsHANDLE hModel) +{ + cmsCIECAM02* lpMod = (cmsCIECAM02*) hModel; + + if (lpMod) _cmsFree(lpMod ->ContextID, lpMod); +} + + +void CMSEXPORT cmsCIECAM02Forward(cmsHANDLE hModel, const cmsCIEXYZ* pIn, cmsJCh* pOut) +{ + CAM02COLOR clr; + cmsCIECAM02* lpMod = (cmsCIECAM02*) hModel; + + _cmsAssert(lpMod != NULL); + _cmsAssert(pIn != NULL); + _cmsAssert(pOut != NULL); + + memset(&clr, 0, sizeof(clr)); + + clr.XYZ[0] = pIn ->X; + clr.XYZ[1] = pIn ->Y; + clr.XYZ[2] = pIn ->Z; + + clr = XYZtoCAT02(clr); + clr = ChromaticAdaptation(clr, lpMod); + clr = CAT02toHPE(clr); + clr = NonlinearCompression(clr, lpMod); + clr = ComputeCorrelates(clr, lpMod); + + pOut ->J = clr.J; + pOut ->C = clr.C; + pOut ->h = clr.h; +} + +void CMSEXPORT cmsCIECAM02Reverse(cmsHANDLE hModel, const cmsJCh* pIn, cmsCIEXYZ* pOut) +{ + CAM02COLOR clr; + cmsCIECAM02* lpMod = (cmsCIECAM02*) hModel; + + _cmsAssert(lpMod != NULL); + _cmsAssert(pIn != NULL); + _cmsAssert(pOut != NULL); + + memset(&clr, 0, sizeof(clr)); + + clr.J = pIn -> J; + clr.C = pIn -> C; + clr.h = pIn -> h; + + clr = InverseCorrelates(clr, lpMod); + clr = InverseNonlinearity(clr, lpMod); + clr = HPEtoCAT02(clr); + clr = InverseChromaticAdaptation(clr, lpMod); + clr = CAT02toXYZ(clr); + + pOut ->X = clr.XYZ[0]; + pOut ->Y = clr.XYZ[1]; + pOut ->Z = clr.XYZ[2]; +} diff --git a/local/recipes/libs/lcms2/source/src/cmscgats.c b/local/recipes/libs/lcms2/source/src/cmscgats.c new file mode 100644 index 0000000000..39d6b91971 --- /dev/null +++ b/local/recipes/libs/lcms2/source/src/cmscgats.c @@ -0,0 +1,3310 @@ +//--------------------------------------------------------------------------------- +// +// Little Color Management System +// Copyright (c) 1998-2026 Marti Maria Saguer +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//--------------------------------------------------------------------------------- +// + +#include "lcms2_internal.h" + + +// IT8.7 / CGATS.17-200x handling ----------------------------------------------------------------------------- + + +#define MAXID 128 // Max length of identifier +#define MAXSTR 1024 // Max length of string +#define MAXTABLES 255 // Max Number of tables in a single stream +#define MAXINCLUDE 20 // Max number of nested includes + +#define DEFAULT_DBL_FORMAT "%.10g" // Double formatting + +#ifdef CMS_IS_WINDOWS_ +# include +# define DIR_CHAR '\\' +#else +# define DIR_CHAR '/' +#endif + + +// Symbols +typedef enum { + + SUNDEFINED, + SINUM, // Integer + SDNUM, // Real + SIDENT, // Identifier + SSTRING, // string + SCOMMENT, // comment + SEOLN, // End of line + SEOF, // End of stream + SSYNERROR, // Syntax error found on stream + + // IT8 symbols + + SBEGIN_DATA, + SBEGIN_DATA_FORMAT, + SEND_DATA, + SEND_DATA_FORMAT, + SKEYWORD, + SDATA_FORMAT_ID, + SINCLUDE, + + // Cube symbols + + SDOMAIN_MAX, + SDOMAIN_MIN, + S_LUT1D_SIZE, + S_LUT1D_INPUT_RANGE, + S_LUT3D_SIZE, + S_LUT3D_INPUT_RANGE, + S_LUT_IN_VIDEO_RANGE, + S_LUT_OUT_VIDEO_RANGE, + STITLE + + } SYMBOL; + + +// How to write the value +typedef enum { + + WRITE_UNCOOKED, + WRITE_STRINGIFY, + WRITE_HEXADECIMAL, + WRITE_BINARY, + WRITE_PAIR + + } WRITEMODE; + +// Linked list of variable names +typedef struct _KeyVal { + + struct _KeyVal* Next; + char* Keyword; // Name of variable + struct _KeyVal* NextSubkey; // If key is a dictionary, points to the next item + char* Subkey; // If key is a dictionary, points to the subkey name + char* Value; // Points to value + WRITEMODE WriteAs; // How to write the value + + } KEYVALUE; + + +// Linked list of memory chunks (Memory sink) +typedef struct _OwnedMem { + + struct _OwnedMem* Next; + void * Ptr; // Point to value + + } OWNEDMEM; + +// Suballocator +typedef struct _SubAllocator { + + cmsUInt8Number* Block; + cmsUInt32Number BlockSize; + cmsUInt32Number Used; + + } SUBALLOCATOR; + +// Table. Each individual table can hold properties and rows & cols +typedef struct _Table { + + char SheetType[MAXSTR]; // The first row of the IT8 (the type) + + int nSamples, nPatches; // Cols, Rows + int SampleID; // Pos of ID + + KEYVALUE* HeaderList; // The properties + + char** DataFormat; // The binary stream descriptor + char** Data; // The binary stream + + } TABLE; + +// File stream being parsed +typedef struct _FileContext { + char FileName[cmsMAX_PATH]; // File name if being read from file + FILE* Stream; // File stream or NULL if holded in memory + } FILECTX; + +//Very simple string +typedef struct { + + struct struct_it8* it8; + cmsInt32Number max; + cmsInt32Number len; + char* begin; + } string; + + +// This struct hold all information about an open IT8 handler. +typedef struct struct_it8 { + + cmsUInt32Number TablesCount; // How many tables in this stream + cmsUInt32Number nTable; // The actual table + + // Partser type + cmsBool IsCUBE; + + // Tables + TABLE Tab[MAXTABLES]; + + // Memory management + OWNEDMEM* MemorySink; // The storage backend + SUBALLOCATOR Allocator; // String suballocator -- just to keep it fast + + // Parser state machine + SYMBOL sy; // Current symbol + int ch; // Current character + + cmsInt32Number inum; // integer value + cmsFloat64Number dnum; // real value + + string* id; // identifier + string* str; // string + + // Allowed keywords & datasets. They have visibility on whole stream + KEYVALUE* ValidKeywords; + KEYVALUE* ValidSampleID; + + char* Source; // Points to loc. being parsed + cmsInt32Number lineno; // line counter for error reporting + + FILECTX* FileStack[MAXINCLUDE]; // Stack of files being parsed + cmsInt32Number IncludeSP; // Include Stack Pointer + + char* MemoryBlock; // The stream if holded in memory + + char DoubleFormatter[MAXID];// Printf-like 'cmsFloat64Number' formatter + + cmsContext ContextID; // The threading context + + } cmsIT8; + + +// The stream for save operations +typedef struct { + + FILE* stream; // For save-to-file behaviour + + cmsUInt8Number* Base; + cmsUInt8Number* Ptr; // For save-to-mem behaviour + cmsUInt32Number Used; + cmsUInt32Number Max; + + } SAVESTREAM; + + +// ------------------------------------------------------ cmsIT8 parsing routines + + +// A keyword +typedef struct { + + const char *id; + SYMBOL sy; + + } KEYWORD; + +// The keyword->symbol translation tables. Sorting is required. +static const KEYWORD TabKeysIT8[] = { + + {"$INCLUDE", SINCLUDE}, // This is an extension! + {".INCLUDE", SINCLUDE}, // This is an extension! + + {"BEGIN_DATA", SBEGIN_DATA }, + {"BEGIN_DATA_FORMAT", SBEGIN_DATA_FORMAT }, + {"DATA_FORMAT_IDENTIFIER", SDATA_FORMAT_ID}, + {"END_DATA", SEND_DATA}, + {"END_DATA_FORMAT", SEND_DATA_FORMAT}, + {"KEYWORD", SKEYWORD} + }; + +#define NUMKEYS_IT8 (sizeof(TabKeysIT8)/sizeof(KEYWORD)) + +static const KEYWORD TabKeysCUBE[] = { + + {"DOMAIN_MAX", SDOMAIN_MAX }, + {"DOMAIN_MIN", SDOMAIN_MIN }, + {"LUT_1D_SIZE", S_LUT1D_SIZE }, + {"LUT_1D_INPUT_RANGE", S_LUT1D_INPUT_RANGE }, + {"LUT_3D_SIZE", S_LUT3D_SIZE }, + {"LUT_3D_INPUT_RANGE", S_LUT3D_INPUT_RANGE }, + {"LUT_IN_VIDEO_RANGE", S_LUT_IN_VIDEO_RANGE }, + {"LUT_OUT_VIDEO_RANGE", S_LUT_OUT_VIDEO_RANGE }, + {"TITLE", STITLE } + +}; + +#define NUMKEYS_CUBE (sizeof(TabKeysCUBE)/sizeof(KEYWORD)) + + + +// Predefined properties + +// A property +typedef struct { + const char *id; // The identifier + WRITEMODE as; // How is supposed to be written + } PROPERTY; + +static const PROPERTY PredefinedProperties[] = { + + {"NUMBER_OF_FIELDS", WRITE_UNCOOKED}, // Required - NUMBER OF FIELDS + {"NUMBER_OF_SETS", WRITE_UNCOOKED}, // Required - NUMBER OF SETS + {"ORIGINATOR", WRITE_STRINGIFY}, // Required - Identifies the specific system, organization or individual that created the data file. + {"FILE_DESCRIPTOR", WRITE_STRINGIFY}, // Required - Describes the purpose or contents of the data file. + {"CREATED", WRITE_STRINGIFY}, // Required - Indicates date of creation of the data file. + {"DESCRIPTOR", WRITE_STRINGIFY}, // Required - Describes the purpose or contents of the data file. + {"DIFFUSE_GEOMETRY", WRITE_STRINGIFY}, // The diffuse geometry used. Allowed values are "sphere" or "opal". + {"MANUFACTURER", WRITE_STRINGIFY}, + {"MANUFACTURE", WRITE_STRINGIFY}, // Some broken Fuji targets does store this value + {"PROD_DATE", WRITE_STRINGIFY}, // Identifies year and month of production of the target in the form yyyy:mm. + {"SERIAL", WRITE_STRINGIFY}, // Uniquely identifies individual physical target. + + {"MATERIAL", WRITE_STRINGIFY}, // Identifies the material on which the target was produced using a code + // uniquely identifying th e material. This is intend ed to be used for IT8.7 + // physical targets only (i.e . IT8.7/1 and IT8.7/2). + + {"INSTRUMENTATION", WRITE_STRINGIFY}, // Used to report the specific instrumentation used (manufacturer and + // model number) to generate the data reported. This data will often + // provide more information about the particular data collected than an + // extensive list of specific details. This is particularly important for + // spectral data or data derived from spectrophotometry. + + {"MEASUREMENT_SOURCE", WRITE_STRINGIFY}, // Illumination used for spectral measurements. This data helps provide + // a guide to the potential for issues of paper fluorescence, etc. + + {"PRINT_CONDITIONS", WRITE_STRINGIFY}, // Used to define the characteristics of the printed sheet being reported. + // Where standard conditions have been defined (e.g., SWOP at nominal) + // named conditions may suffice. Otherwise, detailed information is + // needed. + + {"SAMPLE_BACKING", WRITE_STRINGIFY}, // Identifies the backing material used behind the sample during + // measurement. Allowed values are "black", "white", or {"na". + + {"CHISQ_DOF", WRITE_STRINGIFY}, // Degrees of freedom associated with the Chi squared statistic + // below properties are new in recent specs: + + {"MEASUREMENT_GEOMETRY", WRITE_STRINGIFY}, // The type of measurement, either reflection or transmission, should be indicated + // along with details of the geometry and the aperture size and shape. For example, + // for transmission measurements it is important to identify 0/diffuse, diffuse/0, + // opal or integrating sphere, etc. For reflection it is important to identify 0/45, + // 45/0, sphere (specular included or excluded), etc. + + {"FILTER", WRITE_STRINGIFY}, // Identifies the use of physical filter(s) during measurement. Typically used to + // denote the use of filters such as none, D65, Red, Green or Blue. + + {"POLARIZATION", WRITE_STRINGIFY}, // Identifies the use of a physical polarization filter during measurement. Allowed + // values are {"yes", "white", "none" or "na". + + {"WEIGHTING_FUNCTION", WRITE_PAIR}, // Indicates such functions as: the CIE standard observer functions used in the + // calculation of various data parameters (2 degree and 10 degree), CIE standard + // illuminant functions used in the calculation of various data parameters (e.g., D50, + // D65, etc.), density status response, etc. If used there shall be at least one + // name-value pair following the WEIGHTING_FUNCTION tag/keyword. The first attribute + // in the set shall be {"name" and shall identify the particular parameter used. + // The second shall be {"value" and shall provide the value associated with that name. + // For ASCII data, a string containing the Name and Value attribute pairs shall follow + // the weighting function keyword. A semi-colon separates attribute pairs from each + // other and within the attribute the name and value are separated by a comma. + + {"COMPUTATIONAL_PARAMETER", WRITE_PAIR}, // Parameter that is used in computing a value from measured data. Name is the name + // of the calculation, parameter is the name of the parameter used in the calculation + // and value is the value of the parameter. + + {"TARGET_TYPE", WRITE_STRINGIFY}, // The type of target being measured, e.g. IT8.7/1, IT8.7/3, user defined, etc. + + {"COLORANT", WRITE_STRINGIFY}, // Identifies the colorant(s) used in creating the target. + + {"TABLE_DESCRIPTOR", WRITE_STRINGIFY}, // Describes the purpose or contents of a data table. + + {"TABLE_NAME", WRITE_STRINGIFY} // Provides a short name for a data table. +}; + +#define NUMPREDEFINEDPROPS (sizeof(PredefinedProperties)/sizeof(PROPERTY)) + + +// Predefined sample types on dataset +static const char* PredefinedSampleID[] = { + "SAMPLE_ID", // Identifies sample that data represents + "STRING", // Identifies label, or other non-machine readable value. + // Value must begin and end with a " symbol + + "CMYK_C", // Cyan component of CMYK data expressed as a percentage + "CMYK_M", // Magenta component of CMYK data expressed as a percentage + "CMYK_Y", // Yellow component of CMYK data expressed as a percentage + "CMYK_K", // Black component of CMYK data expressed as a percentage + "D_RED", // Red filter density + "D_GREEN", // Green filter density + "D_BLUE", // Blue filter density + "D_VIS", // Visual filter density + "D_MAJOR_FILTER", // Major filter d ensity + "RGB_R", // Red component of RGB data + "RGB_G", // Green component of RGB data + "RGB_B", // Blue com ponent of RGB data + "SPECTRAL_NM", // Wavelength of measurement expressed in nanometers + "SPECTRAL_PCT", // Percentage reflectance/transmittance + "SPECTRAL_DEC", // Reflectance/transmittance + "XYZ_X", // X component of tristimulus data + "XYZ_Y", // Y component of tristimulus data + "XYZ_Z", // Z component of tristimulus data + "XYY_X", // x component of chromaticity data + "XYY_Y", // y component of chromaticity data + "XYY_CAPY", // Y component of tristimulus data + "LAB_L", // L* component of Lab data + "LAB_A", // a* component of Lab data + "LAB_B", // b* component of Lab data + "LAB_C", // C*ab component of Lab data + "LAB_H", // hab component of Lab data + "LAB_DE", // CIE dE + "LAB_DE_94", // CIE dE using CIE 94 + "LAB_DE_CMC", // dE using CMC + "LAB_DE_2000", // CIE dE using CIE DE 2000 + "MEAN_DE", // Mean Delta E (LAB_DE) of samples compared to batch average + // (Used for data files for ANSI IT8.7/1 and IT8.7/2 targets) + "STDEV_X", // Standard deviation of X (tristimulus data) + "STDEV_Y", // Standard deviation of Y (tristimulus data) + "STDEV_Z", // Standard deviation of Z (tristimulus data) + "STDEV_L", // Standard deviation of L* + "STDEV_A", // Standard deviation of a* + "STDEV_B", // Standard deviation of b* + "STDEV_DE", // Standard deviation of CIE dE + "CHI_SQD_PAR"}; // The average of the standard deviations of L*, a* and b*. It is + // used to derive an estimate of the chi-squared parameter which is + // recommended as the predictor of the variability of dE + +#define NUMPREDEFINEDSAMPLEID (sizeof(PredefinedSampleID)/sizeof(char *)) + +//Forward declaration of some internal functions +static void* AllocChunk(cmsIT8* it8, cmsUInt32Number size); + +static +string* StringAlloc(cmsIT8* it8, int max) +{ + string* s = (string*) AllocChunk(it8, sizeof(string)); + if (s == NULL) return NULL; + + s->it8 = it8; + s->max = max; + s->len = 0; + s->begin = (char*) AllocChunk(it8, s->max); + + return s; +} + +static +void StringClear(string* s) +{ + s->len = 0; + s->begin[0] = 0; +} + +static +cmsBool StringAppend(string* s, char c) +{ + if (s->len + 1 >= s->max) + { + char* new_ptr; + + s->max *= 10; + new_ptr = (char*) AllocChunk(s->it8, s->max); + if (new_ptr == NULL) return FALSE; + + if (s->begin != NULL) + memcpy(new_ptr, s->begin, s->len); + + s->begin = new_ptr; + } + + if (s->begin != NULL) + { + s->begin[s->len++] = c; + s->begin[s->len] = 0; + } + + return TRUE; +} + +static +char* StringPtr(string* s) +{ + return s->begin; +} + +static +cmsBool StringCat(string* s, const char* c) +{ + while (*c) + { + if (!StringAppend(s, *c)) return FALSE; + c++; + } + + return TRUE; +} + + +// Checks whatever c is a separator +static +cmsBool isseparator(int c) +{ + return (c == ' ') || (c == '\t'); +} + +// Checks whatever c is a valid identifier char +static +cmsBool ismiddle(int c) +{ + return (!isseparator(c) && (c != '#') && (c !='\"') && (c != '\'') && (c > 32) && (c < 127)); +} + +// Checks whatsever c is a valid identifier middle char. +static +cmsBool isidchar(int c) +{ + return isalnum(c) || ismiddle(c); +} + +// Checks whatsever c is a valid identifier first char. +static +cmsBool isfirstidchar(int c) +{ + return c != '-' && !isdigit(c) && ismiddle(c); +} + +// Guess whether the supplied path looks like an absolute path +static +cmsBool isabsolutepath(const char *path) +{ + char ThreeChars[4]; + + if(path == NULL) + return FALSE; + if (path[0] == 0) + return FALSE; + + strncpy(ThreeChars, path, 3); + ThreeChars[3] = 0; + + if(ThreeChars[0] == DIR_CHAR) + return TRUE; + +#ifdef CMS_IS_WINDOWS_ + if (isalpha((int) ThreeChars[0]) && ThreeChars[1] == ':') + return TRUE; +#endif + return FALSE; +} + + +// Makes a file path based on a given reference path +// NOTE: this function doesn't check if the path exists or even if it's legal +static +cmsBool BuildAbsolutePath(const char *relPath, const char *basePath, char *buffer, cmsUInt32Number MaxLen) +{ + char *tail; + cmsUInt32Number len; + + // Already absolute? + if (isabsolutepath(relPath)) { + + memcpy(buffer, relPath, MaxLen); + buffer[MaxLen-1] = 0; + return TRUE; + } + + // No, search for last + memcpy(buffer, basePath, MaxLen); + buffer[MaxLen-1] = 0; + + tail = strrchr(buffer, DIR_CHAR); + if (tail == NULL) return FALSE; // Is not absolute and has no separators?? + + len = (cmsUInt32Number) (tail - buffer); + if (len >= MaxLen) return FALSE; + + // No need to assure zero terminator over here + strncpy(tail + 1, relPath, MaxLen - len); + + return TRUE; +} + + +// Make sure no exploit is being even tried +static +const char* NoMeta(const char* str) +{ + if (strchr(str, '%') != NULL) + return "**** CORRUPTED FORMAT STRING ***"; + + return str; +} + +// Syntax error +static +cmsBool SynError(cmsIT8* it8, const char *Txt, ...) +{ + char Buffer[256], ErrMsg[1024]; + va_list args; + + va_start(args, Txt); + vsnprintf(Buffer, 255, Txt, args); + Buffer[255] = 0; + va_end(args); + + snprintf(ErrMsg, 1023, "%s: Line %d, %s", it8->FileStack[it8 ->IncludeSP]->FileName, it8->lineno, Buffer); + ErrMsg[1023] = 0; + it8->sy = SSYNERROR; + cmsSignalError(it8 ->ContextID, cmsERROR_CORRUPTION_DETECTED, "%s", ErrMsg); + return FALSE; +} + +// Check if current symbol is same as specified. issue an error else. +static +cmsBool Check(cmsIT8* it8, SYMBOL sy, const char* Err) +{ + if (it8 -> sy != sy) + return SynError(it8, NoMeta(Err)); + return TRUE; +} + +// Read Next character from stream +static +void NextCh(cmsIT8* it8) +{ + if (it8 -> FileStack[it8 ->IncludeSP]->Stream) { + + it8 ->ch = fgetc(it8 ->FileStack[it8 ->IncludeSP]->Stream); + + if (feof(it8 -> FileStack[it8 ->IncludeSP]->Stream)) { + + if (it8 ->IncludeSP > 0) { + + fclose(it8 ->FileStack[it8->IncludeSP--]->Stream); + it8 -> ch = ' '; // Whitespace to be ignored + + } else + it8 ->ch = 0; // EOF + } + } + else { + it8->ch = *it8->Source; + if (it8->ch) it8->Source++; + } +} + + +// Try to see if current identifier is a keyword, if so return the referred symbol +static +SYMBOL BinSrchKey(const char *id, int NumKeys, const KEYWORD* TabKeys) +{ + int l = 1; + int r = NumKeys; + int x, res; + + while (r >= l) + { + x = (l+r)/2; + res = cmsstrcasecmp(id, TabKeys[x-1].id); + if (res == 0) return TabKeys[x-1].sy; + if (res < 0) r = x - 1; + else l = x + 1; + } + + return SUNDEFINED; +} + + +// 10 ^n +static +cmsFloat64Number xpow10(int n) +{ + return pow(10, (cmsFloat64Number) n); +} + + +// Reads a Real number, tries to follow from integer number +static +void ReadReal(cmsIT8* it8, cmsInt32Number inum) +{ + it8->dnum = (cmsFloat64Number)inum; + + while (isdigit(it8->ch)) { + + it8->dnum = (cmsFloat64Number)it8->dnum * 10.0 + (cmsFloat64Number)(it8->ch - '0'); + NextCh(it8); + } + + if (it8->ch == '.') { // Decimal point + + cmsFloat64Number frac = 0.0; // fraction + int prec = 0; // precision + + NextCh(it8); // Eats dec. point + + while (isdigit(it8->ch)) { + + frac = frac * 10.0 + (cmsFloat64Number)(it8->ch - '0'); + prec++; + NextCh(it8); + } + + it8->dnum = it8->dnum + (frac / xpow10(prec)); + } + + // Exponent, example 34.00E+20 + if (toupper(it8->ch) == 'E') { + + cmsInt32Number e; + cmsInt32Number sgn; + + NextCh(it8); sgn = 1; + + if (it8->ch == '-') { + + sgn = -1; NextCh(it8); + } + else + if (it8->ch == '+') { + + sgn = +1; + NextCh(it8); + } + + e = 0; + while (isdigit(it8->ch)) { + + cmsInt32Number digit = (it8->ch - '0'); + + if ((cmsFloat64Number)e * 10.0 + (cmsFloat64Number)digit < (cmsFloat64Number)+2147483647.0) + e = e * 10 + digit; + + NextCh(it8); + } + + e = sgn*e; + it8->dnum = it8->dnum * xpow10(e); + } +} + +// Parses a float number +// This can not call directly atof because it uses locale dependent +// parsing, while CCMX files always use . as decimal separator +static +cmsFloat64Number ParseFloatNumber(const char *Buffer) +{ + cmsFloat64Number dnum = 0.0; + int sign = 1; + + // keep safe + if (Buffer == NULL) return 0.0; + + if (*Buffer == '-' || *Buffer == '+') { + + sign = (*Buffer == '-') ? -1 : 1; + Buffer++; + } + + + while (*Buffer && isdigit((int)*Buffer)) { + + dnum = dnum * 10.0 + (*Buffer - '0'); + if (*Buffer) Buffer++; + } + + if (*Buffer == '.') { + + cmsFloat64Number frac = 0.0; // fraction + int prec = 0; // precision + + if (*Buffer) Buffer++; + + while (*Buffer && isdigit((int)*Buffer)) { + + frac = frac * 10.0 + (*Buffer - '0'); + prec++; + if (*Buffer) Buffer++; + } + + dnum = dnum + (frac / xpow10(prec)); + } + + // Exponent, example 34.00E+20 + if (*Buffer && toupper(*Buffer) == 'E') { + + int e; + int sgn; + + if (*Buffer) Buffer++; + sgn = 1; + + if (*Buffer == '-') { + + sgn = -1; + if (*Buffer) Buffer++; + } + else + if (*Buffer == '+') { + + sgn = +1; + if (*Buffer) Buffer++; + } + + e = 0; + while (*Buffer && isdigit((int)*Buffer)) { + + cmsInt32Number digit = (*Buffer - '0'); + + if ((cmsFloat64Number)e * 10.0 + digit < (cmsFloat64Number)+2147483647.0) + e = e * 10 + digit; + + if (*Buffer) Buffer++; + } + + e = sgn*e; + dnum = dnum * xpow10(e); + } + + return sign * dnum; +} + + +// Reads a string, special case to avoid infinite recursion on .include +static +void InStringSymbol(cmsIT8* it8) +{ + while (isseparator(it8->ch)) + NextCh(it8); + + if (it8->ch == '\'' || it8->ch == '\"') + { + int sng; + + sng = it8->ch; + StringClear(it8->str); + + NextCh(it8); + + while (it8->ch != sng) { + + if (it8->ch == '\n' || it8->ch == '\r' || it8->ch == 0) break; + else { + if (!StringAppend(it8->str, (char)it8->ch)) { + + SynError(it8, "Out of memory"); + return; + } + + NextCh(it8); + } + } + + it8->sy = SSTRING; + NextCh(it8); + } + else + SynError(it8, "String expected"); + +} + +// Reads next symbol +static +void InSymbol(cmsIT8* it8) +{ + SYMBOL key; + + do { + + while (isseparator(it8->ch)) + NextCh(it8); + + if (isfirstidchar(it8->ch)) { // Identifier + + StringClear(it8->id); + + do { + + if (!StringAppend(it8->id, (char)it8->ch)) { + + SynError(it8, "Out of memory"); + return; + } + + NextCh(it8); + + } while (isidchar(it8->ch)); + + + key = BinSrchKey(StringPtr(it8->id), + it8->IsCUBE ? NUMKEYS_CUBE : NUMKEYS_IT8, + it8->IsCUBE ? TabKeysCUBE : TabKeysIT8); + if (key == SUNDEFINED) it8->sy = SIDENT; + else it8->sy = key; + + } + else // Is a number? + if (isdigit(it8->ch) || it8->ch == '.' || it8->ch == '-' || it8->ch == '+') + { + int sign = 1; + + if (it8->ch == '-') { + sign = -1; + NextCh(it8); + } + else + if (it8->ch == '+') { + sign = +1; + NextCh(it8); + } + + it8->inum = 0; + it8->sy = SINUM; + + if (it8->ch == '0') { // 0xnnnn (Hexa) or 0bnnnn (Binary) + + NextCh(it8); + if (toupper(it8->ch) == 'X') { + + int j; + + NextCh(it8); + while (isxdigit(it8->ch)) + { + it8->ch = toupper(it8->ch); + if (it8->ch >= 'A' && it8->ch <= 'F') j = it8->ch -'A'+10; + else j = it8->ch - '0'; + + if ((cmsFloat64Number) it8->inum * 16.0 + (cmsFloat64Number) j > (cmsFloat64Number)+2147483647.0) + { + SynError(it8, "Invalid hexadecimal number"); + return; + } + + it8->inum = it8->inum * 16 + j; + NextCh(it8); + } + return; + } + + if (toupper(it8->ch) == 'B') { // Binary + + int j; + + NextCh(it8); + while (it8->ch == '0' || it8->ch == '1') + { + j = it8->ch - '0'; + + if ((cmsFloat64Number) it8->inum * 2.0 + j > (cmsFloat64Number)+2147483647.0) + { + SynError(it8, "Invalid binary number"); + return; + } + + it8->inum = it8->inum * 2 + j; + NextCh(it8); + } + return; + } + } + + + while (isdigit(it8->ch)) { + + cmsInt32Number digit = (it8->ch - '0'); + + if ((cmsFloat64Number) it8->inum * 10.0 + (cmsFloat64Number) digit > (cmsFloat64Number) +2147483647.0) { + ReadReal(it8, it8->inum); + it8->sy = SDNUM; + it8->dnum *= sign; + return; + } + + it8->inum = it8->inum * 10 + digit; + NextCh(it8); + } + + if (it8->ch == '.') { + + ReadReal(it8, it8->inum); + it8->sy = SDNUM; + it8->dnum *= sign; + return; + } + + it8 -> inum *= sign; + + // Special case. Numbers followed by letters are taken as identifiers + + if (isidchar(it8 ->ch)) { + + char buffer[127]; + + if (it8 ->sy == SINUM) { + + snprintf(buffer, sizeof(buffer), "%d", it8->inum); + } + else { + + snprintf(buffer, sizeof(buffer), it8 ->DoubleFormatter, it8->dnum); + } + + StringClear(it8->id); + if (!StringCat(it8->id, buffer)) { + + SynError(it8, "Out of memory"); + return; + } + + do { + + if (!StringAppend(it8->id, (char)it8->ch)) { + + SynError(it8, "Out of memory"); + return; + } + + NextCh(it8); + + } while (isidchar(it8->ch)); + + it8->sy = SIDENT; + } + return; + + } + else + switch ((int) it8->ch) { + + // Eof stream markers + case '\x1a': + case 0: + case -1: + it8->sy = SEOF; + break; + + + // Next line + case '\r': + NextCh(it8); + if (it8->ch == '\n') + NextCh(it8); + it8->sy = SEOLN; + it8->lineno++; + break; + + case '\n': + NextCh(it8); + it8->sy = SEOLN; + it8->lineno++; + break; + + // Comment + case '#': + NextCh(it8); + while (it8->ch && it8->ch != '\n' && it8->ch != '\r') + NextCh(it8); + + it8->sy = SCOMMENT; + break; + + // String. + case '\'': + case '\"': + InStringSymbol(it8); + break; + + + default: + SynError(it8, "Unrecognized character: 0x%x", it8 ->ch); + return; + } + + } while (it8->sy == SCOMMENT); + + // Handle the include special token + + if (it8 -> sy == SINCLUDE) { + + FILECTX* FileNest; + + if(it8 -> IncludeSP >= (MAXINCLUDE-1)) { + + SynError(it8, "Too many recursion levels"); + return; + } + + InStringSymbol(it8); + if (!Check(it8, SSTRING, "Filename expected")) + return; + + + FileNest = it8 -> FileStack[it8 -> IncludeSP + 1]; + if(FileNest == NULL) { + + FileNest = it8 ->FileStack[it8 -> IncludeSP + 1] = (FILECTX*)AllocChunk(it8, sizeof(FILECTX)); + if (FileNest == NULL) { + + SynError(it8, "Out of memory"); + return; + } + } + + if (BuildAbsolutePath(StringPtr(it8->str), + it8->FileStack[it8->IncludeSP]->FileName, + FileNest->FileName, cmsMAX_PATH-1) == FALSE) { + + SynError(it8, "File path too long"); + return; + } + + FileNest->Stream = fopen(FileNest->FileName, "rt"); + if (FileNest->Stream == NULL) { + + SynError(it8, "File %s not found", FileNest->FileName); + return; + } + it8->IncludeSP++; + + it8 ->ch = ' '; + InSymbol(it8); + } + +} + +// Checks end of line separator +static +cmsBool CheckEOLN(cmsIT8* it8) +{ + if (!Check(it8, SEOLN, "Expected separator")) return FALSE; + while (it8->sy == SEOLN) + InSymbol(it8); + return TRUE; + +} + +// Skip a symbol + +static +void Skip(cmsIT8* it8, SYMBOL sy) +{ + if (it8->sy == sy && it8->sy != SEOF && it8->sy != SSYNERROR) + InSymbol(it8); +} + + +// Skip multiple EOLN +static +void SkipEOLN(cmsIT8* it8) +{ + while (it8->sy == SEOLN) { + InSymbol(it8); + } +} + + +// Returns a string holding current value +static +cmsBool GetVal(cmsIT8* it8, char* Buffer, cmsUInt32Number max, const char* ErrorTitle) +{ + switch (it8->sy) { + + case SEOLN: // Empty value + Buffer[0]=0; + break; + case SIDENT: strncpy(Buffer, StringPtr(it8->id), max); + Buffer[max-1]=0; + break; + case SINUM: snprintf(Buffer, max, "%d", it8 -> inum); break; + case SDNUM: snprintf(Buffer, max, it8->DoubleFormatter, it8 -> dnum); break; + case SSTRING: strncpy(Buffer, StringPtr(it8->str), max); + Buffer[max-1] = 0; + break; + + + default: + return SynError(it8, "%s", ErrorTitle); + } + + Buffer[max] = 0; + return TRUE; +} + +// ---------------------------------------------------------- Table + +static +TABLE* GetTable(cmsIT8* it8) +{ + if ((it8 -> nTable >= it8 ->TablesCount)) { + + SynError(it8, "Table %d out of sequence", it8 -> nTable); + return it8 -> Tab; + } + + return it8 ->Tab + it8 ->nTable; +} + +// ---------------------------------------------------------- Memory management + + +// Frees an allocator and owned memory +void CMSEXPORT cmsIT8Free(cmsHANDLE hIT8) +{ + cmsIT8* it8 = (cmsIT8*) hIT8; + + if (it8 == NULL) + return; + + if (it8->MemorySink) { + + OWNEDMEM* p; + OWNEDMEM* n; + + for (p = it8->MemorySink; p != NULL; p = n) { + + n = p->Next; + if (p->Ptr) _cmsFree(it8 ->ContextID, p->Ptr); + _cmsFree(it8 ->ContextID, p); + } + } + + if (it8->MemoryBlock) + _cmsFree(it8 ->ContextID, it8->MemoryBlock); + + _cmsFree(it8 ->ContextID, it8); +} + + +// Allocates a chunk of data, keep linked list +static +void* AllocBigBlock(cmsIT8* it8, cmsUInt32Number size) +{ + OWNEDMEM* ptr1; + void* ptr = _cmsMallocZero(it8->ContextID, size); + + if (ptr != NULL) { + + ptr1 = (OWNEDMEM*) _cmsMallocZero(it8 ->ContextID, sizeof(OWNEDMEM)); + + if (ptr1 == NULL) { + + _cmsFree(it8 ->ContextID, ptr); + return NULL; + } + + ptr1-> Ptr = ptr; + ptr1-> Next = it8 -> MemorySink; + it8 -> MemorySink = ptr1; + } + + return ptr; +} + + +// Suballocator. +static +void* AllocChunk(cmsIT8* it8, cmsUInt32Number size) +{ + cmsUInt32Number Free = it8 ->Allocator.BlockSize - it8 ->Allocator.Used; + cmsUInt8Number* ptr; + + size = _cmsALIGNMEM(size); + if (size == 0) return NULL; + + if (size > Free) { + + cmsUInt8Number* new_block; + + if (it8 -> Allocator.BlockSize == 0) + + it8 -> Allocator.BlockSize = 20*1024; + else + it8 ->Allocator.BlockSize *= 2; + + if (it8 ->Allocator.BlockSize < size) + it8 ->Allocator.BlockSize = size; + + it8 ->Allocator.Used = 0; + new_block = (cmsUInt8Number*)AllocBigBlock(it8, it8->Allocator.BlockSize); + if (new_block == NULL) goto Error; + + it8->Allocator.Block = new_block; + } + + if (it8->Allocator.Block == NULL) + goto Error; + + ptr = it8 ->Allocator.Block + it8 ->Allocator.Used; + it8 ->Allocator.Used += size; + + return (void*) ptr; + +Error: + + SynError(it8, "Allocation error"); + it8->Allocator.BlockSize = 0; + it8->Allocator.Used = 0; + it8->Allocator.Block = NULL; + return NULL; +} + + +// Allocates a string +static +char *AllocString(cmsIT8* it8, const char* str) +{ + cmsUInt32Number Size; + char *ptr; + + if (str == NULL) return NULL; + + Size = (cmsUInt32Number)strlen(str) + 1; + + ptr = (char *) AllocChunk(it8, Size); + if (ptr) memcpy(ptr, str, Size-1); + + return ptr; +} + +// Searches through linked list + +static +cmsBool IsAvailableOnList(KEYVALUE* p, const char* Key, const char* Subkey, KEYVALUE** LastPtr) +{ + if (LastPtr) *LastPtr = p; + + for (; p != NULL; p = p->Next) { + + if (LastPtr) *LastPtr = p; + + if (*Key != '#') { // Comments are ignored + + if (cmsstrcasecmp(Key, p->Keyword) == 0) + break; + } + } + + if (p == NULL) + return FALSE; + + if (Subkey == 0) + return TRUE; + + for (; p != NULL; p = p->NextSubkey) { + + if (p ->Subkey == NULL) continue; + + if (LastPtr) *LastPtr = p; + + if (cmsstrcasecmp(Subkey, p->Subkey) == 0) + return TRUE; + } + + return FALSE; +} + + + +// Add a property into a linked list +static +KEYVALUE* AddToList(cmsIT8* it8, KEYVALUE** Head, const char *Key, const char *Subkey, const char* xValue, WRITEMODE WriteAs) +{ + KEYVALUE* p; + KEYVALUE* last; + + + // Check if property is already in list + + if (IsAvailableOnList(*Head, Key, Subkey, &p)) { + + // This may work for editing properties + + if (cmsstrcasecmp(Key, "NUMBER_OF_FIELDS") == 0 || + cmsstrcasecmp(Key, "NUMBER_OF_SETS") == 0) { + + SynError(it8, "duplicate key <%s>", Key); + return NULL; + } + } + else { + + last = p; + + // Allocate the container + p = (KEYVALUE*) AllocChunk(it8, sizeof(KEYVALUE)); + if (p == NULL) + { + SynError(it8, "AddToList: out of memory"); + return NULL; + } + + // Store name and value + p->Keyword = AllocString(it8, Key); + p->Subkey = (Subkey == NULL) ? NULL : AllocString(it8, Subkey); + + // Keep the container in our list + if (*Head == NULL) { + *Head = p; + } + else + { + if (Subkey != NULL && last != NULL) { + + last->NextSubkey = p; + + // If Subkey is not null, then last is the last property with the same key, + // but not necessarily is the last property in the list, so we need to move + // to the actual list end + while (last->Next != NULL) + last = last->Next; + } + + if (last != NULL) last->Next = p; + } + + p->Next = NULL; + p->NextSubkey = NULL; + } + + p->WriteAs = WriteAs; + + if (xValue != NULL) { + + p->Value = AllocString(it8, xValue); + } + else { + p->Value = NULL; + } + + return p; +} + +static +KEYVALUE* AddAvailableProperty(cmsIT8* it8, const char* Key, WRITEMODE as) +{ + return AddToList(it8, &it8->ValidKeywords, Key, NULL, NULL, as); +} + + +static +KEYVALUE* AddAvailableSampleID(cmsIT8* it8, const char* Key) +{ + return AddToList(it8, &it8->ValidSampleID, Key, NULL, NULL, WRITE_UNCOOKED); +} + + +static +cmsBool AllocTable(cmsIT8* it8) +{ + TABLE* t; + + if (it8->TablesCount >= (MAXTABLES-1)) + return FALSE; + + t = it8 ->Tab + it8 ->TablesCount; + + t->HeaderList = NULL; + t->DataFormat = NULL; + t->Data = NULL; + + it8 ->TablesCount++; + return TRUE; +} + + +cmsInt32Number CMSEXPORT cmsIT8SetTable(cmsHANDLE IT8, cmsUInt32Number nTable) +{ + cmsIT8* it8 = (cmsIT8*) IT8; + + if (nTable >= it8 ->TablesCount) { + + if (nTable == it8 ->TablesCount) { + + if (!AllocTable(it8)) { + SynError(it8, "Too many tables"); + return -1; + } + } + else { + SynError(it8, "Table %d is out of sequence", nTable); + return -1; + } + } + + it8 ->nTable = nTable; + + return (cmsInt32Number) nTable; +} + + + +// Init an empty container +cmsHANDLE CMSEXPORT cmsIT8Alloc(cmsContext ContextID) +{ + cmsIT8* it8; + cmsUInt32Number i; + + it8 = (cmsIT8*) _cmsMallocZero(ContextID, sizeof(cmsIT8)); + if (it8 == NULL) return NULL; + + AllocTable(it8); + + it8->MemoryBlock = NULL; + it8->MemorySink = NULL; + + it8->IsCUBE = FALSE; + + it8 ->nTable = 0; + + it8->ContextID = ContextID; + it8->Allocator.Used = 0; + it8->Allocator.Block = NULL; + it8->Allocator.BlockSize = 0; + + it8->ValidKeywords = NULL; + it8->ValidSampleID = NULL; + + it8 -> sy = SUNDEFINED; + it8 -> ch = ' '; + it8 -> Source = NULL; + it8 -> inum = 0; + it8 -> dnum = 0.0; + + it8->FileStack[0] = (FILECTX*)AllocChunk(it8, sizeof(FILECTX)); + it8->IncludeSP = 0; + it8 -> lineno = 1; + + it8->id = StringAlloc(it8, MAXSTR); + it8->str = StringAlloc(it8, MAXSTR); + + strcpy(it8->DoubleFormatter, DEFAULT_DBL_FORMAT); + cmsIT8SetSheetType((cmsHANDLE) it8, "CGATS.17"); + + // Initialize predefined properties & data + + for (i=0; i < NUMPREDEFINEDPROPS; i++) + AddAvailableProperty(it8, PredefinedProperties[i].id, PredefinedProperties[i].as); + + for (i=0; i < NUMPREDEFINEDSAMPLEID; i++) + AddAvailableSampleID(it8, PredefinedSampleID[i]); + + + return (cmsHANDLE) it8; +} + + +const char* CMSEXPORT cmsIT8GetSheetType(cmsHANDLE hIT8) +{ + return GetTable((cmsIT8*) hIT8)->SheetType; +} + +cmsBool CMSEXPORT cmsIT8SetSheetType(cmsHANDLE hIT8, const char* Type) +{ + TABLE* t = GetTable((cmsIT8*) hIT8); + + strncpy(t ->SheetType, Type, MAXSTR-1); + t ->SheetType[MAXSTR-1] = 0; + return TRUE; +} + +cmsBool CMSEXPORT cmsIT8SetComment(cmsHANDLE hIT8, const char* Val) +{ + cmsIT8* it8 = (cmsIT8*) hIT8; + + if (!Val) return FALSE; + if (!*Val) return FALSE; + + return AddToList(it8, &GetTable(it8)->HeaderList, "# ", NULL, Val, WRITE_UNCOOKED) != NULL; +} + +// Sets a property +cmsBool CMSEXPORT cmsIT8SetPropertyStr(cmsHANDLE hIT8, const char* Key, const char *Val) +{ + cmsIT8* it8 = (cmsIT8*) hIT8; + + if (!Val) return FALSE; + if (!*Val) return FALSE; + + return AddToList(it8, &GetTable(it8)->HeaderList, Key, NULL, Val, WRITE_STRINGIFY) != NULL; +} + +cmsBool CMSEXPORT cmsIT8SetPropertyDbl(cmsHANDLE hIT8, const char* cProp, cmsFloat64Number Val) +{ + cmsIT8* it8 = (cmsIT8*) hIT8; + char Buffer[1024]; + + snprintf(Buffer, 1023, it8->DoubleFormatter, Val); + + return AddToList(it8, &GetTable(it8)->HeaderList, cProp, NULL, Buffer, WRITE_UNCOOKED) != NULL; +} + +cmsBool CMSEXPORT cmsIT8SetPropertyHex(cmsHANDLE hIT8, const char* cProp, cmsUInt32Number Val) +{ + cmsIT8* it8 = (cmsIT8*) hIT8; + char Buffer[1024]; + + snprintf(Buffer, 1023, "%u", Val); + + return AddToList(it8, &GetTable(it8)->HeaderList, cProp, NULL, Buffer, WRITE_HEXADECIMAL) != NULL; +} + +cmsBool CMSEXPORT cmsIT8SetPropertyUncooked(cmsHANDLE hIT8, const char* Key, const char* Buffer) +{ + cmsIT8* it8 = (cmsIT8*) hIT8; + + return AddToList(it8, &GetTable(it8)->HeaderList, Key, NULL, Buffer, WRITE_UNCOOKED) != NULL; +} + +cmsBool CMSEXPORT cmsIT8SetPropertyMulti(cmsHANDLE hIT8, const char* Key, const char* SubKey, const char *Buffer) +{ + cmsIT8* it8 = (cmsIT8*) hIT8; + + return AddToList(it8, &GetTable(it8)->HeaderList, Key, SubKey, Buffer, WRITE_PAIR) != NULL; +} + +// Gets a property +const char* CMSEXPORT cmsIT8GetProperty(cmsHANDLE hIT8, const char* Key) +{ + cmsIT8* it8 = (cmsIT8*) hIT8; + KEYVALUE* p; + + if (IsAvailableOnList(GetTable(it8) -> HeaderList, Key, NULL, &p)) + { + return p -> Value; + } + return NULL; +} + + +cmsFloat64Number CMSEXPORT cmsIT8GetPropertyDbl(cmsHANDLE hIT8, const char* cProp) +{ + const char *v = cmsIT8GetProperty(hIT8, cProp); + + if (v == NULL) return 0.0; + + return ParseFloatNumber(v); +} + +const char* CMSEXPORT cmsIT8GetPropertyMulti(cmsHANDLE hIT8, const char* Key, const char *SubKey) +{ + cmsIT8* it8 = (cmsIT8*) hIT8; + KEYVALUE* p; + + if (IsAvailableOnList(GetTable(it8) -> HeaderList, Key, SubKey, &p)) { + return p -> Value; + } + return NULL; +} + +// ----------------------------------------------------------------- Datasets + +// A safe atoi that returns 0 when NULL input is given +static +cmsInt32Number satoi(const char* b) +{ + int n; + + if (b == NULL) return 0; + + n = atoi(b); + if (n > 0x7ffffff0L) return 0x7ffffff0L; + if (n < -0x7ffffff0L) return -0x7ffffff0L; + + return (cmsInt32Number)n; +} + + +static +cmsBool AllocateDataFormat(cmsIT8* it8) +{ + cmsUInt32Number size; + + TABLE* t = GetTable(it8); + + if (t->DataFormat) return TRUE; // Already allocated + + t->nSamples = satoi(cmsIT8GetProperty(it8, "NUMBER_OF_FIELDS")); + + if (t->nSamples <= 0 || t->nSamples > 0x7ffe) { + + SynError(it8, "Wrong NUMBER_OF_FIELDS"); + return FALSE; + } + + size = ((cmsUInt32Number)t->nSamples + 1) * sizeof(char*); + + t->DataFormat = (char**)AllocChunk(it8, size); + if (t->DataFormat == NULL) { + + SynError(it8, "Unable to allocate dataFormat array"); + return FALSE; + } + + return TRUE; +} + +static +const char *GetDataFormat(cmsIT8* it8, int n) +{ + TABLE* t = GetTable(it8); + + if (t->DataFormat) + return t->DataFormat[n]; + + return NULL; +} + +static +cmsBool SetDataFormat(cmsIT8* it8, int n, const char *label) +{ + TABLE* t = GetTable(it8); + + if (!t->DataFormat) { + + if (!AllocateDataFormat(it8)) + return FALSE; + } + + if (n >= t -> nSamples) { + SynError(it8, "More than NUMBER_OF_FIELDS fields."); + return FALSE; + } + + if (t->DataFormat) { + t->DataFormat[n] = AllocString(it8, label); + if (t->DataFormat[n] == NULL) return FALSE; + } + + return TRUE; +} + + +cmsBool CMSEXPORT cmsIT8SetDataFormat(cmsHANDLE h, int n, const char *Sample) +{ + cmsIT8* it8 = (cmsIT8*)h; + return SetDataFormat(it8, n, Sample); +} + +// Convert to binary +static +const char* satob(const char* v) +{ + cmsUInt32Number x; + static char buf[33]; + char *s = buf + 33; + + if (v == NULL) return "0"; + + x = atoi(v); + *--s = 0; + if (!x) *--s = '0'; + for (; x; x /= 2) *--s = '0' + x%2; + + return s; +} + + +static +cmsBool AllocateDataSet(cmsIT8* it8) +{ + TABLE* t = GetTable(it8); + + if (t -> Data) return TRUE; // Already allocated + + t-> nSamples = satoi(cmsIT8GetProperty(it8, "NUMBER_OF_FIELDS")); + t-> nPatches = satoi(cmsIT8GetProperty(it8, "NUMBER_OF_SETS")); + + if (t -> nSamples < 0 || t->nSamples > 0x7ffe || t->nPatches < 0 || t->nPatches > 0x7ffe || + (t->nPatches * t->nSamples) > 200000) + { + SynError(it8, "AllocateDataSet: too much data"); + return FALSE; + } + else { + // Some dumb analyzers warns of possible overflow here, just take a look couple of lines above. + t->Data = (char**)AllocChunk(it8, ((cmsUInt32Number)t->nSamples + 1) * ((cmsUInt32Number)t->nPatches + 1) * sizeof(char*)); + if (t->Data == NULL) { + + SynError(it8, "AllocateDataSet: Unable to allocate data array"); + return FALSE; + } + } + + return TRUE; +} + +static +char* GetData(cmsIT8* it8, int nSet, int nField) +{ + TABLE* t = GetTable(it8); + int nSamples = t -> nSamples; + int nPatches = t -> nPatches; + + if (nSet < 0 || nSet >= nPatches || nField < 0 || nField >= nSamples) + return NULL; + + if (!t->Data) return NULL; + return t->Data [nSet * nSamples + nField]; +} + +static +cmsBool SetData(cmsIT8* it8, int nSet, int nField, const char *Val) +{ + char* ptr; + + TABLE* t = GetTable(it8); + + + if (!t->Data) { + if (!AllocateDataSet(it8)) return FALSE; + } + + if (!t->Data) return FALSE; + + if (nSet > t -> nPatches || nSet < 0) { + + return SynError(it8, "Patch %d out of range, there are %d patches", nSet, t -> nPatches); + } + + if (nField > t ->nSamples || nField < 0) { + return SynError(it8, "Sample %d out of range, there are %d samples", nField, t ->nSamples); + + } + + ptr = AllocString(it8, Val); + if (ptr == NULL) + return FALSE; + + t->Data [nSet * t -> nSamples + nField] = ptr; + return TRUE; +} + + +// --------------------------------------------------------------- File I/O + + +// Writes a string to file +static +void WriteStr(SAVESTREAM* f, const char *str) +{ + cmsUInt32Number len; + + if (str == NULL) + str = " "; + + // Length to write + len = (cmsUInt32Number) strlen(str); + f ->Used += len; + + + if (f ->stream) { // Should I write it to a file? + + if (fwrite(str, 1, len, f->stream) != len) { + cmsSignalError(0, cmsERROR_WRITE, "Write to file error in CGATS parser"); + return; + } + + } + else { // Or to a memory block? + + if (f ->Base) { // Am I just counting the bytes? + + if (f ->Used > f ->Max) { + + cmsSignalError(0, cmsERROR_WRITE, "Write to memory overflows in CGATS parser"); + return; + } + + memmove(f ->Ptr, str, len); + f->Ptr += len; + } + + } +} + + +// Write formatted + +static +void Writef(SAVESTREAM* f, const char* frm, ...) +{ + char Buffer[4096]; + va_list args; + + va_start(args, frm); + vsnprintf(Buffer, 4095, frm, args); + Buffer[4095] = 0; + WriteStr(f, Buffer); + va_end(args); + +} + +// Writes full header +static +void WriteHeader(cmsIT8* it8, SAVESTREAM* fp) +{ + KEYVALUE* p; + TABLE* t = GetTable(it8); + + // Writes the type + WriteStr(fp, t->SheetType); + WriteStr(fp, "\n"); + + for (p = t->HeaderList; (p != NULL); p = p->Next) + { + if (*p ->Keyword == '#') { + + char* Pt; + + WriteStr(fp, "#\n# "); + for (Pt = p ->Value; *Pt; Pt++) { + + + Writef(fp, "%c", *Pt); + + if (*Pt == '\n') { + WriteStr(fp, "# "); + } + } + + WriteStr(fp, "\n#\n"); + continue; + } + + + if (!IsAvailableOnList(it8-> ValidKeywords, p->Keyword, NULL, NULL)) { + +#ifdef CMS_STRICT_CGATS + WriteStr(fp, "KEYWORD\t\""); + WriteStr(fp, p->Keyword); + WriteStr(fp, "\"\n"); +#endif + + AddAvailableProperty(it8, p->Keyword, WRITE_UNCOOKED); + } + + WriteStr(fp, p->Keyword); + if (p->Value) { + + switch (p ->WriteAs) { + + case WRITE_UNCOOKED: + Writef(fp, "\t%s", p ->Value); + break; + + case WRITE_STRINGIFY: + Writef(fp, "\t\"%s\"", p->Value ); + break; + + case WRITE_HEXADECIMAL: + Writef(fp, "\t0x%X", satoi(p ->Value)); + break; + + case WRITE_BINARY: + Writef(fp, "\t0b%s", satob(p ->Value)); + break; + + case WRITE_PAIR: + Writef(fp, "\t\"%s,%s\"", p->Subkey, p->Value); + break; + + default: SynError(it8, "Unknown write mode %d", p ->WriteAs); + return; + } + } + + WriteStr (fp, "\n"); + } + +} + + +// Writes the data format +static +void WriteDataFormat(SAVESTREAM* fp, cmsIT8* it8) +{ + int i, nSamples; + TABLE* t = GetTable(it8); + + if (!t -> DataFormat) return; + + WriteStr(fp, "BEGIN_DATA_FORMAT\n"); + WriteStr(fp, " "); + nSamples = satoi(cmsIT8GetProperty(it8, "NUMBER_OF_FIELDS")); + + if (nSamples <= t->nSamples) { + + for (i = 0; i < nSamples; i++) { + + WriteStr(fp, t->DataFormat[i]); + WriteStr(fp, ((i == (nSamples - 1)) ? "\n" : "\t")); + } + } + + WriteStr (fp, "END_DATA_FORMAT\n"); +} + + +// Writes data array +static +void WriteData(SAVESTREAM* fp, cmsIT8* it8) +{ + int i, j, nPatches; + TABLE* t = GetTable(it8); + + if (!t->Data) return; + + WriteStr (fp, "BEGIN_DATA\n"); + + nPatches = satoi(cmsIT8GetProperty(it8, "NUMBER_OF_SETS")); + + if (nPatches <= t->nPatches) { + + for (i = 0; i < nPatches; i++) { + + WriteStr(fp, " "); + + for (j = 0; j < t->nSamples; j++) { + + char* ptr = t->Data[i * t->nSamples + j]; + + if (ptr == NULL) WriteStr(fp, "\"\""); + else { + // If value contains whitespace, enclose within quote + + if (strchr(ptr, ' ') != NULL) { + + WriteStr(fp, "\""); + WriteStr(fp, ptr); + WriteStr(fp, "\""); + } + else + WriteStr(fp, ptr); + } + + WriteStr(fp, ((j == (t->nSamples - 1)) ? "\n" : "\t")); + } + } + } + WriteStr (fp, "END_DATA\n"); +} + + + +// Saves whole file +cmsBool CMSEXPORT cmsIT8SaveToFile(cmsHANDLE hIT8, const char* cFileName) +{ + SAVESTREAM sd; + cmsUInt32Number i; + cmsIT8* it8 = (cmsIT8*) hIT8; + + memset(&sd, 0, sizeof(sd)); + + sd.stream = fopen(cFileName, "wt"); + if (!sd.stream) return FALSE; + + for (i=0; i < it8 ->TablesCount; i++) { + + TABLE* t; + + if (cmsIT8SetTable(hIT8, i) < 0) goto Error; + + /** + * Check for wrong data + */ + t = GetTable(it8); + if (t->Data == NULL) goto Error; + if (t->DataFormat == NULL) goto Error; + + WriteHeader(it8, &sd); + WriteDataFormat(&sd, it8); + WriteData(&sd, it8); + } + + if (fclose(sd.stream) != 0) return FALSE; + return TRUE; + +Error: + fclose(sd.stream); + return FALSE; + +} + + +// Saves to memory +cmsBool CMSEXPORT cmsIT8SaveToMem(cmsHANDLE hIT8, void *MemPtr, cmsUInt32Number* BytesNeeded) +{ + SAVESTREAM sd; + cmsUInt32Number i; + cmsIT8* it8 = (cmsIT8*) hIT8; + + memset(&sd, 0, sizeof(sd)); + + sd.stream = NULL; + sd.Base = (cmsUInt8Number*) MemPtr; + sd.Ptr = sd.Base; + + sd.Used = 0; + + if (sd.Base && (*BytesNeeded > 0)) { + + sd.Max = (*BytesNeeded) - 1; // Write to memory? + } + else + sd.Max = 0; // Just counting the needed bytes + + for (i=0; i < it8 ->TablesCount; i++) { + + cmsIT8SetTable(hIT8, i); + WriteHeader(it8, &sd); + WriteDataFormat(&sd, it8); + WriteData(&sd, it8); + } + + sd.Used++; // The \0 at the very end + + if (sd.Base) + *sd.Ptr = 0; + + *BytesNeeded = sd.Used; + + return TRUE; +} + + +// -------------------------------------------------------------- Higher level parsing + +static +cmsBool DataFormatSection(cmsIT8* it8) +{ + int iField = 0; + TABLE* t = GetTable(it8); + + InSymbol(it8); // Eats "BEGIN_DATA_FORMAT" + CheckEOLN(it8); + + while (it8->sy != SEND_DATA_FORMAT && + it8->sy != SEOLN && + it8->sy != SEOF && + it8->sy != SSYNERROR) { + + if (it8->sy != SIDENT) { + + return SynError(it8, "Sample type expected"); + } + + if (!SetDataFormat(it8, iField, StringPtr(it8->id))) return FALSE; + iField++; + + InSymbol(it8); + SkipEOLN(it8); + } + + SkipEOLN(it8); + Skip(it8, SEND_DATA_FORMAT); + SkipEOLN(it8); + + if (iField != t ->nSamples) { + SynError(it8, "Count mismatch. NUMBER_OF_FIELDS was %d, found %d\n", t ->nSamples, iField); + + + } + + return TRUE; +} + + + +static +cmsBool DataSection (cmsIT8* it8) +{ + int iField = 0; + int iSet = 0; + char Buffer[256]; + TABLE* t = GetTable(it8); + + InSymbol(it8); // Eats "BEGIN_DATA" + CheckEOLN(it8); + + if (!t->Data) { + if (!AllocateDataSet(it8)) return FALSE; + } + + while (it8->sy != SEND_DATA && it8->sy != SEOF && it8->sy != SSYNERROR) + { + if (iField >= t -> nSamples) { + iField = 0; + iSet++; + + } + + if (it8->sy != SEND_DATA && it8->sy != SEOF && it8->sy != SSYNERROR) { + + switch (it8->sy) + { + + // To keep very long data + case SIDENT: + if (!SetData(it8, iSet, iField, StringPtr(it8->id))) + return FALSE; + break; + + case SSTRING: + if (!SetData(it8, iSet, iField, StringPtr(it8->str))) + return FALSE; + break; + + default: + + if (!GetVal(it8, Buffer, 255, "Sample data expected")) + return FALSE; + + if (!SetData(it8, iSet, iField, Buffer)) + return FALSE; + } + + iField++; + + InSymbol(it8); + SkipEOLN(it8); + } + } + + SkipEOLN(it8); + Skip(it8, SEND_DATA); + SkipEOLN(it8); + + // Check for data completion. + + if ((iSet+1) != t -> nPatches) + return SynError(it8, "Count mismatch. NUMBER_OF_SETS was %d, found %d\n", t ->nPatches, iSet+1); + + return TRUE; +} + + + + +static +cmsBool HeaderSection(cmsIT8* it8) +{ + char VarName[MAXID]; + char Buffer[MAXSTR]; + KEYVALUE* Key; + + while (it8->sy != SEOF && + it8->sy != SSYNERROR && + it8->sy != SBEGIN_DATA_FORMAT && + it8->sy != SBEGIN_DATA) { + + + switch (it8 -> sy) { + + case SKEYWORD: + InSymbol(it8); + if (!GetVal(it8, Buffer, MAXSTR-1, "Keyword expected")) return FALSE; + if (!AddAvailableProperty(it8, Buffer, WRITE_UNCOOKED)) return FALSE; + InSymbol(it8); + break; + + + case SDATA_FORMAT_ID: + InSymbol(it8); + if (!GetVal(it8, Buffer, MAXSTR-1, "Keyword expected")) return FALSE; + if (!AddAvailableSampleID(it8, Buffer)) return FALSE; + InSymbol(it8); + break; + + + case SIDENT: + strncpy(VarName, StringPtr(it8->id), MAXID - 1); + VarName[MAXID - 1] = 0; + + if (!IsAvailableOnList(it8->ValidKeywords, VarName, NULL, &Key)) { + +#ifdef CMS_STRICT_CGATS + return SynError(it8, "Undefined keyword '%s'", VarName); +#else + Key = AddAvailableProperty(it8, VarName, WRITE_UNCOOKED); + if (Key == NULL) return FALSE; +#endif + } + + InSymbol(it8); + if (!GetVal(it8, Buffer, MAXSTR - 1, "Property data expected")) return FALSE; + + if (Key->WriteAs != WRITE_PAIR) { + if (AddToList(it8, &GetTable(it8)->HeaderList, VarName, NULL, Buffer, + (it8->sy == SSTRING) ? WRITE_STRINGIFY : WRITE_UNCOOKED) == NULL) return FALSE; + } + else { + const char *Subkey; + char *Nextkey; + if (it8->sy != SSTRING) + return SynError(it8, "Invalid value '%s' for property '%s'.", Buffer, VarName); + + // chop the string as a list of "subkey, value" pairs, using ';' as a separator + for (Subkey = Buffer; Subkey != NULL; Subkey = Nextkey) + { + char *Value, *temp; + + // identify token pair boundary + Nextkey = (char*)strchr(Subkey, ';'); + if (Nextkey) + *Nextkey++ = '\0'; + + // for each pair, split the subkey and the value + Value = (char*)strrchr(Subkey, ','); + if (Value == NULL) + return SynError(it8, "Invalid value for property '%s'.", VarName); + + // gobble the spaces before the coma, and the coma itself + temp = Value++; + do *temp-- = '\0'; while (temp >= Subkey && *temp == ' '); + + // gobble any space at the right + temp = Value + strlen(Value) - 1; + while (*temp == ' ') *temp-- = '\0'; + + // trim the strings from the left + Subkey += strspn(Subkey, " "); + Value += strspn(Value, " "); + + if (Subkey[0] == 0 || Value[0] == 0) + return SynError(it8, "Invalid value for property '%s'.", VarName); + AddToList(it8, &GetTable(it8)->HeaderList, VarName, Subkey, Value, WRITE_PAIR); + } + } + + InSymbol(it8); + break; + + + case SEOLN: break; + + default: + return SynError(it8, "expected keyword or identifier"); + } + + SkipEOLN(it8); + } + + return TRUE; + +} + + +static +void ReadType(cmsIT8* it8, char* SheetTypePtr) +{ + cmsInt32Number cnt = 0; + + // First line is a very special case. + + while (isseparator(it8->ch)) + NextCh(it8); + + while (it8->ch != '\r' && it8 ->ch != '\n' && it8->ch != '\t' && it8 -> ch != 0) { + + if (cnt++ < MAXSTR) + *SheetTypePtr++= (char) it8 ->ch; + NextCh(it8); + } + + *SheetTypePtr = 0; +} + + +static +cmsBool ParseIT8(cmsIT8* it8, cmsBool nosheet) +{ + char* SheetTypePtr = it8 ->Tab[0].SheetType; + + if (nosheet == 0) { + ReadType(it8, SheetTypePtr); + } + + InSymbol(it8); + + SkipEOLN(it8); + + while (it8-> sy != SEOF && + it8-> sy != SSYNERROR) { + + switch (it8 -> sy) { + + case SBEGIN_DATA_FORMAT: + if (!DataFormatSection(it8)) return FALSE; + break; + + case SBEGIN_DATA: + + if (!DataSection(it8)) return FALSE; + + if (it8 -> sy != SEOF && it8->sy != SSYNERROR) { + + if (!AllocTable(it8)) return FALSE; + + it8 ->nTable = it8 ->TablesCount - 1; + + // Read sheet type if present. We only support identifier and string. + // is a type string + // anything else, is not a type string + if (nosheet == 0) { + + if (it8 ->sy == SIDENT) { + + // May be a type sheet or may be a prop value statement. We cannot use insymbol in + // this special case... + while (isseparator(it8->ch)) + NextCh(it8); + + // If a newline is found, then this is a type string + if (it8 ->ch == '\n' || it8->ch == '\r') { + + cmsIT8SetSheetType(it8, StringPtr(it8 ->id)); + InSymbol(it8); + } + else + { + // It is not. Just continue + cmsIT8SetSheetType(it8, ""); + } + } + else + // Validate quoted strings + if (it8 ->sy == SSTRING) { + cmsIT8SetSheetType(it8, StringPtr(it8 ->str)); + InSymbol(it8); + } + } + + } + break; + + case SEOLN: + SkipEOLN(it8); + break; + + default: + if (!HeaderSection(it8)) return FALSE; + } + + } + + return (it8 -> sy != SSYNERROR); +} + + + +// Init useful pointers + +static +void CookPointers(cmsIT8* it8) +{ + int idField, i; + char* Fld; + cmsUInt32Number j; + cmsUInt32Number nOldTable = it8->nTable; + + for (j = 0; j < it8->TablesCount; j++) { + + TABLE* t = it8->Tab + j; + + t->SampleID = 0; + it8->nTable = j; + + for (idField = 0; idField < t->nSamples; idField++) + { + if (t->DataFormat == NULL) { + SynError(it8, "Undefined DATA_FORMAT"); + return; + } + + Fld = t->DataFormat[idField]; + if (!Fld) continue; + + + if (cmsstrcasecmp(Fld, "SAMPLE_ID") == 0) { + + t->SampleID = idField; + } + + // "LABEL" is an extension. It keeps references to forward tables + + if ((cmsstrcasecmp(Fld, "LABEL") == 0) || Fld[0] == '$') { + + // Search for table references... + for (i = 0; i < t->nPatches; i++) { + + char* Label = GetData(it8, i, idField); + + if (Label) { + + cmsUInt32Number k; + + // This is the label, search for a table containing + // this property + + for (k = 0; k < it8->TablesCount; k++) { + + TABLE* Table = it8->Tab + k; + KEYVALUE* p; + + if (IsAvailableOnList(Table->HeaderList, Label, NULL, &p)) { + + // Available, keep type and table + char Buffer[256]; + + char* Type = p->Value; + int nTable = (int)k; + + snprintf(Buffer, 255, "%s %d %s", Label, nTable, Type); + + SetData(it8, i, idField, Buffer); + } + } + } + } + } + } + } + + it8->nTable = nOldTable; +} + +// Try to infere if the file is a CGATS/IT8 file at all. Read first line +// that should be something like some printable characters plus a \n +// returns 0 if this is not like a CGATS, or an integer otherwise. This integer is the number of words in first line? +static +int IsMyBlock(const cmsUInt8Number* Buffer, cmsUInt32Number n) +{ + int words = 1, space = 0, quot = 0; + cmsUInt32Number i; + + if (n < 10) return 0; // Too small + + if (n > 132) + n = 132; + + for (i = 1; i < n; i++) { + + switch(Buffer[i]) + { + case '\n': + case '\r': + return ((quot == 1) || (words > 2)) ? 0 : words; + case '\t': + case ' ': + if(!quot && !space) + space = 1; + break; + case '\"': + quot = !quot; + break; + default: + if (Buffer[i] < 32) return 0; + if (Buffer[i] > 127) return 0; + words += space; + space = 0; + break; + } + } + + return 0; +} + + +static +cmsBool IsMyFile(const char* FileName) +{ + FILE *fp; + cmsUInt32Number Size; + cmsUInt8Number Ptr[133]; + + fp = fopen(FileName, "rt"); + if (!fp) { + cmsSignalError(0, cmsERROR_FILE, "File '%s' not found", FileName); + return FALSE; + } + + Size = (cmsUInt32Number) fread(Ptr, 1, 132, fp); + + if (fclose(fp) != 0) + return FALSE; + + Ptr[Size] = '\0'; + + return IsMyBlock(Ptr, Size); +} + +// ---------------------------------------------------------- Exported routines + + +cmsHANDLE CMSEXPORT cmsIT8LoadFromMem(cmsContext ContextID, const void *Ptr, cmsUInt32Number len) +{ + cmsHANDLE hIT8; + cmsIT8* it8; + int type; + + _cmsAssert(Ptr != NULL); + _cmsAssert(len != 0); + + type = IsMyBlock((const cmsUInt8Number*)Ptr, len); + if (type == 0) return NULL; + + hIT8 = cmsIT8Alloc(ContextID); + if (!hIT8) return NULL; + + it8 = (cmsIT8*) hIT8; + it8 ->MemoryBlock = (char*) _cmsMalloc(ContextID, len + 1); + if (it8->MemoryBlock == NULL) + { + cmsIT8Free(hIT8); + return NULL; + } + + strncpy(it8 ->MemoryBlock, (const char*) Ptr, len); + it8 ->MemoryBlock[len] = 0; + + strncpy(it8->FileStack[0]->FileName, "", cmsMAX_PATH-1); + it8-> Source = it8 -> MemoryBlock; + + if (!ParseIT8(it8, type-1)) { + + cmsIT8Free(hIT8); + return NULL; + } + + CookPointers(it8); + it8 ->nTable = 0; + + _cmsFree(ContextID, it8->MemoryBlock); + it8 -> MemoryBlock = NULL; + + return hIT8; + + +} + + +cmsHANDLE CMSEXPORT cmsIT8LoadFromFile(cmsContext ContextID, const char* cFileName) +{ + + cmsHANDLE hIT8; + cmsIT8* it8; + int type; + + _cmsAssert(cFileName != NULL); + + type = IsMyFile(cFileName); + if (type == 0) return NULL; + + hIT8 = cmsIT8Alloc(ContextID); + it8 = (cmsIT8*) hIT8; + if (!hIT8) return NULL; + + + it8 ->FileStack[0]->Stream = fopen(cFileName, "rt"); + + if (!it8 ->FileStack[0]->Stream) { + cmsIT8Free(hIT8); + return NULL; + } + + + strncpy(it8->FileStack[0]->FileName, cFileName, cmsMAX_PATH-1); + it8->FileStack[0]->FileName[cmsMAX_PATH-1] = 0; + + if (!ParseIT8(it8, type-1)) { + + fclose(it8 ->FileStack[0]->Stream); + cmsIT8Free(hIT8); + return NULL; + } + + CookPointers(it8); + it8 ->nTable = 0; + + if (fclose(it8 ->FileStack[0]->Stream)!= 0) { + cmsIT8Free(hIT8); + return NULL; + } + + return hIT8; + +} + +int CMSEXPORT cmsIT8EnumDataFormat(cmsHANDLE hIT8, char ***SampleNames) +{ + cmsIT8* it8 = (cmsIT8*) hIT8; + TABLE* t; + + _cmsAssert(hIT8 != NULL); + + t = GetTable(it8); + + if (SampleNames) + *SampleNames = t -> DataFormat; + return t -> nSamples; +} + + +cmsUInt32Number CMSEXPORT cmsIT8EnumProperties(cmsHANDLE hIT8, char ***PropertyNames) +{ + cmsIT8* it8 = (cmsIT8*) hIT8; + KEYVALUE* p; + cmsUInt32Number n; + char **Props; + TABLE* t; + + _cmsAssert(hIT8 != NULL); + + t = GetTable(it8); + + // Pass#1 - count properties + + n = 0; + for (p = t -> HeaderList; p != NULL; p = p->Next) { + n++; + } + + + Props = (char**)AllocChunk(it8, sizeof(char*) * n); + if (Props != NULL) { + + // Pass#2 - Fill pointers + n = 0; + for (p = t->HeaderList; p != NULL; p = p->Next) { + Props[n++] = p->Keyword; + } + + } + *PropertyNames = Props; + + return n; +} + +cmsUInt32Number CMSEXPORT cmsIT8EnumPropertyMulti(cmsHANDLE hIT8, const char* cProp, const char ***SubpropertyNames) +{ + cmsIT8* it8 = (cmsIT8*) hIT8; + KEYVALUE *p, *tmp; + cmsUInt32Number n; + const char **Props; + TABLE* t; + + _cmsAssert(hIT8 != NULL); + + + t = GetTable(it8); + + if(!IsAvailableOnList(t->HeaderList, cProp, NULL, &p)) { + *SubpropertyNames = 0; + return 0; + } + + // Pass#1 - count properties + + n = 0; + for (tmp = p; tmp != NULL; tmp = tmp->NextSubkey) { + if(tmp->Subkey != NULL) + n++; + } + + + Props = (const char **) AllocChunk(it8, sizeof(char *) * n); + if (Props != NULL) { + + // Pass#2 - Fill pointers + n = 0; + for (tmp = p; tmp != NULL; tmp = tmp->NextSubkey) { + if (tmp->Subkey != NULL) + Props[n++] = p->Subkey; + } + } + + *SubpropertyNames = Props; + return n; +} + +static +int LocatePatch(cmsIT8* it8, const char* cPatch) +{ + int i; + const char *data; + TABLE* t = GetTable(it8); + + for (i=0; i < t-> nPatches; i++) { + + data = GetData(it8, i, t->SampleID); + + if (data != NULL) { + + if (cmsstrcasecmp(data, cPatch) == 0) + return i; + } + } + + // SynError(it8, "Couldn't find patch '%s'\n", cPatch); + return -1; +} + + +static +int LocateEmptyPatch(cmsIT8* it8) +{ + int i; + const char *data; + TABLE* t = GetTable(it8); + + for (i=0; i < t-> nPatches; i++) { + + data = GetData(it8, i, t->SampleID); + + if (data == NULL) + return i; + + } + + return -1; +} + +static +int LocateSample(cmsIT8* it8, const char* cSample) +{ + int i; + const char *fld; + TABLE* t = GetTable(it8); + + for (i=0; i < t->nSamples; i++) { + + fld = GetDataFormat(it8, i); + if (fld != NULL) { + if (cmsstrcasecmp(fld, cSample) == 0) + return i; + } + } + + return -1; + +} + + +int CMSEXPORT cmsIT8FindDataFormat(cmsHANDLE hIT8, const char* cSample) +{ + cmsIT8* it8 = (cmsIT8*) hIT8; + + _cmsAssert(hIT8 != NULL); + + return LocateSample(it8, cSample); +} + + + +const char* CMSEXPORT cmsIT8GetDataRowCol(cmsHANDLE hIT8, int row, int col) +{ + cmsIT8* it8 = (cmsIT8*) hIT8; + + _cmsAssert(hIT8 != NULL); + + return GetData(it8, row, col); +} + + +cmsFloat64Number CMSEXPORT cmsIT8GetDataRowColDbl(cmsHANDLE hIT8, int row, int col) +{ + const char* Buffer; + + Buffer = cmsIT8GetDataRowCol(hIT8, row, col); + + if (Buffer == NULL) return 0.0; + + return ParseFloatNumber(Buffer); +} + + +cmsBool CMSEXPORT cmsIT8SetDataRowCol(cmsHANDLE hIT8, int row, int col, const char* Val) +{ + cmsIT8* it8 = (cmsIT8*) hIT8; + + _cmsAssert(hIT8 != NULL); + + return SetData(it8, row, col, Val); +} + + +cmsBool CMSEXPORT cmsIT8SetDataRowColDbl(cmsHANDLE hIT8, int row, int col, cmsFloat64Number Val) +{ + cmsIT8* it8 = (cmsIT8*) hIT8; + char Buff[256]; + + _cmsAssert(hIT8 != NULL); + + snprintf(Buff, 255, it8->DoubleFormatter, Val); + + return SetData(it8, row, col, Buff); +} + + + +const char* CMSEXPORT cmsIT8GetData(cmsHANDLE hIT8, const char* cPatch, const char* cSample) +{ + cmsIT8* it8 = (cmsIT8*) hIT8; + int iField, iSet; + + _cmsAssert(hIT8 != NULL); + + iField = LocateSample(it8, cSample); + if (iField < 0) { + return NULL; + } + + iSet = LocatePatch(it8, cPatch); + if (iSet < 0) { + return NULL; + } + + return GetData(it8, iSet, iField); +} + + +cmsFloat64Number CMSEXPORT cmsIT8GetDataDbl(cmsHANDLE it8, const char* cPatch, const char* cSample) +{ + const char* Buffer; + + Buffer = cmsIT8GetData(it8, cPatch, cSample); + + return ParseFloatNumber(Buffer); +} + + + +cmsBool CMSEXPORT cmsIT8SetData(cmsHANDLE hIT8, const char* cPatch, const char* cSample, const char *Val) +{ + cmsIT8* it8 = (cmsIT8*) hIT8; + int iField, iSet; + TABLE* t; + + _cmsAssert(hIT8 != NULL); + + t = GetTable(it8); + + iField = LocateSample(it8, cSample); + + if (iField < 0) + return FALSE; + + if (t-> nPatches == 0) { + + if (!AllocateDataFormat(it8)) + return FALSE; + + if (!AllocateDataSet(it8)) + return FALSE; + + CookPointers(it8); + } + + if (cmsstrcasecmp(cSample, "SAMPLE_ID") == 0) { + + iSet = LocateEmptyPatch(it8); + if (iSet < 0) { + return SynError(it8, "Couldn't add more patches '%s'\n", cPatch); + } + + iField = t -> SampleID; + } + else { + iSet = LocatePatch(it8, cPatch); + if (iSet < 0) { + return FALSE; + } + } + + return SetData(it8, iSet, iField, Val); +} + + +cmsBool CMSEXPORT cmsIT8SetDataDbl(cmsHANDLE hIT8, const char* cPatch, + const char* cSample, + cmsFloat64Number Val) +{ + cmsIT8* it8 = (cmsIT8*) hIT8; + char Buff[256]; + + _cmsAssert(hIT8 != NULL); + + snprintf(Buff, 255, it8->DoubleFormatter, Val); + return cmsIT8SetData(hIT8, cPatch, cSample, Buff); +} + +// Buffer should get MAXSTR at least + +const char* CMSEXPORT cmsIT8GetPatchName(cmsHANDLE hIT8, int nPatch, char* buffer) +{ + cmsIT8* it8 = (cmsIT8*) hIT8; + TABLE* t; + char* Data; + + _cmsAssert(hIT8 != NULL); + + t = GetTable(it8); + Data = GetData(it8, nPatch, t->SampleID); + + if (!Data) return NULL; + if (!buffer) return Data; + + strncpy(buffer, Data, MAXSTR-1); + buffer[MAXSTR-1] = 0; + return buffer; +} + +int CMSEXPORT cmsIT8GetPatchByName(cmsHANDLE hIT8, const char *cPatch) +{ + _cmsAssert(hIT8 != NULL); + + return LocatePatch((cmsIT8*)hIT8, cPatch); +} + +cmsUInt32Number CMSEXPORT cmsIT8TableCount(cmsHANDLE hIT8) +{ + cmsIT8* it8 = (cmsIT8*) hIT8; + + _cmsAssert(hIT8 != NULL); + + return it8 ->TablesCount; +} + +// This handles the "LABEL" extension. +// Label, nTable, Type + +int CMSEXPORT cmsIT8SetTableByLabel(cmsHANDLE hIT8, const char* cSet, const char* cField, const char* ExpectedType) +{ + const char* cLabelFld; + char Type[256], Label[256]; + cmsUInt32Number nTable; + + _cmsAssert(hIT8 != NULL); + + if (cField != NULL && *cField == 0) + cField = "LABEL"; + + if (cField == NULL) + cField = "LABEL"; + + cLabelFld = cmsIT8GetData(hIT8, cSet, cField); + if (!cLabelFld) return -1; + + if (sscanf(cLabelFld, "%255s %u %255s", Label, &nTable, Type) != 3) + return -1; + + if (ExpectedType != NULL && *ExpectedType == 0) + ExpectedType = NULL; + + if (ExpectedType) { + + if (cmsstrcasecmp(Type, ExpectedType) != 0) return -1; + } + + return cmsIT8SetTable(hIT8, nTable); +} + + +cmsBool CMSEXPORT cmsIT8SetIndexColumn(cmsHANDLE hIT8, const char* cSample) +{ + cmsIT8* it8 = (cmsIT8*) hIT8; + int pos; + + _cmsAssert(hIT8 != NULL); + + pos = LocateSample(it8, cSample); + if(pos == -1) + return FALSE; + + it8->Tab[it8->nTable].SampleID = pos; + return TRUE; +} + + +void CMSEXPORT cmsIT8DefineDblFormat(cmsHANDLE hIT8, const char* Formatter) +{ + cmsIT8* it8 = (cmsIT8*) hIT8; + + _cmsAssert(hIT8 != NULL); + + if (Formatter == NULL) + strcpy(it8->DoubleFormatter, DEFAULT_DBL_FORMAT); + else + strncpy(it8->DoubleFormatter, Formatter, sizeof(it8->DoubleFormatter)); + + it8 ->DoubleFormatter[sizeof(it8 ->DoubleFormatter)-1] = 0; +} + + +static +cmsBool ReadNumbers(cmsIT8* cube, int n, cmsFloat64Number* arr) +{ + int i; + + for (i = 0; i < n; i++) { + + if (cube->sy == SINUM) + arr[i] = cube->inum; + else + if (cube->sy == SDNUM) + arr[i] = cube->dnum; + else + return SynError(cube, "Number expected"); + + InSymbol(cube); + } + + return CheckEOLN(cube); +} + +static +cmsBool ParseCube(cmsIT8* cube, cmsStage** Shaper, cmsStage** CLUT, char title[]) +{ + cmsFloat64Number domain_min[3] = { 0, 0, 0 }; + cmsFloat64Number domain_max[3] = { 1.0, 1.0, 1.0 }; + cmsFloat64Number check_0_1[2] = { 0, 1.0 }; + int shaper_size = 0; + int lut_size = 0; + int i; + + InSymbol(cube); + + while (cube->sy != SEOF && cube->sy != SSYNERROR) { + + switch (cube->sy) + { + // Set profile description + case STITLE: + InSymbol(cube); + if (!Check(cube, SSTRING, "Title string expected")) return FALSE; + memcpy(title, StringPtr(cube->str), MAXSTR); + title[MAXSTR - 1] = 0; + InSymbol(cube); + break; + + // Define domain + case SDOMAIN_MIN: + InSymbol(cube); + if (!ReadNumbers(cube, 3, domain_min)) return FALSE; + break; + + case SDOMAIN_MAX: + InSymbol(cube); + if (!ReadNumbers(cube, 3, domain_max)) return FALSE; + break; + + // Define shaper + case S_LUT1D_SIZE: + InSymbol(cube); + if (!Check(cube, SINUM, "Shaper size expected")) return FALSE; + shaper_size = cube->inum; + if (shaper_size < 2 || shaper_size > 65536) + return SynError(cube, "LUT_1D_SIZE '%d' is out of bounds", shaper_size); + InSymbol(cube); + break; + + // Deefine CLUT + case S_LUT3D_SIZE: + InSymbol(cube); + if (!Check(cube, SINUM, "LUT size expected")) return FALSE; + lut_size = cube->inum; + InSymbol(cube); + break; + + // Range. If present, has to be 0..1.0 + case S_LUT1D_INPUT_RANGE: + case S_LUT3D_INPUT_RANGE: + InSymbol(cube); + if (!ReadNumbers(cube, 2, check_0_1)) return FALSE; + if (check_0_1[0] != 0 || check_0_1[1] != 1.0) { + return SynError(cube, "Unsupported format"); + } + break; + + case SEOLN: + InSymbol(cube); + break; + + default: + case S_LUT_IN_VIDEO_RANGE: + case S_LUT_OUT_VIDEO_RANGE: + return SynError(cube, "Unsupported format"); + + // Read and create tables + case SINUM: + case SDNUM: + + if (shaper_size > 0) { + + cmsToneCurve* curves[3]; + cmsFloat32Number* shapers = (cmsFloat32Number*)_cmsMalloc(cube->ContextID, 3 * shaper_size * sizeof(cmsFloat32Number)); + if (shapers == NULL) return FALSE; + + for (i = 0; i < shaper_size; i++) { + + cmsFloat64Number nums[3]; + + if (!ReadNumbers(cube, 3, nums)) return FALSE; + + shapers[i + 0] = (cmsFloat32Number) ((nums[0] - domain_min[0]) / (domain_max[0] - domain_min[0])); + shapers[i + 1 * shaper_size] = (cmsFloat32Number) ((nums[1] - domain_min[1]) / (domain_max[1] - domain_min[1])); + shapers[i + 2 * shaper_size] = (cmsFloat32Number) ((nums[2] - domain_min[2]) / (domain_max[2] - domain_min[2])); + } + + for (i = 0; i < 3; i++) { + + curves[i] = cmsBuildTabulatedToneCurveFloat(cube->ContextID, shaper_size, + &shapers[i * shaper_size]); + if (curves[i] == NULL) return FALSE; + } + + *Shaper = cmsStageAllocToneCurves(cube->ContextID, 3, curves); + + cmsFreeToneCurveTriple(curves); + } + + if (lut_size > 0) { + + int nodes; + + /** + * Professional LUT generation tools (e.g., Nobe LutBake) list 65×65×65 as their highest supported size. + */ + if (lut_size < 2 || lut_size > 65) + return SynError(cube, "LUT size '%d' is not allowed", lut_size); + + nodes = lut_size * lut_size * lut_size; + + + cmsFloat32Number* lut_table = (cmsFloat32Number*) _cmsMalloc(cube->ContextID, nodes * 3 * sizeof(cmsFloat32Number)); + if (lut_table == NULL) return FALSE; + + for (i = 0; i < nodes; i++) { + + cmsFloat64Number nums[3]; + + if (!ReadNumbers(cube, 3, nums)) return FALSE; + + lut_table[i * 3 + 2] = (cmsFloat32Number) ((nums[0] - domain_min[0]) / (domain_max[0] - domain_min[0])); + lut_table[i * 3 + 1] = (cmsFloat32Number) ((nums[1] - domain_min[1]) / (domain_max[1] - domain_min[1])); + lut_table[i * 3 + 0] = (cmsFloat32Number) ((nums[2] - domain_min[2]) / (domain_max[2] - domain_min[2])); + } + + *CLUT = cmsStageAllocCLutFloat(cube->ContextID, lut_size, 3, 3, lut_table); + _cmsFree(cube->ContextID, lut_table); + } + + if (!Check(cube, SEOF, "Extra symbols found in file")) return FALSE; + } + } + + return TRUE; +} + +// Share the parser to read .cube format and create RGB devicelink profiles +cmsHPROFILE CMSEXPORT cmsCreateDeviceLinkFromCubeFileTHR(cmsContext ContextID, const char* cFileName) +{ + cmsHPROFILE hProfile = NULL; + cmsIT8* cube = NULL; + cmsPipeline* Pipeline = NULL; + cmsStage* CLUT = NULL; + cmsStage* Shaper = NULL; + cmsMLU* DescriptionMLU = NULL; + char title[MAXSTR]; + + _cmsAssert(cFileName != NULL); + + cube = (cmsIT8*) cmsIT8Alloc(ContextID); + if (!cube) return NULL; + + cube->IsCUBE = TRUE; + cube->FileStack[0]->Stream = fopen(cFileName, "rt"); + + if (!cube->FileStack[0]->Stream) goto Done; + + strncpy(cube->FileStack[0]->FileName, cFileName, cmsMAX_PATH - 1); + cube->FileStack[0]->FileName[cmsMAX_PATH - 1] = 0; + + if (!ParseCube(cube, &Shaper, &CLUT, title)) goto Done; + + // Success on parsing, let's create the profile + hProfile = cmsCreateProfilePlaceholder(ContextID); + if (!hProfile) goto Done; + + cmsSetProfileVersion(hProfile, 4.4); + + cmsSetDeviceClass(hProfile, cmsSigLinkClass); + cmsSetColorSpace(hProfile, cmsSigRgbData); + cmsSetPCS(hProfile, cmsSigRgbData); + + cmsSetHeaderRenderingIntent(hProfile, INTENT_PERCEPTUAL); + + // Creates a Pipeline to hold CLUT and shaper + Pipeline = cmsPipelineAlloc(ContextID, 3, 3); + if (Pipeline == NULL) goto Done; + + // Populates the pipeline + if (Shaper != NULL) { + if (!cmsPipelineInsertStage(Pipeline, cmsAT_BEGIN, Shaper)) { + cmsStageFree(Shaper); + goto Done; + } + } + + if (CLUT != NULL) { + if (!cmsPipelineInsertStage(Pipeline, cmsAT_END, CLUT)) { + cmsStageFree(CLUT); + goto Done; + } + } + + // Propagate the description. We put no copyright because we know + // nothing on the copyrighted state of the .cube + DescriptionMLU = cmsMLUalloc(ContextID, 1); + if (!cmsMLUsetUTF8(DescriptionMLU, cmsNoLanguage, cmsNoCountry, title)) goto Done; + + // Flush the tags + if (!cmsWriteTag(hProfile, cmsSigProfileDescriptionTag, DescriptionMLU)) goto Done; + if (!cmsWriteTag(hProfile, cmsSigAToB0Tag, (void*)Pipeline)) goto Done; + +Done: + + if (DescriptionMLU != NULL) + cmsMLUfree(DescriptionMLU); + + if (Pipeline != NULL) + cmsPipelineFree(Pipeline); + + cmsIT8Free((cmsHANDLE) cube); + + return hProfile; +} + +cmsHPROFILE CMSEXPORT cmsCreateDeviceLinkFromCubeFile(const char* cFileName) +{ + return cmsCreateDeviceLinkFromCubeFileTHR(NULL, cFileName); +} diff --git a/local/recipes/libs/lcms2/source/src/cmscnvrt.c b/local/recipes/libs/lcms2/source/src/cmscnvrt.c new file mode 100644 index 0000000000..ec1678ca26 --- /dev/null +++ b/local/recipes/libs/lcms2/source/src/cmscnvrt.c @@ -0,0 +1,1226 @@ +//--------------------------------------------------------------------------------- +// +// Little Color Management System +// Copyright (c) 1998-2026 Marti Maria Saguer +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//--------------------------------------------------------------------------------- +// + +#include "lcms2_internal.h" + + +// This is the default routine for ICC-style intents. A user may decide to override it by using a plugin. +// Supported intents are perceptual, relative colorimetric, saturation and ICC-absolute colorimetric +static +cmsPipeline* DefaultICCintents(cmsContext ContextID, + cmsUInt32Number nProfiles, + cmsUInt32Number Intents[], + cmsHPROFILE hProfiles[], + cmsBool BPC[], + cmsFloat64Number AdaptationStates[], + cmsUInt32Number dwFlags); + +//--------------------------------------------------------------------------------- + +// This is the entry for black-preserving K-only intents, which are non-ICC. Last profile have to be a output profile +// to do the trick (no devicelinks allowed at that position) +static +cmsPipeline* BlackPreservingKOnlyIntents(cmsContext ContextID, + cmsUInt32Number nProfiles, + cmsUInt32Number Intents[], + cmsHPROFILE hProfiles[], + cmsBool BPC[], + cmsFloat64Number AdaptationStates[], + cmsUInt32Number dwFlags); + +//--------------------------------------------------------------------------------- + +// This is the entry for black-plane preserving, which are non-ICC. Again, Last profile have to be a output profile +// to do the trick (no devicelinks allowed at that position) +static +cmsPipeline* BlackPreservingKPlaneIntents(cmsContext ContextID, + cmsUInt32Number nProfiles, + cmsUInt32Number Intents[], + cmsHPROFILE hProfiles[], + cmsBool BPC[], + cmsFloat64Number AdaptationStates[], + cmsUInt32Number dwFlags); + +//--------------------------------------------------------------------------------- + + +// This is a structure holding implementations for all supported intents. +typedef struct _cms_intents_list { + + cmsUInt32Number Intent; + char Description[256]; + cmsIntentFn Link; + struct _cms_intents_list* Next; + +} cmsIntentsList; + + +// Built-in intents +static cmsIntentsList DefaultIntents[] = { + + { INTENT_PERCEPTUAL, "Perceptual", DefaultICCintents, &DefaultIntents[1] }, + { INTENT_RELATIVE_COLORIMETRIC, "Relative colorimetric", DefaultICCintents, &DefaultIntents[2] }, + { INTENT_SATURATION, "Saturation", DefaultICCintents, &DefaultIntents[3] }, + { INTENT_ABSOLUTE_COLORIMETRIC, "Absolute colorimetric", DefaultICCintents, &DefaultIntents[4] }, + { INTENT_PRESERVE_K_ONLY_PERCEPTUAL, "Perceptual preserving black ink", BlackPreservingKOnlyIntents, &DefaultIntents[5] }, + { INTENT_PRESERVE_K_ONLY_RELATIVE_COLORIMETRIC, "Relative colorimetric preserving black ink", BlackPreservingKOnlyIntents, &DefaultIntents[6] }, + { INTENT_PRESERVE_K_ONLY_SATURATION, "Saturation preserving black ink", BlackPreservingKOnlyIntents, &DefaultIntents[7] }, + { INTENT_PRESERVE_K_PLANE_PERCEPTUAL, "Perceptual preserving black plane", BlackPreservingKPlaneIntents, &DefaultIntents[8] }, + { INTENT_PRESERVE_K_PLANE_RELATIVE_COLORIMETRIC,"Relative colorimetric preserving black plane", BlackPreservingKPlaneIntents, &DefaultIntents[9] }, + { INTENT_PRESERVE_K_PLANE_SATURATION, "Saturation preserving black plane", BlackPreservingKPlaneIntents, NULL } +}; + + +// A pointer to the beginning of the list +_cmsIntentsPluginChunkType _cmsIntentsPluginChunk = { NULL }; + +// Duplicates the zone of memory used by the plug-in in the new context +static +void DupPluginIntentsList(struct _cmsContext_struct* ctx, + const struct _cmsContext_struct* src) +{ + _cmsIntentsPluginChunkType newHead = { NULL }; + cmsIntentsList* entry; + cmsIntentsList* Anterior = NULL; + _cmsIntentsPluginChunkType* head = (_cmsIntentsPluginChunkType*) src->chunks[IntentPlugin]; + + // Walk the list copying all nodes + for (entry = head->Intents; + entry != NULL; + entry = entry ->Next) { + + cmsIntentsList *newEntry = ( cmsIntentsList *) _cmsSubAllocDup(ctx ->MemPool, entry, sizeof(cmsIntentsList)); + + if (newEntry == NULL) + return; + + // We want to keep the linked list order, so this is a little bit tricky + newEntry -> Next = NULL; + if (Anterior) + Anterior -> Next = newEntry; + + Anterior = newEntry; + + if (newHead.Intents == NULL) + newHead.Intents = newEntry; + } + + ctx ->chunks[IntentPlugin] = _cmsSubAllocDup(ctx->MemPool, &newHead, sizeof(_cmsIntentsPluginChunkType)); +} + +void _cmsAllocIntentsPluginChunk(struct _cmsContext_struct* ctx, + const struct _cmsContext_struct* src) +{ + if (src != NULL) { + + // Copy all linked list + DupPluginIntentsList(ctx, src); + } + else { + static _cmsIntentsPluginChunkType IntentsPluginChunkType = { NULL }; + ctx ->chunks[IntentPlugin] = _cmsSubAllocDup(ctx ->MemPool, &IntentsPluginChunkType, sizeof(_cmsIntentsPluginChunkType)); + } +} + + +// Search the list for a suitable intent. Returns NULL if not found +static +cmsIntentsList* SearchIntent(cmsContext ContextID, cmsUInt32Number Intent) +{ + _cmsIntentsPluginChunkType* ctx = ( _cmsIntentsPluginChunkType*) _cmsContextGetClientChunk(ContextID, IntentPlugin); + cmsIntentsList* pt; + + for (pt = ctx -> Intents; pt != NULL; pt = pt -> Next) + if (pt ->Intent == Intent) return pt; + + for (pt = DefaultIntents; pt != NULL; pt = pt -> Next) + if (pt ->Intent == Intent) return pt; + + return NULL; +} + +// Black point compensation. Implemented as a linear scaling in XYZ. Black points +// should come relative to the white point. Fills an matrix/offset element m +// which is organized as a 4x4 matrix. +static +void ComputeBlackPointCompensation(const cmsCIEXYZ* BlackPointIn, + const cmsCIEXYZ* BlackPointOut, + cmsMAT3* m, cmsVEC3* off) +{ + cmsFloat64Number ax, ay, az, bx, by, bz, tx, ty, tz; + + // Now we need to compute a matrix plus an offset m and of such of + // [m]*bpin + off = bpout + // [m]*D50 + off = D50 + // + // This is a linear scaling in the form ax+b, where + // a = (bpout - D50) / (bpin - D50) + // b = - D50* (bpout - bpin) / (bpin - D50) + + tx = BlackPointIn->X - cmsD50_XYZ()->X; + ty = BlackPointIn->Y - cmsD50_XYZ()->Y; + tz = BlackPointIn->Z - cmsD50_XYZ()->Z; + + ax = (BlackPointOut->X - cmsD50_XYZ()->X) / tx; + ay = (BlackPointOut->Y - cmsD50_XYZ()->Y) / ty; + az = (BlackPointOut->Z - cmsD50_XYZ()->Z) / tz; + + bx = - cmsD50_XYZ()-> X * (BlackPointOut->X - BlackPointIn->X) / tx; + by = - cmsD50_XYZ()-> Y * (BlackPointOut->Y - BlackPointIn->Y) / ty; + bz = - cmsD50_XYZ()-> Z * (BlackPointOut->Z - BlackPointIn->Z) / tz; + + _cmsVEC3init(&m ->v[0], ax, 0, 0); + _cmsVEC3init(&m ->v[1], 0, ay, 0); + _cmsVEC3init(&m ->v[2], 0, 0, az); + _cmsVEC3init(off, bx, by, bz); + +} + + +// Approximate a blackbody illuminant based on CHAD information +static +cmsFloat64Number CHAD2Temp(const cmsMAT3* Chad) +{ + // Convert D50 across inverse CHAD to get the absolute white point + cmsVEC3 d, s; + cmsCIEXYZ Dest; + cmsCIExyY DestChromaticity; + cmsFloat64Number TempK; + cmsMAT3 m1, m2; + + m1 = *Chad; + if (!_cmsMAT3inverse(&m1, &m2)) return FALSE; + + s.n[VX] = cmsD50_XYZ() -> X; + s.n[VY] = cmsD50_XYZ() -> Y; + s.n[VZ] = cmsD50_XYZ() -> Z; + + _cmsMAT3eval(&d, &m2, &s); + + Dest.X = d.n[VX]; + Dest.Y = d.n[VY]; + Dest.Z = d.n[VZ]; + + cmsXYZ2xyY(&DestChromaticity, &Dest); + + if (!cmsTempFromWhitePoint(&TempK, &DestChromaticity)) + return -1.0; + + return TempK; +} + +// Compute a CHAD based on a given temperature +static +void Temp2CHAD(cmsMAT3* Chad, cmsFloat64Number Temp) +{ + cmsCIEXYZ White; + cmsCIExyY ChromaticityOfWhite; + + cmsWhitePointFromTemp(&ChromaticityOfWhite, Temp); + cmsxyY2XYZ(&White, &ChromaticityOfWhite); + _cmsAdaptationMatrix(Chad, NULL, &White, cmsD50_XYZ()); +} + +// Join scalings to obtain relative input to absolute and then to relative output. +// Result is stored in a 3x3 matrix +static +cmsBool ComputeAbsoluteIntent(cmsFloat64Number AdaptationState, + const cmsCIEXYZ* WhitePointIn, + const cmsMAT3* ChromaticAdaptationMatrixIn, + const cmsCIEXYZ* WhitePointOut, + const cmsMAT3* ChromaticAdaptationMatrixOut, + cmsMAT3* m) +{ + cmsMAT3 Scale, m1, m2, m3, m4; + + // TODO: Follow Marc Mahy's recommendation to check if CHAD is same by using M1*M2 == M2*M1. If so, do nothing. + // TODO: Add support for ArgyllArts tag + + // Adaptation state + if (AdaptationState == 1.0) { + + // Observer is fully adapted. Keep chromatic adaptation. + // That is the standard V4 behaviour + _cmsVEC3init(&m->v[0], WhitePointIn->X / WhitePointOut->X, 0, 0); + _cmsVEC3init(&m->v[1], 0, WhitePointIn->Y / WhitePointOut->Y, 0); + _cmsVEC3init(&m->v[2], 0, 0, WhitePointIn->Z / WhitePointOut->Z); + + } + else { + + // Incomplete adaptation. This is an advanced feature. + _cmsVEC3init(&Scale.v[0], WhitePointIn->X / WhitePointOut->X, 0, 0); + _cmsVEC3init(&Scale.v[1], 0, WhitePointIn->Y / WhitePointOut->Y, 0); + _cmsVEC3init(&Scale.v[2], 0, 0, WhitePointIn->Z / WhitePointOut->Z); + + + if (AdaptationState == 0.0) { + + m1 = *ChromaticAdaptationMatrixOut; + _cmsMAT3per(&m2, &m1, &Scale); + // m2 holds CHAD from output white to D50 times abs. col. scaling + + // Observer is not adapted, undo the chromatic adaptation + _cmsMAT3per(m, &m2, ChromaticAdaptationMatrixOut); + + m3 = *ChromaticAdaptationMatrixIn; + if (!_cmsMAT3inverse(&m3, &m4)) return FALSE; + _cmsMAT3per(m, &m2, &m4); + + } else { + + cmsMAT3 MixedCHAD; + cmsFloat64Number TempSrc, TempDest, Temp; + + m1 = *ChromaticAdaptationMatrixIn; + if (!_cmsMAT3inverse(&m1, &m2)) return FALSE; + _cmsMAT3per(&m3, &m2, &Scale); + // m3 holds CHAD from input white to D50 times abs. col. scaling + + TempSrc = CHAD2Temp(ChromaticAdaptationMatrixIn); + TempDest = CHAD2Temp(ChromaticAdaptationMatrixOut); + + if (TempSrc < 0.0 || TempDest < 0.0) return FALSE; // Something went wrong + + if (_cmsMAT3isIdentity(&Scale) && fabs(TempSrc - TempDest) < 0.01) { + + _cmsMAT3identity(m); + return TRUE; + } + + Temp = (1.0 - AdaptationState) * TempDest + AdaptationState * TempSrc; + + // Get a CHAD from whatever output temperature to D50. This replaces output CHAD + Temp2CHAD(&MixedCHAD, Temp); + + _cmsMAT3per(m, &m3, &MixedCHAD); + } + + } + return TRUE; + +} + +// Just to see if m matrix should be applied +static +cmsBool IsEmptyLayer(cmsMAT3* m, cmsVEC3* off) +{ + cmsFloat64Number diff = 0; + cmsMAT3 Ident; + int i; + + if (m == NULL && off == NULL) return TRUE; // NULL is allowed as an empty layer + if (m == NULL && off != NULL) return FALSE; // This is an internal error + + _cmsMAT3identity(&Ident); + + for (i=0; i < 3*3; i++) + diff += fabs(((cmsFloat64Number*)m)[i] - ((cmsFloat64Number*)&Ident)[i]); + + for (i=0; i < 3; i++) + diff += fabs(((cmsFloat64Number*)off)[i]); + + + return (diff < 0.002); +} + + +// Compute the conversion layer +static +cmsBool ComputeConversion(cmsUInt32Number i, + cmsHPROFILE hProfiles[], + cmsUInt32Number Intent, + cmsBool BPC, + cmsFloat64Number AdaptationState, + cmsMAT3* m, cmsVEC3* off) +{ + + int k; + + // m and off are set to identity and this is detected latter on + _cmsMAT3identity(m); + _cmsVEC3init(off, 0, 0, 0); + + // If intent is abs. colorimetric, + if (Intent == INTENT_ABSOLUTE_COLORIMETRIC) { + + cmsCIEXYZ WhitePointIn, WhitePointOut; + cmsMAT3 ChromaticAdaptationMatrixIn, ChromaticAdaptationMatrixOut; + + if (!_cmsReadMediaWhitePoint(&WhitePointIn, hProfiles[i - 1])) return FALSE; + if (!_cmsReadCHAD(&ChromaticAdaptationMatrixIn, hProfiles[i - 1])) return FALSE; + + if (!_cmsReadMediaWhitePoint(&WhitePointOut, hProfiles[i])) return FALSE; + if (!_cmsReadCHAD(&ChromaticAdaptationMatrixOut, hProfiles[i])) return FALSE; + + if (!ComputeAbsoluteIntent(AdaptationState, + &WhitePointIn, &ChromaticAdaptationMatrixIn, + &WhitePointOut, &ChromaticAdaptationMatrixOut, m)) return FALSE; + + } + else { + // Rest of intents may apply BPC. + + if (BPC) { + + cmsCIEXYZ BlackPointIn = { 0, 0, 0}, BlackPointOut = { 0, 0, 0 }; + + cmsDetectBlackPoint(&BlackPointIn, hProfiles[i-1], Intent, 0); + cmsDetectDestinationBlackPoint(&BlackPointOut, hProfiles[i], Intent, 0); + + // If black points are equal, then do nothing + if (BlackPointIn.X != BlackPointOut.X || + BlackPointIn.Y != BlackPointOut.Y || + BlackPointIn.Z != BlackPointOut.Z) + ComputeBlackPointCompensation(&BlackPointIn, &BlackPointOut, m, off); + } + } + + // Offset should be adjusted because the encoding. We encode XYZ normalized to 0..1.0, + // to do that, we divide by MAX_ENCODEABLE_XZY. The conversion stage goes XYZ -> XYZ so + // we have first to convert from encoded to XYZ and then convert back to encoded. + // y = Mx + Off + // x = x'c + // y = M x'c + Off + // y = y'c; y' = y / c + // y' = (Mx'c + Off) /c = Mx' + (Off / c) + + for (k=0; k < 3; k++) { + off ->n[k] /= MAX_ENCODEABLE_XYZ; + } + + return TRUE; +} + + +// Add a conversion stage if needed. If a matrix/offset m is given, it applies to XYZ space +static +cmsBool AddConversion(cmsPipeline* Result, cmsColorSpaceSignature InPCS, cmsColorSpaceSignature OutPCS, cmsMAT3* m, cmsVEC3* off) +{ + cmsFloat64Number* m_as_dbl = (cmsFloat64Number*) m; + cmsFloat64Number* off_as_dbl = (cmsFloat64Number*) off; + + // Handle PCS mismatches. A specialized stage is added to the LUT in such case + switch (InPCS) { + + case cmsSigXYZData: // Input profile operates in XYZ + + switch (OutPCS) { + + case cmsSigXYZData: // XYZ -> XYZ + if (!IsEmptyLayer(m, off) && + !cmsPipelineInsertStage(Result, cmsAT_END, cmsStageAllocMatrix(Result ->ContextID, 3, 3, m_as_dbl, off_as_dbl))) + return FALSE; + break; + + case cmsSigLabData: // XYZ -> Lab + if (!IsEmptyLayer(m, off) && + !cmsPipelineInsertStage(Result, cmsAT_END, cmsStageAllocMatrix(Result ->ContextID, 3, 3, m_as_dbl, off_as_dbl))) + return FALSE; + if (!cmsPipelineInsertStage(Result, cmsAT_END, _cmsStageAllocXYZ2Lab(Result ->ContextID))) + return FALSE; + break; + + default: + return FALSE; // Colorspace mismatch + } + break; + + case cmsSigLabData: // Input profile operates in Lab + + switch (OutPCS) { + + case cmsSigXYZData: // Lab -> XYZ + + if (!cmsPipelineInsertStage(Result, cmsAT_END, _cmsStageAllocLab2XYZ(Result ->ContextID))) + return FALSE; + if (!IsEmptyLayer(m, off) && + !cmsPipelineInsertStage(Result, cmsAT_END, cmsStageAllocMatrix(Result ->ContextID, 3, 3, m_as_dbl, off_as_dbl))) + return FALSE; + break; + + case cmsSigLabData: // Lab -> Lab + + if (!IsEmptyLayer(m, off)) { + if (!cmsPipelineInsertStage(Result, cmsAT_END, _cmsStageAllocLab2XYZ(Result ->ContextID)) || + !cmsPipelineInsertStage(Result, cmsAT_END, cmsStageAllocMatrix(Result ->ContextID, 3, 3, m_as_dbl, off_as_dbl)) || + !cmsPipelineInsertStage(Result, cmsAT_END, _cmsStageAllocXYZ2Lab(Result ->ContextID))) + return FALSE; + } + break; + + default: + return FALSE; // Mismatch + } + break; + + // On colorspaces other than PCS, check for same space + default: + if (InPCS != OutPCS) return FALSE; + break; + } + + return TRUE; +} + + +// Is a given space compatible with another? +static +cmsBool ColorSpaceIsCompatible(cmsColorSpaceSignature a, cmsColorSpaceSignature b) +{ + // If they are same, they are compatible. + if (a == b) return TRUE; + + // Check for MCH4 substitution of CMYK + if ((a == cmsSig4colorData) && (b == cmsSigCmykData)) return TRUE; + if ((a == cmsSigCmykData) && (b == cmsSig4colorData)) return TRUE; + + // Check for XYZ/Lab. Those spaces are interchangeable as they can be computed one from other. + if ((a == cmsSigXYZData) && (b == cmsSigLabData)) return TRUE; + if ((a == cmsSigLabData) && (b == cmsSigXYZData)) return TRUE; + + return FALSE; +} + + +// Default handler for ICC-style intents +static +cmsPipeline* DefaultICCintents(cmsContext ContextID, + cmsUInt32Number nProfiles, + cmsUInt32Number TheIntents[], + cmsHPROFILE hProfiles[], + cmsBool BPC[], + cmsFloat64Number AdaptationStates[], + cmsUInt32Number dwFlags) +{ + cmsPipeline* Lut = NULL; + cmsPipeline* Result; + cmsHPROFILE hProfile; + cmsMAT3 m; + cmsVEC3 off; + cmsColorSpaceSignature ColorSpaceIn, ColorSpaceOut = cmsSigLabData, CurrentColorSpace; + cmsProfileClassSignature ClassSig; + cmsUInt32Number i, Intent; + + // For safety + if (nProfiles == 0) return NULL; + + // Allocate an empty LUT for holding the result. 0 as channel count means 'undefined' + Result = cmsPipelineAlloc(ContextID, 0, 0); + if (Result == NULL) return NULL; + + CurrentColorSpace = cmsGetColorSpace(hProfiles[0]); + + for (i=0; i < nProfiles; i++) { + + cmsBool lIsDeviceLink, lIsInput; + + hProfile = hProfiles[i]; + ClassSig = cmsGetDeviceClass(hProfile); + lIsDeviceLink = (ClassSig == cmsSigLinkClass || ClassSig == cmsSigAbstractClass ); + + // First profile is used as input unless devicelink or abstract + if ((i == 0) && !lIsDeviceLink) { + lIsInput = TRUE; + } + else { + // Else use profile in the input direction if current space is not PCS + lIsInput = (CurrentColorSpace != cmsSigXYZData) && + (CurrentColorSpace != cmsSigLabData); + } + + Intent = TheIntents[i]; + + if (lIsInput || lIsDeviceLink) { + + ColorSpaceIn = cmsGetColorSpace(hProfile); + ColorSpaceOut = cmsGetPCS(hProfile); + } + else { + + ColorSpaceIn = cmsGetPCS(hProfile); + ColorSpaceOut = cmsGetColorSpace(hProfile); + } + + if (!ColorSpaceIsCompatible(ColorSpaceIn, CurrentColorSpace)) { + + cmsSignalError(ContextID, cmsERROR_COLORSPACE_CHECK, "ColorSpace mismatch"); + goto Error; + } + + // If devicelink is found, then no custom intent is allowed and we can + // read the LUT to be applied. Settings don't apply here. + if (lIsDeviceLink || ((ClassSig == cmsSigNamedColorClass) && (nProfiles == 1))) { + + // Get the involved LUT from the profile + Lut = _cmsReadDevicelinkLUT(hProfile, Intent); + if (Lut == NULL) goto Error; + + // What about abstract profiles? + if (ClassSig == cmsSigAbstractClass && i > 0) { + if (!ComputeConversion(i, hProfiles, Intent, BPC[i], AdaptationStates[i], &m, &off)) goto Error; + } + else { + _cmsMAT3identity(&m); + _cmsVEC3init(&off, 0, 0, 0); + } + + + if (!AddConversion(Result, CurrentColorSpace, ColorSpaceIn, &m, &off)) goto Error; + + } + else { + + if (lIsInput) { + // Input direction means non-pcs connection, so proceed like devicelinks + Lut = _cmsReadInputLUT(hProfile, Intent); + if (Lut == NULL) goto Error; + } + else { + + // Output direction means PCS connection. Intent may apply here + Lut = _cmsReadOutputLUT(hProfile, Intent); + if (Lut == NULL) goto Error; + + + if (!ComputeConversion(i, hProfiles, Intent, BPC[i], AdaptationStates[i], &m, &off)) goto Error; + if (!AddConversion(Result, CurrentColorSpace, ColorSpaceIn, &m, &off)) goto Error; + + } + } + + // Concatenate to the output LUT + if (!cmsPipelineCat(Result, Lut)) + goto Error; + + cmsPipelineFree(Lut); + Lut = NULL; + + // Update current space + CurrentColorSpace = ColorSpaceOut; + } + + // Check for non-negatives clip + if (dwFlags & cmsFLAGS_NONEGATIVES) { + + if (ColorSpaceOut == cmsSigGrayData || + ColorSpaceOut == cmsSigRgbData || + ColorSpaceOut == cmsSigCmykData) { + + cmsStage* clip = _cmsStageClipNegatives(Result->ContextID, cmsChannelsOfColorSpace(ColorSpaceOut)); + if (clip == NULL) goto Error; + + if (!cmsPipelineInsertStage(Result, cmsAT_END, clip)) + goto Error; + } + + } + + return Result; + +Error: + + if (Lut != NULL) cmsPipelineFree(Lut); + if (Result != NULL) cmsPipelineFree(Result); + return NULL; + + cmsUNUSED_PARAMETER(dwFlags); +} + + +// Wrapper for DLL calling convention +cmsPipeline* CMSEXPORT _cmsDefaultICCintents(cmsContext ContextID, + cmsUInt32Number nProfiles, + cmsUInt32Number TheIntents[], + cmsHPROFILE hProfiles[], + cmsBool BPC[], + cmsFloat64Number AdaptationStates[], + cmsUInt32Number dwFlags) +{ + return DefaultICCintents(ContextID, nProfiles, TheIntents, hProfiles, BPC, AdaptationStates, dwFlags); +} + +// Black preserving intents --------------------------------------------------------------------------------------------- + +// Translate black-preserving intents to ICC ones +static +cmsUInt32Number TranslateNonICCIntents(cmsUInt32Number Intent) +{ + switch (Intent) { + case INTENT_PRESERVE_K_ONLY_PERCEPTUAL: + case INTENT_PRESERVE_K_PLANE_PERCEPTUAL: + return INTENT_PERCEPTUAL; + + case INTENT_PRESERVE_K_ONLY_RELATIVE_COLORIMETRIC: + case INTENT_PRESERVE_K_PLANE_RELATIVE_COLORIMETRIC: + return INTENT_RELATIVE_COLORIMETRIC; + + case INTENT_PRESERVE_K_ONLY_SATURATION: + case INTENT_PRESERVE_K_PLANE_SATURATION: + return INTENT_SATURATION; + + default: return Intent; + } +} + +// Sampler for Black-only preserving CMYK->CMYK transforms + +typedef struct { + cmsPipeline* cmyk2cmyk; // The original transform + cmsToneCurve* KTone; // Black-to-black tone curve + +} GrayOnlyParams; + + +// Preserve black only if that is the only ink used +static +int BlackPreservingGrayOnlySampler(CMSREGISTER const cmsUInt16Number In[], CMSREGISTER cmsUInt16Number Out[], CMSREGISTER void* Cargo) +{ + GrayOnlyParams* bp = (GrayOnlyParams*) Cargo; + + // If going across black only, keep black only + if (In[0] == 0 && In[1] == 0 && In[2] == 0) { + + // TAC does not apply because it is black ink! + Out[0] = Out[1] = Out[2] = 0; + Out[3] = cmsEvalToneCurve16(bp->KTone, In[3]); + return TRUE; + } + + // Keep normal transform for other colors + bp ->cmyk2cmyk ->Eval16Fn(In, Out, bp ->cmyk2cmyk->Data); + return TRUE; +} + + +// Check whatever the profile is a CMYK->CMYK devicelink +static +cmsBool is_cmyk_devicelink(cmsHPROFILE hProfile) +{ + return cmsGetDeviceClass(hProfile) == cmsSigLinkClass && + cmsGetColorSpace(hProfile) == cmsSigCmykData; +} + +// This is the entry for black-preserving K-only intents, which are non-ICC +static +cmsPipeline* BlackPreservingKOnlyIntents(cmsContext ContextID, + cmsUInt32Number nProfiles, + cmsUInt32Number TheIntents[], + cmsHPROFILE hProfiles[], + cmsBool BPC[], + cmsFloat64Number AdaptationStates[], + cmsUInt32Number dwFlags) +{ + GrayOnlyParams bp; + cmsPipeline* Result; + cmsUInt32Number ICCIntents[256]; + cmsStage* CLUT; + cmsUInt32Number i, nGridPoints; + cmsUInt32Number lastProfilePos; + cmsUInt32Number preservationProfilesCount; + cmsHPROFILE hLastProfile; + + + // Sanity check + if (nProfiles < 1 || nProfiles > 255) return NULL; + + // Translate black-preserving intents to ICC ones + for (i=0; i < nProfiles; i++) + ICCIntents[i] = TranslateNonICCIntents(TheIntents[i]); + + + // Trim all CMYK devicelinks at the end + lastProfilePos = nProfiles - 1; + hLastProfile = hProfiles[lastProfilePos]; + + // Skip CMYK->CMYK devicelinks on ending + while (is_cmyk_devicelink(hLastProfile)) + { + if (lastProfilePos < 2) + break; + + hLastProfile = hProfiles[--lastProfilePos]; + } + + + preservationProfilesCount = lastProfilePos + 1; + + // Check for non-cmyk profiles + if (cmsGetColorSpace(hProfiles[0]) != cmsSigCmykData || + !(cmsGetColorSpace(hLastProfile) == cmsSigCmykData || + cmsGetDeviceClass(hLastProfile) == cmsSigOutputClass)) + return DefaultICCintents(ContextID, nProfiles, ICCIntents, hProfiles, BPC, AdaptationStates, dwFlags); + + // Allocate an empty LUT for holding the result + Result = cmsPipelineAlloc(ContextID, 4, 4); + if (Result == NULL) return NULL; + + memset(&bp, 0, sizeof(bp)); + + // Create a LUT holding normal ICC transform + bp.cmyk2cmyk = DefaultICCintents(ContextID, + preservationProfilesCount, + ICCIntents, + hProfiles, + BPC, + AdaptationStates, + dwFlags); + + if (bp.cmyk2cmyk == NULL) goto Error; + + // Now, compute the tone curve + bp.KTone = _cmsBuildKToneCurve(ContextID, + 4096, + preservationProfilesCount, + ICCIntents, + hProfiles, + BPC, + AdaptationStates, + dwFlags); + + if (bp.KTone == NULL) goto Error; + + + // How many gridpoints are we going to use? + nGridPoints = _cmsReasonableGridpointsByColorspace(cmsSigCmykData, dwFlags); + + // Create the CLUT. 16 bits + CLUT = cmsStageAllocCLut16bit(ContextID, nGridPoints, 4, 4, NULL); + if (CLUT == NULL) goto Error; + + // This is the one and only MPE in this LUT + if (!cmsPipelineInsertStage(Result, cmsAT_BEGIN, CLUT)) + goto Error; + + // Sample it. We cannot afford pre/post linearization this time. + if (!cmsStageSampleCLut16bit(CLUT, BlackPreservingGrayOnlySampler, (void*) &bp, 0)) + goto Error; + + + // Insert possible devicelinks at the end + for (i = lastProfilePos + 1; i < nProfiles; i++) + { + cmsPipeline* devlink = _cmsReadDevicelinkLUT(hProfiles[i], ICCIntents[i]); + if (devlink == NULL) + goto Error; + + if (!cmsPipelineCat(Result, devlink)) + goto Error; + } + + + // Get rid of xform and tone curve + cmsPipelineFree(bp.cmyk2cmyk); + cmsFreeToneCurve(bp.KTone); + + return Result; + +Error: + + if (bp.cmyk2cmyk != NULL) cmsPipelineFree(bp.cmyk2cmyk); + if (bp.KTone != NULL) cmsFreeToneCurve(bp.KTone); + if (Result != NULL) cmsPipelineFree(Result); + return NULL; + +} + +// K Plane-preserving CMYK to CMYK ------------------------------------------------------------------------------------ + +typedef struct { + + cmsPipeline* cmyk2cmyk; // The original transform + cmsHTRANSFORM hProofOutput; // Output CMYK to Lab (last profile) + cmsHTRANSFORM cmyk2Lab; // The input chain + cmsToneCurve* KTone; // Black-to-black tone curve + cmsPipeline* LabK2cmyk; // The output profile + cmsFloat64Number MaxError; + + cmsHTRANSFORM hRoundTrip; + cmsFloat64Number MaxTAC; + + +} PreserveKPlaneParams; + + +// The CLUT will be stored at 16 bits, but calculations are performed at cmsFloat32Number precision +static +int BlackPreservingSampler(CMSREGISTER const cmsUInt16Number In[], CMSREGISTER cmsUInt16Number Out[], CMSREGISTER void* Cargo) +{ + int i; + cmsFloat32Number Inf[4], Outf[4]; + cmsFloat32Number LabK[4]; + cmsFloat64Number SumCMY, SumCMYK, Error, Ratio; + cmsCIELab ColorimetricLab, BlackPreservingLab; + PreserveKPlaneParams* bp = (PreserveKPlaneParams*) Cargo; + + // Convert from 16 bits to floating point + for (i=0; i < 4; i++) + Inf[i] = (cmsFloat32Number) (In[i] / 65535.0); + + // Get the K across Tone curve + LabK[3] = cmsEvalToneCurveFloat(bp ->KTone, Inf[3]); + + // If going across black only, keep black only + if (In[0] == 0 && In[1] == 0 && In[2] == 0) { + + Out[0] = Out[1] = Out[2] = 0; + Out[3] = _cmsQuickSaturateWord(LabK[3] * 65535.0); + return TRUE; + } + + // Try the original transform, + cmsPipelineEvalFloat(Inf, Outf, bp ->cmyk2cmyk); + + // Store a copy of the floating point result into 16-bit + for (i=0; i < 4; i++) + Out[i] = _cmsQuickSaturateWord(Outf[i] * 65535.0); + + // Maybe K is already ok (mostly on K=0) + if (fabsf(Outf[3] - LabK[3]) < (3.0 / 65535.0)) { + return TRUE; + } + + // K differ, measure and keep Lab measurement for further usage + // this is done in relative colorimetric intent + cmsDoTransform(bp->hProofOutput, Out, &ColorimetricLab, 1); + + // Is not black only and the transform doesn't keep black. + // Obtain the Lab of output CMYK. After that we have Lab + K + cmsDoTransform(bp ->cmyk2Lab, Outf, LabK, 1); + + // Obtain the corresponding CMY using reverse interpolation + // (K is fixed in LabK[3]) + if (!cmsPipelineEvalReverseFloat(LabK, Outf, Outf, bp ->LabK2cmyk)) { + + // Cannot find a suitable value, so use colorimetric xform + // which is already stored in Out[] + return TRUE; + } + + // Make sure to pass through K (which now is fixed) + Outf[3] = LabK[3]; + + // Apply TAC if needed + SumCMY = (cmsFloat64Number) Outf[0] + Outf[1] + Outf[2]; + SumCMYK = SumCMY + Outf[3]; + + if (SumCMYK > bp ->MaxTAC) { + + Ratio = 1 - ((SumCMYK - bp->MaxTAC) / SumCMY); + if (Ratio < 0) + Ratio = 0; + } + else + Ratio = 1.0; + + Out[0] = _cmsQuickSaturateWord(Outf[0] * Ratio * 65535.0); // C + Out[1] = _cmsQuickSaturateWord(Outf[1] * Ratio * 65535.0); // M + Out[2] = _cmsQuickSaturateWord(Outf[2] * Ratio * 65535.0); // Y + Out[3] = _cmsQuickSaturateWord(Outf[3] * 65535.0); + + // Estimate the error (this goes 16 bits to Lab DBL) + cmsDoTransform(bp->hProofOutput, Out, &BlackPreservingLab, 1); + Error = cmsDeltaE(&ColorimetricLab, &BlackPreservingLab); + if (Error > bp -> MaxError) + bp->MaxError = Error; + + return TRUE; +} + + + +// This is the entry for black-plane preserving, which are non-ICC +static +cmsPipeline* BlackPreservingKPlaneIntents(cmsContext ContextID, + cmsUInt32Number nProfiles, + cmsUInt32Number TheIntents[], + cmsHPROFILE hProfiles[], + cmsBool BPC[], + cmsFloat64Number AdaptationStates[], + cmsUInt32Number dwFlags) +{ + PreserveKPlaneParams bp; + + cmsPipeline* Result = NULL; + cmsUInt32Number ICCIntents[256]; + cmsStage* CLUT; + cmsUInt32Number i, nGridPoints; + cmsUInt32Number lastProfilePos; + cmsUInt32Number preservationProfilesCount; + cmsHPROFILE hLastProfile; + cmsHPROFILE hLab; + + // Sanity check + if (nProfiles < 1 || nProfiles > 255) return NULL; + + // Translate black-preserving intents to ICC ones + for (i=0; i < nProfiles; i++) + ICCIntents[i] = TranslateNonICCIntents(TheIntents[i]); + + // Trim all CMYK devicelinks at the end + lastProfilePos = nProfiles - 1; + hLastProfile = hProfiles[lastProfilePos]; + + // Skip CMYK->CMYK devicelinks on ending + while (is_cmyk_devicelink(hLastProfile)) + { + if (lastProfilePos < 2) + break; + + hLastProfile = hProfiles[--lastProfilePos]; + } + + preservationProfilesCount = lastProfilePos + 1; + + // Check for non-cmyk profiles + if (cmsGetColorSpace(hProfiles[0]) != cmsSigCmykData || + !(cmsGetColorSpace(hLastProfile) == cmsSigCmykData || + cmsGetDeviceClass(hLastProfile) == cmsSigOutputClass)) + return DefaultICCintents(ContextID, nProfiles, ICCIntents, hProfiles, BPC, AdaptationStates, dwFlags); + + // Allocate an empty LUT for holding the result + Result = cmsPipelineAlloc(ContextID, 4, 4); + if (Result == NULL) return NULL; + + memset(&bp, 0, sizeof(bp)); + + // We need the input LUT of the last profile, assuming this one is responsible of + // black generation. This LUT will be searched in inverse order. + bp.LabK2cmyk = _cmsReadInputLUT(hLastProfile, INTENT_RELATIVE_COLORIMETRIC); + if (bp.LabK2cmyk == NULL) goto Cleanup; + + // Get total area coverage (in 0..1 domain) + bp.MaxTAC = cmsDetectTAC(hLastProfile) / 100.0; + if (bp.MaxTAC <= 0) goto Cleanup; + + + // Create a LUT holding normal ICC transform + bp.cmyk2cmyk = DefaultICCintents(ContextID, + preservationProfilesCount, + ICCIntents, + hProfiles, + BPC, + AdaptationStates, + dwFlags); + if (bp.cmyk2cmyk == NULL) goto Cleanup; + + // Now the tone curve + bp.KTone = _cmsBuildKToneCurve(ContextID, 4096, preservationProfilesCount, + ICCIntents, + hProfiles, + BPC, + AdaptationStates, + dwFlags); + if (bp.KTone == NULL) goto Cleanup; + + // To measure the output, Last profile to Lab + hLab = cmsCreateLab4ProfileTHR(ContextID, NULL); + bp.hProofOutput = cmsCreateTransformTHR(ContextID, hLastProfile, + CHANNELS_SH(4)|BYTES_SH(2), hLab, TYPE_Lab_DBL, + INTENT_RELATIVE_COLORIMETRIC, + cmsFLAGS_NOCACHE|cmsFLAGS_NOOPTIMIZE); + if ( bp.hProofOutput == NULL) goto Cleanup; + + // Same as anterior, but lab in the 0..1 range + bp.cmyk2Lab = cmsCreateTransformTHR(ContextID, hLastProfile, + FLOAT_SH(1)|CHANNELS_SH(4)|BYTES_SH(4), hLab, + FLOAT_SH(1)|CHANNELS_SH(3)|BYTES_SH(4), + INTENT_RELATIVE_COLORIMETRIC, + cmsFLAGS_NOCACHE|cmsFLAGS_NOOPTIMIZE); + if (bp.cmyk2Lab == NULL) goto Cleanup; + cmsCloseProfile(hLab); + + // Error estimation (for debug only) + bp.MaxError = 0; + + // How many gridpoints are we going to use? + nGridPoints = _cmsReasonableGridpointsByColorspace(cmsSigCmykData, dwFlags); + + + CLUT = cmsStageAllocCLut16bit(ContextID, nGridPoints, 4, 4, NULL); + if (CLUT == NULL) goto Cleanup; + + if (!cmsPipelineInsertStage(Result, cmsAT_BEGIN, CLUT)) + goto Cleanup; + + cmsStageSampleCLut16bit(CLUT, BlackPreservingSampler, (void*) &bp, 0); + + // Insert possible devicelinks at the end + for (i = lastProfilePos + 1; i < nProfiles; i++) + { + cmsPipeline* devlink = _cmsReadDevicelinkLUT(hProfiles[i], ICCIntents[i]); + if (devlink == NULL) + goto Cleanup; + + if (!cmsPipelineCat(Result, devlink)) + goto Cleanup; + } + + +Cleanup: + + if (bp.cmyk2cmyk) cmsPipelineFree(bp.cmyk2cmyk); + if (bp.cmyk2Lab) cmsDeleteTransform(bp.cmyk2Lab); + if (bp.hProofOutput) cmsDeleteTransform(bp.hProofOutput); + + if (bp.KTone) cmsFreeToneCurve(bp.KTone); + if (bp.LabK2cmyk) cmsPipelineFree(bp.LabK2cmyk); + + return Result; +} + + + +// Link routines ------------------------------------------------------------------------------------------------------ + +// Chain several profiles into a single LUT. It just checks the parameters and then calls the handler +// for the first intent in chain. The handler may be user-defined. Is up to the handler to deal with the +// rest of intents in chain. A maximum of 255 profiles at time are supported, which is pretty reasonable. +cmsPipeline* _cmsLinkProfiles(cmsContext ContextID, + cmsUInt32Number nProfiles, + cmsUInt32Number TheIntents[], + cmsHPROFILE hProfiles[], + cmsBool BPC[], + cmsFloat64Number AdaptationStates[], + cmsUInt32Number dwFlags) +{ + cmsUInt32Number i; + cmsIntentsList* Intent; + + // Make sure a reasonable number of profiles is provided + if (nProfiles <= 0 || nProfiles > 255) { + cmsSignalError(ContextID, cmsERROR_RANGE, "Couldn't link '%d' profiles", nProfiles); + return NULL; + } + + for (i=0; i < nProfiles; i++) { + + // Check if black point is really needed or allowed. Note that + // following Adobe's document: + // BPC does not apply to devicelink profiles, nor to abs colorimetric, + // and applies always on V4 perceptual and saturation. + + if (TheIntents[i] == INTENT_ABSOLUTE_COLORIMETRIC) + BPC[i] = FALSE; + + if (TheIntents[i] == INTENT_PERCEPTUAL || TheIntents[i] == INTENT_SATURATION) { + + // Force BPC for V4 profiles in perceptual and saturation + if (cmsGetEncodedICCversion(hProfiles[i]) >= 0x4000000) + BPC[i] = TRUE; + } + } + + // Search for a handler. The first intent in the chain defines the handler. That would + // prevent using multiple custom intents in a multiintent chain, but the behaviour of + // this case would present some issues if the custom intent tries to do things like + // preserve primaries. This solution is not perfect, but works well on most cases. + + Intent = SearchIntent(ContextID, TheIntents[0]); + if (Intent == NULL) { + cmsSignalError(ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported intent '%d'", TheIntents[0]); + return NULL; + } + + // Call the handler + return Intent ->Link(ContextID, nProfiles, TheIntents, hProfiles, BPC, AdaptationStates, dwFlags); +} + +// ------------------------------------------------------------------------------------------------- + +// Get information about available intents. nMax is the maximum space for the supplied "Codes" +// and "Descriptions" the function returns the total number of intents, which may be greater +// than nMax, although the matrices are not populated beyond this level. +cmsUInt32Number CMSEXPORT cmsGetSupportedIntentsTHR(cmsContext ContextID, cmsUInt32Number nMax, cmsUInt32Number* Codes, char** Descriptions) +{ + _cmsIntentsPluginChunkType* ctx = ( _cmsIntentsPluginChunkType*) _cmsContextGetClientChunk(ContextID, IntentPlugin); + cmsIntentsList* pt; + cmsUInt32Number nIntents; + + for (nIntents=0, pt = DefaultIntents; pt != NULL; pt = pt -> Next) + { + if (nIntents < nMax) { + if (Codes != NULL) + Codes[nIntents] = pt ->Intent; + + if (Descriptions != NULL) + Descriptions[nIntents] = pt ->Description; + } + + nIntents++; + } + + for (pt = ctx->Intents; pt != NULL; pt = pt -> Next) + { + if (nIntents < nMax) { + if (Codes != NULL) + Codes[nIntents] = pt ->Intent; + + if (Descriptions != NULL) + Descriptions[nIntents] = pt ->Description; + } + + nIntents++; + } + + return nIntents; +} + +cmsUInt32Number CMSEXPORT cmsGetSupportedIntents(cmsUInt32Number nMax, cmsUInt32Number* Codes, char** Descriptions) +{ + return cmsGetSupportedIntentsTHR(NULL, nMax, Codes, Descriptions); +} + +// The plug-in registration. User can add new intents or override default routines +cmsBool _cmsRegisterRenderingIntentPlugin(cmsContext id, cmsPluginBase* Data) +{ + _cmsIntentsPluginChunkType* ctx = ( _cmsIntentsPluginChunkType*) _cmsContextGetClientChunk(id, IntentPlugin); + cmsPluginRenderingIntent* Plugin = (cmsPluginRenderingIntent*) Data; + cmsIntentsList* fl; + + // Do we have to reset the custom intents? + if (Data == NULL) { + + ctx->Intents = NULL; + return TRUE; + } + + fl = (cmsIntentsList*) _cmsPluginMalloc(id, sizeof(cmsIntentsList)); + if (fl == NULL) return FALSE; + + + fl ->Intent = Plugin ->Intent; + strncpy(fl ->Description, Plugin ->Description, sizeof(fl ->Description)-1); + fl ->Description[sizeof(fl ->Description)-1] = 0; + + fl ->Link = Plugin ->Link; + + fl ->Next = ctx ->Intents; + ctx ->Intents = fl; + + return TRUE; +} + diff --git a/local/recipes/libs/lcms2/source/src/cmserr.c b/local/recipes/libs/lcms2/source/src/cmserr.c new file mode 100644 index 0000000000..ac89811a98 --- /dev/null +++ b/local/recipes/libs/lcms2/source/src/cmserr.c @@ -0,0 +1,750 @@ +//--------------------------------------------------------------------------------- +// +// Little Color Management System +// Copyright (c) 1998-2026 Marti Maria Saguer +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//--------------------------------------------------------------------------------- + +#include "lcms2_internal.h" + + +// This function is here to help applications to prevent mixing lcms versions on header and shared objects. +int CMSEXPORT cmsGetEncodedCMMversion(void) +{ + return LCMS_VERSION; +} + +// I am so tired about incompatibilities on those functions that here are some replacements +// that hopefully would be fully portable. + +// compare two strings ignoring case +int CMSEXPORT cmsstrcasecmp(const char* s1, const char* s2) +{ + CMSREGISTER const unsigned char *us1 = (const unsigned char *)s1, + *us2 = (const unsigned char *)s2; + + while (toupper(*us1) == toupper(*us2++)) + if (*us1++ == '\0') + return 0; + + return (toupper(*us1) - toupper(*--us2)); +} + +#ifdef CMS_LARGE_FILE_SUPPORT + +long long int CMSEXPORT cmsfilelength(FILE* f) +{ + long long int p, n; + +#ifdef CMS_IS_WINDOWS_ + p = _ftelli64(f); + if (p == -1LL) + return -1LL; + + if (_fseeki64(f, 0, SEEK_END) != 0) + return -1LL; + + n = _ftelli64(f); + + if (_fseeki64(f, p, SEEK_SET) != 0) + return -1LL; +#else + p = (long long int) ftello(f); + if (p < 0) + return -1LL; + + if (fseeko(f, 0, SEEK_END) != 0) + return -1LL; + + n = (long long int) ftello(f); + + if (fseeko(f, (off_t) p, SEEK_SET) != 0) + return -1LL; +#endif + + return n; +} + +#else + +// long int because C99 specifies ftell in such way (7.19.9.2) +long int CMSEXPORT cmsfilelength(FILE* f) +{ + long int p, n; + + p = ftell(f); + if (p == -1L) + return -1L; + + if (fseek(f, 0, SEEK_END) != 0) + return -1L; + + n = ftell(f); + + if (fseek(f, p, SEEK_SET) != 0) + return -1L; + + return n; +} + +#endif + +// Memory handling ------------------------------------------------------------------ +// +// This is the interface to low-level memory management routines. By default a simple +// wrapping to malloc/free/realloc is provided, although there is a limit on the max +// amount of memory that can be reclaimed. This is mostly as a safety feature to prevent +// bogus or evil code to allocate huge blocks that otherwise lcms would never need. + +#ifdef CMS_LARGE_FILE_SUPPORT +# define MAX_MEMORY_FOR_ALLOC ((cmsUInt32Number)(1024U*1024U*2048U)) +#else +# define MAX_MEMORY_FOR_ALLOC ((cmsUInt32Number)(1024U*1024U*512U)) +#endif + +// User may override this behaviour by using a memory plug-in, which basically replaces +// the default memory management functions. In this case, no check is performed and it +// is up to the plug-in writer to keep in the safe side. There are only three functions +// required to be implemented: malloc, realloc and free, although the user may want to +// replace the optional mallocZero, calloc and dup as well. + +cmsBool _cmsRegisterMemHandlerPlugin(cmsContext ContextID, cmsPluginBase* Plugin); + +// ********************************************************************************* + +// This is the default memory allocation function. It does a very coarse +// check of amount of memory, just to prevent exploits +static +void* _cmsMallocDefaultFn(cmsContext ContextID, cmsUInt32Number size) +{ + // Never allow 0 or over maximum + if (size == 0 || size > MAX_MEMORY_FOR_ALLOC) return NULL; + + return (void*) malloc(size); + + cmsUNUSED_PARAMETER(ContextID); +} + +// Generic allocate & zero +static +void* _cmsMallocZeroDefaultFn(cmsContext ContextID, cmsUInt32Number size) +{ + void *pt = _cmsMalloc(ContextID, size); + if (pt == NULL) return NULL; + + memset(pt, 0, size); + return pt; +} + + +// The default free function. The only check proformed is against NULL pointers +static +void _cmsFreeDefaultFn(cmsContext ContextID, void *Ptr) +{ + // free(NULL) is defined a no-op by C99, therefore it is safe to + // avoid the check, but it is here just in case... + + if (Ptr) free(Ptr); + + cmsUNUSED_PARAMETER(ContextID); +} + +// The default realloc function. Again it checks for exploits. If Ptr is NULL, +// realloc behaves the same way as malloc and allocates a new block of size bytes. +static +void* _cmsReallocDefaultFn(cmsContext ContextID, void* Ptr, cmsUInt32Number size) +{ + + if (size > MAX_MEMORY_FOR_ALLOC) return NULL; // Never realloc over 512Mb + + return realloc(Ptr, size); + + cmsUNUSED_PARAMETER(ContextID); +} + + +// The default calloc function. Allocates an array of num elements, each one of size bytes +// all memory is initialized to zero. +static +void* _cmsCallocDefaultFn(cmsContext ContextID, cmsUInt32Number num, cmsUInt32Number size) +{ + cmsUInt32Number Total = num * size; + + // Preserve calloc behaviour + if (Total == 0) return NULL; + + // Safe check for overflow. + if (num >= UINT_MAX / size) return NULL; + + // Check for overflow + if (Total < num || Total < size) { + return NULL; + } + + if (Total > MAX_MEMORY_FOR_ALLOC) return NULL; // Never alloc over 512Mb + + return _cmsMallocZero(ContextID, Total); +} + +// Generic block duplication +static +void* _cmsDupDefaultFn(cmsContext ContextID, const void* Org, cmsUInt32Number size) +{ + void* mem; + + if (size > MAX_MEMORY_FOR_ALLOC) return NULL; // Never dup over 512Mb + + mem = _cmsMalloc(ContextID, size); + + if (mem != NULL && Org != NULL) + memmove(mem, Org, size); + + return mem; +} + + +// Pointers to memory manager functions in Context0 +_cmsMemPluginChunkType _cmsMemPluginChunk = { _cmsMallocDefaultFn, _cmsMallocZeroDefaultFn, _cmsFreeDefaultFn, + _cmsReallocDefaultFn, _cmsCallocDefaultFn, _cmsDupDefaultFn + }; + + +// Reset and duplicate memory manager +void _cmsAllocMemPluginChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src) +{ + _cmsAssert(ctx != NULL); + + if (src != NULL) { + + // Duplicate + ctx ->chunks[MemPlugin] = _cmsSubAllocDup(ctx ->MemPool, src ->chunks[MemPlugin], sizeof(_cmsMemPluginChunkType)); + } + else { + + // To reset it, we use the default allocators, which cannot be overridden + ctx ->chunks[MemPlugin] = &ctx ->DefaultMemoryManager; + } +} + +// Auxiliary to fill memory management functions from plugin (or context 0 defaults) +void _cmsInstallAllocFunctions(cmsPluginMemHandler* Plugin, _cmsMemPluginChunkType* ptr) +{ + if (Plugin == NULL) { + + memcpy(ptr, &_cmsMemPluginChunk, sizeof(_cmsMemPluginChunk)); + } + else { + + ptr ->MallocPtr = Plugin -> MallocPtr; + ptr ->FreePtr = Plugin -> FreePtr; + ptr ->ReallocPtr = Plugin -> ReallocPtr; + + // Make sure we revert to defaults + ptr ->MallocZeroPtr= _cmsMallocZeroDefaultFn; + ptr ->CallocPtr = _cmsCallocDefaultFn; + ptr ->DupPtr = _cmsDupDefaultFn; + + if (Plugin ->MallocZeroPtr != NULL) ptr ->MallocZeroPtr = Plugin -> MallocZeroPtr; + if (Plugin ->CallocPtr != NULL) ptr ->CallocPtr = Plugin -> CallocPtr; + if (Plugin ->DupPtr != NULL) ptr ->DupPtr = Plugin -> DupPtr; + + } +} + + +// Plug-in replacement entry +cmsBool _cmsRegisterMemHandlerPlugin(cmsContext ContextID, cmsPluginBase *Data) +{ + cmsPluginMemHandler* Plugin = (cmsPluginMemHandler*) Data; + _cmsMemPluginChunkType* ptr; + + // NULL forces to reset to defaults. In this special case, the defaults are stored in the context structure. + // Remaining plug-ins does NOT have any copy in the context structure, but this is somehow special as the + // context internal data should be malloc'ed by using those functions. + if (Data == NULL) { + + struct _cmsContext_struct* ctx = ( struct _cmsContext_struct*) ContextID; + + // Return to the default allocators + if (ContextID != NULL) { + ctx->chunks[MemPlugin] = (void*) &ctx->DefaultMemoryManager; + } + return TRUE; + } + + // Check for required callbacks + if (Plugin -> MallocPtr == NULL || + Plugin -> FreePtr == NULL || + Plugin -> ReallocPtr == NULL) return FALSE; + + // Set replacement functions + ptr = (_cmsMemPluginChunkType*) _cmsContextGetClientChunk(ContextID, MemPlugin); + if (ptr == NULL) + return FALSE; + + _cmsInstallAllocFunctions(Plugin, ptr); + return TRUE; +} + +// Generic allocate +void* CMSEXPORT _cmsMalloc(cmsContext ContextID, cmsUInt32Number size) +{ + _cmsMemPluginChunkType* ptr = (_cmsMemPluginChunkType*) _cmsContextGetClientChunk(ContextID, MemPlugin); + return ptr ->MallocPtr(ContextID, size); +} + +// Generic allocate & zero +void* CMSEXPORT _cmsMallocZero(cmsContext ContextID, cmsUInt32Number size) +{ + _cmsMemPluginChunkType* ptr = (_cmsMemPluginChunkType*) _cmsContextGetClientChunk(ContextID, MemPlugin); + return ptr->MallocZeroPtr(ContextID, size); +} + +// Generic calloc +void* CMSEXPORT _cmsCalloc(cmsContext ContextID, cmsUInt32Number num, cmsUInt32Number size) +{ + _cmsMemPluginChunkType* ptr = (_cmsMemPluginChunkType*) _cmsContextGetClientChunk(ContextID, MemPlugin); + return ptr->CallocPtr(ContextID, num, size); +} + +// Generic reallocate +void* CMSEXPORT _cmsRealloc(cmsContext ContextID, void* Ptr, cmsUInt32Number size) +{ + _cmsMemPluginChunkType* ptr = (_cmsMemPluginChunkType*) _cmsContextGetClientChunk(ContextID, MemPlugin); + return ptr->ReallocPtr(ContextID, Ptr, size); +} + +// Generic free memory +void CMSEXPORT _cmsFree(cmsContext ContextID, void* Ptr) +{ + if (Ptr != NULL) { + _cmsMemPluginChunkType* ptr = (_cmsMemPluginChunkType*) _cmsContextGetClientChunk(ContextID, MemPlugin); + ptr ->FreePtr(ContextID, Ptr); + } +} + +// Generic block duplication +void* CMSEXPORT _cmsDupMem(cmsContext ContextID, const void* Org, cmsUInt32Number size) +{ + _cmsMemPluginChunkType* ptr = (_cmsMemPluginChunkType*) _cmsContextGetClientChunk(ContextID, MemPlugin); + return ptr ->DupPtr(ContextID, Org, size); +} + +// ******************************************************************************************** + +// Sub allocation takes care of many pointers of small size. The memory allocated in +// this way have be freed at once. Next function allocates a single chunk for linked list +// I prefer this method over realloc due to the big impact on xput realloc may have if +// memory is being swapped to disk. This approach is safer (although that may not be true on all platforms) +static +_cmsSubAllocator_chunk* _cmsCreateSubAllocChunk(cmsContext ContextID, cmsUInt32Number Initial) +{ + _cmsSubAllocator_chunk* chunk; + + // 20K by default + if (Initial == 0) + Initial = 20*1024; + + // Create the container + chunk = (_cmsSubAllocator_chunk*) _cmsMallocZero(ContextID, sizeof(_cmsSubAllocator_chunk)); + if (chunk == NULL) return NULL; + + // Initialize values + chunk ->Block = (cmsUInt8Number*) _cmsMalloc(ContextID, Initial); + if (chunk ->Block == NULL) { + + // Something went wrong + _cmsFree(ContextID, chunk); + return NULL; + } + + chunk ->BlockSize = Initial; + chunk ->Used = 0; + chunk ->next = NULL; + + return chunk; +} + +// The suballocated is nothing but a pointer to the first element in the list. We also keep +// the thread ID in this structure. +_cmsSubAllocator* _cmsCreateSubAlloc(cmsContext ContextID, cmsUInt32Number Initial) +{ + _cmsSubAllocator* sub; + + // Create the container + sub = (_cmsSubAllocator*) _cmsMallocZero(ContextID, sizeof(_cmsSubAllocator)); + if (sub == NULL) return NULL; + + sub ->ContextID = ContextID; + + sub ->h = _cmsCreateSubAllocChunk(ContextID, Initial); + if (sub ->h == NULL) { + _cmsFree(ContextID, sub); + return NULL; + } + + return sub; +} + + +// Get rid of whole linked list +void _cmsSubAllocDestroy(_cmsSubAllocator* sub) +{ + _cmsSubAllocator_chunk *chunk, *n; + + for (chunk = sub ->h; chunk != NULL; chunk = n) { + + n = chunk->next; + if (chunk->Block != NULL) _cmsFree(sub ->ContextID, chunk->Block); + _cmsFree(sub ->ContextID, chunk); + } + + // Free the header + _cmsFree(sub ->ContextID, sub); +} + + +// Get a pointer to small memory block. +void* _cmsSubAlloc(_cmsSubAllocator* sub, cmsUInt32Number size) +{ + cmsUInt32Number Free = sub -> h ->BlockSize - sub -> h -> Used; + cmsUInt8Number* ptr; + + size = _cmsALIGNMEM(size); + + // Check for memory. If there is no room, allocate a new chunk of double memory size. + if (size > Free) { + + _cmsSubAllocator_chunk* chunk; + cmsUInt32Number newSize; + + newSize = sub -> h ->BlockSize * 2; + if (newSize < size) newSize = size; + + chunk = _cmsCreateSubAllocChunk(sub -> ContextID, newSize); + if (chunk == NULL) return NULL; + + // Link list + chunk ->next = sub ->h; + sub ->h = chunk; + + } + + ptr = sub -> h ->Block + sub -> h ->Used; + sub -> h -> Used += size; + + return (void*) ptr; +} + +// Duplicate in pool +void* _cmsSubAllocDup(_cmsSubAllocator* s, const void *ptr, cmsUInt32Number size) +{ + void *NewPtr; + + // Dup of null pointer is also NULL + if (ptr == NULL) + return NULL; + + NewPtr = _cmsSubAlloc(s, size); + + if (ptr != NULL && NewPtr != NULL) { + memcpy(NewPtr, ptr, size); + } + + return NewPtr; +} + + + +// Error logging ****************************************************************** + +// There is no error handling at all. When a function fails, it returns proper value. +// For example, all create functions does return NULL on failure. Other return FALSE +// It may be interesting, for the developer, to know why the function is failing. +// for that reason, lcms2 does offer a logging function. This function does receive +// a ENGLISH string with some clues on what is going wrong. You can show this +// info to the end user, or just create some sort of log. +// The logging function should NOT terminate the program, as this obviously can leave +// resources. It is the programmer's responsibility to check each function return code +// to make sure it didn't fail. + +// Error messages are limited to MAX_ERROR_MESSAGE_LEN + +#define MAX_ERROR_MESSAGE_LEN 1024 + +// --------------------------------------------------------------------------------------------------------- + +// This is our default log error +static void DefaultLogErrorHandlerFunction(cmsContext ContextID, cmsUInt32Number ErrorCode, const char *Text); + +// Context0 storage, which is global +_cmsLogErrorChunkType _cmsLogErrorChunk = { DefaultLogErrorHandlerFunction }; + +// Allocates and inits error logger container for a given context. If src is NULL, only initializes the value +// to the default. Otherwise, it duplicates the value. The interface is standard across all context clients +void _cmsAllocLogErrorChunk(struct _cmsContext_struct* ctx, + const struct _cmsContext_struct* src) +{ + static _cmsLogErrorChunkType LogErrorChunk = { DefaultLogErrorHandlerFunction }; + void* from; + + if (src != NULL) { + from = src ->chunks[Logger]; + } + else { + from = &LogErrorChunk; + } + + ctx ->chunks[Logger] = _cmsSubAllocDup(ctx ->MemPool, from, sizeof(_cmsLogErrorChunkType)); +} + +// The default error logger does nothing. +static +void DefaultLogErrorHandlerFunction(cmsContext ContextID, cmsUInt32Number ErrorCode, const char *Text) +{ + // fprintf(stderr, "[lcms]: %s\n", Text); + // fflush(stderr); + + cmsUNUSED_PARAMETER(ContextID); + cmsUNUSED_PARAMETER(ErrorCode); + cmsUNUSED_PARAMETER(Text); +} + +// Change log error, context based +void CMSEXPORT cmsSetLogErrorHandlerTHR(cmsContext ContextID, cmsLogErrorHandlerFunction Fn) +{ + _cmsLogErrorChunkType* lhg = (_cmsLogErrorChunkType*) _cmsContextGetClientChunk(ContextID, Logger); + + if (lhg != NULL) { + + if (Fn == NULL) + lhg -> LogErrorHandler = DefaultLogErrorHandlerFunction; + else + lhg -> LogErrorHandler = Fn; + } +} + +// Change log error, legacy +void CMSEXPORT cmsSetLogErrorHandler(cmsLogErrorHandlerFunction Fn) +{ + cmsSetLogErrorHandlerTHR(NULL, Fn); +} + +// Log an error +// ErrorText is a text holding an english description of error. +void CMSEXPORT cmsSignalError(cmsContext ContextID, cmsUInt32Number ErrorCode, const char *ErrorText, ...) +{ + va_list args; + char Buffer[MAX_ERROR_MESSAGE_LEN]; + _cmsLogErrorChunkType* lhg; + + + va_start(args, ErrorText); + vsnprintf(Buffer, MAX_ERROR_MESSAGE_LEN-1, ErrorText, args); + va_end(args); + + // Check for the context, if specified go there. If not, go for the global + lhg = (_cmsLogErrorChunkType*) _cmsContextGetClientChunk(ContextID, Logger); + if (lhg ->LogErrorHandler) { + lhg ->LogErrorHandler(ContextID, ErrorCode, Buffer); + } +} + +// Utility function to print signatures +void _cmsTagSignature2String(char String[5], cmsTagSignature sig) +{ + cmsUInt32Number be; + + // Convert to big endian + be = _cmsAdjustEndianess32((cmsUInt32Number) sig); + + // Move chars + memmove(String, &be, 4); + + // Make sure of terminator + String[4] = 0; +} + +//-------------------------------------------------------------------------------------------------- + + +static +void* defMtxCreate(cmsContext id) +{ + _cmsMutex* ptr_mutex = (_cmsMutex*) _cmsMalloc(id, sizeof(_cmsMutex)); + _cmsInitMutexPrimitive(ptr_mutex); + return (void*) ptr_mutex; +} + +static +void defMtxDestroy(cmsContext id, void* mtx) +{ + _cmsDestroyMutexPrimitive((_cmsMutex *) mtx); + _cmsFree(id, mtx); +} + +static +cmsBool defMtxLock(cmsContext id, void* mtx) +{ + cmsUNUSED_PARAMETER(id); + return _cmsLockPrimitive((_cmsMutex *) mtx) == 0; +} + +static +void defMtxUnlock(cmsContext id, void* mtx) +{ + cmsUNUSED_PARAMETER(id); + _cmsUnlockPrimitive((_cmsMutex *) mtx); +} + + + +// Pointers to memory manager functions in Context0 +_cmsMutexPluginChunkType _cmsMutexPluginChunk = { defMtxCreate, defMtxDestroy, defMtxLock, defMtxUnlock }; + +// Allocate and init mutex container. +void _cmsAllocMutexPluginChunk(struct _cmsContext_struct* ctx, + const struct _cmsContext_struct* src) +{ + static _cmsMutexPluginChunkType MutexChunk = {defMtxCreate, defMtxDestroy, defMtxLock, defMtxUnlock }; + void* from; + + if (src != NULL) { + from = src ->chunks[MutexPlugin]; + } + else { + from = &MutexChunk; + } + + ctx ->chunks[MutexPlugin] = _cmsSubAllocDup(ctx ->MemPool, from, sizeof(_cmsMutexPluginChunkType)); +} + +// Register new ways to transform +cmsBool _cmsRegisterMutexPlugin(cmsContext ContextID, cmsPluginBase* Data) +{ + cmsPluginMutex* Plugin = (cmsPluginMutex*) Data; + _cmsMutexPluginChunkType* ctx = ( _cmsMutexPluginChunkType*) _cmsContextGetClientChunk(ContextID, MutexPlugin); + + if (Data == NULL) { + + // No lock routines + ctx->CreateMutexPtr = NULL; + ctx->DestroyMutexPtr = NULL; + ctx->LockMutexPtr = NULL; + ctx ->UnlockMutexPtr = NULL; + return TRUE; + } + + // Factory callback is required + if (Plugin ->CreateMutexPtr == NULL || Plugin ->DestroyMutexPtr == NULL || + Plugin ->LockMutexPtr == NULL || Plugin ->UnlockMutexPtr == NULL) return FALSE; + + ctx->CreateMutexPtr = Plugin->CreateMutexPtr; + ctx->DestroyMutexPtr = Plugin ->DestroyMutexPtr; + ctx ->LockMutexPtr = Plugin ->LockMutexPtr; + ctx ->UnlockMutexPtr = Plugin ->UnlockMutexPtr; + + // All is ok + return TRUE; +} + +// Generic Mutex fns +void* CMSEXPORT _cmsCreateMutex(cmsContext ContextID) +{ + _cmsMutexPluginChunkType* ptr = (_cmsMutexPluginChunkType*) _cmsContextGetClientChunk(ContextID, MutexPlugin); + + if (ptr ->CreateMutexPtr == NULL) return NULL; + + return ptr ->CreateMutexPtr(ContextID); +} + +void CMSEXPORT _cmsDestroyMutex(cmsContext ContextID, void* mtx) +{ + _cmsMutexPluginChunkType* ptr = (_cmsMutexPluginChunkType*) _cmsContextGetClientChunk(ContextID, MutexPlugin); + + if (ptr ->DestroyMutexPtr != NULL) { + + ptr ->DestroyMutexPtr(ContextID, mtx); + } +} + +cmsBool CMSEXPORT _cmsLockMutex(cmsContext ContextID, void* mtx) +{ + _cmsMutexPluginChunkType* ptr = (_cmsMutexPluginChunkType*) _cmsContextGetClientChunk(ContextID, MutexPlugin); + + if (ptr ->LockMutexPtr == NULL) return TRUE; + + return ptr ->LockMutexPtr(ContextID, mtx); +} + +void CMSEXPORT _cmsUnlockMutex(cmsContext ContextID, void* mtx) +{ + _cmsMutexPluginChunkType* ptr = (_cmsMutexPluginChunkType*) _cmsContextGetClientChunk(ContextID, MutexPlugin); + + if (ptr ->UnlockMutexPtr != NULL) { + + ptr ->UnlockMutexPtr(ContextID, mtx); + } +} + +// The global Context0 storage for parallelization plug-in + _cmsParallelizationPluginChunkType _cmsParallelizationPluginChunk = { 0 }; + +// Allocate parallelization container. +void _cmsAllocParallelizationPluginChunk(struct _cmsContext_struct* ctx, + const struct _cmsContext_struct* src) +{ + if (src != NULL) { + void* from = src->chunks[ParallelizationPlugin]; + ctx->chunks[ParallelizationPlugin] = _cmsSubAllocDup(ctx->MemPool, from, sizeof(_cmsParallelizationPluginChunkType)); + } + else { + _cmsParallelizationPluginChunkType ParallelizationPluginChunk = { 0 }; + ctx->chunks[ParallelizationPlugin] = _cmsSubAllocDup(ctx->MemPool, &ParallelizationPluginChunk, sizeof(_cmsParallelizationPluginChunkType)); + } +} + +// Register parallel processing +cmsBool _cmsRegisterParallelizationPlugin(cmsContext ContextID, cmsPluginBase* Data) +{ + cmsPluginParalellization* Plugin = (cmsPluginParalellization*)Data; + _cmsParallelizationPluginChunkType* ctx = (_cmsParallelizationPluginChunkType*)_cmsContextGetClientChunk(ContextID, ParallelizationPlugin); + + if (Data == NULL) { + + // No parallelization routines + ctx->MaxWorkers = 0; + ctx->WorkerFlags = 0; + ctx->SchedulerFn = NULL; + return TRUE; + } + + // callback is required + if (Plugin->SchedulerFn == NULL) return FALSE; + + ctx->MaxWorkers = Plugin->MaxWorkers; + ctx->WorkerFlags = Plugin->WorkerFlags; + ctx->SchedulerFn = Plugin->SchedulerFn; + + // All is ok + return TRUE; +} + diff --git a/local/recipes/libs/lcms2/source/src/cmsgamma.c b/local/recipes/libs/lcms2/source/src/cmsgamma.c new file mode 100644 index 0000000000..7cc2deb15a --- /dev/null +++ b/local/recipes/libs/lcms2/source/src/cmsgamma.c @@ -0,0 +1,1514 @@ +//--------------------------------------------------------------------------------- +// +// Little Color Management System +// Copyright (c) 1998-2026 Marti Maria Saguer +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//--------------------------------------------------------------------------------- +// +#include "lcms2_internal.h" + +// Tone curves are powerful constructs that can contain curves specified in diverse ways. +// The curve is stored in segments, where each segment can be sampled or specified by parameters. +// a 16.bit simplification of the *whole* curve is kept for optimization purposes. For float operation, +// each segment is evaluated separately. Plug-ins may be used to define new parametric schemes, +// each plug-in may define up to MAX_TYPES_IN_LCMS_PLUGIN functions types. For defining a function, +// the plug-in should provide the type id, how many parameters each type has, and a pointer to +// a procedure that evaluates the function. In the case of reverse evaluation, the evaluator will +// be called with the type id as a negative value, and a sampled version of the reversed curve +// will be built. + +// ----------------------------------------------------------------- Implementation +// Maxim number of nodes +#define MAX_NODES_IN_CURVE 4097 +#define MINUS_INF (-1E22F) +#define PLUS_INF (+1E22F) + +// The list of supported parametric curves +typedef struct _cmsParametricCurvesCollection_st { + + cmsUInt32Number nFunctions; // Number of supported functions in this chunk + cmsInt32Number FunctionTypes[MAX_TYPES_IN_LCMS_PLUGIN]; // The identification types + cmsUInt32Number ParameterCount[MAX_TYPES_IN_LCMS_PLUGIN]; // Number of parameters for each function + + cmsParametricCurveEvaluator Evaluator; // The evaluator + + struct _cmsParametricCurvesCollection_st* Next; // Next in list + +} _cmsParametricCurvesCollection; + +// This is the default (built-in) evaluator +static cmsFloat64Number DefaultEvalParametricFn(cmsInt32Number Type, const cmsFloat64Number Params[], cmsFloat64Number R); + +// The built-in list +static _cmsParametricCurvesCollection DefaultCurves = { + 10, // # of curve types + { 1, 2, 3, 4, 5, 6, 7, 8, 108, 109 }, // Parametric curve ID + { 1, 3, 4, 5, 7, 4, 5, 5, 1, 1 }, // Parameters by type + DefaultEvalParametricFn, // Evaluator + NULL // Next in chain +}; + +// Duplicates the zone of memory used by the plug-in in the new context +static +void DupPluginCurvesList(struct _cmsContext_struct* ctx, + const struct _cmsContext_struct* src) +{ + _cmsCurvesPluginChunkType newHead = { NULL }; + _cmsParametricCurvesCollection* entry; + _cmsParametricCurvesCollection* Anterior = NULL; + _cmsCurvesPluginChunkType* head = (_cmsCurvesPluginChunkType*) src->chunks[CurvesPlugin]; + + _cmsAssert(head != NULL); + + // Walk the list copying all nodes + for (entry = head->ParametricCurves; + entry != NULL; + entry = entry ->Next) { + + _cmsParametricCurvesCollection *newEntry = ( _cmsParametricCurvesCollection *) _cmsSubAllocDup(ctx ->MemPool, entry, sizeof(_cmsParametricCurvesCollection)); + + if (newEntry == NULL) + return; + + // We want to keep the linked list order, so this is a little bit tricky + newEntry -> Next = NULL; + if (Anterior) + Anterior -> Next = newEntry; + + Anterior = newEntry; + + if (newHead.ParametricCurves == NULL) + newHead.ParametricCurves = newEntry; + } + + ctx ->chunks[CurvesPlugin] = _cmsSubAllocDup(ctx->MemPool, &newHead, sizeof(_cmsCurvesPluginChunkType)); +} + +// The allocator have to follow the chain +void _cmsAllocCurvesPluginChunk(struct _cmsContext_struct* ctx, + const struct _cmsContext_struct* src) +{ + _cmsAssert(ctx != NULL); + + if (src != NULL) { + + // Copy all linked list + DupPluginCurvesList(ctx, src); + } + else { + static _cmsCurvesPluginChunkType CurvesPluginChunk = { NULL }; + ctx ->chunks[CurvesPlugin] = _cmsSubAllocDup(ctx ->MemPool, &CurvesPluginChunk, sizeof(_cmsCurvesPluginChunkType)); + } +} + + +// The linked list head +_cmsCurvesPluginChunkType _cmsCurvesPluginChunk = { NULL }; + +// As a way to install new parametric curves +cmsBool _cmsRegisterParametricCurvesPlugin(cmsContext ContextID, cmsPluginBase* Data) +{ + _cmsCurvesPluginChunkType* ctx = ( _cmsCurvesPluginChunkType*) _cmsContextGetClientChunk(ContextID, CurvesPlugin); + cmsPluginParametricCurves* Plugin = (cmsPluginParametricCurves*) Data; + _cmsParametricCurvesCollection* fl; + + if (Data == NULL) { + + ctx -> ParametricCurves = NULL; + return TRUE; + } + + fl = (_cmsParametricCurvesCollection*) _cmsPluginMalloc(ContextID, sizeof(_cmsParametricCurvesCollection)); + if (fl == NULL) return FALSE; + + // Copy the parameters + fl ->Evaluator = Plugin ->Evaluator; + fl ->nFunctions = Plugin ->nFunctions; + + // Make sure no mem overwrites + if (fl ->nFunctions > MAX_TYPES_IN_LCMS_PLUGIN) + fl ->nFunctions = MAX_TYPES_IN_LCMS_PLUGIN; + + // Copy the data + memmove(fl->FunctionTypes, Plugin ->FunctionTypes, fl->nFunctions * sizeof(cmsUInt32Number)); + memmove(fl->ParameterCount, Plugin ->ParameterCount, fl->nFunctions * sizeof(cmsUInt32Number)); + + // Keep linked list + fl ->Next = ctx->ParametricCurves; + ctx->ParametricCurves = fl; + + // All is ok + return TRUE; +} + + +// Search in type list, return position or -1 if not found +static +int IsInSet(int Type, _cmsParametricCurvesCollection* c) +{ + int i; + + for (i=0; i < (int) c ->nFunctions; i++) + if (abs(Type) == c ->FunctionTypes[i]) return i; + + return -1; +} + + +// Search for the collection which contains a specific type +static +_cmsParametricCurvesCollection *GetParametricCurveByType(cmsContext ContextID, int Type, int* index) +{ + _cmsParametricCurvesCollection* c; + int Position; + _cmsCurvesPluginChunkType* ctx = ( _cmsCurvesPluginChunkType*) _cmsContextGetClientChunk(ContextID, CurvesPlugin); + + for (c = ctx->ParametricCurves; c != NULL; c = c ->Next) { + + Position = IsInSet(Type, c); + + if (Position != -1) { + if (index != NULL) + *index = Position; + return c; + } + } + // If none found, revert for defaults + for (c = &DefaultCurves; c != NULL; c = c ->Next) { + + Position = IsInSet(Type, c); + + if (Position != -1) { + if (index != NULL) + *index = Position; + return c; + } + } + + return NULL; +} + +// Low level allocate, which takes care of memory details. nEntries may be zero, and in this case +// no optimization curve is computed. nSegments may also be zero in the inverse case, where only the +// optimization curve is given. Both features simultaneously is an error +static +cmsToneCurve* AllocateToneCurveStruct(cmsContext ContextID, cmsUInt32Number nEntries, + cmsUInt32Number nSegments, const cmsCurveSegment* Segments, + const cmsUInt16Number* Values) +{ + cmsToneCurve* p; + cmsUInt32Number i; + + // We allow huge tables, which are then restricted for smoothing operations + if (nEntries > 65530) { + cmsSignalError(ContextID, cmsERROR_RANGE, "Couldn't create tone curve of more than 65530 entries"); + return NULL; + } + + if (nEntries == 0 && nSegments == 0) { + cmsSignalError(ContextID, cmsERROR_RANGE, "Couldn't create tone curve with zero segments and no table"); + return NULL; + } + + // Allocate all required pointers, etc. + p = (cmsToneCurve*) _cmsMallocZero(ContextID, sizeof(cmsToneCurve)); + if (!p) return NULL; + + // In this case, there are no segments + if (nSegments == 0) { + p ->Segments = NULL; + p ->Evals = NULL; + } + else { + p ->Segments = (cmsCurveSegment*) _cmsCalloc(ContextID, nSegments, sizeof(cmsCurveSegment)); + if (p ->Segments == NULL) goto Error; + + p ->Evals = (cmsParametricCurveEvaluator*) _cmsCalloc(ContextID, nSegments, sizeof(cmsParametricCurveEvaluator)); + if (p ->Evals == NULL) goto Error; + } + + p -> nSegments = nSegments; + + // This 16-bit table contains a limited precision representation of the whole curve and is kept for + // increasing xput on certain operations. + if (nEntries == 0) { + p ->Table16 = NULL; + } + else { + p ->Table16 = (cmsUInt16Number*) _cmsCalloc(ContextID, nEntries, sizeof(cmsUInt16Number)); + if (p ->Table16 == NULL) goto Error; + } + + p -> nEntries = nEntries; + + // Initialize members if requested + if (Values != NULL && (nEntries > 0)) { + + for (i=0; i < nEntries; i++) + p ->Table16[i] = Values[i]; + } + + // Initialize the segments stuff. The evaluator for each segment is located and a pointer to it + // is placed in advance to maximize performance. + if (Segments != NULL && (nSegments > 0)) { + + _cmsParametricCurvesCollection *c; + + p ->SegInterp = (cmsInterpParams**) _cmsCalloc(ContextID, nSegments, sizeof(cmsInterpParams*)); + if (p ->SegInterp == NULL) goto Error; + + for (i=0; i < nSegments; i++) { + + // Type 0 is a special marker for table-based curves + if (Segments[i].Type == 0) + p ->SegInterp[i] = _cmsComputeInterpParams(ContextID, Segments[i].nGridPoints, 1, 1, NULL, CMS_LERP_FLAGS_FLOAT); + + memmove(&p ->Segments[i], &Segments[i], sizeof(cmsCurveSegment)); + + if (Segments[i].Type == 0 && Segments[i].SampledPoints != NULL) + p ->Segments[i].SampledPoints = (cmsFloat32Number*) _cmsDupMem(ContextID, Segments[i].SampledPoints, sizeof(cmsFloat32Number) * Segments[i].nGridPoints); + else + p ->Segments[i].SampledPoints = NULL; + + + c = GetParametricCurveByType(ContextID, Segments[i].Type, NULL); + if (c != NULL) + p ->Evals[i] = c ->Evaluator; + } + } + + p ->InterpParams = _cmsComputeInterpParams(ContextID, p ->nEntries, 1, 1, p->Table16, CMS_LERP_FLAGS_16BITS); + if (p->InterpParams != NULL) + return p; + +Error: + for (i=0; i < nSegments; i++) { + if (p ->Segments && p ->Segments[i].SampledPoints) _cmsFree(ContextID, p ->Segments[i].SampledPoints); + if (p ->SegInterp && p ->SegInterp[i]) _cmsFree(ContextID, p ->SegInterp[i]); + } + if (p -> SegInterp) _cmsFree(ContextID, p -> SegInterp); + if (p -> Segments) _cmsFree(ContextID, p -> Segments); + if (p -> Evals) _cmsFree(ContextID, p -> Evals); + if (p ->Table16) _cmsFree(ContextID, p ->Table16); + _cmsFree(ContextID, p); + return NULL; +} + + +// Generates a sigmoidal function with desired steepness. +cmsINLINE double sigmoid_base(double k, double t) +{ + return (1.0 / (1.0 + exp(-k * t))) - 0.5; +} + +cmsINLINE double inverted_sigmoid_base(double k, double t) +{ + return -log((1.0 / (t + 0.5)) - 1.0) / k; +} + +cmsINLINE double sigmoid_factory(double k, double t) +{ + double correction = 0.5 / sigmoid_base(k, 1); + + return correction * sigmoid_base(k, 2.0 * t - 1.0) + 0.5; +} + +cmsINLINE double inverse_sigmoid_factory(double k, double t) +{ + double correction = 0.5 / sigmoid_base(k, 1); + + return (inverted_sigmoid_base(k, (t - 0.5) / correction) + 1.0) / 2.0; +} + + +// Parametric Fn using floating point +static +cmsFloat64Number DefaultEvalParametricFn(cmsInt32Number Type, const cmsFloat64Number Params[], cmsFloat64Number R) +{ + cmsFloat64Number e, Val, disc; + + switch (Type) { + + // X = Y ^ Gamma + case 1: + if (R < 0) { + + if (fabs(Params[0] - 1.0) < MATRIX_DET_TOLERANCE) + Val = R; + else + Val = 0; + } + else + Val = pow(R, Params[0]); + break; + + // Type 1 Reversed: X = Y ^1/gamma + case -1: + if (R < 0) { + + if (fabs(Params[0] - 1.0) < MATRIX_DET_TOLERANCE) + Val = R; + else + Val = 0; + } + else + { + if (fabs(Params[0]) < MATRIX_DET_TOLERANCE) + Val = PLUS_INF; + else + Val = pow(R, 1 / Params[0]); + } + break; + + // CIE 122-1966 + // Y = (aX + b)^Gamma | X >= -b/a + // Y = 0 | else + case 2: + { + + if (fabs(Params[1]) < MATRIX_DET_TOLERANCE) + { + Val = 0; + } + else + { + disc = -Params[2] / Params[1]; + + if (R >= disc) { + + e = Params[1] * R + Params[2]; + + if (e > 0) + Val = pow(e, Params[0]); + else + Val = 0; + } + else + Val = 0; + } + } + break; + + // Type 2 Reversed + // X = (Y ^1/g - b) / a + case -2: + { + if (fabs(Params[0]) < MATRIX_DET_TOLERANCE || + fabs(Params[1]) < MATRIX_DET_TOLERANCE) + { + Val = 0; + } + else + { + if (R < 0) + Val = 0; + else + Val = (pow(R, 1.0 / Params[0]) - Params[2]) / Params[1]; + + if (Val < 0) + Val = 0; + } + } + break; + + + // IEC 61966-3 + // Y = (aX + b)^Gamma + c | X <= -b/a + // Y = c | else + case 3: + { + if (fabs(Params[1]) < MATRIX_DET_TOLERANCE) + { + Val = 0; + } + else + { + disc = -Params[2] / Params[1]; + if (disc < 0) + disc = 0; + + if (R >= disc) { + + e = Params[1] * R + Params[2]; + + if (e > 0) + Val = pow(e, Params[0]) + Params[3]; + else + Val = 0; + } + else + Val = Params[3]; + } + } + break; + + + // Type 3 reversed + // X=((Y-c)^1/g - b)/a | (Y>=c) + // X=-b/a | (Y= Params[3]) { + + e = R - Params[3]; + + if (e > 0) + Val = (pow(e, 1 / Params[0]) - Params[2]) / Params[1]; + else + Val = 0; + } + else { + Val = -Params[2] / Params[1]; + } + } + } + break; + + + // IEC 61966-2.1 (sRGB) + // Y = (aX + b)^Gamma | X >= d + // Y = cX | X < d + case 4: + if (R >= Params[4]) { + + e = Params[1]*R + Params[2]; + + if (e > 0) + Val = pow(e, Params[0]); + else + Val = 0; + } + else + Val = R * Params[3]; + break; + + // Type 4 reversed + // X=((Y^1/g-b)/a) | Y >= (ad+b)^g + // X=Y/c | Y< (ad+b)^g + case -4: + { + + e = Params[1] * Params[4] + Params[2]; + if (e < 0) + disc = 0; + else + disc = pow(e, Params[0]); + + if (R >= disc) { + + if (fabs(Params[0]) < MATRIX_DET_TOLERANCE || + fabs(Params[1]) < MATRIX_DET_TOLERANCE) + + Val = 0; + + else + Val = (pow(R, 1.0 / Params[0]) - Params[2]) / Params[1]; + } + else { + + if (fabs(Params[3]) < MATRIX_DET_TOLERANCE) + Val = 0; + else + Val = R / Params[3]; + } + + } + break; + + + // Y = (aX + b)^Gamma + e | X >= d + // Y = cX + f | X < d + case 5: + if (R >= Params[4]) { + + e = Params[1]*R + Params[2]; + + if (e > 0) + Val = pow(e, Params[0]) + Params[5]; + else + Val = Params[5]; + } + else + Val = R*Params[3] + Params[6]; + break; + + + // Reversed type 5 + // X=((Y-e)1/g-b)/a | Y >=(ad+b)^g+e), cd+f + // X=(Y-f)/c | else + case -5: + { + disc = Params[3] * Params[4] + Params[6]; + if (R >= disc) { + + e = R - Params[5]; + if (e < 0) + Val = 0; + else + { + if (fabs(Params[0]) < MATRIX_DET_TOLERANCE || + fabs(Params[1]) < MATRIX_DET_TOLERANCE) + + Val = 0; + else + Val = (pow(e, 1.0 / Params[0]) - Params[2]) / Params[1]; + } + } + else { + if (fabs(Params[3]) < MATRIX_DET_TOLERANCE) + Val = 0; + else + Val = (R - Params[6]) / Params[3]; + } + + } + break; + + + // Types 6,7,8 comes from segmented curves as described in ICCSpecRevision_02_11_06_Float.pdf + // Type 6 is basically identical to type 5 without d + + // Y = (a * X + b) ^ Gamma + c + case 6: + e = Params[1]*R + Params[2]; + + // On gamma 1.0, don't clamp + if (Params[0] == 1.0) { + Val = e + Params[3]; + } + else { + if (e < 0) + Val = Params[3]; + else + Val = pow(e, Params[0]) + Params[3]; + } + break; + + // ((Y - c) ^1/Gamma - b) / a + case -6: + { + if (fabs(Params[0]) < MATRIX_DET_TOLERANCE || + fabs(Params[1]) < MATRIX_DET_TOLERANCE) + { + Val = 0; + } + else + { + e = R - Params[3]; + if (e < 0) + Val = 0; + else + Val = (pow(e, 1.0 / Params[0]) - Params[2]) / Params[1]; + } + } + break; + + + // Y = a * log (b * X^Gamma + c) + d + case 7: + + e = Params[2] * pow(R, Params[0]) + Params[3]; + if (e <= 0) + Val = Params[4]; + else + Val = Params[1]*log10(e) + Params[4]; + break; + + // (Y - d) / a = log(b * X ^Gamma + c) + // pow(10, (Y-d) / a) = b * X ^Gamma + c + // pow((pow(10, (Y-d) / a) - c) / b, 1/g) = X + case -7: + { + if (fabs(Params[0]) < MATRIX_DET_TOLERANCE || + fabs(Params[1]) < MATRIX_DET_TOLERANCE || + fabs(Params[2]) < MATRIX_DET_TOLERANCE) + { + Val = 0; + } + else + { + Val = pow((pow(10.0, (R - Params[4]) / Params[1]) - Params[3]) / Params[2], 1.0 / Params[0]); + } + } + break; + + + //Y = a * b^(c*X+d) + e + case 8: + Val = (Params[0] * pow(Params[1], Params[2] * R + Params[3]) + Params[4]); + break; + + + // Y = (log((y-e) / a) / log(b) - d ) / c + // a=0, b=1, c=2, d=3, e=4, + case -8: + + disc = R - Params[4]; + if (disc < 0) Val = 0; + else + { + if (fabs(Params[0]) < MATRIX_DET_TOLERANCE || + fabs(Params[2]) < MATRIX_DET_TOLERANCE) + { + Val = 0; + } + else + { + Val = (log(disc / Params[0]) / log(Params[1]) - Params[3]) / Params[2]; + } + } + break; + + + // S-Shaped: (1 - (1-x)^1/g)^1/g + case 108: + if (fabs(Params[0]) < MATRIX_DET_TOLERANCE) + Val = 0; + else + Val = pow(1.0 - pow(1 - R, 1/Params[0]), 1/Params[0]); + break; + + // y = (1 - (1-x)^1/g)^1/g + // y^g = (1 - (1-x)^1/g) + // 1 - y^g = (1-x)^1/g + // (1 - y^g)^g = 1 - x + // 1 - (1 - y^g)^g + case -108: + Val = 1 - pow(1 - pow(R, Params[0]), Params[0]); + break; + + // Sigmoidals + case 109: + Val = sigmoid_factory(Params[0], R); + break; + + case -109: + Val = inverse_sigmoid_factory(Params[0], R); + break; + + default: + // Unsupported parametric curve. Should never reach here + return 0; + } + + return Val; +} + +// Evaluate a segmented function for a single value. Return -Inf if no valid segment found . +// If fn type is 0, perform an interpolation on the table +static +cmsFloat64Number EvalSegmentedFn(const cmsToneCurve *g, cmsFloat64Number R) +{ + int i; + cmsFloat32Number Out32; + cmsFloat64Number Out; + + for (i = (int) g->nSegments - 1; i >= 0; --i) { + + // Check for domain + if ((R > g->Segments[i].x0) && (R <= g->Segments[i].x1)) { + + // Type == 0 means segment is sampled + if (g->Segments[i].Type == 0) { + + cmsFloat32Number R1 = (cmsFloat32Number)(R - g->Segments[i].x0) / (g->Segments[i].x1 - g->Segments[i].x0); + + // Setup the table (TODO: clean that) + g->SegInterp[i]->Table = g->Segments[i].SampledPoints; + + g->SegInterp[i]->Interpolation.LerpFloat(&R1, &Out32, g->SegInterp[i]); + Out = (cmsFloat64Number) Out32; + + } + else { + Out = g->Evals[i](g->Segments[i].Type, g->Segments[i].Params, R); + } + + if (isinf(Out)) + return PLUS_INF; + else + { + if (isinf(-Out)) + return MINUS_INF; + } + + return Out; + } + } + + return MINUS_INF; +} + +// Access to estimated low-res table +cmsUInt32Number CMSEXPORT cmsGetToneCurveEstimatedTableEntries(const cmsToneCurve* t) +{ + _cmsAssert(t != NULL); + return t ->nEntries; +} + +const cmsUInt16Number* CMSEXPORT cmsGetToneCurveEstimatedTable(const cmsToneCurve* t) +{ + _cmsAssert(t != NULL); + return t ->Table16; +} + + +// Create an empty gamma curve, by using tables. This specifies only the limited-precision part, and leaves the +// floating point description empty. +cmsToneCurve* CMSEXPORT cmsBuildTabulatedToneCurve16(cmsContext ContextID, cmsUInt32Number nEntries, const cmsUInt16Number Values[]) +{ + return AllocateToneCurveStruct(ContextID, nEntries, 0, NULL, Values); +} + +static +cmsUInt32Number EntriesByGamma(cmsFloat64Number Gamma) +{ + if (fabs(Gamma - 1.0) < 0.001) return 2; + return 4096; +} + + +// Create a segmented gamma, fill the table +cmsToneCurve* CMSEXPORT cmsBuildSegmentedToneCurve(cmsContext ContextID, + cmsUInt32Number nSegments, const cmsCurveSegment Segments[]) +{ + cmsUInt32Number i; + cmsFloat64Number R, Val; + cmsToneCurve* g; + cmsUInt32Number nGridPoints = 4096; + + _cmsAssert(Segments != NULL); + + // Optimizatin for identity curves. + if (nSegments == 1 && Segments[0].Type == 1) { + + nGridPoints = EntriesByGamma(Segments[0].Params[0]); + } + + g = AllocateToneCurveStruct(ContextID, nGridPoints, nSegments, Segments, NULL); + if (g == NULL) return NULL; + + // Once we have the floating point version, we can approximate a 16 bit table of 4096 entries + // for performance reasons. This table would normally not be used except on 8/16 bits transforms. + for (i = 0; i < nGridPoints; i++) { + + R = (cmsFloat64Number) i / (nGridPoints-1); + + Val = EvalSegmentedFn(g, R); + + // Round and saturate + g ->Table16[i] = _cmsQuickSaturateWord(Val * 65535.0); + } + + return g; +} + +// Use a segmented curve to store the floating point table +cmsToneCurve* CMSEXPORT cmsBuildTabulatedToneCurveFloat(cmsContext ContextID, cmsUInt32Number nEntries, const cmsFloat32Number values[]) +{ + cmsCurveSegment Seg[3]; + + // Do some housekeeping + if (nEntries == 0 || values == NULL) + return NULL; + + // A segmented tone curve should have function segments in the first and last positions + // Initialize segmented curve part up to 0 to constant value = samples[0] + Seg[0].x0 = MINUS_INF; + Seg[0].x1 = 0; + Seg[0].Type = 6; + + Seg[0].Params[0] = 1; + Seg[0].Params[1] = 0; + Seg[0].Params[2] = 0; + Seg[0].Params[3] = values[0]; + Seg[0].Params[4] = 0; + + // From zero to 1 + Seg[1].x0 = 0; + Seg[1].x1 = 1.0; + Seg[1].Type = 0; + + Seg[1].nGridPoints = nEntries; + Seg[1].SampledPoints = (cmsFloat32Number*) values; + + // Final segment is constant = lastsample + Seg[2].x0 = 1.0; + Seg[2].x1 = PLUS_INF; + Seg[2].Type = 6; + + Seg[2].Params[0] = 1; + Seg[2].Params[1] = 0; + Seg[2].Params[2] = 0; + Seg[2].Params[3] = values[nEntries-1]; + Seg[2].Params[4] = 0; + + + return cmsBuildSegmentedToneCurve(ContextID, 3, Seg); +} + +// Parametric curves +// +// Parameters goes as: Curve, a, b, c, d, e, f +// Type is the ICC type +1 +// if type is negative, then the curve is analytically inverted +cmsToneCurve* CMSEXPORT cmsBuildParametricToneCurve(cmsContext ContextID, cmsInt32Number Type, const cmsFloat64Number Params[]) +{ + cmsCurveSegment Seg0; + int Pos = 0; + cmsUInt32Number size; + _cmsParametricCurvesCollection* c = GetParametricCurveByType(ContextID, Type, &Pos); + + _cmsAssert(Params != NULL); + + if (c == NULL) { + cmsSignalError(ContextID, cmsERROR_UNKNOWN_EXTENSION, "Invalid parametric curve type %d", Type); + return NULL; + } + + memset(&Seg0, 0, sizeof(Seg0)); + + Seg0.x0 = MINUS_INF; + Seg0.x1 = PLUS_INF; + Seg0.Type = Type; + + size = c->ParameterCount[Pos] * sizeof(cmsFloat64Number); + memmove(Seg0.Params, Params, size); + + return cmsBuildSegmentedToneCurve(ContextID, 1, &Seg0); +} + + + +// Build a gamma table based on gamma constant +cmsToneCurve* CMSEXPORT cmsBuildGamma(cmsContext ContextID, cmsFloat64Number Gamma) +{ + return cmsBuildParametricToneCurve(ContextID, 1, &Gamma); +} + + +// Free all memory taken by the gamma curve +void CMSEXPORT cmsFreeToneCurve(cmsToneCurve* Curve) +{ + cmsContext ContextID; + + if (Curve == NULL) return; + + ContextID = Curve ->InterpParams->ContextID; + + _cmsFreeInterpParams(Curve ->InterpParams); + + if (Curve -> Table16) + _cmsFree(ContextID, Curve ->Table16); + + if (Curve ->Segments) { + + cmsUInt32Number i; + + for (i=0; i < Curve ->nSegments; i++) { + + if (Curve ->Segments[i].SampledPoints) { + _cmsFree(ContextID, Curve ->Segments[i].SampledPoints); + } + + if (Curve ->SegInterp[i] != 0) + _cmsFreeInterpParams(Curve->SegInterp[i]); + } + + _cmsFree(ContextID, Curve ->Segments); + _cmsFree(ContextID, Curve ->SegInterp); + } + + if (Curve -> Evals) + _cmsFree(ContextID, Curve -> Evals); + + _cmsFree(ContextID, Curve); +} + +// Utility function, free 3 gamma tables +void CMSEXPORT cmsFreeToneCurveTriple(cmsToneCurve* Curve[3]) +{ + + _cmsAssert(Curve != NULL); + + if (Curve[0] != NULL) cmsFreeToneCurve(Curve[0]); + if (Curve[1] != NULL) cmsFreeToneCurve(Curve[1]); + if (Curve[2] != NULL) cmsFreeToneCurve(Curve[2]); + + Curve[0] = Curve[1] = Curve[2] = NULL; +} + + +// Duplicate a gamma table +cmsToneCurve* CMSEXPORT cmsDupToneCurve(const cmsToneCurve* In) +{ + if (In == NULL) return NULL; + + return AllocateToneCurveStruct(In ->InterpParams ->ContextID, In ->nEntries, In ->nSegments, In ->Segments, In ->Table16); +} + +// Joins two curves for X and Y. Curves should be monotonic. +// We want to get +// +// y = Y^-1(X(t)) +// +cmsToneCurve* CMSEXPORT cmsJoinToneCurve(cmsContext ContextID, + const cmsToneCurve* X, + const cmsToneCurve* Y, cmsUInt32Number nResultingPoints) +{ + cmsToneCurve* out = NULL; + cmsToneCurve* Yreversed = NULL; + cmsFloat32Number t, x; + cmsFloat32Number* Res = NULL; + cmsUInt32Number i; + + + _cmsAssert(X != NULL); + _cmsAssert(Y != NULL); + + Yreversed = cmsReverseToneCurveEx(nResultingPoints, Y); + if (Yreversed == NULL) goto Error; + + Res = (cmsFloat32Number*) _cmsCalloc(ContextID, nResultingPoints, sizeof(cmsFloat32Number)); + if (Res == NULL) goto Error; + + //Iterate + for (i=0; i < nResultingPoints; i++) { + + t = (cmsFloat32Number) i / (cmsFloat32Number)(nResultingPoints-1); + x = cmsEvalToneCurveFloat(X, t); + Res[i] = cmsEvalToneCurveFloat(Yreversed, x); + } + + // Allocate space for output + out = cmsBuildTabulatedToneCurveFloat(ContextID, nResultingPoints, Res); + +Error: + + if (Res != NULL) _cmsFree(ContextID, Res); + if (Yreversed != NULL) cmsFreeToneCurve(Yreversed); + + return out; +} + + + +// Get the surrounding nodes. This is tricky on non-monotonic tables +static +int GetInterval(cmsFloat64Number In, const cmsUInt16Number LutTable[], const struct _cms_interp_struc* p) +{ + int i; + int y0, y1; + + // A 1 point table is not allowed + if (p -> Domain[0] < 1) return -1; + + // Let's see if ascending or descending. + if (LutTable[0] < LutTable[p ->Domain[0]]) { + + // Table is overall ascending + for (i = (int) p->Domain[0] - 1; i >= 0; --i) { + + y0 = LutTable[i]; + y1 = LutTable[i+1]; + + if (y0 <= y1) { // Increasing + if (In >= y0 && In <= y1) return i; + } + else + if (y1 < y0) { // Decreasing + if (In >= y1 && In <= y0) return i; + } + } + } + else { + // Table is overall descending + for (i=0; i < (int) p -> Domain[0]; i++) { + + y0 = LutTable[i]; + y1 = LutTable[i+1]; + + if (y0 <= y1) { // Increasing + if (In >= y0 && In <= y1) return i; + } + else + if (y1 < y0) { // Decreasing + if (In >= y1 && In <= y0) return i; + } + } + } + + return -1; +} + +// Reverse a gamma table +cmsToneCurve* CMSEXPORT cmsReverseToneCurveEx(cmsUInt32Number nResultSamples, const cmsToneCurve* InCurve) +{ + cmsToneCurve *out; + cmsFloat64Number a = 0, b = 0, y, x1, y1, x2, y2; + int i, j; + int Ascending; + + _cmsAssert(InCurve != NULL); + + // Try to reverse it analytically whatever possible + + if (InCurve ->nSegments == 1 && InCurve ->Segments[0].Type > 0 && + /* InCurve -> Segments[0].Type <= 5 */ + GetParametricCurveByType(InCurve ->InterpParams->ContextID, InCurve ->Segments[0].Type, NULL) != NULL) { + + return cmsBuildParametricToneCurve(InCurve ->InterpParams->ContextID, + -(InCurve -> Segments[0].Type), + InCurve -> Segments[0].Params); + } + + // Nope, reverse the table. + out = cmsBuildTabulatedToneCurve16(InCurve ->InterpParams->ContextID, nResultSamples, NULL); + if (out == NULL) + return NULL; + + // We want to know if this is an ascending or descending table + Ascending = !cmsIsToneCurveDescending(InCurve); + + // Iterate across Y axis + for (i=0; i < (int) nResultSamples; i++) { + + y = (cmsFloat64Number) i * 65535.0 / (nResultSamples - 1); + + // Find interval in which y is within. + j = GetInterval(y, InCurve->Table16, InCurve->InterpParams); + if (j >= 0) { + + + // Get limits of interval + x1 = InCurve ->Table16[j]; + x2 = InCurve ->Table16[j+1]; + + y1 = (cmsFloat64Number) (j * 65535.0) / (InCurve ->nEntries - 1); + y2 = (cmsFloat64Number) ((j+1) * 65535.0 ) / (InCurve ->nEntries - 1); + + // If collapsed, then use any + if (x1 == x2) { + + out ->Table16[i] = _cmsQuickSaturateWord(Ascending ? y2 : y1); + continue; + + } else { + + // Interpolate + a = (y2 - y1) / (x2 - x1); + b = y2 - a * x2; + } + } + + out ->Table16[i] = _cmsQuickSaturateWord(a* y + b); + } + + + return out; +} + +// Reverse a gamma table +cmsToneCurve* CMSEXPORT cmsReverseToneCurve(const cmsToneCurve* InGamma) +{ + _cmsAssert(InGamma != NULL); + + return cmsReverseToneCurveEx(4096, InGamma); +} + +// From: Eilers, P.H.C. (1994) Smoothing and interpolation with finite +// differences. in: Graphic Gems IV, Heckbert, P.S. (ed.), Academic press. +// +// Smoothing and interpolation with second differences. +// +// Input: weights (w), data (y): vector from 1 to m. +// Input: smoothing parameter (lambda), length (m). +// Output: smoothed vector (z): vector from 1 to m. + +static +cmsBool smooth2(cmsContext ContextID, cmsFloat32Number w[], cmsFloat32Number y[], + cmsFloat32Number z[], cmsFloat32Number lambda, int m) +{ + int i, i1, i2; + cmsFloat32Number *c, *d, *e; + cmsBool st; + + if (m < 4 || lambda < MATRIX_DET_TOLERANCE) return FALSE; + + c = (cmsFloat32Number*) _cmsCalloc(ContextID, MAX_NODES_IN_CURVE, sizeof(cmsFloat32Number)); + d = (cmsFloat32Number*) _cmsCalloc(ContextID, MAX_NODES_IN_CURVE, sizeof(cmsFloat32Number)); + e = (cmsFloat32Number*) _cmsCalloc(ContextID, MAX_NODES_IN_CURVE, sizeof(cmsFloat32Number)); + + if (c != NULL && d != NULL && e != NULL) { + + + d[1] = w[1] + lambda; + c[1] = -2 * lambda / d[1]; + e[1] = lambda /d[1]; + z[1] = w[1] * y[1]; + d[2] = w[2] + 5 * lambda - d[1] * c[1] * c[1]; + c[2] = (-4 * lambda - d[1] * c[1] * e[1]) / d[2]; + e[2] = lambda / d[2]; + z[2] = w[2] * y[2] - c[1] * z[1]; + + for (i = 3; i < m - 1; i++) { + i1 = i - 1; i2 = i - 2; + d[i]= w[i] + 6 * lambda - c[i1] * c[i1] * d[i1] - e[i2] * e[i2] * d[i2]; + c[i] = (-4 * lambda -d[i1] * c[i1] * e[i1])/ d[i]; + e[i] = lambda / d[i]; + z[i] = w[i] * y[i] - c[i1] * z[i1] - e[i2] * z[i2]; + } + + i1 = m - 2; i2 = m - 3; + + d[m - 1] = w[m - 1] + 5 * lambda -c[i1] * c[i1] * d[i1] - e[i2] * e[i2] * d[i2]; + c[m - 1] = (-2 * lambda - d[i1] * c[i1] * e[i1]) / d[m - 1]; + z[m - 1] = w[m - 1] * y[m - 1] - c[i1] * z[i1] - e[i2] * z[i2]; + i1 = m - 1; i2 = m - 2; + + d[m] = w[m] + lambda - c[i1] * c[i1] * d[i1] - e[i2] * e[i2] * d[i2]; + z[m] = (w[m] * y[m] - c[i1] * z[i1] - e[i2] * z[i2]) / d[m]; + z[m - 1] = z[m - 1] / d[m - 1] - c[m - 1] * z[m]; + + for (i = m - 2; 1<= i; i--) + z[i] = z[i] / d[i] - c[i] * z[i + 1] - e[i] * z[i + 2]; + + st = TRUE; + } + else st = FALSE; + + if (c != NULL) _cmsFree(ContextID, c); + if (d != NULL) _cmsFree(ContextID, d); + if (e != NULL) _cmsFree(ContextID, e); + + return st; +} + +// Smooths a curve sampled at regular intervals. +cmsBool CMSEXPORT cmsSmoothToneCurve(cmsToneCurve* Tab, cmsFloat64Number lambda) +{ + cmsBool SuccessStatus = TRUE; + cmsFloat32Number *w, *y, *z; + cmsUInt32Number i, nItems, Zeros, Poles; + cmsBool notCheck = FALSE; + + if (Tab != NULL && Tab->InterpParams != NULL) + { + cmsContext ContextID = Tab->InterpParams->ContextID; + + if (!cmsIsToneCurveLinear(Tab)) // Only non-linear curves need smoothing + { + nItems = Tab->nEntries; + if (nItems < MAX_NODES_IN_CURVE) + { + // Allocate one more item than needed + w = (cmsFloat32Number *)_cmsCalloc(ContextID, nItems + 1, sizeof(cmsFloat32Number)); + y = (cmsFloat32Number *)_cmsCalloc(ContextID, nItems + 1, sizeof(cmsFloat32Number)); + z = (cmsFloat32Number *)_cmsCalloc(ContextID, nItems + 1, sizeof(cmsFloat32Number)); + + if (w != NULL && y != NULL && z != NULL) // Ensure no memory allocation failure + { + memset(w, 0, (nItems + 1) * sizeof(cmsFloat32Number)); + memset(y, 0, (nItems + 1) * sizeof(cmsFloat32Number)); + memset(z, 0, (nItems + 1) * sizeof(cmsFloat32Number)); + + for (i = 0; i < nItems; i++) + { + y[i + 1] = (cmsFloat32Number)Tab->Table16[i]; + w[i + 1] = 1.0; + } + + if (lambda < 0) + { + notCheck = TRUE; + lambda = -lambda; + } + + if (smooth2(ContextID, w, y, z, (cmsFloat32Number)lambda, (int)nItems)) + { + // Do some reality - checking... + + Zeros = Poles = 0; + for (i = nItems; i > 1; --i) + { + if (z[i] == 0.) Zeros++; + if (z[i] >= 65535.) Poles++; + if (z[i] < z[i - 1]) + { + cmsSignalError(ContextID, cmsERROR_RANGE, "cmsSmoothToneCurve: Non-Monotonic."); + SuccessStatus = notCheck; + break; + } + } + + if (SuccessStatus && Zeros > (nItems / 3)) + { + cmsSignalError(ContextID, cmsERROR_RANGE, "cmsSmoothToneCurve: Degenerated, mostly zeros."); + SuccessStatus = notCheck; + } + + if (SuccessStatus && Poles > (nItems / 3)) + { + cmsSignalError(ContextID, cmsERROR_RANGE, "cmsSmoothToneCurve: Degenerated, mostly poles."); + SuccessStatus = notCheck; + } + + if (SuccessStatus) // Seems ok + { + for (i = 0; i < nItems; i++) + { + // Clamp to cmsUInt16Number + Tab->Table16[i] = _cmsQuickSaturateWord(z[i + 1]); + } + } + } + else // Could not smooth + { + cmsSignalError(ContextID, cmsERROR_RANGE, "cmsSmoothToneCurve: Function smooth2 failed."); + SuccessStatus = FALSE; + } + } + else // One or more buffers could not be allocated + { + cmsSignalError(ContextID, cmsERROR_RANGE, "cmsSmoothToneCurve: Could not allocate memory."); + SuccessStatus = FALSE; + } + + if (z != NULL) + _cmsFree(ContextID, z); + + if (y != NULL) + _cmsFree(ContextID, y); + + if (w != NULL) + _cmsFree(ContextID, w); + } + else // too many items in the table + { + cmsSignalError(ContextID, cmsERROR_RANGE, "cmsSmoothToneCurve: Too many points."); + SuccessStatus = FALSE; + } + } + } + else // Tab parameter or Tab->InterpParams is NULL + { + // Can't signal an error here since the ContextID is not known at this point + SuccessStatus = FALSE; + } + + return SuccessStatus; +} + +// Is a table linear? Do not use parametric since we cannot guarantee some weird parameters resulting +// in a linear table. This way assures it is linear in 12 bits, which should be enough in most cases. +cmsBool CMSEXPORT cmsIsToneCurveLinear(const cmsToneCurve* Curve) +{ + int i; + int diff; + + _cmsAssert(Curve != NULL); + + for (i=0; i < (int) Curve ->nEntries; i++) { + + diff = abs((int) Curve->Table16[i] - (int) _cmsQuantizeVal(i, Curve ->nEntries)); + if (diff > 0x0f) + return FALSE; + } + + return TRUE; +} + +// Same, but for monotonicity +cmsBool CMSEXPORT cmsIsToneCurveMonotonic(const cmsToneCurve* t) +{ + cmsUInt32Number n; + int i, last; + cmsBool lDescending; + + _cmsAssert(t != NULL); + + // Degenerated curves are monotonic? Ok, let's pass them + n = t ->nEntries; + if (n < 2) return TRUE; + + // Curve direction + lDescending = cmsIsToneCurveDescending(t); + + if (lDescending) { + + last = t ->Table16[0]; + + for (i = 1; i < (int) n; i++) { + + if (t ->Table16[i] - last > 2) // We allow some ripple + return FALSE; + else + last = t ->Table16[i]; + + } + } + else { + + last = t ->Table16[n-1]; + + for (i = (int) n - 2; i >= 0; --i) { + + if (t ->Table16[i] - last > 2) + return FALSE; + else + last = t ->Table16[i]; + + } + } + + return TRUE; +} + +// Same, but for descending tables +cmsBool CMSEXPORT cmsIsToneCurveDescending(const cmsToneCurve* t) +{ + _cmsAssert(t != NULL); + + return t ->Table16[0] > t ->Table16[t ->nEntries-1]; +} + + +// Another info fn: is out gamma table multisegment? +cmsBool CMSEXPORT cmsIsToneCurveMultisegment(const cmsToneCurve* t) +{ + _cmsAssert(t != NULL); + + return t -> nSegments > 1; +} + +cmsInt32Number CMSEXPORT cmsGetToneCurveParametricType(const cmsToneCurve* t) +{ + _cmsAssert(t != NULL); + + if (t -> nSegments != 1) return 0; + return t ->Segments[0].Type; +} + +// We need accuracy this time +cmsFloat32Number CMSEXPORT cmsEvalToneCurveFloat(const cmsToneCurve* Curve, cmsFloat32Number v) +{ + _cmsAssert(Curve != NULL); + + // Check for 16 bits table. If so, this is a limited-precision tone curve + if (Curve ->nSegments == 0) { + + cmsUInt16Number In, Out; + + In = (cmsUInt16Number) _cmsQuickSaturateWord(v * 65535.0); + Out = cmsEvalToneCurve16(Curve, In); + + return (cmsFloat32Number) (Out / 65535.0); + } + + return (cmsFloat32Number) EvalSegmentedFn(Curve, v); +} + +// We need xput over here +cmsUInt16Number CMSEXPORT cmsEvalToneCurve16(const cmsToneCurve* Curve, cmsUInt16Number v) +{ + cmsUInt16Number out; + + _cmsAssert(Curve != NULL); + + Curve ->InterpParams ->Interpolation.Lerp16(&v, &out, Curve ->InterpParams); + return out; +} + + +// Least squares fitting. +// A mathematical procedure for finding the best-fitting curve to a given set of points by +// minimizing the sum of the squares of the offsets ("the residuals") of the points from the curve. +// The sum of the squares of the offsets is used instead of the offset absolute values because +// this allows the residuals to be treated as a continuous differentiable quantity. +// +// y = f(x) = x ^ g +// +// R = (yi - (xi^g)) +// R2 = (yi - (xi^g))2 +// SUM R2 = SUM (yi - (xi^g))2 +// +// dR2/dg = -2 SUM x^g log(x)(y - x^g) +// solving for dR2/dg = 0 +// +// g = 1/n * SUM(log(y) / log(x)) + +cmsFloat64Number CMSEXPORT cmsEstimateGamma(const cmsToneCurve* t, cmsFloat64Number Precision) +{ + cmsFloat64Number gamma, sum, sum2; + cmsFloat64Number n, x, y, Std; + cmsUInt32Number i; + + _cmsAssert(t != NULL); + + sum = sum2 = n = 0; + + // Excluding endpoints + for (i=1; i < (MAX_NODES_IN_CURVE-1); i++) { + + x = (cmsFloat64Number) i / (MAX_NODES_IN_CURVE-1); + y = (cmsFloat64Number) cmsEvalToneCurveFloat(t, (cmsFloat32Number) x); + + // Avoid 7% on lower part to prevent + // artifacts due to linear ramps + + if (y > 0. && y < 1. && x > 0.07) { + + gamma = log(y) / log(x); + sum += gamma; + sum2 += gamma * gamma; + n++; + } + } + + // We need enough valid samples + if (n <= 1) return -1.0; + + // Take a look on SD to see if gamma isn't exponential at all + Std = sqrt((n * sum2 - sum * sum) / (n*(n-1))); + + if (Std > Precision) + return -1.0; + + return (sum / n); // The mean +} + +// Retrieve segments on tone curves + +const cmsCurveSegment* CMSEXPORT cmsGetToneCurveSegment(cmsInt32Number n, const cmsToneCurve* t) +{ + _cmsAssert(t != NULL); + + if (n < 0 || n >= (cmsInt32Number) t->nSegments) return NULL; + return t->Segments + n; +} + diff --git a/local/recipes/libs/lcms2/source/src/cmsgmt.c b/local/recipes/libs/lcms2/source/src/cmsgmt.c new file mode 100644 index 0000000000..fcd6c4cc28 --- /dev/null +++ b/local/recipes/libs/lcms2/source/src/cmsgmt.c @@ -0,0 +1,662 @@ +//--------------------------------------------------------------------------------- +// +// Little Color Management System +// Copyright (c) 1998-2026 Marti Maria Saguer +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//--------------------------------------------------------------------------------- +// + +#include "lcms2_internal.h" + + +// Auxiliary: append a Lab identity after the given sequence of profiles +// and return the transform. Lab profile is closed, rest of profiles are kept open. +cmsHTRANSFORM _cmsChain2Lab(cmsContext ContextID, + cmsUInt32Number nProfiles, + cmsUInt32Number InputFormat, + cmsUInt32Number OutputFormat, + const cmsUInt32Number Intents[], + const cmsHPROFILE hProfiles[], + const cmsBool BPC[], + const cmsFloat64Number AdaptationStates[], + cmsUInt32Number dwFlags) +{ + cmsHTRANSFORM xform; + cmsHPROFILE hLab; + cmsHPROFILE ProfileList[256]; + cmsBool BPCList[256]; + cmsFloat64Number AdaptationList[256]; + cmsUInt32Number IntentList[256]; + cmsUInt32Number i; + + // This is a rather big number and there is no need of dynamic memory + // since we are adding a profile, 254 + 1 = 255 and this is the limit + if (nProfiles > 254) return NULL; + + // The output space + hLab = cmsCreateLab4ProfileTHR(ContextID, NULL); + if (hLab == NULL) return NULL; + + // Create a copy of parameters + for (i=0; i < nProfiles; i++) { + + ProfileList[i] = hProfiles[i]; + BPCList[i] = BPC[i]; + AdaptationList[i] = AdaptationStates[i]; + IntentList[i] = Intents[i]; + } + + // Place Lab identity at chain's end. + ProfileList[nProfiles] = hLab; + BPCList[nProfiles] = 0; + AdaptationList[nProfiles] = 1.0; + IntentList[nProfiles] = INTENT_RELATIVE_COLORIMETRIC; + + // Create the transform + xform = cmsCreateExtendedTransform(ContextID, nProfiles + 1, ProfileList, + BPCList, + IntentList, + AdaptationList, + NULL, 0, + InputFormat, + OutputFormat, + dwFlags); + + cmsCloseProfile(hLab); + + return xform; +} + + +// Compute K -> L* relationship. Flags may include black point compensation. In this case, +// the relationship is assumed from the profile with BPC to a black point zero. +static +cmsToneCurve* ComputeKToLstar(cmsContext ContextID, + cmsUInt32Number nPoints, + cmsUInt32Number nProfiles, + const cmsUInt32Number Intents[], + const cmsHPROFILE hProfiles[], + const cmsBool BPC[], + const cmsFloat64Number AdaptationStates[], + cmsUInt32Number dwFlags) +{ + cmsToneCurve* out = NULL; + cmsUInt32Number i; + cmsHTRANSFORM xform; + cmsCIELab Lab; + cmsFloat32Number cmyk[4]; + cmsFloat32Number* SampledPoints; + + xform = _cmsChain2Lab(ContextID, nProfiles, TYPE_CMYK_FLT, TYPE_Lab_DBL, Intents, hProfiles, BPC, AdaptationStates, dwFlags); + if (xform == NULL) return NULL; + + SampledPoints = (cmsFloat32Number*) _cmsCalloc(ContextID, nPoints, sizeof(cmsFloat32Number)); + if (SampledPoints == NULL) goto Error; + + for (i=0; i < nPoints; i++) { + + cmyk[0] = 0; + cmyk[1] = 0; + cmyk[2] = 0; + cmyk[3] = (cmsFloat32Number) ((i * 100.0) / (nPoints-1)); + + cmsDoTransform(xform, cmyk, &Lab, 1); + SampledPoints[i]= (cmsFloat32Number) (1.0 - Lab.L / 100.0); // Negate K for easier operation + } + + out = cmsBuildTabulatedToneCurveFloat(ContextID, nPoints, SampledPoints); + +Error: + + cmsDeleteTransform(xform); + if (SampledPoints) _cmsFree(ContextID, SampledPoints); + + return out; +} + + +// Compute Black tone curve on a CMYK -> CMYK transform. This is done by +// using the proof direction on both profiles to find K->L* relationship +// then joining both curves. dwFlags may include black point compensation. +cmsToneCurve* _cmsBuildKToneCurve(cmsContext ContextID, + cmsUInt32Number nPoints, + cmsUInt32Number nProfiles, + const cmsUInt32Number Intents[], + const cmsHPROFILE hProfiles[], + const cmsBool BPC[], + const cmsFloat64Number AdaptationStates[], + cmsUInt32Number dwFlags) +{ + cmsToneCurve *in, *out, *KTone; + + // Make sure CMYK -> CMYK + if (cmsGetColorSpace(hProfiles[0]) != cmsSigCmykData || + cmsGetColorSpace(hProfiles[nProfiles-1])!= cmsSigCmykData) return NULL; + + + // Make sure last is an output profile + if (cmsGetDeviceClass(hProfiles[nProfiles - 1]) != cmsSigOutputClass) return NULL; + + // Create individual curves. BPC works also as each K to L* is + // computed as a BPC to zero black point in case of L* + in = ComputeKToLstar(ContextID, nPoints, nProfiles - 1, Intents, hProfiles, BPC, AdaptationStates, dwFlags); + if (in == NULL) return NULL; + + out = ComputeKToLstar(ContextID, nPoints, 1, + Intents + (nProfiles - 1), + &hProfiles [nProfiles - 1], + BPC + (nProfiles - 1), + AdaptationStates + (nProfiles - 1), + dwFlags); + if (out == NULL) { + cmsFreeToneCurve(in); + return NULL; + } + + // Build the relationship. This effectively limits the maximum accuracy to 16 bits, but + // since this is used on black-preserving LUTs, we are not losing accuracy in any case + KTone = cmsJoinToneCurve(ContextID, in, out, nPoints); + + // Get rid of components + cmsFreeToneCurve(in); cmsFreeToneCurve(out); + + // Something went wrong... + if (KTone == NULL) return NULL; + + // Make sure it is monotonic + if (!cmsIsToneCurveMonotonic(KTone)) { + cmsFreeToneCurve(KTone); + return NULL; + } + + return KTone; +} + + +// Gamut LUT Creation ----------------------------------------------------------------------------------------- + +// Used by gamut & softproofing + +typedef struct { + + cmsHTRANSFORM hInput; // From whatever input color space. 16 bits to DBL + cmsHTRANSFORM hForward, hReverse; // Transforms going from Lab to colorant and back + cmsFloat64Number Threshold; // The threshold after which is considered out of gamut + + } GAMUTCHAIN; + +// This sampler does compute gamut boundaries by comparing original +// values with a transform going back and forth. Values above ERR_THRESHOLD +// of maximum are considered out of gamut. + +#define ERR_THRESHOLD 5 + + +static +int GamutSampler(CMSREGISTER const cmsUInt16Number In[], CMSREGISTER cmsUInt16Number Out[], CMSREGISTER void* Cargo) +{ + GAMUTCHAIN* t = (GAMUTCHAIN* ) Cargo; + cmsCIELab LabIn1, LabOut1; + cmsCIELab LabIn2, LabOut2; + cmsUInt16Number Proof[cmsMAXCHANNELS], Proof2[cmsMAXCHANNELS]; + cmsFloat64Number dE1, dE2, ErrorRatio; + + // Assume in-gamut by default. NEVER READ, USED FOR DEBUG PURPOSES. + ErrorRatio = 1.0; + + // Convert input to Lab + cmsDoTransform(t -> hInput, In, &LabIn1, 1); + + // converts from PCS to colorant. This always + // does return in-gamut values, + cmsDoTransform(t -> hForward, &LabIn1, Proof, 1); + + // Now, do the inverse, from colorant to PCS. + cmsDoTransform(t -> hReverse, Proof, &LabOut1, 1); + + memmove(&LabIn2, &LabOut1, sizeof(cmsCIELab)); + + // Try again, but this time taking Check as input + cmsDoTransform(t -> hForward, &LabOut1, Proof2, 1); + cmsDoTransform(t -> hReverse, Proof2, &LabOut2, 1); + + // Take difference of direct value + dE1 = cmsDeltaE(&LabIn1, &LabOut1); + + // Take difference of converted value + dE2 = cmsDeltaE(&LabIn2, &LabOut2); + + + // if dE1 is small and dE2 is small, value is likely to be in gamut + if (dE1 < t->Threshold && dE2 < t->Threshold) + Out[0] = 0; + else { + + // if dE1 is small and dE2 is big, undefined. Assume in gamut + if (dE1 < t->Threshold && dE2 > t->Threshold) + Out[0] = 0; + else + // dE1 is big and dE2 is small, clearly out of gamut + if (dE1 > t->Threshold && dE2 < t->Threshold) + Out[0] = (cmsUInt16Number) _cmsQuickFloor((dE1 - t->Threshold) + .5); + else { + + // dE1 is big and dE2 is also big, could be due to perceptual mapping + // so take error ratio + if (dE2 == 0.0) + ErrorRatio = dE1; + else + ErrorRatio = dE1 / dE2; + + if (ErrorRatio > t->Threshold) + Out[0] = (cmsUInt16Number) _cmsQuickFloor((ErrorRatio - t->Threshold) + .5); + else + Out[0] = 0; + } + } + + + return TRUE; +} + +// Does compute a gamut LUT going back and forth across pcs -> relativ. colorimetric intent -> pcs +// the dE obtained is then annotated on the LUT. Values truly out of gamut are clipped to dE = 0xFFFE +// and values changed are supposed to be handled by any gamut remapping, so, are out of gamut as well. +// +// **WARNING: This algorithm does assume that gamut remapping algorithms does NOT move in-gamut colors, +// of course, many perceptual and saturation intents does not work in such way, but relativ. ones should. + +cmsPipeline* _cmsCreateGamutCheckPipeline(cmsContext ContextID, + cmsHPROFILE hProfiles[], + cmsBool BPC[], + cmsUInt32Number Intents[], + cmsFloat64Number AdaptationStates[], + cmsUInt32Number nGamutPCSposition, + cmsHPROFILE hGamut) +{ + cmsHPROFILE hLab; + cmsPipeline* Gamut; + cmsStage* CLUT; + cmsUInt32Number dwFormat; + GAMUTCHAIN Chain; + cmsUInt32Number nGridpoints; + cmsInt32Number nChannels, nInputChannels; + cmsColorSpaceSignature ColorSpace; + cmsColorSpaceSignature InputColorSpace; + cmsUInt32Number i; + cmsHPROFILE ProfileList[256]; + cmsBool BPCList[256]; + cmsFloat64Number AdaptationList[256]; + cmsUInt32Number IntentList[256]; + + memset(&Chain, 0, sizeof(GAMUTCHAIN)); + + + if (nGamutPCSposition <= 0 || nGamutPCSposition > 255) { + cmsSignalError(ContextID, cmsERROR_RANGE, "Wrong position of PCS. 1..255 expected, %d found.", nGamutPCSposition); + return NULL; + } + + hLab = cmsCreateLab4ProfileTHR(ContextID, NULL); + if (hLab == NULL) return NULL; + + + // The figure of merit. On matrix-shaper profiles, should be almost zero as + // the conversion is pretty exact. On LUT based profiles, different resolutions + // of input and output CLUT may result in differences. + + if (cmsIsMatrixShaper(hGamut)) { + + Chain.Threshold = 1.0; + } + else { + Chain.Threshold = ERR_THRESHOLD; + } + + + // Create a copy of parameters + for (i=0; i < nGamutPCSposition; i++) { + ProfileList[i] = hProfiles[i]; + BPCList[i] = BPC[i]; + AdaptationList[i] = AdaptationStates[i]; + IntentList[i] = Intents[i]; + } + + // Fill Lab identity + ProfileList[nGamutPCSposition] = hLab; + BPCList[nGamutPCSposition] = 0; + AdaptationList[nGamutPCSposition] = 1.0; + IntentList[nGamutPCSposition] = INTENT_RELATIVE_COLORIMETRIC; + + ColorSpace = cmsGetColorSpace(hGamut); + nChannels = cmsChannelsOfColorSpace(ColorSpace); + nGridpoints = _cmsReasonableGridpointsByColorspace(ColorSpace, cmsFLAGS_HIGHRESPRECALC); + + InputColorSpace = cmsGetColorSpace(ProfileList[0]); + nInputChannels = cmsChannelsOfColorSpace(InputColorSpace); + dwFormat = (CHANNELS_SH(nInputChannels)|BYTES_SH(2)); + + // 16 bits to Lab double + Chain.hInput = cmsCreateExtendedTransform(ContextID, + nGamutPCSposition + 1, + ProfileList, + BPCList, + IntentList, + AdaptationList, + NULL, 0, + dwFormat, TYPE_Lab_DBL, + cmsFLAGS_NOCACHE); + + + // Does create the forward step. Lab double to device + dwFormat = (CHANNELS_SH(nChannels)|BYTES_SH(2)); + Chain.hForward = cmsCreateTransformTHR(ContextID, + hLab, TYPE_Lab_DBL, + hGamut, dwFormat, + INTENT_RELATIVE_COLORIMETRIC, + cmsFLAGS_NOCACHE); + + // Does create the backwards step + Chain.hReverse = cmsCreateTransformTHR(ContextID, hGamut, dwFormat, + hLab, TYPE_Lab_DBL, + INTENT_RELATIVE_COLORIMETRIC, + cmsFLAGS_NOCACHE); + + + // All ok? + if (Chain.hInput && Chain.hForward && Chain.hReverse) { + + // Go on, try to compute gamut LUT from PCS. This consist on a single channel containing + // dE when doing a transform back and forth on the colorimetric intent. + + Gamut = cmsPipelineAlloc(ContextID, 3, 1); + if (Gamut != NULL) { + + CLUT = cmsStageAllocCLut16bit(ContextID, nGridpoints, nChannels, 1, NULL); + if (!cmsPipelineInsertStage(Gamut, cmsAT_BEGIN, CLUT)) { + cmsPipelineFree(Gamut); + Gamut = NULL; + } + else { + cmsStageSampleCLut16bit(CLUT, GamutSampler, (void*) &Chain, 0); + } + } + } + else + Gamut = NULL; // Didn't work... + + // Free all needed stuff. + if (Chain.hInput) cmsDeleteTransform(Chain.hInput); + if (Chain.hForward) cmsDeleteTransform(Chain.hForward); + if (Chain.hReverse) cmsDeleteTransform(Chain.hReverse); + if (hLab) cmsCloseProfile(hLab); + + // And return computed hull + return Gamut; +} + +// Total Area Coverage estimation ---------------------------------------------------------------- + +typedef struct { + cmsUInt32Number nOutputChans; + cmsHTRANSFORM hRoundTrip; + cmsFloat32Number MaxTAC; + cmsFloat32Number MaxInput[cmsMAXCHANNELS]; + +} cmsTACestimator; + + +// This callback just accounts the maximum ink dropped in the given node. It does not populate any +// memory, as the destination table is NULL. Its only purpose it to know the global maximum. +static +int EstimateTAC(CMSREGISTER const cmsUInt16Number In[], CMSREGISTER cmsUInt16Number Out[], CMSREGISTER void * Cargo) +{ + cmsTACestimator* bp = (cmsTACestimator*) Cargo; + cmsFloat32Number RoundTrip[cmsMAXCHANNELS]; + cmsUInt32Number i; + cmsFloat32Number Sum; + + + // Evaluate the xform + cmsDoTransform(bp->hRoundTrip, In, RoundTrip, 1); + + // All all amounts of ink + for (Sum=0, i=0; i < bp ->nOutputChans; i++) + Sum += RoundTrip[i]; + + // If above maximum, keep track of input values + if (Sum > bp ->MaxTAC) { + + bp ->MaxTAC = Sum; + + for (i=0; i < bp ->nOutputChans; i++) { + bp ->MaxInput[i] = In[i]; + } + } + + return TRUE; + + cmsUNUSED_PARAMETER(Out); +} + + +// Detect Total area coverage of the profile +cmsFloat64Number CMSEXPORT cmsDetectTAC(cmsHPROFILE hProfile) +{ + cmsTACestimator bp; + cmsUInt32Number dwFormatter; + cmsUInt32Number GridPoints[MAX_INPUT_DIMENSIONS]; + cmsHPROFILE hLab; + cmsContext ContextID = cmsGetProfileContextID(hProfile); + + // TAC only works on output profiles + if (cmsGetDeviceClass(hProfile) != cmsSigOutputClass) { + return 0; + } + + // Create a fake formatter for result + dwFormatter = cmsFormatterForColorspaceOfProfile(hProfile, 4, TRUE); + + // Unsupported color space? + if (dwFormatter == 0) return 0; + + bp.nOutputChans = T_CHANNELS(dwFormatter); + bp.MaxTAC = 0; // Initial TAC is 0 + + // for safety + if (bp.nOutputChans >= cmsMAXCHANNELS) return 0; + + hLab = cmsCreateLab4ProfileTHR(ContextID, NULL); + if (hLab == NULL) return 0; + // Setup a roundtrip on perceptual intent in output profile for TAC estimation + bp.hRoundTrip = cmsCreateTransformTHR(ContextID, hLab, TYPE_Lab_16, + hProfile, dwFormatter, INTENT_PERCEPTUAL, cmsFLAGS_NOOPTIMIZE|cmsFLAGS_NOCACHE); + + cmsCloseProfile(hLab); + if (bp.hRoundTrip == NULL) return 0; + + // For L* we only need black and white. For C* we need many points + GridPoints[0] = 6; + GridPoints[1] = 74; + GridPoints[2] = 74; + + + if (!cmsSliceSpace16(3, GridPoints, EstimateTAC, &bp)) { + bp.MaxTAC = 0; + } + + cmsDeleteTransform(bp.hRoundTrip); + + // Results in % + return bp.MaxTAC; +} + + +// Carefully, clamp on CIELab space. + +cmsBool CMSEXPORT cmsDesaturateLab(cmsCIELab* Lab, + double amax, double amin, + double bmax, double bmin) +{ + + // Whole Luma surface to zero + + if (Lab -> L < 0) { + + Lab-> L = Lab->a = Lab-> b = 0.0; + return FALSE; + } + + // Clamp white, DISCARD HIGHLIGHTS. This is done + // in such way because icc spec doesn't allow the + // use of L>100 as a highlight means. + + if (Lab->L > 100) + Lab -> L = 100; + + // Check out gamut prism, on a, b faces + + if (Lab -> a < amin || Lab->a > amax|| + Lab -> b < bmin || Lab->b > bmax) { + + cmsCIELCh LCh; + double h, slope; + + // Falls outside a, b limits. Transports to LCh space, + // and then do the clipping + + + if (Lab -> a == 0.0) { // Is hue exactly 90? + + // atan will not work, so clamp here + Lab -> b = Lab->b < 0 ? bmin : bmax; + return TRUE; + } + + cmsLab2LCh(&LCh, Lab); + + slope = Lab -> b / Lab -> a; + h = LCh.h; + + // There are 4 zones + + if ((h >= 0. && h < 45.) || + (h >= 315 && h <= 360.)) { + + // clip by amax + Lab -> a = amax; + Lab -> b = amax * slope; + } + else + if (h >= 45. && h < 135.) + { + // clip by bmax + Lab -> b = bmax; + Lab -> a = bmax / slope; + } + else + if (h >= 135. && h < 225.) { + // clip by amin + Lab -> a = amin; + Lab -> b = amin * slope; + + } + else + if (h >= 225. && h < 315.) { + // clip by bmin + Lab -> b = bmin; + Lab -> a = bmin / slope; + } + else { + cmsSignalError(0, cmsERROR_RANGE, "Invalid angle"); + return FALSE; + } + + } + + return TRUE; +} + +// Detect whatever a given ICC profile works in linear (gamma 1.0) space +// Actually, doing that "well" is quite hard, since every component may behave completely different. +// Since the true point of this function is to detect suitable optimizations, I am imposing some requirements +// that simplifies things: only RGB, and only profiles that can got in both directions. +// The algorithm obtains Y from a synthetical gray R=G=B. Then least squares fitting is used to estimate gamma. +// For gamma close to 1.0, RGB is linear. On profiles not supported, -1 is returned. + +cmsFloat64Number CMSEXPORT cmsDetectRGBProfileGamma(cmsHPROFILE hProfile, cmsFloat64Number threshold) +{ + cmsContext ContextID; + cmsHPROFILE hXYZ; + cmsHTRANSFORM xform; + cmsToneCurve* Y_curve; + cmsUInt16Number rgb[256][3]; + cmsCIEXYZ XYZ[256]; + cmsFloat32Number Y_normalized[256]; + cmsFloat64Number gamma; + cmsProfileClassSignature cl; + int i; + + if (cmsGetColorSpace(hProfile) != cmsSigRgbData) + return -1; + + cl = cmsGetDeviceClass(hProfile); + if (cl != cmsSigInputClass && cl != cmsSigDisplayClass && + cl != cmsSigOutputClass && cl != cmsSigColorSpaceClass) + return -1; + + ContextID = cmsGetProfileContextID(hProfile); + hXYZ = cmsCreateXYZProfileTHR(ContextID); + if (hXYZ == NULL) + return -1; + xform = cmsCreateTransformTHR(ContextID, hProfile, TYPE_RGB_16, hXYZ, TYPE_XYZ_DBL, + INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_NOOPTIMIZE); + + if (xform == NULL) { // If not RGB or forward direction is not supported, regret with the previous error + + cmsCloseProfile(hXYZ); + return -1; + } + + for (i = 0; i < 256; i++) { + rgb[i][0] = rgb[i][1] = rgb[i][2] = FROM_8_TO_16(i); + } + + cmsDoTransform(xform, rgb, XYZ, 256); + + cmsDeleteTransform(xform); + cmsCloseProfile(hXYZ); + + for (i = 0; i < 256; i++) { + Y_normalized[i] = (cmsFloat32Number) XYZ[i].Y; + } + + Y_curve = cmsBuildTabulatedToneCurveFloat(ContextID, 256, Y_normalized); + if (Y_curve == NULL) + return -1; + + gamma = cmsEstimateGamma(Y_curve, threshold); + + cmsFreeToneCurve(Y_curve); + + return gamma; +} + diff --git a/local/recipes/libs/lcms2/source/src/cmshalf.c b/local/recipes/libs/lcms2/source/src/cmshalf.c new file mode 100644 index 0000000000..43a3f9b38a --- /dev/null +++ b/local/recipes/libs/lcms2/source/src/cmshalf.c @@ -0,0 +1,535 @@ +//--------------------------------------------------------------------------------- +// +// Little Color Management System +// Copyright (c) 1998-2026 Marti Maria Saguer +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//--------------------------------------------------------------------------------- +// +// +#include "lcms2_internal.h" + +#ifndef CMS_NO_HALF_SUPPORT + +// This code is inspired in the paper "Fast Half Float Conversions" +// by Jeroen van der Zijp + +static const cmsUInt32Number Mantissa[2048] = { + +0x00000000, 0x33800000, 0x34000000, 0x34400000, 0x34800000, 0x34a00000, +0x34c00000, 0x34e00000, 0x35000000, 0x35100000, 0x35200000, 0x35300000, +0x35400000, 0x35500000, 0x35600000, 0x35700000, 0x35800000, 0x35880000, +0x35900000, 0x35980000, 0x35a00000, 0x35a80000, 0x35b00000, 0x35b80000, +0x35c00000, 0x35c80000, 0x35d00000, 0x35d80000, 0x35e00000, 0x35e80000, +0x35f00000, 0x35f80000, 0x36000000, 0x36040000, 0x36080000, 0x360c0000, +0x36100000, 0x36140000, 0x36180000, 0x361c0000, 0x36200000, 0x36240000, +0x36280000, 0x362c0000, 0x36300000, 0x36340000, 0x36380000, 0x363c0000, +0x36400000, 0x36440000, 0x36480000, 0x364c0000, 0x36500000, 0x36540000, +0x36580000, 0x365c0000, 0x36600000, 0x36640000, 0x36680000, 0x366c0000, +0x36700000, 0x36740000, 0x36780000, 0x367c0000, 0x36800000, 0x36820000, +0x36840000, 0x36860000, 0x36880000, 0x368a0000, 0x368c0000, 0x368e0000, +0x36900000, 0x36920000, 0x36940000, 0x36960000, 0x36980000, 0x369a0000, +0x369c0000, 0x369e0000, 0x36a00000, 0x36a20000, 0x36a40000, 0x36a60000, +0x36a80000, 0x36aa0000, 0x36ac0000, 0x36ae0000, 0x36b00000, 0x36b20000, +0x36b40000, 0x36b60000, 0x36b80000, 0x36ba0000, 0x36bc0000, 0x36be0000, +0x36c00000, 0x36c20000, 0x36c40000, 0x36c60000, 0x36c80000, 0x36ca0000, +0x36cc0000, 0x36ce0000, 0x36d00000, 0x36d20000, 0x36d40000, 0x36d60000, +0x36d80000, 0x36da0000, 0x36dc0000, 0x36de0000, 0x36e00000, 0x36e20000, +0x36e40000, 0x36e60000, 0x36e80000, 0x36ea0000, 0x36ec0000, 0x36ee0000, +0x36f00000, 0x36f20000, 0x36f40000, 0x36f60000, 0x36f80000, 0x36fa0000, +0x36fc0000, 0x36fe0000, 0x37000000, 0x37010000, 0x37020000, 0x37030000, +0x37040000, 0x37050000, 0x37060000, 0x37070000, 0x37080000, 0x37090000, +0x370a0000, 0x370b0000, 0x370c0000, 0x370d0000, 0x370e0000, 0x370f0000, +0x37100000, 0x37110000, 0x37120000, 0x37130000, 0x37140000, 0x37150000, +0x37160000, 0x37170000, 0x37180000, 0x37190000, 0x371a0000, 0x371b0000, +0x371c0000, 0x371d0000, 0x371e0000, 0x371f0000, 0x37200000, 0x37210000, +0x37220000, 0x37230000, 0x37240000, 0x37250000, 0x37260000, 0x37270000, +0x37280000, 0x37290000, 0x372a0000, 0x372b0000, 0x372c0000, 0x372d0000, +0x372e0000, 0x372f0000, 0x37300000, 0x37310000, 0x37320000, 0x37330000, +0x37340000, 0x37350000, 0x37360000, 0x37370000, 0x37380000, 0x37390000, +0x373a0000, 0x373b0000, 0x373c0000, 0x373d0000, 0x373e0000, 0x373f0000, +0x37400000, 0x37410000, 0x37420000, 0x37430000, 0x37440000, 0x37450000, +0x37460000, 0x37470000, 0x37480000, 0x37490000, 0x374a0000, 0x374b0000, +0x374c0000, 0x374d0000, 0x374e0000, 0x374f0000, 0x37500000, 0x37510000, +0x37520000, 0x37530000, 0x37540000, 0x37550000, 0x37560000, 0x37570000, +0x37580000, 0x37590000, 0x375a0000, 0x375b0000, 0x375c0000, 0x375d0000, +0x375e0000, 0x375f0000, 0x37600000, 0x37610000, 0x37620000, 0x37630000, +0x37640000, 0x37650000, 0x37660000, 0x37670000, 0x37680000, 0x37690000, +0x376a0000, 0x376b0000, 0x376c0000, 0x376d0000, 0x376e0000, 0x376f0000, +0x37700000, 0x37710000, 0x37720000, 0x37730000, 0x37740000, 0x37750000, +0x37760000, 0x37770000, 0x37780000, 0x37790000, 0x377a0000, 0x377b0000, +0x377c0000, 0x377d0000, 0x377e0000, 0x377f0000, 0x37800000, 0x37808000, +0x37810000, 0x37818000, 0x37820000, 0x37828000, 0x37830000, 0x37838000, +0x37840000, 0x37848000, 0x37850000, 0x37858000, 0x37860000, 0x37868000, +0x37870000, 0x37878000, 0x37880000, 0x37888000, 0x37890000, 0x37898000, +0x378a0000, 0x378a8000, 0x378b0000, 0x378b8000, 0x378c0000, 0x378c8000, +0x378d0000, 0x378d8000, 0x378e0000, 0x378e8000, 0x378f0000, 0x378f8000, +0x37900000, 0x37908000, 0x37910000, 0x37918000, 0x37920000, 0x37928000, +0x37930000, 0x37938000, 0x37940000, 0x37948000, 0x37950000, 0x37958000, +0x37960000, 0x37968000, 0x37970000, 0x37978000, 0x37980000, 0x37988000, +0x37990000, 0x37998000, 0x379a0000, 0x379a8000, 0x379b0000, 0x379b8000, +0x379c0000, 0x379c8000, 0x379d0000, 0x379d8000, 0x379e0000, 0x379e8000, +0x379f0000, 0x379f8000, 0x37a00000, 0x37a08000, 0x37a10000, 0x37a18000, +0x37a20000, 0x37a28000, 0x37a30000, 0x37a38000, 0x37a40000, 0x37a48000, +0x37a50000, 0x37a58000, 0x37a60000, 0x37a68000, 0x37a70000, 0x37a78000, +0x37a80000, 0x37a88000, 0x37a90000, 0x37a98000, 0x37aa0000, 0x37aa8000, +0x37ab0000, 0x37ab8000, 0x37ac0000, 0x37ac8000, 0x37ad0000, 0x37ad8000, +0x37ae0000, 0x37ae8000, 0x37af0000, 0x37af8000, 0x37b00000, 0x37b08000, +0x37b10000, 0x37b18000, 0x37b20000, 0x37b28000, 0x37b30000, 0x37b38000, +0x37b40000, 0x37b48000, 0x37b50000, 0x37b58000, 0x37b60000, 0x37b68000, +0x37b70000, 0x37b78000, 0x37b80000, 0x37b88000, 0x37b90000, 0x37b98000, +0x37ba0000, 0x37ba8000, 0x37bb0000, 0x37bb8000, 0x37bc0000, 0x37bc8000, +0x37bd0000, 0x37bd8000, 0x37be0000, 0x37be8000, 0x37bf0000, 0x37bf8000, +0x37c00000, 0x37c08000, 0x37c10000, 0x37c18000, 0x37c20000, 0x37c28000, +0x37c30000, 0x37c38000, 0x37c40000, 0x37c48000, 0x37c50000, 0x37c58000, +0x37c60000, 0x37c68000, 0x37c70000, 0x37c78000, 0x37c80000, 0x37c88000, +0x37c90000, 0x37c98000, 0x37ca0000, 0x37ca8000, 0x37cb0000, 0x37cb8000, +0x37cc0000, 0x37cc8000, 0x37cd0000, 0x37cd8000, 0x37ce0000, 0x37ce8000, +0x37cf0000, 0x37cf8000, 0x37d00000, 0x37d08000, 0x37d10000, 0x37d18000, +0x37d20000, 0x37d28000, 0x37d30000, 0x37d38000, 0x37d40000, 0x37d48000, +0x37d50000, 0x37d58000, 0x37d60000, 0x37d68000, 0x37d70000, 0x37d78000, +0x37d80000, 0x37d88000, 0x37d90000, 0x37d98000, 0x37da0000, 0x37da8000, +0x37db0000, 0x37db8000, 0x37dc0000, 0x37dc8000, 0x37dd0000, 0x37dd8000, +0x37de0000, 0x37de8000, 0x37df0000, 0x37df8000, 0x37e00000, 0x37e08000, +0x37e10000, 0x37e18000, 0x37e20000, 0x37e28000, 0x37e30000, 0x37e38000, +0x37e40000, 0x37e48000, 0x37e50000, 0x37e58000, 0x37e60000, 0x37e68000, +0x37e70000, 0x37e78000, 0x37e80000, 0x37e88000, 0x37e90000, 0x37e98000, +0x37ea0000, 0x37ea8000, 0x37eb0000, 0x37eb8000, 0x37ec0000, 0x37ec8000, +0x37ed0000, 0x37ed8000, 0x37ee0000, 0x37ee8000, 0x37ef0000, 0x37ef8000, +0x37f00000, 0x37f08000, 0x37f10000, 0x37f18000, 0x37f20000, 0x37f28000, +0x37f30000, 0x37f38000, 0x37f40000, 0x37f48000, 0x37f50000, 0x37f58000, +0x37f60000, 0x37f68000, 0x37f70000, 0x37f78000, 0x37f80000, 0x37f88000, +0x37f90000, 0x37f98000, 0x37fa0000, 0x37fa8000, 0x37fb0000, 0x37fb8000, +0x37fc0000, 0x37fc8000, 0x37fd0000, 0x37fd8000, 0x37fe0000, 0x37fe8000, +0x37ff0000, 0x37ff8000, 0x38000000, 0x38004000, 0x38008000, 0x3800c000, +0x38010000, 0x38014000, 0x38018000, 0x3801c000, 0x38020000, 0x38024000, +0x38028000, 0x3802c000, 0x38030000, 0x38034000, 0x38038000, 0x3803c000, +0x38040000, 0x38044000, 0x38048000, 0x3804c000, 0x38050000, 0x38054000, +0x38058000, 0x3805c000, 0x38060000, 0x38064000, 0x38068000, 0x3806c000, +0x38070000, 0x38074000, 0x38078000, 0x3807c000, 0x38080000, 0x38084000, +0x38088000, 0x3808c000, 0x38090000, 0x38094000, 0x38098000, 0x3809c000, +0x380a0000, 0x380a4000, 0x380a8000, 0x380ac000, 0x380b0000, 0x380b4000, +0x380b8000, 0x380bc000, 0x380c0000, 0x380c4000, 0x380c8000, 0x380cc000, +0x380d0000, 0x380d4000, 0x380d8000, 0x380dc000, 0x380e0000, 0x380e4000, +0x380e8000, 0x380ec000, 0x380f0000, 0x380f4000, 0x380f8000, 0x380fc000, +0x38100000, 0x38104000, 0x38108000, 0x3810c000, 0x38110000, 0x38114000, +0x38118000, 0x3811c000, 0x38120000, 0x38124000, 0x38128000, 0x3812c000, +0x38130000, 0x38134000, 0x38138000, 0x3813c000, 0x38140000, 0x38144000, +0x38148000, 0x3814c000, 0x38150000, 0x38154000, 0x38158000, 0x3815c000, +0x38160000, 0x38164000, 0x38168000, 0x3816c000, 0x38170000, 0x38174000, +0x38178000, 0x3817c000, 0x38180000, 0x38184000, 0x38188000, 0x3818c000, +0x38190000, 0x38194000, 0x38198000, 0x3819c000, 0x381a0000, 0x381a4000, +0x381a8000, 0x381ac000, 0x381b0000, 0x381b4000, 0x381b8000, 0x381bc000, +0x381c0000, 0x381c4000, 0x381c8000, 0x381cc000, 0x381d0000, 0x381d4000, +0x381d8000, 0x381dc000, 0x381e0000, 0x381e4000, 0x381e8000, 0x381ec000, +0x381f0000, 0x381f4000, 0x381f8000, 0x381fc000, 0x38200000, 0x38204000, +0x38208000, 0x3820c000, 0x38210000, 0x38214000, 0x38218000, 0x3821c000, +0x38220000, 0x38224000, 0x38228000, 0x3822c000, 0x38230000, 0x38234000, +0x38238000, 0x3823c000, 0x38240000, 0x38244000, 0x38248000, 0x3824c000, +0x38250000, 0x38254000, 0x38258000, 0x3825c000, 0x38260000, 0x38264000, +0x38268000, 0x3826c000, 0x38270000, 0x38274000, 0x38278000, 0x3827c000, +0x38280000, 0x38284000, 0x38288000, 0x3828c000, 0x38290000, 0x38294000, +0x38298000, 0x3829c000, 0x382a0000, 0x382a4000, 0x382a8000, 0x382ac000, +0x382b0000, 0x382b4000, 0x382b8000, 0x382bc000, 0x382c0000, 0x382c4000, +0x382c8000, 0x382cc000, 0x382d0000, 0x382d4000, 0x382d8000, 0x382dc000, +0x382e0000, 0x382e4000, 0x382e8000, 0x382ec000, 0x382f0000, 0x382f4000, +0x382f8000, 0x382fc000, 0x38300000, 0x38304000, 0x38308000, 0x3830c000, +0x38310000, 0x38314000, 0x38318000, 0x3831c000, 0x38320000, 0x38324000, +0x38328000, 0x3832c000, 0x38330000, 0x38334000, 0x38338000, 0x3833c000, +0x38340000, 0x38344000, 0x38348000, 0x3834c000, 0x38350000, 0x38354000, +0x38358000, 0x3835c000, 0x38360000, 0x38364000, 0x38368000, 0x3836c000, +0x38370000, 0x38374000, 0x38378000, 0x3837c000, 0x38380000, 0x38384000, +0x38388000, 0x3838c000, 0x38390000, 0x38394000, 0x38398000, 0x3839c000, +0x383a0000, 0x383a4000, 0x383a8000, 0x383ac000, 0x383b0000, 0x383b4000, +0x383b8000, 0x383bc000, 0x383c0000, 0x383c4000, 0x383c8000, 0x383cc000, +0x383d0000, 0x383d4000, 0x383d8000, 0x383dc000, 0x383e0000, 0x383e4000, +0x383e8000, 0x383ec000, 0x383f0000, 0x383f4000, 0x383f8000, 0x383fc000, +0x38400000, 0x38404000, 0x38408000, 0x3840c000, 0x38410000, 0x38414000, +0x38418000, 0x3841c000, 0x38420000, 0x38424000, 0x38428000, 0x3842c000, +0x38430000, 0x38434000, 0x38438000, 0x3843c000, 0x38440000, 0x38444000, +0x38448000, 0x3844c000, 0x38450000, 0x38454000, 0x38458000, 0x3845c000, +0x38460000, 0x38464000, 0x38468000, 0x3846c000, 0x38470000, 0x38474000, +0x38478000, 0x3847c000, 0x38480000, 0x38484000, 0x38488000, 0x3848c000, +0x38490000, 0x38494000, 0x38498000, 0x3849c000, 0x384a0000, 0x384a4000, +0x384a8000, 0x384ac000, 0x384b0000, 0x384b4000, 0x384b8000, 0x384bc000, +0x384c0000, 0x384c4000, 0x384c8000, 0x384cc000, 0x384d0000, 0x384d4000, +0x384d8000, 0x384dc000, 0x384e0000, 0x384e4000, 0x384e8000, 0x384ec000, +0x384f0000, 0x384f4000, 0x384f8000, 0x384fc000, 0x38500000, 0x38504000, +0x38508000, 0x3850c000, 0x38510000, 0x38514000, 0x38518000, 0x3851c000, +0x38520000, 0x38524000, 0x38528000, 0x3852c000, 0x38530000, 0x38534000, +0x38538000, 0x3853c000, 0x38540000, 0x38544000, 0x38548000, 0x3854c000, +0x38550000, 0x38554000, 0x38558000, 0x3855c000, 0x38560000, 0x38564000, +0x38568000, 0x3856c000, 0x38570000, 0x38574000, 0x38578000, 0x3857c000, +0x38580000, 0x38584000, 0x38588000, 0x3858c000, 0x38590000, 0x38594000, +0x38598000, 0x3859c000, 0x385a0000, 0x385a4000, 0x385a8000, 0x385ac000, +0x385b0000, 0x385b4000, 0x385b8000, 0x385bc000, 0x385c0000, 0x385c4000, +0x385c8000, 0x385cc000, 0x385d0000, 0x385d4000, 0x385d8000, 0x385dc000, +0x385e0000, 0x385e4000, 0x385e8000, 0x385ec000, 0x385f0000, 0x385f4000, +0x385f8000, 0x385fc000, 0x38600000, 0x38604000, 0x38608000, 0x3860c000, +0x38610000, 0x38614000, 0x38618000, 0x3861c000, 0x38620000, 0x38624000, +0x38628000, 0x3862c000, 0x38630000, 0x38634000, 0x38638000, 0x3863c000, +0x38640000, 0x38644000, 0x38648000, 0x3864c000, 0x38650000, 0x38654000, +0x38658000, 0x3865c000, 0x38660000, 0x38664000, 0x38668000, 0x3866c000, +0x38670000, 0x38674000, 0x38678000, 0x3867c000, 0x38680000, 0x38684000, +0x38688000, 0x3868c000, 0x38690000, 0x38694000, 0x38698000, 0x3869c000, +0x386a0000, 0x386a4000, 0x386a8000, 0x386ac000, 0x386b0000, 0x386b4000, +0x386b8000, 0x386bc000, 0x386c0000, 0x386c4000, 0x386c8000, 0x386cc000, +0x386d0000, 0x386d4000, 0x386d8000, 0x386dc000, 0x386e0000, 0x386e4000, +0x386e8000, 0x386ec000, 0x386f0000, 0x386f4000, 0x386f8000, 0x386fc000, +0x38700000, 0x38704000, 0x38708000, 0x3870c000, 0x38710000, 0x38714000, +0x38718000, 0x3871c000, 0x38720000, 0x38724000, 0x38728000, 0x3872c000, +0x38730000, 0x38734000, 0x38738000, 0x3873c000, 0x38740000, 0x38744000, +0x38748000, 0x3874c000, 0x38750000, 0x38754000, 0x38758000, 0x3875c000, +0x38760000, 0x38764000, 0x38768000, 0x3876c000, 0x38770000, 0x38774000, +0x38778000, 0x3877c000, 0x38780000, 0x38784000, 0x38788000, 0x3878c000, +0x38790000, 0x38794000, 0x38798000, 0x3879c000, 0x387a0000, 0x387a4000, +0x387a8000, 0x387ac000, 0x387b0000, 0x387b4000, 0x387b8000, 0x387bc000, +0x387c0000, 0x387c4000, 0x387c8000, 0x387cc000, 0x387d0000, 0x387d4000, +0x387d8000, 0x387dc000, 0x387e0000, 0x387e4000, 0x387e8000, 0x387ec000, +0x387f0000, 0x387f4000, 0x387f8000, 0x387fc000, 0x38000000, 0x38002000, +0x38004000, 0x38006000, 0x38008000, 0x3800a000, 0x3800c000, 0x3800e000, +0x38010000, 0x38012000, 0x38014000, 0x38016000, 0x38018000, 0x3801a000, +0x3801c000, 0x3801e000, 0x38020000, 0x38022000, 0x38024000, 0x38026000, +0x38028000, 0x3802a000, 0x3802c000, 0x3802e000, 0x38030000, 0x38032000, +0x38034000, 0x38036000, 0x38038000, 0x3803a000, 0x3803c000, 0x3803e000, +0x38040000, 0x38042000, 0x38044000, 0x38046000, 0x38048000, 0x3804a000, +0x3804c000, 0x3804e000, 0x38050000, 0x38052000, 0x38054000, 0x38056000, +0x38058000, 0x3805a000, 0x3805c000, 0x3805e000, 0x38060000, 0x38062000, +0x38064000, 0x38066000, 0x38068000, 0x3806a000, 0x3806c000, 0x3806e000, +0x38070000, 0x38072000, 0x38074000, 0x38076000, 0x38078000, 0x3807a000, +0x3807c000, 0x3807e000, 0x38080000, 0x38082000, 0x38084000, 0x38086000, +0x38088000, 0x3808a000, 0x3808c000, 0x3808e000, 0x38090000, 0x38092000, +0x38094000, 0x38096000, 0x38098000, 0x3809a000, 0x3809c000, 0x3809e000, +0x380a0000, 0x380a2000, 0x380a4000, 0x380a6000, 0x380a8000, 0x380aa000, +0x380ac000, 0x380ae000, 0x380b0000, 0x380b2000, 0x380b4000, 0x380b6000, +0x380b8000, 0x380ba000, 0x380bc000, 0x380be000, 0x380c0000, 0x380c2000, +0x380c4000, 0x380c6000, 0x380c8000, 0x380ca000, 0x380cc000, 0x380ce000, +0x380d0000, 0x380d2000, 0x380d4000, 0x380d6000, 0x380d8000, 0x380da000, +0x380dc000, 0x380de000, 0x380e0000, 0x380e2000, 0x380e4000, 0x380e6000, +0x380e8000, 0x380ea000, 0x380ec000, 0x380ee000, 0x380f0000, 0x380f2000, +0x380f4000, 0x380f6000, 0x380f8000, 0x380fa000, 0x380fc000, 0x380fe000, +0x38100000, 0x38102000, 0x38104000, 0x38106000, 0x38108000, 0x3810a000, +0x3810c000, 0x3810e000, 0x38110000, 0x38112000, 0x38114000, 0x38116000, +0x38118000, 0x3811a000, 0x3811c000, 0x3811e000, 0x38120000, 0x38122000, +0x38124000, 0x38126000, 0x38128000, 0x3812a000, 0x3812c000, 0x3812e000, +0x38130000, 0x38132000, 0x38134000, 0x38136000, 0x38138000, 0x3813a000, +0x3813c000, 0x3813e000, 0x38140000, 0x38142000, 0x38144000, 0x38146000, +0x38148000, 0x3814a000, 0x3814c000, 0x3814e000, 0x38150000, 0x38152000, +0x38154000, 0x38156000, 0x38158000, 0x3815a000, 0x3815c000, 0x3815e000, +0x38160000, 0x38162000, 0x38164000, 0x38166000, 0x38168000, 0x3816a000, +0x3816c000, 0x3816e000, 0x38170000, 0x38172000, 0x38174000, 0x38176000, +0x38178000, 0x3817a000, 0x3817c000, 0x3817e000, 0x38180000, 0x38182000, +0x38184000, 0x38186000, 0x38188000, 0x3818a000, 0x3818c000, 0x3818e000, +0x38190000, 0x38192000, 0x38194000, 0x38196000, 0x38198000, 0x3819a000, +0x3819c000, 0x3819e000, 0x381a0000, 0x381a2000, 0x381a4000, 0x381a6000, +0x381a8000, 0x381aa000, 0x381ac000, 0x381ae000, 0x381b0000, 0x381b2000, +0x381b4000, 0x381b6000, 0x381b8000, 0x381ba000, 0x381bc000, 0x381be000, +0x381c0000, 0x381c2000, 0x381c4000, 0x381c6000, 0x381c8000, 0x381ca000, +0x381cc000, 0x381ce000, 0x381d0000, 0x381d2000, 0x381d4000, 0x381d6000, +0x381d8000, 0x381da000, 0x381dc000, 0x381de000, 0x381e0000, 0x381e2000, +0x381e4000, 0x381e6000, 0x381e8000, 0x381ea000, 0x381ec000, 0x381ee000, +0x381f0000, 0x381f2000, 0x381f4000, 0x381f6000, 0x381f8000, 0x381fa000, +0x381fc000, 0x381fe000, 0x38200000, 0x38202000, 0x38204000, 0x38206000, +0x38208000, 0x3820a000, 0x3820c000, 0x3820e000, 0x38210000, 0x38212000, +0x38214000, 0x38216000, 0x38218000, 0x3821a000, 0x3821c000, 0x3821e000, +0x38220000, 0x38222000, 0x38224000, 0x38226000, 0x38228000, 0x3822a000, +0x3822c000, 0x3822e000, 0x38230000, 0x38232000, 0x38234000, 0x38236000, +0x38238000, 0x3823a000, 0x3823c000, 0x3823e000, 0x38240000, 0x38242000, +0x38244000, 0x38246000, 0x38248000, 0x3824a000, 0x3824c000, 0x3824e000, +0x38250000, 0x38252000, 0x38254000, 0x38256000, 0x38258000, 0x3825a000, +0x3825c000, 0x3825e000, 0x38260000, 0x38262000, 0x38264000, 0x38266000, +0x38268000, 0x3826a000, 0x3826c000, 0x3826e000, 0x38270000, 0x38272000, +0x38274000, 0x38276000, 0x38278000, 0x3827a000, 0x3827c000, 0x3827e000, +0x38280000, 0x38282000, 0x38284000, 0x38286000, 0x38288000, 0x3828a000, +0x3828c000, 0x3828e000, 0x38290000, 0x38292000, 0x38294000, 0x38296000, +0x38298000, 0x3829a000, 0x3829c000, 0x3829e000, 0x382a0000, 0x382a2000, +0x382a4000, 0x382a6000, 0x382a8000, 0x382aa000, 0x382ac000, 0x382ae000, +0x382b0000, 0x382b2000, 0x382b4000, 0x382b6000, 0x382b8000, 0x382ba000, +0x382bc000, 0x382be000, 0x382c0000, 0x382c2000, 0x382c4000, 0x382c6000, +0x382c8000, 0x382ca000, 0x382cc000, 0x382ce000, 0x382d0000, 0x382d2000, +0x382d4000, 0x382d6000, 0x382d8000, 0x382da000, 0x382dc000, 0x382de000, +0x382e0000, 0x382e2000, 0x382e4000, 0x382e6000, 0x382e8000, 0x382ea000, +0x382ec000, 0x382ee000, 0x382f0000, 0x382f2000, 0x382f4000, 0x382f6000, +0x382f8000, 0x382fa000, 0x382fc000, 0x382fe000, 0x38300000, 0x38302000, +0x38304000, 0x38306000, 0x38308000, 0x3830a000, 0x3830c000, 0x3830e000, +0x38310000, 0x38312000, 0x38314000, 0x38316000, 0x38318000, 0x3831a000, +0x3831c000, 0x3831e000, 0x38320000, 0x38322000, 0x38324000, 0x38326000, +0x38328000, 0x3832a000, 0x3832c000, 0x3832e000, 0x38330000, 0x38332000, +0x38334000, 0x38336000, 0x38338000, 0x3833a000, 0x3833c000, 0x3833e000, +0x38340000, 0x38342000, 0x38344000, 0x38346000, 0x38348000, 0x3834a000, +0x3834c000, 0x3834e000, 0x38350000, 0x38352000, 0x38354000, 0x38356000, +0x38358000, 0x3835a000, 0x3835c000, 0x3835e000, 0x38360000, 0x38362000, +0x38364000, 0x38366000, 0x38368000, 0x3836a000, 0x3836c000, 0x3836e000, +0x38370000, 0x38372000, 0x38374000, 0x38376000, 0x38378000, 0x3837a000, +0x3837c000, 0x3837e000, 0x38380000, 0x38382000, 0x38384000, 0x38386000, +0x38388000, 0x3838a000, 0x3838c000, 0x3838e000, 0x38390000, 0x38392000, +0x38394000, 0x38396000, 0x38398000, 0x3839a000, 0x3839c000, 0x3839e000, +0x383a0000, 0x383a2000, 0x383a4000, 0x383a6000, 0x383a8000, 0x383aa000, +0x383ac000, 0x383ae000, 0x383b0000, 0x383b2000, 0x383b4000, 0x383b6000, +0x383b8000, 0x383ba000, 0x383bc000, 0x383be000, 0x383c0000, 0x383c2000, +0x383c4000, 0x383c6000, 0x383c8000, 0x383ca000, 0x383cc000, 0x383ce000, +0x383d0000, 0x383d2000, 0x383d4000, 0x383d6000, 0x383d8000, 0x383da000, +0x383dc000, 0x383de000, 0x383e0000, 0x383e2000, 0x383e4000, 0x383e6000, +0x383e8000, 0x383ea000, 0x383ec000, 0x383ee000, 0x383f0000, 0x383f2000, +0x383f4000, 0x383f6000, 0x383f8000, 0x383fa000, 0x383fc000, 0x383fe000, +0x38400000, 0x38402000, 0x38404000, 0x38406000, 0x38408000, 0x3840a000, +0x3840c000, 0x3840e000, 0x38410000, 0x38412000, 0x38414000, 0x38416000, +0x38418000, 0x3841a000, 0x3841c000, 0x3841e000, 0x38420000, 0x38422000, +0x38424000, 0x38426000, 0x38428000, 0x3842a000, 0x3842c000, 0x3842e000, +0x38430000, 0x38432000, 0x38434000, 0x38436000, 0x38438000, 0x3843a000, +0x3843c000, 0x3843e000, 0x38440000, 0x38442000, 0x38444000, 0x38446000, +0x38448000, 0x3844a000, 0x3844c000, 0x3844e000, 0x38450000, 0x38452000, +0x38454000, 0x38456000, 0x38458000, 0x3845a000, 0x3845c000, 0x3845e000, +0x38460000, 0x38462000, 0x38464000, 0x38466000, 0x38468000, 0x3846a000, +0x3846c000, 0x3846e000, 0x38470000, 0x38472000, 0x38474000, 0x38476000, +0x38478000, 0x3847a000, 0x3847c000, 0x3847e000, 0x38480000, 0x38482000, +0x38484000, 0x38486000, 0x38488000, 0x3848a000, 0x3848c000, 0x3848e000, +0x38490000, 0x38492000, 0x38494000, 0x38496000, 0x38498000, 0x3849a000, +0x3849c000, 0x3849e000, 0x384a0000, 0x384a2000, 0x384a4000, 0x384a6000, +0x384a8000, 0x384aa000, 0x384ac000, 0x384ae000, 0x384b0000, 0x384b2000, +0x384b4000, 0x384b6000, 0x384b8000, 0x384ba000, 0x384bc000, 0x384be000, +0x384c0000, 0x384c2000, 0x384c4000, 0x384c6000, 0x384c8000, 0x384ca000, +0x384cc000, 0x384ce000, 0x384d0000, 0x384d2000, 0x384d4000, 0x384d6000, +0x384d8000, 0x384da000, 0x384dc000, 0x384de000, 0x384e0000, 0x384e2000, +0x384e4000, 0x384e6000, 0x384e8000, 0x384ea000, 0x384ec000, 0x384ee000, +0x384f0000, 0x384f2000, 0x384f4000, 0x384f6000, 0x384f8000, 0x384fa000, +0x384fc000, 0x384fe000, 0x38500000, 0x38502000, 0x38504000, 0x38506000, +0x38508000, 0x3850a000, 0x3850c000, 0x3850e000, 0x38510000, 0x38512000, +0x38514000, 0x38516000, 0x38518000, 0x3851a000, 0x3851c000, 0x3851e000, +0x38520000, 0x38522000, 0x38524000, 0x38526000, 0x38528000, 0x3852a000, +0x3852c000, 0x3852e000, 0x38530000, 0x38532000, 0x38534000, 0x38536000, +0x38538000, 0x3853a000, 0x3853c000, 0x3853e000, 0x38540000, 0x38542000, +0x38544000, 0x38546000, 0x38548000, 0x3854a000, 0x3854c000, 0x3854e000, +0x38550000, 0x38552000, 0x38554000, 0x38556000, 0x38558000, 0x3855a000, +0x3855c000, 0x3855e000, 0x38560000, 0x38562000, 0x38564000, 0x38566000, +0x38568000, 0x3856a000, 0x3856c000, 0x3856e000, 0x38570000, 0x38572000, +0x38574000, 0x38576000, 0x38578000, 0x3857a000, 0x3857c000, 0x3857e000, +0x38580000, 0x38582000, 0x38584000, 0x38586000, 0x38588000, 0x3858a000, +0x3858c000, 0x3858e000, 0x38590000, 0x38592000, 0x38594000, 0x38596000, +0x38598000, 0x3859a000, 0x3859c000, 0x3859e000, 0x385a0000, 0x385a2000, +0x385a4000, 0x385a6000, 0x385a8000, 0x385aa000, 0x385ac000, 0x385ae000, +0x385b0000, 0x385b2000, 0x385b4000, 0x385b6000, 0x385b8000, 0x385ba000, +0x385bc000, 0x385be000, 0x385c0000, 0x385c2000, 0x385c4000, 0x385c6000, +0x385c8000, 0x385ca000, 0x385cc000, 0x385ce000, 0x385d0000, 0x385d2000, +0x385d4000, 0x385d6000, 0x385d8000, 0x385da000, 0x385dc000, 0x385de000, +0x385e0000, 0x385e2000, 0x385e4000, 0x385e6000, 0x385e8000, 0x385ea000, +0x385ec000, 0x385ee000, 0x385f0000, 0x385f2000, 0x385f4000, 0x385f6000, +0x385f8000, 0x385fa000, 0x385fc000, 0x385fe000, 0x38600000, 0x38602000, +0x38604000, 0x38606000, 0x38608000, 0x3860a000, 0x3860c000, 0x3860e000, +0x38610000, 0x38612000, 0x38614000, 0x38616000, 0x38618000, 0x3861a000, +0x3861c000, 0x3861e000, 0x38620000, 0x38622000, 0x38624000, 0x38626000, +0x38628000, 0x3862a000, 0x3862c000, 0x3862e000, 0x38630000, 0x38632000, +0x38634000, 0x38636000, 0x38638000, 0x3863a000, 0x3863c000, 0x3863e000, +0x38640000, 0x38642000, 0x38644000, 0x38646000, 0x38648000, 0x3864a000, +0x3864c000, 0x3864e000, 0x38650000, 0x38652000, 0x38654000, 0x38656000, +0x38658000, 0x3865a000, 0x3865c000, 0x3865e000, 0x38660000, 0x38662000, +0x38664000, 0x38666000, 0x38668000, 0x3866a000, 0x3866c000, 0x3866e000, +0x38670000, 0x38672000, 0x38674000, 0x38676000, 0x38678000, 0x3867a000, +0x3867c000, 0x3867e000, 0x38680000, 0x38682000, 0x38684000, 0x38686000, +0x38688000, 0x3868a000, 0x3868c000, 0x3868e000, 0x38690000, 0x38692000, +0x38694000, 0x38696000, 0x38698000, 0x3869a000, 0x3869c000, 0x3869e000, +0x386a0000, 0x386a2000, 0x386a4000, 0x386a6000, 0x386a8000, 0x386aa000, +0x386ac000, 0x386ae000, 0x386b0000, 0x386b2000, 0x386b4000, 0x386b6000, +0x386b8000, 0x386ba000, 0x386bc000, 0x386be000, 0x386c0000, 0x386c2000, +0x386c4000, 0x386c6000, 0x386c8000, 0x386ca000, 0x386cc000, 0x386ce000, +0x386d0000, 0x386d2000, 0x386d4000, 0x386d6000, 0x386d8000, 0x386da000, +0x386dc000, 0x386de000, 0x386e0000, 0x386e2000, 0x386e4000, 0x386e6000, +0x386e8000, 0x386ea000, 0x386ec000, 0x386ee000, 0x386f0000, 0x386f2000, +0x386f4000, 0x386f6000, 0x386f8000, 0x386fa000, 0x386fc000, 0x386fe000, +0x38700000, 0x38702000, 0x38704000, 0x38706000, 0x38708000, 0x3870a000, +0x3870c000, 0x3870e000, 0x38710000, 0x38712000, 0x38714000, 0x38716000, +0x38718000, 0x3871a000, 0x3871c000, 0x3871e000, 0x38720000, 0x38722000, +0x38724000, 0x38726000, 0x38728000, 0x3872a000, 0x3872c000, 0x3872e000, +0x38730000, 0x38732000, 0x38734000, 0x38736000, 0x38738000, 0x3873a000, +0x3873c000, 0x3873e000, 0x38740000, 0x38742000, 0x38744000, 0x38746000, +0x38748000, 0x3874a000, 0x3874c000, 0x3874e000, 0x38750000, 0x38752000, +0x38754000, 0x38756000, 0x38758000, 0x3875a000, 0x3875c000, 0x3875e000, +0x38760000, 0x38762000, 0x38764000, 0x38766000, 0x38768000, 0x3876a000, +0x3876c000, 0x3876e000, 0x38770000, 0x38772000, 0x38774000, 0x38776000, +0x38778000, 0x3877a000, 0x3877c000, 0x3877e000, 0x38780000, 0x38782000, +0x38784000, 0x38786000, 0x38788000, 0x3878a000, 0x3878c000, 0x3878e000, +0x38790000, 0x38792000, 0x38794000, 0x38796000, 0x38798000, 0x3879a000, +0x3879c000, 0x3879e000, 0x387a0000, 0x387a2000, 0x387a4000, 0x387a6000, +0x387a8000, 0x387aa000, 0x387ac000, 0x387ae000, 0x387b0000, 0x387b2000, +0x387b4000, 0x387b6000, 0x387b8000, 0x387ba000, 0x387bc000, 0x387be000, +0x387c0000, 0x387c2000, 0x387c4000, 0x387c6000, 0x387c8000, 0x387ca000, +0x387cc000, 0x387ce000, 0x387d0000, 0x387d2000, 0x387d4000, 0x387d6000, +0x387d8000, 0x387da000, 0x387dc000, 0x387de000, 0x387e0000, 0x387e2000, +0x387e4000, 0x387e6000, 0x387e8000, 0x387ea000, 0x387ec000, 0x387ee000, +0x387f0000, 0x387f2000, 0x387f4000, 0x387f6000, 0x387f8000, 0x387fa000, +0x387fc000, 0x387fe000 +}; + +static const cmsUInt16Number Offset[64] = { +0x0000, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, +0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, +0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, +0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, +0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, +0x0400, 0x0400, 0x0000, 0x0400, 0x0400, 0x0400, +0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, +0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, +0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, +0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, +0x0400, 0x0400, 0x0400, 0x0400 +}; + +static const cmsUInt32Number Exponent[64] = { +0x00000000, 0x00800000, 0x01000000, 0x01800000, 0x02000000, 0x02800000, +0x03000000, 0x03800000, 0x04000000, 0x04800000, 0x05000000, 0x05800000, +0x06000000, 0x06800000, 0x07000000, 0x07800000, 0x08000000, 0x08800000, +0x09000000, 0x09800000, 0x0a000000, 0x0a800000, 0x0b000000, 0x0b800000, +0x0c000000, 0x0c800000, 0x0d000000, 0x0d800000, 0x0e000000, 0x0e800000, +0x0f000000, 0x47800000, 0x80000000, 0x80800000, 0x81000000, 0x81800000, +0x82000000, 0x82800000, 0x83000000, 0x83800000, 0x84000000, 0x84800000, +0x85000000, 0x85800000, 0x86000000, 0x86800000, 0x87000000, 0x87800000, +0x88000000, 0x88800000, 0x89000000, 0x89800000, 0x8a000000, 0x8a800000, +0x8b000000, 0x8b800000, 0x8c000000, 0x8c800000, 0x8d000000, 0x8d800000, +0x8e000000, 0x8e800000, 0x8f000000, 0xc7800000 +}; + +static const cmsUInt16Number Base[512] = { +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +0x0000, 0x0000, 0x0000, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, +0x0080, 0x0100, 0x0200, 0x0400, 0x0800, 0x0c00, 0x1000, 0x1400, 0x1800, 0x1c00, +0x2000, 0x2400, 0x2800, 0x2c00, 0x3000, 0x3400, 0x3800, 0x3c00, 0x4000, 0x4400, +0x4800, 0x4c00, 0x5000, 0x5400, 0x5800, 0x5c00, 0x6000, 0x6400, 0x6800, 0x6c00, +0x7000, 0x7400, 0x7800, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, +0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, +0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, +0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, +0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, +0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, +0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, +0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, +0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, +0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, +0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, +0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x8000, 0x8000, 0x8000, 0x8000, +0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, +0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, +0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, +0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, +0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, +0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, +0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, +0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, +0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, +0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8001, +0x8002, 0x8004, 0x8008, 0x8010, 0x8020, 0x8040, 0x8080, 0x8100, 0x8200, 0x8400, +0x8800, 0x8c00, 0x9000, 0x9400, 0x9800, 0x9c00, 0xa000, 0xa400, 0xa800, 0xac00, +0xb000, 0xb400, 0xb800, 0xbc00, 0xc000, 0xc400, 0xc800, 0xcc00, 0xd000, 0xd400, +0xd800, 0xdc00, 0xe000, 0xe400, 0xe800, 0xec00, 0xf000, 0xf400, 0xf800, 0xfc00, +0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, +0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, +0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, +0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, +0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, +0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, +0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, +0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, +0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, +0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, +0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, +0xfc00, 0xfc00 +}; + +static const cmsUInt8Number Shift[512] = { +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x17, +0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 0x0f, 0x0e, 0x0d, 0x0d, 0x0d, 0x0d, +0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, +0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x0d, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x17, 0x16, 0x15, 0x14, 0x13, +0x12, 0x11, 0x10, 0x0f, 0x0e, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, +0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, +0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, +0x18, 0x18, 0x18, 0x18, 0x0d +}; + +cmsFloat32Number CMSEXPORT _cmsHalf2Float(cmsUInt16Number h) +{ + union { + cmsFloat32Number flt; + cmsUInt32Number num; + } out; + + int n = h >> 10; + + out.num = Mantissa[ (h & 0x3ff) + Offset[ n ] ] + Exponent[ n ]; + return out.flt; +} + +cmsUInt16Number CMSEXPORT _cmsFloat2Half(cmsFloat32Number flt) +{ + union { + cmsFloat32Number flt; + cmsUInt32Number num; + } in; + + cmsUInt32Number n, j; + + in.flt = flt; + n = in.num; + j = (n >> 23) & 0x1ff; + + return (cmsUInt16Number) ((cmsUInt32Number) Base[ j ] + (( n & 0x007fffff) >> Shift[ j ])); +} + +#endif diff --git a/local/recipes/libs/lcms2/source/src/cmsintrp.c b/local/recipes/libs/lcms2/source/src/cmsintrp.c new file mode 100644 index 0000000000..a9934b78ae --- /dev/null +++ b/local/recipes/libs/lcms2/source/src/cmsintrp.c @@ -0,0 +1,1330 @@ +//--------------------------------------------------------------------------------- +// +// Little Color Management System +// Copyright (c) 1998-2026 Marti Maria Saguer +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//--------------------------------------------------------------------------------- +// + +#include "lcms2_internal.h" + +// This module incorporates several interpolation routines, for 1 to 8 channels on input and +// up to 65535 channels on output. The user may change those by using the interpolation plug-in + +// Some people may want to compile as C++ with all warnings on, in this case make compiler silent +#ifdef _MSC_VER +# if (_MSC_VER >= 1400) +# pragma warning( disable : 4365 ) +# endif +#endif + +// Interpolation routines by default +static cmsInterpFunction DefaultInterpolatorsFactory(cmsUInt32Number nInputChannels, cmsUInt32Number nOutputChannels, cmsUInt32Number dwFlags); + +// This is the default factory +_cmsInterpPluginChunkType _cmsInterpPluginChunk = { NULL }; + +// The interpolation plug-in memory chunk allocator/dup +void _cmsAllocInterpPluginChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src) +{ + void* from; + + _cmsAssert(ctx != NULL); + + if (src != NULL) { + from = src ->chunks[InterpPlugin]; + } + else { + static _cmsInterpPluginChunkType InterpPluginChunk = { NULL }; + + from = &InterpPluginChunk; + } + + _cmsAssert(from != NULL); + ctx ->chunks[InterpPlugin] = _cmsSubAllocDup(ctx ->MemPool, from, sizeof(_cmsInterpPluginChunkType)); +} + + +// Main plug-in entry +cmsBool _cmsRegisterInterpPlugin(cmsContext ContextID, cmsPluginBase* Data) +{ + cmsPluginInterpolation* Plugin = (cmsPluginInterpolation*) Data; + _cmsInterpPluginChunkType* ptr = (_cmsInterpPluginChunkType*) _cmsContextGetClientChunk(ContextID, InterpPlugin); + + if (Data == NULL) { + + ptr ->Interpolators = NULL; + return TRUE; + } + + // Set replacement functions + ptr ->Interpolators = Plugin ->InterpolatorsFactory; + return TRUE; +} + + +// Set the interpolation method +cmsBool _cmsSetInterpolationRoutine(cmsContext ContextID, cmsInterpParams* p) +{ + _cmsInterpPluginChunkType* ptr = (_cmsInterpPluginChunkType*) _cmsContextGetClientChunk(ContextID, InterpPlugin); + + p ->Interpolation.Lerp16 = NULL; + + // Invoke factory, possibly in the Plug-in + if (ptr ->Interpolators != NULL) + p ->Interpolation = ptr->Interpolators(p -> nInputs, p ->nOutputs, p ->dwFlags); + + // If unsupported by the plug-in, go for the LittleCMS default. + // If happens only if an extern plug-in is being used + if (p ->Interpolation.Lerp16 == NULL) + p ->Interpolation = DefaultInterpolatorsFactory(p ->nInputs, p ->nOutputs, p ->dwFlags); + + // Check for valid interpolator (we just check one member of the union) + if (p ->Interpolation.Lerp16 == NULL) { + return FALSE; + } + + return TRUE; +} + + +// This function precalculates as many parameters as possible to speed up the interpolation. +cmsInterpParams* _cmsComputeInterpParamsEx(cmsContext ContextID, + const cmsUInt32Number nSamples[], + cmsUInt32Number InputChan, cmsUInt32Number OutputChan, + const void *Table, + cmsUInt32Number dwFlags) +{ + cmsInterpParams* p; + cmsUInt32Number i; + + // Check for maximum inputs + if (InputChan > MAX_INPUT_DIMENSIONS) { + cmsSignalError(ContextID, cmsERROR_RANGE, "Too many input channels (%d channels, max=%d)", InputChan, MAX_INPUT_DIMENSIONS); + return NULL; + } + + // Creates an empty object + p = (cmsInterpParams*) _cmsMallocZero(ContextID, sizeof(cmsInterpParams)); + if (p == NULL) return NULL; + + // Keep original parameters + p -> dwFlags = dwFlags; + p -> nInputs = InputChan; + p -> nOutputs = OutputChan; + p ->Table = Table; + p ->ContextID = ContextID; + + // Fill samples per input direction and domain (which is number of nodes minus one) + for (i=0; i < InputChan; i++) { + + p -> nSamples[i] = nSamples[i]; + p -> Domain[i] = nSamples[i] - 1; + } + + // Compute factors to apply to each component to index the grid array + p -> opta[0] = p -> nOutputs; + for (i=1; i < InputChan; i++) + p ->opta[i] = p ->opta[i-1] * nSamples[InputChan-i]; + + + if (!_cmsSetInterpolationRoutine(ContextID, p)) { + cmsSignalError(ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported interpolation (%d->%d channels)", InputChan, OutputChan); + _cmsFree(ContextID, p); + return NULL; + } + + // All seems ok + return p; +} + + +// This one is a wrapper on the anterior, but assuming all directions have same number of nodes +cmsInterpParams* CMSEXPORT _cmsComputeInterpParams(cmsContext ContextID, cmsUInt32Number nSamples, + cmsUInt32Number InputChan, cmsUInt32Number OutputChan, const void* Table, cmsUInt32Number dwFlags) +{ + int i; + cmsUInt32Number Samples[MAX_INPUT_DIMENSIONS]; + + // Fill the auxiliary array + for (i=0; i < MAX_INPUT_DIMENSIONS; i++) + Samples[i] = nSamples; + + // Call the extended function + return _cmsComputeInterpParamsEx(ContextID, Samples, InputChan, OutputChan, Table, dwFlags); +} + + +// Free all associated memory +void CMSEXPORT _cmsFreeInterpParams(cmsInterpParams* p) +{ + if (p != NULL) _cmsFree(p ->ContextID, p); +} + + +// Inline fixed point interpolation +cmsINLINE CMS_NO_SANITIZE cmsUInt16Number LinearInterp(cmsS15Fixed16Number a, cmsS15Fixed16Number l, cmsS15Fixed16Number h) +{ + cmsUInt32Number dif = (cmsUInt32Number) (h - l) * a + 0x8000; + dif = (dif >> 16) + l; + return (cmsUInt16Number) (dif); +} + + +// Linear interpolation (Fixed-point optimized) +static +void LinLerp1D(CMSREGISTER const cmsUInt16Number Value[], + CMSREGISTER cmsUInt16Number Output[], + CMSREGISTER const cmsInterpParams* p) +{ + cmsUInt16Number y1, y0; + int cell0, rest; + int val3; + const cmsUInt16Number* LutTable = (cmsUInt16Number*) p ->Table; + + // if last value or just one point + if (Value[0] == 0xffff || p->Domain[0] == 0) { + + Output[0] = LutTable[p -> Domain[0]]; + } + else + { + val3 = p->Domain[0] * Value[0]; + val3 = _cmsToFixedDomain(val3); // To fixed 15.16 + + cell0 = FIXED_TO_INT(val3); // Cell is 16 MSB bits + rest = FIXED_REST_TO_INT(val3); // Rest is 16 LSB bits + + y0 = LutTable[cell0]; + y1 = LutTable[cell0 + 1]; + + Output[0] = LinearInterp(rest, y0, y1); + } +} + +// To prevent out of bounds indexing +cmsINLINE cmsFloat32Number fclamp(cmsFloat32Number v) +{ + return ((v < 1.0e-9f) || isnan(v)) ? 0.0f : (v > 1.0f ? 1.0f : v); +} + +// Floating-point version of 1D interpolation +static +void LinLerp1Dfloat(const cmsFloat32Number Value[], + cmsFloat32Number Output[], + const cmsInterpParams* p) +{ + cmsFloat32Number y1, y0; + cmsFloat32Number val2, rest; + int cell0, cell1; + const cmsFloat32Number* LutTable = (cmsFloat32Number*) p ->Table; + + val2 = fclamp(Value[0]); + + // if last value... + if (val2 == 1.0 || p->Domain[0] == 0) { + Output[0] = LutTable[p -> Domain[0]]; + } + else + { + val2 *= p->Domain[0]; + + cell0 = (int)floor(val2); + cell1 = (int)ceil(val2); + + // Rest is 16 LSB bits + rest = val2 - cell0; + + y0 = LutTable[cell0]; + y1 = LutTable[cell1]; + + Output[0] = y0 + (y1 - y0) * rest; + } +} + + + +// Eval gray LUT having only one input channel +static CMS_NO_SANITIZE +void Eval1Input(CMSREGISTER const cmsUInt16Number Input[], + CMSREGISTER cmsUInt16Number Output[], + CMSREGISTER const cmsInterpParams* p16) +{ + cmsS15Fixed16Number fk; + cmsS15Fixed16Number k0, k1, rk, K0, K1; + int v; + cmsUInt32Number OutChan; + const cmsUInt16Number* LutTable = (cmsUInt16Number*) p16 -> Table; + + + // if last value... + if (Input[0] == 0xffff || p16->Domain[0] == 0) { + + cmsUInt32Number y0 = p16->Domain[0] * p16->opta[0]; + + for (OutChan = 0; OutChan < p16->nOutputs; OutChan++) { + Output[OutChan] = LutTable[y0 + OutChan]; + } + } + else + { + + v = Input[0] * p16->Domain[0]; + fk = _cmsToFixedDomain(v); + + k0 = FIXED_TO_INT(fk); + rk = (cmsUInt16Number)FIXED_REST_TO_INT(fk); + + k1 = k0 + (Input[0] != 0xFFFFU ? 1 : 0); + + K0 = p16->opta[0] * k0; + K1 = p16->opta[0] * k1; + + for (OutChan = 0; OutChan < p16->nOutputs; OutChan++) { + + Output[OutChan] = LinearInterp(rk, LutTable[K0 + OutChan], LutTable[K1 + OutChan]); + } + } +} + + + +// Eval gray LUT having only one input channel +static +void Eval1InputFloat(const cmsFloat32Number Value[], + cmsFloat32Number Output[], + const cmsInterpParams* p) +{ + cmsFloat32Number y1, y0; + cmsFloat32Number val2, rest; + int cell0, cell1; + cmsUInt32Number OutChan; + const cmsFloat32Number* LutTable = (cmsFloat32Number*) p ->Table; + + val2 = fclamp(Value[0]); + + // if last value... + if (val2 == 1.0 || p->Domain[0] == 0) { + + cmsUInt32Number start = p->Domain[0] * p->opta[0]; + + for (OutChan = 0; OutChan < p->nOutputs; OutChan++) { + Output[OutChan] = LutTable[start + OutChan]; + } + } + else + { + val2 *= p->Domain[0]; + + cell0 = (int)floor(val2); + cell1 = (int)ceil(val2); + + // Rest is 16 LSB bits + rest = val2 - cell0; + + cell0 *= p->opta[0]; + cell1 *= p->opta[0]; + + for (OutChan = 0; OutChan < p->nOutputs; OutChan++) { + + y0 = LutTable[cell0 + OutChan]; + y1 = LutTable[cell1 + OutChan]; + + Output[OutChan] = y0 + (y1 - y0) * rest; + } + } +} + +// Bilinear interpolation (16 bits) - cmsFloat32Number version +static +void BilinearInterpFloat(const cmsFloat32Number Input[], + cmsFloat32Number Output[], + const cmsInterpParams* p) + +{ +# define LERP(a,l,h) (cmsFloat32Number) ((l)+(((h)-(l))*(a))) +# define DENS(i,j) (LutTable[(i)+(j)+OutChan]) + + const cmsFloat32Number* LutTable = (cmsFloat32Number*) p ->Table; + cmsFloat32Number px, py; + int x0, y0, + X0, Y0, X1, Y1; + int TotalOut, OutChan; + cmsFloat32Number fx, fy, + d00, d01, d10, d11, + dx0, dx1, + dxy; + + TotalOut = p -> nOutputs; + px = fclamp(Input[0]) * p->Domain[0]; + py = fclamp(Input[1]) * p->Domain[1]; + + x0 = (int) _cmsQuickFloor(px); fx = px - (cmsFloat32Number) x0; + y0 = (int) _cmsQuickFloor(py); fy = py - (cmsFloat32Number) y0; + + X0 = p -> opta[1] * x0; + X1 = X0 + (fclamp(Input[0]) >= 1.0 ? 0 : p->opta[1]); + + Y0 = p -> opta[0] * y0; + Y1 = Y0 + (fclamp(Input[1]) >= 1.0 ? 0 : p->opta[0]); + + for (OutChan = 0; OutChan < TotalOut; OutChan++) { + + d00 = DENS(X0, Y0); + d01 = DENS(X0, Y1); + d10 = DENS(X1, Y0); + d11 = DENS(X1, Y1); + + dx0 = LERP(fx, d00, d10); + dx1 = LERP(fx, d01, d11); + + dxy = LERP(fy, dx0, dx1); + + Output[OutChan] = dxy; + } + + +# undef LERP +# undef DENS +} + +// Bilinear interpolation (16 bits) - optimized version +static CMS_NO_SANITIZE +void BilinearInterp16(CMSREGISTER const cmsUInt16Number Input[], + CMSREGISTER cmsUInt16Number Output[], + CMSREGISTER const cmsInterpParams* p) + +{ +#define DENS(i,j) (LutTable[(i)+(j)+OutChan]) +#define LERP(a,l,h) (cmsUInt16Number) (l + ROUND_FIXED_TO_INT(((h-l)*a))) + + const cmsUInt16Number* LutTable = (cmsUInt16Number*) p ->Table; + int OutChan, TotalOut; + cmsS15Fixed16Number fx, fy; + CMSREGISTER int rx, ry; + int x0, y0; + CMSREGISTER int X0, X1, Y0, Y1; + + int d00, d01, d10, d11, + dx0, dx1, + dxy; + + TotalOut = p -> nOutputs; + + fx = _cmsToFixedDomain((int) Input[0] * p -> Domain[0]); + x0 = FIXED_TO_INT(fx); + rx = FIXED_REST_TO_INT(fx); // Rest in 0..1.0 domain + + + fy = _cmsToFixedDomain((int) Input[1] * p -> Domain[1]); + y0 = FIXED_TO_INT(fy); + ry = FIXED_REST_TO_INT(fy); + + + X0 = p -> opta[1] * x0; + X1 = X0 + (Input[0] == 0xFFFFU ? 0 : p->opta[1]); + + Y0 = p -> opta[0] * y0; + Y1 = Y0 + (Input[1] == 0xFFFFU ? 0 : p->opta[0]); + + for (OutChan = 0; OutChan < TotalOut; OutChan++) { + + d00 = DENS(X0, Y0); + d01 = DENS(X0, Y1); + d10 = DENS(X1, Y0); + d11 = DENS(X1, Y1); + + dx0 = LERP(rx, d00, d10); + dx1 = LERP(rx, d01, d11); + + dxy = LERP(ry, dx0, dx1); + + Output[OutChan] = (cmsUInt16Number) dxy; + } + + +# undef LERP +# undef DENS +} + + +// Trilinear interpolation (16 bits) - cmsFloat32Number version +static +void TrilinearInterpFloat(const cmsFloat32Number Input[], + cmsFloat32Number Output[], + const cmsInterpParams* p) + +{ +# define LERP(a,l,h) (cmsFloat32Number) ((l)+(((h)-(l))*(a))) +# define DENS(i,j,k) (LutTable[(i)+(j)+(k)+OutChan]) + + const cmsFloat32Number* LutTable = (cmsFloat32Number*) p ->Table; + cmsFloat32Number px, py, pz; + int x0, y0, z0, + X0, Y0, Z0, X1, Y1, Z1; + int TotalOut, OutChan; + + cmsFloat32Number fx, fy, fz, + d000, d001, d010, d011, + d100, d101, d110, d111, + dx00, dx01, dx10, dx11, + dxy0, dxy1, dxyz; + + TotalOut = p -> nOutputs; + + // We need some clipping here + px = fclamp(Input[0]) * p->Domain[0]; + py = fclamp(Input[1]) * p->Domain[1]; + pz = fclamp(Input[2]) * p->Domain[2]; + + x0 = (int) floor(px); fx = px - (cmsFloat32Number) x0; // We need full floor functionality here + y0 = (int) floor(py); fy = py - (cmsFloat32Number) y0; + z0 = (int) floor(pz); fz = pz - (cmsFloat32Number) z0; + + X0 = p -> opta[2] * x0; + X1 = X0 + (fclamp(Input[0]) >= 1.0 ? 0 : p->opta[2]); + + Y0 = p -> opta[1] * y0; + Y1 = Y0 + (fclamp(Input[1]) >= 1.0 ? 0 : p->opta[1]); + + Z0 = p -> opta[0] * z0; + Z1 = Z0 + (fclamp(Input[2]) >= 1.0 ? 0 : p->opta[0]); + + for (OutChan = 0; OutChan < TotalOut; OutChan++) { + + d000 = DENS(X0, Y0, Z0); + d001 = DENS(X0, Y0, Z1); + d010 = DENS(X0, Y1, Z0); + d011 = DENS(X0, Y1, Z1); + + d100 = DENS(X1, Y0, Z0); + d101 = DENS(X1, Y0, Z1); + d110 = DENS(X1, Y1, Z0); + d111 = DENS(X1, Y1, Z1); + + + dx00 = LERP(fx, d000, d100); + dx01 = LERP(fx, d001, d101); + dx10 = LERP(fx, d010, d110); + dx11 = LERP(fx, d011, d111); + + dxy0 = LERP(fy, dx00, dx10); + dxy1 = LERP(fy, dx01, dx11); + + dxyz = LERP(fz, dxy0, dxy1); + + Output[OutChan] = dxyz; + } + + +# undef LERP +# undef DENS +} + +// Trilinear interpolation (16 bits) - optimized version +static CMS_NO_SANITIZE +void TrilinearInterp16(CMSREGISTER const cmsUInt16Number Input[], + CMSREGISTER cmsUInt16Number Output[], + CMSREGISTER const cmsInterpParams* p) + +{ +#define DENS(i,j,k) (LutTable[(i)+(j)+(k)+OutChan]) +#define LERP(a,l,h) (cmsUInt16Number) (l + ROUND_FIXED_TO_INT(((h-l)*a))) + + const cmsUInt16Number* LutTable = (cmsUInt16Number*) p ->Table; + int OutChan, TotalOut; + cmsS15Fixed16Number fx, fy, fz; + CMSREGISTER int rx, ry, rz; + int x0, y0, z0; + CMSREGISTER int X0, X1, Y0, Y1, Z0, Z1; + int d000, d001, d010, d011, + d100, d101, d110, d111, + dx00, dx01, dx10, dx11, + dxy0, dxy1, dxyz; + + TotalOut = p -> nOutputs; + + fx = _cmsToFixedDomain((int) Input[0] * p -> Domain[0]); + x0 = FIXED_TO_INT(fx); + rx = FIXED_REST_TO_INT(fx); // Rest in 0..1.0 domain + + + fy = _cmsToFixedDomain((int) Input[1] * p -> Domain[1]); + y0 = FIXED_TO_INT(fy); + ry = FIXED_REST_TO_INT(fy); + + fz = _cmsToFixedDomain((int) Input[2] * p -> Domain[2]); + z0 = FIXED_TO_INT(fz); + rz = FIXED_REST_TO_INT(fz); + + + X0 = p -> opta[2] * x0; + X1 = X0 + (Input[0] == 0xFFFFU ? 0 : p->opta[2]); + + Y0 = p -> opta[1] * y0; + Y1 = Y0 + (Input[1] == 0xFFFFU ? 0 : p->opta[1]); + + Z0 = p -> opta[0] * z0; + Z1 = Z0 + (Input[2] == 0xFFFFU ? 0 : p->opta[0]); + + for (OutChan = 0; OutChan < TotalOut; OutChan++) { + + d000 = DENS(X0, Y0, Z0); + d001 = DENS(X0, Y0, Z1); + d010 = DENS(X0, Y1, Z0); + d011 = DENS(X0, Y1, Z1); + + d100 = DENS(X1, Y0, Z0); + d101 = DENS(X1, Y0, Z1); + d110 = DENS(X1, Y1, Z0); + d111 = DENS(X1, Y1, Z1); + + + dx00 = LERP(rx, d000, d100); + dx01 = LERP(rx, d001, d101); + dx10 = LERP(rx, d010, d110); + dx11 = LERP(rx, d011, d111); + + dxy0 = LERP(ry, dx00, dx10); + dxy1 = LERP(ry, dx01, dx11); + + dxyz = LERP(rz, dxy0, dxy1); + + Output[OutChan] = (cmsUInt16Number) dxyz; + } + + +# undef LERP +# undef DENS +} + + +// Tetrahedral interpolation, using Sakamoto algorithm. +#define DENS(i,j,k) (LutTable[(i)+(j)+(k)+OutChan]) +static +void TetrahedralInterpFloat(const cmsFloat32Number Input[], + cmsFloat32Number Output[], + const cmsInterpParams* p) +{ + const cmsFloat32Number* LutTable = (cmsFloat32Number*) p -> Table; + cmsFloat32Number px, py, pz; + int x0, y0, z0, + X0, Y0, Z0, X1, Y1, Z1; + cmsFloat32Number rx, ry, rz; + cmsFloat32Number c0, c1=0, c2=0, c3=0; + int OutChan, TotalOut; + + TotalOut = p -> nOutputs; + + // We need some clipping here + px = fclamp(Input[0]) * p->Domain[0]; + py = fclamp(Input[1]) * p->Domain[1]; + pz = fclamp(Input[2]) * p->Domain[2]; + + x0 = (int) floor(px); rx = (px - (cmsFloat32Number) x0); // We need full floor functionality here + y0 = (int) floor(py); ry = (py - (cmsFloat32Number) y0); + z0 = (int) floor(pz); rz = (pz - (cmsFloat32Number) z0); + + + X0 = p -> opta[2] * x0; + X1 = X0 + (fclamp(Input[0]) >= 1.0 ? 0 : p->opta[2]); + + Y0 = p -> opta[1] * y0; + Y1 = Y0 + (fclamp(Input[1]) >= 1.0 ? 0 : p->opta[1]); + + Z0 = p -> opta[0] * z0; + Z1 = Z0 + (fclamp(Input[2]) >= 1.0 ? 0 : p->opta[0]); + + for (OutChan=0; OutChan < TotalOut; OutChan++) { + + // These are the 6 Tetrahedral + + c0 = DENS(X0, Y0, Z0); + + if (rx >= ry && ry >= rz) { + + c1 = DENS(X1, Y0, Z0) - c0; + c2 = DENS(X1, Y1, Z0) - DENS(X1, Y0, Z0); + c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0); + + } + else + if (rx >= rz && rz >= ry) { + + c1 = DENS(X1, Y0, Z0) - c0; + c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1); + c3 = DENS(X1, Y0, Z1) - DENS(X1, Y0, Z0); + + } + else + if (rz >= rx && rx >= ry) { + + c1 = DENS(X1, Y0, Z1) - DENS(X0, Y0, Z1); + c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1); + c3 = DENS(X0, Y0, Z1) - c0; + + } + else + if (ry >= rx && rx >= rz) { + + c1 = DENS(X1, Y1, Z0) - DENS(X0, Y1, Z0); + c2 = DENS(X0, Y1, Z0) - c0; + c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0); + + } + else + if (ry >= rz && rz >= rx) { + + c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1); + c2 = DENS(X0, Y1, Z0) - c0; + c3 = DENS(X0, Y1, Z1) - DENS(X0, Y1, Z0); + + } + else + if (rz >= ry && ry >= rx) { + + c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1); + c2 = DENS(X0, Y1, Z1) - DENS(X0, Y0, Z1); + c3 = DENS(X0, Y0, Z1) - c0; + + } + else { + c1 = c2 = c3 = 0; + } + + Output[OutChan] = c0 + c1 * rx + c2 * ry + c3 * rz; + } + +} + +#undef DENS + +static CMS_NO_SANITIZE +void TetrahedralInterp16(CMSREGISTER const cmsUInt16Number Input[], + CMSREGISTER cmsUInt16Number Output[], + CMSREGISTER const cmsInterpParams* p) +{ + const cmsUInt16Number* LutTable = (cmsUInt16Number*) p -> Table; + cmsS15Fixed16Number fx, fy, fz; + cmsS15Fixed16Number rx, ry, rz; + int x0, y0, z0; + cmsS15Fixed16Number c0, c1, c2, c3, Rest; + cmsUInt32Number X0, X1, Y0, Y1, Z0, Z1; + cmsUInt32Number TotalOut = p -> nOutputs; + + fx = _cmsToFixedDomain((int) Input[0] * p -> Domain[0]); + fy = _cmsToFixedDomain((int) Input[1] * p -> Domain[1]); + fz = _cmsToFixedDomain((int) Input[2] * p -> Domain[2]); + + x0 = FIXED_TO_INT(fx); + y0 = FIXED_TO_INT(fy); + z0 = FIXED_TO_INT(fz); + + rx = FIXED_REST_TO_INT(fx); + ry = FIXED_REST_TO_INT(fy); + rz = FIXED_REST_TO_INT(fz); + + X0 = p -> opta[2] * x0; + X1 = (Input[0] == 0xFFFFU ? 0 : p->opta[2]); + + Y0 = p -> opta[1] * y0; + Y1 = (Input[1] == 0xFFFFU ? 0 : p->opta[1]); + + Z0 = p -> opta[0] * z0; + Z1 = (Input[2] == 0xFFFFU ? 0 : p->opta[0]); + + LutTable += X0+Y0+Z0; + + // Output should be computed as x = ROUND_FIXED_TO_INT(_cmsToFixedDomain(Rest)) + // which expands as: x = (Rest + ((Rest+0x7fff)/0xFFFF) + 0x8000)>>16 + // This can be replaced by: t = Rest+0x8001, x = (t + (t>>16))>>16 + // at the cost of being off by one at 7fff and 17ffe. + + if (rx >= ry) { + if (ry >= rz) { + Y1 += X1; + Z1 += Y1; + for (; TotalOut; TotalOut--) { + c1 = LutTable[X1]; + c2 = LutTable[Y1]; + c3 = LutTable[Z1]; + c0 = *LutTable++; + c3 -= c2; + c2 -= c1; + c1 -= c0; + Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001; + *Output++ = (cmsUInt16Number) c0 + ((Rest + (Rest>>16))>>16); + } + } else if (rz >= rx) { + X1 += Z1; + Y1 += X1; + for (; TotalOut; TotalOut--) { + c1 = LutTable[X1]; + c2 = LutTable[Y1]; + c3 = LutTable[Z1]; + c0 = *LutTable++; + c2 -= c1; + c1 -= c3; + c3 -= c0; + Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001; + *Output++ = (cmsUInt16Number) c0 + ((Rest + (Rest>>16))>>16); + } + } else { + Z1 += X1; + Y1 += Z1; + for (; TotalOut; TotalOut--) { + c1 = LutTable[X1]; + c2 = LutTable[Y1]; + c3 = LutTable[Z1]; + c0 = *LutTable++; + c2 -= c3; + c3 -= c1; + c1 -= c0; + Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001; + *Output++ = (cmsUInt16Number) c0 + ((Rest + (Rest>>16))>>16); + } + } + } else { + if (rx >= rz) { + X1 += Y1; + Z1 += X1; + for (; TotalOut; TotalOut--) { + c1 = LutTable[X1]; + c2 = LutTable[Y1]; + c3 = LutTable[Z1]; + c0 = *LutTable++; + c3 -= c1; + c1 -= c2; + c2 -= c0; + Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001; + *Output++ = (cmsUInt16Number) c0 + ((Rest + (Rest>>16))>>16); + } + } else if (ry >= rz) { + Z1 += Y1; + X1 += Z1; + for (; TotalOut; TotalOut--) { + c1 = LutTable[X1]; + c2 = LutTable[Y1]; + c3 = LutTable[Z1]; + c0 = *LutTable++; + c1 -= c3; + c3 -= c2; + c2 -= c0; + Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001; + *Output++ = (cmsUInt16Number) c0 + ((Rest + (Rest>>16))>>16); + } + } else { + Y1 += Z1; + X1 += Y1; + for (; TotalOut; TotalOut--) { + c1 = LutTable[X1]; + c2 = LutTable[Y1]; + c3 = LutTable[Z1]; + c0 = *LutTable++; + c1 -= c2; + c2 -= c3; + c3 -= c0; + Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001; + *Output++ = (cmsUInt16Number) c0 + ((Rest + (Rest>>16))>>16); + } + } + } +} + + +#define DENS(i,j,k) (LutTable[(i)+(j)+(k)+OutChan]) +static CMS_NO_SANITIZE +void Eval4Inputs(CMSREGISTER const cmsUInt16Number Input[], + CMSREGISTER cmsUInt16Number Output[], + CMSREGISTER const cmsInterpParams* p16) +{ + const cmsUInt16Number* LutTable; + cmsS15Fixed16Number fk; + cmsS15Fixed16Number k0, rk; + int K0, K1; + cmsS15Fixed16Number fx, fy, fz; + cmsS15Fixed16Number rx, ry, rz; + int x0, y0, z0; + cmsS15Fixed16Number X0, X1, Y0, Y1, Z0, Z1; + cmsUInt32Number i; + cmsS15Fixed16Number c0, c1, c2, c3, Rest; + cmsUInt32Number OutChan; + cmsUInt16Number Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS]; + + + fk = _cmsToFixedDomain((int) Input[0] * p16 -> Domain[0]); + fx = _cmsToFixedDomain((int) Input[1] * p16 -> Domain[1]); + fy = _cmsToFixedDomain((int) Input[2] * p16 -> Domain[2]); + fz = _cmsToFixedDomain((int) Input[3] * p16 -> Domain[3]); + + k0 = FIXED_TO_INT(fk); + x0 = FIXED_TO_INT(fx); + y0 = FIXED_TO_INT(fy); + z0 = FIXED_TO_INT(fz); + + rk = FIXED_REST_TO_INT(fk); + rx = FIXED_REST_TO_INT(fx); + ry = FIXED_REST_TO_INT(fy); + rz = FIXED_REST_TO_INT(fz); + + K0 = p16 -> opta[3] * k0; + K1 = K0 + (Input[0] == 0xFFFFU ? 0 : p16->opta[3]); + + X0 = p16 -> opta[2] * x0; + X1 = X0 + (Input[1] == 0xFFFFU ? 0 : p16->opta[2]); + + Y0 = p16 -> opta[1] * y0; + Y1 = Y0 + (Input[2] == 0xFFFFU ? 0 : p16->opta[1]); + + Z0 = p16 -> opta[0] * z0; + Z1 = Z0 + (Input[3] == 0xFFFFU ? 0 : p16->opta[0]); + + LutTable = (cmsUInt16Number*) p16 -> Table; + LutTable += K0; + + for (OutChan=0; OutChan < p16 -> nOutputs; OutChan++) { + + c0 = DENS(X0, Y0, Z0); + + if (rx >= ry && ry >= rz) { + + c1 = DENS(X1, Y0, Z0) - c0; + c2 = DENS(X1, Y1, Z0) - DENS(X1, Y0, Z0); + c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0); + + } + else + if (rx >= rz && rz >= ry) { + + c1 = DENS(X1, Y0, Z0) - c0; + c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1); + c3 = DENS(X1, Y0, Z1) - DENS(X1, Y0, Z0); + + } + else + if (rz >= rx && rx >= ry) { + + c1 = DENS(X1, Y0, Z1) - DENS(X0, Y0, Z1); + c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1); + c3 = DENS(X0, Y0, Z1) - c0; + + } + else + if (ry >= rx && rx >= rz) { + + c1 = DENS(X1, Y1, Z0) - DENS(X0, Y1, Z0); + c2 = DENS(X0, Y1, Z0) - c0; + c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0); + + } + else + if (ry >= rz && rz >= rx) { + + c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1); + c2 = DENS(X0, Y1, Z0) - c0; + c3 = DENS(X0, Y1, Z1) - DENS(X0, Y1, Z0); + + } + else + if (rz >= ry && ry >= rx) { + + c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1); + c2 = DENS(X0, Y1, Z1) - DENS(X0, Y0, Z1); + c3 = DENS(X0, Y0, Z1) - c0; + + } + else { + c1 = c2 = c3 = 0; + } + + Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001; + + Tmp1[OutChan] = (cmsUInt16Number)c0 + ((Rest + (Rest >> 16)) >> 16); + } + + + LutTable = (cmsUInt16Number*) p16 -> Table; + LutTable += K1; + + for (OutChan=0; OutChan < p16 -> nOutputs; OutChan++) { + + c0 = DENS(X0, Y0, Z0); + + if (rx >= ry && ry >= rz) { + + c1 = DENS(X1, Y0, Z0) - c0; + c2 = DENS(X1, Y1, Z0) - DENS(X1, Y0, Z0); + c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0); + + } + else + if (rx >= rz && rz >= ry) { + + c1 = DENS(X1, Y0, Z0) - c0; + c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1); + c3 = DENS(X1, Y0, Z1) - DENS(X1, Y0, Z0); + + } + else + if (rz >= rx && rx >= ry) { + + c1 = DENS(X1, Y0, Z1) - DENS(X0, Y0, Z1); + c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1); + c3 = DENS(X0, Y0, Z1) - c0; + + } + else + if (ry >= rx && rx >= rz) { + + c1 = DENS(X1, Y1, Z0) - DENS(X0, Y1, Z0); + c2 = DENS(X0, Y1, Z0) - c0; + c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0); + + } + else + if (ry >= rz && rz >= rx) { + + c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1); + c2 = DENS(X0, Y1, Z0) - c0; + c3 = DENS(X0, Y1, Z1) - DENS(X0, Y1, Z0); + + } + else + if (rz >= ry && ry >= rx) { + + c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1); + c2 = DENS(X0, Y1, Z1) - DENS(X0, Y0, Z1); + c3 = DENS(X0, Y0, Z1) - c0; + + } + else { + c1 = c2 = c3 = 0; + } + + Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001; + + Tmp2[OutChan] = (cmsUInt16Number) c0 + ((Rest + (Rest >> 16)) >> 16); + } + + + + for (i=0; i < p16 -> nOutputs; i++) { + Output[i] = LinearInterp(rk, Tmp1[i], Tmp2[i]); + } +} +#undef DENS + + +// For more that 3 inputs (i.e., CMYK) +// evaluate two 3-dimensional interpolations and then linearly interpolate between them. +static +void Eval4InputsFloat(const cmsFloat32Number Input[], + cmsFloat32Number Output[], + const cmsInterpParams* p) +{ + const cmsFloat32Number* LutTable = (cmsFloat32Number*) p -> Table; + cmsFloat32Number rest; + cmsFloat32Number pk; + int k0, K0, K1; + const cmsFloat32Number* T; + cmsUInt32Number i; + cmsFloat32Number Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS]; + cmsInterpParams p1; + + pk = fclamp(Input[0]) * p->Domain[0]; + k0 = _cmsQuickFloor(pk); + rest = pk - (cmsFloat32Number) k0; + + K0 = p -> opta[3] * k0; + K1 = K0 + (fclamp(Input[0]) >= 1.0 ? 0 : p->opta[3]); + + p1 = *p; + memmove(&p1.Domain[0], &p ->Domain[1], 3*sizeof(cmsUInt32Number)); + + T = LutTable + K0; + p1.Table = T; + + TetrahedralInterpFloat(Input + 1, Tmp1, &p1); + + T = LutTable + K1; + p1.Table = T; + TetrahedralInterpFloat(Input + 1, Tmp2, &p1); + + for (i=0; i < p -> nOutputs; i++) + { + cmsFloat32Number y0 = Tmp1[i]; + cmsFloat32Number y1 = Tmp2[i]; + + Output[i] = y0 + (y1 - y0) * rest; + } +} + +#define EVAL_FNS(N,NM) static CMS_NO_SANITIZE \ +void Eval##N##Inputs(CMSREGISTER const cmsUInt16Number Input[], CMSREGISTER cmsUInt16Number Output[], CMSREGISTER const cmsInterpParams* p16)\ +{\ + const cmsUInt16Number* LutTable = (cmsUInt16Number*) p16 -> Table;\ + cmsS15Fixed16Number fk;\ + cmsS15Fixed16Number k0, rk;\ + int K0, K1;\ + const cmsUInt16Number* T;\ + cmsUInt32Number i;\ + cmsUInt16Number Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS];\ + cmsInterpParams p1;\ +\ + fk = _cmsToFixedDomain((cmsS15Fixed16Number) Input[0] * p16 -> Domain[0]);\ + k0 = FIXED_TO_INT(fk);\ + rk = FIXED_REST_TO_INT(fk);\ +\ + K0 = p16 -> opta[NM] * k0;\ + K1 = p16 -> opta[NM] * (k0 + (Input[0] != 0xFFFFU ? 1 : 0));\ +\ + p1 = *p16;\ + memmove(&p1.Domain[0], &p16 ->Domain[1], NM*sizeof(cmsUInt32Number));\ +\ + T = LutTable + K0;\ + p1.Table = T;\ +\ + Eval##NM##Inputs(Input + 1, Tmp1, &p1);\ +\ + T = LutTable + K1;\ + p1.Table = T;\ +\ + Eval##NM##Inputs(Input + 1, Tmp2, &p1);\ +\ + for (i=0; i < p16 -> nOutputs; i++) {\ +\ + Output[i] = LinearInterp(rk, Tmp1[i], Tmp2[i]);\ + }\ +}\ +\ +static void Eval##N##InputsFloat(const cmsFloat32Number Input[], \ + cmsFloat32Number Output[],\ + const cmsInterpParams * p)\ +{\ + const cmsFloat32Number* LutTable = (cmsFloat32Number*) p -> Table;\ + cmsFloat32Number rest;\ + cmsFloat32Number pk;\ + int k0, K0, K1;\ + const cmsFloat32Number* T;\ + cmsUInt32Number i;\ + cmsFloat32Number Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS];\ + cmsInterpParams p1;\ +\ + pk = fclamp(Input[0]) * p->Domain[0];\ + k0 = _cmsQuickFloor(pk);\ + rest = pk - (cmsFloat32Number) k0;\ +\ + K0 = p -> opta[NM] * k0;\ + K1 = K0 + (fclamp(Input[0]) >= 1.0 ? 0 : p->opta[NM]);\ +\ + p1 = *p;\ + memmove(&p1.Domain[0], &p ->Domain[1], NM*sizeof(cmsUInt32Number));\ +\ + T = LutTable + K0;\ + p1.Table = T;\ +\ + Eval##NM##InputsFloat(Input + 1, Tmp1, &p1);\ +\ + T = LutTable + K1;\ + p1.Table = T;\ +\ + Eval##NM##InputsFloat(Input + 1, Tmp2, &p1);\ +\ + for (i=0; i < p -> nOutputs; i++) {\ +\ + cmsFloat32Number y0 = Tmp1[i];\ + cmsFloat32Number y1 = Tmp2[i];\ +\ + Output[i] = y0 + (y1 - y0) * rest;\ + }\ +} + + +/** +* Thanks to Carles Llopis for the templating idea +*/ +EVAL_FNS(5, 4) +EVAL_FNS(6, 5) +EVAL_FNS(7, 6) +EVAL_FNS(8, 7) +EVAL_FNS(9, 8) +EVAL_FNS(10, 9) +EVAL_FNS(11, 10) +EVAL_FNS(12, 11) +EVAL_FNS(13, 12) +EVAL_FNS(14, 13) +EVAL_FNS(15, 14) + + +// The default factory +static +cmsInterpFunction DefaultInterpolatorsFactory(cmsUInt32Number nInputChannels, cmsUInt32Number nOutputChannels, cmsUInt32Number dwFlags) +{ + + cmsInterpFunction Interpolation; + cmsBool IsFloat = (dwFlags & CMS_LERP_FLAGS_FLOAT); + cmsBool IsTrilinear = (dwFlags & CMS_LERP_FLAGS_TRILINEAR); + + memset(&Interpolation, 0, sizeof(Interpolation)); + + // Safety check + if (nInputChannels >= 4 && nOutputChannels >= MAX_STAGE_CHANNELS) + return Interpolation; + + switch (nInputChannels) { + + case 1: // Gray LUT / linear + + if (nOutputChannels == 1) { + + if (IsFloat) + Interpolation.LerpFloat = LinLerp1Dfloat; + else + Interpolation.Lerp16 = LinLerp1D; + + } + else { + + if (IsFloat) + Interpolation.LerpFloat = Eval1InputFloat; + else + Interpolation.Lerp16 = Eval1Input; + } + break; + + case 2: // Duotone + if (IsFloat) + Interpolation.LerpFloat = BilinearInterpFloat; + else + Interpolation.Lerp16 = BilinearInterp16; + break; + + case 3: // RGB et al + + if (IsTrilinear) { + + if (IsFloat) + Interpolation.LerpFloat = TrilinearInterpFloat; + else + Interpolation.Lerp16 = TrilinearInterp16; + } + else { + + if (IsFloat) + Interpolation.LerpFloat = TetrahedralInterpFloat; + else { + + Interpolation.Lerp16 = TetrahedralInterp16; + } + } + break; + + case 4: // CMYK lut + + if (IsFloat) + Interpolation.LerpFloat = Eval4InputsFloat; + else + Interpolation.Lerp16 = Eval4Inputs; + break; + + case 5: // 5 Inks + if (IsFloat) + Interpolation.LerpFloat = Eval5InputsFloat; + else + Interpolation.Lerp16 = Eval5Inputs; + break; + + case 6: // 6 Inks + if (IsFloat) + Interpolation.LerpFloat = Eval6InputsFloat; + else + Interpolation.Lerp16 = Eval6Inputs; + break; + + case 7: // 7 inks + if (IsFloat) + Interpolation.LerpFloat = Eval7InputsFloat; + else + Interpolation.Lerp16 = Eval7Inputs; + break; + + case 8: // 8 inks + if (IsFloat) + Interpolation.LerpFloat = Eval8InputsFloat; + else + Interpolation.Lerp16 = Eval8Inputs; + break; + + case 9: + if (IsFloat) + Interpolation.LerpFloat = Eval9InputsFloat; + else + Interpolation.Lerp16 = Eval9Inputs; + break; + + case 10: + if (IsFloat) + Interpolation.LerpFloat = Eval10InputsFloat; + else + Interpolation.Lerp16 = Eval10Inputs; + break; + + case 11: + if (IsFloat) + Interpolation.LerpFloat = Eval11InputsFloat; + else + Interpolation.Lerp16 = Eval11Inputs; + break; + + case 12: + if (IsFloat) + Interpolation.LerpFloat = Eval12InputsFloat; + else + Interpolation.Lerp16 = Eval12Inputs; + break; + + case 13: + if (IsFloat) + Interpolation.LerpFloat = Eval13InputsFloat; + else + Interpolation.Lerp16 = Eval13Inputs; + break; + + case 14: + if (IsFloat) + Interpolation.LerpFloat = Eval14InputsFloat; + else + Interpolation.Lerp16 = Eval14Inputs; + break; + + case 15: + if (IsFloat) + Interpolation.LerpFloat = Eval15InputsFloat; + else + Interpolation.Lerp16 = Eval15Inputs; + break; + + default: + Interpolation.Lerp16 = NULL; + } + + return Interpolation; +} diff --git a/local/recipes/libs/lcms2/source/src/cmsio0.c b/local/recipes/libs/lcms2/source/src/cmsio0.c new file mode 100644 index 0000000000..d47b5f080b --- /dev/null +++ b/local/recipes/libs/lcms2/source/src/cmsio0.c @@ -0,0 +1,2201 @@ +//--------------------------------------------------------------------------------- +// +// Little Color Management System +// Copyright (c) 1998-2026 Marti Maria Saguer +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//--------------------------------------------------------------------------------- +// + +#include "lcms2_internal.h" + +// Generic I/O, tag dictionary management, profile struct + +// IOhandlers are abstractions used by littleCMS to read from whatever file, stream, +// memory block or any storage. Each IOhandler provides implementations for read, +// write, seek and tell functions. LittleCMS code deals with IO across those objects. +// In this way, is easier to add support for new storage media. + +// NULL stream, for taking care of used space ------------------------------------- + +// NULL IOhandler basically does nothing but keep track on how many bytes have been +// written. This is handy when creating profiles, where the file size is needed in the +// header. Then, whole profile is serialized across NULL IOhandler and a second pass +// writes the bytes to the pertinent IOhandler. + +typedef struct { + cmsUInt32Number Pointer; // Points to current location +} FILENULL; + +static +cmsUInt32Number NULLRead(cmsIOHANDLER* iohandler, void *Buffer, cmsUInt32Number size, cmsUInt32Number count) +{ + FILENULL* ResData = (FILENULL*) iohandler ->stream; + + cmsUInt32Number len = size * count; + ResData -> Pointer += len; + return count; + + cmsUNUSED_PARAMETER(Buffer); +} + +static +cmsBool NULLSeek(cmsIOHANDLER* iohandler, cmsUInt32Number offset) +{ + FILENULL* ResData = (FILENULL*) iohandler ->stream; + + ResData ->Pointer = offset; + return TRUE; +} + +static +cmsUInt32Number NULLTell(cmsIOHANDLER* iohandler) +{ + FILENULL* ResData = (FILENULL*) iohandler ->stream; + return ResData -> Pointer; +} + +static +cmsBool NULLWrite(cmsIOHANDLER* iohandler, cmsUInt32Number size, const void *Ptr) +{ + FILENULL* ResData = (FILENULL*) iohandler ->stream; + + if (size > (cmsUInt32Number)(0xFFFFFFFFU - ResData->Pointer)) + return FALSE; + + ResData ->Pointer += size; + if (ResData ->Pointer > iohandler->UsedSpace) + iohandler->UsedSpace = ResData ->Pointer; + + return TRUE; + + cmsUNUSED_PARAMETER(Ptr); +} + +static +cmsBool NULLClose(cmsIOHANDLER* iohandler) +{ + FILENULL* ResData = (FILENULL*) iohandler ->stream; + + _cmsFree(iohandler ->ContextID, ResData); + _cmsFree(iohandler ->ContextID, iohandler); + return TRUE; +} + +// The NULL IOhandler creator +cmsIOHANDLER* CMSEXPORT cmsOpenIOhandlerFromNULL(cmsContext ContextID) +{ + struct _cms_io_handler* iohandler = NULL; + FILENULL* fm = NULL; + + iohandler = (struct _cms_io_handler*) _cmsMallocZero(ContextID, sizeof(struct _cms_io_handler)); + if (iohandler == NULL) return NULL; + + fm = (FILENULL*) _cmsMallocZero(ContextID, sizeof(FILENULL)); + if (fm == NULL) goto Error; + + fm ->Pointer = 0; + + iohandler ->ContextID = ContextID; + iohandler ->stream = (void*) fm; + iohandler ->UsedSpace = 0; + iohandler ->ReportedSize = 0; + iohandler ->PhysicalFile[0] = 0; + + iohandler ->Read = NULLRead; + iohandler ->Seek = NULLSeek; + iohandler ->Close = NULLClose; + iohandler ->Tell = NULLTell; + iohandler ->Write = NULLWrite; + + return iohandler; + +Error: + if (iohandler) _cmsFree(ContextID, iohandler); + return NULL; + +} + +// Memory-based stream -------------------------------------------------------------- + +// Those functions implements an iohandler which takes a block of memory as storage medium. + +typedef struct { + cmsUInt8Number* Block; // Points to allocated memory + cmsUInt32Number Size; // Size of allocated memory + cmsUInt32Number Pointer; // Points to current location + int FreeBlockOnClose; // As title + +} FILEMEM; + +static +cmsUInt32Number MemoryRead(struct _cms_io_handler* iohandler, void *Buffer, cmsUInt32Number size, cmsUInt32Number count) +{ + FILEMEM* ResData = (FILEMEM*) iohandler ->stream; + cmsUInt8Number* Ptr; + cmsUInt32Number len = size * count; + + if (size == 0 || count == 0) + return 0; + + if ((len / count) != size) + goto ReadError; + + if (Buffer == NULL) + goto ReadError; + + if (len > ResData->Size) + goto ReadError; + + if (ResData -> Pointer > ResData -> Size - len) + goto ReadError; + + Ptr = ResData -> Block; + Ptr += ResData -> Pointer; + memmove(Buffer, Ptr, len); + ResData -> Pointer += len; + + return count; + +ReadError: + cmsSignalError(iohandler->ContextID, cmsERROR_READ, "Read from memory error"); + return 0; + +} + +// SEEK_CUR is assumed +static +cmsBool MemorySeek(struct _cms_io_handler* iohandler, cmsUInt32Number offset) +{ + FILEMEM* ResData = (FILEMEM*) iohandler ->stream; + + if (offset > ResData ->Size) + return FALSE; + + ResData ->Pointer = offset; + return TRUE; +} + +// Tell for memory +static +cmsUInt32Number MemoryTell(struct _cms_io_handler* iohandler) +{ + FILEMEM* ResData = (FILEMEM*) iohandler ->stream; + + if (ResData == NULL) return 0; + return ResData -> Pointer; +} + + +// Writes data to memory, also keeps used space for further reference. +static +cmsBool MemoryWrite(struct _cms_io_handler* iohandler, cmsUInt32Number size, const void *Ptr) +{ + FILEMEM* ResData = (FILEMEM*) iohandler ->stream; + + if (ResData == NULL || Ptr == NULL) goto WriteError; + + if (size == 0) return TRUE; // Write zero bytes is ok, but does nothing + + // Check for available space. + + if (size > ResData->Size || ResData->Pointer > (ResData->Size - size)) + goto WriteError; + + memmove(ResData ->Block + ResData ->Pointer, Ptr, size); + ResData ->Pointer += size; + + if (ResData ->Pointer > iohandler->UsedSpace) + iohandler->UsedSpace = ResData ->Pointer; + + return TRUE; + +WriteError: + cmsSignalError(iohandler->ContextID, cmsERROR_WRITE, "Write to memory error"); + return FALSE; +} + + +static +cmsBool MemoryClose(struct _cms_io_handler* iohandler) +{ + FILEMEM* ResData = (FILEMEM*) iohandler ->stream; + + if (ResData ->FreeBlockOnClose) { + + if (ResData ->Block) _cmsFree(iohandler ->ContextID, ResData ->Block); + } + + _cmsFree(iohandler ->ContextID, ResData); + _cmsFree(iohandler ->ContextID, iohandler); + + return TRUE; +} + +// Create a iohandler for memory block. AccessMode=='r' assumes the iohandler is going to read, and makes +// a copy of the memory block for letting user to free the memory after invoking open profile. In write +// mode ("w"), Buffer points to the begin of memory block to be written. +cmsIOHANDLER* CMSEXPORT cmsOpenIOhandlerFromMem(cmsContext ContextID, void *Buffer, cmsUInt32Number size, const char* AccessMode) +{ + cmsIOHANDLER* iohandler = NULL; + FILEMEM* fm = NULL; + + _cmsAssert(AccessMode != NULL); + + iohandler = (cmsIOHANDLER*) _cmsMallocZero(ContextID, sizeof(cmsIOHANDLER)); + if (iohandler == NULL) return NULL; + + switch (*AccessMode) { + + case 'r': + fm = (FILEMEM*) _cmsMallocZero(ContextID, sizeof(FILEMEM)); + if (fm == NULL) goto Error; + + if (Buffer == NULL) { + cmsSignalError(ContextID, cmsERROR_READ, "Couldn't read profile from NULL pointer"); + goto Error; + } + + fm ->Block = (cmsUInt8Number*) _cmsMalloc(ContextID, size); + if (fm ->Block == NULL) { + + _cmsFree(ContextID, fm); + _cmsFree(ContextID, iohandler); + cmsSignalError(ContextID, cmsERROR_READ, "Couldn't allocate %ld bytes for profile", (long) size); + return NULL; + } + + + memmove(fm->Block, Buffer, size); + fm ->FreeBlockOnClose = TRUE; + fm ->Size = size; + fm ->Pointer = 0; + iohandler -> ReportedSize = size; + break; + + case 'w': + fm = (FILEMEM*) _cmsMallocZero(ContextID, sizeof(FILEMEM)); + if (fm == NULL) goto Error; + + if (Buffer == NULL) { + cmsSignalError(ContextID, cmsERROR_WRITE, "Couldn't write profile to NULL pointer"); + goto Error; + } + + fm ->Block = (cmsUInt8Number*) Buffer; + fm ->FreeBlockOnClose = FALSE; + fm ->Size = size; + fm ->Pointer = 0; + iohandler -> ReportedSize = 0; + break; + + default: + cmsSignalError(ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unknown access mode '%c'", *AccessMode); + return NULL; + } + + iohandler ->ContextID = ContextID; + iohandler ->stream = (void*) fm; + iohandler ->UsedSpace = 0; + iohandler ->PhysicalFile[0] = 0; + + iohandler ->Read = MemoryRead; + iohandler ->Seek = MemorySeek; + iohandler ->Close = MemoryClose; + iohandler ->Tell = MemoryTell; + iohandler ->Write = MemoryWrite; + + return iohandler; + +Error: + if (fm) _cmsFree(ContextID, fm); + if (iohandler) _cmsFree(ContextID, iohandler); + return NULL; +} + +// File-based stream ------------------------------------------------------- + +// Read count elements of size bytes each. Return number of elements read +static +cmsUInt32Number FileRead(cmsIOHANDLER* iohandler, void *Buffer, cmsUInt32Number size, cmsUInt32Number count) +{ + cmsUInt32Number nReaded = (cmsUInt32Number) fread(Buffer, size, count, (FILE*) iohandler->stream); + + if (nReaded != count) { + cmsSignalError(iohandler ->ContextID, cmsERROR_FILE, "Read error. Got %d bytes, block should be of %d bytes", nReaded * size, count * size); + return 0; + } + + return nReaded; +} + +// Position file pointer in the file +static +cmsBool FileSeek(cmsIOHANDLER* iohandler, cmsUInt32Number offset) +{ +#ifdef CMS_LARGE_FILE_SUPPORT +# ifdef CMS_IS_WINDOWS_ + if (_fseeki64((FILE*) iohandler->stream, (long long int) offset, SEEK_SET) != 0) { +# else + if (fseeko((FILE*) iohandler->stream, (off_t) offset, SEEK_SET) != 0) { +# endif +#else + if (fseek((FILE*) iohandler ->stream, (long) offset, SEEK_SET) != 0) { +#endif + cmsSignalError(iohandler ->ContextID, cmsERROR_FILE, "Seek error; probably corrupted file"); + return FALSE; + } + + return TRUE; +} + +// Returns file pointer position or 0 on error, which is also a valid position. +static +cmsUInt32Number FileTell(cmsIOHANDLER* iohandler) +{ +#ifdef CMS_LARGE_FILE_SUPPORT +# ifdef CMS_IS_WINDOWS_ + long long int t = _ftelli64((FILE*) iohandler->stream); +# else + long long int t = (long long int) ftello((FILE*) iohandler->stream); +# endif + if (t < 0) { + cmsSignalError(iohandler->ContextID, cmsERROR_FILE, "Tell error; probably corrupted file"); + return 0; + } +#else + long t = ftell((FILE*)iohandler ->stream); + if (t == -1L) { + cmsSignalError(iohandler->ContextID, cmsERROR_FILE, "Tell error; probably corrupted file"); + return 0; + } +#endif + return (cmsUInt32Number) t; +} + +// Writes data to stream, also keeps used space for further reference. Returns TRUE on success, FALSE on error +static +cmsBool FileWrite(cmsIOHANDLER* iohandler, cmsUInt32Number size, const void* Buffer) +{ + if (size == 0) return TRUE; // We allow to write 0 bytes, but nothing is written + + iohandler->UsedSpace += size; + return (fwrite(Buffer, size, 1, (FILE*)iohandler->stream) == 1); +} + +// Closes the file +static +cmsBool FileClose(cmsIOHANDLER* iohandler) +{ + if (fclose((FILE*) iohandler ->stream) != 0) return FALSE; + _cmsFree(iohandler ->ContextID, iohandler); + return TRUE; +} + +// Create a iohandler for disk based files. +cmsIOHANDLER* CMSEXPORT cmsOpenIOhandlerFromFile(cmsContext ContextID, const char* FileName, const char* AccessMode) +{ + cmsIOHANDLER* iohandler = NULL; + FILE* fm = NULL; +#ifdef CMS_LARGE_FILE_SUPPORT + long long int fileLen; +#else + long int fileLen; +#endif + char mode[4] = { 0,0,0,0 }; + + _cmsAssert(FileName != NULL); + _cmsAssert(AccessMode != NULL); + + iohandler = (cmsIOHANDLER*) _cmsMallocZero(ContextID, sizeof(cmsIOHANDLER)); + if (iohandler == NULL) return NULL; + + // Validate access mode + while (*AccessMode) { + + switch (*AccessMode) + { + case 'r': + case 'w': + + if (mode[0] == 0) { + mode[0] = *AccessMode; + mode[1] = 'b'; + } + else { + _cmsFree(ContextID, iohandler); + cmsSignalError(ContextID, cmsERROR_FILE, "Access mode already specified '%c'", *AccessMode); + return NULL; + } + break; + + // Close on exec. Not all runtime supports that. Up to the caller to decide. + case 'e': + mode[2] = 'e'; + break; + + default: + _cmsFree(ContextID, iohandler); + cmsSignalError(ContextID, cmsERROR_FILE, "Wrong access mode '%c'", *AccessMode); + return NULL; + } + + AccessMode++; + } + + switch (mode[0]) { + + case 'r': + fm = fopen(FileName, mode); + if (fm == NULL) { + _cmsFree(ContextID, iohandler); + cmsSignalError(ContextID, cmsERROR_FILE, "File '%s' not found", FileName); + return NULL; + } + fileLen = cmsfilelength(fm); + if (fileLen < 0) + { + fclose(fm); + _cmsFree(ContextID, iohandler); + cmsSignalError(ContextID, cmsERROR_FILE, "Cannot get size of file '%s'", FileName); + return NULL; + } +#ifdef CMS_LARGE_FILE_SUPPORT + if (fileLen > (long long int) 0xFFFFFFFFLL) + { + fclose(fm); + _cmsFree(ContextID, iohandler); + cmsSignalError(ContextID, cmsERROR_FILE, "File '%s' is too large", FileName); + return NULL; + } +#endif + iohandler -> ReportedSize = (cmsUInt32Number) fileLen; + break; + + case 'w': + fm = fopen(FileName, mode); + if (fm == NULL) { + _cmsFree(ContextID, iohandler); + cmsSignalError(ContextID, cmsERROR_FILE, "Couldn't create '%s'", FileName); + return NULL; + } + iohandler -> ReportedSize = 0; + break; + + default: + _cmsFree(ContextID, iohandler); // Would never reach + return NULL; + } + + iohandler ->ContextID = ContextID; + iohandler ->stream = (void*) fm; + iohandler ->UsedSpace = 0; + + // Keep track of the original file + strncpy(iohandler -> PhysicalFile, FileName, sizeof(iohandler -> PhysicalFile)-1); + iohandler -> PhysicalFile[sizeof(iohandler -> PhysicalFile)-1] = 0; + + iohandler ->Read = FileRead; + iohandler ->Seek = FileSeek; + iohandler ->Close = FileClose; + iohandler ->Tell = FileTell; + iohandler ->Write = FileWrite; + + return iohandler; +} + +// Create a iohandler for stream based files +cmsIOHANDLER* CMSEXPORT cmsOpenIOhandlerFromStream(cmsContext ContextID, FILE* Stream) +{ + cmsIOHANDLER* iohandler = NULL; +#ifdef CMS_LARGE_FILE_SUPPORT + long long int fileSize; +#else + long int fileSize; +#endif + + fileSize = cmsfilelength(Stream); + if (fileSize < 0) + { + cmsSignalError(ContextID, cmsERROR_FILE, "Cannot get size of stream"); + return NULL; + } +#ifdef CMS_LARGE_FILE_SUPPORT + if (fileSize > (long long int) 0xFFFFFFFFLL) + { + cmsSignalError(ContextID, cmsERROR_FILE, "Stream is too large"); + return NULL; + } +#endif + + iohandler = (cmsIOHANDLER*) _cmsMallocZero(ContextID, sizeof(cmsIOHANDLER)); + if (iohandler == NULL) return NULL; + + iohandler -> ContextID = ContextID; + iohandler -> stream = (void*) Stream; + iohandler -> UsedSpace = 0; + iohandler -> ReportedSize = (cmsUInt32Number) fileSize; + iohandler -> PhysicalFile[0] = 0; + + iohandler ->Read = FileRead; + iohandler ->Seek = FileSeek; + iohandler ->Close = FileClose; + iohandler ->Tell = FileTell; + iohandler ->Write = FileWrite; + + return iohandler; +} + + + +// Close an open IO handler +cmsBool CMSEXPORT cmsCloseIOhandler(cmsIOHANDLER* io) +{ + return io -> Close(io); +} + +// ------------------------------------------------------------------------------------------------------- + +cmsIOHANDLER* CMSEXPORT cmsGetProfileIOhandler(cmsHPROFILE hProfile) +{ + _cmsICCPROFILE* Icc = (_cmsICCPROFILE*)hProfile; + + if (Icc == NULL) return NULL; + return Icc->IOhandler; +} + +// Creates an empty structure holding all required parameters +cmsHPROFILE CMSEXPORT cmsCreateProfilePlaceholder(cmsContext ContextID) +{ + _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) _cmsMallocZero(ContextID, sizeof(_cmsICCPROFILE)); + if (Icc == NULL) return NULL; + + Icc ->ContextID = ContextID; + + // Set it to empty + Icc -> TagCount = 0; + + // Set default version + Icc ->Version = 0x02100000; + + // Set default CMM (that's me!) + Icc ->CMM = lcmsSignature; + + // Set default creator + // Created by LittleCMS (that's me!) + Icc ->creator = lcmsSignature; + + // Set default platform +#ifdef CMS_IS_WINDOWS_ + Icc ->platform = cmsSigMicrosoft; +#else + Icc ->platform = cmsSigMacintosh; +#endif + + // Set default device class + Icc->DeviceClass = cmsSigDisplayClass; + + // Set creation date/time + if (!_cmsGetTime(&Icc->Created)) + goto Error; + + // Create a mutex if the user provided proper plugin. NULL otherwise + Icc ->UsrMutex = _cmsCreateMutex(ContextID); + + // Return the handle + return (cmsHPROFILE) Icc; + +Error: + _cmsFree(ContextID, Icc); + return NULL; +} + +cmsContext CMSEXPORT cmsGetProfileContextID(cmsHPROFILE hProfile) +{ + _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; + + if (Icc == NULL) return NULL; + return Icc -> ContextID; +} + + +// Return the number of tags +cmsInt32Number CMSEXPORT cmsGetTagCount(cmsHPROFILE hProfile) +{ + _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; + if (Icc == NULL) return -1; + + return (cmsInt32Number) Icc->TagCount; +} + +// Return the tag signature of a given tag number +cmsTagSignature CMSEXPORT cmsGetTagSignature(cmsHPROFILE hProfile, cmsUInt32Number n) +{ + _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; + + if (n > Icc->TagCount) return (cmsTagSignature) 0; // Mark as not available + if (n >= MAX_TABLE_TAG) return (cmsTagSignature) 0; // As double check + + return Icc ->TagNames[n]; +} + +// Return location of the tag +cmsBool CMSEXPORT cmsGetTagOffsetAndSize(cmsHPROFILE hProfile, cmsUInt32Number n, cmsUInt32Number* offset, cmsUInt32Number* size) +{ + _cmsICCPROFILE* Icc = (_cmsICCPROFILE*)hProfile; + + if (n > Icc->TagCount) return FALSE; + if (n >= MAX_TABLE_TAG) return FALSE; + + if (offset != NULL) *offset = Icc->TagOffsets[n]; + if (size != NULL) *size = Icc->TagSizes[n]; + return TRUE; +} + +static +int SearchOneTag(_cmsICCPROFILE* Profile, cmsTagSignature sig) +{ + int i; + + for (i=0; i < (int) Profile -> TagCount; i++) { + + if (sig == Profile -> TagNames[i]) + return i; + } + + return -1; +} + +// Search for a specific tag in tag dictionary. Returns position or -1 if tag not found. +// If followlinks is turned on, then the position of the linked tag is returned +int _cmsSearchTag(_cmsICCPROFILE* Icc, cmsTagSignature sig, cmsBool lFollowLinks) +{ + int n; + cmsTagSignature LinkedSig; + + do { + + // Search for given tag in ICC profile directory + n = SearchOneTag(Icc, sig); + if (n < 0) + return -1; // Not found + + if (!lFollowLinks) + return n; // Found, don't follow links + + // Is this a linked tag? + LinkedSig = Icc ->TagLinked[n]; + + // Yes, follow link + if (LinkedSig != (cmsTagSignature) 0) { + sig = LinkedSig; + } + + } while (LinkedSig != (cmsTagSignature) 0); + + return n; +} + +// Deletes a tag entry + +static +void _cmsDeleteTagByPos(_cmsICCPROFILE* Icc, int i) +{ + _cmsAssert(Icc != NULL); + _cmsAssert(i >= 0); + + + if (Icc -> TagPtrs[i] != NULL) { + + // Free previous version + if (Icc ->TagSaveAsRaw[i]) { + _cmsFree(Icc ->ContextID, Icc ->TagPtrs[i]); + Icc->TagSaveAsRaw[i] = FALSE; + } + else { + cmsTagTypeHandler* TypeHandler = Icc ->TagTypeHandlers[i]; + + if (TypeHandler != NULL) { + + cmsTagTypeHandler LocalTypeHandler = *TypeHandler; + LocalTypeHandler.ContextID = Icc ->ContextID; // As an additional parameter + LocalTypeHandler.ICCVersion = Icc ->Version; + LocalTypeHandler.FreePtr(&LocalTypeHandler, Icc -> TagPtrs[i]); + Icc ->TagPtrs[i] = NULL; + } + } + + } +} + + +// Creates a new tag entry +static +cmsBool _cmsNewTag(_cmsICCPROFILE* Icc, cmsTagSignature sig, int* NewPos) +{ + int i; + + // Search for the tag + i = _cmsSearchTag(Icc, sig, FALSE); + if (i >= 0) { + + // Already exists? delete it + _cmsDeleteTagByPos(Icc, i); + *NewPos = i; + } + else { + + // No, make a new one + if (Icc -> TagCount >= MAX_TABLE_TAG) { + cmsSignalError(Icc ->ContextID, cmsERROR_RANGE, "Too many tags (%d)", MAX_TABLE_TAG); + return FALSE; + } + + *NewPos = (int) Icc ->TagCount; + Icc -> TagCount++; + } + + return TRUE; +} + + +// Check existence +cmsBool CMSEXPORT cmsIsTag(cmsHPROFILE hProfile, cmsTagSignature sig) +{ + _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) (void*) hProfile; + return _cmsSearchTag(Icc, sig, FALSE) >= 0; +} + + + +// Checks for link compatibility +static +cmsBool CompatibleTypes(const cmsTagDescriptor* desc1, const cmsTagDescriptor* desc2) +{ + cmsUInt32Number i; + + if (desc1 == NULL || desc2 == NULL) return FALSE; + + if (desc1->nSupportedTypes != desc2->nSupportedTypes) return FALSE; + if (desc1->ElemCount != desc2->ElemCount) return FALSE; + + for (i = 0; i < desc1->nSupportedTypes; i++) + { + if (desc1->SupportedTypes[i] != desc2->SupportedTypes[i]) return FALSE; + } + + return TRUE; +} + +// Enforces that the profile version is per. spec. +// Operates on the big endian bytes from the profile. +// Called before converting to platform endianness. +// Byte 0 is BCD major version, so max 9. +// Byte 1 is 2 BCD digits, one per nibble. +// Reserved bytes 2 & 3 must be 0. +static +cmsUInt32Number _validatedVersion(cmsUInt32Number DWord) +{ + cmsUInt8Number* pByte = (cmsUInt8Number*) &DWord; + cmsUInt8Number temp1; + cmsUInt8Number temp2; + + if (*pByte > 0x09) *pByte = (cmsUInt8Number) 0x09; + temp1 = (cmsUInt8Number) (*(pByte+1) & 0xf0); + temp2 = (cmsUInt8Number) (*(pByte+1) & 0x0f); + if (temp1 > 0x90U) temp1 = 0x90U; + if (temp2 > 0x09U) temp2 = 0x09U; + *(pByte+1) = (cmsUInt8Number)(temp1 | temp2); + *(pByte+2) = (cmsUInt8Number)0; + *(pByte+3) = (cmsUInt8Number)0; + + return DWord; +} + +// Check device class +static +cmsBool validDeviceClass(cmsProfileClassSignature cl) +{ + if (cl == (cmsProfileClassSignature)0) + return TRUE; // We allow zero because older lcms versions defaulted to that. + + switch (cl) + { + case cmsSigInputClass: + case cmsSigDisplayClass: + case cmsSigOutputClass: + case cmsSigLinkClass: + case cmsSigAbstractClass: + case cmsSigColorSpaceClass: + case cmsSigNamedColorClass: + case cmsSigColorEncodingSpaceClass: + case cmsSigMultiplexIdentificationClass: + case cmsSigMultiplexLinkClass: + case cmsSigMultiplexVisualizationClass: + return TRUE; + + default: + return FALSE; + } + +} + +// Read profile header and validate it +cmsBool _cmsReadHeader(_cmsICCPROFILE* Icc) +{ + cmsTagEntry Tag; + cmsICCHeader Header; + cmsUInt32Number i, j; + cmsUInt32Number HeaderSize; + cmsIOHANDLER* io = Icc ->IOhandler; + cmsUInt32Number TagCount; + + + // Read the header + if (io -> Read(io, &Header, sizeof(cmsICCHeader), 1) != 1) { + return FALSE; + } + + // Validate file as an ICC profile + if (_cmsAdjustEndianess32(Header.magic) != cmsMagicNumber) { + cmsSignalError(Icc ->ContextID, cmsERROR_BAD_SIGNATURE, "not an ICC profile, invalid signature"); + return FALSE; + } + + // Adjust endianness of the used parameters + Icc -> CMM = _cmsAdjustEndianess32(Header.cmmId); + Icc -> DeviceClass = (cmsProfileClassSignature) _cmsAdjustEndianess32(Header.deviceClass); + Icc -> ColorSpace = (cmsColorSpaceSignature) _cmsAdjustEndianess32(Header.colorSpace); + Icc -> PCS = (cmsColorSpaceSignature) _cmsAdjustEndianess32(Header.pcs); + + Icc -> RenderingIntent = _cmsAdjustEndianess32(Header.renderingIntent); + Icc -> platform = (cmsPlatformSignature)_cmsAdjustEndianess32(Header.platform); + Icc -> flags = _cmsAdjustEndianess32(Header.flags); + Icc -> manufacturer = _cmsAdjustEndianess32(Header.manufacturer); + Icc -> model = _cmsAdjustEndianess32(Header.model); + Icc -> creator = _cmsAdjustEndianess32(Header.creator); + + _cmsAdjustEndianess64(&Icc -> attributes, &Header.attributes); + Icc -> Version = _cmsAdjustEndianess32(_validatedVersion(Header.version)); + + if (Icc->Version > 0x5000000) { + cmsSignalError(Icc->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported profile version '0x%x'", Icc->Version); + return FALSE; + } + + if (!validDeviceClass(Icc->DeviceClass)) { + cmsSignalError(Icc->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported device class '0x%x'", Icc->DeviceClass); + return FALSE; + } + + // Get size as reported in header + HeaderSize = _cmsAdjustEndianess32(Header.size); + + // Make sure HeaderSize is lower than profile size + if (HeaderSize >= Icc ->IOhandler ->ReportedSize) + HeaderSize = Icc ->IOhandler ->ReportedSize; + + + // Get creation date/time + _cmsDecodeDateTimeNumber(&Header.date, &Icc ->Created); + + // The profile ID are 32 raw bytes + memmove(Icc ->ProfileID.ID32, Header.profileID.ID32, 16); + + + // Read tag directory + if (!_cmsReadUInt32Number(io, &TagCount)) return FALSE; + if (TagCount > MAX_TABLE_TAG) { + + cmsSignalError(Icc ->ContextID, cmsERROR_RANGE, "Too many tags (%d)", TagCount); + return FALSE; + } + + + // Read tag directory + Icc -> TagCount = 0; + for (i=0; i < TagCount; i++) { + + if (!_cmsReadUInt32Number(io, (cmsUInt32Number *) &Tag.sig)) return FALSE; + if (!_cmsReadUInt32Number(io, &Tag.offset)) return FALSE; + if (!_cmsReadUInt32Number(io, &Tag.size)) return FALSE; + + // Perform some sanity check. Offset + size should fall inside file. + if (Tag.size == 0 || Tag.offset == 0) continue; + if (Tag.offset + Tag.size > HeaderSize || + Tag.offset + Tag.size < Tag.offset) + continue; + + Icc -> TagNames[Icc ->TagCount] = Tag.sig; + Icc -> TagOffsets[Icc ->TagCount] = Tag.offset; + Icc -> TagSizes[Icc ->TagCount] = Tag.size; + + // Search for links + for (j=0; j < Icc ->TagCount; j++) { + + if ((Icc ->TagOffsets[j] == Tag.offset) && + (Icc ->TagSizes[j] == Tag.size)) { + + // Check types. + if (CompatibleTypes(_cmsGetTagDescriptor(Icc->ContextID, Icc->TagNames[j]), + _cmsGetTagDescriptor(Icc->ContextID, Tag.sig))) { + + Icc->TagLinked[Icc->TagCount] = Icc->TagNames[j]; + } + } + + } + + Icc ->TagCount++; + } + + + for (i = 0; i < Icc->TagCount; i++) { + for (j = 0; j < Icc->TagCount; j++) { + + // Tags cannot be duplicate + if ((i != j) && (Icc->TagNames[i] == Icc->TagNames[j])) { + cmsSignalError(Icc->ContextID, cmsERROR_RANGE, "Duplicate tag found"); + return FALSE; + } + + } + } + + return TRUE; +} + +// Saves profile header +cmsBool _cmsWriteHeader(_cmsICCPROFILE* Icc, cmsUInt32Number UsedSpace) +{ + cmsICCHeader Header; + cmsUInt32Number i; + cmsTagEntry Tag; + cmsUInt32Number Count; + + Header.size = _cmsAdjustEndianess32(UsedSpace); + Header.cmmId = _cmsAdjustEndianess32(Icc ->CMM); + Header.version = _cmsAdjustEndianess32(Icc ->Version); + + Header.deviceClass = (cmsProfileClassSignature) _cmsAdjustEndianess32(Icc -> DeviceClass); + Header.colorSpace = (cmsColorSpaceSignature) _cmsAdjustEndianess32(Icc -> ColorSpace); + Header.pcs = (cmsColorSpaceSignature) _cmsAdjustEndianess32(Icc -> PCS); + + // NOTE: in v4 Timestamp must be in UTC rather than in local time + _cmsEncodeDateTimeNumber(&Header.date, &Icc ->Created); + + Header.magic = _cmsAdjustEndianess32(cmsMagicNumber); + + Header.platform = (cmsPlatformSignature) _cmsAdjustEndianess32(Icc -> platform); + + Header.flags = _cmsAdjustEndianess32(Icc -> flags); + Header.manufacturer = _cmsAdjustEndianess32(Icc -> manufacturer); + Header.model = _cmsAdjustEndianess32(Icc -> model); + + _cmsAdjustEndianess64(&Header.attributes, &Icc -> attributes); + + // Rendering intent in the header (for embedded profiles) + Header.renderingIntent = _cmsAdjustEndianess32(Icc -> RenderingIntent); + + // Illuminant is always D50 + Header.illuminant.X = (cmsS15Fixed16Number) _cmsAdjustEndianess32((cmsUInt32Number) _cmsDoubleTo15Fixed16(cmsD50_XYZ()->X)); + Header.illuminant.Y = (cmsS15Fixed16Number) _cmsAdjustEndianess32((cmsUInt32Number) _cmsDoubleTo15Fixed16(cmsD50_XYZ()->Y)); + Header.illuminant.Z = (cmsS15Fixed16Number) _cmsAdjustEndianess32((cmsUInt32Number) _cmsDoubleTo15Fixed16(cmsD50_XYZ()->Z)); + + Header.creator = _cmsAdjustEndianess32(Icc ->creator); + + memset(&Header.reserved, 0, sizeof(Header.reserved)); + + // Set profile ID. Endianness is always big endian + memmove(&Header.profileID, &Icc ->ProfileID, 16); + + // Dump the header + if (!Icc -> IOhandler->Write(Icc->IOhandler, sizeof(cmsICCHeader), &Header)) return FALSE; + + // Saves Tag directory + + // Get true count + Count = 0; + for (i=0; i < Icc -> TagCount; i++) { + if (Icc ->TagNames[i] != (cmsTagSignature) 0) + Count++; + } + + // Store number of tags + if (!_cmsWriteUInt32Number(Icc ->IOhandler, Count)) return FALSE; + + for (i=0; i < Icc -> TagCount; i++) { + + if (Icc ->TagNames[i] == (cmsTagSignature) 0) continue; // It is just a placeholder + + Tag.sig = (cmsTagSignature) _cmsAdjustEndianess32((cmsUInt32Number) Icc -> TagNames[i]); + Tag.offset = _cmsAdjustEndianess32((cmsUInt32Number) Icc -> TagOffsets[i]); + Tag.size = _cmsAdjustEndianess32((cmsUInt32Number) Icc -> TagSizes[i]); + + if (!Icc ->IOhandler -> Write(Icc-> IOhandler, sizeof(cmsTagEntry), &Tag)) return FALSE; + } + + return TRUE; +} + +// ----------------------------------------------------------------------- Set/Get several struct members + +cmsUInt32Number CMSEXPORT cmsGetHeaderCMM(cmsHPROFILE hProfile) +{ + _cmsICCPROFILE* Icc = (_cmsICCPROFILE*)hProfile; + return Icc->CMM; +} + +void CMSEXPORT _cmsSetHeaderCMM(cmsHPROFILE hProfile, cmsUInt32Number CMM) +{ + _cmsICCPROFILE* Icc = (_cmsICCPROFILE*)hProfile; + Icc->CMM = CMM; +} + +cmsUInt32Number CMSEXPORT cmsGetHeaderRenderingIntent(cmsHPROFILE hProfile) +{ + _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; + return Icc -> RenderingIntent; +} + +void CMSEXPORT cmsSetHeaderRenderingIntent(cmsHPROFILE hProfile, cmsUInt32Number RenderingIntent) +{ + _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; + Icc -> RenderingIntent = RenderingIntent; +} + +cmsUInt32Number CMSEXPORT cmsGetHeaderFlags(cmsHPROFILE hProfile) +{ + _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; + return (cmsUInt32Number) Icc -> flags; +} + +void CMSEXPORT cmsSetHeaderFlags(cmsHPROFILE hProfile, cmsUInt32Number Flags) +{ + _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; + Icc -> flags = (cmsUInt32Number) Flags; +} + +cmsUInt32Number CMSEXPORT cmsGetHeaderManufacturer(cmsHPROFILE hProfile) +{ + _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; + return Icc ->manufacturer; +} + +void CMSEXPORT cmsSetHeaderManufacturer(cmsHPROFILE hProfile, cmsUInt32Number manufacturer) +{ + _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; + Icc -> manufacturer = manufacturer; +} + +cmsUInt32Number CMSEXPORT cmsGetHeaderCreator(cmsHPROFILE hProfile) +{ + _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; + return Icc ->creator; +} + +cmsUInt32Number CMSEXPORT cmsGetHeaderModel(cmsHPROFILE hProfile) +{ + _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; + return Icc ->model; +} + +void CMSEXPORT cmsSetHeaderModel(cmsHPROFILE hProfile, cmsUInt32Number model) +{ + _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; + Icc -> model = model; +} + +void CMSEXPORT cmsGetHeaderAttributes(cmsHPROFILE hProfile, cmsUInt64Number* Flags) +{ + _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; + memmove(Flags, &Icc -> attributes, sizeof(cmsUInt64Number)); +} + +void CMSEXPORT cmsSetHeaderAttributes(cmsHPROFILE hProfile, cmsUInt64Number Flags) +{ + _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; + memmove(&Icc -> attributes, &Flags, sizeof(cmsUInt64Number)); +} + +void CMSEXPORT cmsGetHeaderProfileID(cmsHPROFILE hProfile, cmsUInt8Number* ProfileID) +{ + _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; + memmove(ProfileID, Icc ->ProfileID.ID8, 16); +} + +void CMSEXPORT cmsSetHeaderProfileID(cmsHPROFILE hProfile, cmsUInt8Number* ProfileID) +{ + _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; + memmove(&Icc -> ProfileID, ProfileID, 16); +} + +cmsBool CMSEXPORT cmsGetHeaderCreationDateTime(cmsHPROFILE hProfile, struct tm *Dest) +{ + _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; + memmove(Dest, &Icc ->Created, sizeof(struct tm)); + return TRUE; +} + +cmsColorSpaceSignature CMSEXPORT cmsGetPCS(cmsHPROFILE hProfile) +{ + _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; + return Icc -> PCS; +} + +void CMSEXPORT cmsSetPCS(cmsHPROFILE hProfile, cmsColorSpaceSignature pcs) +{ + _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; + Icc -> PCS = pcs; +} + +cmsColorSpaceSignature CMSEXPORT cmsGetColorSpace(cmsHPROFILE hProfile) +{ + _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; + return Icc -> ColorSpace; +} + +void CMSEXPORT cmsSetColorSpace(cmsHPROFILE hProfile, cmsColorSpaceSignature sig) +{ + _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; + Icc -> ColorSpace = sig; +} + +cmsProfileClassSignature CMSEXPORT cmsGetDeviceClass(cmsHPROFILE hProfile) +{ + _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; + return Icc -> DeviceClass; +} + +void CMSEXPORT cmsSetDeviceClass(cmsHPROFILE hProfile, cmsProfileClassSignature sig) +{ + _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; + Icc -> DeviceClass = sig; +} + +cmsUInt32Number CMSEXPORT cmsGetEncodedICCversion(cmsHPROFILE hProfile) +{ + _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; + return Icc -> Version; +} + +void CMSEXPORT cmsSetEncodedICCversion(cmsHPROFILE hProfile, cmsUInt32Number Version) +{ + _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; + Icc -> Version = Version; +} + +// Get an hexadecimal number with same digits as v +static +cmsUInt32Number BaseToBase(cmsUInt32Number in, int BaseIn, int BaseOut) +{ + char Buff[100]; + int i, len; + cmsUInt32Number out; + + for (len=0; in > 0 && len < 100; len++) { + + Buff[len] = (char) (in % BaseIn); + in /= BaseIn; + } + + for (i=len-1, out=0; i >= 0; --i) { + out = out * BaseOut + Buff[i]; + } + + return out; +} + +void CMSEXPORT cmsSetProfileVersion(cmsHPROFILE hProfile, cmsFloat64Number Version) +{ + _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; + + // 4.2 -> 0x4200000 + + Icc -> Version = BaseToBase((cmsUInt32Number) floor(Version * 100.0 + 0.5), 10, 16) << 16; +} + +cmsFloat64Number CMSEXPORT cmsGetProfileVersion(cmsHPROFILE hProfile) +{ + _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; + cmsUInt32Number n = Icc -> Version >> 16; + + return BaseToBase(n, 16, 10) / 100.0; +} +// -------------------------------------------------------------------------------------------------------------- + + +// Create profile from IOhandler +cmsHPROFILE CMSEXPORT cmsOpenProfileFromIOhandlerTHR(cmsContext ContextID, cmsIOHANDLER* io) +{ + _cmsICCPROFILE* NewIcc; + cmsHPROFILE hEmpty = cmsCreateProfilePlaceholder(ContextID); + + if (hEmpty == NULL) return NULL; + + NewIcc = (_cmsICCPROFILE*) hEmpty; + + NewIcc ->IOhandler = io; + if (!_cmsReadHeader(NewIcc)) goto Error; + return hEmpty; + +Error: + cmsCloseProfile(hEmpty); + return NULL; +} + +// Create profile from IOhandler +cmsHPROFILE CMSEXPORT cmsOpenProfileFromIOhandler2THR(cmsContext ContextID, cmsIOHANDLER* io, cmsBool write) +{ + _cmsICCPROFILE* NewIcc; + cmsHPROFILE hEmpty = cmsCreateProfilePlaceholder(ContextID); + + if (hEmpty == NULL) return NULL; + + NewIcc = (_cmsICCPROFILE*) hEmpty; + + NewIcc ->IOhandler = io; + if (write) { + + NewIcc -> IsWrite = TRUE; + return hEmpty; + } + + if (!_cmsReadHeader(NewIcc)) goto Error; + return hEmpty; + +Error: + cmsCloseProfile(hEmpty); + return NULL; +} + +// Create profile from disk file +cmsHPROFILE CMSEXPORT cmsOpenProfileFromFileTHR(cmsContext ContextID, const char *lpFileName, const char *sAccess) +{ + _cmsICCPROFILE* NewIcc; + cmsHPROFILE hEmpty = cmsCreateProfilePlaceholder(ContextID); + + if (hEmpty == NULL) return NULL; + + NewIcc = (_cmsICCPROFILE*) hEmpty; + + NewIcc ->IOhandler = cmsOpenIOhandlerFromFile(ContextID, lpFileName, sAccess); + if (NewIcc ->IOhandler == NULL) goto Error; + + if (*sAccess == 'W' || *sAccess == 'w') { + + NewIcc -> IsWrite = TRUE; + + return hEmpty; + } + + if (!_cmsReadHeader(NewIcc)) goto Error; + return hEmpty; + +Error: + cmsCloseProfile(hEmpty); + return NULL; +} + + +cmsHPROFILE CMSEXPORT cmsOpenProfileFromFile(const char *ICCProfile, const char *sAccess) +{ + return cmsOpenProfileFromFileTHR(NULL, ICCProfile, sAccess); +} + + +cmsHPROFILE CMSEXPORT cmsOpenProfileFromStreamTHR(cmsContext ContextID, FILE* ICCProfile, const char *sAccess) +{ + _cmsICCPROFILE* NewIcc; + cmsHPROFILE hEmpty = cmsCreateProfilePlaceholder(ContextID); + + if (hEmpty == NULL) return NULL; + + NewIcc = (_cmsICCPROFILE*) hEmpty; + + NewIcc ->IOhandler = cmsOpenIOhandlerFromStream(ContextID, ICCProfile); + if (NewIcc ->IOhandler == NULL) goto Error; + + if (*sAccess == 'w') { + + NewIcc -> IsWrite = TRUE; + return hEmpty; + } + + if (!_cmsReadHeader(NewIcc)) goto Error; + return hEmpty; + +Error: + cmsCloseProfile(hEmpty); + return NULL; + +} + +cmsHPROFILE CMSEXPORT cmsOpenProfileFromStream(FILE* ICCProfile, const char *sAccess) +{ + return cmsOpenProfileFromStreamTHR(NULL, ICCProfile, sAccess); +} + +// Open from memory block +cmsHPROFILE CMSEXPORT cmsOpenProfileFromMemTHR(cmsContext ContextID, const void* MemPtr, cmsUInt32Number dwSize) +{ + _cmsICCPROFILE* NewIcc; + cmsHPROFILE hEmpty; + + hEmpty = cmsCreateProfilePlaceholder(ContextID); + if (hEmpty == NULL) return NULL; + + NewIcc = (_cmsICCPROFILE*) hEmpty; + + // Ok, in this case const void* is casted to void* just because open IO handler + // shares read and writing modes. Don't abuse this feature! + NewIcc ->IOhandler = cmsOpenIOhandlerFromMem(ContextID, (void*) MemPtr, dwSize, "r"); + if (NewIcc ->IOhandler == NULL) goto Error; + + if (!_cmsReadHeader(NewIcc)) goto Error; + + return hEmpty; + +Error: + cmsCloseProfile(hEmpty); + return NULL; +} + +cmsHPROFILE CMSEXPORT cmsOpenProfileFromMem(const void* MemPtr, cmsUInt32Number dwSize) +{ + return cmsOpenProfileFromMemTHR(NULL, MemPtr, dwSize); +} + + + +// Dump tag contents. If the profile is being modified, untouched tags are copied from FileOrig +static +cmsBool SaveTags(_cmsICCPROFILE* Icc, _cmsICCPROFILE* FileOrig) +{ + cmsUInt8Number* Data; + cmsUInt32Number i; + cmsUInt32Number Begin; + cmsIOHANDLER* io = Icc ->IOhandler; + cmsTagDescriptor* TagDescriptor; + cmsTagTypeSignature TypeBase; + cmsTagTypeSignature Type; + cmsTagTypeHandler* TypeHandler; + cmsFloat64Number Version = cmsGetProfileVersion((cmsHPROFILE) Icc); + cmsTagTypeHandler LocalTypeHandler; + + for (i=0; i < Icc -> TagCount; i++) { + + if (Icc ->TagNames[i] == (cmsTagSignature) 0) continue; + + // Linked tags are not written + if (Icc ->TagLinked[i] != (cmsTagSignature) 0) continue; + + Icc -> TagOffsets[i] = Begin = io ->UsedSpace; + + Data = (cmsUInt8Number*) Icc -> TagPtrs[i]; + + if (!Data) { + + // Reach here if we are copying a tag from a disk-based ICC profile which has not been modified by user. + // In this case a blind copy of the block data is performed + if (FileOrig != NULL && Icc -> TagOffsets[i]) { + + if (FileOrig->IOhandler != NULL) + { + cmsUInt32Number TagSize = FileOrig->TagSizes[i]; + cmsUInt32Number TagOffset = FileOrig->TagOffsets[i]; + void* Mem; + + if (!FileOrig->IOhandler->Seek(FileOrig->IOhandler, TagOffset)) return FALSE; + + Mem = _cmsMalloc(Icc->ContextID, TagSize); + if (Mem == NULL) return FALSE; + + if (FileOrig->IOhandler->Read(FileOrig->IOhandler, Mem, TagSize, 1) != 1) return FALSE; + if (!io->Write(io, TagSize, Mem)) return FALSE; + _cmsFree(Icc->ContextID, Mem); + + Icc->TagSizes[i] = (io->UsedSpace - Begin); + + + // Align to 32 bit boundary. + if (!_cmsWriteAlignment(io)) + return FALSE; + } + } + + continue; + } + + + // Should this tag be saved as RAW? If so, tagsizes should be specified in advance (no further cooking is done) + if (Icc ->TagSaveAsRaw[i]) { + + if (io -> Write(io, Icc ->TagSizes[i], Data) != 1) return FALSE; + } + else { + + // Search for support on this tag + TagDescriptor = _cmsGetTagDescriptor(Icc-> ContextID, Icc -> TagNames[i]); + if (TagDescriptor == NULL) continue; // Unsupported, ignore it + + if (TagDescriptor ->DecideType != NULL) { + + Type = TagDescriptor ->DecideType(Version, Data); + } + else { + + Type = TagDescriptor ->SupportedTypes[0]; + } + + TypeHandler = _cmsGetTagTypeHandler(Icc->ContextID, Type); + + if (TypeHandler == NULL) { + cmsSignalError(Icc ->ContextID, cmsERROR_INTERNAL, "(Internal) no handler for tag %x", Icc -> TagNames[i]); + continue; + } + + TypeBase = TypeHandler ->Signature; + if (!_cmsWriteTypeBase(io, TypeBase)) + return FALSE; + + LocalTypeHandler = *TypeHandler; + LocalTypeHandler.ContextID = Icc ->ContextID; + LocalTypeHandler.ICCVersion = Icc ->Version; + if (!LocalTypeHandler.WritePtr(&LocalTypeHandler, io, Data, TagDescriptor ->ElemCount)) { + + char String[5]; + + _cmsTagSignature2String(String, (cmsTagSignature) TypeBase); + cmsSignalError(Icc ->ContextID, cmsERROR_WRITE, "Couldn't write type '%s'", String); + return FALSE; + } + } + + + Icc -> TagSizes[i] = (io ->UsedSpace - Begin); + + // Align to 32 bit boundary. + if (! _cmsWriteAlignment(io)) + return FALSE; + } + + + return TRUE; +} + +// Fill the offset and size fields for all linked tags +static +cmsBool SetLinks( _cmsICCPROFILE* Icc) +{ + cmsUInt32Number i; + + for (i=0; i < Icc -> TagCount; i++) { + + cmsTagSignature lnk = Icc ->TagLinked[i]; + if (lnk != (cmsTagSignature) 0) { + + int j = _cmsSearchTag(Icc, lnk, FALSE); + if (j >= 0) { + + Icc ->TagOffsets[i] = Icc ->TagOffsets[j]; + Icc ->TagSizes[i] = Icc ->TagSizes[j]; + } + + } + } + + return TRUE; +} + +// Low-level save to IOHANDLER. It returns the number of bytes used to +// store the profile, or zero on error. io may be NULL and in this case +// no data is written--only sizes are calculated +cmsUInt32Number CMSEXPORT cmsSaveProfileToIOhandler(cmsHPROFILE hProfile, cmsIOHANDLER* io) +{ + _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; + _cmsICCPROFILE Keep; + cmsIOHANDLER* PrevIO = NULL; + cmsUInt32Number UsedSpace; + cmsContext ContextID; + + _cmsAssert(hProfile != NULL); + + if (!_cmsLockMutex(Icc->ContextID, Icc->UsrMutex)) return 0; + memmove(&Keep, Icc, sizeof(_cmsICCPROFILE)); + + ContextID = cmsGetProfileContextID(hProfile); + PrevIO = Icc ->IOhandler = cmsOpenIOhandlerFromNULL(ContextID); + if (PrevIO == NULL) { + _cmsUnlockMutex(Icc->ContextID, Icc->UsrMutex); + return 0; + } + + // Pass #1 does compute offsets + + if (!_cmsWriteHeader(Icc, 0)) goto Error; + if (!SaveTags(Icc, &Keep)) goto Error; + + UsedSpace = PrevIO ->UsedSpace; + + // Pass #2 does save to iohandler + + if (io != NULL) { + + Icc ->IOhandler = io; + if (!SetLinks(Icc)) goto Error; + if (!_cmsWriteHeader(Icc, UsedSpace)) goto Error; + if (!SaveTags(Icc, &Keep)) goto Error; + } + + memmove(Icc, &Keep, sizeof(_cmsICCPROFILE)); + if (!cmsCloseIOhandler(PrevIO)) + UsedSpace = 0; // As a error marker + + _cmsUnlockMutex(Icc->ContextID, Icc->UsrMutex); + + return UsedSpace; + + +Error: + cmsCloseIOhandler(PrevIO); + memmove(Icc, &Keep, sizeof(_cmsICCPROFILE)); + _cmsUnlockMutex(Icc->ContextID, Icc->UsrMutex); + + return 0; +} + +// Low-level save to disk. +cmsBool CMSEXPORT cmsSaveProfileToFile(cmsHPROFILE hProfile, const char* FileName) +{ + cmsContext ContextID = cmsGetProfileContextID(hProfile); + cmsIOHANDLER* io = cmsOpenIOhandlerFromFile(ContextID, FileName, "w"); + cmsBool rc; + + if (io == NULL) return FALSE; + + rc = (cmsSaveProfileToIOhandler(hProfile, io) != 0); + rc &= cmsCloseIOhandler(io); + + if (rc == FALSE) { // remove() is C99 per 7.19.4.1 + remove(FileName); // We have to IGNORE return value in this case + } + return rc; +} + +// Same as anterior, but for streams +cmsBool CMSEXPORT cmsSaveProfileToStream(cmsHPROFILE hProfile, FILE* Stream) +{ + cmsBool rc; + cmsContext ContextID = cmsGetProfileContextID(hProfile); + cmsIOHANDLER* io = cmsOpenIOhandlerFromStream(ContextID, Stream); + + if (io == NULL) return FALSE; + + rc = (cmsSaveProfileToIOhandler(hProfile, io) != 0); + rc &= cmsCloseIOhandler(io); + + return rc; +} + + +// Same as anterior, but for memory blocks. In this case, a NULL as MemPtr means calculate needed space only +cmsBool CMSEXPORT cmsSaveProfileToMem(cmsHPROFILE hProfile, void *MemPtr, cmsUInt32Number* BytesNeeded) +{ + cmsBool rc; + cmsIOHANDLER* io; + cmsContext ContextID = cmsGetProfileContextID(hProfile); + + _cmsAssert(BytesNeeded != NULL); + + // Should we just calculate the needed space? + if (MemPtr == NULL) { + + *BytesNeeded = cmsSaveProfileToIOhandler(hProfile, NULL); + return (*BytesNeeded == 0) ? FALSE : TRUE; + } + + // That is a real write operation + io = cmsOpenIOhandlerFromMem(ContextID, MemPtr, *BytesNeeded, "w"); + if (io == NULL) return FALSE; + + rc = (cmsSaveProfileToIOhandler(hProfile, io) != 0); + rc &= cmsCloseIOhandler(io); + + return rc; +} + +// Free one tag contents +static +void freeOneTag(_cmsICCPROFILE* Icc, cmsUInt32Number i) +{ + if (Icc->TagPtrs[i]) { + + cmsTagTypeHandler* TypeHandler = Icc->TagTypeHandlers[i]; + + if (TypeHandler != NULL) { + cmsTagTypeHandler LocalTypeHandler = *TypeHandler; + + LocalTypeHandler.ContextID = Icc->ContextID; + LocalTypeHandler.ICCVersion = Icc->Version; + LocalTypeHandler.FreePtr(&LocalTypeHandler, Icc->TagPtrs[i]); + } + else + _cmsFree(Icc->ContextID, Icc->TagPtrs[i]); + } + + Icc->TagPtrs[i] = NULL; +} + +// Closes a profile freeing any involved resources +cmsBool CMSEXPORT cmsCloseProfile(cmsHPROFILE hProfile) +{ + _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; + cmsBool rc = TRUE; + cmsUInt32Number i; + + if (!Icc) return FALSE; + + // Was open in write mode? + if (Icc ->IsWrite) { + + Icc ->IsWrite = FALSE; // Assure no further writing + rc &= cmsSaveProfileToFile(hProfile, Icc ->IOhandler->PhysicalFile); + } + + for (i=0; i < Icc -> TagCount; i++) { + + freeOneTag(Icc, i); + } + + if (Icc ->IOhandler != NULL) { + rc &= cmsCloseIOhandler(Icc->IOhandler); + } + + _cmsDestroyMutex(Icc->ContextID, Icc->UsrMutex); + + _cmsFree(Icc ->ContextID, Icc); // Free placeholder memory + + return rc; +} + + +// ------------------------------------------------------------------------------------------------------------------- + + +// Returns TRUE if a given tag is supported by a plug-in +static +cmsBool IsTypeSupported(cmsTagDescriptor* TagDescriptor, cmsTagTypeSignature Type) +{ + cmsUInt32Number i, nMaxTypes; + + nMaxTypes = TagDescriptor->nSupportedTypes; + if (nMaxTypes >= MAX_TYPES_IN_LCMS_PLUGIN) + nMaxTypes = MAX_TYPES_IN_LCMS_PLUGIN; + + for (i=0; i < nMaxTypes; i++) { + if (Type == TagDescriptor ->SupportedTypes[i]) return TRUE; + } + + return FALSE; +} + +// That's the main read function +void* CMSEXPORT cmsReadTag(cmsHPROFILE hProfile, cmsTagSignature sig) +{ + _cmsICCPROFILE* Icc = (_cmsICCPROFILE*)hProfile; + cmsBool avoidCheck; + cmsIOHANDLER* io; + cmsTagTypeHandler* TypeHandler; + cmsTagTypeHandler LocalTypeHandler; + cmsTagDescriptor* TagDescriptor = NULL; + cmsTagTypeSignature BaseType; + cmsUInt32Number Offset, TagSize; + cmsUInt32Number ElemCount; + int n; + + if (!_cmsLockMutex(Icc->ContextID, Icc->UsrMutex)) return NULL; + + avoidCheck = _cmsAvoidTypeCheckOnTags(Icc->ContextID); + + n = _cmsSearchTag(Icc, sig, TRUE); + if (n < 0) + { + // Not found, return NULL + _cmsUnlockMutex(Icc->ContextID, Icc->UsrMutex); + return NULL; + } + + // If the element is already in memory, return the pointer + if (Icc->TagPtrs[n]) { + + if (Icc->TagTypeHandlers[n] == NULL) goto Error; + + // Sanity check + BaseType = Icc->TagTypeHandlers[n]->Signature; + if (BaseType == 0) goto Error; + + if (!avoidCheck) { + + TagDescriptor = _cmsGetTagDescriptor(Icc->ContextID, sig); + if (TagDescriptor == NULL) goto Error; + if (!IsTypeSupported(TagDescriptor, BaseType)) goto Error; + } + + if (Icc->TagSaveAsRaw[n]) goto Error; // We don't support read raw tags as cooked + + _cmsUnlockMutex(Icc->ContextID, Icc->UsrMutex); + return Icc->TagPtrs[n]; + } + + // We need to read it. Get the offset and size to the file + Offset = Icc->TagOffsets[n]; + TagSize = Icc->TagSizes[n]; + + if (TagSize < 8) goto Error; + + io = Icc->IOhandler; + + if (io == NULL) { // This is a built-in profile that has been manipulated, abort early + + cmsSignalError(Icc->ContextID, cmsERROR_CORRUPTION_DETECTED, "Corrupted built-in profile."); + goto Error; + } + + // Seek to its location + if (!io->Seek(io, Offset)) + goto Error; + + if (!avoidCheck) { + // Search for support on this tag + TagDescriptor = _cmsGetTagDescriptor(Icc->ContextID, sig); + if (TagDescriptor == NULL) { + + char String[5]; + + _cmsTagSignature2String(String, sig); + + // An unknown element was found. + cmsSignalError(Icc->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unknown tag type '%s' found.", String); + goto Error; // Unsupported. + } + } + + // if supported, get type and check if in list + BaseType = _cmsReadTypeBase(io); + if (BaseType == 0) goto Error; + + if (!avoidCheck) { + if (!IsTypeSupported(TagDescriptor, BaseType)) goto Error; + } + + TagSize -= 8; // Already read by the type base logic + + // Get type handler + TypeHandler = _cmsGetTagTypeHandler(Icc->ContextID, BaseType); + if (TypeHandler == NULL) goto Error; + LocalTypeHandler = *TypeHandler; + + + // Read the tag + Icc->TagTypeHandlers[n] = TypeHandler; + + LocalTypeHandler.ContextID = Icc->ContextID; + LocalTypeHandler.ICCVersion = Icc->Version; + Icc->TagPtrs[n] = LocalTypeHandler.ReadPtr(&LocalTypeHandler, io, &ElemCount, TagSize); + + // The tag type is supported, but something wrong happened and we cannot read the tag. + // let know the user about this (although it is just a warning) + if (Icc->TagPtrs[n] == NULL) { + + char String[5]; + + _cmsTagSignature2String(String, sig); + cmsSignalError(Icc->ContextID, cmsERROR_CORRUPTION_DETECTED, "Corrupted tag '%s'", String); + goto Error; + } + + if (!avoidCheck) { + // This is a weird error that may be a symptom of something more serious, the number of + // stored item is actually less than the number of required elements. + if (ElemCount < TagDescriptor->ElemCount) { + + char String[5]; + + _cmsTagSignature2String(String, sig); + cmsSignalError(Icc->ContextID, cmsERROR_CORRUPTION_DETECTED, "'%s' Inconsistent number of items: expected %d, got %d", + String, TagDescriptor->ElemCount, ElemCount); + goto Error; + } + } + + // Return the data + _cmsUnlockMutex(Icc->ContextID, Icc->UsrMutex); + return Icc->TagPtrs[n]; + + + // Return error and unlock the data +Error: + + freeOneTag(Icc, n); + Icc->TagPtrs[n] = NULL; + + _cmsUnlockMutex(Icc->ContextID, Icc->UsrMutex); + return NULL; +} + + +// Get true type of data +cmsTagTypeSignature _cmsGetTagTrueType(cmsHPROFILE hProfile, cmsTagSignature sig) +{ + _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; + cmsTagTypeHandler* TypeHandler; + int n; + + // Search for given tag in ICC profile directory + n = _cmsSearchTag(Icc, sig, TRUE); + if (n < 0) return (cmsTagTypeSignature) 0; // Not found, return NULL + + // Get the handler. The true type is there + TypeHandler = Icc -> TagTypeHandlers[n]; + if (TypeHandler == NULL) return (cmsTagTypeSignature) 0; + + return TypeHandler ->Signature; +} + + +// Write a single tag. This just keeps track of the tak into a list of "to be written". If the tag is already +// in that list, the previous version is deleted. +cmsBool CMSEXPORT cmsWriteTag(cmsHPROFILE hProfile, cmsTagSignature sig, const void* data) +{ + _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; + cmsTagTypeHandler* TypeHandler = NULL; + cmsTagTypeHandler LocalTypeHandler; + cmsTagDescriptor* TagDescriptor = NULL; + cmsTagTypeSignature Type; + int i; + cmsFloat64Number Version; + char TypeString[5], SigString[5]; + + if (!_cmsLockMutex(Icc->ContextID, Icc ->UsrMutex)) return FALSE; + + // To delete tags. + if (data == NULL) { + + // Delete the tag + i = _cmsSearchTag(Icc, sig, FALSE); + if (i >= 0) { + + // Use zero as a mark of deleted + _cmsDeleteTagByPos(Icc, i); + Icc ->TagNames[i] = (cmsTagSignature) 0; + _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex); + return TRUE; + } + // Didn't find the tag + goto Error; + } + + if (!_cmsNewTag(Icc, sig, &i)) goto Error; + + // This cannot be RAW + if (Icc->TagSaveAsRaw[i]) { + cmsSignalError(Icc->ContextID, cmsERROR_ALREADY_DEFINED, "Tag '%x' was already saved as RAW", sig); + goto Error; + } + + // This is not a link + Icc ->TagLinked[i] = (cmsTagSignature) 0; + + // Get information about the TAG. + TagDescriptor = _cmsGetTagDescriptor(Icc-> ContextID, sig); + if (TagDescriptor == NULL){ + cmsSignalError(Icc ->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported tag '%x'", sig); + goto Error; + } + + + // Now we need to know which type to use. It depends on the version. + Version = cmsGetProfileVersion(hProfile); + + if (TagDescriptor ->DecideType != NULL) { + + // Let the tag descriptor to decide the type base on depending on + // the data. This is useful for example on parametric curves, where + // curves specified by a table cannot be saved as parametric and needs + // to be casted to single v2-curves, even on v4 profiles. + + Type = TagDescriptor ->DecideType(Version, data); + } + else { + + Type = TagDescriptor ->SupportedTypes[0]; + } + + // Does the tag support this type? + if (!IsTypeSupported(TagDescriptor, Type)) { + + _cmsTagSignature2String(TypeString, (cmsTagSignature) Type); + _cmsTagSignature2String(SigString, sig); + + cmsSignalError(Icc ->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported type '%s' for tag '%s'", TypeString, SigString); + goto Error; + } + + // Does we have a handler for this type? + TypeHandler = _cmsGetTagTypeHandler(Icc->ContextID, Type); + if (TypeHandler == NULL) { + + _cmsTagSignature2String(TypeString, (cmsTagSignature) Type); + _cmsTagSignature2String(SigString, sig); + + cmsSignalError(Icc ->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported type '%s' for tag '%s'", TypeString, SigString); + goto Error; // Should never happen + } + + + // Fill fields on icc structure + Icc ->TagTypeHandlers[i] = TypeHandler; + Icc ->TagNames[i] = sig; + Icc ->TagSizes[i] = 0; + Icc ->TagOffsets[i] = 0; + + LocalTypeHandler = *TypeHandler; + LocalTypeHandler.ContextID = Icc ->ContextID; + LocalTypeHandler.ICCVersion = Icc ->Version; + Icc ->TagPtrs[i] = LocalTypeHandler.DupPtr(&LocalTypeHandler, data, TagDescriptor ->ElemCount); + + if (Icc ->TagPtrs[i] == NULL) { + + _cmsTagSignature2String(TypeString, (cmsTagSignature) Type); + _cmsTagSignature2String(SigString, sig); + cmsSignalError(Icc ->ContextID, cmsERROR_CORRUPTION_DETECTED, "Malformed struct in type '%s' for tag '%s'", TypeString, SigString); + + goto Error; + } + + _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex); + return TRUE; + +Error: + _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex); + return FALSE; + +} + +// Read and write raw data. Read/Write Raw/cooked pairs try to maintain consistency within the pair. Some sequences +// raw/cooked would work, but at a cost. Data "cooked" may be converted to "raw" by using the "write" serialization logic. +// In general it is better to avoid mixing pairs. + +cmsUInt32Number CMSEXPORT cmsReadRawTag(cmsHPROFILE hProfile, cmsTagSignature sig, void* data, cmsUInt32Number BufferSize) +{ + _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; + void *Object; + int i; + cmsIOHANDLER* MemIO; + cmsTagTypeHandler* TypeHandler = NULL; + cmsTagTypeHandler LocalTypeHandler; + cmsTagDescriptor* TagDescriptor = NULL; + cmsUInt32Number rc; + cmsUInt32Number Offset, TagSize; + + // Sanity check + if (data != NULL && BufferSize == 0) return 0; + + if (!_cmsLockMutex(Icc->ContextID, Icc ->UsrMutex)) return 0; + + // Search for given tag in ICC profile directory + + i = _cmsSearchTag(Icc, sig, TRUE); + if (i < 0) goto Error; // Not found, + + // It is already read? + if (Icc -> TagPtrs[i] == NULL) { + + // Not yet, get original position + Offset = Icc ->TagOffsets[i]; + TagSize = Icc ->TagSizes[i]; + + // read the data directly, don't keep copy + + if (data != NULL) { + + if (BufferSize < TagSize) + TagSize = BufferSize; + + if (!Icc ->IOhandler ->Seek(Icc ->IOhandler, Offset)) goto Error; + if (!Icc ->IOhandler ->Read(Icc ->IOhandler, data, 1, TagSize)) goto Error; + + _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex); + return TagSize; + } + + _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex); + return Icc ->TagSizes[i]; + } + + // The data has been already read, or written. But wait!, maybe the user choose to save as + // raw data. In this case, return the raw data directly + + if (Icc ->TagSaveAsRaw[i]) { + + if (data != NULL) { + + TagSize = Icc ->TagSizes[i]; + if (BufferSize < TagSize) + TagSize = BufferSize; + + memmove(data, Icc ->TagPtrs[i], TagSize); + + _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex); + return TagSize; + } + + _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex); + return Icc ->TagSizes[i]; + } + + // Already read, or previously set by cmsWriteTag(). We need to serialize that + // data to raw to get something that makes sense + + _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex); + Object = cmsReadTag(hProfile, sig); + if (!_cmsLockMutex(Icc->ContextID, Icc ->UsrMutex)) return 0; + + if (Object == NULL) goto Error; + + // Now we need to serialize to a memory block: just use a memory iohandler + + if (data == NULL) { + MemIO = cmsOpenIOhandlerFromNULL(cmsGetProfileContextID(hProfile)); + } else{ + MemIO = cmsOpenIOhandlerFromMem(cmsGetProfileContextID(hProfile), data, BufferSize, "w"); + } + if (MemIO == NULL) goto Error; + + // Obtain type handling for the tag + TypeHandler = Icc ->TagTypeHandlers[i]; + TagDescriptor = _cmsGetTagDescriptor(Icc-> ContextID, sig); + if (TagDescriptor == NULL) { + cmsCloseIOhandler(MemIO); + goto Error; + } + + if (TypeHandler == NULL) goto Error; + + // Serialize + LocalTypeHandler = *TypeHandler; + LocalTypeHandler.ContextID = Icc ->ContextID; + LocalTypeHandler.ICCVersion = Icc ->Version; + + if (!_cmsWriteTypeBase(MemIO, TypeHandler ->Signature)) { + cmsCloseIOhandler(MemIO); + goto Error; + } + + if (!LocalTypeHandler.WritePtr(&LocalTypeHandler, MemIO, Object, TagDescriptor ->ElemCount)) { + cmsCloseIOhandler(MemIO); + goto Error; + } + + // Get Size and close + rc = MemIO ->Tell(MemIO); + cmsCloseIOhandler(MemIO); // Ignore return code this time + + _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex); + return rc; + +Error: + _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex); + return 0; +} + +// Similar to the anterior. This function allows to write directly to the ICC profile any data, without +// checking anything. As a rule, mixing Raw with cooked doesn't work, so writing a tag as raw and then reading +// it as cooked without serializing does result into an error. If that is what you want, you will need to dump +// the profile to memry or disk and then reopen it. +cmsBool CMSEXPORT cmsWriteRawTag(cmsHPROFILE hProfile, cmsTagSignature sig, const void* data, cmsUInt32Number Size) +{ + _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; + int i; + + if (!_cmsLockMutex(Icc->ContextID, Icc ->UsrMutex)) return 0; + + if (!_cmsNewTag(Icc, sig, &i)) { + _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex); + return FALSE; + } + + // Mark the tag as being written as RAW + Icc ->TagSaveAsRaw[i] = TRUE; + Icc ->TagNames[i] = sig; + Icc ->TagLinked[i] = (cmsTagSignature) 0; + + // Keep a copy of the block + Icc ->TagPtrs[i] = _cmsDupMem(Icc ->ContextID, data, Size); + Icc ->TagSizes[i] = Size; + + _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex); + + if (Icc->TagPtrs[i] == NULL) { + Icc->TagNames[i] = (cmsTagSignature) 0; + return FALSE; + } + return TRUE; +} + +// Using this function you can collapse several tag entries to the same block in the profile +cmsBool CMSEXPORT cmsLinkTag(cmsHPROFILE hProfile, cmsTagSignature sig, cmsTagSignature dest) +{ + _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; + int i; + + if (!_cmsLockMutex(Icc->ContextID, Icc ->UsrMutex)) return FALSE; + + if (!_cmsNewTag(Icc, sig, &i)) { + _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex); + return FALSE; + } + + // Keep necessary information + Icc ->TagSaveAsRaw[i] = FALSE; + Icc ->TagNames[i] = sig; + Icc ->TagLinked[i] = dest; + + Icc ->TagPtrs[i] = NULL; + Icc ->TagSizes[i] = 0; + Icc ->TagOffsets[i] = 0; + + _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex); + return TRUE; +} + +// Returns the tag linked to sig, in the case two tags are sharing same resource +cmsTagSignature CMSEXPORT cmsTagLinkedTo(cmsHPROFILE hProfile, cmsTagSignature sig) +{ + _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; + int i; + + // Search for given tag in ICC profile directory + i = _cmsSearchTag(Icc, sig, FALSE); + if (i < 0) return (cmsTagSignature) 0; // Not found, return 0 + + return Icc -> TagLinked[i]; +} diff --git a/local/recipes/libs/lcms2/source/src/cmsio1.c b/local/recipes/libs/lcms2/source/src/cmsio1.c new file mode 100644 index 0000000000..09898262b9 --- /dev/null +++ b/local/recipes/libs/lcms2/source/src/cmsio1.c @@ -0,0 +1,1045 @@ +//--------------------------------------------------------------------------------- +// +// Little Color Management System +// Copyright (c) 1998-2026 Marti Maria Saguer +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//--------------------------------------------------------------------------------- +// + +#include "lcms2_internal.h" + +// Read tags using low-level functions, provides necessary glue code to adapt versions, etc. + +// LUT tags +static const cmsTagSignature Device2PCS16[] = {cmsSigAToB0Tag, // Perceptual + cmsSigAToB1Tag, // Relative colorimetric + cmsSigAToB2Tag, // Saturation + cmsSigAToB1Tag }; // Absolute colorimetric + +static const cmsTagSignature Device2PCSFloat[] = {cmsSigDToB0Tag, // Perceptual + cmsSigDToB1Tag, // Relative colorimetric + cmsSigDToB2Tag, // Saturation + cmsSigDToB3Tag }; // Absolute colorimetric + +static const cmsTagSignature PCS2Device16[] = {cmsSigBToA0Tag, // Perceptual + cmsSigBToA1Tag, // Relative colorimetric + cmsSigBToA2Tag, // Saturation + cmsSigBToA1Tag }; // Absolute colorimetric + +static const cmsTagSignature PCS2DeviceFloat[] = {cmsSigBToD0Tag, // Perceptual + cmsSigBToD1Tag, // Relative colorimetric + cmsSigBToD2Tag, // Saturation + cmsSigBToD3Tag }; // Absolute colorimetric + + +// Factors to convert from 1.15 fixed point to 0..1.0 range and vice-versa +#define InpAdj (1.0/MAX_ENCODEABLE_XYZ) // (65536.0/(65535.0*2.0)) +#define OutpAdj (MAX_ENCODEABLE_XYZ) // ((2.0*65535.0)/65536.0) + +// Several resources for gray conversions. +static const cmsFloat64Number GrayInputMatrix[] = { (InpAdj*cmsD50X), (InpAdj*cmsD50Y), (InpAdj*cmsD50Z) }; +static const cmsFloat64Number OneToThreeInputMatrix[] = { 1, 1, 1 }; +static const cmsFloat64Number PickYMatrix[] = { 0, (OutpAdj*cmsD50Y), 0 }; +static const cmsFloat64Number PickLstarMatrix[] = { 1, 0, 0 }; + +// Get a media white point fixing some issues found in certain old profiles +cmsBool _cmsReadMediaWhitePoint(cmsCIEXYZ* Dest, cmsHPROFILE hProfile) +{ + cmsCIEXYZ* Tag; + + _cmsAssert(Dest != NULL); + + Tag = (cmsCIEXYZ*) cmsReadTag(hProfile, cmsSigMediaWhitePointTag); + + // If no wp, take D50 + if (Tag == NULL) { + *Dest = *cmsD50_XYZ(); + return TRUE; + } + + // V2 display profiles should give D50 + if (cmsGetEncodedICCversion(hProfile) < 0x4000000) { + + if (cmsGetDeviceClass(hProfile) == cmsSigDisplayClass) { + *Dest = *cmsD50_XYZ(); + return TRUE; + } + } + + // All seems ok + *Dest = *Tag; + return TRUE; +} + + +// Chromatic adaptation matrix. Fix some issues as well +cmsBool _cmsReadCHAD(cmsMAT3* Dest, cmsHPROFILE hProfile) +{ + cmsMAT3* Tag; + + _cmsAssert(Dest != NULL); + + Tag = (cmsMAT3*) cmsReadTag(hProfile, cmsSigChromaticAdaptationTag); + + if (Tag != NULL) { + *Dest = *Tag; + return TRUE; + } + + // No CHAD available, default it to identity + _cmsMAT3identity(Dest); + + // V2 display profiles should give D50 + if (cmsGetEncodedICCversion(hProfile) < 0x4000000) { + + if (cmsGetDeviceClass(hProfile) == cmsSigDisplayClass) { + + cmsCIEXYZ* White = (cmsCIEXYZ*) cmsReadTag(hProfile, cmsSigMediaWhitePointTag); + + if (White == NULL) { + + _cmsMAT3identity(Dest); + return TRUE; + } + + return _cmsAdaptationMatrix(Dest, NULL, White, cmsD50_XYZ()); + } + } + + return TRUE; +} + + +// Auxiliary, read colorants as a MAT3 structure. Used by any function that needs a matrix-shaper +static +cmsBool ReadICCMatrixRGB2XYZ(cmsMAT3* r, cmsHPROFILE hProfile) +{ + cmsCIEXYZ *PtrRed, *PtrGreen, *PtrBlue; + + _cmsAssert(r != NULL); + + PtrRed = (cmsCIEXYZ *) cmsReadTag(hProfile, cmsSigRedColorantTag); + PtrGreen = (cmsCIEXYZ *) cmsReadTag(hProfile, cmsSigGreenColorantTag); + PtrBlue = (cmsCIEXYZ *) cmsReadTag(hProfile, cmsSigBlueColorantTag); + + if (PtrRed == NULL || PtrGreen == NULL || PtrBlue == NULL) + return FALSE; + + _cmsVEC3init(&r -> v[0], PtrRed -> X, PtrGreen -> X, PtrBlue -> X); + _cmsVEC3init(&r -> v[1], PtrRed -> Y, PtrGreen -> Y, PtrBlue -> Y); + _cmsVEC3init(&r -> v[2], PtrRed -> Z, PtrGreen -> Z, PtrBlue -> Z); + + return TRUE; +} + + +// Gray input pipeline +static +cmsPipeline* BuildGrayInputMatrixPipeline(cmsHPROFILE hProfile) +{ + cmsToneCurve *GrayTRC; + cmsPipeline* Lut; + cmsContext ContextID = cmsGetProfileContextID(hProfile); + + GrayTRC = (cmsToneCurve *) cmsReadTag(hProfile, cmsSigGrayTRCTag); + if (GrayTRC == NULL) return NULL; + + Lut = cmsPipelineAlloc(ContextID, 1, 3); + if (Lut == NULL) + goto Error; + + if (cmsGetPCS(hProfile) == cmsSigLabData) { + + // In this case we implement the profile as an identity matrix plus 3 tone curves + cmsUInt16Number Zero[2] = { 0x8080, 0x8080 }; + cmsToneCurve* EmptyTab; + cmsToneCurve* LabCurves[3]; + + EmptyTab = cmsBuildTabulatedToneCurve16(ContextID, 2, Zero); + + if (EmptyTab == NULL) + goto Error; + + LabCurves[0] = GrayTRC; + LabCurves[1] = EmptyTab; + LabCurves[2] = EmptyTab; + + if (!cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 3, 1, OneToThreeInputMatrix, NULL)) || + !cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, 3, LabCurves))) { + cmsFreeToneCurve(EmptyTab); + goto Error; + } + + cmsFreeToneCurve(EmptyTab); + + } + else { + + if (!cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, 1, &GrayTRC)) || + !cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 3, 1, GrayInputMatrix, NULL))) + goto Error; + } + + return Lut; + +Error: + cmsPipelineFree(Lut); + return NULL; +} + +// RGB Matrix shaper +static +cmsPipeline* BuildRGBInputMatrixShaper(cmsHPROFILE hProfile) +{ + cmsPipeline* Lut; + cmsMAT3 Mat; + cmsToneCurve *Shapes[3]; + cmsContext ContextID = cmsGetProfileContextID(hProfile); + int i, j; + + if (!ReadICCMatrixRGB2XYZ(&Mat, hProfile)) return NULL; + + // XYZ PCS in encoded in 1.15 format, and the matrix output comes in 0..0xffff range, so + // we need to adjust the output by a factor of (0x10000/0xffff) to put data in + // a 1.16 range, and then a >> 1 to obtain 1.15. The total factor is (65536.0)/(65535.0*2) + + for (i=0; i < 3; i++) + for (j=0; j < 3; j++) + Mat.v[i].n[j] *= InpAdj; + + + Shapes[0] = (cmsToneCurve *) cmsReadTag(hProfile, cmsSigRedTRCTag); + Shapes[1] = (cmsToneCurve *) cmsReadTag(hProfile, cmsSigGreenTRCTag); + Shapes[2] = (cmsToneCurve *) cmsReadTag(hProfile, cmsSigBlueTRCTag); + + if (!Shapes[0] || !Shapes[1] || !Shapes[2]) + return NULL; + + Lut = cmsPipelineAlloc(ContextID, 3, 3); + if (Lut != NULL) { + + if (!cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, 3, Shapes)) || + !cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 3, 3, (cmsFloat64Number*) &Mat, NULL))) + goto Error; + + // Note that it is certainly possible a single profile would have a LUT based + // tag for output working in lab and a matrix-shaper for the fallback cases. + // This is not allowed by the spec, but this code is tolerant to those cases + if (cmsGetPCS(hProfile) == cmsSigLabData) { + + if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocXYZ2Lab(ContextID))) + goto Error; + } + + } + + return Lut; + +Error: + cmsPipelineFree(Lut); + return NULL; +} + + + +// Read the DToAX tag, adjusting the encoding of Lab or XYZ if needed +static +cmsPipeline* _cmsReadFloatInputTag(cmsHPROFILE hProfile, cmsTagSignature tagFloat) +{ + cmsContext ContextID = cmsGetProfileContextID(hProfile); + cmsPipeline* Lut = cmsPipelineDup((cmsPipeline*) cmsReadTag(hProfile, tagFloat)); + cmsColorSpaceSignature spc = cmsGetColorSpace(hProfile); + cmsColorSpaceSignature PCS = cmsGetPCS(hProfile); + + if (Lut == NULL) return NULL; + + // input and output of transform are in lcms 0..1 encoding. If XYZ or Lab spaces are used, + // these need to be normalized into the appropriate ranges (Lab = 100,0,0, XYZ=1.0,1.0,1.0) + if ( spc == cmsSigLabData) + { + if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToLabFloat(ContextID))) + goto Error; + } + else if (spc == cmsSigXYZData) + { + if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToXyzFloat(ContextID))) + goto Error; + } + + if ( PCS == cmsSigLabData) + { + if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromLabFloat(ContextID))) + goto Error; + } + else if( PCS == cmsSigXYZData) + { + if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromXyzFloat(ContextID))) + goto Error; + } + + return Lut; + +Error: + cmsPipelineFree(Lut); + return NULL; +} + + +// Read and create a BRAND NEW MPE LUT from a given profile. All stuff dependent of version, etc +// is adjusted here in order to create a LUT that takes care of all those details. +// We add intent = 0xffffffff as a way to read matrix shaper always, no matter of other LUT +cmsPipeline* CMSEXPORT _cmsReadInputLUT(cmsHPROFILE hProfile, cmsUInt32Number Intent) +{ + cmsTagTypeSignature OriginalType; + cmsTagSignature tag16; + cmsTagSignature tagFloat; + cmsContext ContextID = cmsGetProfileContextID(hProfile); + + // On named color, take the appropriate tag + if (cmsGetDeviceClass(hProfile) == cmsSigNamedColorClass) { + + cmsPipeline* Lut; + cmsNAMEDCOLORLIST* nc = (cmsNAMEDCOLORLIST*) cmsReadTag(hProfile, cmsSigNamedColor2Tag); + + if (nc == NULL) return NULL; + + Lut = cmsPipelineAlloc(ContextID, 0, 0); + if (Lut == NULL) + return NULL; + + if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocNamedColor(nc, TRUE)) || + !cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLabV2ToV4(ContextID))) { + cmsPipelineFree(Lut); + return NULL; + } + return Lut; + } + + // This is an attempt to reuse this function to retrieve the matrix-shaper as pipeline no + // matter other LUT are present and have precedence. Intent = 0xffffffff can be used for that. + if (Intent <= INTENT_ABSOLUTE_COLORIMETRIC) { + + tag16 = Device2PCS16[Intent]; + tagFloat = Device2PCSFloat[Intent]; + + if (cmsIsTag(hProfile, tagFloat)) { // Float tag takes precedence + + // Floating point LUT are always V4, but the encoding range is no + // longer 0..1.0, so we need to add an stage depending on the color space + return _cmsReadFloatInputTag(hProfile, tagFloat); + } + + // Revert to perceptual if no tag is found + if (!cmsIsTag(hProfile, tag16)) { + tag16 = Device2PCS16[0]; + } + + if (cmsIsTag(hProfile, tag16)) { // Is there any LUT-Based table? + + // Check profile version and LUT type. Do the necessary adjustments if needed + + // First read the tag + cmsPipeline* Lut = (cmsPipeline*) cmsReadTag(hProfile, tag16); + if (Lut == NULL) return NULL; + + // After reading it, we have now info about the original type + OriginalType = _cmsGetTagTrueType(hProfile, tag16); + + // The profile owns the Lut, so we need to copy it + Lut = cmsPipelineDup(Lut); + + // We need to adjust data only for Lab16 on output + if (OriginalType != cmsSigLut16Type || cmsGetPCS(hProfile) != cmsSigLabData) + return Lut; + + // If the input is Lab, add also a conversion at the begin + if (cmsGetColorSpace(hProfile) == cmsSigLabData && + !cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocLabV4ToV2(ContextID))) + goto Error; + + // Add a matrix for conversion V2 to V4 Lab PCS + if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLabV2ToV4(ContextID))) + goto Error; + + return Lut; +Error: + cmsPipelineFree(Lut); + return NULL; + } + } + + // Lut was not found, try to create a matrix-shaper + + // Check if this is a grayscale profile. + if (cmsGetColorSpace(hProfile) == cmsSigGrayData) { + + // if so, build appropriate conversion tables. + // The tables are the PCS iluminant, scaled across GrayTRC + return BuildGrayInputMatrixPipeline(hProfile); + } + + // Not gray, create a normal matrix-shaper + return BuildRGBInputMatrixShaper(hProfile); +} + +// --------------------------------------------------------------------------------------------------------------- + +// Gray output pipeline. +// XYZ -> Gray or Lab -> Gray. Since we only know the GrayTRC, we need to do some assumptions. Gray component will be +// given by Y on XYZ PCS and by L* on Lab PCS, Both across inverse TRC curve. +// The complete pipeline on XYZ is Matrix[3:1] -> Tone curve and in Lab Matrix[3:1] -> Tone Curve as well. + +static +cmsPipeline* BuildGrayOutputPipeline(cmsHPROFILE hProfile) +{ + cmsToneCurve *GrayTRC, *RevGrayTRC; + cmsPipeline* Lut; + cmsContext ContextID = cmsGetProfileContextID(hProfile); + + GrayTRC = (cmsToneCurve *) cmsReadTag(hProfile, cmsSigGrayTRCTag); + if (GrayTRC == NULL) return NULL; + + RevGrayTRC = cmsReverseToneCurve(GrayTRC); + if (RevGrayTRC == NULL) return NULL; + + Lut = cmsPipelineAlloc(ContextID, 3, 1); + if (Lut == NULL) { + cmsFreeToneCurve(RevGrayTRC); + return NULL; + } + + if (cmsGetPCS(hProfile) == cmsSigLabData) { + + if (!cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 1, 3, PickLstarMatrix, NULL))) + goto Error; + } + else { + if (!cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 1, 3, PickYMatrix, NULL))) + goto Error; + } + + if (!cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, 1, &RevGrayTRC))) + goto Error; + + cmsFreeToneCurve(RevGrayTRC); + return Lut; + +Error: + cmsFreeToneCurve(RevGrayTRC); + cmsPipelineFree(Lut); + return NULL; +} + + +static +cmsPipeline* BuildRGBOutputMatrixShaper(cmsHPROFILE hProfile) +{ + cmsPipeline* Lut; + cmsToneCurve *Shapes[3], *InvShapes[3]; + cmsMAT3 Mat, Inv; + int i, j; + cmsContext ContextID = cmsGetProfileContextID(hProfile); + + if (!ReadICCMatrixRGB2XYZ(&Mat, hProfile)) + return NULL; + + if (!_cmsMAT3inverse(&Mat, &Inv)) + return NULL; + + // XYZ PCS in encoded in 1.15 format, and the matrix input should come in 0..0xffff range, so + // we need to adjust the input by a << 1 to obtain a 1.16 fixed and then by a factor of + // (0xffff/0x10000) to put data in 0..0xffff range. Total factor is (2.0*65535.0)/65536.0; + + for (i=0; i < 3; i++) + for (j=0; j < 3; j++) + Inv.v[i].n[j] *= OutpAdj; + + Shapes[0] = (cmsToneCurve *) cmsReadTag(hProfile, cmsSigRedTRCTag); + Shapes[1] = (cmsToneCurve *) cmsReadTag(hProfile, cmsSigGreenTRCTag); + Shapes[2] = (cmsToneCurve *) cmsReadTag(hProfile, cmsSigBlueTRCTag); + + if (!Shapes[0] || !Shapes[1] || !Shapes[2]) + return NULL; + + InvShapes[0] = cmsReverseToneCurve(Shapes[0]); + InvShapes[1] = cmsReverseToneCurve(Shapes[1]); + InvShapes[2] = cmsReverseToneCurve(Shapes[2]); + + if (!InvShapes[0] || !InvShapes[1] || !InvShapes[2]) { + return NULL; + } + + Lut = cmsPipelineAlloc(ContextID, 3, 3); + if (Lut != NULL) { + + // Note that it is certainly possible a single profile would have a LUT based + // tag for output working in lab and a matrix-shaper for the fallback cases. + // This is not allowed by the spec, but this code is tolerant to those cases + if (cmsGetPCS(hProfile) == cmsSigLabData) { + + if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLab2XYZ(ContextID))) + goto Error; + } + + if (!cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 3, 3, (cmsFloat64Number*) &Inv, NULL)) || + !cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, 3, InvShapes))) + goto Error; + } + + cmsFreeToneCurveTriple(InvShapes); + return Lut; +Error: + cmsFreeToneCurveTriple(InvShapes); + cmsPipelineFree(Lut); + return NULL; +} + + +// Change CLUT interpolation to trilinear +static +void ChangeInterpolationToTrilinear(cmsPipeline* Lut) +{ + cmsStage* Stage; + + for (Stage = cmsPipelineGetPtrToFirstStage(Lut); + Stage != NULL; + Stage = cmsStageNext(Stage)) { + + if (cmsStageType(Stage) == cmsSigCLutElemType) { + + _cmsStageCLutData* CLUT = (_cmsStageCLutData*) Stage ->Data; + + CLUT ->Params->dwFlags |= CMS_LERP_FLAGS_TRILINEAR; + _cmsSetInterpolationRoutine(Lut->ContextID, CLUT ->Params); + } + } +} + + +// Read the DToAX tag, adjusting the encoding of Lab or XYZ if needed +static +cmsPipeline* _cmsReadFloatOutputTag(cmsHPROFILE hProfile, cmsTagSignature tagFloat) +{ + cmsContext ContextID = cmsGetProfileContextID(hProfile); + cmsPipeline* Lut = cmsPipelineDup((cmsPipeline*) cmsReadTag(hProfile, tagFloat)); + cmsColorSpaceSignature PCS = cmsGetPCS(hProfile); + cmsColorSpaceSignature dataSpace = cmsGetColorSpace(hProfile); + + if (Lut == NULL) return NULL; + + // If PCS is Lab or XYZ, the floating point tag is accepting data in the space encoding, + // and since the formatter has already accommodated to 0..1.0, we should undo this change + if ( PCS == cmsSigLabData) + { + if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToLabFloat(ContextID))) + goto Error; + } + else + if (PCS == cmsSigXYZData) + { + if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToXyzFloat(ContextID))) + goto Error; + } + + // the output can be Lab or XYZ, in which case normalisation is needed on the end of the pipeline + if ( dataSpace == cmsSigLabData) + { + if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromLabFloat(ContextID))) + goto Error; + } + else if (dataSpace == cmsSigXYZData) + { + if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromXyzFloat(ContextID))) + goto Error; + } + + return Lut; + +Error: + cmsPipelineFree(Lut); + return NULL; +} + +// Create an output MPE LUT from a given profile. Version mismatches are handled here +cmsPipeline* CMSEXPORT _cmsReadOutputLUT(cmsHPROFILE hProfile, cmsUInt32Number Intent) +{ + cmsTagTypeSignature OriginalType; + cmsTagSignature tag16; + cmsTagSignature tagFloat; + cmsContext ContextID = cmsGetProfileContextID(hProfile); + + + if (Intent <= INTENT_ABSOLUTE_COLORIMETRIC) { + + tag16 = PCS2Device16[Intent]; + tagFloat = PCS2DeviceFloat[Intent]; + + if (cmsIsTag(hProfile, tagFloat)) { // Float tag takes precedence + + // Floating point LUT are always V4 + return _cmsReadFloatOutputTag(hProfile, tagFloat); + } + + // Revert to perceptual if no tag is found + if (!cmsIsTag(hProfile, tag16)) { + tag16 = PCS2Device16[0]; + } + + if (cmsIsTag(hProfile, tag16)) { // Is there any LUT-Based table? + + // Check profile version and LUT type. Do the necessary adjustments if needed + + // First read the tag + cmsPipeline* Lut = (cmsPipeline*) cmsReadTag(hProfile, tag16); + if (Lut == NULL) return NULL; + + // After reading it, we have info about the original type + OriginalType = _cmsGetTagTrueType(hProfile, tag16); + + // The profile owns the Lut, so we need to copy it + Lut = cmsPipelineDup(Lut); + if (Lut == NULL) return NULL; + + // Now it is time for a controversial stuff. I found that for 3D LUTS using + // Lab used as indexer space, trilinear interpolation should be used + if (cmsGetPCS(hProfile) == cmsSigLabData) + ChangeInterpolationToTrilinear(Lut); + + // We need to adjust data only for Lab and Lut16 type + if (OriginalType != cmsSigLut16Type || cmsGetPCS(hProfile) != cmsSigLabData) + return Lut; + + // Add a matrix for conversion V4 to V2 Lab PCS + if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocLabV4ToV2(ContextID))) + goto Error; + + // If the output is Lab, add also a conversion at the end + if (cmsGetColorSpace(hProfile) == cmsSigLabData) + if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLabV2ToV4(ContextID))) + goto Error; + + return Lut; +Error: + cmsPipelineFree(Lut); + return NULL; + } + } + + // Lut not found, try to create a matrix-shaper + + // Check if this is a grayscale profile. + if (cmsGetColorSpace(hProfile) == cmsSigGrayData) { + + // if so, build appropriate conversion tables. + // The tables are the PCS iluminant, scaled across GrayTRC + return BuildGrayOutputPipeline(hProfile); + } + + // Not gray, create a normal matrix-shaper, which only operates in XYZ space + return BuildRGBOutputMatrixShaper(hProfile); +} + +// --------------------------------------------------------------------------------------------------------------- + +// Read the AToD0 tag, adjusting the encoding of Lab or XYZ if needed +static +cmsPipeline* _cmsReadFloatDevicelinkTag(cmsHPROFILE hProfile, cmsTagSignature tagFloat) +{ + cmsContext ContextID = cmsGetProfileContextID(hProfile); + cmsPipeline* Lut = cmsPipelineDup((cmsPipeline*)cmsReadTag(hProfile, tagFloat)); + cmsColorSpaceSignature PCS = cmsGetPCS(hProfile); + cmsColorSpaceSignature spc = cmsGetColorSpace(hProfile); + + if (Lut == NULL) return NULL; + + if (spc == cmsSigLabData) + { + if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToLabFloat(ContextID))) + goto Error; + } + else + if (spc == cmsSigXYZData) + { + if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToXyzFloat(ContextID))) + goto Error; + } + + if (PCS == cmsSigLabData) + { + if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromLabFloat(ContextID))) + goto Error; + } + else + if (PCS == cmsSigXYZData) + { + if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromXyzFloat(ContextID))) + goto Error; + } + + return Lut; +Error: + cmsPipelineFree(Lut); + return NULL; +} + +// This one includes abstract profiles as well. Matrix-shaper cannot be obtained on that device class. The +// tag name here may default to AToB0 +cmsPipeline* CMSEXPORT _cmsReadDevicelinkLUT(cmsHPROFILE hProfile, cmsUInt32Number Intent) +{ + cmsPipeline* Lut; + cmsTagTypeSignature OriginalType; + cmsTagSignature tag16; + cmsTagSignature tagFloat; + cmsContext ContextID = cmsGetProfileContextID(hProfile); + + + if (Intent > INTENT_ABSOLUTE_COLORIMETRIC) + return NULL; + + tag16 = Device2PCS16[Intent]; + tagFloat = Device2PCSFloat[Intent]; + + // On named color, take the appropriate tag + if (cmsGetDeviceClass(hProfile) == cmsSigNamedColorClass) { + + cmsNAMEDCOLORLIST* nc = (cmsNAMEDCOLORLIST*)cmsReadTag(hProfile, cmsSigNamedColor2Tag); + + if (nc == NULL) return NULL; + + Lut = cmsPipelineAlloc(ContextID, 0, 0); + if (Lut == NULL) + goto Error; + + if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocNamedColor(nc, FALSE))) + goto Error; + + if (cmsGetColorSpace(hProfile) == cmsSigLabData) + if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLabV2ToV4(ContextID))) + goto Error; + + return Lut; + Error: + cmsPipelineFree(Lut); + return NULL; + } + + + if (cmsIsTag(hProfile, tagFloat)) { // Float tag takes precedence + + // Floating point LUT are always V + return _cmsReadFloatDevicelinkTag(hProfile, tagFloat); + } + + tagFloat = Device2PCSFloat[0]; + if (cmsIsTag(hProfile, tagFloat)) { + + return cmsPipelineDup((cmsPipeline*)cmsReadTag(hProfile, tagFloat)); + } + + if (!cmsIsTag(hProfile, tag16)) { // Is there any LUT-Based table? + + tag16 = Device2PCS16[0]; + if (!cmsIsTag(hProfile, tag16)) return NULL; + } + + // Check profile version and LUT type. Do the necessary adjustments if needed + + // Read the tag + Lut = (cmsPipeline*)cmsReadTag(hProfile, tag16); + if (Lut == NULL) return NULL; + + // The profile owns the Lut, so we need to copy it + Lut = cmsPipelineDup(Lut); + if (Lut == NULL) return NULL; + + // Now it is time for a controversial stuff. I found that for 3D LUTS using + // Lab used as indexer space, trilinear interpolation should be used + if (cmsGetPCS(hProfile) == cmsSigLabData) + ChangeInterpolationToTrilinear(Lut); + + // After reading it, we have info about the original type + OriginalType = _cmsGetTagTrueType(hProfile, tag16); + + // We need to adjust data for Lab16 on output + if (OriginalType != cmsSigLut16Type) return Lut; + + // Here it is possible to get Lab on both sides + + if (cmsGetColorSpace(hProfile) == cmsSigLabData) { + if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocLabV4ToV2(ContextID))) + goto Error2; + } + + if (cmsGetPCS(hProfile) == cmsSigLabData) { + if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLabV2ToV4(ContextID))) + goto Error2; + } + + return Lut; + +Error2: + cmsPipelineFree(Lut); + return NULL; +} + +// --------------------------------------------------------------------------------------------------------------- + +// Returns TRUE if the profile is implemented as matrix-shaper +cmsBool CMSEXPORT cmsIsMatrixShaper(cmsHPROFILE hProfile) +{ + switch (cmsGetColorSpace(hProfile)) { + + case cmsSigGrayData: + + return cmsIsTag(hProfile, cmsSigGrayTRCTag); + + case cmsSigRgbData: + + return (cmsIsTag(hProfile, cmsSigRedColorantTag) && + cmsIsTag(hProfile, cmsSigGreenColorantTag) && + cmsIsTag(hProfile, cmsSigBlueColorantTag) && + cmsIsTag(hProfile, cmsSigRedTRCTag) && + cmsIsTag(hProfile, cmsSigGreenTRCTag) && + cmsIsTag(hProfile, cmsSigBlueTRCTag)); + + default: + + return FALSE; + } +} + +// Returns TRUE if the intent is implemented as CLUT +cmsBool CMSEXPORT cmsIsCLUT(cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number UsedDirection) +{ + const cmsTagSignature* TagTable; + + // For devicelinks, the supported intent is that one stated in the header + if (cmsGetDeviceClass(hProfile) == cmsSigLinkClass) { + return (cmsGetHeaderRenderingIntent(hProfile) == Intent); + } + + switch (UsedDirection) { + + case LCMS_USED_AS_INPUT: TagTable = Device2PCS16; break; + case LCMS_USED_AS_OUTPUT:TagTable = PCS2Device16; break; + + // For proofing, we need rel. colorimetric in output. Let's do some recursion + case LCMS_USED_AS_PROOF: + return cmsIsIntentSupported(hProfile, Intent, LCMS_USED_AS_INPUT) && + cmsIsIntentSupported(hProfile, INTENT_RELATIVE_COLORIMETRIC, LCMS_USED_AS_OUTPUT); + + default: + cmsSignalError(cmsGetProfileContextID(hProfile), cmsERROR_RANGE, "Unexpected direction (%d)", UsedDirection); + return FALSE; + } + + // Extended intents are not strictly CLUT-based + if (Intent > INTENT_ABSOLUTE_COLORIMETRIC) + return FALSE; + + return cmsIsTag(hProfile, TagTable[Intent]); + +} + + +// Return info about supported intents +cmsBool CMSEXPORT cmsIsIntentSupported(cmsHPROFILE hProfile, + cmsUInt32Number Intent, cmsUInt32Number UsedDirection) +{ + + if (cmsIsCLUT(hProfile, Intent, UsedDirection)) return TRUE; + + // Is there any matrix-shaper? If so, the intent is supported. This is a bit odd, since V2 matrix shaper + // does not fully support relative colorimetric because they cannot deal with non-zero black points, but + // many profiles claims that, and this is certainly not true for V4 profiles. Lets answer "yes" no matter + // the accuracy would be less than optimal in rel.col and v2 case. + + return cmsIsMatrixShaper(hProfile); +} + + +// --------------------------------------------------------------------------------------------------------------- + +// Read both, profile sequence description and profile sequence id if present. Then combine both to +// create qa unique structure holding both. Shame on ICC to store things in such complicated way. +cmsSEQ* _cmsReadProfileSequence(cmsHPROFILE hProfile) +{ + cmsSEQ* ProfileSeq; + cmsSEQ* ProfileId; + cmsSEQ* NewSeq; + cmsUInt32Number i; + + // Take profile sequence description first + ProfileSeq = (cmsSEQ*) cmsReadTag(hProfile, cmsSigProfileSequenceDescTag); + + // Take profile sequence ID + ProfileId = (cmsSEQ*) cmsReadTag(hProfile, cmsSigProfileSequenceIdTag); + + if (ProfileSeq == NULL && ProfileId == NULL) return NULL; + + if (ProfileSeq == NULL) return cmsDupProfileSequenceDescription(ProfileId); + if (ProfileId == NULL) return cmsDupProfileSequenceDescription(ProfileSeq); + + // We have to mix both together. For that they must agree + if (ProfileSeq ->n != ProfileId ->n) return cmsDupProfileSequenceDescription(ProfileSeq); + + NewSeq = cmsDupProfileSequenceDescription(ProfileSeq); + + // Ok, proceed to the mixing + if (NewSeq != NULL) { + for (i=0; i < ProfileSeq ->n; i++) { + + memmove(&NewSeq ->seq[i].ProfileID, &ProfileId ->seq[i].ProfileID, sizeof(cmsProfileID)); + NewSeq ->seq[i].Description = cmsMLUdup(ProfileId ->seq[i].Description); + } + } + return NewSeq; +} + +// Dump the contents of profile sequence in both tags (if v4 available) +cmsBool _cmsWriteProfileSequence(cmsHPROFILE hProfile, const cmsSEQ* seq) +{ + if (!cmsWriteTag(hProfile, cmsSigProfileSequenceDescTag, seq)) return FALSE; + + if (cmsGetEncodedICCversion(hProfile) >= 0x4000000) { + + if (!cmsWriteTag(hProfile, cmsSigProfileSequenceIdTag, seq)) return FALSE; + } + + return TRUE; +} + + +// Auxiliary, read and duplicate a MLU if found. +static +cmsMLU* GetMLUFromProfile(cmsHPROFILE h, cmsTagSignature sig) +{ + cmsMLU* mlu = (cmsMLU*) cmsReadTag(h, sig); + if (mlu == NULL) return NULL; + + return cmsMLUdup(mlu); +} + +// Create a sequence description out of an array of profiles +cmsSEQ* _cmsCompileProfileSequence(cmsContext ContextID, cmsUInt32Number nProfiles, cmsHPROFILE hProfiles[]) +{ + cmsUInt32Number i; + cmsSEQ* seq = cmsAllocProfileSequenceDescription(ContextID, nProfiles); + + if (seq == NULL) return NULL; + + for (i=0; i < nProfiles; i++) { + + cmsPSEQDESC* ps = &seq ->seq[i]; + cmsHPROFILE h = hProfiles[i]; + cmsTechnologySignature* techpt; + + cmsGetHeaderAttributes(h, &ps ->attributes); + cmsGetHeaderProfileID(h, ps ->ProfileID.ID8); + ps ->deviceMfg = cmsGetHeaderManufacturer(h); + ps ->deviceModel = cmsGetHeaderModel(h); + + techpt = (cmsTechnologySignature*) cmsReadTag(h, cmsSigTechnologyTag); + if (techpt == NULL) + ps ->technology = (cmsTechnologySignature) 0; + else + ps ->technology = *techpt; + + ps ->Manufacturer = GetMLUFromProfile(h, cmsSigDeviceMfgDescTag); + ps ->Model = GetMLUFromProfile(h, cmsSigDeviceModelDescTag); + ps ->Description = GetMLUFromProfile(h, cmsSigProfileDescriptionTag); + + } + + return seq; +} + +// ------------------------------------------------------------------------------------------------------------------- + + +static +const cmsMLU* GetInfo(cmsHPROFILE hProfile, cmsInfoType Info) +{ + cmsTagSignature sig; + + switch (Info) { + + case cmsInfoDescription: + /** + * Add for MacOS, which uses propiertary tags for description + */ + if (cmsIsTag(hProfile, cmsSigProfileDescriptionMLTag)) + sig = cmsSigProfileDescriptionMLTag; + else + sig = cmsSigProfileDescriptionTag; + break; + + case cmsInfoManufacturer: + sig = cmsSigDeviceMfgDescTag; + break; + + case cmsInfoModel: + sig = cmsSigDeviceModelDescTag; + break; + + case cmsInfoCopyright: + sig = cmsSigCopyrightTag; + break; + + default: return NULL; + } + + + return (cmsMLU*) cmsReadTag(hProfile, sig); +} + + + +cmsUInt32Number CMSEXPORT cmsGetProfileInfo(cmsHPROFILE hProfile, cmsInfoType Info, + const char LanguageCode[3], const char CountryCode[3], + wchar_t* Buffer, cmsUInt32Number BufferSize) +{ + const cmsMLU* mlu = GetInfo(hProfile, Info); + if (mlu == NULL) return 0; + + return cmsMLUgetWide(mlu, LanguageCode, CountryCode, Buffer, BufferSize); +} + + +cmsUInt32Number CMSEXPORT cmsGetProfileInfoASCII(cmsHPROFILE hProfile, cmsInfoType Info, + const char LanguageCode[3], const char CountryCode[3], + char* Buffer, cmsUInt32Number BufferSize) +{ + const cmsMLU* mlu = GetInfo(hProfile, Info); + if (mlu == NULL) return 0; + + return cmsMLUgetASCII(mlu, LanguageCode, CountryCode, Buffer, BufferSize); +} + +cmsUInt32Number CMSEXPORT cmsGetProfileInfoUTF8(cmsHPROFILE hProfile, cmsInfoType Info, + const char LanguageCode[3], const char CountryCode[3], + char* Buffer, cmsUInt32Number BufferSize) +{ + const cmsMLU* mlu = GetInfo(hProfile, Info); + if (mlu == NULL) return 0; + + return cmsMLUgetUTF8(mlu, LanguageCode, CountryCode, Buffer, BufferSize); +} diff --git a/local/recipes/libs/lcms2/source/src/cmslut.c b/local/recipes/libs/lcms2/source/src/cmslut.c new file mode 100644 index 0000000000..65c935fc08 --- /dev/null +++ b/local/recipes/libs/lcms2/source/src/cmslut.c @@ -0,0 +1,1852 @@ +//--------------------------------------------------------------------------------- +// +// Little Color Management System +// Copyright (c) 1998-2026 Marti Maria Saguer +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//--------------------------------------------------------------------------------- +// + +#include "lcms2_internal.h" + + +// Allocates an empty multi profile element +cmsStage* CMSEXPORT _cmsStageAllocPlaceholder(cmsContext ContextID, + cmsStageSignature Type, + cmsUInt32Number InputChannels, + cmsUInt32Number OutputChannels, + _cmsStageEvalFn EvalPtr, + _cmsStageDupElemFn DupElemPtr, + _cmsStageFreeElemFn FreePtr, + void* Data) +{ + cmsStage* ph = (cmsStage*) _cmsMallocZero(ContextID, sizeof(cmsStage)); + + if (ph == NULL) return NULL; + + + ph ->ContextID = ContextID; + + ph ->Type = Type; + ph ->Implements = Type; // By default, no clue on what is implementing + + ph ->InputChannels = InputChannels; + ph ->OutputChannels = OutputChannels; + ph ->EvalPtr = EvalPtr; + ph ->DupElemPtr = DupElemPtr; + ph ->FreePtr = FreePtr; + ph ->Data = Data; + + return ph; +} + + +static +void EvaluateIdentity(const cmsFloat32Number In[], + cmsFloat32Number Out[], + const cmsStage *mpe) +{ + memmove(Out, In, mpe ->InputChannels * sizeof(cmsFloat32Number)); +} + + +cmsStage* CMSEXPORT cmsStageAllocIdentity(cmsContext ContextID, cmsUInt32Number nChannels) +{ + return _cmsStageAllocPlaceholder(ContextID, + cmsSigIdentityElemType, + nChannels, nChannels, + EvaluateIdentity, + NULL, + NULL, + NULL); + } + +// Conversion functions. From floating point to 16 bits +static +void FromFloatTo16(const cmsFloat32Number In[], cmsUInt16Number Out[], cmsUInt32Number n) +{ + cmsUInt32Number i; + + for (i=0; i < n; i++) { + Out[i] = _cmsQuickSaturateWord(In[i] * 65535.0); + } +} + +// From 16 bits to floating point +static +void From16ToFloat(const cmsUInt16Number In[], cmsFloat32Number Out[], cmsUInt32Number n) +{ + cmsUInt32Number i; + + for (i=0; i < n; i++) { + Out[i] = (cmsFloat32Number) In[i] / 65535.0F; + } +} + + +// This function is quite useful to analyze the structure of a LUT and retrieve the MPE elements +// that conform the LUT. It should be called with the LUT, the number of expected elements and +// then a list of expected types followed with a list of cmsFloat64Number pointers to MPE elements. If +// the function founds a match with current pipeline, it fills the pointers and returns TRUE +// if not, returns FALSE without touching anything. Setting pointers to NULL does bypass +// the storage process. +cmsBool CMSEXPORT cmsPipelineCheckAndRetreiveStages(const cmsPipeline* Lut, cmsUInt32Number n, ...) +{ + va_list args; + cmsUInt32Number i; + cmsStage* mpe; + cmsStageSignature Type; + void** ElemPtr; + + // Make sure same number of elements + if (cmsPipelineStageCount(Lut) != n) return FALSE; + + va_start(args, n); + + // Iterate across asked types + mpe = Lut ->Elements; + for (i=0; i < n; i++) { + + // Get asked type. cmsStageSignature is promoted to int by compiler + Type = (cmsStageSignature)va_arg(args, int); + if (mpe ->Type != Type) { + + va_end(args); // Mismatch. We are done. + return FALSE; + } + mpe = mpe ->Next; + } + + // Found a combination, fill pointers if not NULL + mpe = Lut ->Elements; + for (i=0; i < n; i++) { + + ElemPtr = va_arg(args, void**); + if (ElemPtr != NULL) + *ElemPtr = mpe; + + mpe = mpe ->Next; + } + + va_end(args); + return TRUE; +} + +// Below there are implementations for several types of elements. Each type may be implemented by a +// evaluation function, a duplication function, a function to free resources and a constructor. + +// ************************************************************************************************* +// Type cmsSigCurveSetElemType (curves) +// ************************************************************************************************* + +cmsToneCurve** _cmsStageGetPtrToCurveSet(const cmsStage* mpe) +{ + _cmsStageToneCurvesData* Data = (_cmsStageToneCurvesData*) mpe ->Data; + + return Data ->TheCurves; +} + +static +void EvaluateCurves(const cmsFloat32Number In[], + cmsFloat32Number Out[], + const cmsStage *mpe) +{ + _cmsStageToneCurvesData* Data; + cmsUInt32Number i; + + _cmsAssert(mpe != NULL); + + Data = (_cmsStageToneCurvesData*) mpe ->Data; + if (Data == NULL) return; + + if (Data ->TheCurves == NULL) return; + + for (i=0; i < Data ->nCurves; i++) { + Out[i] = cmsEvalToneCurveFloat(Data ->TheCurves[i], In[i]); + } +} + +static +void CurveSetElemTypeFree(cmsStage* mpe) +{ + _cmsStageToneCurvesData* Data; + cmsUInt32Number i; + + _cmsAssert(mpe != NULL); + + Data = (_cmsStageToneCurvesData*) mpe ->Data; + if (Data == NULL) return; + + if (Data ->TheCurves != NULL) { + for (i=0; i < Data ->nCurves; i++) { + if (Data ->TheCurves[i] != NULL) + cmsFreeToneCurve(Data ->TheCurves[i]); + } + } + _cmsFree(mpe ->ContextID, Data ->TheCurves); + _cmsFree(mpe ->ContextID, Data); +} + + +static +void* CurveSetDup(cmsStage* mpe) +{ + _cmsStageToneCurvesData* Data = (_cmsStageToneCurvesData*) mpe ->Data; + _cmsStageToneCurvesData* NewElem; + cmsUInt32Number i; + + NewElem = (_cmsStageToneCurvesData*) _cmsMallocZero(mpe ->ContextID, sizeof(_cmsStageToneCurvesData)); + if (NewElem == NULL) return NULL; + + NewElem ->nCurves = Data ->nCurves; + NewElem ->TheCurves = (cmsToneCurve**) _cmsCalloc(mpe ->ContextID, NewElem ->nCurves, sizeof(cmsToneCurve*)); + + if (NewElem ->TheCurves == NULL) goto Error; + + for (i=0; i < NewElem ->nCurves; i++) { + + // Duplicate each curve. It may fail. + NewElem ->TheCurves[i] = cmsDupToneCurve(Data ->TheCurves[i]); + if (NewElem ->TheCurves[i] == NULL) goto Error; + + + } + return (void*) NewElem; + +Error: + + if (NewElem ->TheCurves != NULL) { + for (i=0; i < NewElem ->nCurves; i++) { + if (NewElem ->TheCurves[i]) + cmsFreeToneCurve(NewElem ->TheCurves[i]); + } + } + _cmsFree(mpe ->ContextID, NewElem ->TheCurves); + _cmsFree(mpe ->ContextID, NewElem); + return NULL; +} + + +// Curves == NULL forces identity curves +cmsStage* CMSEXPORT cmsStageAllocToneCurves(cmsContext ContextID, cmsUInt32Number nChannels, cmsToneCurve* const Curves[]) +{ + cmsUInt32Number i; + _cmsStageToneCurvesData* NewElem; + cmsStage* NewMPE; + + + NewMPE = _cmsStageAllocPlaceholder(ContextID, cmsSigCurveSetElemType, nChannels, nChannels, + EvaluateCurves, CurveSetDup, CurveSetElemTypeFree, NULL ); + if (NewMPE == NULL) return NULL; + + NewElem = (_cmsStageToneCurvesData*) _cmsMallocZero(ContextID, sizeof(_cmsStageToneCurvesData)); + if (NewElem == NULL) { + cmsStageFree(NewMPE); + return NULL; + } + + NewMPE ->Data = (void*) NewElem; + + NewElem ->nCurves = nChannels; + NewElem ->TheCurves = (cmsToneCurve**) _cmsCalloc(ContextID, nChannels, sizeof(cmsToneCurve*)); + if (NewElem ->TheCurves == NULL) { + cmsStageFree(NewMPE); + return NULL; + } + + for (i=0; i < nChannels; i++) { + + if (Curves == NULL) { + NewElem ->TheCurves[i] = cmsBuildGamma(ContextID, 1.0); + } + else { + NewElem ->TheCurves[i] = cmsDupToneCurve(Curves[i]); + } + + if (NewElem ->TheCurves[i] == NULL) { + cmsStageFree(NewMPE); + return NULL; + } + + } + + return NewMPE; +} + + +// Create a bunch of identity curves +cmsStage* CMSEXPORT _cmsStageAllocIdentityCurves(cmsContext ContextID, cmsUInt32Number nChannels) +{ + cmsStage* mpe = cmsStageAllocToneCurves(ContextID, nChannels, NULL); + + if (mpe == NULL) return NULL; + mpe ->Implements = cmsSigIdentityElemType; + return mpe; +} + + +// ************************************************************************************************* +// Type cmsSigMatrixElemType (Matrices) +// ************************************************************************************************* + + +// Special care should be taken here because precision loss. A temporary cmsFloat64Number buffer is being used +static +void EvaluateMatrix(const cmsFloat32Number In[], + cmsFloat32Number Out[], + const cmsStage *mpe) +{ + cmsUInt32Number i, j; + _cmsStageMatrixData* Data = (_cmsStageMatrixData*) mpe ->Data; + cmsFloat64Number Tmp; + + // Input is already in 0..1.0 notation + for (i=0; i < mpe ->OutputChannels; i++) { + + Tmp = 0; + for (j=0; j < mpe->InputChannels; j++) { + Tmp += In[j] * Data->Double[i*mpe->InputChannels + j]; + } + + if (Data ->Offset != NULL) + Tmp += Data->Offset[i]; + + Out[i] = (cmsFloat32Number) Tmp; + } + + + // Output in 0..1.0 domain +} + + +// Duplicate a yet-existing matrix element +static +void* MatrixElemDup(cmsStage* mpe) +{ + _cmsStageMatrixData* Data = (_cmsStageMatrixData*) mpe ->Data; + _cmsStageMatrixData* NewElem; + cmsUInt32Number sz; + + NewElem = (_cmsStageMatrixData*) _cmsMallocZero(mpe ->ContextID, sizeof(_cmsStageMatrixData)); + if (NewElem == NULL) return NULL; + + sz = mpe ->InputChannels * mpe ->OutputChannels; + + NewElem ->Double = (cmsFloat64Number*) _cmsDupMem(mpe ->ContextID, Data ->Double, sz * sizeof(cmsFloat64Number)) ; + + if (Data ->Offset) + NewElem ->Offset = (cmsFloat64Number*) _cmsDupMem(mpe ->ContextID, + Data ->Offset, mpe -> OutputChannels * sizeof(cmsFloat64Number)) ; + + return (void*) NewElem; +} + + +static +void MatrixElemTypeFree(cmsStage* mpe) +{ + _cmsStageMatrixData* Data = (_cmsStageMatrixData*) mpe ->Data; + if (Data == NULL) + return; + if (Data ->Double) + _cmsFree(mpe ->ContextID, Data ->Double); + + if (Data ->Offset) + _cmsFree(mpe ->ContextID, Data ->Offset); + + _cmsFree(mpe ->ContextID, mpe ->Data); +} + + + +cmsStage* CMSEXPORT cmsStageAllocMatrix(cmsContext ContextID, cmsUInt32Number Rows, cmsUInt32Number Cols, + const cmsFloat64Number* Matrix, const cmsFloat64Number* Offset) +{ + cmsUInt32Number i, n; + _cmsStageMatrixData* NewElem; + cmsStage* NewMPE; + + n = Rows * Cols; + + // Check for overflow + if (n == 0) return NULL; + if (n >= UINT_MAX / Cols) return NULL; + if (n >= UINT_MAX / Rows) return NULL; + if (n < Rows || n < Cols) return NULL; + + NewMPE = _cmsStageAllocPlaceholder(ContextID, cmsSigMatrixElemType, Cols, Rows, + EvaluateMatrix, MatrixElemDup, MatrixElemTypeFree, NULL ); + if (NewMPE == NULL) return NULL; + + + NewElem = (_cmsStageMatrixData*) _cmsMallocZero(ContextID, sizeof(_cmsStageMatrixData)); + if (NewElem == NULL) goto Error; + NewMPE->Data = (void*)NewElem; + + NewElem ->Double = (cmsFloat64Number*) _cmsCalloc(ContextID, n, sizeof(cmsFloat64Number)); + if (NewElem->Double == NULL) goto Error; + + for (i=0; i < n; i++) { + NewElem ->Double[i] = Matrix[i]; + } + + if (Offset != NULL) { + + NewElem ->Offset = (cmsFloat64Number*) _cmsCalloc(ContextID, Rows, sizeof(cmsFloat64Number)); + if (NewElem->Offset == NULL) goto Error; + + for (i=0; i < Rows; i++) { + NewElem ->Offset[i] = Offset[i]; + } + } + + return NewMPE; + +Error: + cmsStageFree(NewMPE); + return NULL; +} + + +// ************************************************************************************************* +// Type cmsSigCLutElemType +// ************************************************************************************************* + + +// Evaluate in true floating point +static +void EvaluateCLUTfloat(const cmsFloat32Number In[], cmsFloat32Number Out[], const cmsStage *mpe) +{ + _cmsStageCLutData* Data = (_cmsStageCLutData*) mpe ->Data; + + Data -> Params ->Interpolation.LerpFloat(In, Out, Data->Params); +} + + +// Convert to 16 bits, evaluate, and back to floating point +static +void EvaluateCLUTfloatIn16(const cmsFloat32Number In[], cmsFloat32Number Out[], const cmsStage *mpe) +{ + _cmsStageCLutData* Data = (_cmsStageCLutData*) mpe ->Data; + cmsUInt16Number In16[MAX_STAGE_CHANNELS], Out16[MAX_STAGE_CHANNELS]; + + _cmsAssert(mpe ->InputChannels <= MAX_STAGE_CHANNELS); + _cmsAssert(mpe ->OutputChannels <= MAX_STAGE_CHANNELS); + + FromFloatTo16(In, In16, mpe ->InputChannels); + Data -> Params ->Interpolation.Lerp16(In16, Out16, Data->Params); + From16ToFloat(Out16, Out, mpe ->OutputChannels); +} + + +// Given an hypercube of b dimensions, with Dims[] number of nodes by dimension, calculate the total amount of nodes +static +cmsUInt32Number CubeSize(const cmsUInt32Number Dims[], cmsUInt32Number b) +{ + cmsUInt32Number dim; + cmsUInt64Number rv; + + _cmsAssert(Dims != NULL); + + for (rv = 1; b > 0; b--) { + + dim = Dims[b-1]; + if (dim <= 1) return 0; + + // Check for overflow + if (rv > UINT_MAX / dim) return 0; + + rv *= dim; + } + + // Again, prevent overflow + if (rv > UINT_MAX / 15) return 0; + + return (cmsUInt32Number) rv; +} + +static +void* CLUTElemDup(cmsStage* mpe) +{ + _cmsStageCLutData* Data = (_cmsStageCLutData*) mpe ->Data; + _cmsStageCLutData* NewElem; + + + NewElem = (_cmsStageCLutData*) _cmsMallocZero(mpe ->ContextID, sizeof(_cmsStageCLutData)); + if (NewElem == NULL) return NULL; + + NewElem ->nEntries = Data ->nEntries; + NewElem ->HasFloatValues = Data ->HasFloatValues; + + if (Data ->Tab.T) { + + if (Data ->HasFloatValues) { + NewElem ->Tab.TFloat = (cmsFloat32Number*) _cmsDupMem(mpe ->ContextID, Data ->Tab.TFloat, Data ->nEntries * sizeof (cmsFloat32Number)); + if (NewElem ->Tab.TFloat == NULL) + goto Error; + } else { + NewElem ->Tab.T = (cmsUInt16Number*) _cmsDupMem(mpe ->ContextID, Data ->Tab.T, Data ->nEntries * sizeof (cmsUInt16Number)); + if (NewElem ->Tab.T == NULL) + goto Error; + } + } + + NewElem ->Params = _cmsComputeInterpParamsEx(mpe ->ContextID, + Data ->Params ->nSamples, + Data ->Params ->nInputs, + Data ->Params ->nOutputs, + NewElem ->Tab.T, + Data ->Params ->dwFlags); + if (NewElem->Params != NULL) + return (void*) NewElem; + Error: + if (NewElem->Tab.T) + // This works for both types + _cmsFree(mpe ->ContextID, NewElem -> Tab.T); + _cmsFree(mpe ->ContextID, NewElem); + return NULL; +} + + +static +void CLutElemTypeFree(cmsStage* mpe) +{ + + _cmsStageCLutData* Data = (_cmsStageCLutData*) mpe ->Data; + + // Already empty + if (Data == NULL) return; + + // This works for both types + if (Data -> Tab.T) + _cmsFree(mpe ->ContextID, Data -> Tab.T); + + _cmsFreeInterpParams(Data ->Params); + _cmsFree(mpe ->ContextID, mpe ->Data); +} + + +// Allocates a 16-bit multidimensional CLUT. This is evaluated at 16-bit precision. Table may have different +// granularity on each dimension. +cmsStage* CMSEXPORT cmsStageAllocCLut16bitGranular(cmsContext ContextID, + const cmsUInt32Number clutPoints[], + cmsUInt32Number inputChan, + cmsUInt32Number outputChan, + const cmsUInt16Number* Table) +{ + cmsUInt32Number i, n; + _cmsStageCLutData* NewElem; + cmsStage* NewMPE; + + _cmsAssert(clutPoints != NULL); + + if (inputChan > MAX_INPUT_DIMENSIONS) { + cmsSignalError(ContextID, cmsERROR_RANGE, "Too many input channels (%d channels, max=%d)", inputChan, MAX_INPUT_DIMENSIONS); + return NULL; + } + + NewMPE = _cmsStageAllocPlaceholder(ContextID, cmsSigCLutElemType, inputChan, outputChan, + EvaluateCLUTfloatIn16, CLUTElemDup, CLutElemTypeFree, NULL ); + + if (NewMPE == NULL) return NULL; + + NewElem = (_cmsStageCLutData*) _cmsMallocZero(ContextID, sizeof(_cmsStageCLutData)); + if (NewElem == NULL) { + cmsStageFree(NewMPE); + return NULL; + } + + NewMPE ->Data = (void*) NewElem; + + NewElem -> nEntries = n = outputChan * CubeSize(clutPoints, inputChan); + NewElem -> HasFloatValues = FALSE; + + if (n == 0) { + cmsStageFree(NewMPE); + return NULL; + } + + + NewElem ->Tab.T = (cmsUInt16Number*) _cmsCalloc(ContextID, n, sizeof(cmsUInt16Number)); + if (NewElem ->Tab.T == NULL) { + cmsStageFree(NewMPE); + return NULL; + } + + if (Table != NULL) { + for (i=0; i < n; i++) { + NewElem ->Tab.T[i] = Table[i]; + } + } + + NewElem ->Params = _cmsComputeInterpParamsEx(ContextID, clutPoints, inputChan, outputChan, NewElem ->Tab.T, CMS_LERP_FLAGS_16BITS); + if (NewElem ->Params == NULL) { + cmsStageFree(NewMPE); + return NULL; + } + + return NewMPE; +} + +cmsStage* CMSEXPORT cmsStageAllocCLut16bit(cmsContext ContextID, + cmsUInt32Number nGridPoints, + cmsUInt32Number inputChan, + cmsUInt32Number outputChan, + const cmsUInt16Number* Table) +{ + cmsUInt32Number Dimensions[MAX_INPUT_DIMENSIONS]; + int i; + + // Our resulting LUT would be same gridpoints on all dimensions + for (i=0; i < MAX_INPUT_DIMENSIONS; i++) + Dimensions[i] = nGridPoints; + + return cmsStageAllocCLut16bitGranular(ContextID, Dimensions, inputChan, outputChan, Table); +} + + +cmsStage* CMSEXPORT cmsStageAllocCLutFloat(cmsContext ContextID, + cmsUInt32Number nGridPoints, + cmsUInt32Number inputChan, + cmsUInt32Number outputChan, + const cmsFloat32Number* Table) +{ + cmsUInt32Number Dimensions[MAX_INPUT_DIMENSIONS]; + int i; + + // Our resulting LUT would be same gridpoints on all dimensions + for (i=0; i < MAX_INPUT_DIMENSIONS; i++) + Dimensions[i] = nGridPoints; + + return cmsStageAllocCLutFloatGranular(ContextID, Dimensions, inputChan, outputChan, Table); +} + + + +cmsStage* CMSEXPORT cmsStageAllocCLutFloatGranular(cmsContext ContextID, const cmsUInt32Number clutPoints[], cmsUInt32Number inputChan, cmsUInt32Number outputChan, const cmsFloat32Number* Table) +{ + cmsUInt32Number i, n; + _cmsStageCLutData* NewElem; + cmsStage* NewMPE; + + _cmsAssert(clutPoints != NULL); + + if (inputChan > MAX_INPUT_DIMENSIONS) { + cmsSignalError(ContextID, cmsERROR_RANGE, "Too many input channels (%d channels, max=%d)", inputChan, MAX_INPUT_DIMENSIONS); + return NULL; + } + + NewMPE = _cmsStageAllocPlaceholder(ContextID, cmsSigCLutElemType, inputChan, outputChan, + EvaluateCLUTfloat, CLUTElemDup, CLutElemTypeFree, NULL); + if (NewMPE == NULL) return NULL; + + + NewElem = (_cmsStageCLutData*) _cmsMallocZero(ContextID, sizeof(_cmsStageCLutData)); + if (NewElem == NULL) { + cmsStageFree(NewMPE); + return NULL; + } + + NewMPE ->Data = (void*) NewElem; + + // There is a potential integer overflow on conputing n and nEntries. + NewElem -> nEntries = n = outputChan * CubeSize(clutPoints, inputChan); + NewElem -> HasFloatValues = TRUE; + + if (n == 0) { + cmsStageFree(NewMPE); + return NULL; + } + + NewElem ->Tab.TFloat = (cmsFloat32Number*) _cmsCalloc(ContextID, n, sizeof(cmsFloat32Number)); + if (NewElem ->Tab.TFloat == NULL) { + cmsStageFree(NewMPE); + return NULL; + } + + if (Table != NULL) { + for (i=0; i < n; i++) { + NewElem ->Tab.TFloat[i] = Table[i]; + } + } + + NewElem ->Params = _cmsComputeInterpParamsEx(ContextID, clutPoints, inputChan, outputChan, NewElem ->Tab.TFloat, CMS_LERP_FLAGS_FLOAT); + if (NewElem ->Params == NULL) { + cmsStageFree(NewMPE); + return NULL; + } + + return NewMPE; +} + + +static +int IdentitySampler(CMSREGISTER const cmsUInt16Number In[], CMSREGISTER cmsUInt16Number Out[], CMSREGISTER void * Cargo) +{ + int nChan = *(int*) Cargo; + int i; + + for (i=0; i < nChan; i++) + Out[i] = In[i]; + + return 1; +} + +// Creates an MPE that just copies input to output +cmsStage* CMSEXPORT _cmsStageAllocIdentityCLut(cmsContext ContextID, cmsUInt32Number nChan) +{ + cmsUInt32Number Dimensions[MAX_INPUT_DIMENSIONS]; + cmsStage* mpe ; + int i; + + for (i=0; i < MAX_INPUT_DIMENSIONS; i++) + Dimensions[i] = 2; + + mpe = cmsStageAllocCLut16bitGranular(ContextID, Dimensions, nChan, nChan, NULL); + if (mpe == NULL) return NULL; + + if (!cmsStageSampleCLut16bit(mpe, IdentitySampler, &nChan, 0)) { + cmsStageFree(mpe); + return NULL; + } + + mpe ->Implements = cmsSigIdentityElemType; + return mpe; +} + + + +// Quantize a value 0 <= i < MaxSamples to 0..0xffff +cmsUInt16Number CMSEXPORT _cmsQuantizeVal(cmsFloat64Number i, cmsUInt32Number MaxSamples) +{ + cmsFloat64Number x; + + x = ((cmsFloat64Number) i * 65535.) / (cmsFloat64Number) (MaxSamples - 1); + return _cmsQuickSaturateWord(x); +} + + +// This routine does a sweep on whole input space, and calls its callback +// function on knots. returns TRUE if all ok, FALSE otherwise. +cmsBool CMSEXPORT cmsStageSampleCLut16bit(cmsStage* mpe, cmsSAMPLER16 Sampler, void * Cargo, cmsUInt32Number dwFlags) +{ + int i, t, index, rest; + cmsUInt32Number nTotalPoints; + cmsUInt32Number nInputs, nOutputs; + cmsUInt32Number* nSamples; + cmsUInt16Number In[MAX_INPUT_DIMENSIONS+1], Out[MAX_STAGE_CHANNELS]; + _cmsStageCLutData* clut; + + if (mpe == NULL) return FALSE; + + clut = (_cmsStageCLutData*) mpe->Data; + + if (clut == NULL) return FALSE; + + nSamples = clut->Params ->nSamples; + nInputs = clut->Params ->nInputs; + nOutputs = clut->Params ->nOutputs; + + if (nInputs <= 0) return FALSE; + if (nOutputs <= 0) return FALSE; + if (nInputs > MAX_INPUT_DIMENSIONS) return FALSE; + if (nOutputs >= MAX_STAGE_CHANNELS) return FALSE; + + memset(In, 0, sizeof(In)); + memset(Out, 0, sizeof(Out)); + + nTotalPoints = CubeSize(nSamples, nInputs); + if (nTotalPoints == 0) return FALSE; + + index = 0; + for (i = 0; i < (int) nTotalPoints; i++) { + + rest = i; + for (t = (int)nInputs - 1; t >= 0; --t) { + + cmsUInt32Number Colorant = rest % nSamples[t]; + + rest /= nSamples[t]; + + In[t] = _cmsQuantizeVal(Colorant, nSamples[t]); + } + + if (clut ->Tab.T != NULL) { + for (t = 0; t < (int)nOutputs; t++) + Out[t] = clut->Tab.T[index + t]; + } + + if (!Sampler(In, Out, Cargo)) + return FALSE; + + if (!(dwFlags & SAMPLER_INSPECT)) { + + if (clut ->Tab.T != NULL) { + for (t=0; t < (int) nOutputs; t++) + clut->Tab.T[index + t] = Out[t]; + } + } + + index += nOutputs; + } + + return TRUE; +} + +// Same as anterior, but for floating point +cmsBool CMSEXPORT cmsStageSampleCLutFloat(cmsStage* mpe, cmsSAMPLERFLOAT Sampler, void * Cargo, cmsUInt32Number dwFlags) +{ + int i, t, index, rest; + cmsUInt32Number nTotalPoints; + cmsUInt32Number nInputs, nOutputs; + cmsUInt32Number* nSamples; + cmsFloat32Number In[MAX_INPUT_DIMENSIONS+1], Out[MAX_STAGE_CHANNELS]; + _cmsStageCLutData* clut; + + if (mpe == NULL) return FALSE; + + clut = (_cmsStageCLutData*)mpe->Data; + + if (clut == NULL) return FALSE; + + nSamples = clut->Params ->nSamples; + nInputs = clut->Params ->nInputs; + nOutputs = clut->Params ->nOutputs; + + if (nInputs <= 0) return FALSE; + if (nOutputs <= 0) return FALSE; + if (nInputs > MAX_INPUT_DIMENSIONS) return FALSE; + if (nOutputs >= MAX_STAGE_CHANNELS) return FALSE; + + nTotalPoints = CubeSize(nSamples, nInputs); + if (nTotalPoints == 0) return FALSE; + + index = 0; + for (i = 0; i < (int)nTotalPoints; i++) { + + rest = i; + for (t = (int) nInputs-1; t >=0; --t) { + + cmsUInt32Number Colorant = rest % nSamples[t]; + + rest /= nSamples[t]; + + In[t] = (cmsFloat32Number) (_cmsQuantizeVal(Colorant, nSamples[t]) / 65535.0); + } + + if (clut ->Tab.TFloat != NULL) { + for (t=0; t < (int) nOutputs; t++) + Out[t] = clut->Tab.TFloat[index + t]; + } + + if (!Sampler(In, Out, Cargo)) + return FALSE; + + if (!(dwFlags & SAMPLER_INSPECT)) { + + if (clut ->Tab.TFloat != NULL) { + for (t=0; t < (int) nOutputs; t++) + clut->Tab.TFloat[index + t] = Out[t]; + } + } + + index += nOutputs; + } + + return TRUE; +} + + + +// This routine does a sweep on whole input space, and calls its callback +// function on knots. returns TRUE if all ok, FALSE otherwise. +cmsBool CMSEXPORT cmsSliceSpace16(cmsUInt32Number nInputs, const cmsUInt32Number clutPoints[], + cmsSAMPLER16 Sampler, void * Cargo) +{ + int i, t, rest; + cmsUInt32Number nTotalPoints; + cmsUInt16Number In[cmsMAXCHANNELS]; + + if (nInputs >= cmsMAXCHANNELS) return FALSE; + + nTotalPoints = CubeSize(clutPoints, nInputs); + if (nTotalPoints == 0) return FALSE; + + for (i = 0; i < (int) nTotalPoints; i++) { + + rest = i; + for (t = (int) nInputs-1; t >=0; --t) { + + cmsUInt32Number Colorant = rest % clutPoints[t]; + + rest /= clutPoints[t]; + In[t] = _cmsQuantizeVal(Colorant, clutPoints[t]); + + } + + if (!Sampler(In, NULL, Cargo)) + return FALSE; + } + + return TRUE; +} + +cmsInt32Number CMSEXPORT cmsSliceSpaceFloat(cmsUInt32Number nInputs, const cmsUInt32Number clutPoints[], + cmsSAMPLERFLOAT Sampler, void * Cargo) +{ + int i, t, rest; + cmsUInt32Number nTotalPoints; + cmsFloat32Number In[cmsMAXCHANNELS]; + + if (nInputs >= cmsMAXCHANNELS) return FALSE; + + nTotalPoints = CubeSize(clutPoints, nInputs); + if (nTotalPoints == 0) return FALSE; + + for (i = 0; i < (int) nTotalPoints; i++) { + + rest = i; + for (t = (int) nInputs-1; t >=0; --t) { + + cmsUInt32Number Colorant = rest % clutPoints[t]; + + rest /= clutPoints[t]; + In[t] = (cmsFloat32Number) (_cmsQuantizeVal(Colorant, clutPoints[t]) / 65535.0); + + } + + if (!Sampler(In, NULL, Cargo)) + return FALSE; + } + + return TRUE; +} + +// ******************************************************************************** +// Type cmsSigLab2XYZElemType +// ******************************************************************************** + + +static +void EvaluateLab2XYZ(const cmsFloat32Number In[], + cmsFloat32Number Out[], + const cmsStage *mpe) +{ + cmsCIELab Lab; + cmsCIEXYZ XYZ; + const cmsFloat64Number XYZadj = MAX_ENCODEABLE_XYZ; + + // V4 rules + Lab.L = In[0] * 100.0; + Lab.a = In[1] * 255.0 - 128.0; + Lab.b = In[2] * 255.0 - 128.0; + + cmsLab2XYZ(NULL, &XYZ, &Lab); + + // From XYZ, range 0..19997 to 0..1.0, note that 1.99997 comes from 0xffff + // encoded as 1.15 fixed point, so 1 + (32767.0 / 32768.0) + + Out[0] = (cmsFloat32Number) ((cmsFloat64Number) XYZ.X / XYZadj); + Out[1] = (cmsFloat32Number) ((cmsFloat64Number) XYZ.Y / XYZadj); + Out[2] = (cmsFloat32Number) ((cmsFloat64Number) XYZ.Z / XYZadj); + return; + + cmsUNUSED_PARAMETER(mpe); +} + + +// No dup or free routines needed, as the structure has no pointers in it. +cmsStage* CMSEXPORT _cmsStageAllocLab2XYZ(cmsContext ContextID) +{ + return _cmsStageAllocPlaceholder(ContextID, cmsSigLab2XYZElemType, 3, 3, EvaluateLab2XYZ, NULL, NULL, NULL); +} + +// ******************************************************************************** + +// v2 L=100 is supposed to be placed on 0xFF00. There is no reasonable +// number of gridpoints that would make exact match. However, a prelinearization +// of 258 entries, would map 0xFF00 exactly on entry 257, and this is good to avoid scum dot. +// Almost all what we need but unfortunately, the rest of entries should be scaled by +// (255*257/256) and this is not exact. + +cmsStage* _cmsStageAllocLabV2ToV4curves(cmsContext ContextID) +{ + cmsStage* mpe; + cmsToneCurve* LabTable[3]; + int i, j; + + LabTable[0] = cmsBuildTabulatedToneCurve16(ContextID, 258, NULL); + LabTable[1] = cmsBuildTabulatedToneCurve16(ContextID, 258, NULL); + LabTable[2] = cmsBuildTabulatedToneCurve16(ContextID, 258, NULL); + + for (j=0; j < 3; j++) { + + if (LabTable[j] == NULL) { + cmsFreeToneCurveTriple(LabTable); + return NULL; + } + + // We need to map * (0xffff / 0xff00), that's same as (257 / 256) + // So we can use 258-entry tables to do the trick (i / 257) * (255 * 257) * (257 / 256); + for (i=0; i < 257; i++) { + + LabTable[j]->Table16[i] = (cmsUInt16Number) ((i * 0xffff + 0x80) >> 8); + } + + LabTable[j] ->Table16[257] = 0xffff; + } + + mpe = cmsStageAllocToneCurves(ContextID, 3, LabTable); + cmsFreeToneCurveTriple(LabTable); + + if (mpe == NULL) return NULL; + mpe ->Implements = cmsSigLabV2toV4; + return mpe; +} + +// ******************************************************************************** + +// Matrix-based conversion, which is more accurate, but slower and cannot properly be saved in devicelink profiles +cmsStage* CMSEXPORT _cmsStageAllocLabV2ToV4(cmsContext ContextID) +{ + static const cmsFloat64Number V2ToV4[] = { 65535.0/65280.0, 0, 0, + 0, 65535.0/65280.0, 0, + 0, 0, 65535.0/65280.0 + }; + + cmsStage *mpe = cmsStageAllocMatrix(ContextID, 3, 3, V2ToV4, NULL); + + if (mpe == NULL) return mpe; + mpe ->Implements = cmsSigLabV2toV4; + return mpe; +} + + +// Reverse direction +cmsStage* CMSEXPORT _cmsStageAllocLabV4ToV2(cmsContext ContextID) +{ + static const cmsFloat64Number V4ToV2[] = { 65280.0/65535.0, 0, 0, + 0, 65280.0/65535.0, 0, + 0, 0, 65280.0/65535.0 + }; + + cmsStage *mpe = cmsStageAllocMatrix(ContextID, 3, 3, V4ToV2, NULL); + + if (mpe == NULL) return mpe; + mpe ->Implements = cmsSigLabV4toV2; + return mpe; +} + + +// To Lab to float. Note that the MPE gives numbers in normal Lab range +// and we need 0..1.0 range for the formatters +// L* : 0...100 => 0...1.0 (L* / 100) +// ab* : -128..+127 to 0..1 ((ab* + 128) / 255) + +cmsStage* _cmsStageNormalizeFromLabFloat(cmsContext ContextID) +{ + static const cmsFloat64Number a1[] = { + 1.0/100.0, 0, 0, + 0, 1.0/255.0, 0, + 0, 0, 1.0/255.0 + }; + + static const cmsFloat64Number o1[] = { + 0, + 128.0/255.0, + 128.0/255.0 + }; + + cmsStage *mpe = cmsStageAllocMatrix(ContextID, 3, 3, a1, o1); + + if (mpe == NULL) return mpe; + mpe ->Implements = cmsSigLab2FloatPCS; + return mpe; +} + +// From XYZ to floating point PCS +cmsStage* _cmsStageNormalizeFromXyzFloat(cmsContext ContextID) +{ +#define n (32768.0/65535.0) + static const cmsFloat64Number a1[] = { + n, 0, 0, + 0, n, 0, + 0, 0, n + }; +#undef n + + cmsStage *mpe = cmsStageAllocMatrix(ContextID, 3, 3, a1, NULL); + + if (mpe == NULL) return mpe; + mpe ->Implements = cmsSigXYZ2FloatPCS; + return mpe; +} + +cmsStage* _cmsStageNormalizeToLabFloat(cmsContext ContextID) +{ + static const cmsFloat64Number a1[] = { + 100.0, 0, 0, + 0, 255.0, 0, + 0, 0, 255.0 + }; + + static const cmsFloat64Number o1[] = { + 0, + -128.0, + -128.0 + }; + + cmsStage *mpe = cmsStageAllocMatrix(ContextID, 3, 3, a1, o1); + if (mpe == NULL) return mpe; + mpe ->Implements = cmsSigFloatPCS2Lab; + return mpe; +} + +cmsStage* _cmsStageNormalizeToXyzFloat(cmsContext ContextID) +{ +#define n (65535.0/32768.0) + + static const cmsFloat64Number a1[] = { + n, 0, 0, + 0, n, 0, + 0, 0, n + }; +#undef n + + cmsStage *mpe = cmsStageAllocMatrix(ContextID, 3, 3, a1, NULL); + if (mpe == NULL) return mpe; + mpe ->Implements = cmsSigFloatPCS2XYZ; + return mpe; +} + +// Clips values smaller than zero +static +void Clipper(const cmsFloat32Number In[], cmsFloat32Number Out[], const cmsStage *mpe) +{ + cmsUInt32Number i; + for (i = 0; i < mpe->InputChannels; i++) { + + cmsFloat32Number n = In[i]; + Out[i] = n < 0 ? 0 : n; + } +} + +cmsStage* _cmsStageClipNegatives(cmsContext ContextID, cmsUInt32Number nChannels) +{ + return _cmsStageAllocPlaceholder(ContextID, cmsSigClipNegativesElemType, + nChannels, nChannels, Clipper, NULL, NULL, NULL); +} + +// ******************************************************************************** +// Type cmsSigXYZ2LabElemType +// ******************************************************************************** + +static +void EvaluateXYZ2Lab(const cmsFloat32Number In[], cmsFloat32Number Out[], const cmsStage *mpe) +{ + cmsCIELab Lab; + cmsCIEXYZ XYZ; + const cmsFloat64Number XYZadj = MAX_ENCODEABLE_XYZ; + + // From 0..1.0 to XYZ + + XYZ.X = In[0] * XYZadj; + XYZ.Y = In[1] * XYZadj; + XYZ.Z = In[2] * XYZadj; + + cmsXYZ2Lab(NULL, &Lab, &XYZ); + + // From V4 Lab to 0..1.0 + + Out[0] = (cmsFloat32Number) (Lab.L / 100.0); + Out[1] = (cmsFloat32Number) ((Lab.a + 128.0) / 255.0); + Out[2] = (cmsFloat32Number) ((Lab.b + 128.0) / 255.0); + return; + + cmsUNUSED_PARAMETER(mpe); +} + +cmsStage* CMSEXPORT _cmsStageAllocXYZ2Lab(cmsContext ContextID) +{ + return _cmsStageAllocPlaceholder(ContextID, cmsSigXYZ2LabElemType, 3, 3, EvaluateXYZ2Lab, NULL, NULL, NULL); + +} + +// ******************************************************************************** + +// For v4, S-Shaped curves are placed in a/b axis to increase resolution near gray + +cmsStage* _cmsStageAllocLabPrelin(cmsContext ContextID) +{ + cmsToneCurve* LabTable[3]; + cmsFloat64Number Params[1] = {2.4} ; + + LabTable[0] = cmsBuildGamma(ContextID, 1.0); + LabTable[1] = cmsBuildParametricToneCurve(ContextID, 108, Params); + LabTable[2] = cmsBuildParametricToneCurve(ContextID, 108, Params); + + return cmsStageAllocToneCurves(ContextID, 3, LabTable); +} + + +// Free a single MPE +void CMSEXPORT cmsStageFree(cmsStage* mpe) +{ + if (mpe ->FreePtr) + mpe ->FreePtr(mpe); + + _cmsFree(mpe ->ContextID, mpe); +} + + +cmsUInt32Number CMSEXPORT cmsStageInputChannels(const cmsStage* mpe) +{ + return mpe ->InputChannels; +} + +cmsUInt32Number CMSEXPORT cmsStageOutputChannels(const cmsStage* mpe) +{ + return mpe ->OutputChannels; +} + +cmsStageSignature CMSEXPORT cmsStageType(const cmsStage* mpe) +{ + return mpe -> Type; +} + +void* CMSEXPORT cmsStageData(const cmsStage* mpe) +{ + return mpe -> Data; +} + +cmsContext CMSEXPORT cmsGetStageContextID(const cmsStage* mpe) +{ + return mpe -> ContextID; +} + +cmsStage* CMSEXPORT cmsStageNext(const cmsStage* mpe) +{ + return mpe -> Next; +} + + +// Duplicates an MPE +cmsStage* CMSEXPORT cmsStageDup(cmsStage* mpe) +{ + cmsStage* NewMPE; + + if (mpe == NULL) return NULL; + NewMPE = _cmsStageAllocPlaceholder(mpe ->ContextID, + mpe ->Type, + mpe ->InputChannels, + mpe ->OutputChannels, + mpe ->EvalPtr, + mpe ->DupElemPtr, + mpe ->FreePtr, + NULL); + if (NewMPE == NULL) return NULL; + + NewMPE ->Implements = mpe ->Implements; + + if (mpe ->DupElemPtr) { + + NewMPE ->Data = mpe ->DupElemPtr(mpe); + + if (NewMPE->Data == NULL) { + + cmsStageFree(NewMPE); + return NULL; + } + + } else { + + NewMPE ->Data = NULL; + } + + return NewMPE; +} + + +// *********************************************************************************************************** + +// This function sets up the channel count +static +cmsBool BlessLUT(cmsPipeline* lut) +{ + // We can set the input/output channels only if we have elements. + if (lut ->Elements != NULL) { + + cmsStage* prev; + cmsStage* next; + cmsStage* First; + cmsStage* Last; + + First = cmsPipelineGetPtrToFirstStage(lut); + Last = cmsPipelineGetPtrToLastStage(lut); + + if (First == NULL || Last == NULL) return FALSE; + + lut->InputChannels = First->InputChannels; + lut->OutputChannels = Last->OutputChannels; + + // Check chain consistency + prev = First; + next = prev->Next; + + while (next != NULL) + { + if (next->InputChannels != prev->OutputChannels) + return FALSE; + + next = next->Next; + prev = prev->Next; + } +} + + return TRUE; +} + + +// Default to evaluate the LUT on 16 bit-basis. Precision is retained. +static +void _LUTeval16(CMSREGISTER const cmsUInt16Number In[], CMSREGISTER cmsUInt16Number Out[], CMSREGISTER const void* D) +{ + cmsPipeline* lut = (cmsPipeline*) D; + cmsStage *mpe; + cmsFloat32Number Storage[2][MAX_STAGE_CHANNELS]; + int Phase = 0, NextPhase; + + From16ToFloat(In, &Storage[Phase][0], lut ->InputChannels); + + for (mpe = lut ->Elements; + mpe != NULL; + mpe = mpe ->Next) { + + NextPhase = Phase ^ 1; + mpe ->EvalPtr(&Storage[Phase][0], &Storage[NextPhase][0], mpe); + Phase = NextPhase; + } + + + FromFloatTo16(&Storage[Phase][0], Out, lut ->OutputChannels); +} + + + +// Does evaluate the LUT on cmsFloat32Number-basis. +static +void _LUTevalFloat(const cmsFloat32Number In[], cmsFloat32Number Out[], const void* D) +{ + cmsPipeline* lut = (cmsPipeline*) D; + cmsStage *mpe; + cmsFloat32Number Storage[2][MAX_STAGE_CHANNELS]; + int Phase = 0, NextPhase; + + memmove(&Storage[Phase][0], In, lut ->InputChannels * sizeof(cmsFloat32Number)); + + for (mpe = lut ->Elements; + mpe != NULL; + mpe = mpe ->Next) { + + NextPhase = Phase ^ 1; + mpe ->EvalPtr(&Storage[Phase][0], &Storage[NextPhase][0], mpe); + Phase = NextPhase; + } + + memmove(Out, &Storage[Phase][0], lut ->OutputChannels * sizeof(cmsFloat32Number)); +} + + +// LUT Creation & Destruction +cmsPipeline* CMSEXPORT cmsPipelineAlloc(cmsContext ContextID, cmsUInt32Number InputChannels, cmsUInt32Number OutputChannels) +{ + cmsPipeline* NewLUT; + + // A value of zero in channels is allowed as placeholder + if (InputChannels >= cmsMAXCHANNELS || + OutputChannels >= cmsMAXCHANNELS) return NULL; + + NewLUT = (cmsPipeline*) _cmsMallocZero(ContextID, sizeof(cmsPipeline)); + if (NewLUT == NULL) return NULL; + + NewLUT -> InputChannels = InputChannels; + NewLUT -> OutputChannels = OutputChannels; + + NewLUT ->Eval16Fn = _LUTeval16; + NewLUT ->EvalFloatFn = _LUTevalFloat; + NewLUT ->DupDataFn = NULL; + NewLUT ->FreeDataFn = NULL; + NewLUT ->Data = NewLUT; + NewLUT ->ContextID = ContextID; + + if (!BlessLUT(NewLUT)) + { + _cmsFree(ContextID, NewLUT); + return NULL; + } + + return NewLUT; +} + +cmsContext CMSEXPORT cmsGetPipelineContextID(const cmsPipeline* lut) +{ + _cmsAssert(lut != NULL); + return lut ->ContextID; +} + +cmsUInt32Number CMSEXPORT cmsPipelineInputChannels(const cmsPipeline* lut) +{ + _cmsAssert(lut != NULL); + return lut ->InputChannels; +} + +cmsUInt32Number CMSEXPORT cmsPipelineOutputChannels(const cmsPipeline* lut) +{ + _cmsAssert(lut != NULL); + return lut ->OutputChannels; +} + +// Free a profile elements LUT +void CMSEXPORT cmsPipelineFree(cmsPipeline* lut) +{ + cmsStage *mpe, *Next; + + if (lut == NULL) return; + + for (mpe = lut ->Elements; + mpe != NULL; + mpe = Next) { + + Next = mpe ->Next; + cmsStageFree(mpe); + } + + if (lut ->FreeDataFn) lut ->FreeDataFn(lut ->ContextID, lut ->Data); + + _cmsFree(lut ->ContextID, lut); +} + + +// Default to evaluate the LUT on 16 bit-basis. +void CMSEXPORT cmsPipelineEval16(const cmsUInt16Number In[], cmsUInt16Number Out[], const cmsPipeline* lut) +{ + _cmsAssert(lut != NULL); + lut ->Eval16Fn(In, Out, lut->Data); +} + + +// Does evaluate the LUT on cmsFloat32Number-basis. +void CMSEXPORT cmsPipelineEvalFloat(const cmsFloat32Number In[], cmsFloat32Number Out[], const cmsPipeline* lut) +{ + _cmsAssert(lut != NULL); + lut ->EvalFloatFn(In, Out, lut); +} + + + +// Duplicates a LUT +cmsPipeline* CMSEXPORT cmsPipelineDup(const cmsPipeline* lut) +{ + cmsPipeline* NewLUT; + cmsStage *NewMPE, *Anterior = NULL, *mpe; + cmsBool First = TRUE; + + if (lut == NULL) return NULL; + + NewLUT = cmsPipelineAlloc(lut ->ContextID, lut ->InputChannels, lut ->OutputChannels); + if (NewLUT == NULL) return NULL; + + for (mpe = lut ->Elements; + mpe != NULL; + mpe = mpe ->Next) { + + NewMPE = cmsStageDup(mpe); + + if (NewMPE == NULL) { + cmsPipelineFree(NewLUT); + return NULL; + } + + if (First) { + NewLUT ->Elements = NewMPE; + First = FALSE; + } + else { + if (Anterior != NULL) + Anterior ->Next = NewMPE; + } + + Anterior = NewMPE; + } + + NewLUT ->Eval16Fn = lut ->Eval16Fn; + NewLUT ->EvalFloatFn = lut ->EvalFloatFn; + NewLUT ->DupDataFn = lut ->DupDataFn; + NewLUT ->FreeDataFn = lut ->FreeDataFn; + + if (NewLUT ->DupDataFn != NULL) + NewLUT ->Data = NewLUT ->DupDataFn(lut ->ContextID, lut->Data); + + + NewLUT ->SaveAs8Bits = lut ->SaveAs8Bits; + + if (!BlessLUT(NewLUT)) + { + _cmsFree(lut->ContextID, NewLUT); + return NULL; + } + + return NewLUT; +} + + +int CMSEXPORT cmsPipelineInsertStage(cmsPipeline* lut, cmsStageLoc loc, cmsStage* mpe) +{ + cmsStage* Anterior = NULL, *pt; + + if (lut == NULL || mpe == NULL) + return FALSE; + + switch (loc) { + + case cmsAT_BEGIN: + mpe ->Next = lut ->Elements; + lut ->Elements = mpe; + break; + + case cmsAT_END: + + if (lut ->Elements == NULL) + lut ->Elements = mpe; + else { + + for (pt = lut ->Elements; + pt != NULL; + pt = pt -> Next) Anterior = pt; + + Anterior ->Next = mpe; + mpe ->Next = NULL; + } + break; + default:; + return FALSE; + } + + return BlessLUT(lut); +} + +// Unlink an element and return the pointer to it +void CMSEXPORT cmsPipelineUnlinkStage(cmsPipeline* lut, cmsStageLoc loc, cmsStage** mpe) +{ + cmsStage *Anterior, *pt, *Last; + cmsStage *Unlinked = NULL; + + + // If empty LUT, there is nothing to remove + if (lut ->Elements == NULL) { + if (mpe) *mpe = NULL; + return; + } + + // On depending on the strategy... + switch (loc) { + + case cmsAT_BEGIN: + { + cmsStage* elem = lut ->Elements; + + lut ->Elements = elem -> Next; + elem ->Next = NULL; + Unlinked = elem; + + } + break; + + case cmsAT_END: + Anterior = Last = NULL; + for (pt = lut ->Elements; + pt != NULL; + pt = pt -> Next) { + Anterior = Last; + Last = pt; + } + + Unlinked = Last; // Next already points to NULL + + // Truncate the chain + if (Anterior) + Anterior ->Next = NULL; + else + lut ->Elements = NULL; + break; + default:; + } + + if (mpe) + *mpe = Unlinked; + else + cmsStageFree(Unlinked); + + // May fail, but we ignore it + BlessLUT(lut); +} + + +// Concatenate two LUT into a new single one +cmsBool CMSEXPORT cmsPipelineCat(cmsPipeline* l1, const cmsPipeline* l2) +{ + cmsStage* mpe; + + // If both LUTS does not have elements, we need to inherit + // the number of channels + if (l1 ->Elements == NULL && l2 ->Elements == NULL) { + l1 ->InputChannels = l2 ->InputChannels; + l1 ->OutputChannels = l2 ->OutputChannels; + } + + // Cat second + for (mpe = l2 ->Elements; + mpe != NULL; + mpe = mpe ->Next) { + + // We have to dup each element + if (!cmsPipelineInsertStage(l1, cmsAT_END, cmsStageDup(mpe))) + return FALSE; + } + + return BlessLUT(l1); +} + + +cmsBool CMSEXPORT cmsPipelineSetSaveAs8bitsFlag(cmsPipeline* lut, cmsBool On) +{ + cmsBool Anterior = lut ->SaveAs8Bits; + + lut ->SaveAs8Bits = On; + return Anterior; +} + + +cmsStage* CMSEXPORT cmsPipelineGetPtrToFirstStage(const cmsPipeline* lut) +{ + return lut ->Elements; +} + +cmsStage* CMSEXPORT cmsPipelineGetPtrToLastStage(const cmsPipeline* lut) +{ + cmsStage *mpe, *Anterior = NULL; + + for (mpe = lut ->Elements; mpe != NULL; mpe = mpe ->Next) + Anterior = mpe; + + return Anterior; +} + +cmsUInt32Number CMSEXPORT cmsPipelineStageCount(const cmsPipeline* lut) +{ + cmsStage *mpe; + cmsUInt32Number n; + + for (n=0, mpe = lut ->Elements; mpe != NULL; mpe = mpe ->Next) + n++; + + return n; +} + +// This function may be used to set the optional evaluator and a block of private data. If private data is being used, an optional +// duplicator and free functions should also be specified in order to duplicate the LUT construct. Use NULL to inhibit such functionality. +void CMSEXPORT _cmsPipelineSetOptimizationParameters(cmsPipeline* Lut, + _cmsPipelineEval16Fn Eval16, + void* PrivateData, + _cmsFreeUserDataFn FreePrivateDataFn, + _cmsDupUserDataFn DupPrivateDataFn) +{ + + Lut ->Eval16Fn = Eval16; + Lut ->DupDataFn = DupPrivateDataFn; + Lut ->FreeDataFn = FreePrivateDataFn; + Lut ->Data = PrivateData; +} + + +// ----------------------------------------------------------- Reverse interpolation +// Here's how it goes. The derivative Df(x) of the function f is the linear +// transformation that best approximates f near the point x. It can be represented +// by a matrix A whose entries are the partial derivatives of the components of f +// with respect to all the coordinates. This is know as the Jacobian +// +// The best linear approximation to f is given by the matrix equation: +// +// y-y0 = A (x-x0) +// +// So, if x0 is a good "guess" for the zero of f, then solving for the zero of this +// linear approximation will give a "better guess" for the zero of f. Thus let y=0, +// and since y0=f(x0) one can solve the above equation for x. This leads to the +// Newton's method formula: +// +// xn+1 = xn - A-1 f(xn) +// +// where xn+1 denotes the (n+1)-st guess, obtained from the n-th guess xn in the +// fashion described above. Iterating this will give better and better approximations +// if you have a "good enough" initial guess. + + +#define JACOBIAN_EPSILON 0.001f +#define INVERSION_MAX_ITERATIONS 30 + +// Increment with reflexion on boundary +static +void IncDelta(cmsFloat32Number *Val) +{ + if (*Val < (1.0 - JACOBIAN_EPSILON)) + + *Val += JACOBIAN_EPSILON; + + else + *Val -= JACOBIAN_EPSILON; + +} + + + +// Euclidean distance between two vectors of n elements each one +static +cmsFloat32Number EuclideanDistance(cmsFloat32Number a[], cmsFloat32Number b[], int n) +{ + cmsFloat32Number sum = 0; + int i; + + for (i=0; i < n; i++) { + cmsFloat32Number dif = b[i] - a[i]; + sum += dif * dif; + } + + return sqrtf(sum); +} + + +// Evaluate a LUT in reverse direction. It only searches on 3->3 LUT. Uses Newton method +// +// x1 <- x - [J(x)]^-1 * f(x) +// +// lut: The LUT on where to do the search +// Target: LabK, 3 values of Lab plus destination K which is fixed +// Result: The obtained CMYK +// Hint: Location where begin the search + +cmsBool CMSEXPORT cmsPipelineEvalReverseFloat(cmsFloat32Number Target[], + cmsFloat32Number Result[], + cmsFloat32Number Hint[], + const cmsPipeline* lut) +{ + cmsUInt32Number i, j; + cmsFloat64Number error, LastError = 1E20; + cmsFloat32Number fx[4], x[4], xd[4], fxd[4]; + cmsVEC3 tmp, tmp2; + cmsMAT3 Jacobian; + + // Only 3->3 and 4->3 are supported + if (lut ->InputChannels != 3 && lut ->InputChannels != 4) return FALSE; + if (lut ->OutputChannels != 3) return FALSE; + + // Take the hint as starting point if specified + if (Hint == NULL) { + + // Begin at any point, we choose 1/3 of CMY axis + x[0] = x[1] = x[2] = 0.3f; + } + else { + + // Only copy 3 channels from hint... + for (j=0; j < 3; j++) + x[j] = Hint[j]; + } + + // If Lut is 4-dimensions, then grab target[3], which is fixed + if (lut ->InputChannels == 4) { + x[3] = Target[3]; + } + else x[3] = 0; // To keep lint happy + + + // Iterate + for (i = 0; i < INVERSION_MAX_ITERATIONS; i++) { + + // Get beginning fx + cmsPipelineEvalFloat(x, fx, lut); + + // Compute error + error = EuclideanDistance(fx, Target, 3); + + // If not convergent, return last safe value + if (error >= LastError) + break; + + // Keep latest values + LastError = error; + for (j=0; j < lut ->InputChannels; j++) + Result[j] = x[j]; + + // Found an exact match? + if (error <= 0) + break; + + // Obtain slope (the Jacobian) + for (j = 0; j < 3; j++) { + + xd[0] = x[0]; + xd[1] = x[1]; + xd[2] = x[2]; + xd[3] = x[3]; // Keep fixed channel + + IncDelta(&xd[j]); + + cmsPipelineEvalFloat(xd, fxd, lut); + + Jacobian.v[0].n[j] = ((fxd[0] - fx[0]) / JACOBIAN_EPSILON); + Jacobian.v[1].n[j] = ((fxd[1] - fx[1]) / JACOBIAN_EPSILON); + Jacobian.v[2].n[j] = ((fxd[2] - fx[2]) / JACOBIAN_EPSILON); + } + + // Solve system + tmp2.n[0] = fx[0] - Target[0]; + tmp2.n[1] = fx[1] - Target[1]; + tmp2.n[2] = fx[2] - Target[2]; + + if (!_cmsMAT3solve(&tmp, &Jacobian, &tmp2)) + return FALSE; + + // Move our guess + x[0] -= (cmsFloat32Number) tmp.n[0]; + x[1] -= (cmsFloat32Number) tmp.n[1]; + x[2] -= (cmsFloat32Number) tmp.n[2]; + + // Some clipping.... + for (j=0; j < 3; j++) { + if (x[j] < 0) x[j] = 0; + else + if (x[j] > 1.0) x[j] = 1.0; + } + } + + return TRUE; +} + + diff --git a/local/recipes/libs/lcms2/source/src/cmsmd5.c b/local/recipes/libs/lcms2/source/src/cmsmd5.c new file mode 100644 index 0000000000..b12f6168f4 --- /dev/null +++ b/local/recipes/libs/lcms2/source/src/cmsmd5.c @@ -0,0 +1,313 @@ +//--------------------------------------------------------------------------------- +// +// Little Color Management System +// Copyright (c) 1998-2026 Marti Maria Saguer +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//--------------------------------------------------------------------------------- + + +#include "lcms2_internal.h" + +#ifdef CMS_USE_BIG_ENDIAN + +static +void byteReverse(cmsUInt8Number * buf, cmsUInt32Number longs) +{ + do { + + cmsUInt32Number t = _cmsAdjustEndianess32(*(cmsUInt32Number *) buf); + *(cmsUInt32Number *) buf = t; + buf += sizeof(cmsUInt32Number); + + } while (--longs); + +} + +#else +#define byteReverse(buf, len) +#endif + + +typedef struct { + + cmsUInt32Number buf[4]; + cmsUInt32Number bits[2]; + cmsUInt8Number in[64]; + cmsContext ContextID; + +} _cmsMD5; + +#define F1(x, y, z) (z ^ (x & (y ^ z))) +#define F2(x, y, z) F1(z, x, y) +#define F3(x, y, z) (x ^ y ^ z) +#define F4(x, y, z) (y ^ (x | ~z)) + +#define STEP(f, w, x, y, z, data, s) \ + ( w += f(x, y, z) + data, w = w<>(32-s), w += x ) + + +static +void cmsMD5_Transform(cmsUInt32Number buf[4], cmsUInt32Number in[16]) +{ + CMSREGISTER cmsUInt32Number a, b, c, d; + + a = buf[0]; + b = buf[1]; + c = buf[2]; + d = buf[3]; + + STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7); + STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12); + STEP(F1, c, d, a, b, in[2] + 0x242070db, 17); + STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22); + STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7); + STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12); + STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17); + STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22); + STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7); + STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12); + STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17); + STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22); + STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7); + STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12); + STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17); + STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22); + + STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5); + STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9); + STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14); + STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20); + STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5); + STEP(F2, d, a, b, c, in[10] + 0x02441453, 9); + STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14); + STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20); + STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5); + STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9); + STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14); + STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20); + STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5); + STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9); + STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14); + STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20); + + STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4); + STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11); + STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16); + STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23); + STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4); + STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11); + STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16); + STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23); + STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4); + STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11); + STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16); + STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23); + STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4); + STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11); + STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16); + STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23); + + STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6); + STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10); + STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15); + STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21); + STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6); + STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10); + STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15); + STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21); + STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6); + STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10); + STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15); + STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21); + STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6); + STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10); + STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15); + STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21); + + buf[0] += a; + buf[1] += b; + buf[2] += c; + buf[3] += d; +} + + +// Create a MD5 object + +cmsHANDLE CMSEXPORT cmsMD5alloc(cmsContext ContextID) +{ + _cmsMD5* ctx = (_cmsMD5*) _cmsMallocZero(ContextID, sizeof(_cmsMD5)); + if (ctx == NULL) return NULL; + + ctx ->ContextID = ContextID; + + ctx->buf[0] = 0x67452301; + ctx->buf[1] = 0xefcdab89; + ctx->buf[2] = 0x98badcfe; + ctx->buf[3] = 0x10325476; + + ctx->bits[0] = 0; + ctx->bits[1] = 0; + + return (cmsHANDLE) ctx; +} + +void CMSEXPORT cmsMD5add(cmsHANDLE Handle, const cmsUInt8Number* buf, cmsUInt32Number len) +{ + _cmsMD5* ctx = (_cmsMD5*) Handle; + cmsUInt32Number t; + + t = ctx->bits[0]; + if ((ctx->bits[0] = t + (len << 3)) < t) + ctx->bits[1]++; + + ctx->bits[1] += len >> 29; + + t = (t >> 3) & 0x3f; + + if (t) { + + cmsUInt8Number *p = (cmsUInt8Number *) ctx->in + t; + + t = 64 - t; + if (len < t) { + memmove(p, buf, len); + return; + } + + memmove(p, buf, t); + byteReverse(ctx->in, 16); + + cmsMD5_Transform(ctx->buf, (cmsUInt32Number *) ctx->in); + buf += t; + len -= t; + } + + while (len >= 64) { + memmove(ctx->in, buf, 64); + byteReverse(ctx->in, 16); + cmsMD5_Transform(ctx->buf, (cmsUInt32Number *) ctx->in); + buf += 64; + len -= 64; + } + + memmove(ctx->in, buf, len); +} + +// Destroy the object and return the checksum +void CMSEXPORT cmsMD5finish(cmsProfileID* ProfileID, cmsHANDLE Handle) +{ + _cmsMD5* ctx = (_cmsMD5*) Handle; + cmsUInt32Number count; + cmsUInt8Number *p; + + count = (ctx->bits[0] >> 3) & 0x3F; + + p = ctx->in + count; + *p++ = 0x80; + + count = 64 - 1 - count; + + if (count < 8) { + + memset(p, 0, count); + byteReverse(ctx->in, 16); + cmsMD5_Transform(ctx->buf, (cmsUInt32Number *) ctx->in); + + memset(ctx->in, 0, 56); + } else { + memset(p, 0, count - 8); + } + byteReverse(ctx->in, 14); + + ((cmsUInt32Number *) ctx->in)[14] = ctx->bits[0]; + ((cmsUInt32Number *) ctx->in)[15] = ctx->bits[1]; + + cmsMD5_Transform(ctx->buf, (cmsUInt32Number *) ctx->in); + + byteReverse((cmsUInt8Number *) ctx->buf, 4); + memmove(ProfileID ->ID8, ctx->buf, 16); + + _cmsFree(ctx ->ContextID, ctx); +} + + + +// Assuming io points to an ICC profile, compute and store MD5 checksum +// In the header, rendering intentent, flags and ID should be set to zero +// before computing MD5 checksum (per 7.2.18 of ICC spec 4.4) + +cmsBool CMSEXPORT cmsMD5computeID(cmsHPROFILE hProfile) +{ + cmsContext ContextID; + cmsUInt32Number BytesNeeded; + cmsUInt8Number* Mem = NULL; + cmsHANDLE MD5 = NULL; + _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile; + _cmsICCPROFILE Keep; + + _cmsAssert(hProfile != NULL); + + ContextID = cmsGetProfileContextID(hProfile); + + // Save a copy of the profile header + memmove(&Keep, Icc, sizeof(_cmsICCPROFILE)); + + // Set RI, flags and ID + Icc ->flags = 0; + Icc ->RenderingIntent = 0; + memset(&Icc ->ProfileID, 0, sizeof(Icc ->ProfileID)); + + // Compute needed storage + if (!cmsSaveProfileToMem(hProfile, NULL, &BytesNeeded)) goto Error; + + // Allocate memory + Mem = (cmsUInt8Number*) _cmsMalloc(ContextID, BytesNeeded); + if (Mem == NULL) goto Error; + + // Save to temporary storage + if (!cmsSaveProfileToMem(hProfile, Mem, &BytesNeeded)) goto Error; + + // Create MD5 object + MD5 = cmsMD5alloc(ContextID); + if (MD5 == NULL) goto Error; + + // Add all bytes + cmsMD5add(MD5, Mem, BytesNeeded); + + // Temp storage is no longer needed + _cmsFree(ContextID, Mem); + + // Restore header + memmove(Icc, &Keep, sizeof(_cmsICCPROFILE)); + + // And store the ID + cmsMD5finish(&Icc ->ProfileID, MD5); + return TRUE; + +Error: + + // Free resources as something went wrong + // "MD5" cannot be other than NULL here, so no need to free it + if (Mem != NULL) _cmsFree(ContextID, Mem); + memmove(Icc, &Keep, sizeof(_cmsICCPROFILE)); + return FALSE; +} + diff --git a/local/recipes/libs/lcms2/source/src/cmsmtrx.c b/local/recipes/libs/lcms2/source/src/cmsmtrx.c new file mode 100644 index 0000000000..0eeed97b52 --- /dev/null +++ b/local/recipes/libs/lcms2/source/src/cmsmtrx.c @@ -0,0 +1,176 @@ +//--------------------------------------------------------------------------------- +// +// Little Color Management System +// Copyright (c) 1998-2026 Marti Maria Saguer +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//--------------------------------------------------------------------------------- +// + +#include "lcms2_internal.h" + + +#define DSWAP(x, y) {cmsFloat64Number tmp = (x); (x)=(y); (y)=tmp;} + + +// Initiate a vector +void CMSEXPORT _cmsVEC3init(cmsVEC3* r, cmsFloat64Number x, cmsFloat64Number y, cmsFloat64Number z) +{ + r -> n[VX] = x; + r -> n[VY] = y; + r -> n[VZ] = z; +} + +// Vector subtraction +void CMSEXPORT _cmsVEC3minus(cmsVEC3* r, const cmsVEC3* a, const cmsVEC3* b) +{ + r -> n[VX] = a -> n[VX] - b -> n[VX]; + r -> n[VY] = a -> n[VY] - b -> n[VY]; + r -> n[VZ] = a -> n[VZ] - b -> n[VZ]; +} + +// Vector cross product +void CMSEXPORT _cmsVEC3cross(cmsVEC3* r, const cmsVEC3* u, const cmsVEC3* v) +{ + r ->n[VX] = u->n[VY] * v->n[VZ] - v->n[VY] * u->n[VZ]; + r ->n[VY] = u->n[VZ] * v->n[VX] - v->n[VZ] * u->n[VX]; + r ->n[VZ] = u->n[VX] * v->n[VY] - v->n[VX] * u->n[VY]; +} + +// Vector dot product +cmsFloat64Number CMSEXPORT _cmsVEC3dot(const cmsVEC3* u, const cmsVEC3* v) +{ + return u->n[VX] * v->n[VX] + u->n[VY] * v->n[VY] + u->n[VZ] * v->n[VZ]; +} + +// Euclidean length +cmsFloat64Number CMSEXPORT _cmsVEC3length(const cmsVEC3* a) +{ + return sqrt(a ->n[VX] * a ->n[VX] + + a ->n[VY] * a ->n[VY] + + a ->n[VZ] * a ->n[VZ]); +} + +// Euclidean distance +cmsFloat64Number CMSEXPORT _cmsVEC3distance(const cmsVEC3* a, const cmsVEC3* b) +{ + cmsFloat64Number d1 = a ->n[VX] - b ->n[VX]; + cmsFloat64Number d2 = a ->n[VY] - b ->n[VY]; + cmsFloat64Number d3 = a ->n[VZ] - b ->n[VZ]; + + return sqrt(d1*d1 + d2*d2 + d3*d3); +} + + + +// 3x3 Identity +void CMSEXPORT _cmsMAT3identity(cmsMAT3* a) +{ + _cmsVEC3init(&a-> v[0], 1.0, 0.0, 0.0); + _cmsVEC3init(&a-> v[1], 0.0, 1.0, 0.0); + _cmsVEC3init(&a-> v[2], 0.0, 0.0, 1.0); +} + +static +cmsBool CloseEnough(cmsFloat64Number a, cmsFloat64Number b) +{ + return fabs(b - a) < (1.0 / 65535.0); +} + + +cmsBool CMSEXPORT _cmsMAT3isIdentity(const cmsMAT3* a) +{ + cmsMAT3 Identity; + int i, j; + + _cmsMAT3identity(&Identity); + + for (i=0; i < 3; i++) + for (j=0; j < 3; j++) + if (!CloseEnough(a ->v[i].n[j], Identity.v[i].n[j])) return FALSE; + + return TRUE; +} + + +// Multiply two matrices +void CMSEXPORT _cmsMAT3per(cmsMAT3* r, const cmsMAT3* a, const cmsMAT3* b) +{ +#define ROWCOL(i, j) \ + a->v[i].n[0]*b->v[0].n[j] + a->v[i].n[1]*b->v[1].n[j] + a->v[i].n[2]*b->v[2].n[j] + + _cmsVEC3init(&r-> v[0], ROWCOL(0,0), ROWCOL(0,1), ROWCOL(0,2)); + _cmsVEC3init(&r-> v[1], ROWCOL(1,0), ROWCOL(1,1), ROWCOL(1,2)); + _cmsVEC3init(&r-> v[2], ROWCOL(2,0), ROWCOL(2,1), ROWCOL(2,2)); + +#undef ROWCOL //(i, j) +} + + + +// Inverse of a matrix b = a^(-1) +cmsBool CMSEXPORT _cmsMAT3inverse(const cmsMAT3* a, cmsMAT3* b) +{ + cmsFloat64Number det, c0, c1, c2; + + c0 = a -> v[1].n[1]*a -> v[2].n[2] - a -> v[1].n[2]*a -> v[2].n[1]; + c1 = -a -> v[1].n[0]*a -> v[2].n[2] + a -> v[1].n[2]*a -> v[2].n[0]; + c2 = a -> v[1].n[0]*a -> v[2].n[1] - a -> v[1].n[1]*a -> v[2].n[0]; + + det = a -> v[0].n[0]*c0 + a -> v[0].n[1]*c1 + a -> v[0].n[2]*c2; + + if (fabs(det) < MATRIX_DET_TOLERANCE) return FALSE; // singular matrix; can't invert + + b -> v[0].n[0] = c0/det; + b -> v[0].n[1] = (a -> v[0].n[2]*a -> v[2].n[1] - a -> v[0].n[1]*a -> v[2].n[2])/det; + b -> v[0].n[2] = (a -> v[0].n[1]*a -> v[1].n[2] - a -> v[0].n[2]*a -> v[1].n[1])/det; + b -> v[1].n[0] = c1/det; + b -> v[1].n[1] = (a -> v[0].n[0]*a -> v[2].n[2] - a -> v[0].n[2]*a -> v[2].n[0])/det; + b -> v[1].n[2] = (a -> v[0].n[2]*a -> v[1].n[0] - a -> v[0].n[0]*a -> v[1].n[2])/det; + b -> v[2].n[0] = c2/det; + b -> v[2].n[1] = (a -> v[0].n[1]*a -> v[2].n[0] - a -> v[0].n[0]*a -> v[2].n[1])/det; + b -> v[2].n[2] = (a -> v[0].n[0]*a -> v[1].n[1] - a -> v[0].n[1]*a -> v[1].n[0])/det; + + return TRUE; +} + + +// Solve a system in the form Ax = b +cmsBool CMSEXPORT _cmsMAT3solve(cmsVEC3* x, cmsMAT3* a, cmsVEC3* b) +{ + cmsMAT3 m, a_1; + + memmove(&m, a, sizeof(cmsMAT3)); + + if (!_cmsMAT3inverse(&m, &a_1)) return FALSE; // Singular matrix + + _cmsMAT3eval(x, &a_1, b); + return TRUE; +} + +// Evaluate a vector across a matrix +void CMSEXPORT _cmsMAT3eval(cmsVEC3* r, const cmsMAT3* a, const cmsVEC3* v) +{ + r->n[VX] = a->v[0].n[VX]*v->n[VX] + a->v[0].n[VY]*v->n[VY] + a->v[0].n[VZ]*v->n[VZ]; + r->n[VY] = a->v[1].n[VX]*v->n[VX] + a->v[1].n[VY]*v->n[VY] + a->v[1].n[VZ]*v->n[VZ]; + r->n[VZ] = a->v[2].n[VX]*v->n[VX] + a->v[2].n[VY]*v->n[VY] + a->v[2].n[VZ]*v->n[VZ]; +} + + diff --git a/local/recipes/libs/lcms2/source/src/cmsnamed.c b/local/recipes/libs/lcms2/source/src/cmsnamed.c new file mode 100644 index 0000000000..72887b7a40 --- /dev/null +++ b/local/recipes/libs/lcms2/source/src/cmsnamed.c @@ -0,0 +1,1210 @@ +//--------------------------------------------------------------------------------- +// +// Little Color Management System +// Copyright (c) 1998-2026 Marti Maria Saguer +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//--------------------------------------------------------------------------------- +// + +#include "lcms2_internal.h" + +// Multilocalized unicode objects. That is an attempt to encapsulate i18n. + + +// Allocates an empty multi localizad unicode object +cmsMLU* CMSEXPORT cmsMLUalloc(cmsContext ContextID, cmsUInt32Number nItems) +{ + cmsMLU* mlu; + + // nItems should be positive if given + if (nItems <= 0) nItems = 2; + + // Create the container + mlu = (cmsMLU*) _cmsMallocZero(ContextID, sizeof(cmsMLU)); + if (mlu == NULL) return NULL; + + mlu ->ContextID = ContextID; + + // Create entry array + mlu ->Entries = (_cmsMLUentry*) _cmsCalloc(ContextID, nItems, sizeof(_cmsMLUentry)); + if (mlu ->Entries == NULL) { + _cmsFree(ContextID, mlu); + return NULL; + } + + // Ok, keep indexes up to date + mlu ->AllocatedEntries = nItems; + mlu ->UsedEntries = 0; + + return mlu; +} + + +// Grows a mempool table for a MLU. Each time this function is called, mempool size is multiplied times two. +static +cmsBool GrowMLUpool(cmsMLU* mlu) +{ + cmsUInt32Number size; + void *NewPtr; + + // Sanity check + if (mlu == NULL) return FALSE; + + if (mlu ->PoolSize == 0) + size = 256; + else + size = mlu ->PoolSize * 2; + + // Check for overflow + if (size < mlu ->PoolSize) return FALSE; + + // Reallocate the pool + NewPtr = _cmsRealloc(mlu ->ContextID, mlu ->MemPool, size); + if (NewPtr == NULL) return FALSE; + + + mlu ->MemPool = NewPtr; + mlu ->PoolSize = size; + + return TRUE; +} + +// Grows a entry table for a MLU. Each time this function is called, table size is multiplied times two. +// No need to check integer overflow since that is 2*16*count = 2^32-1 ; => count = 128 M entries, +// That would be 2Gb, which is over MAX_MEMORY_FOR_ALLOC, even for large file size. +// I added this check to silence the continuous spam reports of people using AI to catch what +// they think are "vulnerabilities". +static +cmsBool GrowMLUtable(cmsMLU* mlu) +{ + cmsUInt32Number AllocatedEntries; + _cmsMLUentry *NewPtr; + + // Sanity check + if (mlu == NULL) return FALSE; + + AllocatedEntries = mlu ->AllocatedEntries * 2; + + // Check for overflow in count doubling: if wrapped, result < original + if (AllocatedEntries < mlu->AllocatedEntries) return FALSE; + + // Check for overflow in byte-size multiplication: + // dividing back by sizeof must recover the original count + if ((AllocatedEntries * sizeof(_cmsMLUentry)) / sizeof(_cmsMLUentry) != AllocatedEntries) return FALSE; + + // Reallocate the memory + NewPtr = (_cmsMLUentry*)_cmsRealloc(mlu ->ContextID, mlu ->Entries, AllocatedEntries*sizeof(_cmsMLUentry)); + if (NewPtr == NULL) return FALSE; + + mlu ->Entries = NewPtr; + mlu ->AllocatedEntries = AllocatedEntries; + + return TRUE; +} + + +// Search for a specific entry in the structure. Language and Country are used. +static +int SearchMLUEntry(cmsMLU* mlu, cmsUInt16Number LanguageCode, cmsUInt16Number CountryCode) +{ + cmsUInt32Number i; + + // Sanity check + if (mlu == NULL) return -1; + + // Iterate whole table + for (i=0; i < mlu ->UsedEntries; i++) { + + if (mlu ->Entries[i].Country == CountryCode && + mlu ->Entries[i].Language == LanguageCode) return (int) i; + } + + // Not found + return -1; +} + +// Add a block of characters to the intended MLU. Language and country are specified. +// Only one entry for Language/country pair is allowed. +static +cmsBool AddMLUBlock(cmsMLU* mlu, cmsUInt32Number size, const wchar_t *Block, + cmsUInt16Number LanguageCode, cmsUInt16Number CountryCode) +{ + cmsUInt32Number Offset; + cmsUInt8Number* Ptr; + + // Sanity check + if (mlu == NULL) return FALSE; + + // Is there any room available? + if (mlu ->UsedEntries >= mlu ->AllocatedEntries) { + if (!GrowMLUtable(mlu)) return FALSE; + } + + // Only one ASCII string + if (SearchMLUEntry(mlu, LanguageCode, CountryCode) >= 0) return FALSE; // Only one is allowed! + + // Check for size + while ((mlu ->PoolSize - mlu ->PoolUsed) < size) { + + if (!GrowMLUpool(mlu)) return FALSE; + } + + Offset = mlu ->PoolUsed; + + Ptr = (cmsUInt8Number*) mlu ->MemPool; + if (Ptr == NULL) return FALSE; + + // Set the entry + memmove(Ptr + Offset, Block, size); + mlu ->PoolUsed += size; + + mlu ->Entries[mlu ->UsedEntries].StrW = Offset; + mlu ->Entries[mlu ->UsedEntries].Len = size; + mlu ->Entries[mlu ->UsedEntries].Country = CountryCode; + mlu ->Entries[mlu ->UsedEntries].Language = LanguageCode; + mlu ->UsedEntries++; + + return TRUE; +} + +// Convert from a 3-char code to a cmsUInt16Number. It is done in this way because some +// compilers don't properly align beginning of strings +static +cmsUInt16Number strTo16(const char str[3]) +{ + const cmsUInt8Number* ptr8; + cmsUInt16Number n; + + // For non-existent strings + if (str == NULL) return 0; + ptr8 = (const cmsUInt8Number*)str; + n = (cmsUInt16Number)(((cmsUInt16Number)ptr8[0] << 8) | ptr8[1]); + + return n; +} + +static +void strFrom16(char str[3], cmsUInt16Number n) +{ + str[0] = (char)(n >> 8); + str[1] = (char)n; + str[2] = (char)0; +} + + +// Convert from UTF8 to wchar, returns len. +static +cmsUInt32Number decodeUTF8(wchar_t* out, const char* in) +{ + cmsUInt32Number codepoint = 0; + cmsUInt32Number size = 0; + + while (*in) + { + cmsUInt8Number ch = (cmsUInt8Number) *in; + + if (ch <= 0x7f) + { + codepoint = ch; + } + else if (ch <= 0xbf) + { + codepoint = (codepoint << 6) | (ch & 0x3f); + } + else if (ch <= 0xdf) + { + codepoint = ch & 0x1f; + } + else if (ch <= 0xef) + { + codepoint = ch & 0x0f; + } + else + { + codepoint = ch & 0x07; + } + + in++; + + if (((*in & 0xc0) != 0x80) && (codepoint <= 0x10ffff)) + { + if (sizeof(wchar_t) > 2) + { + if (out) *out++ = (wchar_t) codepoint; + size++; + } + else + if (codepoint > 0xffff) + { + if (out) + { + *out++ = (wchar_t)(0xd800 + (codepoint >> 10)); + *out++ = (wchar_t)(0xdc00 + (codepoint & 0x03ff)); + size += 2; + } + } + else + if (codepoint < 0xd800 || codepoint >= 0xe000) + { + if (out) *out++ = (wchar_t) codepoint; + size++; + } + } + } + + return size; +} + +// Convert from wchar_t to UTF8 +static +cmsUInt32Number encodeUTF8(char* out, const wchar_t* in, cmsUInt32Number max_wchars, cmsUInt32Number max_chars) +{ + cmsUInt32Number codepoint = 0; + cmsUInt32Number size = 0; + cmsUInt32Number len_w = 0; + + while (len_w < max_wchars && *in) + { + if (*in >= 0xd800 && *in <= 0xdbff) + codepoint = ((*in - 0xd800) << 10) + 0x10000; + else + { + if (*in >= 0xdc00 && *in <= 0xdfff) + codepoint |= *in - 0xdc00; + else + codepoint = *in; + + if (codepoint <= 0x7f) + { + if (out && (size + 1 < max_chars)) *out++ = (char)codepoint; + size++; + } + + else if (codepoint <= 0x7ff) + { + if (out && (max_chars > 0) && (size + 2 < max_chars)) + { + *out++ = (char)(cmsUInt32Number)(0xc0 | ((codepoint >> 6) & 0x1f)); + *out++ = (char)(cmsUInt32Number)(0x80 | (codepoint & 0x3f)); + } + size += 2; + } + else if (codepoint <= 0xffff) + { + if (out && (max_chars > 0) && (size + 3 < max_chars)) + { + *out++ = (char)(cmsUInt32Number)(0xe0 | ((codepoint >> 12) & 0x0f)); + *out++ = (char)(cmsUInt32Number)(0x80 | ((codepoint >> 6) & 0x3f)); + *out++ = (char)(cmsUInt32Number)(0x80 | (codepoint & 0x3f)); + } + size += 3; + } + else + { + if (out && (max_chars > 0) && (size + 4 < max_chars)) + { + *out++ = (char)(cmsUInt32Number)(0xf0 | ((codepoint >> 18) & 0x07)); + *out++ = (char)(cmsUInt32Number)(0x80 | ((codepoint >> 12) & 0x3f)); + *out++ = (char)(cmsUInt32Number)(0x80 | ((codepoint >> 6) & 0x3f)); + *out++ = (char)(cmsUInt32Number)(0x80 | (codepoint & 0x3f)); + } + size += 4; + } + + codepoint = 0; + } + + in++; len_w++; + } + + return size; +} + +// Add an ASCII entry. Do not add any \0 termination (ICC1v43_2010-12.pdf page 61) +// In the case the user explicitly sets an empty string, we force a \0 +cmsBool CMSEXPORT cmsMLUsetASCII(cmsMLU* mlu, const char LanguageCode[3], const char CountryCode[3], const char* ASCIIString) +{ + cmsUInt32Number i, len = (cmsUInt32Number)strlen(ASCIIString); + wchar_t* WStr; + cmsBool rc; + cmsUInt16Number Lang = strTo16(LanguageCode); + cmsUInt16Number Cntry = strTo16(CountryCode); + + if (mlu == NULL) return FALSE; + + // len == 0 would prevent operation, so we set a empty string pointing to zero + if (len == 0) + { + wchar_t empty = 0; + return AddMLUBlock(mlu, sizeof(wchar_t), &empty, Lang, Cntry); + } + + WStr = (wchar_t*)_cmsCalloc(mlu->ContextID, len, sizeof(wchar_t)); + if (WStr == NULL) return FALSE; + + for (i = 0; i < len; i++) + WStr[i] = (wchar_t)ASCIIString[i]; + + rc = AddMLUBlock(mlu, len * sizeof(wchar_t), WStr, Lang, Cntry); + + _cmsFree(mlu->ContextID, WStr); + return rc; + +} + +// Add an UTF8 entry. Do not add any \0 termination (ICC1v43_2010-12.pdf page 61) +// In the case the user explicitly sets an empty string, we force a \0 +cmsBool CMSEXPORT cmsMLUsetUTF8(cmsMLU* mlu, const char LanguageCode[3], const char CountryCode[3], const char* UTF8String) +{ + cmsUInt32Number UTF8len; + wchar_t* WStr; + cmsBool rc; + cmsUInt16Number Lang = strTo16(LanguageCode); + cmsUInt16Number Cntry = strTo16(CountryCode); + + if (mlu == NULL) return FALSE; + + if (*UTF8String == '\0') + { + wchar_t empty = 0; + return AddMLUBlock(mlu, sizeof(wchar_t), &empty, Lang, Cntry); + } + + // Len excluding terminator 0 + UTF8len = decodeUTF8(NULL, UTF8String); + + // Get space for dest + WStr = (wchar_t*) _cmsCalloc(mlu ->ContextID, UTF8len, sizeof(wchar_t)); + if (WStr == NULL) return FALSE; + + decodeUTF8(WStr, UTF8String); + + rc = AddMLUBlock(mlu, UTF8len * sizeof(wchar_t), WStr, Lang, Cntry); + + _cmsFree(mlu ->ContextID, WStr); + return rc; +} + +// We don't need any wcs support library +static +cmsUInt32Number mywcslen(const wchar_t *s) +{ + const wchar_t *p; + + p = s; + while (*p) + p++; + + return (cmsUInt32Number)(p - s); +} + +// Add a wide entry. Do not add any \0 terminator (ICC1v43_2010-12.pdf page 61) +cmsBool CMSEXPORT cmsMLUsetWide(cmsMLU* mlu, const char Language[3], const char Country[3], const wchar_t* WideString) +{ + cmsUInt16Number Lang = strTo16(Language); + cmsUInt16Number Cntry = strTo16(Country); + cmsUInt32Number len; + + if (mlu == NULL) return FALSE; + if (WideString == NULL) return FALSE; + + len = (cmsUInt32Number) (mywcslen(WideString)) * sizeof(wchar_t); + if (len == 0) + len = sizeof(wchar_t); + + return AddMLUBlock(mlu, len, WideString, Lang, Cntry); +} + +// Duplicating a MLU is as easy as copying all members +cmsMLU* CMSEXPORT cmsMLUdup(const cmsMLU* mlu) +{ + cmsMLU* NewMlu = NULL; + + // Duplicating a NULL obtains a NULL + if (mlu == NULL) return NULL; + + NewMlu = cmsMLUalloc(mlu ->ContextID, mlu ->UsedEntries); + if (NewMlu == NULL) return NULL; + + // Should never happen + if (NewMlu ->AllocatedEntries < mlu ->UsedEntries) + goto Error; + + // Sanitize... + if (NewMlu ->Entries == NULL || mlu ->Entries == NULL) goto Error; + + memmove(NewMlu ->Entries, mlu ->Entries, mlu ->UsedEntries * sizeof(_cmsMLUentry)); + NewMlu ->UsedEntries = mlu ->UsedEntries; + + // The MLU may be empty + if (mlu ->PoolUsed == 0) { + NewMlu ->MemPool = NULL; + } + else { + // It is not empty + NewMlu ->MemPool = _cmsMalloc(mlu ->ContextID, mlu ->PoolUsed); + if (NewMlu ->MemPool == NULL) goto Error; + } + + NewMlu ->PoolSize = mlu ->PoolUsed; + + if (NewMlu ->MemPool == NULL || mlu ->MemPool == NULL) goto Error; + + memmove(NewMlu ->MemPool, mlu->MemPool, mlu ->PoolUsed); + NewMlu ->PoolUsed = mlu ->PoolUsed; + + return NewMlu; + +Error: + + if (NewMlu != NULL) cmsMLUfree(NewMlu); + return NULL; +} + +// Free any used memory +void CMSEXPORT cmsMLUfree(cmsMLU* mlu) +{ + if (mlu) { + + if (mlu -> Entries) _cmsFree(mlu ->ContextID, mlu->Entries); + if (mlu -> MemPool) _cmsFree(mlu ->ContextID, mlu->MemPool); + + _cmsFree(mlu ->ContextID, mlu); + } +} + + +// The algorithm first searches for an exact match of country and language, if not found it uses +// the Language. If none is found, first entry is used instead. +static +const wchar_t* _cmsMLUgetWide(const cmsMLU* mlu, + cmsUInt32Number *len, + cmsUInt16Number LanguageCode, cmsUInt16Number CountryCode, + cmsUInt16Number* UsedLanguageCode, cmsUInt16Number* UsedCountryCode) +{ + cmsUInt32Number i; + int Best = -1; + _cmsMLUentry* v; + + if (mlu == NULL) return NULL; + + if (mlu -> AllocatedEntries <= 0) return NULL; + + for (i=0; i < mlu ->UsedEntries; i++) { + + v = mlu ->Entries + i; + + if (v -> Language == LanguageCode) { + + if (Best == -1) Best = (int) i; + + if (v -> Country == CountryCode) { + + if (UsedLanguageCode != NULL) *UsedLanguageCode = v ->Language; + if (UsedCountryCode != NULL) *UsedCountryCode = v ->Country; + + if (len != NULL) *len = v ->Len; + + return (wchar_t*) ((cmsUInt8Number*) mlu ->MemPool + v -> StrW); // Found exact match + } + } + } + + // No string found. Return First one + if (Best == -1) + Best = 0; + + v = mlu ->Entries + Best; + + if (UsedLanguageCode != NULL) *UsedLanguageCode = v ->Language; + if (UsedCountryCode != NULL) *UsedCountryCode = v ->Country; + + if (len != NULL) *len = v ->Len; + + if (v->StrW + v->Len > mlu->PoolSize) return NULL; + + return (wchar_t*) ((cmsUInt8Number*) mlu ->MemPool + v ->StrW); +} + + +// Obtain an ASCII representation of the wide string. Setting buffer to NULL returns the len +cmsUInt32Number CMSEXPORT cmsMLUgetASCII(const cmsMLU* mlu, + const char LanguageCode[3], const char CountryCode[3], + char* Buffer, cmsUInt32Number BufferSize) +{ + const wchar_t *Wide; + cmsUInt32Number StrLen = 0; + cmsUInt32Number ASCIIlen, i; + + cmsUInt16Number Lang = strTo16(LanguageCode); + cmsUInt16Number Cntry = strTo16(CountryCode); + + // Sanitize + if (mlu == NULL) return 0; + + // Get WideChar + Wide = _cmsMLUgetWide(mlu, &StrLen, Lang, Cntry, NULL, NULL); + if (Wide == NULL) return 0; + + ASCIIlen = StrLen / sizeof(wchar_t); + + // Maybe we want only to know the len? + if (Buffer == NULL) return ASCIIlen + 1; // Note the zero at the end + + // No buffer size means no data + if (BufferSize <= 0) return 0; + + // Some clipping may be required + if (BufferSize < ASCIIlen + 1) + ASCIIlen = BufferSize - 1; + + // Process each character + for (i=0; i < ASCIIlen; i++) { + + wchar_t wc = Wide[i]; + + if (wc < 0xff) + Buffer[i] = (char)wc; + else + Buffer[i] = '?'; + } + + // We put a termination "\0" + Buffer[ASCIIlen] = 0; + return ASCIIlen + 1; +} + + +// Obtain a UTF8 representation of the wide string. Setting buffer to NULL returns the len +cmsUInt32Number CMSEXPORT cmsMLUgetUTF8(const cmsMLU* mlu, + const char LanguageCode[3], const char CountryCode[3], + char* Buffer, cmsUInt32Number BufferSize) +{ + const wchar_t *Wide; + cmsUInt32Number StrLen = 0; + cmsUInt32Number UTF8len; + + cmsUInt16Number Lang = strTo16(LanguageCode); + cmsUInt16Number Cntry = strTo16(CountryCode); + + // Sanitize + if (mlu == NULL) return 0; + + // Get WideChar + Wide = _cmsMLUgetWide(mlu, &StrLen, Lang, Cntry, NULL, NULL); + if (Wide == NULL) return 0; + + UTF8len = encodeUTF8(NULL, Wide, StrLen / sizeof(wchar_t), BufferSize); + + // Maybe we want only to know the len? + if (Buffer == NULL) return UTF8len + 1; // Note the zero at the end + + // No buffer size means no data + if (BufferSize <= 0) return 0; + + // Some clipping may be required + if (BufferSize < UTF8len + 1) + UTF8len = BufferSize - 1; + + // Process it + encodeUTF8(Buffer, Wide, StrLen / sizeof(wchar_t), BufferSize); + + // We put a termination "\0" + Buffer[UTF8len] = 0; + return UTF8len + 1; +} + +// Obtain a wide representation of the MLU, on depending on current locale settings +cmsUInt32Number CMSEXPORT cmsMLUgetWide(const cmsMLU* mlu, + const char LanguageCode[3], const char CountryCode[3], + wchar_t* Buffer, cmsUInt32Number BufferSize) +{ + const wchar_t *Wide; + cmsUInt32Number StrLen = 0; + + cmsUInt16Number Lang = strTo16(LanguageCode); + cmsUInt16Number Cntry = strTo16(CountryCode); + + // Sanitize + if (mlu == NULL) return 0; + + Wide = _cmsMLUgetWide(mlu, &StrLen, Lang, Cntry, NULL, NULL); + if (Wide == NULL) return 0; + + // Maybe we want only to know the len? + if (Buffer == NULL) return StrLen + sizeof(wchar_t); + + // Invalid buffer size means no data + if (BufferSize < sizeof(wchar_t)) return 0; + + // Some clipping may be required + if (BufferSize < StrLen + sizeof(wchar_t)) + StrLen = BufferSize - sizeof(wchar_t); + + memmove(Buffer, Wide, StrLen); + Buffer[StrLen / sizeof(wchar_t)] = 0; + + return StrLen + sizeof(wchar_t); +} + + +// Get also the language and country +CMSAPI cmsBool CMSEXPORT cmsMLUgetTranslation(const cmsMLU* mlu, + const char LanguageCode[3], const char CountryCode[3], + char ObtainedLanguage[3], char ObtainedCountry[3]) +{ + const wchar_t *Wide; + + cmsUInt16Number Lang = strTo16(LanguageCode); + cmsUInt16Number Cntry = strTo16(CountryCode); + cmsUInt16Number ObtLang, ObtCode; + + // Sanitize + if (mlu == NULL) return FALSE; + + Wide = _cmsMLUgetWide(mlu, NULL, Lang, Cntry, &ObtLang, &ObtCode); + if (Wide == NULL) return FALSE; + + // Get used language and code + strFrom16(ObtainedLanguage, ObtLang); + strFrom16(ObtainedCountry, ObtCode); + + return TRUE; +} + + + +// Get the number of translations in the MLU object +cmsUInt32Number CMSEXPORT cmsMLUtranslationsCount(const cmsMLU* mlu) +{ + if (mlu == NULL) return 0; + return mlu->UsedEntries; +} + +// Get the language and country codes for a specific MLU index +cmsBool CMSEXPORT cmsMLUtranslationsCodes(const cmsMLU* mlu, + cmsUInt32Number idx, + char LanguageCode[3], + char CountryCode[3]) +{ + _cmsMLUentry *entry; + + if (mlu == NULL) return FALSE; + + if (idx >= mlu->UsedEntries) return FALSE; + + entry = &mlu->Entries[idx]; + + strFrom16(LanguageCode, entry->Language); + strFrom16(CountryCode, entry->Country); + + return TRUE; +} + + +// Named color lists -------------------------------------------------------------------------------------------- + +// Grow the list to keep at least NumElements +static +cmsBool GrowNamedColorList(cmsNAMEDCOLORLIST* v) +{ + cmsUInt32Number size; + _cmsNAMEDCOLOR * NewPtr; + + if (v == NULL) return FALSE; + + if (v ->Allocated == 0) + size = 64; // Initial guess + else + size = v ->Allocated * 2; + + // Keep a maximum color lists can grow, 100K entries seems reasonable + if (size > 1024 * 100) { + _cmsFree(v->ContextID, (void*) v->List); + v->List = NULL; + return FALSE; + } + + NewPtr = (_cmsNAMEDCOLOR*) _cmsRealloc(v ->ContextID, v ->List, size * sizeof(_cmsNAMEDCOLOR)); + if (NewPtr == NULL) + return FALSE; + + v ->List = NewPtr; + v ->Allocated = size; + return TRUE; +} + +// Allocate a list for n elements +cmsNAMEDCOLORLIST* CMSEXPORT cmsAllocNamedColorList(cmsContext ContextID, cmsUInt32Number n, cmsUInt32Number ColorantCount, const char* Prefix, const char* Suffix) +{ + cmsNAMEDCOLORLIST* v; + + if (ColorantCount > cmsMAXCHANNELS) + return NULL; + + v = (cmsNAMEDCOLORLIST*)_cmsMallocZero(ContextID, sizeof(cmsNAMEDCOLORLIST)); + if (v == NULL) return NULL; + + v ->List = NULL; + v ->nColors = 0; + v ->ContextID = ContextID; + + while (v -> Allocated < n) { + if (!GrowNamedColorList(v)) { + cmsFreeNamedColorList(v); + return NULL; + } + } + + strncpy(v ->Prefix, Prefix, sizeof(v ->Prefix)-1); + strncpy(v ->Suffix, Suffix, sizeof(v ->Suffix)-1); + v->Prefix[32] = v->Suffix[32] = 0; + + v -> ColorantCount = ColorantCount; + + return v; +} + +// Free a list +void CMSEXPORT cmsFreeNamedColorList(cmsNAMEDCOLORLIST* v) +{ + if (v == NULL) return; + if (v ->List) _cmsFree(v ->ContextID, v ->List); + _cmsFree(v ->ContextID, v); +} + +cmsNAMEDCOLORLIST* CMSEXPORT cmsDupNamedColorList(const cmsNAMEDCOLORLIST* v) +{ + cmsNAMEDCOLORLIST* NewNC; + + if (v == NULL) return NULL; + + NewNC= cmsAllocNamedColorList(v ->ContextID, v -> nColors, v ->ColorantCount, v ->Prefix, v ->Suffix); + if (NewNC == NULL) return NULL; + + // For really large tables we need this + while (NewNC ->Allocated < v ->Allocated){ + if (!GrowNamedColorList(NewNC)) + { + cmsFreeNamedColorList(NewNC); + return NULL; + } + } + + memmove(NewNC ->Prefix, v ->Prefix, sizeof(v ->Prefix)); + memmove(NewNC ->Suffix, v ->Suffix, sizeof(v ->Suffix)); + NewNC ->ColorantCount = v ->ColorantCount; + if (v->nColors > 0) + memmove(NewNC->List, v ->List, v->nColors * sizeof(_cmsNAMEDCOLOR)); + NewNC ->nColors = v ->nColors; + return NewNC; +} + + +// Append a color to a list. List pointer may change if reallocated +cmsBool CMSEXPORT cmsAppendNamedColor(cmsNAMEDCOLORLIST* NamedColorList, + const char* Name, + cmsUInt16Number PCS[3], cmsUInt16Number Colorant[cmsMAXCHANNELS]) +{ + cmsUInt32Number i; + + if (NamedColorList == NULL) return FALSE; + + if (NamedColorList ->nColors + 1 > NamedColorList ->Allocated) { + if (!GrowNamedColorList(NamedColorList)) return FALSE; + } + + for (i=0; i < NamedColorList ->ColorantCount; i++) + NamedColorList ->List[NamedColorList ->nColors].DeviceColorant[i] = Colorant == NULL ? (cmsUInt16Number)0 : Colorant[i]; + + for (i=0; i < 3; i++) + NamedColorList ->List[NamedColorList ->nColors].PCS[i] = PCS == NULL ? (cmsUInt16Number) 0 : PCS[i]; + + if (Name != NULL) { + + strncpy(NamedColorList ->List[NamedColorList ->nColors].Name, Name, cmsMAX_PATH-1); + NamedColorList ->List[NamedColorList ->nColors].Name[cmsMAX_PATH-1] = 0; + + } + else + NamedColorList ->List[NamedColorList ->nColors].Name[0] = 0; + + + NamedColorList ->nColors++; + return TRUE; +} + +// Returns number of elements +cmsUInt32Number CMSEXPORT cmsNamedColorCount(const cmsNAMEDCOLORLIST* NamedColorList) +{ + if (NamedColorList == NULL) return 0; + return NamedColorList ->nColors; +} + +// Info about a given color +cmsBool CMSEXPORT cmsNamedColorInfo(const cmsNAMEDCOLORLIST* NamedColorList, cmsUInt32Number nColor, + char* Name, + char* Prefix, + char* Suffix, + cmsUInt16Number* PCS, + cmsUInt16Number* Colorant) +{ + if (NamedColorList == NULL) return FALSE; + + if (nColor >= cmsNamedColorCount(NamedColorList)) return FALSE; + + // strcpy instead of strncpy because many apps are using small buffers + if (Name) strcpy(Name, NamedColorList->List[nColor].Name); + if (Prefix) strcpy(Prefix, NamedColorList->Prefix); + if (Suffix) strcpy(Suffix, NamedColorList->Suffix); + if (PCS) + memmove(PCS, NamedColorList ->List[nColor].PCS, 3*sizeof(cmsUInt16Number)); + + if (Colorant) + memmove(Colorant, NamedColorList ->List[nColor].DeviceColorant, + sizeof(cmsUInt16Number) * NamedColorList ->ColorantCount); + + + return TRUE; +} + +// Search for a given color name (no prefix or suffix) +cmsInt32Number CMSEXPORT cmsNamedColorIndex(const cmsNAMEDCOLORLIST* NamedColorList, const char* Name) +{ + cmsUInt32Number i; + cmsUInt32Number n; + + if (NamedColorList == NULL) return -1; + n = cmsNamedColorCount(NamedColorList); + for (i=0; i < n; i++) { + if (cmsstrcasecmp(Name, NamedColorList->List[i].Name) == 0) + return (cmsInt32Number) i; + } + + return -1; +} + +// MPE support ----------------------------------------------------------------------------------------------------------------- + +static +void FreeNamedColorList(cmsStage* mpe) +{ + cmsNAMEDCOLORLIST* List = (cmsNAMEDCOLORLIST*) mpe ->Data; + cmsFreeNamedColorList(List); +} + +static +void* DupNamedColorList(cmsStage* mpe) +{ + cmsNAMEDCOLORLIST* List = (cmsNAMEDCOLORLIST*) mpe ->Data; + return cmsDupNamedColorList(List); +} + +static +void EvalNamedColorPCS(const cmsFloat32Number In[], cmsFloat32Number Out[], const cmsStage *mpe) +{ + cmsNAMEDCOLORLIST* NamedColorList = (cmsNAMEDCOLORLIST*) mpe ->Data; + cmsUInt16Number index = (cmsUInt16Number) _cmsQuickSaturateWord(In[0] * 65535.0); + + if (index >= NamedColorList-> nColors) { + cmsSignalError(NamedColorList ->ContextID, cmsERROR_RANGE, "Color %d out of range", index); + Out[0] = Out[1] = Out[2] = 0.0f; + } + else { + + // Named color always uses Lab + Out[0] = (cmsFloat32Number) (NamedColorList->List[index].PCS[0] / 65535.0); + Out[1] = (cmsFloat32Number) (NamedColorList->List[index].PCS[1] / 65535.0); + Out[2] = (cmsFloat32Number) (NamedColorList->List[index].PCS[2] / 65535.0); + } +} + +static +void EvalNamedColor(const cmsFloat32Number In[], cmsFloat32Number Out[], const cmsStage *mpe) +{ + cmsNAMEDCOLORLIST* NamedColorList = (cmsNAMEDCOLORLIST*) mpe ->Data; + cmsUInt16Number index = (cmsUInt16Number) _cmsQuickSaturateWord(In[0] * 65535.0); + cmsUInt32Number j; + + if (index >= NamedColorList-> nColors) { + cmsSignalError(NamedColorList ->ContextID, cmsERROR_RANGE, "Color %d out of range", index); + for (j = 0; j < NamedColorList->ColorantCount; j++) + Out[j] = 0.0f; + + } + else { + for (j=0; j < NamedColorList ->ColorantCount; j++) + Out[j] = (cmsFloat32Number) (NamedColorList->List[index].DeviceColorant[j] / 65535.0); + } +} + + +// Named color lookup element +cmsStage* CMSEXPORT _cmsStageAllocNamedColor(cmsNAMEDCOLORLIST* NamedColorList, cmsBool UsePCS) +{ + return _cmsStageAllocPlaceholder(NamedColorList ->ContextID, + cmsSigNamedColorElemType, + 1, UsePCS ? 3 : NamedColorList ->ColorantCount, + UsePCS ? EvalNamedColorPCS : EvalNamedColor, + DupNamedColorList, + FreeNamedColorList, + cmsDupNamedColorList(NamedColorList)); + +} + + +// Retrieve the named color list from a transform. Should be first element in the LUT +cmsNAMEDCOLORLIST* CMSEXPORT cmsGetNamedColorList(cmsHTRANSFORM xform) +{ + _cmsTRANSFORM* v = (_cmsTRANSFORM*) xform; + cmsStage* mpe; + + if (v == NULL) return NULL; + if (v->Lut == NULL) return NULL; + + mpe = v->Lut->Elements; + if (mpe == NULL) return NULL; + + if (mpe ->Type != cmsSigNamedColorElemType) return NULL; + return (cmsNAMEDCOLORLIST*) mpe ->Data; +} + + +// Profile sequence description routines ------------------------------------------------------------------------------------- + +cmsSEQ* CMSEXPORT cmsAllocProfileSequenceDescription(cmsContext ContextID, cmsUInt32Number n) +{ + cmsSEQ* Seq; + cmsUInt32Number i; + + if (n == 0) return NULL; + + // In a absolutely arbitrary way, I hereby decide to allow a maxim of 255 profiles linked + // in a devicelink. It makes not sense anyway and may be used for exploits, so let's close the door! + if (n > 255) return NULL; + + Seq = (cmsSEQ*) _cmsMallocZero(ContextID, sizeof(cmsSEQ)); + if (Seq == NULL) return NULL; + + Seq -> ContextID = ContextID; + Seq -> seq = (cmsPSEQDESC*) _cmsCalloc(ContextID, n, sizeof(cmsPSEQDESC)); + Seq -> n = n; + + if (Seq -> seq == NULL) { + _cmsFree(ContextID, Seq); + return NULL; + } + + for (i=0; i < n; i++) { + Seq -> seq[i].Manufacturer = NULL; + Seq -> seq[i].Model = NULL; + Seq -> seq[i].Description = NULL; + } + + return Seq; +} + +void CMSEXPORT cmsFreeProfileSequenceDescription(cmsSEQ* pseq) +{ + cmsUInt32Number i; + + if (pseq == NULL) + return; + + if (pseq ->seq != NULL) { + for (i=0; i < pseq ->n; i++) { + if (pseq ->seq[i].Manufacturer != NULL) cmsMLUfree(pseq ->seq[i].Manufacturer); + if (pseq ->seq[i].Model != NULL) cmsMLUfree(pseq ->seq[i].Model); + if (pseq ->seq[i].Description != NULL) cmsMLUfree(pseq ->seq[i].Description); + } + + _cmsFree(pseq ->ContextID, pseq ->seq); + } + + _cmsFree(pseq -> ContextID, pseq); +} + +cmsSEQ* CMSEXPORT cmsDupProfileSequenceDescription(const cmsSEQ* pseq) +{ + cmsSEQ *NewSeq; + cmsUInt32Number i; + + if (pseq == NULL) + return NULL; + + NewSeq = (cmsSEQ*)_cmsMallocZero(pseq->ContextID, sizeof(cmsSEQ)); + if (NewSeq == NULL) return NULL; + + NewSeq->ContextID = pseq->ContextID; + + NewSeq->seq = (cmsPSEQDESC*)_cmsCalloc(pseq->ContextID, pseq->n, sizeof(cmsPSEQDESC)); + if (NewSeq->seq == NULL) goto Error; + + NewSeq->n = pseq->n; + + for (i = 0; i < pseq->n; i++) { + + memmove(&NewSeq ->seq[i].attributes, &pseq ->seq[i].attributes, sizeof(cmsUInt64Number)); + + NewSeq ->seq[i].deviceMfg = pseq ->seq[i].deviceMfg; + NewSeq ->seq[i].deviceModel = pseq ->seq[i].deviceModel; + memmove(&NewSeq ->seq[i].ProfileID, &pseq ->seq[i].ProfileID, sizeof(cmsProfileID)); + NewSeq ->seq[i].technology = pseq ->seq[i].technology; + + NewSeq ->seq[i].Manufacturer = cmsMLUdup(pseq ->seq[i].Manufacturer); + NewSeq ->seq[i].Model = cmsMLUdup(pseq ->seq[i].Model); + NewSeq ->seq[i].Description = cmsMLUdup(pseq ->seq[i].Description); + + } + + return NewSeq; + +Error: + + cmsFreeProfileSequenceDescription(NewSeq); + return NULL; +} + +// Dictionaries -------------------------------------------------------------------------------------------------------- + +// Dictionaries are just very simple linked lists + + +typedef struct _cmsDICT_struct { + cmsDICTentry* head; + cmsContext ContextID; +} _cmsDICT; + + +// Allocate an empty dictionary +cmsHANDLE CMSEXPORT cmsDictAlloc(cmsContext ContextID) +{ + _cmsDICT* dict = (_cmsDICT*) _cmsMallocZero(ContextID, sizeof(_cmsDICT)); + if (dict == NULL) return NULL; + + dict ->ContextID = ContextID; + return (cmsHANDLE) dict; + +} + +// Dispose resources +void CMSEXPORT cmsDictFree(cmsHANDLE hDict) +{ + _cmsDICT* dict = (_cmsDICT*) hDict; + cmsDICTentry *entry, *next; + + _cmsAssert(dict != NULL); + + // Walk the list freeing all nodes + entry = dict ->head; + while (entry != NULL) { + + if (entry ->DisplayName != NULL) cmsMLUfree(entry ->DisplayName); + if (entry ->DisplayValue != NULL) cmsMLUfree(entry ->DisplayValue); + if (entry ->Name != NULL) _cmsFree(dict ->ContextID, entry -> Name); + if (entry ->Value != NULL) _cmsFree(dict ->ContextID, entry -> Value); + + // Don't fall in the habitual trap... + next = entry ->Next; + _cmsFree(dict ->ContextID, entry); + + entry = next; + } + + _cmsFree(dict ->ContextID, dict); +} + + +// Duplicate a wide char string +static +wchar_t* DupWcs(cmsContext ContextID, const wchar_t* ptr) +{ + if (ptr == NULL) return NULL; + return (wchar_t*) _cmsDupMem(ContextID, ptr, (mywcslen(ptr) + 1) * sizeof(wchar_t)); +} + +// Add a new entry to the linked list +cmsBool CMSEXPORT cmsDictAddEntry(cmsHANDLE hDict, const wchar_t* Name, const wchar_t* Value, const cmsMLU *DisplayName, const cmsMLU *DisplayValue) +{ + _cmsDICT* dict = (_cmsDICT*) hDict; + cmsDICTentry *entry; + + _cmsAssert(dict != NULL); + _cmsAssert(Name != NULL); + + entry = (cmsDICTentry*) _cmsMallocZero(dict ->ContextID, sizeof(cmsDICTentry)); + if (entry == NULL) return FALSE; + + entry ->DisplayName = cmsMLUdup(DisplayName); + entry ->DisplayValue = cmsMLUdup(DisplayValue); + entry ->Name = DupWcs(dict ->ContextID, Name); + entry ->Value = DupWcs(dict ->ContextID, Value); + + entry ->Next = dict ->head; + dict ->head = entry; + + return TRUE; +} + + +// Duplicates an existing dictionary +cmsHANDLE CMSEXPORT cmsDictDup(cmsHANDLE hDict) +{ + _cmsDICT* old_dict = (_cmsDICT*) hDict; + cmsHANDLE hNew; + cmsDICTentry *entry; + + _cmsAssert(old_dict != NULL); + + hNew = cmsDictAlloc(old_dict ->ContextID); + if (hNew == NULL) return NULL; + + // Walk the list freeing all nodes + entry = old_dict ->head; + while (entry != NULL) { + + if (!cmsDictAddEntry(hNew, entry ->Name, entry ->Value, entry ->DisplayName, entry ->DisplayValue)) { + + cmsDictFree(hNew); + return NULL; + } + + entry = entry -> Next; + } + + return hNew; +} + +// Get a pointer to the linked list +const cmsDICTentry* CMSEXPORT cmsDictGetEntryList(cmsHANDLE hDict) +{ + _cmsDICT* dict = (_cmsDICT*) hDict; + + if (dict == NULL) return NULL; + return dict ->head; +} + +// Helper For external languages +const cmsDICTentry* CMSEXPORT cmsDictNextEntry(const cmsDICTentry* e) +{ + if (e == NULL) return NULL; + return e ->Next; +} diff --git a/local/recipes/libs/lcms2/source/src/cmsopt.c b/local/recipes/libs/lcms2/source/src/cmsopt.c new file mode 100644 index 0000000000..2396dd20f9 --- /dev/null +++ b/local/recipes/libs/lcms2/source/src/cmsopt.c @@ -0,0 +1,1992 @@ +//--------------------------------------------------------------------------------- +// +// Little Color Management System +// Copyright (c) 1998-2026 Marti Maria Saguer +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//--------------------------------------------------------------------------------- +// + +#include "lcms2_internal.h" + + +//---------------------------------------------------------------------------------- + +// Optimization for 8 bits, Shaper-CLUT (3 inputs only) +typedef struct { + + cmsContext ContextID; + + const cmsInterpParams* p; // Tetrahedrical interpolation parameters. This is a not-owned pointer. + + cmsUInt16Number rx[256], ry[256], rz[256]; + cmsUInt32Number X0[256], Y0[256], Z0[256]; // Precomputed nodes and offsets for 8-bit input data + + +} Prelin8Data; + + +// Generic optimization for 16 bits Shaper-CLUT-Shaper (any inputs) +typedef struct { + + cmsContext ContextID; + + // Number of channels + cmsUInt32Number nInputs; + cmsUInt32Number nOutputs; + + _cmsInterpFn16 EvalCurveIn16[MAX_INPUT_DIMENSIONS]; // The maximum number of input channels is known in advance + cmsInterpParams* ParamsCurveIn16[MAX_INPUT_DIMENSIONS]; + + _cmsInterpFn16 EvalCLUT; // The evaluator for 3D grid + const cmsInterpParams* CLUTparams; // (not-owned pointer) + + + _cmsInterpFn16* EvalCurveOut16; // Points to an array of curve evaluators in 16 bits (not-owned pointer) + cmsInterpParams** ParamsCurveOut16; // Points to an array of references to interpolation params (not-owned pointer) + + +} Prelin16Data; + + +// Optimization for matrix-shaper in 8 bits. Numbers are operated in n.14 signed, tables are stored in 1.14 fixed + +typedef cmsInt32Number cmsS1Fixed14Number; // Note that this may hold more than 16 bits! + +#define DOUBLE_TO_1FIXED14(x) ((cmsS1Fixed14Number) floor((x) * 16384.0 + 0.5)) + +typedef struct { + + cmsContext ContextID; + + cmsS1Fixed14Number Shaper1R[256]; // from 0..255 to 1.14 (0.0...1.0) + cmsS1Fixed14Number Shaper1G[256]; + cmsS1Fixed14Number Shaper1B[256]; + + cmsS1Fixed14Number Mat[3][3]; // n.14 to n.14 (needs a saturation after that) + cmsS1Fixed14Number Off[3]; + + cmsUInt16Number Shaper2R[16385]; // 1.14 to 0..255 + cmsUInt16Number Shaper2G[16385]; + cmsUInt16Number Shaper2B[16385]; + +} MatShaper8Data; + +// Curves, optimization is shared between 8 and 16 bits +typedef struct { + + cmsContext ContextID; + + cmsUInt32Number nCurves; // Number of curves + cmsUInt32Number nElements; // Elements in curves + cmsUInt16Number** Curves; // Points to a dynamically allocated array + +} Curves16Data; + + +// Simple optimizations ---------------------------------------------------------------------------------------------------------- + + +// Remove an element in linked chain +static +void _RemoveElement(cmsStage** head) +{ + cmsStage* mpe = *head; + cmsStage* next = mpe ->Next; + *head = next; + cmsStageFree(mpe); +} + +// Remove all identities in chain. Note that pt actually is a double pointer to the element that holds the pointer. +static +cmsBool _Remove1Op(cmsPipeline* Lut, cmsStageSignature UnaryOp) +{ + cmsStage** pt = &Lut ->Elements; + cmsBool AnyOpt = FALSE; + + while (*pt != NULL) { + + if ((*pt) ->Implements == UnaryOp) { + _RemoveElement(pt); + AnyOpt = TRUE; + } + else + pt = &((*pt) -> Next); + } + + return AnyOpt; +} + +// Same, but only if two adjacent elements are found +static +cmsBool _Remove2Op(cmsPipeline* Lut, cmsStageSignature Op1, cmsStageSignature Op2) +{ + cmsStage** pt1; + cmsStage** pt2; + cmsBool AnyOpt = FALSE; + + pt1 = &Lut ->Elements; + if (*pt1 == NULL) return AnyOpt; + + while (*pt1 != NULL) { + + pt2 = &((*pt1) -> Next); + if (*pt2 == NULL) return AnyOpt; + + if ((*pt1) ->Implements == Op1 && (*pt2) ->Implements == Op2) { + _RemoveElement(pt2); + _RemoveElement(pt1); + AnyOpt = TRUE; + } + else + pt1 = &((*pt1) -> Next); + } + + return AnyOpt; +} + + +static +cmsBool CloseEnoughFloat(cmsFloat64Number a, cmsFloat64Number b) +{ + return fabs(b - a) < 0.00001f; +} + +static +cmsBool isFloatMatrixIdentity(const cmsMAT3* a) +{ + cmsMAT3 Identity; + int i, j; + + _cmsMAT3identity(&Identity); + + for (i = 0; i < 3; i++) + for (j = 0; j < 3; j++) + if (!CloseEnoughFloat(a->v[i].n[j], Identity.v[i].n[j])) return FALSE; + + return TRUE; +} + +// if two adjacent matrices are found, multiply them. +static +cmsBool _MultiplyMatrix(cmsPipeline* Lut) +{ + cmsStage** pt1; + cmsStage** pt2; + cmsStage* chain; + cmsBool AnyOpt = FALSE; + + pt1 = &Lut->Elements; + if (*pt1 == NULL) return AnyOpt; + + while (*pt1 != NULL) { + + pt2 = &((*pt1)->Next); + if (*pt2 == NULL) return AnyOpt; + + if ((*pt1)->Implements == cmsSigMatrixElemType && (*pt2)->Implements == cmsSigMatrixElemType) { + + // Get both matrices + _cmsStageMatrixData* m1 = (_cmsStageMatrixData*) cmsStageData(*pt1); + _cmsStageMatrixData* m2 = (_cmsStageMatrixData*) cmsStageData(*pt2); + cmsMAT3 res; + + // Input offset and output offset should be zero to use this optimization + if (m1->Offset != NULL || m2 ->Offset != NULL || + cmsStageInputChannels(*pt1) != 3 || cmsStageOutputChannels(*pt1) != 3 || + cmsStageInputChannels(*pt2) != 3 || cmsStageOutputChannels(*pt2) != 3) + return FALSE; + + // Multiply both matrices to get the result + _cmsMAT3per(&res, (cmsMAT3*)m2->Double, (cmsMAT3*)m1->Double); + + // Get the next in chain after the matrices + chain = (*pt2)->Next; + + // Remove both matrices + _RemoveElement(pt2); + _RemoveElement(pt1); + + // Now what if the result is a plain identity? + if (!isFloatMatrixIdentity(&res)) { + + // We can not get rid of full matrix + cmsStage* Multmat = cmsStageAllocMatrix(Lut->ContextID, 3, 3, (const cmsFloat64Number*) &res, NULL); + if (Multmat == NULL) return FALSE; // Should never happen + + // Recover the chain + Multmat->Next = chain; + *pt1 = Multmat; + } + + AnyOpt = TRUE; + } + else + pt1 = &((*pt1)->Next); + } + + return AnyOpt; +} + + +// Preoptimize just gets rif of no-ops coming paired. Conversion from v2 to v4 followed +// by a v4 to v2 and vice-versa. The elements are then discarded. +static +cmsBool PreOptimize(cmsPipeline* Lut) +{ + cmsBool AnyOpt = FALSE, Opt; + + do { + + Opt = FALSE; + + // Remove all identities + Opt |= _Remove1Op(Lut, cmsSigIdentityElemType); + + // Remove XYZ2Lab followed by Lab2XYZ + Opt |= _Remove2Op(Lut, cmsSigXYZ2LabElemType, cmsSigLab2XYZElemType); + + // Remove Lab2XYZ followed by XYZ2Lab + Opt |= _Remove2Op(Lut, cmsSigLab2XYZElemType, cmsSigXYZ2LabElemType); + + // Remove V4 to V2 followed by V2 to V4 + Opt |= _Remove2Op(Lut, cmsSigLabV4toV2, cmsSigLabV2toV4); + + // Remove V2 to V4 followed by V4 to V2 + Opt |= _Remove2Op(Lut, cmsSigLabV2toV4, cmsSigLabV4toV2); + + // Remove float pcs Lab conversions + Opt |= _Remove2Op(Lut, cmsSigLab2FloatPCS, cmsSigFloatPCS2Lab); + + // Remove float pcs Lab conversions + Opt |= _Remove2Op(Lut, cmsSigXYZ2FloatPCS, cmsSigFloatPCS2XYZ); + + // Simplify matrix. + Opt |= _MultiplyMatrix(Lut); + + if (Opt) AnyOpt = TRUE; + + } while (Opt); + + return AnyOpt; +} + +static +void Eval16nop1D(CMSREGISTER const cmsUInt16Number Input[], + CMSREGISTER cmsUInt16Number Output[], + CMSREGISTER const struct _cms_interp_struc* p) +{ + Output[0] = Input[0]; + + cmsUNUSED_PARAMETER(p); +} + +static +void PrelinEval16(CMSREGISTER const cmsUInt16Number Input[], + CMSREGISTER cmsUInt16Number Output[], + CMSREGISTER const void* D) +{ + Prelin16Data* p16 = (Prelin16Data*) D; + cmsUInt16Number StageABC[MAX_INPUT_DIMENSIONS]; + cmsUInt16Number StageDEF[cmsMAXCHANNELS]; + cmsUInt32Number i; + + for (i=0; i < p16 ->nInputs; i++) { + + p16 ->EvalCurveIn16[i](&Input[i], &StageABC[i], p16 ->ParamsCurveIn16[i]); + } + + p16 ->EvalCLUT(StageABC, StageDEF, p16 ->CLUTparams); + + for (i=0; i < p16 ->nOutputs; i++) { + + p16 ->EvalCurveOut16[i](&StageDEF[i], &Output[i], p16 ->ParamsCurveOut16[i]); + } +} + + +static +void PrelinOpt16free(cmsContext ContextID, void* ptr) +{ + Prelin16Data* p16 = (Prelin16Data*) ptr; + + _cmsFree(ContextID, p16 ->EvalCurveOut16); + _cmsFree(ContextID, p16 ->ParamsCurveOut16); + + _cmsFree(ContextID, p16); +} + +static +void* Prelin16dup(cmsContext ContextID, const void* ptr) +{ + Prelin16Data* p16 = (Prelin16Data*) ptr; + Prelin16Data* Duped = (Prelin16Data*) _cmsDupMem(ContextID, p16, sizeof(Prelin16Data)); + + if (Duped == NULL) return NULL; + + Duped->EvalCurveOut16 = (_cmsInterpFn16*) _cmsDupMem(ContextID, p16->EvalCurveOut16, p16->nOutputs * sizeof(_cmsInterpFn16)); + Duped->ParamsCurveOut16 = (cmsInterpParams**)_cmsDupMem(ContextID, p16->ParamsCurveOut16, p16->nOutputs * sizeof(cmsInterpParams*)); + + return Duped; +} + + +static +Prelin16Data* PrelinOpt16alloc(cmsContext ContextID, + const cmsInterpParams* ColorMap, + cmsUInt32Number nInputs, cmsToneCurve** In, + cmsUInt32Number nOutputs, cmsToneCurve** Out ) +{ + cmsUInt32Number i; + Prelin16Data* p16 = (Prelin16Data*)_cmsMallocZero(ContextID, sizeof(Prelin16Data)); + if (p16 == NULL) return NULL; + + p16 ->nInputs = nInputs; + p16 ->nOutputs = nOutputs; + + + for (i=0; i < nInputs; i++) { + + if (In == NULL) { + p16 -> ParamsCurveIn16[i] = NULL; + p16 -> EvalCurveIn16[i] = Eval16nop1D; + + } + else { + p16 -> ParamsCurveIn16[i] = In[i] ->InterpParams; + p16 -> EvalCurveIn16[i] = p16 ->ParamsCurveIn16[i]->Interpolation.Lerp16; + } + } + + p16 ->CLUTparams = ColorMap; + p16 ->EvalCLUT = ColorMap ->Interpolation.Lerp16; + + + p16 -> EvalCurveOut16 = (_cmsInterpFn16*) _cmsCalloc(ContextID, nOutputs, sizeof(_cmsInterpFn16)); + if (p16->EvalCurveOut16 == NULL) + { + _cmsFree(ContextID, p16); + return NULL; + } + + p16 -> ParamsCurveOut16 = (cmsInterpParams**) _cmsCalloc(ContextID, nOutputs, sizeof(cmsInterpParams* )); + if (p16->ParamsCurveOut16 == NULL) + { + + _cmsFree(ContextID, p16->EvalCurveOut16); + _cmsFree(ContextID, p16); + return NULL; + } + + for (i=0; i < nOutputs; i++) { + + if (Out == NULL) { + p16 ->ParamsCurveOut16[i] = NULL; + p16 -> EvalCurveOut16[i] = Eval16nop1D; + } + else { + + p16 ->ParamsCurveOut16[i] = Out[i] ->InterpParams; + p16 -> EvalCurveOut16[i] = p16 ->ParamsCurveOut16[i]->Interpolation.Lerp16; + } + } + + return p16; +} + + + +// Resampling --------------------------------------------------------------------------------- + +#define PRELINEARIZATION_POINTS 4096 + +// Sampler implemented by another LUT. This is a clean way to precalculate the devicelink 3D CLUT for +// almost any transform. We use floating point precision and then convert from floating point to 16 bits. +static +cmsInt32Number XFormSampler16(CMSREGISTER const cmsUInt16Number In[], + CMSREGISTER cmsUInt16Number Out[], + CMSREGISTER void* Cargo) +{ + cmsPipeline* Lut = (cmsPipeline*) Cargo; + cmsFloat32Number InFloat[cmsMAXCHANNELS], OutFloat[cmsMAXCHANNELS]; + cmsUInt32Number i; + + _cmsAssert(Lut -> InputChannels < cmsMAXCHANNELS); + _cmsAssert(Lut -> OutputChannels < cmsMAXCHANNELS); + + // From 16 bit to floating point + for (i=0; i < Lut ->InputChannels; i++) + InFloat[i] = (cmsFloat32Number) (In[i] / 65535.0); + + // Evaluate in floating point + cmsPipelineEvalFloat(InFloat, OutFloat, Lut); + + // Back to 16 bits representation + for (i=0; i < Lut ->OutputChannels; i++) + Out[i] = _cmsQuickSaturateWord(OutFloat[i] * 65535.0); + + // Always succeed + return TRUE; +} + +// Try to see if the curves of a given MPE are linear +static +cmsBool AllCurvesAreLinear(cmsStage* mpe) +{ + cmsToneCurve** Curves; + cmsUInt32Number i, n; + + Curves = _cmsStageGetPtrToCurveSet(mpe); + if (Curves == NULL) return FALSE; + + n = cmsStageOutputChannels(mpe); + + for (i=0; i < n; i++) { + if (!cmsIsToneCurveLinear(Curves[i])) return FALSE; + } + + return TRUE; +} + +// This function replaces a specific node placed in "At" by the "Value" numbers. Its purpose +// is to fix scum dot on broken profiles/transforms. Works on 1, 3 and 4 channels +static +cmsBool PatchLUT(cmsStage* CLUT, cmsUInt16Number At[], cmsUInt16Number Value[], + cmsUInt32Number nChannelsOut, cmsUInt32Number nChannelsIn) +{ + _cmsStageCLutData* Grid = (_cmsStageCLutData*) CLUT ->Data; + cmsInterpParams* p16 = Grid ->Params; + cmsFloat64Number px, py, pz, pw; + int x0, y0, z0, w0; + int i, index; + + if (CLUT -> Type != cmsSigCLutElemType) { + cmsSignalError(CLUT->ContextID, cmsERROR_INTERNAL, "(internal) Attempt to PatchLUT on non-lut stage"); + return FALSE; + } + + if (nChannelsIn == 4) { + + px = ((cmsFloat64Number) At[0] * (p16->Domain[0])) / 65535.0; + py = ((cmsFloat64Number) At[1] * (p16->Domain[1])) / 65535.0; + pz = ((cmsFloat64Number) At[2] * (p16->Domain[2])) / 65535.0; + pw = ((cmsFloat64Number) At[3] * (p16->Domain[3])) / 65535.0; + + x0 = (int) floor(px); + y0 = (int) floor(py); + z0 = (int) floor(pz); + w0 = (int) floor(pw); + + if (((px - x0) != 0) || + ((py - y0) != 0) || + ((pz - z0) != 0) || + ((pw - w0) != 0)) return FALSE; // Not on exact node + + index = (int) p16 -> opta[3] * x0 + + (int) p16 -> opta[2] * y0 + + (int) p16 -> opta[1] * z0 + + (int) p16 -> opta[0] * w0; + } + else + if (nChannelsIn == 3) { + + px = ((cmsFloat64Number) At[0] * (p16->Domain[0])) / 65535.0; + py = ((cmsFloat64Number) At[1] * (p16->Domain[1])) / 65535.0; + pz = ((cmsFloat64Number) At[2] * (p16->Domain[2])) / 65535.0; + + x0 = (int) floor(px); + y0 = (int) floor(py); + z0 = (int) floor(pz); + + if (((px - x0) != 0) || + ((py - y0) != 0) || + ((pz - z0) != 0)) return FALSE; // Not on exact node + + index = (int) p16 -> opta[2] * x0 + + (int) p16 -> opta[1] * y0 + + (int) p16 -> opta[0] * z0; + } + else + if (nChannelsIn == 1) { + + px = ((cmsFloat64Number) At[0] * (p16->Domain[0])) / 65535.0; + + x0 = (int) floor(px); + + if (((px - x0) != 0)) return FALSE; // Not on exact node + + index = (int) p16 -> opta[0] * x0; + } + else { + cmsSignalError(CLUT->ContextID, cmsERROR_INTERNAL, "(internal) %d Channels are not supported on PatchLUT", nChannelsIn); + return FALSE; + } + + for (i = 0; i < (int) nChannelsOut; i++) + Grid->Tab.T[index + i] = Value[i]; + + return TRUE; +} + +// Auxiliary, to see if two values are equal or very different +static +cmsBool WhitesAreEqual(cmsUInt32Number n, cmsUInt16Number White1[], cmsUInt16Number White2[] ) +{ + cmsUInt32Number i; + + for (i=0; i < n; i++) { + + if (abs(White1[i] - White2[i]) > 0xf000) return TRUE; // Values are so extremely different that the fixup should be avoided + if (White1[i] != White2[i]) return FALSE; + } + return TRUE; +} + + +// Locate the node for the white point and fix it to pure white in order to avoid scum dot. +static +cmsBool FixWhiteMisalignment(cmsPipeline* Lut, cmsColorSpaceSignature EntryColorSpace, cmsColorSpaceSignature ExitColorSpace) +{ + cmsUInt16Number *WhitePointIn, *WhitePointOut; + cmsUInt16Number WhiteIn[cmsMAXCHANNELS], WhiteOut[cmsMAXCHANNELS], ObtainedOut[cmsMAXCHANNELS]; + cmsUInt32Number i, nOuts, nIns; + cmsStage *PreLin = NULL, *CLUT = NULL, *PostLin = NULL; + + if (!_cmsEndPointsBySpace(EntryColorSpace, + &WhitePointIn, NULL, &nIns)) return FALSE; + + if (!_cmsEndPointsBySpace(ExitColorSpace, + &WhitePointOut, NULL, &nOuts)) return FALSE; + + // It needs to be fixed? + if (Lut ->InputChannels != nIns) return FALSE; + if (Lut ->OutputChannels != nOuts) return FALSE; + + cmsPipelineEval16(WhitePointIn, ObtainedOut, Lut); + + if (WhitesAreEqual(nOuts, WhitePointOut, ObtainedOut)) return TRUE; // whites already match + + // Check if the LUT comes as Prelin, CLUT or Postlin. We allow all combinations + if (!cmsPipelineCheckAndRetreiveStages(Lut, 3, cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType, &PreLin, &CLUT, &PostLin)) + if (!cmsPipelineCheckAndRetreiveStages(Lut, 2, cmsSigCurveSetElemType, cmsSigCLutElemType, &PreLin, &CLUT)) + if (!cmsPipelineCheckAndRetreiveStages(Lut, 2, cmsSigCLutElemType, cmsSigCurveSetElemType, &CLUT, &PostLin)) + if (!cmsPipelineCheckAndRetreiveStages(Lut, 1, cmsSigCLutElemType, &CLUT)) + return FALSE; + + // We need to interpolate white points of both, pre and post curves + if (PreLin) { + + cmsToneCurve** Curves = _cmsStageGetPtrToCurveSet(PreLin); + + for (i=0; i < nIns; i++) { + WhiteIn[i] = cmsEvalToneCurve16(Curves[i], WhitePointIn[i]); + } + } + else { + for (i=0; i < nIns; i++) + WhiteIn[i] = WhitePointIn[i]; + } + + // If any post-linearization, we need to find how is represented white before the curve, do + // a reverse interpolation in this case. + if (PostLin) { + + cmsToneCurve** Curves = _cmsStageGetPtrToCurveSet(PostLin); + + for (i=0; i < nOuts; i++) { + + cmsToneCurve* InversePostLin = cmsReverseToneCurve(Curves[i]); + if (InversePostLin == NULL) { + WhiteOut[i] = WhitePointOut[i]; + + } else { + + WhiteOut[i] = cmsEvalToneCurve16(InversePostLin, WhitePointOut[i]); + cmsFreeToneCurve(InversePostLin); + } + } + } + else { + for (i=0; i < nOuts; i++) + WhiteOut[i] = WhitePointOut[i]; + } + + // Ok, proceed with patching. May fail and we don't care if it fails + PatchLUT(CLUT, WhiteIn, WhiteOut, nOuts, nIns); + + return TRUE; +} + +// ----------------------------------------------------------------------------------------------------------------------------------------------- +// This function creates simple LUT from complex ones. The generated LUT has an optional set of +// prelinearization curves, a CLUT of nGridPoints and optional postlinearization tables. +// These curves have to exist in the original LUT in order to be used in the simplified output. +// Caller may also use the flags to allow this feature. +// LUTS with all curves will be simplified to a single curve. Parametric curves are lost. +// This function should be used on 16-bits LUTS only, as floating point losses precision when simplified +// ----------------------------------------------------------------------------------------------------------------------------------------------- + +static +cmsBool OptimizeByResampling(cmsPipeline** Lut, cmsUInt32Number Intent, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags) +{ + cmsPipeline* Src = NULL; + cmsPipeline* Dest = NULL; + cmsStage* CLUT; + cmsStage *KeepPreLin = NULL, *KeepPostLin = NULL; + cmsUInt32Number nGridPoints; + cmsColorSpaceSignature ColorSpace, OutputColorSpace; + cmsStage *NewPreLin = NULL; + cmsStage *NewPostLin = NULL; + _cmsStageCLutData* DataCLUT; + cmsToneCurve** DataSetIn; + cmsToneCurve** DataSetOut; + Prelin16Data* p16; + + // This is a lossy optimization! does not apply in floating-point cases + if (_cmsFormatterIsFloat(*InputFormat) || _cmsFormatterIsFloat(*OutputFormat)) return FALSE; + + ColorSpace = _cmsICCcolorSpace((int) T_COLORSPACE(*InputFormat)); + OutputColorSpace = _cmsICCcolorSpace((int) T_COLORSPACE(*OutputFormat)); + + // Color space must be specified + if (ColorSpace == (cmsColorSpaceSignature)0 || + OutputColorSpace == (cmsColorSpaceSignature)0) return FALSE; + + // For empty LUTs, 2 points are enough + if (cmsPipelineStageCount(*Lut) == 0) + nGridPoints = 2; + else + { + nGridPoints = _cmsReasonableGridpointsByColorspace(ColorSpace, *dwFlags); + + // Lab16 as input cannot be optimized by a CLUT due to centering issues, thanks to Mike Chaney for discovering this. + if (!(*dwFlags & cmsFLAGS_FORCE_CLUT) && (ColorSpace == cmsSigLabData) && (T_BYTES(*InputFormat) == 2)) return FALSE; + } + + Src = *Lut; + + // Allocate an empty LUT + Dest = cmsPipelineAlloc(Src ->ContextID, Src ->InputChannels, Src ->OutputChannels); + if (!Dest) return FALSE; + + // Prelinearization tables are kept unless indicated by flags + if (*dwFlags & cmsFLAGS_CLUT_PRE_LINEARIZATION) { + + // Get a pointer to the prelinearization element + cmsStage* PreLin = cmsPipelineGetPtrToFirstStage(Src); + + // Check if suitable + if (PreLin && PreLin ->Type == cmsSigCurveSetElemType) { + + // Maybe this is a linear tram, so we can avoid the whole stuff + if (!AllCurvesAreLinear(PreLin)) { + + // All seems ok, proceed. + NewPreLin = cmsStageDup(PreLin); + if(!cmsPipelineInsertStage(Dest, cmsAT_BEGIN, NewPreLin)) + goto Error; + + // Remove prelinearization. Since we have duplicated the curve + // in destination LUT, the sampling should be applied after this stage. + cmsPipelineUnlinkStage(Src, cmsAT_BEGIN, &KeepPreLin); + } + } + } + + // Allocate the CLUT + CLUT = cmsStageAllocCLut16bit(Src ->ContextID, nGridPoints, Src ->InputChannels, Src->OutputChannels, NULL); + if (CLUT == NULL) goto Error; + + // Add the CLUT to the destination LUT + if (!cmsPipelineInsertStage(Dest, cmsAT_END, CLUT)) { + goto Error; + } + + // Postlinearization tables are kept unless indicated by flags + if (*dwFlags & cmsFLAGS_CLUT_POST_LINEARIZATION) { + + // Get a pointer to the postlinearization if present + cmsStage* PostLin = cmsPipelineGetPtrToLastStage(Src); + + // Check if suitable + if (PostLin && cmsStageType(PostLin) == cmsSigCurveSetElemType) { + + // Maybe this is a linear tram, so we can avoid the whole stuff + if (!AllCurvesAreLinear(PostLin)) { + + // All seems ok, proceed. + NewPostLin = cmsStageDup(PostLin); + if (!cmsPipelineInsertStage(Dest, cmsAT_END, NewPostLin)) + goto Error; + + // In destination LUT, the sampling should be applied after this stage. + cmsPipelineUnlinkStage(Src, cmsAT_END, &KeepPostLin); + } + } + } + + // Now its time to do the sampling. We have to ignore pre/post linearization + // The source LUT without pre/post curves is passed as parameter. + if (!cmsStageSampleCLut16bit(CLUT, XFormSampler16, (void*) Src, 0)) { +Error: + // Ops, something went wrong, Restore stages + if (KeepPreLin != NULL) { + if (!cmsPipelineInsertStage(Src, cmsAT_BEGIN, KeepPreLin)) { + _cmsAssert(0); // This never happens + } + } + if (KeepPostLin != NULL) { + if (!cmsPipelineInsertStage(Src, cmsAT_END, KeepPostLin)) { + _cmsAssert(0); // This never happens + } + } + cmsPipelineFree(Dest); + return FALSE; + } + + // Done. + + if (KeepPreLin != NULL) cmsStageFree(KeepPreLin); + if (KeepPostLin != NULL) cmsStageFree(KeepPostLin); + cmsPipelineFree(Src); + + DataCLUT = (_cmsStageCLutData*) CLUT ->Data; + + if (NewPreLin == NULL) DataSetIn = NULL; + else DataSetIn = ((_cmsStageToneCurvesData*) NewPreLin ->Data) ->TheCurves; + + if (NewPostLin == NULL) DataSetOut = NULL; + else DataSetOut = ((_cmsStageToneCurvesData*) NewPostLin ->Data) ->TheCurves; + + + if (DataSetIn == NULL && DataSetOut == NULL) { + + _cmsPipelineSetOptimizationParameters(Dest, (_cmsPipelineEval16Fn) DataCLUT->Params->Interpolation.Lerp16, DataCLUT->Params, NULL, NULL); + } + else { + + p16 = PrelinOpt16alloc(Dest ->ContextID, + DataCLUT ->Params, + Dest ->InputChannels, + DataSetIn, + Dest ->OutputChannels, + DataSetOut); + + if (p16 == NULL) { + cmsPipelineFree(Dest); + return FALSE; + } + + _cmsPipelineSetOptimizationParameters(Dest, PrelinEval16, (void*) p16, PrelinOpt16free, Prelin16dup); + } + + + // Don't fix white on absolute colorimetric + if (Intent == INTENT_ABSOLUTE_COLORIMETRIC) + *dwFlags |= cmsFLAGS_NOWHITEONWHITEFIXUP; + + if (!(*dwFlags & cmsFLAGS_NOWHITEONWHITEFIXUP)) { + + FixWhiteMisalignment(Dest, ColorSpace, OutputColorSpace); + } + + *Lut = Dest; + return TRUE; + + cmsUNUSED_PARAMETER(Intent); +} + + +// ----------------------------------------------------------------------------------------------------------------------------------------------- +// Fixes the gamma balancing of transform. This is described in my paper "Prelinearization Stages on +// Color-Management Application-Specific Integrated Circuits (ASICs)" presented at NIP24. It only works +// for RGB transforms. See the paper for more details +// ----------------------------------------------------------------------------------------------------------------------------------------------- + + +// Normalize endpoints by slope limiting max and min. This assures endpoints as well. +// Descending curves are handled as well. +static +void SlopeLimiting(cmsToneCurve* g) +{ + int BeginVal, EndVal; + int AtBegin = (int) floor((cmsFloat64Number) g ->nEntries * 0.02 + 0.5); // Cutoff at 2% + int AtEnd = (int) g ->nEntries - AtBegin - 1; // And 98% + cmsFloat64Number Val, Slope, beta; + int i; + + if (cmsIsToneCurveDescending(g)) { + BeginVal = 0xffff; EndVal = 0; + } + else { + BeginVal = 0; EndVal = 0xffff; + } + + // Compute slope and offset for begin of curve + Val = g ->Table16[AtBegin]; + Slope = (Val - BeginVal) / AtBegin; + beta = Val - Slope * AtBegin; + + for (i=0; i < AtBegin; i++) + g ->Table16[i] = _cmsQuickSaturateWord(i * Slope + beta); + + // Compute slope and offset for the end + Val = g ->Table16[AtEnd]; + Slope = (EndVal - Val) / AtBegin; // AtBegin holds the X interval, which is same in both cases + beta = Val - Slope * AtEnd; + + for (i = AtEnd; i < (int) g ->nEntries; i++) + g ->Table16[i] = _cmsQuickSaturateWord(i * Slope + beta); +} + + +// Precomputes tables for 8-bit on input devicelink. +static +Prelin8Data* PrelinOpt8alloc(cmsContext ContextID, const cmsInterpParams* p, cmsToneCurve* G[3]) +{ + int i; + cmsUInt16Number Input[3]; + cmsS15Fixed16Number v1, v2, v3; + Prelin8Data* p8; + + p8 = (Prelin8Data*)_cmsMallocZero(ContextID, sizeof(Prelin8Data)); + if (p8 == NULL) return NULL; + + // Since this only works for 8 bit input, values comes always as x * 257, + // we can safely take msb byte (x << 8 + x) + + for (i=0; i < 256; i++) { + + if (G != NULL) { + + // Get 16-bit representation + Input[0] = cmsEvalToneCurve16(G[0], FROM_8_TO_16(i)); + Input[1] = cmsEvalToneCurve16(G[1], FROM_8_TO_16(i)); + Input[2] = cmsEvalToneCurve16(G[2], FROM_8_TO_16(i)); + } + else { + Input[0] = FROM_8_TO_16(i); + Input[1] = FROM_8_TO_16(i); + Input[2] = FROM_8_TO_16(i); + } + + + // Move to 0..1.0 in fixed domain + v1 = _cmsToFixedDomain((int) (Input[0] * p -> Domain[0])); + v2 = _cmsToFixedDomain((int) (Input[1] * p -> Domain[1])); + v3 = _cmsToFixedDomain((int) (Input[2] * p -> Domain[2])); + + // Store the precalculated table of nodes + p8 ->X0[i] = (p->opta[2] * FIXED_TO_INT(v1)); + p8 ->Y0[i] = (p->opta[1] * FIXED_TO_INT(v2)); + p8 ->Z0[i] = (p->opta[0] * FIXED_TO_INT(v3)); + + // Store the precalculated table of offsets + p8 ->rx[i] = (cmsUInt16Number) FIXED_REST_TO_INT(v1); + p8 ->ry[i] = (cmsUInt16Number) FIXED_REST_TO_INT(v2); + p8 ->rz[i] = (cmsUInt16Number) FIXED_REST_TO_INT(v3); + } + + p8 ->ContextID = ContextID; + p8 ->p = p; + + return p8; +} + +static +void Prelin8free(cmsContext ContextID, void* ptr) +{ + _cmsFree(ContextID, ptr); +} + +static +void* Prelin8dup(cmsContext ContextID, const void* ptr) +{ + return _cmsDupMem(ContextID, ptr, sizeof(Prelin8Data)); +} + + + +// A optimized interpolation for 8-bit input. +#define DENS(i,j,k) (LutTable[(i)+(j)+(k)+OutChan]) +static CMS_NO_SANITIZE +void PrelinEval8(CMSREGISTER const cmsUInt16Number Input[], + CMSREGISTER cmsUInt16Number Output[], + CMSREGISTER const void* D) +{ + + cmsUInt8Number r, g, b; + cmsS15Fixed16Number rx, ry, rz; + cmsS15Fixed16Number c0, c1, c2, c3, Rest; + int OutChan; + CMSREGISTER cmsS15Fixed16Number X0, X1, Y0, Y1, Z0, Z1; + Prelin8Data* p8 = (Prelin8Data*) D; + CMSREGISTER const cmsInterpParams* p = p8 ->p; + int TotalOut = (int) p -> nOutputs; + const cmsUInt16Number* LutTable = (const cmsUInt16Number*) p->Table; + + r = (cmsUInt8Number) (Input[0] >> 8); + g = (cmsUInt8Number) (Input[1] >> 8); + b = (cmsUInt8Number) (Input[2] >> 8); + + X0 = (cmsS15Fixed16Number) p8->X0[r]; + Y0 = (cmsS15Fixed16Number) p8->Y0[g]; + Z0 = (cmsS15Fixed16Number) p8->Z0[b]; + + rx = p8 ->rx[r]; + ry = p8 ->ry[g]; + rz = p8 ->rz[b]; + + X1 = X0 + (cmsS15Fixed16Number)((rx == 0) ? 0 : p ->opta[2]); + Y1 = Y0 + (cmsS15Fixed16Number)((ry == 0) ? 0 : p ->opta[1]); + Z1 = Z0 + (cmsS15Fixed16Number)((rz == 0) ? 0 : p ->opta[0]); + + + // These are the 6 Tetrahedral + for (OutChan=0; OutChan < TotalOut; OutChan++) { + + c0 = DENS(X0, Y0, Z0); + + if (rx >= ry && ry >= rz) + { + c1 = DENS(X1, Y0, Z0) - c0; + c2 = DENS(X1, Y1, Z0) - DENS(X1, Y0, Z0); + c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0); + } + else + if (rx >= rz && rz >= ry) + { + c1 = DENS(X1, Y0, Z0) - c0; + c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1); + c3 = DENS(X1, Y0, Z1) - DENS(X1, Y0, Z0); + } + else + if (rz >= rx && rx >= ry) + { + c1 = DENS(X1, Y0, Z1) - DENS(X0, Y0, Z1); + c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1); + c3 = DENS(X0, Y0, Z1) - c0; + } + else + if (ry >= rx && rx >= rz) + { + c1 = DENS(X1, Y1, Z0) - DENS(X0, Y1, Z0); + c2 = DENS(X0, Y1, Z0) - c0; + c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0); + } + else + if (ry >= rz && rz >= rx) + { + c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1); + c2 = DENS(X0, Y1, Z0) - c0; + c3 = DENS(X0, Y1, Z1) - DENS(X0, Y1, Z0); + } + else + if (rz >= ry && ry >= rx) + { + c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1); + c2 = DENS(X0, Y1, Z1) - DENS(X0, Y0, Z1); + c3 = DENS(X0, Y0, Z1) - c0; + } + else { + c1 = c2 = c3 = 0; + } + + Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001; + Output[OutChan] = (cmsUInt16Number) (c0 + ((Rest + (Rest >> 16)) >> 16)); + + } +} + +#undef DENS + + +// Curves that contain wide empty areas are not optimizeable +static +cmsBool IsDegenerated(const cmsToneCurve* g) +{ + cmsUInt32Number i, Zeros = 0, Poles = 0; + cmsUInt32Number nEntries = g ->nEntries; + + for (i=0; i < nEntries; i++) { + + if (g ->Table16[i] == 0x0000) Zeros++; + if (g ->Table16[i] == 0xffff) Poles++; + } + + if (Zeros == 1 && Poles == 1) return FALSE; // For linear tables + if (Zeros > (nEntries / 20)) return TRUE; // Degenerated, many zeros + if (Poles > (nEntries / 20)) return TRUE; // Degenerated, many poles + + return FALSE; +} + +// -------------------------------------------------------------------------------------------------------------- +// We need xput over here + +static +cmsBool OptimizeByComputingLinearization(cmsPipeline** Lut, cmsUInt32Number Intent, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags) +{ + cmsPipeline* OriginalLut; + cmsUInt32Number nGridPoints; + cmsToneCurve *Trans[cmsMAXCHANNELS], *TransReverse[cmsMAXCHANNELS]; + cmsUInt32Number t, i; + cmsFloat32Number v, In[cmsMAXCHANNELS], Out[cmsMAXCHANNELS]; + cmsBool lIsSuitable, lIsLinear; + cmsPipeline* OptimizedLUT = NULL, *LutPlusCurves = NULL; + cmsStage* OptimizedCLUTmpe; + cmsColorSpaceSignature ColorSpace, OutputColorSpace; + cmsStage* OptimizedPrelinMpe; + cmsToneCurve** OptimizedPrelinCurves; + _cmsStageCLutData* OptimizedPrelinCLUT; + + + // This is a lossy optimization! does not apply in floating-point cases + if (_cmsFormatterIsFloat(*InputFormat) || _cmsFormatterIsFloat(*OutputFormat)) return FALSE; + + // Only on chunky RGB + if (T_COLORSPACE(*InputFormat) != PT_RGB) return FALSE; + if (T_PLANAR(*InputFormat)) return FALSE; + + if (T_COLORSPACE(*OutputFormat) != PT_RGB) return FALSE; + if (T_PLANAR(*OutputFormat)) return FALSE; + + // On 16 bits, user has to specify the feature + if (!_cmsFormatterIs8bit(*InputFormat)) { + if (!(*dwFlags & cmsFLAGS_CLUT_PRE_LINEARIZATION)) return FALSE; + } + + OriginalLut = *Lut; + + ColorSpace = _cmsICCcolorSpace((int) T_COLORSPACE(*InputFormat)); + OutputColorSpace = _cmsICCcolorSpace((int) T_COLORSPACE(*OutputFormat)); + + // Color space must be specified + if (ColorSpace == (cmsColorSpaceSignature)0 || + OutputColorSpace == (cmsColorSpaceSignature)0) return FALSE; + + nGridPoints = _cmsReasonableGridpointsByColorspace(ColorSpace, *dwFlags); + + // Empty gamma containers + memset(Trans, 0, sizeof(Trans)); + memset(TransReverse, 0, sizeof(TransReverse)); + + // If the last stage of the original lut are curves, and those curves are + // degenerated, it is likely the transform is squeezing and clipping + // the output from previous CLUT. We cannot optimize this case + { + cmsStage* last = cmsPipelineGetPtrToLastStage(OriginalLut); + + if (last == NULL) goto Error; + if (cmsStageType(last) == cmsSigCurveSetElemType) { + + _cmsStageToneCurvesData* Data = (_cmsStageToneCurvesData*)cmsStageData(last); + for (i = 0; i < Data->nCurves; i++) { + if (IsDegenerated(Data->TheCurves[i])) + goto Error; + } + } + } + + for (t = 0; t < OriginalLut ->InputChannels; t++) { + Trans[t] = cmsBuildTabulatedToneCurve16(OriginalLut ->ContextID, PRELINEARIZATION_POINTS, NULL); + if (Trans[t] == NULL) goto Error; + } + + // Populate the curves + for (i=0; i < PRELINEARIZATION_POINTS; i++) { + + v = (cmsFloat32Number) ((cmsFloat64Number) i / (PRELINEARIZATION_POINTS - 1)); + + // Feed input with a gray ramp + for (t=0; t < OriginalLut ->InputChannels; t++) + In[t] = v; + + // Evaluate the gray value + cmsPipelineEvalFloat(In, Out, OriginalLut); + + // Store result in curve + for (t=0; t < OriginalLut ->InputChannels; t++) + { + if (Trans[t]->Table16 != NULL) + Trans[t] ->Table16[i] = _cmsQuickSaturateWord(Out[t] * 65535.0); + } + } + + // Slope-limit the obtained curves + for (t = 0; t < OriginalLut ->InputChannels; t++) + SlopeLimiting(Trans[t]); + + // Check for validity. lIsLinear is here for debug purposes + lIsSuitable = TRUE; + lIsLinear = TRUE; + for (t=0; (lIsSuitable && (t < OriginalLut ->InputChannels)); t++) { + + // Exclude if already linear + if (!cmsIsToneCurveLinear(Trans[t])) + lIsLinear = FALSE; + + // Exclude if non-monotonic + if (!cmsIsToneCurveMonotonic(Trans[t])) + lIsSuitable = FALSE; + + if (IsDegenerated(Trans[t])) + lIsSuitable = FALSE; + } + + // If it is not suitable, just quit + if (!lIsSuitable) goto Error; + + // Invert curves if possible + for (t = 0; t < OriginalLut ->InputChannels; t++) { + TransReverse[t] = cmsReverseToneCurveEx(PRELINEARIZATION_POINTS, Trans[t]); + if (TransReverse[t] == NULL) goto Error; + } + + // Now inset the reversed curves at the begin of transform + LutPlusCurves = cmsPipelineDup(OriginalLut); + if (LutPlusCurves == NULL) goto Error; + + if (!cmsPipelineInsertStage(LutPlusCurves, cmsAT_BEGIN, cmsStageAllocToneCurves(OriginalLut ->ContextID, OriginalLut ->InputChannels, TransReverse))) + goto Error; + + // Create the result LUT + OptimizedLUT = cmsPipelineAlloc(OriginalLut ->ContextID, OriginalLut ->InputChannels, OriginalLut ->OutputChannels); + if (OptimizedLUT == NULL) goto Error; + + OptimizedPrelinMpe = cmsStageAllocToneCurves(OriginalLut ->ContextID, OriginalLut ->InputChannels, Trans); + + // Create and insert the curves at the beginning + if (!cmsPipelineInsertStage(OptimizedLUT, cmsAT_BEGIN, OptimizedPrelinMpe)) + goto Error; + + // Allocate the CLUT for result + OptimizedCLUTmpe = cmsStageAllocCLut16bit(OriginalLut ->ContextID, nGridPoints, OriginalLut ->InputChannels, OriginalLut ->OutputChannels, NULL); + + // Add the CLUT to the destination LUT + if (!cmsPipelineInsertStage(OptimizedLUT, cmsAT_END, OptimizedCLUTmpe)) + goto Error; + + // Resample the LUT + if (!cmsStageSampleCLut16bit(OptimizedCLUTmpe, XFormSampler16, (void*) LutPlusCurves, 0)) goto Error; + + // Free resources + for (t = 0; t < OriginalLut ->InputChannels; t++) { + + if (Trans[t]) cmsFreeToneCurve(Trans[t]); + if (TransReverse[t]) cmsFreeToneCurve(TransReverse[t]); + + Trans[t] = NULL; + TransReverse[t] = NULL; + } + + cmsPipelineFree(LutPlusCurves); + LutPlusCurves = NULL; + + OptimizedPrelinCurves = _cmsStageGetPtrToCurveSet(OptimizedPrelinMpe); + OptimizedPrelinCLUT = (_cmsStageCLutData*) OptimizedCLUTmpe ->Data; + + // Set the evaluator if 8-bit + if (_cmsFormatterIs8bit(*InputFormat)) { + + Prelin8Data* p8 = PrelinOpt8alloc(OptimizedLUT ->ContextID, + OptimizedPrelinCLUT ->Params, + OptimizedPrelinCurves); + if (p8 == NULL) goto Error; + + _cmsPipelineSetOptimizationParameters(OptimizedLUT, PrelinEval8, (void*) p8, Prelin8free, Prelin8dup); + + } + else + { + Prelin16Data* p16 = PrelinOpt16alloc(OptimizedLUT ->ContextID, + OptimizedPrelinCLUT ->Params, + 3, OptimizedPrelinCurves, 3, NULL); + + if (p16 == NULL) goto Error; + + _cmsPipelineSetOptimizationParameters(OptimizedLUT, PrelinEval16, (void*) p16, PrelinOpt16free, Prelin16dup); + + } + + // Don't fix white on absolute colorimetric + if (Intent == INTENT_ABSOLUTE_COLORIMETRIC) + *dwFlags |= cmsFLAGS_NOWHITEONWHITEFIXUP; + + if (!(*dwFlags & cmsFLAGS_NOWHITEONWHITEFIXUP)) { + + if (!FixWhiteMisalignment(OptimizedLUT, ColorSpace, OutputColorSpace)) { + + goto Error; + } + } + + // And return the obtained LUT + + cmsPipelineFree(OriginalLut); + *Lut = OptimizedLUT; + return TRUE; + +Error: + + for (t = 0; t < OriginalLut ->InputChannels; t++) { + + if (Trans[t]) cmsFreeToneCurve(Trans[t]); + if (TransReverse[t]) cmsFreeToneCurve(TransReverse[t]); + } + + if (LutPlusCurves != NULL) cmsPipelineFree(LutPlusCurves); + if (OptimizedLUT != NULL) cmsPipelineFree(OptimizedLUT); + + return FALSE; + + cmsUNUSED_PARAMETER(Intent); + cmsUNUSED_PARAMETER(lIsLinear); +} + + +// Curves optimizer ------------------------------------------------------------------------------------------------------------------ + +static +void CurvesFree(cmsContext ContextID, void* ptr) +{ + Curves16Data* Data = (Curves16Data*) ptr; + cmsUInt32Number i; + + for (i=0; i < Data -> nCurves; i++) { + + _cmsFree(ContextID, Data ->Curves[i]); + } + + _cmsFree(ContextID, Data ->Curves); + _cmsFree(ContextID, ptr); +} + +static +void* CurvesDup(cmsContext ContextID, const void* ptr) +{ + Curves16Data* Data = (Curves16Data*)_cmsDupMem(ContextID, ptr, sizeof(Curves16Data)); + cmsUInt32Number i; + + if (Data == NULL) return NULL; + + Data->Curves = (cmsUInt16Number**) _cmsDupMem(ContextID, Data->Curves, Data->nCurves * sizeof(cmsUInt16Number*)); + + for (i=0; i < Data -> nCurves; i++) { + Data->Curves[i] = (cmsUInt16Number*) _cmsDupMem(ContextID, Data->Curves[i], Data->nElements * sizeof(cmsUInt16Number)); + } + + return (void*) Data; +} + +// Precomputes tables for 8-bit on input devicelink. +static +Curves16Data* CurvesAlloc(cmsContext ContextID, cmsUInt32Number nCurves, cmsUInt32Number nElements, cmsToneCurve** G) +{ + cmsUInt32Number i, j; + Curves16Data* c16; + + c16 = (Curves16Data*)_cmsMallocZero(ContextID, sizeof(Curves16Data)); + if (c16 == NULL) return NULL; + + c16 ->nCurves = nCurves; + c16 ->nElements = nElements; + + c16->Curves = (cmsUInt16Number**) _cmsCalloc(ContextID, nCurves, sizeof(cmsUInt16Number*)); + if (c16->Curves == NULL) { + _cmsFree(ContextID, c16); + return NULL; + } + + for (i=0; i < nCurves; i++) { + + c16->Curves[i] = (cmsUInt16Number*) _cmsCalloc(ContextID, nElements, sizeof(cmsUInt16Number)); + + if (c16->Curves[i] == NULL) { + + for (j=0; j < i; j++) { + _cmsFree(ContextID, c16->Curves[j]); + } + _cmsFree(ContextID, c16->Curves); + _cmsFree(ContextID, c16); + return NULL; + } + + if (nElements == 256U) { + + for (j=0; j < nElements; j++) { + + c16 ->Curves[i][j] = cmsEvalToneCurve16(G[i], FROM_8_TO_16(j)); + } + } + else { + + for (j=0; j < nElements; j++) { + c16 ->Curves[i][j] = cmsEvalToneCurve16(G[i], (cmsUInt16Number) j); + } + } + } + + return c16; +} + +static +void FastEvaluateCurves8(CMSREGISTER const cmsUInt16Number In[], + CMSREGISTER cmsUInt16Number Out[], + CMSREGISTER const void* D) +{ + Curves16Data* Data = (Curves16Data*) D; + int x; + cmsUInt32Number i; + + for (i=0; i < Data ->nCurves; i++) { + + x = (In[i] >> 8); + Out[i] = Data -> Curves[i][x]; + } +} + + +static +void FastEvaluateCurves16(CMSREGISTER const cmsUInt16Number In[], + CMSREGISTER cmsUInt16Number Out[], + CMSREGISTER const void* D) +{ + Curves16Data* Data = (Curves16Data*) D; + cmsUInt32Number i; + + for (i=0; i < Data ->nCurves; i++) { + Out[i] = Data -> Curves[i][In[i]]; + } +} + + +static +void FastIdentity16(CMSREGISTER const cmsUInt16Number In[], + CMSREGISTER cmsUInt16Number Out[], + CMSREGISTER const void* D) +{ + cmsPipeline* Lut = (cmsPipeline*) D; + cmsUInt32Number i; + + for (i=0; i < Lut ->InputChannels; i++) { + Out[i] = In[i]; + } +} + + +// If the target LUT holds only curves, the optimization procedure is to join all those +// curves together. That only works on curves and does not work on matrices. +static +cmsBool OptimizeByJoiningCurves(cmsPipeline** Lut, cmsUInt32Number Intent, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags) +{ + cmsToneCurve** GammaTables = NULL; + cmsFloat32Number InFloat[cmsMAXCHANNELS], OutFloat[cmsMAXCHANNELS]; + cmsUInt32Number i, j; + cmsPipeline* Src = *Lut; + cmsPipeline* Dest = NULL; + cmsStage* mpe; + cmsStage* ObtainedCurves = NULL; + + + // This is a lossy optimization! does not apply in floating-point cases + if (_cmsFormatterIsFloat(*InputFormat) || _cmsFormatterIsFloat(*OutputFormat)) return FALSE; + + // Only curves in this LUT? + for (mpe = cmsPipelineGetPtrToFirstStage(Src); + mpe != NULL; + mpe = cmsStageNext(mpe)) { + if (cmsStageType(mpe) != cmsSigCurveSetElemType) return FALSE; + } + + // Allocate an empty LUT + Dest = cmsPipelineAlloc(Src ->ContextID, Src ->InputChannels, Src ->OutputChannels); + if (Dest == NULL) return FALSE; + + // Create target curves + GammaTables = (cmsToneCurve**) _cmsCalloc(Src ->ContextID, Src ->InputChannels, sizeof(cmsToneCurve*)); + if (GammaTables == NULL) goto Error; + + for (i=0; i < Src ->InputChannels; i++) { + GammaTables[i] = cmsBuildTabulatedToneCurve16(Src ->ContextID, PRELINEARIZATION_POINTS, NULL); + if (GammaTables[i] == NULL) goto Error; + } + + // Compute 16 bit result by using floating point + for (i=0; i < PRELINEARIZATION_POINTS; i++) { + + for (j=0; j < Src ->InputChannels; j++) + InFloat[j] = (cmsFloat32Number) ((cmsFloat64Number) i / (PRELINEARIZATION_POINTS - 1)); + + cmsPipelineEvalFloat(InFloat, OutFloat, Src); + + for (j=0; j < Src ->InputChannels; j++) + GammaTables[j] -> Table16[i] = _cmsQuickSaturateWord(OutFloat[j] * 65535.0); + } + + ObtainedCurves = cmsStageAllocToneCurves(Src ->ContextID, Src ->InputChannels, GammaTables); + if (ObtainedCurves == NULL) goto Error; + + for (i=0; i < Src ->InputChannels; i++) { + cmsFreeToneCurve(GammaTables[i]); + GammaTables[i] = NULL; + } + + if (GammaTables != NULL) { + _cmsFree(Src->ContextID, GammaTables); + GammaTables = NULL; + } + + // Maybe the curves are linear at the end + if (!AllCurvesAreLinear(ObtainedCurves)) { + _cmsStageToneCurvesData* Data; + + if (!cmsPipelineInsertStage(Dest, cmsAT_BEGIN, ObtainedCurves)) + goto Error; + Data = (_cmsStageToneCurvesData*) cmsStageData(ObtainedCurves); + ObtainedCurves = NULL; + + // If the curves are to be applied in 8 bits, we can save memory + if (_cmsFormatterIs8bit(*InputFormat)) { + Curves16Data* c16 = CurvesAlloc(Dest ->ContextID, Data ->nCurves, 256, Data ->TheCurves); + + if (c16 == NULL) goto Error; + *dwFlags |= cmsFLAGS_NOCACHE; + _cmsPipelineSetOptimizationParameters(Dest, FastEvaluateCurves8, c16, CurvesFree, CurvesDup); + + } + else { + Curves16Data* c16 = CurvesAlloc(Dest ->ContextID, Data ->nCurves, 65536, Data ->TheCurves); + + if (c16 == NULL) goto Error; + *dwFlags |= cmsFLAGS_NOCACHE; + _cmsPipelineSetOptimizationParameters(Dest, FastEvaluateCurves16, c16, CurvesFree, CurvesDup); + } + } + else { + + // LUT optimizes to nothing. Set the identity LUT + cmsStageFree(ObtainedCurves); + ObtainedCurves = NULL; + + if (!cmsPipelineInsertStage(Dest, cmsAT_BEGIN, cmsStageAllocIdentity(Dest ->ContextID, Src ->InputChannels))) + goto Error; + + *dwFlags |= cmsFLAGS_NOCACHE; + _cmsPipelineSetOptimizationParameters(Dest, FastIdentity16, (void*) Dest, NULL, NULL); + } + + // We are done. + cmsPipelineFree(Src); + *Lut = Dest; + return TRUE; + +Error: + + if (ObtainedCurves != NULL) cmsStageFree(ObtainedCurves); + if (GammaTables != NULL) { + for (i=0; i < Src ->InputChannels; i++) { + if (GammaTables[i] != NULL) cmsFreeToneCurve(GammaTables[i]); + } + + _cmsFree(Src ->ContextID, GammaTables); + } + + if (Dest != NULL) cmsPipelineFree(Dest); + return FALSE; + + cmsUNUSED_PARAMETER(Intent); + cmsUNUSED_PARAMETER(InputFormat); + cmsUNUSED_PARAMETER(OutputFormat); + cmsUNUSED_PARAMETER(dwFlags); +} + +// ------------------------------------------------------------------------------------------------------------------------------------- +// LUT is Shaper - Matrix - Matrix - Shaper, which is very frequent when combining two matrix-shaper profiles + + +static +void FreeMatShaper(cmsContext ContextID, void* Data) +{ + if (Data != NULL) _cmsFree(ContextID, Data); +} + +static +void* DupMatShaper(cmsContext ContextID, const void* Data) +{ + return _cmsDupMem(ContextID, Data, sizeof(MatShaper8Data)); +} + + +// A fast matrix-shaper evaluator for 8 bits. This is a bit tricky since I'm using 1.14 signed fixed point +// to accomplish some performance. Actually it takes 256x3 16 bits tables and 16385 x 3 tables of 8 bits, +// in total about 50K, and the performance boost is huge! +static CMS_NO_SANITIZE +void MatShaperEval16(CMSREGISTER const cmsUInt16Number In[], + CMSREGISTER cmsUInt16Number Out[], + CMSREGISTER const void* D) +{ + MatShaper8Data* p = (MatShaper8Data*) D; + cmsS1Fixed14Number l1, l2, l3, r, g, b; + cmsUInt32Number ri, gi, bi; + + // In this case (and only in this case!) we can use this simplification since + // In[] is assured to come from a 8 bit number. (a << 8 | a) + ri = In[0] & 0xFFU; + gi = In[1] & 0xFFU; + bi = In[2] & 0xFFU; + + // Across first shaper, which also converts to 1.14 fixed point + r = p->Shaper1R[ri]; + g = p->Shaper1G[gi]; + b = p->Shaper1B[bi]; + + // Evaluate the matrix in 1.14 fixed point + l1 = (p->Mat[0][0] * r + p->Mat[0][1] * g + p->Mat[0][2] * b + p->Off[0] + 0x2000) >> 14; + l2 = (p->Mat[1][0] * r + p->Mat[1][1] * g + p->Mat[1][2] * b + p->Off[1] + 0x2000) >> 14; + l3 = (p->Mat[2][0] * r + p->Mat[2][1] * g + p->Mat[2][2] * b + p->Off[2] + 0x2000) >> 14; + + // Now we have to clip to 0..1.0 range + ri = (l1 < 0) ? 0 : ((l1 > 16384) ? 16384U : (cmsUInt32Number) l1); + gi = (l2 < 0) ? 0 : ((l2 > 16384) ? 16384U : (cmsUInt32Number) l2); + bi = (l3 < 0) ? 0 : ((l3 > 16384) ? 16384U : (cmsUInt32Number) l3); + + // And across second shaper, + Out[0] = p->Shaper2R[ri]; + Out[1] = p->Shaper2G[gi]; + Out[2] = p->Shaper2B[bi]; + +} + +// This table converts from 8 bits to 1.14 after applying the curve +static +void FillFirstShaper(cmsS1Fixed14Number* Table, cmsToneCurve* Curve) +{ + int i; + cmsFloat32Number R, y; + + for (i=0; i < 256; i++) { + + R = (cmsFloat32Number) (i / 255.0); + y = cmsEvalToneCurveFloat(Curve, R); + + if (y < 131072.0) + Table[i] = DOUBLE_TO_1FIXED14(y); + else + Table[i] = 0x7fffffff; + } +} + +// This table converts form 1.14 (being 0x4000 the last entry) to 8 bits after applying the curve +static +void FillSecondShaper(cmsUInt16Number* Table, cmsToneCurve* Curve, cmsBool Is8BitsOutput) +{ + int i; + cmsFloat32Number R, Val; + + for (i=0; i < 16385; i++) { + + R = (cmsFloat32Number) (i / 16384.0); + Val = cmsEvalToneCurveFloat(Curve, R); // Val comes 0..1.0 + + if (Val < 0) + Val = 0; + + if (Val > 1.0) + Val = 1.0; + + if (Is8BitsOutput) { + + // If 8 bits output, we can optimize further by computing the / 257 part. + // first we compute the resulting byte and then we store the byte times + // 257. This quantization allows to round very quick by doing a >> 8, but + // since the low byte is always equal to msb, we can do a & 0xff and this works! + cmsUInt16Number w = _cmsQuickSaturateWord(Val * 65535.0); + cmsUInt8Number b = FROM_16_TO_8(w); + + Table[i] = FROM_8_TO_16(b); + } + else Table[i] = _cmsQuickSaturateWord(Val * 65535.0); + } +} + +// Compute the matrix-shaper structure +static +cmsBool SetMatShaper(cmsPipeline* Dest, cmsToneCurve* Curve1[3], cmsMAT3* Mat, cmsVEC3* Off, cmsToneCurve* Curve2[3], cmsUInt32Number* OutputFormat) +{ + MatShaper8Data* p; + int i, j; + cmsBool Is8Bits = _cmsFormatterIs8bit(*OutputFormat); + + // Allocate a big chuck of memory to store precomputed tables + p = (MatShaper8Data*) _cmsMalloc(Dest ->ContextID, sizeof(MatShaper8Data)); + if (p == NULL) return FALSE; + + p -> ContextID = Dest -> ContextID; + + // Precompute tables + FillFirstShaper(p ->Shaper1R, Curve1[0]); + FillFirstShaper(p ->Shaper1G, Curve1[1]); + FillFirstShaper(p ->Shaper1B, Curve1[2]); + + FillSecondShaper(p ->Shaper2R, Curve2[0], Is8Bits); + FillSecondShaper(p ->Shaper2G, Curve2[1], Is8Bits); + FillSecondShaper(p ->Shaper2B, Curve2[2], Is8Bits); + + // Convert matrix to nFixed14. Note that those values may take more than 16 bits + for (i=0; i < 3; i++) { + for (j=0; j < 3; j++) { + p ->Mat[i][j] = DOUBLE_TO_1FIXED14(Mat->v[i].n[j]); + } + } + + for (i=0; i < 3; i++) { + + if (Off == NULL) { + p ->Off[i] = 0; + } + else { + p ->Off[i] = DOUBLE_TO_1FIXED14(Off->n[i]); + } + } + + // Mark as optimized for faster formatter + if (Is8Bits) + *OutputFormat |= OPTIMIZED_SH(1); + + // Fill function pointers + _cmsPipelineSetOptimizationParameters(Dest, MatShaperEval16, (void*) p, FreeMatShaper, DupMatShaper); + return TRUE; +} + +// 8 bits on input allows matrix-shaper boot up to 25 Mpixels per second on RGB. That's fast! +static +cmsBool OptimizeMatrixShaper(cmsPipeline** Lut, cmsUInt32Number Intent, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags) +{ + cmsStage* Curve1, *Curve2; + cmsStage* Matrix1, *Matrix2; + cmsMAT3 res; + cmsBool IdentityMat; + cmsPipeline* Dest, *Src; + cmsFloat64Number* Offset; + + // Only works on RGB to RGB + if (T_CHANNELS(*InputFormat) != 3 || T_CHANNELS(*OutputFormat) != 3) return FALSE; + + // Only works on 8 bit input + if (!_cmsFormatterIs8bit(*InputFormat)) return FALSE; + + // Seems suitable, proceed + Src = *Lut; + + // Check for: + // + // shaper-matrix-matrix-shaper + // shaper-matrix-shaper + // + // Both of those constructs are possible (first because abs. colorimetric). + // additionally, In the first case, the input matrix offset should be zero. + + IdentityMat = FALSE; + if (cmsPipelineCheckAndRetreiveStages(Src, 4, + cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType, + &Curve1, &Matrix1, &Matrix2, &Curve2)) { + + // Get both matrices + _cmsStageMatrixData* Data1 = (_cmsStageMatrixData*)cmsStageData(Matrix1); + _cmsStageMatrixData* Data2 = (_cmsStageMatrixData*)cmsStageData(Matrix2); + + // Only RGB to RGB + if (Matrix1->InputChannels != 3 || Matrix1->OutputChannels != 3 || + Matrix2->InputChannels != 3 || Matrix2->OutputChannels != 3) return FALSE; + + // Input offset should be zero + if (Data1->Offset != NULL) return FALSE; + + // Multiply both matrices to get the result + _cmsMAT3per(&res, (cmsMAT3*)Data2->Double, (cmsMAT3*)Data1->Double); + + // Only 2nd matrix has offset, or it is zero + Offset = Data2->Offset; + + // Now the result is in res + Data2 -> Offset. Maybe is a plain identity? + if (_cmsMAT3isIdentity(&res) && Offset == NULL) { + + // We can get rid of full matrix + IdentityMat = TRUE; + } + + } + else { + + if (cmsPipelineCheckAndRetreiveStages(Src, 3, + cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType, + &Curve1, &Matrix1, &Curve2)) { + + _cmsStageMatrixData* Data = (_cmsStageMatrixData*)cmsStageData(Matrix1); + + if (Matrix1->InputChannels != 3 || Matrix1->OutputChannels != 3) return FALSE; + + // Copy the matrix to our result + memcpy(&res, Data->Double, sizeof(res)); + + // Preserve the Odffset (may be NULL as a zero offset) + Offset = Data->Offset; + + if (_cmsMAT3isIdentity(&res) && Offset == NULL) { + + // We can get rid of full matrix + IdentityMat = TRUE; + } + } + else + return FALSE; // Not optimizeable this time + + } + + // Allocate an empty LUT + Dest = cmsPipelineAlloc(Src ->ContextID, Src ->InputChannels, Src ->OutputChannels); + if (!Dest) return FALSE; + + // Assamble the new LUT + if (!cmsPipelineInsertStage(Dest, cmsAT_BEGIN, cmsStageDup(Curve1))) + goto Error; + + if (!IdentityMat) { + + if (!cmsPipelineInsertStage(Dest, cmsAT_END, cmsStageAllocMatrix(Dest->ContextID, 3, 3, (const cmsFloat64Number*)&res, Offset))) + goto Error; + } + + if (!cmsPipelineInsertStage(Dest, cmsAT_END, cmsStageDup(Curve2))) + goto Error; + + // If identity on matrix, we can further optimize the curves, so call the join curves routine + if (IdentityMat) { + + OptimizeByJoiningCurves(&Dest, Intent, InputFormat, OutputFormat, dwFlags); + } + else { + _cmsStageToneCurvesData* mpeC1 = (_cmsStageToneCurvesData*) cmsStageData(Curve1); + _cmsStageToneCurvesData* mpeC2 = (_cmsStageToneCurvesData*) cmsStageData(Curve2); + + // In this particular optimization, cache does not help as it takes more time to deal with + // the cache than with the pixel handling + *dwFlags |= cmsFLAGS_NOCACHE; + + // Setup the optimizarion routines + SetMatShaper(Dest, mpeC1 ->TheCurves, &res, (cmsVEC3*) Offset, mpeC2->TheCurves, OutputFormat); + } + + cmsPipelineFree(Src); + *Lut = Dest; + return TRUE; +Error: + // Leave Src unchanged + cmsPipelineFree(Dest); + return FALSE; +} + + +// ------------------------------------------------------------------------------------------------------------------------------------- +// Optimization plug-ins + +// List of optimizations +typedef struct _cmsOptimizationCollection_st { + + _cmsOPToptimizeFn OptimizePtr; + + struct _cmsOptimizationCollection_st *Next; + +} _cmsOptimizationCollection; + + +// The built-in list. We currently implement 4 types of optimizations. Joining of curves, matrix-shaper, linearization and resampling +static _cmsOptimizationCollection DefaultOptimization[] = { + + { OptimizeByJoiningCurves, &DefaultOptimization[1] }, + { OptimizeMatrixShaper, &DefaultOptimization[2] }, + { OptimizeByComputingLinearization, &DefaultOptimization[3] }, + { OptimizeByResampling, NULL } +}; + +// The linked list head +_cmsOptimizationPluginChunkType _cmsOptimizationPluginChunk = { NULL }; + + +// Duplicates the zone of memory used by the plug-in in the new context +static +void DupPluginOptimizationList(struct _cmsContext_struct* ctx, + const struct _cmsContext_struct* src) +{ + _cmsOptimizationPluginChunkType newHead = { NULL }; + _cmsOptimizationCollection* entry; + _cmsOptimizationCollection* Anterior = NULL; + _cmsOptimizationPluginChunkType* head = (_cmsOptimizationPluginChunkType*) src->chunks[OptimizationPlugin]; + + _cmsAssert(ctx != NULL); + _cmsAssert(head != NULL); + + // Walk the list copying all nodes + for (entry = head->OptimizationCollection; + entry != NULL; + entry = entry ->Next) { + + _cmsOptimizationCollection *newEntry = ( _cmsOptimizationCollection *) _cmsSubAllocDup(ctx ->MemPool, entry, sizeof(_cmsOptimizationCollection)); + + if (newEntry == NULL) + return; + + // We want to keep the linked list order, so this is a little bit tricky + newEntry -> Next = NULL; + if (Anterior) + Anterior -> Next = newEntry; + + Anterior = newEntry; + + if (newHead.OptimizationCollection == NULL) + newHead.OptimizationCollection = newEntry; + } + + ctx ->chunks[OptimizationPlugin] = _cmsSubAllocDup(ctx->MemPool, &newHead, sizeof(_cmsOptimizationPluginChunkType)); +} + +void _cmsAllocOptimizationPluginChunk(struct _cmsContext_struct* ctx, + const struct _cmsContext_struct* src) +{ + if (src != NULL) { + + // Copy all linked list + DupPluginOptimizationList(ctx, src); + } + else { + static _cmsOptimizationPluginChunkType OptimizationPluginChunkType = { NULL }; + ctx ->chunks[OptimizationPlugin] = _cmsSubAllocDup(ctx ->MemPool, &OptimizationPluginChunkType, sizeof(_cmsOptimizationPluginChunkType)); + } +} + + +// Register new ways to optimize +cmsBool _cmsRegisterOptimizationPlugin(cmsContext ContextID, cmsPluginBase* Data) +{ + cmsPluginOptimization* Plugin = (cmsPluginOptimization*) Data; + _cmsOptimizationPluginChunkType* ctx = ( _cmsOptimizationPluginChunkType*) _cmsContextGetClientChunk(ContextID, OptimizationPlugin); + _cmsOptimizationCollection* fl; + + if (Data == NULL) { + + ctx->OptimizationCollection = NULL; + return TRUE; + } + + // Optimizer callback is required + if (Plugin ->OptimizePtr == NULL) return FALSE; + + fl = (_cmsOptimizationCollection*) _cmsPluginMalloc(ContextID, sizeof(_cmsOptimizationCollection)); + if (fl == NULL) return FALSE; + + // Copy the parameters + fl ->OptimizePtr = Plugin ->OptimizePtr; + + // Keep linked list + fl ->Next = ctx->OptimizationCollection; + + // Set the head + ctx ->OptimizationCollection = fl; + + // All is ok + return TRUE; +} + +// The entry point for LUT optimization +cmsBool CMSEXPORT _cmsOptimizePipeline(cmsContext ContextID, + cmsPipeline** PtrLut, + cmsUInt32Number Intent, + cmsUInt32Number* InputFormat, + cmsUInt32Number* OutputFormat, + cmsUInt32Number* dwFlags) +{ + _cmsOptimizationPluginChunkType* ctx = ( _cmsOptimizationPluginChunkType*) _cmsContextGetClientChunk(ContextID, OptimizationPlugin); + _cmsOptimizationCollection* Opts; + cmsBool AnySuccess = FALSE; + cmsStage* mpe; + + // A CLUT is being asked, so force this specific optimization + if (*dwFlags & cmsFLAGS_FORCE_CLUT) { + + PreOptimize(*PtrLut); + return OptimizeByResampling(PtrLut, Intent, InputFormat, OutputFormat, dwFlags); + } + + // Anything to optimize? + if ((*PtrLut) ->Elements == NULL) { + _cmsPipelineSetOptimizationParameters(*PtrLut, FastIdentity16, (void*) *PtrLut, NULL, NULL); + return TRUE; + } + + // Named color pipelines cannot be optimized + for (mpe = cmsPipelineGetPtrToFirstStage(*PtrLut); + mpe != NULL; + mpe = cmsStageNext(mpe)) { + if (cmsStageType(mpe) == cmsSigNamedColorElemType) return FALSE; + } + + // Try to get rid of identities and trivial conversions. + AnySuccess = PreOptimize(*PtrLut); + + // After removal do we end with an identity? + if ((*PtrLut) ->Elements == NULL) { + _cmsPipelineSetOptimizationParameters(*PtrLut, FastIdentity16, (void*) *PtrLut, NULL, NULL); + return TRUE; + } + + // Do not optimize, keep all precision + if (*dwFlags & cmsFLAGS_NOOPTIMIZE) + return FALSE; + + // Try plug-in optimizations + for (Opts = ctx->OptimizationCollection; + Opts != NULL; + Opts = Opts ->Next) { + + // If one schema succeeded, we are done + if (Opts ->OptimizePtr(PtrLut, Intent, InputFormat, OutputFormat, dwFlags)) { + + return TRUE; // Optimized! + } + } + + // Try built-in optimizations + for (Opts = DefaultOptimization; + Opts != NULL; + Opts = Opts ->Next) { + + if (Opts ->OptimizePtr(PtrLut, Intent, InputFormat, OutputFormat, dwFlags)) { + + return TRUE; + } + } + + // Only simple optimizations succeeded + return AnySuccess; +} + + + diff --git a/local/recipes/libs/lcms2/source/src/cmspack.c b/local/recipes/libs/lcms2/source/src/cmspack.c new file mode 100644 index 0000000000..891fdc4f7b --- /dev/null +++ b/local/recipes/libs/lcms2/source/src/cmspack.c @@ -0,0 +1,4062 @@ +//--------------------------------------------------------------------------------- +// +// Little Color Management System +// Copyright (c) 1998-2026 Marti Maria Saguer +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//--------------------------------------------------------------------------------- +// + +#include "lcms2_internal.h" + +// This module handles all formats supported by lcms. There are two flavors, 16 bits and +// floating point. Floating point is supported only in a subset, those formats holding +// cmsFloat32Number (4 bytes per component) and double (marked as 0 bytes per component +// as special case) + +// --------------------------------------------------------------------------- + + +// This macro return words stored as big endian +#define CHANGE_ENDIAN(w) (cmsUInt16Number) ((cmsUInt16Number) ((w)<<8)|((w)>>8)) + +// These macros handles reversing (negative) +#define REVERSE_FLAVOR_8(x) ((cmsUInt8Number) (0xff-(x))) +#define REVERSE_FLAVOR_16(x) ((cmsUInt16Number)(0xffff-(x))) + +// * 0xffff / 0xff00 = (255 * 257) / (255 * 256) = 257 / 256 +cmsINLINE cmsUInt16Number FomLabV2ToLabV4(cmsUInt16Number x) +{ + int a = (x << 8 | x) >> 8; // * 257 / 256 + if ( a > 0xffff) return 0xffff; + return (cmsUInt16Number) a; +} + +// * 0xf00 / 0xffff = * 256 / 257 +cmsINLINE cmsUInt16Number FomLabV4ToLabV2(cmsUInt16Number x) +{ + return (cmsUInt16Number) (((x << 8) + 0x80) / 257); +} + + +typedef struct { + cmsUInt32Number Type; + cmsUInt32Number Mask; + cmsFormatter16 Frm; + +} cmsFormatters16; + +typedef struct { + cmsUInt32Number Type; + cmsUInt32Number Mask; + cmsFormatterFloat Frm; + +} cmsFormattersFloat; + + +#define ANYSPACE COLORSPACE_SH(31) +#define ANYCHANNELS CHANNELS_SH(15) +#define ANYEXTRA EXTRA_SH(7) +#define ANYPLANAR PLANAR_SH(1) +#define ANYENDIAN ENDIAN16_SH(1) +#define ANYSWAP DOSWAP_SH(1) +#define ANYSWAPFIRST SWAPFIRST_SH(1) +#define ANYFLAVOR FLAVOR_SH(1) +#define ANYPREMUL PREMUL_SH(1) + + +// Suppress waning about info never being used + +#ifdef _MSC_VER +#pragma warning(disable : 4100) +#endif + +// Unpacking routines (16 bits) ---------------------------------------------------------------------------------------- + + +// Does almost everything but is slow +static +cmsUInt8Number* UnrollChunkyBytes(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wIn[], + CMSREGISTER cmsUInt8Number* accum, + CMSREGISTER cmsUInt32Number Stride) +{ + cmsUInt32Number nChan = T_CHANNELS(info -> InputFormat); + cmsUInt32Number DoSwap = T_DOSWAP(info ->InputFormat); + cmsUInt32Number Reverse = T_FLAVOR(info ->InputFormat); + cmsUInt32Number SwapFirst = T_SWAPFIRST(info -> InputFormat); + cmsUInt32Number Extra = T_EXTRA(info -> InputFormat); + cmsUInt32Number Premul = T_PREMUL(info->InputFormat); + + cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst; + cmsUInt32Number v; + cmsUInt32Number i; + cmsUInt32Number alpha_factor = 1; + + if (ExtraFirst) { + + if (Premul && Extra) + alpha_factor = _cmsToFixedDomain(FROM_8_TO_16(accum[0])); + + accum += Extra; + } + else + { + if (Premul && Extra) + alpha_factor = _cmsToFixedDomain(FROM_8_TO_16(accum[nChan])); + } + + for (i=0; i < nChan; i++) { + + cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i; + + v = FROM_8_TO_16(*accum); + v = Reverse ? REVERSE_FLAVOR_16(v) : v; + + if (Premul && alpha_factor > 0) + { + v = ((cmsUInt32Number)((cmsUInt32Number)v << 16) / alpha_factor); + if (v > 0xffff) v = 0xffff; + } + + wIn[index] = (cmsUInt16Number) v; + accum++; + } + + if (!ExtraFirst) { + accum += Extra; + } + + if (Extra == 0 && SwapFirst) { + cmsUInt16Number tmp = wIn[0]; + + memmove(&wIn[0], &wIn[1], (nChan-1) * sizeof(cmsUInt16Number)); + wIn[nChan-1] = tmp; + } + + return accum; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); + +} + + +// Extra channels are just ignored because come in the next planes +static +cmsUInt8Number* UnrollPlanarBytes(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wIn[], + CMSREGISTER cmsUInt8Number* accum, + CMSREGISTER cmsUInt32Number Stride) +{ + cmsUInt32Number nChan = T_CHANNELS(info -> InputFormat); + cmsUInt32Number DoSwap = T_DOSWAP(info ->InputFormat); + cmsUInt32Number SwapFirst = T_SWAPFIRST(info ->InputFormat); + cmsUInt32Number Reverse = T_FLAVOR(info ->InputFormat); + cmsUInt32Number i; + cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst; + cmsUInt32Number Extra = T_EXTRA(info->InputFormat); + cmsUInt32Number Premul = T_PREMUL(info->InputFormat); + cmsUInt8Number* Init = accum; + cmsUInt32Number alpha_factor = 1; + + if (ExtraFirst) { + + if (Premul && Extra) + alpha_factor = _cmsToFixedDomain(FROM_8_TO_16(accum[0])); + + + accum += Extra * Stride; + } + else + { + if (Premul && Extra) + alpha_factor = _cmsToFixedDomain(FROM_8_TO_16(accum[nChan * Stride])); + } + + for (i=0; i < nChan; i++) { + + cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i; + cmsUInt32Number v = FROM_8_TO_16(*accum); + + v = Reverse ? REVERSE_FLAVOR_16(v) : v; + + if (Premul && alpha_factor > 0) + { + v = ((cmsUInt32Number)((cmsUInt32Number)v << 16) / alpha_factor); + if (v > 0xffff) v = 0xffff; + } + + wIn[index] = (cmsUInt16Number) v; + accum += Stride; + } + + return (Init + 1); +} + + +// Special cases, provided for performance +static +cmsUInt8Number* Unroll4Bytes(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wIn[], + CMSREGISTER cmsUInt8Number* accum, + CMSREGISTER cmsUInt32Number Stride) +{ + wIn[0] = FROM_8_TO_16(*accum); accum++; // C + wIn[1] = FROM_8_TO_16(*accum); accum++; // M + wIn[2] = FROM_8_TO_16(*accum); accum++; // Y + wIn[3] = FROM_8_TO_16(*accum); accum++; // K + + return accum; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + +static +cmsUInt8Number* Unroll4BytesReverse(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wIn[], + CMSREGISTER cmsUInt8Number* accum, + CMSREGISTER cmsUInt32Number Stride) +{ + wIn[0] = FROM_8_TO_16(REVERSE_FLAVOR_8(*accum)); accum++; // C + wIn[1] = FROM_8_TO_16(REVERSE_FLAVOR_8(*accum)); accum++; // M + wIn[2] = FROM_8_TO_16(REVERSE_FLAVOR_8(*accum)); accum++; // Y + wIn[3] = FROM_8_TO_16(REVERSE_FLAVOR_8(*accum)); accum++; // K + + return accum; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + +static +cmsUInt8Number* Unroll4BytesSwapFirst(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wIn[], + CMSREGISTER cmsUInt8Number* accum, + CMSREGISTER cmsUInt32Number Stride) +{ + wIn[3] = FROM_8_TO_16(*accum); accum++; // K + wIn[0] = FROM_8_TO_16(*accum); accum++; // C + wIn[1] = FROM_8_TO_16(*accum); accum++; // M + wIn[2] = FROM_8_TO_16(*accum); accum++; // Y + + return accum; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + +// KYMC +static +cmsUInt8Number* Unroll4BytesSwap(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wIn[], + CMSREGISTER cmsUInt8Number* accum, + CMSREGISTER cmsUInt32Number Stride) +{ + wIn[3] = FROM_8_TO_16(*accum); accum++; // K + wIn[2] = FROM_8_TO_16(*accum); accum++; // Y + wIn[1] = FROM_8_TO_16(*accum); accum++; // M + wIn[0] = FROM_8_TO_16(*accum); accum++; // C + + return accum; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + +static +cmsUInt8Number* Unroll4BytesSwapSwapFirst(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wIn[], + CMSREGISTER cmsUInt8Number* accum, + CMSREGISTER cmsUInt32Number Stride) +{ + wIn[2] = FROM_8_TO_16(*accum); accum++; // K + wIn[1] = FROM_8_TO_16(*accum); accum++; // Y + wIn[0] = FROM_8_TO_16(*accum); accum++; // M + wIn[3] = FROM_8_TO_16(*accum); accum++; // C + + return accum; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + +static +cmsUInt8Number* Unroll3Bytes(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wIn[], + CMSREGISTER cmsUInt8Number* accum, + CMSREGISTER cmsUInt32Number Stride) +{ + wIn[0] = FROM_8_TO_16(*accum); accum++; // R + wIn[1] = FROM_8_TO_16(*accum); accum++; // G + wIn[2] = FROM_8_TO_16(*accum); accum++; // B + + return accum; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + +static +cmsUInt8Number* Unroll3BytesSkip1Swap(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wIn[], + CMSREGISTER cmsUInt8Number* accum, + CMSREGISTER cmsUInt32Number Stride) +{ + accum++; // A + wIn[2] = FROM_8_TO_16(*accum); accum++; // B + wIn[1] = FROM_8_TO_16(*accum); accum++; // G + wIn[0] = FROM_8_TO_16(*accum); accum++; // R + + return accum; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + +static +cmsUInt8Number* Unroll3BytesSkip1SwapSwapFirst(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wIn[], + CMSREGISTER cmsUInt8Number* accum, + CMSREGISTER cmsUInt32Number Stride) +{ + wIn[2] = FROM_8_TO_16(*accum); accum++; // B + wIn[1] = FROM_8_TO_16(*accum); accum++; // G + wIn[0] = FROM_8_TO_16(*accum); accum++; // R + accum++; // A + + return accum; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + +static +cmsUInt8Number* Unroll3BytesSkip1SwapFirst(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wIn[], + CMSREGISTER cmsUInt8Number* accum, + CMSREGISTER cmsUInt32Number Stride) +{ + accum++; // A + wIn[0] = FROM_8_TO_16(*accum); accum++; // R + wIn[1] = FROM_8_TO_16(*accum); accum++; // G + wIn[2] = FROM_8_TO_16(*accum); accum++; // B + + return accum; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + + +// BRG +static +cmsUInt8Number* Unroll3BytesSwap(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wIn[], + CMSREGISTER cmsUInt8Number* accum, + CMSREGISTER cmsUInt32Number Stride) +{ + wIn[2] = FROM_8_TO_16(*accum); accum++; // B + wIn[1] = FROM_8_TO_16(*accum); accum++; // G + wIn[0] = FROM_8_TO_16(*accum); accum++; // R + + return accum; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + +static +cmsUInt8Number* UnrollLabV2_8(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wIn[], + CMSREGISTER cmsUInt8Number* accum, + CMSREGISTER cmsUInt32Number Stride) +{ + wIn[0] = FomLabV2ToLabV4(FROM_8_TO_16(*accum)); accum++; // L + wIn[1] = FomLabV2ToLabV4(FROM_8_TO_16(*accum)); accum++; // a + wIn[2] = FomLabV2ToLabV4(FROM_8_TO_16(*accum)); accum++; // b + + return accum; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + +static +cmsUInt8Number* UnrollALabV2_8(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wIn[], + CMSREGISTER cmsUInt8Number* accum, + CMSREGISTER cmsUInt32Number Stride) +{ + accum++; // A + wIn[0] = FomLabV2ToLabV4(FROM_8_TO_16(*accum)); accum++; // L + wIn[1] = FomLabV2ToLabV4(FROM_8_TO_16(*accum)); accum++; // a + wIn[2] = FomLabV2ToLabV4(FROM_8_TO_16(*accum)); accum++; // b + + return accum; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + +static +cmsUInt8Number* UnrollLabV2_16(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wIn[], + CMSREGISTER cmsUInt8Number* accum, + CMSREGISTER cmsUInt32Number Stride) +{ + wIn[0] = FomLabV2ToLabV4(*(cmsUInt16Number*) accum); accum += 2; // L + wIn[1] = FomLabV2ToLabV4(*(cmsUInt16Number*) accum); accum += 2; // a + wIn[2] = FomLabV2ToLabV4(*(cmsUInt16Number*) accum); accum += 2; // b + + return accum; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + +// for duplex +static +cmsUInt8Number* Unroll2Bytes(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wIn[], + CMSREGISTER cmsUInt8Number* accum, + CMSREGISTER cmsUInt32Number Stride) +{ + wIn[0] = FROM_8_TO_16(*accum); accum++; // ch1 + wIn[1] = FROM_8_TO_16(*accum); accum++; // ch2 + + return accum; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + + + + +// Monochrome duplicates L into RGB for null-transforms +static +cmsUInt8Number* Unroll1Byte(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wIn[], + CMSREGISTER cmsUInt8Number* accum, + CMSREGISTER cmsUInt32Number Stride) +{ + wIn[0] = wIn[1] = wIn[2] = FROM_8_TO_16(*accum); accum++; // L + + return accum; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + + +static +cmsUInt8Number* Unroll1ByteSkip1(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wIn[], + CMSREGISTER cmsUInt8Number* accum, + CMSREGISTER cmsUInt32Number Stride) +{ + wIn[0] = wIn[1] = wIn[2] = FROM_8_TO_16(*accum); accum++; // L + accum += 1; + + return accum; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + +static +cmsUInt8Number* Unroll1ByteSkip2(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wIn[], + CMSREGISTER cmsUInt8Number* accum, + CMSREGISTER cmsUInt32Number Stride) +{ + wIn[0] = wIn[1] = wIn[2] = FROM_8_TO_16(*accum); accum++; // L + accum += 2; + + return accum; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + +static +cmsUInt8Number* Unroll1ByteReversed(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wIn[], + CMSREGISTER cmsUInt8Number* accum, + CMSREGISTER cmsUInt32Number Stride) +{ + wIn[0] = wIn[1] = wIn[2] = REVERSE_FLAVOR_16(FROM_8_TO_16(*accum)); accum++; // L + + return accum; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + + +static +cmsUInt8Number* UnrollAnyWords(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wIn[], + CMSREGISTER cmsUInt8Number* accum, + CMSREGISTER cmsUInt32Number Stride) +{ + cmsUInt32Number nChan = T_CHANNELS(info -> InputFormat); + cmsUInt32Number SwapEndian = T_ENDIAN16(info -> InputFormat); + cmsUInt32Number DoSwap = T_DOSWAP(info ->InputFormat); + cmsUInt32Number Reverse = T_FLAVOR(info ->InputFormat); + cmsUInt32Number SwapFirst = T_SWAPFIRST(info -> InputFormat); + cmsUInt32Number Extra = T_EXTRA(info -> InputFormat); + cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst; + cmsUInt32Number i; + + if (ExtraFirst) { + accum += Extra * sizeof(cmsUInt16Number); + } + + for (i=0; i < nChan; i++) { + + cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i; + cmsUInt16Number v = *(cmsUInt16Number*) accum; + + if (SwapEndian) + v = CHANGE_ENDIAN(v); + + wIn[index] = Reverse ? REVERSE_FLAVOR_16(v) : v; + + accum += sizeof(cmsUInt16Number); + } + + if (!ExtraFirst) { + accum += Extra * sizeof(cmsUInt16Number); + } + + if (Extra == 0 && SwapFirst) { + + cmsUInt16Number tmp = wIn[0]; + + memmove(&wIn[0], &wIn[1], (nChan-1) * sizeof(cmsUInt16Number)); + wIn[nChan-1] = tmp; + } + + return accum; + + cmsUNUSED_PARAMETER(Stride); +} + + +static +cmsUInt8Number* UnrollAnyWordsPremul(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wIn[], + CMSREGISTER cmsUInt8Number* accum, + CMSREGISTER cmsUInt32Number Stride) +{ + cmsUInt32Number nChan = T_CHANNELS(info -> InputFormat); + cmsUInt32Number SwapEndian = T_ENDIAN16(info -> InputFormat); + cmsUInt32Number DoSwap = T_DOSWAP(info ->InputFormat); + cmsUInt32Number Reverse = T_FLAVOR(info ->InputFormat); + cmsUInt32Number SwapFirst = T_SWAPFIRST(info -> InputFormat); + cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst; + cmsUInt32Number i; + + cmsUInt16Number alpha = (ExtraFirst ? ((cmsUInt16Number*)accum)[0] : ((cmsUInt16Number*)accum)[nChan]); + cmsUInt32Number alpha_factor = _cmsToFixedDomain(alpha); + + if (ExtraFirst) { + accum += sizeof(cmsUInt16Number); + } + + for (i=0; i < nChan; i++) { + + cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i; + cmsUInt32Number v = *(cmsUInt16Number*) accum; + + if (SwapEndian) + v = CHANGE_ENDIAN(v); + + if (alpha_factor > 0) { + + v = (v << 16) / alpha_factor; + if (v > 0xffff) v = 0xffff; + } + + wIn[index] = (cmsUInt16Number) (Reverse ? REVERSE_FLAVOR_16(v) : v); + + accum += sizeof(cmsUInt16Number); + } + + if (!ExtraFirst) { + accum += sizeof(cmsUInt16Number); + } + + return accum; + + cmsUNUSED_PARAMETER(Stride); +} + + + +static +cmsUInt8Number* UnrollPlanarWords(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wIn[], + CMSREGISTER cmsUInt8Number* accum, + CMSREGISTER cmsUInt32Number Stride) +{ + cmsUInt32Number nChan = T_CHANNELS(info -> InputFormat); + cmsUInt32Number DoSwap= T_DOSWAP(info ->InputFormat); + cmsUInt32Number Reverse= T_FLAVOR(info ->InputFormat); + cmsUInt32Number SwapEndian = T_ENDIAN16(info -> InputFormat); + cmsUInt32Number i; + cmsUInt8Number* Init = accum; + + if (DoSwap) { + accum += T_EXTRA(info -> InputFormat) * Stride; + } + + for (i=0; i < nChan; i++) { + + cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i; + cmsUInt16Number v = *(cmsUInt16Number*) accum; + + if (SwapEndian) + v = CHANGE_ENDIAN(v); + + wIn[index] = Reverse ? REVERSE_FLAVOR_16(v) : v; + + accum += Stride; + } + + return (Init + sizeof(cmsUInt16Number)); +} + +static +cmsUInt8Number* UnrollPlanarWordsPremul(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wIn[], + CMSREGISTER cmsUInt8Number* accum, + CMSREGISTER cmsUInt32Number Stride) +{ + cmsUInt32Number nChan = T_CHANNELS(info -> InputFormat); + cmsUInt32Number DoSwap= T_DOSWAP(info ->InputFormat); + cmsUInt32Number SwapFirst = T_SWAPFIRST(info->InputFormat); + cmsUInt32Number Reverse= T_FLAVOR(info ->InputFormat); + cmsUInt32Number SwapEndian = T_ENDIAN16(info -> InputFormat); + cmsUInt32Number i; + cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst; + cmsUInt8Number* Init = accum; + + cmsUInt16Number alpha = (ExtraFirst ? ((cmsUInt16Number*)accum)[0] : ((cmsUInt16Number*)accum)[nChan * Stride / 2]); + cmsUInt32Number alpha_factor = _cmsToFixedDomain(alpha); + + if (ExtraFirst) { + accum += Stride; + } + + for (i=0; i < nChan; i++) { + + cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i; + cmsUInt32Number v = (cmsUInt32Number) *(cmsUInt16Number*) accum; + + if (SwapEndian) + v = CHANGE_ENDIAN(v); + + if (alpha_factor > 0) { + + v = (v << 16) / alpha_factor; + if (v > 0xffff) v = 0xffff; + } + + wIn[index] = (cmsUInt16Number) (Reverse ? REVERSE_FLAVOR_16(v) : v); + + accum += Stride; + } + + return (Init + sizeof(cmsUInt16Number)); +} + +static +cmsUInt8Number* Unroll4Words(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wIn[], + CMSREGISTER cmsUInt8Number* accum, + CMSREGISTER cmsUInt32Number Stride) +{ + wIn[0] = *(cmsUInt16Number*) accum; accum+= 2; // C + wIn[1] = *(cmsUInt16Number*) accum; accum+= 2; // M + wIn[2] = *(cmsUInt16Number*) accum; accum+= 2; // Y + wIn[3] = *(cmsUInt16Number*) accum; accum+= 2; // K + + return accum; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + +static +cmsUInt8Number* Unroll4WordsReverse(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wIn[], + CMSREGISTER cmsUInt8Number* accum, + CMSREGISTER cmsUInt32Number Stride) +{ + wIn[0] = REVERSE_FLAVOR_16(*(cmsUInt16Number*) accum); accum+= 2; // C + wIn[1] = REVERSE_FLAVOR_16(*(cmsUInt16Number*) accum); accum+= 2; // M + wIn[2] = REVERSE_FLAVOR_16(*(cmsUInt16Number*) accum); accum+= 2; // Y + wIn[3] = REVERSE_FLAVOR_16(*(cmsUInt16Number*) accum); accum+= 2; // K + + return accum; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + +static +cmsUInt8Number* Unroll4WordsSwapFirst(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wIn[], + CMSREGISTER cmsUInt8Number* accum, + CMSREGISTER cmsUInt32Number Stride) +{ + wIn[3] = *(cmsUInt16Number*) accum; accum+= 2; // K + wIn[0] = *(cmsUInt16Number*) accum; accum+= 2; // C + wIn[1] = *(cmsUInt16Number*) accum; accum+= 2; // M + wIn[2] = *(cmsUInt16Number*) accum; accum+= 2; // Y + + return accum; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + +// KYMC +static +cmsUInt8Number* Unroll4WordsSwap(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wIn[], + CMSREGISTER cmsUInt8Number* accum, + CMSREGISTER cmsUInt32Number Stride) +{ + wIn[3] = *(cmsUInt16Number*) accum; accum+= 2; // K + wIn[2] = *(cmsUInt16Number*) accum; accum+= 2; // Y + wIn[1] = *(cmsUInt16Number*) accum; accum+= 2; // M + wIn[0] = *(cmsUInt16Number*) accum; accum+= 2; // C + + return accum; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + +static +cmsUInt8Number* Unroll4WordsSwapSwapFirst(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wIn[], + CMSREGISTER cmsUInt8Number* accum, + CMSREGISTER cmsUInt32Number Stride) +{ + wIn[2] = *(cmsUInt16Number*) accum; accum+= 2; // K + wIn[1] = *(cmsUInt16Number*) accum; accum+= 2; // Y + wIn[0] = *(cmsUInt16Number*) accum; accum+= 2; // M + wIn[3] = *(cmsUInt16Number*) accum; accum+= 2; // C + + return accum; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + +static +cmsUInt8Number* Unroll3Words(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wIn[], + CMSREGISTER cmsUInt8Number* accum, + CMSREGISTER cmsUInt32Number Stride) +{ + wIn[0] = *(cmsUInt16Number*) accum; accum+= 2; // C R + wIn[1] = *(cmsUInt16Number*) accum; accum+= 2; // M G + wIn[2] = *(cmsUInt16Number*) accum; accum+= 2; // Y B + + return accum; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + +static +cmsUInt8Number* Unroll3WordsSwap(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wIn[], + CMSREGISTER cmsUInt8Number* accum, + CMSREGISTER cmsUInt32Number Stride) +{ + wIn[2] = *(cmsUInt16Number*) accum; accum+= 2; // C R + wIn[1] = *(cmsUInt16Number*) accum; accum+= 2; // M G + wIn[0] = *(cmsUInt16Number*) accum; accum+= 2; // Y B + + return accum; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + +static +cmsUInt8Number* Unroll3WordsSkip1Swap(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wIn[], + CMSREGISTER cmsUInt8Number* accum, + CMSREGISTER cmsUInt32Number Stride) +{ + accum += 2; // A + wIn[2] = *(cmsUInt16Number*) accum; accum += 2; // R + wIn[1] = *(cmsUInt16Number*) accum; accum += 2; // G + wIn[0] = *(cmsUInt16Number*) accum; accum += 2; // B + + return accum; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + +static +cmsUInt8Number* Unroll3WordsSkip1SwapFirst(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wIn[], + CMSREGISTER cmsUInt8Number* accum, + CMSREGISTER cmsUInt32Number Stride) +{ + accum += 2; // A + wIn[0] = *(cmsUInt16Number*) accum; accum += 2; // R + wIn[1] = *(cmsUInt16Number*) accum; accum += 2; // G + wIn[2] = *(cmsUInt16Number*) accum; accum += 2; // B + + return accum; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + +static +cmsUInt8Number* Unroll1Word(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wIn[], + CMSREGISTER cmsUInt8Number* accum, + CMSREGISTER cmsUInt32Number Stride) +{ + wIn[0] = wIn[1] = wIn[2] = *(cmsUInt16Number*) accum; accum+= 2; // L + + return accum; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + +static +cmsUInt8Number* Unroll1WordReversed(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wIn[], + CMSREGISTER cmsUInt8Number* accum, + CMSREGISTER cmsUInt32Number Stride) +{ + wIn[0] = wIn[1] = wIn[2] = REVERSE_FLAVOR_16(*(cmsUInt16Number*) accum); accum+= 2; + + return accum; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + +static +cmsUInt8Number* Unroll1WordSkip3(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wIn[], + CMSREGISTER cmsUInt8Number* accum, + CMSREGISTER cmsUInt32Number Stride) +{ + wIn[0] = wIn[1] = wIn[2] = *(cmsUInt16Number*) accum; + + accum += 8; + + return accum; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + +static +cmsUInt8Number* Unroll2Words(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wIn[], + CMSREGISTER cmsUInt8Number* accum, + CMSREGISTER cmsUInt32Number Stride) +{ + wIn[0] = *(cmsUInt16Number*) accum; accum += 2; // ch1 + wIn[1] = *(cmsUInt16Number*) accum; accum += 2; // ch2 + + return accum; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + + +// This is a conversion of Lab double to 16 bits +static +cmsUInt8Number* UnrollLabDoubleTo16(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wIn[], + CMSREGISTER cmsUInt8Number* accum, + CMSREGISTER cmsUInt32Number Stride) +{ + if (T_PLANAR(info -> InputFormat)) { + + cmsCIELab Lab; + cmsUInt8Number* pos_L; + cmsUInt8Number* pos_a; + cmsUInt8Number* pos_b; + + pos_L = accum; + pos_a = accum + Stride; + pos_b = accum + Stride * 2; + + Lab.L = *(cmsFloat64Number*) pos_L; + Lab.a = *(cmsFloat64Number*) pos_a; + Lab.b = *(cmsFloat64Number*) pos_b; + + cmsFloat2LabEncoded(wIn, &Lab); + return accum + sizeof(cmsFloat64Number); + } + else { + + cmsFloat2LabEncoded(wIn, (cmsCIELab*) accum); + accum += sizeof(cmsCIELab) + T_EXTRA(info ->InputFormat) * sizeof(cmsFloat64Number); + return accum; + } +} + + +// This is a conversion of Lab float to 16 bits +static +cmsUInt8Number* UnrollLabFloatTo16(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wIn[], + CMSREGISTER cmsUInt8Number* accum, + CMSREGISTER cmsUInt32Number Stride) +{ + cmsCIELab Lab; + + if (T_PLANAR(info -> InputFormat)) { + + cmsUInt8Number* pos_L; + cmsUInt8Number* pos_a; + cmsUInt8Number* pos_b; + + pos_L = accum; + pos_a = accum + Stride; + pos_b = accum + Stride * 2; + + Lab.L = *(cmsFloat32Number*)pos_L; + Lab.a = *(cmsFloat32Number*)pos_a; + Lab.b = *(cmsFloat32Number*)pos_b; + + cmsFloat2LabEncoded(wIn, &Lab); + return accum + sizeof(cmsFloat32Number); + } + else { + + Lab.L = ((cmsFloat32Number*) accum)[0]; + Lab.a = ((cmsFloat32Number*) accum)[1]; + Lab.b = ((cmsFloat32Number*) accum)[2]; + + cmsFloat2LabEncoded(wIn, &Lab); + accum += (3 + T_EXTRA(info ->InputFormat)) * sizeof(cmsFloat32Number); + return accum; + } +} + +// This is a conversion of XYZ double to 16 bits +static +cmsUInt8Number* UnrollXYZDoubleTo16(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wIn[], + CMSREGISTER cmsUInt8Number* accum, + CMSREGISTER cmsUInt32Number Stride) +{ + if (T_PLANAR(info -> InputFormat)) { + + cmsCIEXYZ XYZ; + cmsUInt8Number* pos_X; + cmsUInt8Number* pos_Y; + cmsUInt8Number* pos_Z; + + pos_X = accum; + pos_Y = accum + Stride; + pos_Z = accum + Stride * 2; + + XYZ.X = *(cmsFloat64Number*)pos_X; + XYZ.Y = *(cmsFloat64Number*)pos_Y; + XYZ.Z = *(cmsFloat64Number*)pos_Z; + + cmsFloat2XYZEncoded(wIn, &XYZ); + + return accum + sizeof(cmsFloat64Number); + + } + + else { + cmsFloat2XYZEncoded(wIn, (cmsCIEXYZ*) accum); + accum += sizeof(cmsCIEXYZ) + T_EXTRA(info ->InputFormat) * sizeof(cmsFloat64Number); + + return accum; + } +} + +// This is a conversion of XYZ float to 16 bits +static +cmsUInt8Number* UnrollXYZFloatTo16(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wIn[], + CMSREGISTER cmsUInt8Number* accum, + CMSREGISTER cmsUInt32Number Stride) +{ + if (T_PLANAR(info -> InputFormat)) { + + cmsCIEXYZ XYZ; + cmsUInt8Number* pos_X; + cmsUInt8Number* pos_Y; + cmsUInt8Number* pos_Z; + + pos_X = accum; + pos_Y = accum + Stride; + pos_Z = accum + Stride * 2; + + XYZ.X = *(cmsFloat32Number*)pos_X; + XYZ.Y = *(cmsFloat32Number*)pos_Y; + XYZ.Z = *(cmsFloat32Number*)pos_Z; + + cmsFloat2XYZEncoded(wIn, &XYZ); + + return accum + sizeof(cmsFloat32Number); + + } + + else { + cmsFloat32Number* Pt = (cmsFloat32Number*) accum; + cmsCIEXYZ XYZ; + + XYZ.X = Pt[0]; + XYZ.Y = Pt[1]; + XYZ.Z = Pt[2]; + cmsFloat2XYZEncoded(wIn, &XYZ); + + accum += 3 * sizeof(cmsFloat32Number) + T_EXTRA(info ->InputFormat) * sizeof(cmsFloat32Number); + + return accum; + } +} + +// Check if space is marked as ink +cmsINLINE cmsBool IsInkSpace(cmsUInt32Number Type) +{ + switch (T_COLORSPACE(Type)) { + + case PT_CMY: + case PT_CMYK: + case PT_MCH5: + case PT_MCH6: + case PT_MCH7: + case PT_MCH8: + case PT_MCH9: + case PT_MCH10: + case PT_MCH11: + case PT_MCH12: + case PT_MCH13: + case PT_MCH14: + case PT_MCH15: return TRUE; + + default: return FALSE; + } +} + +// Return the size in bytes of a given formatter +cmsINLINE cmsUInt32Number PixelSize(cmsUInt32Number Format) +{ + cmsUInt32Number fmt_bytes = T_BYTES(Format); + + // For double, the T_BYTES field is zero + if (fmt_bytes == 0) + return sizeof(cmsUInt64Number); + + // Otherwise, it is already correct for all formats + return fmt_bytes; +} + +// Inks does come in percentage, remaining cases are between 0..1.0, again to 16 bits +static +cmsUInt8Number* UnrollDoubleTo16(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wIn[], + CMSREGISTER cmsUInt8Number* accum, + CMSREGISTER cmsUInt32Number Stride) +{ + + cmsUInt32Number nChan = T_CHANNELS(info -> InputFormat); + cmsUInt32Number DoSwap = T_DOSWAP(info ->InputFormat); + cmsUInt32Number Reverse = T_FLAVOR(info ->InputFormat); + cmsUInt32Number SwapFirst = T_SWAPFIRST(info -> InputFormat); + cmsUInt32Number Extra = T_EXTRA(info -> InputFormat); + cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst; + cmsUInt32Number Planar = T_PLANAR(info -> InputFormat); + cmsFloat64Number v; + cmsUInt16Number vi; + cmsUInt32Number i, start = 0; + cmsFloat64Number maximum = IsInkSpace(info ->InputFormat) ? 655.35 : 65535.0; + + + Stride /= PixelSize(info->InputFormat); + + if (ExtraFirst) + start = Extra; + + for (i=0; i < nChan; i++) { + + cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i; + + if (Planar) + v = (cmsFloat32Number) ((cmsFloat64Number*) accum)[(i + start) * Stride]; + else + v = (cmsFloat32Number) ((cmsFloat64Number*) accum)[i + start]; + + vi = _cmsQuickSaturateWord(v * maximum); + + if (Reverse) + vi = REVERSE_FLAVOR_16(vi); + + wIn[index] = vi; + } + + + if (Extra == 0 && SwapFirst) { + cmsUInt16Number tmp = wIn[0]; + + memmove(&wIn[0], &wIn[1], (nChan-1) * sizeof(cmsUInt16Number)); + wIn[nChan-1] = tmp; + } + + if (T_PLANAR(info -> InputFormat)) + return accum + sizeof(cmsFloat64Number); + else + return accum + (nChan + Extra) * sizeof(cmsFloat64Number); +} + + + +static +cmsUInt8Number* UnrollFloatTo16(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wIn[], + CMSREGISTER cmsUInt8Number* accum, + CMSREGISTER cmsUInt32Number Stride) +{ + + cmsUInt32Number nChan = T_CHANNELS(info -> InputFormat); + cmsUInt32Number DoSwap = T_DOSWAP(info ->InputFormat); + cmsUInt32Number Reverse = T_FLAVOR(info ->InputFormat); + cmsUInt32Number SwapFirst = T_SWAPFIRST(info -> InputFormat); + cmsUInt32Number Extra = T_EXTRA(info -> InputFormat); + cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst; + cmsUInt32Number Planar = T_PLANAR(info -> InputFormat); + cmsFloat32Number v; + cmsUInt16Number vi; + cmsUInt32Number i, start = 0; + cmsFloat64Number maximum = IsInkSpace(info ->InputFormat) ? 655.35 : 65535.0; + + Stride /= PixelSize(info->InputFormat); + + if (ExtraFirst) + start = Extra; + + for (i=0; i < nChan; i++) { + + cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i; + + if (Planar) + v = (cmsFloat32Number) ((cmsFloat32Number*) accum)[(i + start) * Stride]; + else + v = (cmsFloat32Number) ((cmsFloat32Number*) accum)[i + start]; + + vi = _cmsQuickSaturateWord(v * maximum); + + if (Reverse) + vi = REVERSE_FLAVOR_16(vi); + + wIn[index] = vi; + } + + + if (Extra == 0 && SwapFirst) { + cmsUInt16Number tmp = wIn[0]; + + memmove(&wIn[0], &wIn[1], (nChan-1) * sizeof(cmsUInt16Number)); + wIn[nChan-1] = tmp; + } + + if (T_PLANAR(info -> InputFormat)) + return accum + sizeof(cmsFloat32Number); + else + return accum + (nChan + Extra) * sizeof(cmsFloat32Number); +} + + + + +// For 1 channel, we need to duplicate data (it comes in 0..1.0 range) +static +cmsUInt8Number* UnrollDouble1Chan(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wIn[], + CMSREGISTER cmsUInt8Number* accum, + CMSREGISTER cmsUInt32Number Stride) +{ + cmsFloat64Number* Inks = (cmsFloat64Number*) accum; + + wIn[0] = wIn[1] = wIn[2] = _cmsQuickSaturateWord(Inks[0] * 65535.0); + + return accum + sizeof(cmsFloat64Number); + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + +//------------------------------------------------------------------------------------------------------------------- + +// For anything going from cmsUInt8Number +static +cmsUInt8Number* Unroll8ToFloat(_cmsTRANSFORM* info, + cmsFloat32Number wIn[], + cmsUInt8Number* accum, + cmsUInt32Number Stride) +{ + + cmsUInt32Number nChan = T_CHANNELS(info->InputFormat); + cmsUInt32Number DoSwap = T_DOSWAP(info->InputFormat); + cmsUInt32Number Reverse = T_FLAVOR(info->InputFormat); + cmsUInt32Number SwapFirst = T_SWAPFIRST(info->InputFormat); + cmsUInt32Number Extra = T_EXTRA(info->InputFormat); + cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst; + cmsUInt32Number Planar = T_PLANAR(info->InputFormat); + cmsFloat32Number v; + cmsUInt32Number i, start = 0; + + Stride /= PixelSize(info->InputFormat); + + if (ExtraFirst) + start = Extra; + + for (i = 0; i < nChan; i++) { + + cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i; + + if (Planar) + v = (cmsFloat32Number) ((cmsUInt8Number *)accum)[(i + start) * Stride]; + else + v = (cmsFloat32Number) ((cmsUInt8Number *)accum)[i + start]; + + v /= 255.0F; + + wIn[index] = Reverse ? 1 - v : v; + } + + + if (Extra == 0 && SwapFirst) { + cmsFloat32Number tmp = wIn[0]; + + memmove(&wIn[0], &wIn[1], (nChan - 1) * sizeof(cmsFloat32Number)); + wIn[nChan - 1] = tmp; + } + + if (T_PLANAR(info->InputFormat)) + return accum + sizeof(cmsUInt8Number); + else + return accum + (nChan + Extra) * sizeof(cmsUInt8Number); +} + + +// For anything going from cmsUInt16Number +static +cmsUInt8Number* Unroll16ToFloat(_cmsTRANSFORM* info, + cmsFloat32Number wIn[], + cmsUInt8Number* accum, + cmsUInt32Number Stride) +{ + + cmsUInt32Number nChan = T_CHANNELS(info->InputFormat); + cmsUInt32Number DoSwap = T_DOSWAP(info->InputFormat); + cmsUInt32Number Reverse = T_FLAVOR(info->InputFormat); + cmsUInt32Number SwapFirst = T_SWAPFIRST(info->InputFormat); + cmsUInt32Number Extra = T_EXTRA(info->InputFormat); + cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst; + cmsUInt32Number Planar = T_PLANAR(info->InputFormat); + cmsFloat32Number v; + cmsUInt32Number i, start = 0; + + Stride /= PixelSize(info->InputFormat); + + if (ExtraFirst) + start = Extra; + + for (i = 0; i < nChan; i++) { + + cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i; + + if (Planar) + v = (cmsFloat32Number)((cmsUInt16Number*)accum)[(i + start) * Stride]; + else + v = (cmsFloat32Number)((cmsUInt16Number*)accum)[i + start]; + + v /= 65535.0F; + + wIn[index] = Reverse ? 1 - v : v; + } + + + if (Extra == 0 && SwapFirst) { + cmsFloat32Number tmp = wIn[0]; + + memmove(&wIn[0], &wIn[1], (nChan - 1) * sizeof(cmsFloat32Number)); + wIn[nChan - 1] = tmp; + } + + if (T_PLANAR(info->InputFormat)) + return accum + sizeof(cmsUInt16Number); + else + return accum + (nChan + Extra) * sizeof(cmsUInt16Number); +} + + +// For anything going from cmsFloat32Number +static +cmsUInt8Number* UnrollFloatsToFloat(_cmsTRANSFORM* info, + cmsFloat32Number wIn[], + cmsUInt8Number* accum, + cmsUInt32Number Stride) +{ + + cmsUInt32Number nChan = T_CHANNELS(info->InputFormat); + cmsUInt32Number DoSwap = T_DOSWAP(info->InputFormat); + cmsUInt32Number Reverse = T_FLAVOR(info->InputFormat); + cmsUInt32Number SwapFirst = T_SWAPFIRST(info->InputFormat); + cmsUInt32Number Extra = T_EXTRA(info->InputFormat); + cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst; + cmsUInt32Number Planar = T_PLANAR(info->InputFormat); + cmsUInt32Number Premul = T_PREMUL(info->InputFormat); + cmsFloat32Number v; + cmsUInt32Number i, start = 0; + cmsFloat32Number maximum = IsInkSpace(info->InputFormat) ? 100.0F : 1.0F; + cmsFloat32Number alpha_factor = 1.0f; + cmsFloat32Number* ptr = (cmsFloat32Number*)accum; + + Stride /= PixelSize(info->InputFormat); + + if (Premul && Extra) + { + if (Planar) + alpha_factor = (ExtraFirst ? ptr[0] : ptr[nChan * Stride]) / maximum; + else + alpha_factor = (ExtraFirst ? ptr[0] : ptr[nChan]) / maximum; + } + + if (ExtraFirst) + start = Extra; + + for (i=0; i < nChan; i++) { + + cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i; + + if (Planar) + v = ptr[(i + start) * Stride]; + else + v = ptr[i + start]; + + if (Premul && alpha_factor > 0) + v /= alpha_factor; + + v /= maximum; + + wIn[index] = Reverse ? 1 - v : v; + } + + + if (Extra == 0 && SwapFirst) { + cmsFloat32Number tmp = wIn[0]; + + memmove(&wIn[0], &wIn[1], (nChan-1) * sizeof(cmsFloat32Number)); + wIn[nChan-1] = tmp; + } + + if (T_PLANAR(info -> InputFormat)) + return accum + sizeof(cmsFloat32Number); + else + return accum + (nChan + Extra) * sizeof(cmsFloat32Number); +} + +// For anything going from double + +static +cmsUInt8Number* UnrollDoublesToFloat(_cmsTRANSFORM* info, + cmsFloat32Number wIn[], + cmsUInt8Number* accum, + cmsUInt32Number Stride) +{ + + cmsUInt32Number nChan = T_CHANNELS(info->InputFormat); + cmsUInt32Number DoSwap = T_DOSWAP(info->InputFormat); + cmsUInt32Number Reverse = T_FLAVOR(info->InputFormat); + cmsUInt32Number SwapFirst = T_SWAPFIRST(info->InputFormat); + cmsUInt32Number Extra = T_EXTRA(info->InputFormat); + cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst; + cmsUInt32Number Planar = T_PLANAR(info->InputFormat); + cmsUInt32Number Premul = T_PREMUL(info->InputFormat); + cmsFloat64Number v; + cmsUInt32Number i, start = 0; + cmsFloat64Number maximum = IsInkSpace(info ->InputFormat) ? 100.0 : 1.0; + cmsFloat64Number alpha_factor = 1.0; + cmsFloat64Number* ptr = (cmsFloat64Number*)accum; + + Stride /= PixelSize(info->InputFormat); + + if (Premul && Extra) + { + if (Planar) + alpha_factor = (ExtraFirst ? ptr[0] : ptr[nChan * Stride]) / maximum; + else + alpha_factor = (ExtraFirst ? ptr[0] : ptr[nChan]) / maximum; + } + + if (ExtraFirst) + start = Extra; + + for (i=0; i < nChan; i++) { + + cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i; + + if (Planar) + v = (cmsFloat64Number) ((cmsFloat64Number*) accum)[(i + start) * Stride]; + else + v = (cmsFloat64Number) ((cmsFloat64Number*) accum)[i + start]; + + + if (Premul && alpha_factor > 0) + v /= alpha_factor; + + v /= maximum; + + wIn[index] = (cmsFloat32Number) (Reverse ? 1.0 - v : v); + } + + + if (Extra == 0 && SwapFirst) { + cmsFloat32Number tmp = wIn[0]; + + memmove(&wIn[0], &wIn[1], (nChan-1) * sizeof(cmsFloat32Number)); + wIn[nChan-1] = tmp; + } + + if (T_PLANAR(info -> InputFormat)) + return accum + sizeof(cmsFloat64Number); + else + return accum + (nChan + Extra) * sizeof(cmsFloat64Number); +} + + + +// From Lab double to cmsFloat32Number +static +cmsUInt8Number* UnrollLabDoubleToFloat(_cmsTRANSFORM* info, + cmsFloat32Number wIn[], + cmsUInt8Number* accum, + cmsUInt32Number Stride) +{ + cmsFloat64Number* Pt = (cmsFloat64Number*) accum; + + if (T_PLANAR(info -> InputFormat)) { + + Stride /= PixelSize(info->InputFormat); + + wIn[0] = (cmsFloat32Number) (Pt[0] / 100.0); // from 0..100 to 0..1 + wIn[1] = (cmsFloat32Number) ((Pt[Stride] + 128) / 255.0); // form -128..+127 to 0..1 + wIn[2] = (cmsFloat32Number) ((Pt[Stride*2] + 128) / 255.0); + + return accum + sizeof(cmsFloat64Number); + } + else { + + wIn[0] = (cmsFloat32Number) (Pt[0] / 100.0); // from 0..100 to 0..1 + wIn[1] = (cmsFloat32Number) ((Pt[1] + 128) / 255.0); // form -128..+127 to 0..1 + wIn[2] = (cmsFloat32Number) ((Pt[2] + 128) / 255.0); + + accum += sizeof(cmsFloat64Number)*(3 + T_EXTRA(info ->InputFormat)); + return accum; + } +} + +// From Lab double to cmsFloat32Number +static +cmsUInt8Number* UnrollLabFloatToFloat(_cmsTRANSFORM* info, + cmsFloat32Number wIn[], + cmsUInt8Number* accum, + cmsUInt32Number Stride) +{ + cmsFloat32Number* Pt = (cmsFloat32Number*) accum; + + if (T_PLANAR(info -> InputFormat)) { + + Stride /= PixelSize(info->InputFormat); + + wIn[0] = (cmsFloat32Number) (Pt[0] / 100.0); // from 0..100 to 0..1 + wIn[1] = (cmsFloat32Number) ((Pt[Stride] + 128) / 255.0); // form -128..+127 to 0..1 + wIn[2] = (cmsFloat32Number) ((Pt[Stride*2] + 128) / 255.0); + + return accum + sizeof(cmsFloat32Number); + } + else { + + wIn[0] = (cmsFloat32Number) (Pt[0] / 100.0); // from 0..100 to 0..1 + wIn[1] = (cmsFloat32Number) ((Pt[1] + 128) / 255.0); // form -128..+127 to 0..1 + wIn[2] = (cmsFloat32Number) ((Pt[2] + 128) / 255.0); + + accum += sizeof(cmsFloat32Number)*(3 + T_EXTRA(info ->InputFormat)); + return accum; + } +} + +// 1.15 fixed point, that means maximum value is MAX_ENCODEABLE_XYZ (0xFFFF) +static +cmsUInt8Number* UnrollXYZDoubleToFloat(_cmsTRANSFORM* info, + cmsFloat32Number wIn[], + cmsUInt8Number* accum, + cmsUInt32Number Stride) +{ + cmsFloat64Number* Pt = (cmsFloat64Number*) accum; + + if (T_PLANAR(info -> InputFormat)) { + + Stride /= PixelSize(info->InputFormat); + + wIn[0] = (cmsFloat32Number) (Pt[0] / MAX_ENCODEABLE_XYZ); + wIn[1] = (cmsFloat32Number) (Pt[Stride] / MAX_ENCODEABLE_XYZ); + wIn[2] = (cmsFloat32Number) (Pt[Stride*2] / MAX_ENCODEABLE_XYZ); + + return accum + sizeof(cmsFloat64Number); + } + else { + + wIn[0] = (cmsFloat32Number) (Pt[0] / MAX_ENCODEABLE_XYZ); + wIn[1] = (cmsFloat32Number) (Pt[1] / MAX_ENCODEABLE_XYZ); + wIn[2] = (cmsFloat32Number) (Pt[2] / MAX_ENCODEABLE_XYZ); + + accum += sizeof(cmsFloat64Number)*(3 + T_EXTRA(info ->InputFormat)); + return accum; + } +} + +static +cmsUInt8Number* UnrollXYZFloatToFloat(_cmsTRANSFORM* info, + cmsFloat32Number wIn[], + cmsUInt8Number* accum, + cmsUInt32Number Stride) +{ + cmsFloat32Number* Pt = (cmsFloat32Number*) accum; + + if (T_PLANAR(info -> InputFormat)) { + + Stride /= PixelSize(info->InputFormat); + + wIn[0] = (cmsFloat32Number) (Pt[0] / MAX_ENCODEABLE_XYZ); + wIn[1] = (cmsFloat32Number) (Pt[Stride] / MAX_ENCODEABLE_XYZ); + wIn[2] = (cmsFloat32Number) (Pt[Stride*2] / MAX_ENCODEABLE_XYZ); + + return accum + sizeof(cmsFloat32Number); + } + else { + + wIn[0] = (cmsFloat32Number) (Pt[0] / MAX_ENCODEABLE_XYZ); + wIn[1] = (cmsFloat32Number) (Pt[1] / MAX_ENCODEABLE_XYZ); + wIn[2] = (cmsFloat32Number) (Pt[2] / MAX_ENCODEABLE_XYZ); + + accum += sizeof(cmsFloat32Number)*(3 + T_EXTRA(info ->InputFormat)); + return accum; + } +} + + +cmsINLINE void lab4toFloat(cmsFloat32Number wIn[], cmsUInt16Number lab4[3]) +{ + cmsFloat32Number L = (cmsFloat32Number) lab4[0] / 655.35F; + cmsFloat32Number a = ((cmsFloat32Number) lab4[1] / 257.0F) - 128.0F; + cmsFloat32Number b = ((cmsFloat32Number) lab4[2] / 257.0F) - 128.0F; + + wIn[0] = (L / 100.0F); // from 0..100 to 0..1 + wIn[1] = ((a + 128.0F) / 255.0F); // form -128..+127 to 0..1 + wIn[2] = ((b + 128.0F) / 255.0F); + +} + +static +cmsUInt8Number* UnrollLabV2_8ToFloat(_cmsTRANSFORM* info, + cmsFloat32Number wIn[], + cmsUInt8Number* accum, + cmsUInt32Number Stride) +{ + cmsUInt16Number lab4[3]; + + lab4[0] = FomLabV2ToLabV4(FROM_8_TO_16(*accum)); accum++; // L + lab4[1] = FomLabV2ToLabV4(FROM_8_TO_16(*accum)); accum++; // a + lab4[2] = FomLabV2ToLabV4(FROM_8_TO_16(*accum)); accum++; // b + + lab4toFloat(wIn, lab4); + + return accum; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + +static +cmsUInt8Number* UnrollALabV2_8ToFloat(_cmsTRANSFORM* info, + cmsFloat32Number wIn[], + cmsUInt8Number* accum, + cmsUInt32Number Stride) +{ + cmsUInt16Number lab4[3]; + + accum++; // A + lab4[0] = FomLabV2ToLabV4(FROM_8_TO_16(*accum)); accum++; // L + lab4[1] = FomLabV2ToLabV4(FROM_8_TO_16(*accum)); accum++; // a + lab4[2] = FomLabV2ToLabV4(FROM_8_TO_16(*accum)); accum++; // b + + lab4toFloat(wIn, lab4); + + return accum; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + +static +cmsUInt8Number* UnrollLabV2_16ToFloat(_cmsTRANSFORM* info, + cmsFloat32Number wIn[], + cmsUInt8Number* accum, + cmsUInt32Number Stride) +{ + cmsUInt16Number lab4[3]; + + lab4[0] = FomLabV2ToLabV4(*(cmsUInt16Number*) accum); accum += 2; // L + lab4[1] = FomLabV2ToLabV4(*(cmsUInt16Number*) accum); accum += 2; // a + lab4[2] = FomLabV2ToLabV4(*(cmsUInt16Number*) accum); accum += 2; // b + + lab4toFloat(wIn, lab4); + + return accum; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + + +// Packing routines ----------------------------------------------------------------------------------------------------------- + + +// Generic chunky for byte +static +cmsUInt8Number* PackChunkyBytes(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wOut[], + CMSREGISTER cmsUInt8Number* output, + CMSREGISTER cmsUInt32Number Stride) +{ + cmsUInt32Number nChan = T_CHANNELS(info->OutputFormat); + cmsUInt32Number DoSwap = T_DOSWAP(info->OutputFormat); + cmsUInt32Number Reverse = T_FLAVOR(info->OutputFormat); + cmsUInt32Number Extra = T_EXTRA(info->OutputFormat); + cmsUInt32Number SwapFirst = T_SWAPFIRST(info->OutputFormat); + cmsUInt32Number Premul = T_PREMUL(info->OutputFormat); + cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst; + cmsUInt8Number* swap1; + cmsUInt16Number v = 0; + cmsUInt32Number i; + cmsUInt32Number alpha_factor = 0; + + swap1 = output; + + if (ExtraFirst) { + + if (Premul && Extra) + alpha_factor = _cmsToFixedDomain(FROM_8_TO_16(output[0])); + + output += Extra; + } + else + { + if (Premul && Extra) + alpha_factor = _cmsToFixedDomain(FROM_8_TO_16(output[nChan])); + } + + for (i=0; i < nChan; i++) { + + cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i; + + v = wOut[index]; + + if (Reverse) + v = REVERSE_FLAVOR_16(v); + + if (Premul) + { + v = (cmsUInt16Number)((cmsUInt32Number)((cmsUInt32Number)v * alpha_factor + 0x8000) >> 16); + } + + *output++ = FROM_16_TO_8(v); + } + + if (!ExtraFirst) { + output += Extra; + } + + if (Extra == 0 && SwapFirst) { + + memmove(swap1 + 1, swap1, nChan-1); + *swap1 = FROM_16_TO_8(v); + } + + return output; + + cmsUNUSED_PARAMETER(Stride); +} + +static +cmsUInt8Number* PackChunkyWords(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wOut[], + CMSREGISTER cmsUInt8Number* output, + CMSREGISTER cmsUInt32Number Stride) +{ + cmsUInt32Number nChan = T_CHANNELS(info->OutputFormat); + cmsUInt32Number SwapEndian = T_ENDIAN16(info->OutputFormat); + cmsUInt32Number DoSwap = T_DOSWAP(info->OutputFormat); + cmsUInt32Number Reverse = T_FLAVOR(info->OutputFormat); + cmsUInt32Number Extra = T_EXTRA(info->OutputFormat); + cmsUInt32Number SwapFirst = T_SWAPFIRST(info->OutputFormat); + cmsUInt32Number Premul = T_PREMUL(info->OutputFormat); + cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst; + cmsUInt16Number* swap1; + cmsUInt16Number v = 0; + cmsUInt32Number i; + cmsUInt32Number alpha_factor = 0; + + swap1 = (cmsUInt16Number*) output; + + if (ExtraFirst) { + + if (Premul && Extra) + alpha_factor = _cmsToFixedDomain(*(cmsUInt16Number*) output); + + output += Extra * sizeof(cmsUInt16Number); + } + else + { + if (Premul && Extra) + alpha_factor = _cmsToFixedDomain(((cmsUInt16Number*) output)[nChan]); + } + + for (i=0; i < nChan; i++) { + + cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i; + + v = wOut[index]; + + if (SwapEndian) + v = CHANGE_ENDIAN(v); + + if (Reverse) + v = REVERSE_FLAVOR_16(v); + + if (Premul) + { + v = (cmsUInt16Number)((cmsUInt32Number)((cmsUInt32Number)v * alpha_factor + 0x8000) >> 16); + } + + *(cmsUInt16Number*) output = v; + + output += sizeof(cmsUInt16Number); + } + + if (!ExtraFirst) { + output += Extra * sizeof(cmsUInt16Number); + } + + if (Extra == 0 && SwapFirst) { + + memmove(swap1 + 1, swap1, (nChan-1)* sizeof(cmsUInt16Number)); + *swap1 = v; + } + + return output; + + cmsUNUSED_PARAMETER(Stride); +} + + + +static +cmsUInt8Number* PackPlanarBytes(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wOut[], + CMSREGISTER cmsUInt8Number* output, + CMSREGISTER cmsUInt32Number Stride) +{ + cmsUInt32Number nChan = T_CHANNELS(info->OutputFormat); + cmsUInt32Number DoSwap = T_DOSWAP(info->OutputFormat); + cmsUInt32Number SwapFirst = T_SWAPFIRST(info->OutputFormat); + cmsUInt32Number Reverse = T_FLAVOR(info->OutputFormat); + cmsUInt32Number Extra = T_EXTRA(info->OutputFormat); + cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst; + cmsUInt32Number Premul = T_PREMUL(info->OutputFormat); + cmsUInt32Number i; + cmsUInt8Number* Init = output; + cmsUInt32Number alpha_factor = 0; + + + if (ExtraFirst) { + + if (Premul && Extra) + alpha_factor = _cmsToFixedDomain(FROM_8_TO_16(output[0])); + + output += Extra * Stride; + } + else + { + if (Premul && Extra) + alpha_factor = _cmsToFixedDomain(FROM_8_TO_16(output[nChan * Stride])); + } + + + for (i=0; i < nChan; i++) { + + cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i; + cmsUInt16Number v = wOut[index]; + + if (Reverse) + v = REVERSE_FLAVOR_16(v); + + if (Premul) + { + v = (cmsUInt16Number)((cmsUInt32Number)((cmsUInt32Number)v * alpha_factor + 0x8000) >> 16); + } + + *(cmsUInt8Number*)output = FROM_16_TO_8(v); + + output += Stride; + } + + return (Init + 1); + + cmsUNUSED_PARAMETER(Stride); +} + + +static +cmsUInt8Number* PackPlanarWords(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wOut[], + CMSREGISTER cmsUInt8Number* output, + CMSREGISTER cmsUInt32Number Stride) +{ + cmsUInt32Number nChan = T_CHANNELS(info->OutputFormat); + cmsUInt32Number DoSwap = T_DOSWAP(info->OutputFormat); + cmsUInt32Number SwapFirst = T_SWAPFIRST(info->OutputFormat); + cmsUInt32Number Reverse = T_FLAVOR(info->OutputFormat); + cmsUInt32Number Extra = T_EXTRA(info->OutputFormat); + cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst; + cmsUInt32Number Premul = T_PREMUL(info->OutputFormat); + cmsUInt32Number SwapEndian = T_ENDIAN16(info->OutputFormat); + cmsUInt32Number i; + cmsUInt8Number* Init = output; + cmsUInt16Number v; + cmsUInt32Number alpha_factor = 0; + + if (ExtraFirst) { + + if (Premul && Extra) + alpha_factor = _cmsToFixedDomain(((cmsUInt16Number*) output)[0]); + + output += Extra * Stride; + } + else + { + if (Premul && Extra) + alpha_factor = _cmsToFixedDomain(((cmsUInt16Number*)output)[nChan * Stride]); + } + + for (i=0; i < nChan; i++) { + + cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i; + + v = wOut[index]; + + if (SwapEndian) + v = CHANGE_ENDIAN(v); + + if (Reverse) + v = REVERSE_FLAVOR_16(v); + + if (Premul) + { + v = (cmsUInt16Number)((cmsUInt32Number)((cmsUInt32Number)v * alpha_factor + 0x8000) >> 16); + } + + *(cmsUInt16Number*) output = v; + output += Stride; + } + + return (Init + sizeof(cmsUInt16Number)); +} + +// CMYKcm (unrolled for speed) + +static +cmsUInt8Number* Pack6Bytes(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wOut[], + CMSREGISTER cmsUInt8Number* output, + CMSREGISTER cmsUInt32Number Stride) +{ + *output++ = FROM_16_TO_8(wOut[0]); + *output++ = FROM_16_TO_8(wOut[1]); + *output++ = FROM_16_TO_8(wOut[2]); + *output++ = FROM_16_TO_8(wOut[3]); + *output++ = FROM_16_TO_8(wOut[4]); + *output++ = FROM_16_TO_8(wOut[5]); + + return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + +// KCMYcm + +static +cmsUInt8Number* Pack6BytesSwap(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wOut[], + CMSREGISTER cmsUInt8Number* output, + CMSREGISTER cmsUInt32Number Stride) +{ + *output++ = FROM_16_TO_8(wOut[5]); + *output++ = FROM_16_TO_8(wOut[4]); + *output++ = FROM_16_TO_8(wOut[3]); + *output++ = FROM_16_TO_8(wOut[2]); + *output++ = FROM_16_TO_8(wOut[1]); + *output++ = FROM_16_TO_8(wOut[0]); + + return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + +// CMYKcm +static +cmsUInt8Number* Pack6Words(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wOut[], + CMSREGISTER cmsUInt8Number* output, + CMSREGISTER cmsUInt32Number Stride) +{ + *(cmsUInt16Number*) output = wOut[0]; + output+= 2; + *(cmsUInt16Number*) output = wOut[1]; + output+= 2; + *(cmsUInt16Number*) output = wOut[2]; + output+= 2; + *(cmsUInt16Number*) output = wOut[3]; + output+= 2; + *(cmsUInt16Number*) output = wOut[4]; + output+= 2; + *(cmsUInt16Number*) output = wOut[5]; + output+= 2; + + return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + +// KCMYcm +static +cmsUInt8Number* Pack6WordsSwap(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wOut[], + CMSREGISTER cmsUInt8Number* output, + CMSREGISTER cmsUInt32Number Stride) +{ + *(cmsUInt16Number*) output = wOut[5]; + output+= 2; + *(cmsUInt16Number*) output = wOut[4]; + output+= 2; + *(cmsUInt16Number*) output = wOut[3]; + output+= 2; + *(cmsUInt16Number*) output = wOut[2]; + output+= 2; + *(cmsUInt16Number*) output = wOut[1]; + output+= 2; + *(cmsUInt16Number*) output = wOut[0]; + output+= 2; + + return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + + +static +cmsUInt8Number* Pack4Bytes(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wOut[], + CMSREGISTER cmsUInt8Number* output, + CMSREGISTER cmsUInt32Number Stride) +{ + *output++ = FROM_16_TO_8(wOut[0]); + *output++ = FROM_16_TO_8(wOut[1]); + *output++ = FROM_16_TO_8(wOut[2]); + *output++ = FROM_16_TO_8(wOut[3]); + + return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + +static +cmsUInt8Number* Pack4BytesReverse(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wOut[], + CMSREGISTER cmsUInt8Number* output, + CMSREGISTER cmsUInt32Number Stride) +{ + *output++ = REVERSE_FLAVOR_8(FROM_16_TO_8(wOut[0])); + *output++ = REVERSE_FLAVOR_8(FROM_16_TO_8(wOut[1])); + *output++ = REVERSE_FLAVOR_8(FROM_16_TO_8(wOut[2])); + *output++ = REVERSE_FLAVOR_8(FROM_16_TO_8(wOut[3])); + + return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + + +static +cmsUInt8Number* Pack4BytesSwapFirst(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wOut[], + CMSREGISTER cmsUInt8Number* output, + CMSREGISTER cmsUInt32Number Stride) +{ + *output++ = FROM_16_TO_8(wOut[3]); + *output++ = FROM_16_TO_8(wOut[0]); + *output++ = FROM_16_TO_8(wOut[1]); + *output++ = FROM_16_TO_8(wOut[2]); + + return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + +// ABGR +static +cmsUInt8Number* Pack4BytesSwap(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wOut[], + CMSREGISTER cmsUInt8Number* output, + CMSREGISTER cmsUInt32Number Stride) +{ + *output++ = FROM_16_TO_8(wOut[3]); + *output++ = FROM_16_TO_8(wOut[2]); + *output++ = FROM_16_TO_8(wOut[1]); + *output++ = FROM_16_TO_8(wOut[0]); + + return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + +static +cmsUInt8Number* Pack4BytesSwapSwapFirst(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wOut[], + CMSREGISTER cmsUInt8Number* output, + CMSREGISTER cmsUInt32Number Stride) +{ + *output++ = FROM_16_TO_8(wOut[2]); + *output++ = FROM_16_TO_8(wOut[1]); + *output++ = FROM_16_TO_8(wOut[0]); + *output++ = FROM_16_TO_8(wOut[3]); + + return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + +static +cmsUInt8Number* Pack4Words(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wOut[], + CMSREGISTER cmsUInt8Number* output, + CMSREGISTER cmsUInt32Number Stride) +{ + *(cmsUInt16Number*) output = wOut[0]; + output+= 2; + *(cmsUInt16Number*) output = wOut[1]; + output+= 2; + *(cmsUInt16Number*) output = wOut[2]; + output+= 2; + *(cmsUInt16Number*) output = wOut[3]; + output+= 2; + + return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + +static +cmsUInt8Number* Pack4WordsReverse(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wOut[], + CMSREGISTER cmsUInt8Number* output, + CMSREGISTER cmsUInt32Number Stride) +{ + *(cmsUInt16Number*) output = REVERSE_FLAVOR_16(wOut[0]); + output+= 2; + *(cmsUInt16Number*) output = REVERSE_FLAVOR_16(wOut[1]); + output+= 2; + *(cmsUInt16Number*) output = REVERSE_FLAVOR_16(wOut[2]); + output+= 2; + *(cmsUInt16Number*) output = REVERSE_FLAVOR_16(wOut[3]); + output+= 2; + + return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + +// ABGR +static +cmsUInt8Number* Pack4WordsSwap(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wOut[], + CMSREGISTER cmsUInt8Number* output, + CMSREGISTER cmsUInt32Number Stride) +{ + *(cmsUInt16Number*) output = wOut[3]; + output+= 2; + *(cmsUInt16Number*) output = wOut[2]; + output+= 2; + *(cmsUInt16Number*) output = wOut[1]; + output+= 2; + *(cmsUInt16Number*) output = wOut[0]; + output+= 2; + + return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + +// CMYK +static +cmsUInt8Number* Pack4WordsBigEndian(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wOut[], + CMSREGISTER cmsUInt8Number* output, + CMSREGISTER cmsUInt32Number Stride) +{ + *(cmsUInt16Number*) output = CHANGE_ENDIAN(wOut[0]); + output+= 2; + *(cmsUInt16Number*) output = CHANGE_ENDIAN(wOut[1]); + output+= 2; + *(cmsUInt16Number*) output = CHANGE_ENDIAN(wOut[2]); + output+= 2; + *(cmsUInt16Number*) output = CHANGE_ENDIAN(wOut[3]); + output+= 2; + + return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + + +static +cmsUInt8Number* PackLabV2_8(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wOut[], + CMSREGISTER cmsUInt8Number* output, + CMSREGISTER cmsUInt32Number Stride) +{ + *output++ = FROM_16_TO_8(FomLabV4ToLabV2(wOut[0])); + *output++ = FROM_16_TO_8(FomLabV4ToLabV2(wOut[1])); + *output++ = FROM_16_TO_8(FomLabV4ToLabV2(wOut[2])); + + return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + +static +cmsUInt8Number* PackALabV2_8(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wOut[], + CMSREGISTER cmsUInt8Number* output, + CMSREGISTER cmsUInt32Number Stride) +{ + output++; + *output++ = FROM_16_TO_8(FomLabV4ToLabV2(wOut[0])); + *output++ = FROM_16_TO_8(FomLabV4ToLabV2(wOut[1])); + *output++ = FROM_16_TO_8(FomLabV4ToLabV2(wOut[2])); + + return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + +static +cmsUInt8Number* PackLabV2_16(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wOut[], + CMSREGISTER cmsUInt8Number* output, + CMSREGISTER cmsUInt32Number Stride) +{ + *(cmsUInt16Number*) output = FomLabV4ToLabV2(wOut[0]); + output += 2; + *(cmsUInt16Number*) output = FomLabV4ToLabV2(wOut[1]); + output += 2; + *(cmsUInt16Number*) output = FomLabV4ToLabV2(wOut[2]); + output += 2; + + return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + +static +cmsUInt8Number* Pack3Bytes(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wOut[], + CMSREGISTER cmsUInt8Number* output, + CMSREGISTER cmsUInt32Number Stride) +{ + *output++ = FROM_16_TO_8(wOut[0]); + *output++ = FROM_16_TO_8(wOut[1]); + *output++ = FROM_16_TO_8(wOut[2]); + + return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + +static +cmsUInt8Number* Pack3BytesOptimized(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wOut[], + CMSREGISTER cmsUInt8Number* output, + CMSREGISTER cmsUInt32Number Stride) +{ + *output++ = (wOut[0] & 0xFFU); + *output++ = (wOut[1] & 0xFFU); + *output++ = (wOut[2] & 0xFFU); + + return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + +static +cmsUInt8Number* Pack3BytesSwap(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wOut[], + CMSREGISTER cmsUInt8Number* output, + CMSREGISTER cmsUInt32Number Stride) +{ + *output++ = FROM_16_TO_8(wOut[2]); + *output++ = FROM_16_TO_8(wOut[1]); + *output++ = FROM_16_TO_8(wOut[0]); + + return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + +static +cmsUInt8Number* Pack3BytesSwapOptimized(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wOut[], + CMSREGISTER cmsUInt8Number* output, + CMSREGISTER cmsUInt32Number Stride) +{ + *output++ = (wOut[2] & 0xFFU); + *output++ = (wOut[1] & 0xFFU); + *output++ = (wOut[0] & 0xFFU); + + return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + + +static +cmsUInt8Number* Pack3Words(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wOut[], + CMSREGISTER cmsUInt8Number* output, + CMSREGISTER cmsUInt32Number Stride) +{ + *(cmsUInt16Number*) output = wOut[0]; + output+= 2; + *(cmsUInt16Number*) output = wOut[1]; + output+= 2; + *(cmsUInt16Number*) output = wOut[2]; + output+= 2; + + return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + +static +cmsUInt8Number* Pack3WordsSwap(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wOut[], + CMSREGISTER cmsUInt8Number* output, + CMSREGISTER cmsUInt32Number Stride) +{ + *(cmsUInt16Number*) output = wOut[2]; + output+= 2; + *(cmsUInt16Number*) output = wOut[1]; + output+= 2; + *(cmsUInt16Number*) output = wOut[0]; + output+= 2; + + return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + +static +cmsUInt8Number* Pack3WordsBigEndian(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wOut[], + CMSREGISTER cmsUInt8Number* output, + CMSREGISTER cmsUInt32Number Stride) +{ + *(cmsUInt16Number*) output = CHANGE_ENDIAN(wOut[0]); + output+= 2; + *(cmsUInt16Number*) output = CHANGE_ENDIAN(wOut[1]); + output+= 2; + *(cmsUInt16Number*) output = CHANGE_ENDIAN(wOut[2]); + output+= 2; + + return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + +static +cmsUInt8Number* Pack3BytesAndSkip1(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wOut[], + CMSREGISTER cmsUInt8Number* output, + CMSREGISTER cmsUInt32Number Stride) +{ + *output++ = FROM_16_TO_8(wOut[0]); + *output++ = FROM_16_TO_8(wOut[1]); + *output++ = FROM_16_TO_8(wOut[2]); + output++; + + return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + +static +cmsUInt8Number* Pack3BytesAndSkip1Optimized(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wOut[], + CMSREGISTER cmsUInt8Number* output, + CMSREGISTER cmsUInt32Number Stride) +{ + *output++ = (wOut[0] & 0xFFU); + *output++ = (wOut[1] & 0xFFU); + *output++ = (wOut[2] & 0xFFU); + output++; + + return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + + +static +cmsUInt8Number* Pack3BytesAndSkip1SwapFirst(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wOut[], + CMSREGISTER cmsUInt8Number* output, + CMSREGISTER cmsUInt32Number Stride) +{ + output++; + *output++ = FROM_16_TO_8(wOut[0]); + *output++ = FROM_16_TO_8(wOut[1]); + *output++ = FROM_16_TO_8(wOut[2]); + + return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + +static +cmsUInt8Number* Pack3BytesAndSkip1SwapFirstOptimized(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wOut[], + CMSREGISTER cmsUInt8Number* output, + CMSREGISTER cmsUInt32Number Stride) +{ + output++; + *output++ = (wOut[0] & 0xFFU); + *output++ = (wOut[1] & 0xFFU); + *output++ = (wOut[2] & 0xFFU); + + return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + +static +cmsUInt8Number* Pack3BytesAndSkip1Swap(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wOut[], + CMSREGISTER cmsUInt8Number* output, + CMSREGISTER cmsUInt32Number Stride) +{ + output++; + *output++ = FROM_16_TO_8(wOut[2]); + *output++ = FROM_16_TO_8(wOut[1]); + *output++ = FROM_16_TO_8(wOut[0]); + + return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + +static +cmsUInt8Number* Pack3BytesAndSkip1SwapOptimized(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wOut[], + CMSREGISTER cmsUInt8Number* output, + CMSREGISTER cmsUInt32Number Stride) +{ + output++; + *output++ = (wOut[2] & 0xFFU); + *output++ = (wOut[1] & 0xFFU); + *output++ = (wOut[0] & 0xFFU); + + return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + + +static +cmsUInt8Number* Pack3BytesAndSkip1SwapSwapFirst(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wOut[], + CMSREGISTER cmsUInt8Number* output, + CMSREGISTER cmsUInt32Number Stride) +{ + *output++ = FROM_16_TO_8(wOut[2]); + *output++ = FROM_16_TO_8(wOut[1]); + *output++ = FROM_16_TO_8(wOut[0]); + output++; + + return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + +static +cmsUInt8Number* Pack3BytesAndSkip1SwapSwapFirstOptimized(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wOut[], + CMSREGISTER cmsUInt8Number* output, + CMSREGISTER cmsUInt32Number Stride) +{ + *output++ = (wOut[2] & 0xFFU); + *output++ = (wOut[1] & 0xFFU); + *output++ = (wOut[0] & 0xFFU); + output++; + + return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + +static +cmsUInt8Number* Pack3WordsAndSkip1(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wOut[], + CMSREGISTER cmsUInt8Number* output, + CMSREGISTER cmsUInt32Number Stride) +{ + *(cmsUInt16Number*) output = wOut[0]; + output+= 2; + *(cmsUInt16Number*) output = wOut[1]; + output+= 2; + *(cmsUInt16Number*) output = wOut[2]; + output+= 2; + output+= 2; + + return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + +static +cmsUInt8Number* Pack3WordsAndSkip1Swap(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wOut[], + CMSREGISTER cmsUInt8Number* output, + CMSREGISTER cmsUInt32Number Stride) +{ + output+= 2; + *(cmsUInt16Number*) output = wOut[2]; + output+= 2; + *(cmsUInt16Number*) output = wOut[1]; + output+= 2; + *(cmsUInt16Number*) output = wOut[0]; + output+= 2; + + return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + + +static +cmsUInt8Number* Pack3WordsAndSkip1SwapFirst(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wOut[], + CMSREGISTER cmsUInt8Number* output, + CMSREGISTER cmsUInt32Number Stride) +{ + output+= 2; + *(cmsUInt16Number*) output = wOut[0]; + output+= 2; + *(cmsUInt16Number*) output = wOut[1]; + output+= 2; + *(cmsUInt16Number*) output = wOut[2]; + output+= 2; + + return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + + +static +cmsUInt8Number* Pack3WordsAndSkip1SwapSwapFirst(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wOut[], + CMSREGISTER cmsUInt8Number* output, + CMSREGISTER cmsUInt32Number Stride) +{ + *(cmsUInt16Number*) output = wOut[2]; + output+= 2; + *(cmsUInt16Number*) output = wOut[1]; + output+= 2; + *(cmsUInt16Number*) output = wOut[0]; + output+= 2; + output+= 2; + + return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + + + +static +cmsUInt8Number* Pack1Byte(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wOut[], + CMSREGISTER cmsUInt8Number* output, + CMSREGISTER cmsUInt32Number Stride) +{ + *output++ = FROM_16_TO_8(wOut[0]); + + return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + + +static +cmsUInt8Number* Pack1ByteReversed(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wOut[], + CMSREGISTER cmsUInt8Number* output, + CMSREGISTER cmsUInt32Number Stride) +{ + *output++ = FROM_16_TO_8(REVERSE_FLAVOR_16(wOut[0])); + + return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + + +static +cmsUInt8Number* Pack1ByteSkip1(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wOut[], + CMSREGISTER cmsUInt8Number* output, + CMSREGISTER cmsUInt32Number Stride) +{ + *output++ = FROM_16_TO_8(wOut[0]); + output++; + + return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + + +static +cmsUInt8Number* Pack1ByteSkip1SwapFirst(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wOut[], + CMSREGISTER cmsUInt8Number* output, + CMSREGISTER cmsUInt32Number Stride) +{ + output++; + *output++ = FROM_16_TO_8(wOut[0]); + + return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + +static +cmsUInt8Number* Pack1Word(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wOut[], + CMSREGISTER cmsUInt8Number* output, + CMSREGISTER cmsUInt32Number Stride) +{ + *(cmsUInt16Number*) output = wOut[0]; + output+= 2; + + return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + + +static +cmsUInt8Number* Pack1WordReversed(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wOut[], + CMSREGISTER cmsUInt8Number* output, + CMSREGISTER cmsUInt32Number Stride) +{ + *(cmsUInt16Number*) output = REVERSE_FLAVOR_16(wOut[0]); + output+= 2; + + return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + +static +cmsUInt8Number* Pack1WordBigEndian(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wOut[], + CMSREGISTER cmsUInt8Number* output, + CMSREGISTER cmsUInt32Number Stride) +{ + *(cmsUInt16Number*) output = CHANGE_ENDIAN(wOut[0]); + output+= 2; + + return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + + +static +cmsUInt8Number* Pack1WordSkip1(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wOut[], + CMSREGISTER cmsUInt8Number* output, + CMSREGISTER cmsUInt32Number Stride) +{ + *(cmsUInt16Number*) output = wOut[0]; + output+= 4; + + return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + +static +cmsUInt8Number* Pack1WordSkip1SwapFirst(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wOut[], + CMSREGISTER cmsUInt8Number* output, + CMSREGISTER cmsUInt32Number Stride) +{ + output += 2; + *(cmsUInt16Number*) output = wOut[0]; + output+= 2; + + return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(Stride); +} + + +// Unencoded Float values -- don't try optimize speed +static +cmsUInt8Number* PackLabDoubleFrom16(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wOut[], + CMSREGISTER cmsUInt8Number* output, + CMSREGISTER cmsUInt32Number Stride) +{ + + if (T_PLANAR(info -> OutputFormat)) { + + cmsCIELab Lab; + cmsFloat64Number* Out = (cmsFloat64Number*) output; + cmsLabEncoded2Float(&Lab, wOut); + + Out[0] = Lab.L; + Out[Stride] = Lab.a; + Out[Stride*2] = Lab.b; + + return output + sizeof(cmsFloat64Number); + } + else { + + cmsLabEncoded2Float((cmsCIELab*) output, wOut); + return output + (sizeof(cmsCIELab) + T_EXTRA(info ->OutputFormat) * sizeof(cmsFloat64Number)); + } +} + + +static +cmsUInt8Number* PackLabFloatFrom16(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wOut[], + CMSREGISTER cmsUInt8Number* output, + CMSREGISTER cmsUInt32Number Stride) +{ + cmsCIELab Lab; + cmsLabEncoded2Float(&Lab, wOut); + + if (T_PLANAR(info -> OutputFormat)) { + + cmsFloat32Number* Out = (cmsFloat32Number*) output; + + Stride /= PixelSize(info->OutputFormat); + + Out[0] = (cmsFloat32Number)Lab.L; + Out[Stride] = (cmsFloat32Number)Lab.a; + Out[Stride*2] = (cmsFloat32Number)Lab.b; + + return output + sizeof(cmsFloat32Number); + } + else { + + ((cmsFloat32Number*) output)[0] = (cmsFloat32Number) Lab.L; + ((cmsFloat32Number*) output)[1] = (cmsFloat32Number) Lab.a; + ((cmsFloat32Number*) output)[2] = (cmsFloat32Number) Lab.b; + + return output + (3 + T_EXTRA(info ->OutputFormat)) * sizeof(cmsFloat32Number); + } +} + +static +cmsUInt8Number* PackXYZDoubleFrom16(CMSREGISTER _cmsTRANSFORM* Info, + CMSREGISTER cmsUInt16Number wOut[], + CMSREGISTER cmsUInt8Number* output, + CMSREGISTER cmsUInt32Number Stride) +{ + if (T_PLANAR(Info -> OutputFormat)) { + + cmsCIEXYZ XYZ; + cmsFloat64Number* Out = (cmsFloat64Number*) output; + cmsXYZEncoded2Float(&XYZ, wOut); + + Stride /= PixelSize(Info->OutputFormat); + + Out[0] = XYZ.X; + Out[Stride] = XYZ.Y; + Out[Stride*2] = XYZ.Z; + + return output + sizeof(cmsFloat64Number); + + } + else { + + cmsXYZEncoded2Float((cmsCIEXYZ*) output, wOut); + + return output + (sizeof(cmsCIEXYZ) + T_EXTRA(Info ->OutputFormat) * sizeof(cmsFloat64Number)); + } +} + +static +cmsUInt8Number* PackXYZFloatFrom16(CMSREGISTER _cmsTRANSFORM* Info, + CMSREGISTER cmsUInt16Number wOut[], + CMSREGISTER cmsUInt8Number* output, + CMSREGISTER cmsUInt32Number Stride) +{ + if (T_PLANAR(Info -> OutputFormat)) { + + cmsCIEXYZ XYZ; + cmsFloat32Number* Out = (cmsFloat32Number*) output; + cmsXYZEncoded2Float(&XYZ, wOut); + + Stride /= PixelSize(Info->OutputFormat); + + Out[0] = (cmsFloat32Number) XYZ.X; + Out[Stride] = (cmsFloat32Number) XYZ.Y; + Out[Stride*2] = (cmsFloat32Number) XYZ.Z; + + return output + sizeof(cmsFloat32Number); + + } + else { + + cmsCIEXYZ XYZ; + cmsFloat32Number* Out = (cmsFloat32Number*) output; + cmsXYZEncoded2Float(&XYZ, wOut); + + Out[0] = (cmsFloat32Number) XYZ.X; + Out[1] = (cmsFloat32Number) XYZ.Y; + Out[2] = (cmsFloat32Number) XYZ.Z; + + return output + (3 * sizeof(cmsFloat32Number) + T_EXTRA(Info ->OutputFormat) * sizeof(cmsFloat32Number)); + } +} + +static +cmsUInt8Number* PackDoubleFrom16(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wOut[], + CMSREGISTER cmsUInt8Number* output, + CMSREGISTER cmsUInt32Number Stride) +{ + cmsUInt32Number nChan = T_CHANNELS(info -> OutputFormat); + cmsUInt32Number DoSwap = T_DOSWAP(info ->OutputFormat); + cmsUInt32Number Reverse = T_FLAVOR(info ->OutputFormat); + cmsUInt32Number Extra = T_EXTRA(info -> OutputFormat); + cmsUInt32Number SwapFirst = T_SWAPFIRST(info -> OutputFormat); + cmsUInt32Number Planar = T_PLANAR(info -> OutputFormat); + cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst; + cmsFloat64Number maximum = IsInkSpace(info ->OutputFormat) ? 655.35 : 65535.0; + cmsFloat64Number v = 0; + cmsFloat64Number* swap1 = (cmsFloat64Number*) output; + cmsUInt32Number i, start = 0; + + Stride /= PixelSize(info->OutputFormat); + + if (ExtraFirst) + start = Extra; + + for (i=0; i < nChan; i++) { + + cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i; + + v = (cmsFloat64Number) wOut[index] / maximum; + + if (Reverse) + v = maximum - v; + + if (Planar) + ((cmsFloat64Number*) output)[(i + start) * Stride]= v; + else + ((cmsFloat64Number*) output)[i + start] = v; + } + + + if (Extra == 0 && SwapFirst) { + + memmove(swap1 + 1, swap1, (nChan-1)* sizeof(cmsFloat64Number)); + *swap1 = v; + } + + if (T_PLANAR(info -> OutputFormat)) + return output + sizeof(cmsFloat64Number); + else + return output + (nChan + Extra) * sizeof(cmsFloat64Number); + +} + + +static +cmsUInt8Number* PackFloatFrom16(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wOut[], + CMSREGISTER cmsUInt8Number* output, + CMSREGISTER cmsUInt32Number Stride) +{ + cmsUInt32Number nChan = T_CHANNELS(info->OutputFormat); + cmsUInt32Number DoSwap = T_DOSWAP(info->OutputFormat); + cmsUInt32Number Reverse = T_FLAVOR(info->OutputFormat); + cmsUInt32Number Extra = T_EXTRA(info->OutputFormat); + cmsUInt32Number SwapFirst = T_SWAPFIRST(info->OutputFormat); + cmsUInt32Number Planar = T_PLANAR(info->OutputFormat); + cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst; + cmsFloat64Number maximum = IsInkSpace(info->OutputFormat) ? 655.35 : 65535.0; + cmsFloat64Number v = 0; + cmsFloat32Number* swap1 = (cmsFloat32Number*)output; + cmsUInt32Number i, start = 0; + + Stride /= PixelSize(info->OutputFormat); + + if (ExtraFirst) + start = Extra; + + for (i = 0; i < nChan; i++) { + + cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i; + + v = (cmsFloat64Number)wOut[index] / maximum; + + if (Reverse) + v = maximum - v; + + if (Planar) + ((cmsFloat32Number*)output)[(i + start) * Stride] = (cmsFloat32Number)v; + else + ((cmsFloat32Number*)output)[i + start] = (cmsFloat32Number)v; + } + + + if (Extra == 0 && SwapFirst) { + + memmove(swap1 + 1, swap1, (nChan - 1)* sizeof(cmsFloat32Number)); + *swap1 = (cmsFloat32Number)v; + } + + if (T_PLANAR(info->OutputFormat)) + return output + sizeof(cmsFloat32Number); + else + return output + (nChan + Extra) * sizeof(cmsFloat32Number); +} + + + +// -------------------------------------------------------------------------------------------------------- + +static +cmsUInt8Number* PackBytesFromFloat(_cmsTRANSFORM* info, + cmsFloat32Number wOut[], + cmsUInt8Number* output, + cmsUInt32Number Stride) +{ + cmsUInt32Number nChan = T_CHANNELS(info->OutputFormat); + cmsUInt32Number DoSwap = T_DOSWAP(info->OutputFormat); + cmsUInt32Number Reverse = T_FLAVOR(info->OutputFormat); + cmsUInt32Number Extra = T_EXTRA(info->OutputFormat); + cmsUInt32Number SwapFirst = T_SWAPFIRST(info->OutputFormat); + cmsUInt32Number Planar = T_PLANAR(info->OutputFormat); + cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst; + cmsUInt8Number* swap1 = (cmsUInt8Number*)output; + cmsFloat64Number v = 0; + cmsUInt8Number vv = 0; + cmsUInt32Number i, start = 0; + + if (ExtraFirst) + start = Extra; + + for (i = 0; i < nChan; i++) { + + cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i; + + v = wOut[index] * 65535.0; + + if (Reverse) + v = 65535.0 - v; + + vv = FROM_16_TO_8(_cmsQuickSaturateWord(v)); + + if (Planar) + ((cmsUInt8Number*)output)[(i + start) * Stride] = vv; + else + ((cmsUInt8Number*)output)[i + start] = vv; + } + + + if (Extra == 0 && SwapFirst) { + + memmove(swap1 + 1, swap1, (nChan - 1) * sizeof(cmsUInt8Number)); + *swap1 = vv; + } + + if (T_PLANAR(info->OutputFormat)) + return output + sizeof(cmsUInt8Number); + else + return output + (nChan + Extra) * sizeof(cmsUInt8Number); +} + +static +cmsUInt8Number* PackWordsFromFloat(_cmsTRANSFORM* info, + cmsFloat32Number wOut[], + cmsUInt8Number* output, + cmsUInt32Number Stride) +{ + cmsUInt32Number nChan = T_CHANNELS(info->OutputFormat); + cmsUInt32Number DoSwap = T_DOSWAP(info->OutputFormat); + cmsUInt32Number Reverse = T_FLAVOR(info->OutputFormat); + cmsUInt32Number Extra = T_EXTRA(info->OutputFormat); + cmsUInt32Number SwapFirst = T_SWAPFIRST(info->OutputFormat); + cmsUInt32Number Planar = T_PLANAR(info->OutputFormat); + cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst; + cmsUInt16Number* swap1 = (cmsUInt16Number*)output; + cmsFloat64Number v = 0; + cmsUInt16Number vv = 0; + cmsUInt32Number i, start = 0; + + if (ExtraFirst) + start = Extra; + + Stride /= 2; + for (i = 0; i < nChan; i++) { + + cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i; + + v = wOut[index] * 65535.0; + + if (Reverse) + v = 65535.0 - v; + + vv = _cmsQuickSaturateWord(v); + + if (Planar) + ((cmsUInt16Number*)output)[(i + start) * Stride] = vv; + else + ((cmsUInt16Number*)output)[i + start] = vv; + } + + if (Extra == 0 && SwapFirst) { + + memmove(swap1 + 1, swap1, (nChan - 1) * sizeof(cmsUInt16Number)); + *swap1 = vv; + } + + if (T_PLANAR(info->OutputFormat)) + return output + sizeof(cmsUInt16Number); + else + return output + (nChan + Extra) * sizeof(cmsUInt16Number); +} + + +static +cmsUInt8Number* PackFloatsFromFloat(_cmsTRANSFORM* info, + cmsFloat32Number wOut[], + cmsUInt8Number* output, + cmsUInt32Number Stride) +{ + cmsUInt32Number nChan = T_CHANNELS(info->OutputFormat); + cmsUInt32Number DoSwap = T_DOSWAP(info->OutputFormat); + cmsUInt32Number Reverse = T_FLAVOR(info->OutputFormat); + cmsUInt32Number Extra = T_EXTRA(info->OutputFormat); + cmsUInt32Number SwapFirst = T_SWAPFIRST(info->OutputFormat); + cmsUInt32Number Planar = T_PLANAR(info->OutputFormat); + cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst; + cmsFloat64Number maximum = IsInkSpace(info->OutputFormat) ? 100.0 : 1.0; + cmsFloat32Number* swap1 = (cmsFloat32Number*)output; + cmsFloat64Number v = 0; + cmsUInt32Number i, start = 0; + + Stride /= PixelSize(info->OutputFormat); + + if (ExtraFirst) + start = Extra; + + for (i = 0; i < nChan; i++) { + + cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i; + + v = wOut[index] * maximum; + + if (Reverse) + v = maximum - v; + + if (Planar) + ((cmsFloat32Number*)output)[(i + start) * Stride] = (cmsFloat32Number)v; + else + ((cmsFloat32Number*)output)[i + start] = (cmsFloat32Number)v; + } + + + if (Extra == 0 && SwapFirst) { + + memmove(swap1 + 1, swap1, (nChan - 1)* sizeof(cmsFloat32Number)); + *swap1 = (cmsFloat32Number)v; + } + + if (T_PLANAR(info->OutputFormat)) + return output + sizeof(cmsFloat32Number); + else + return output + (nChan + Extra) * sizeof(cmsFloat32Number); +} + +static +cmsUInt8Number* PackDoublesFromFloat(_cmsTRANSFORM* info, + cmsFloat32Number wOut[], + cmsUInt8Number* output, + cmsUInt32Number Stride) +{ + cmsUInt32Number nChan = T_CHANNELS(info->OutputFormat); + cmsUInt32Number DoSwap = T_DOSWAP(info->OutputFormat); + cmsUInt32Number Reverse = T_FLAVOR(info->OutputFormat); + cmsUInt32Number Extra = T_EXTRA(info->OutputFormat); + cmsUInt32Number SwapFirst = T_SWAPFIRST(info->OutputFormat); + cmsUInt32Number Planar = T_PLANAR(info->OutputFormat); + cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst; + cmsFloat64Number maximum = IsInkSpace(info->OutputFormat) ? 100.0 : 1.0; + cmsFloat64Number v = 0; + cmsFloat64Number* swap1 = (cmsFloat64Number*)output; + cmsUInt32Number i, start = 0; + + Stride /= PixelSize(info->OutputFormat); + + if (ExtraFirst) + start = Extra; + + for (i = 0; i < nChan; i++) { + + cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i; + + v = wOut[index] * maximum; + + if (Reverse) + v = maximum - v; + + if (Planar) + ((cmsFloat64Number*)output)[(i + start) * Stride] = v; + else + ((cmsFloat64Number*)output)[i + start] = v; + } + + if (Extra == 0 && SwapFirst) { + + memmove(swap1 + 1, swap1, (nChan - 1)* sizeof(cmsFloat64Number)); + *swap1 = v; + } + + + if (T_PLANAR(info->OutputFormat)) + return output + sizeof(cmsFloat64Number); + else + return output + (nChan + Extra) * sizeof(cmsFloat64Number); + +} + +static +cmsUInt8Number* PackLabFloatFromFloat(_cmsTRANSFORM* Info, + cmsFloat32Number wOut[], + cmsUInt8Number* output, + cmsUInt32Number Stride) +{ + cmsFloat32Number* Out = (cmsFloat32Number*) output; + + if (T_PLANAR(Info -> OutputFormat)) { + + Stride /= PixelSize(Info->OutputFormat); + + Out[0] = (cmsFloat32Number) (wOut[0] * 100.0); + Out[Stride] = (cmsFloat32Number) (wOut[1] * 255.0 - 128.0); + Out[Stride*2] = (cmsFloat32Number) (wOut[2] * 255.0 - 128.0); + + return output + sizeof(cmsFloat32Number); + } + else { + + Out[0] = (cmsFloat32Number) (wOut[0] * 100.0); + Out[1] = (cmsFloat32Number) (wOut[1] * 255.0 - 128.0); + Out[2] = (cmsFloat32Number) (wOut[2] * 255.0 - 128.0); + + return output + (sizeof(cmsFloat32Number)*3 + T_EXTRA(Info ->OutputFormat) * sizeof(cmsFloat32Number)); + } + +} + + +static +cmsUInt8Number* PackLabDoubleFromFloat(_cmsTRANSFORM* Info, + cmsFloat32Number wOut[], + cmsUInt8Number* output, + cmsUInt32Number Stride) +{ + cmsFloat64Number* Out = (cmsFloat64Number*) output; + + if (T_PLANAR(Info -> OutputFormat)) { + + Stride /= PixelSize(Info->OutputFormat); + + Out[0] = (cmsFloat64Number) (wOut[0] * 100.0); + Out[Stride] = (cmsFloat64Number) (wOut[1] * 255.0 - 128.0); + Out[Stride*2] = (cmsFloat64Number) (wOut[2] * 255.0 - 128.0); + + return output + sizeof(cmsFloat64Number); + } + else { + + Out[0] = (cmsFloat64Number) (wOut[0] * 100.0); + Out[1] = (cmsFloat64Number) (wOut[1] * 255.0 - 128.0); + Out[2] = (cmsFloat64Number) (wOut[2] * 255.0 - 128.0); + + return output + (sizeof(cmsFloat64Number)*3 + T_EXTRA(Info ->OutputFormat) * sizeof(cmsFloat64Number)); + } + +} + + +static +cmsUInt8Number* PackEncodedBytesLabV2FromFloat(_cmsTRANSFORM* Info, + cmsFloat32Number wOut[], + cmsUInt8Number* output, + cmsUInt32Number Stride) +{ + cmsCIELab Lab; + cmsUInt16Number wlab[3]; + + Lab.L = (cmsFloat64Number)(wOut[0] * 100.0); + Lab.a = (cmsFloat64Number)(wOut[1] * 255.0 - 128.0); + Lab.b = (cmsFloat64Number)(wOut[2] * 255.0 - 128.0); + + cmsFloat2LabEncoded(wlab, &Lab); + + if (T_PLANAR(Info -> OutputFormat)) { + + Stride /= PixelSize(Info->OutputFormat); + + output[0] = wlab[0] >> 8; + output[Stride] = wlab[1] >> 8; + output[Stride*2] = wlab[2] >> 8; + + return output + 1; + } + else { + + output[0] = wlab[0] >> 8; + output[1] = wlab[1] >> 8; + output[2] = wlab[2] >> 8; + + return output + (3 + T_EXTRA(Info ->OutputFormat)); + } +} + +static +cmsUInt8Number* PackEncodedWordsLabV2FromFloat(_cmsTRANSFORM* Info, + cmsFloat32Number wOut[], + cmsUInt8Number* output, + cmsUInt32Number Stride) +{ + cmsCIELab Lab; + cmsUInt16Number wlab[3]; + + Lab.L = (cmsFloat64Number)(wOut[0] * 100.0); + Lab.a = (cmsFloat64Number)(wOut[1] * 255.0 - 128.0); + Lab.b = (cmsFloat64Number)(wOut[2] * 255.0 - 128.0); + + cmsFloat2LabEncodedV2(wlab, &Lab); + + if (T_PLANAR(Info -> OutputFormat)) { + + Stride /= PixelSize(Info->OutputFormat); + + ((cmsUInt16Number*) output)[0] = wlab[0]; + ((cmsUInt16Number*) output)[Stride] = wlab[1]; + ((cmsUInt16Number*) output)[Stride*2] = wlab[2]; + + return output + sizeof(cmsUInt16Number); + } + else { + + ((cmsUInt16Number*) output)[0] = wlab[0]; + ((cmsUInt16Number*) output)[1] = wlab[1]; + ((cmsUInt16Number*) output)[2] = wlab[2]; + + return output + (3 + T_EXTRA(Info ->OutputFormat)) * sizeof(cmsUInt16Number); + } +} + + +// From 0..1 range to 0..MAX_ENCODEABLE_XYZ +static +cmsUInt8Number* PackXYZFloatFromFloat(_cmsTRANSFORM* Info, + cmsFloat32Number wOut[], + cmsUInt8Number* output, + cmsUInt32Number Stride) +{ + cmsFloat32Number* Out = (cmsFloat32Number*) output; + + if (T_PLANAR(Info -> OutputFormat)) { + + Stride /= PixelSize(Info->OutputFormat); + + Out[0] = (cmsFloat32Number) (wOut[0] * MAX_ENCODEABLE_XYZ); + Out[Stride] = (cmsFloat32Number) (wOut[1] * MAX_ENCODEABLE_XYZ); + Out[Stride*2] = (cmsFloat32Number) (wOut[2] * MAX_ENCODEABLE_XYZ); + + return output + sizeof(cmsFloat32Number); + } + else { + + Out[0] = (cmsFloat32Number) (wOut[0] * MAX_ENCODEABLE_XYZ); + Out[1] = (cmsFloat32Number) (wOut[1] * MAX_ENCODEABLE_XYZ); + Out[2] = (cmsFloat32Number) (wOut[2] * MAX_ENCODEABLE_XYZ); + + return output + (sizeof(cmsFloat32Number)*3 + T_EXTRA(Info ->OutputFormat) * sizeof(cmsFloat32Number)); + } + +} + +// Same, but convert to double +static +cmsUInt8Number* PackXYZDoubleFromFloat(_cmsTRANSFORM* Info, + cmsFloat32Number wOut[], + cmsUInt8Number* output, + cmsUInt32Number Stride) +{ + cmsFloat64Number* Out = (cmsFloat64Number*) output; + + if (T_PLANAR(Info -> OutputFormat)) { + + Stride /= PixelSize(Info->OutputFormat); + + Out[0] = (cmsFloat64Number) (wOut[0] * MAX_ENCODEABLE_XYZ); + Out[Stride] = (cmsFloat64Number) (wOut[1] * MAX_ENCODEABLE_XYZ); + Out[Stride*2] = (cmsFloat64Number) (wOut[2] * MAX_ENCODEABLE_XYZ); + + return output + sizeof(cmsFloat64Number); + } + else { + + Out[0] = (cmsFloat64Number) (wOut[0] * MAX_ENCODEABLE_XYZ); + Out[1] = (cmsFloat64Number) (wOut[1] * MAX_ENCODEABLE_XYZ); + Out[2] = (cmsFloat64Number) (wOut[2] * MAX_ENCODEABLE_XYZ); + + return output + (sizeof(cmsFloat64Number)*3 + T_EXTRA(Info ->OutputFormat) * sizeof(cmsFloat64Number)); + } + +} + + +// ---------------------------------------------------------------------------------------------------------------- + +#ifndef CMS_NO_HALF_SUPPORT + +// Decodes an stream of half floats to wIn[] described by input format + +static +cmsUInt8Number* UnrollHalfTo16(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wIn[], + CMSREGISTER cmsUInt8Number* accum, + CMSREGISTER cmsUInt32Number Stride) +{ + + cmsUInt32Number nChan = T_CHANNELS(info -> InputFormat); + cmsUInt32Number DoSwap = T_DOSWAP(info ->InputFormat); + cmsUInt32Number Reverse = T_FLAVOR(info ->InputFormat); + cmsUInt32Number SwapFirst = T_SWAPFIRST(info -> InputFormat); + cmsUInt32Number Extra = T_EXTRA(info -> InputFormat); + cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst; + cmsUInt32Number Planar = T_PLANAR(info -> InputFormat); + cmsFloat32Number v; + cmsUInt32Number i, start = 0; + cmsFloat32Number maximum = IsInkSpace(info ->InputFormat) ? 655.35F : 65535.0F; + + + Stride /= PixelSize(info->OutputFormat); + + if (ExtraFirst) + start = Extra; + + for (i=0; i < nChan; i++) { + + cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i; + + if (Planar) + v = _cmsHalf2Float ( ((cmsUInt16Number*) accum)[(i + start) * Stride] ); + else + v = _cmsHalf2Float ( ((cmsUInt16Number*) accum)[i + start] ) ; + + if (Reverse) v = maximum - v; + + wIn[index] = _cmsQuickSaturateWord((cmsFloat64Number) v * maximum); + } + + + if (Extra == 0 && SwapFirst) { + cmsUInt16Number tmp = wIn[0]; + + memmove(&wIn[0], &wIn[1], (nChan-1) * sizeof(cmsUInt16Number)); + wIn[nChan-1] = tmp; + } + + if (T_PLANAR(info -> InputFormat)) + return accum + sizeof(cmsUInt16Number); + else + return accum + (nChan + Extra) * sizeof(cmsUInt16Number); +} + +// Decodes an stream of half floats to wIn[] described by input format + +static +cmsUInt8Number* UnrollHalfToFloat(_cmsTRANSFORM* info, + cmsFloat32Number wIn[], + cmsUInt8Number* accum, + cmsUInt32Number Stride) +{ + + cmsUInt32Number nChan = T_CHANNELS(info -> InputFormat); + cmsUInt32Number DoSwap = T_DOSWAP(info ->InputFormat); + cmsUInt32Number Reverse = T_FLAVOR(info ->InputFormat); + cmsUInt32Number SwapFirst = T_SWAPFIRST(info -> InputFormat); + cmsUInt32Number Extra = T_EXTRA(info -> InputFormat); + cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst; + cmsUInt32Number Planar = T_PLANAR(info -> InputFormat); + cmsFloat32Number v; + cmsUInt32Number i, start = 0; + cmsFloat32Number maximum = IsInkSpace(info ->InputFormat) ? 100.0F : 1.0F; + + Stride /= PixelSize(info->InputFormat); + + if (ExtraFirst) + start = Extra; + + for (i=0; i < nChan; i++) { + + cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i; + + if (Planar) + v = _cmsHalf2Float ( ((cmsUInt16Number*) accum)[(i + start) * Stride] ); + else + v = _cmsHalf2Float ( ((cmsUInt16Number*) accum)[i + start] ) ; + + v /= maximum; + + wIn[index] = Reverse ? 1 - v : v; + } + + + if (Extra == 0 && SwapFirst) { + cmsFloat32Number tmp = wIn[0]; + + memmove(&wIn[0], &wIn[1], (nChan-1) * sizeof(cmsFloat32Number)); + wIn[nChan-1] = tmp; + } + + if (T_PLANAR(info -> InputFormat)) + return accum + sizeof(cmsUInt16Number); + else + return accum + (nChan + Extra) * sizeof(cmsUInt16Number); +} + + +static +cmsUInt8Number* PackHalfFrom16(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wOut[], + CMSREGISTER cmsUInt8Number* output, + CMSREGISTER cmsUInt32Number Stride) +{ + cmsUInt32Number nChan = T_CHANNELS(info->OutputFormat); + cmsUInt32Number DoSwap = T_DOSWAP(info->OutputFormat); + cmsUInt32Number Reverse = T_FLAVOR(info->OutputFormat); + cmsUInt32Number Extra = T_EXTRA(info->OutputFormat); + cmsUInt32Number SwapFirst = T_SWAPFIRST(info->OutputFormat); + cmsUInt32Number Planar = T_PLANAR(info->OutputFormat); + cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst; + cmsFloat32Number maximum = IsInkSpace(info->OutputFormat) ? 655.35F : 65535.0F; + cmsFloat32Number v = 0; + cmsUInt16Number* swap1 = (cmsUInt16Number*)output; + cmsUInt32Number i, start = 0; + + Stride /= PixelSize(info->OutputFormat); + + if (ExtraFirst) + start = Extra; + + for (i = 0; i < nChan; i++) { + + cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i; + + v = (cmsFloat32Number)wOut[index] / maximum; + + if (Reverse) + v = maximum - v; + + if (Planar) + ((cmsUInt16Number*)output)[(i + start) * Stride] = _cmsFloat2Half(v); + else + ((cmsUInt16Number*)output)[i + start] = _cmsFloat2Half(v); + } + + + if (Extra == 0 && SwapFirst) { + + memmove(swap1 + 1, swap1, (nChan - 1)* sizeof(cmsUInt16Number)); + *swap1 = _cmsFloat2Half(v); + } + + if (T_PLANAR(info->OutputFormat)) + return output + sizeof(cmsUInt16Number); + else + return output + (nChan + Extra) * sizeof(cmsUInt16Number); +} + + + +static +cmsUInt8Number* PackHalfFromFloat(_cmsTRANSFORM* info, + cmsFloat32Number wOut[], + cmsUInt8Number* output, + cmsUInt32Number Stride) +{ + cmsUInt32Number nChan = T_CHANNELS(info->OutputFormat); + cmsUInt32Number DoSwap = T_DOSWAP(info->OutputFormat); + cmsUInt32Number Reverse = T_FLAVOR(info->OutputFormat); + cmsUInt32Number Extra = T_EXTRA(info->OutputFormat); + cmsUInt32Number SwapFirst = T_SWAPFIRST(info->OutputFormat); + cmsUInt32Number Planar = T_PLANAR(info->OutputFormat); + cmsUInt32Number ExtraFirst = DoSwap ^ SwapFirst; + cmsFloat32Number maximum = IsInkSpace(info->OutputFormat) ? 100.0F : 1.0F; + cmsUInt16Number* swap1 = (cmsUInt16Number*)output; + cmsFloat32Number v = 0; + cmsUInt32Number i, start = 0; + + Stride /= PixelSize(info->OutputFormat); + + if (ExtraFirst) + start = Extra; + + for (i = 0; i < nChan; i++) { + + cmsUInt32Number index = DoSwap ? (nChan - i - 1) : i; + + v = wOut[index] * maximum; + + if (Reverse) + v = maximum - v; + + if (Planar) + ((cmsUInt16Number*)output)[(i + start)* Stride] = _cmsFloat2Half(v); + else + ((cmsUInt16Number*)output)[i + start] = _cmsFloat2Half(v); + } + + + if (Extra == 0 && SwapFirst) { + + memmove(swap1 + 1, swap1, (nChan - 1)* sizeof(cmsUInt16Number)); + *swap1 = (cmsUInt16Number)_cmsFloat2Half(v); + } + + if (T_PLANAR(info->OutputFormat)) + return output + sizeof(cmsUInt16Number); + else + return output + (nChan + Extra)* sizeof(cmsUInt16Number); +} + +#endif + +// ---------------------------------------------------------------------------------------------------------------- + + +static const cmsFormatters16 InputFormatters16[] = { + + // Type Mask Function + // ---------------------------- ------------------------------------ ---------------------------- + { TYPE_Lab_DBL, ANYPLANAR|ANYEXTRA, UnrollLabDoubleTo16}, + { TYPE_XYZ_DBL, ANYPLANAR|ANYEXTRA, UnrollXYZDoubleTo16}, + { TYPE_Lab_FLT, ANYPLANAR|ANYEXTRA, UnrollLabFloatTo16}, + { TYPE_XYZ_FLT, ANYPLANAR|ANYEXTRA, UnrollXYZFloatTo16}, + { TYPE_GRAY_DBL, 0, UnrollDouble1Chan}, + { FLOAT_SH(1)|BYTES_SH(0), ANYCHANNELS|ANYPLANAR|ANYSWAPFIRST|ANYFLAVOR| + ANYSWAP|ANYEXTRA|ANYSPACE, UnrollDoubleTo16}, + { FLOAT_SH(1)|BYTES_SH(4), ANYCHANNELS|ANYPLANAR|ANYSWAPFIRST|ANYFLAVOR| + ANYSWAP|ANYEXTRA|ANYSPACE, UnrollFloatTo16}, +#ifndef CMS_NO_HALF_SUPPORT + { FLOAT_SH(1)|BYTES_SH(2), ANYCHANNELS|ANYPLANAR|ANYSWAPFIRST|ANYFLAVOR| + ANYEXTRA|ANYSWAP|ANYSPACE, UnrollHalfTo16}, +#endif + + { CHANNELS_SH(1)|BYTES_SH(1), ANYSPACE, Unroll1Byte}, + { CHANNELS_SH(1)|BYTES_SH(1)|EXTRA_SH(1), ANYSPACE, Unroll1ByteSkip1}, + { CHANNELS_SH(1)|BYTES_SH(1)|EXTRA_SH(2), ANYSPACE, Unroll1ByteSkip2}, + { CHANNELS_SH(1)|BYTES_SH(1)|FLAVOR_SH(1), ANYSPACE, Unroll1ByteReversed}, + { COLORSPACE_SH(PT_MCH2)|CHANNELS_SH(2)|BYTES_SH(1), 0, Unroll2Bytes}, + + { TYPE_LabV2_8, 0, UnrollLabV2_8 }, + { TYPE_ALabV2_8, 0, UnrollALabV2_8 }, + { TYPE_LabV2_16, 0, UnrollLabV2_16 }, + + { CHANNELS_SH(3)|BYTES_SH(1), ANYSPACE, Unroll3Bytes}, + { CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1), ANYSPACE, Unroll3BytesSwap}, + { CHANNELS_SH(3)|EXTRA_SH(1)|BYTES_SH(1)|DOSWAP_SH(1), ANYSPACE, Unroll3BytesSkip1Swap}, + { CHANNELS_SH(3)|EXTRA_SH(1)|BYTES_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Unroll3BytesSkip1SwapFirst}, + + { CHANNELS_SH(3)|EXTRA_SH(1)|BYTES_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1), + ANYSPACE, Unroll3BytesSkip1SwapSwapFirst}, + + { CHANNELS_SH(4)|BYTES_SH(1), ANYSPACE, Unroll4Bytes}, + { CHANNELS_SH(4)|BYTES_SH(1)|FLAVOR_SH(1), ANYSPACE, Unroll4BytesReverse}, + { CHANNELS_SH(4)|BYTES_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Unroll4BytesSwapFirst}, + { CHANNELS_SH(4)|BYTES_SH(1)|DOSWAP_SH(1), ANYSPACE, Unroll4BytesSwap}, + { CHANNELS_SH(4)|BYTES_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Unroll4BytesSwapSwapFirst}, + + { BYTES_SH(1)|PLANAR_SH(1), ANYFLAVOR|ANYSWAPFIRST|ANYPREMUL| + ANYSWAP|ANYEXTRA|ANYCHANNELS|ANYSPACE, UnrollPlanarBytes}, + + { BYTES_SH(1), ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYPREMUL| + ANYEXTRA|ANYCHANNELS|ANYSPACE, UnrollChunkyBytes}, + + { CHANNELS_SH(1)|BYTES_SH(2), ANYSPACE, Unroll1Word}, + { CHANNELS_SH(1)|BYTES_SH(2)|FLAVOR_SH(1), ANYSPACE, Unroll1WordReversed}, + { CHANNELS_SH(1)|BYTES_SH(2)|EXTRA_SH(3), ANYSPACE, Unroll1WordSkip3}, + + { CHANNELS_SH(2)|BYTES_SH(2), ANYSPACE, Unroll2Words}, + { CHANNELS_SH(3)|BYTES_SH(2), ANYSPACE, Unroll3Words}, + { CHANNELS_SH(4)|BYTES_SH(2), ANYSPACE, Unroll4Words}, + + { CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1), ANYSPACE, Unroll3WordsSwap}, + { CHANNELS_SH(3)|BYTES_SH(2)|EXTRA_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Unroll3WordsSkip1SwapFirst}, + { CHANNELS_SH(3)|BYTES_SH(2)|EXTRA_SH(1)|DOSWAP_SH(1), ANYSPACE, Unroll3WordsSkip1Swap}, + { CHANNELS_SH(4)|BYTES_SH(2)|FLAVOR_SH(1), ANYSPACE, Unroll4WordsReverse}, + { CHANNELS_SH(4)|BYTES_SH(2)|SWAPFIRST_SH(1), ANYSPACE, Unroll4WordsSwapFirst}, + { CHANNELS_SH(4)|BYTES_SH(2)|DOSWAP_SH(1), ANYSPACE, Unroll4WordsSwap}, + { CHANNELS_SH(4)|BYTES_SH(2)|DOSWAP_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Unroll4WordsSwapSwapFirst}, + + + { BYTES_SH(2)|PLANAR_SH(1), ANYFLAVOR|ANYSWAP|ANYENDIAN|ANYEXTRA|ANYCHANNELS|ANYSPACE, UnrollPlanarWords}, + { BYTES_SH(2), ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYENDIAN|ANYEXTRA|ANYCHANNELS|ANYSPACE, UnrollAnyWords}, + + { BYTES_SH(2)|PLANAR_SH(1), ANYFLAVOR|ANYSWAP|ANYENDIAN|ANYEXTRA|ANYCHANNELS|ANYSPACE|PREMUL_SH(1), UnrollPlanarWordsPremul}, + { BYTES_SH(2), ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYENDIAN|ANYEXTRA|ANYCHANNELS|ANYSPACE|PREMUL_SH(1), UnrollAnyWordsPremul} + +}; + + + +static const cmsFormattersFloat InputFormattersFloat[] = { + + // Type Mask Function + // ---------------------------- ------------------------------------ ---------------------------- + { TYPE_Lab_DBL, ANYPLANAR|ANYEXTRA, UnrollLabDoubleToFloat}, + { TYPE_Lab_FLT, ANYPLANAR|ANYEXTRA, UnrollLabFloatToFloat}, + + { TYPE_XYZ_DBL, ANYPLANAR|ANYEXTRA, UnrollXYZDoubleToFloat}, + { TYPE_XYZ_FLT, ANYPLANAR|ANYEXTRA, UnrollXYZFloatToFloat}, + + { FLOAT_SH(1)|BYTES_SH(4), ANYPLANAR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA| + ANYPREMUL|ANYCHANNELS|ANYSPACE, UnrollFloatsToFloat}, + + { FLOAT_SH(1)|BYTES_SH(0), ANYPLANAR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA| + ANYCHANNELS|ANYSPACE|ANYPREMUL, UnrollDoublesToFloat}, + + { TYPE_LabV2_8, 0, UnrollLabV2_8ToFloat }, + { TYPE_ALabV2_8, 0, UnrollALabV2_8ToFloat }, + { TYPE_LabV2_16, 0, UnrollLabV2_16ToFloat }, + + { BYTES_SH(1), ANYPLANAR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA| + ANYCHANNELS|ANYSPACE, Unroll8ToFloat}, + + { BYTES_SH(2), ANYPLANAR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA| + ANYCHANNELS|ANYSPACE, Unroll16ToFloat}, +#ifndef CMS_NO_HALF_SUPPORT + { FLOAT_SH(1)|BYTES_SH(2), ANYPLANAR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA| + ANYCHANNELS|ANYSPACE, UnrollHalfToFloat}, +#endif +}; + + +// Bit fields set to one in the mask are not compared +static +cmsFormatter _cmsGetStockInputFormatter(cmsUInt32Number dwInput, cmsUInt32Number dwFlags) +{ + cmsUInt32Number i; + cmsFormatter fr; + + switch (dwFlags) { + + case CMS_PACK_FLAGS_16BITS: { + for (i=0; i < sizeof(InputFormatters16) / sizeof(cmsFormatters16); i++) { + const cmsFormatters16* f = InputFormatters16 + i; + + if ((dwInput & ~f ->Mask) == f ->Type) { + fr.Fmt16 = f ->Frm; + return fr; + } + } + } + break; + + case CMS_PACK_FLAGS_FLOAT: { + for (i=0; i < sizeof(InputFormattersFloat) / sizeof(cmsFormattersFloat); i++) { + const cmsFormattersFloat* f = InputFormattersFloat + i; + + if ((dwInput & ~f ->Mask) == f ->Type) { + fr.FmtFloat = f ->Frm; + return fr; + } + } + } + break; + + default:; + + } + + fr.Fmt16 = NULL; + return fr; +} + +static const cmsFormatters16 OutputFormatters16[] = { + // Type Mask Function + // ---------------------------- ------------------------------------ ---------------------------- + + { TYPE_Lab_DBL, ANYPLANAR|ANYEXTRA, PackLabDoubleFrom16}, + { TYPE_XYZ_DBL, ANYPLANAR|ANYEXTRA, PackXYZDoubleFrom16}, + + { TYPE_Lab_FLT, ANYPLANAR|ANYEXTRA, PackLabFloatFrom16}, + { TYPE_XYZ_FLT, ANYPLANAR|ANYEXTRA, PackXYZFloatFrom16}, + + { FLOAT_SH(1)|BYTES_SH(0), ANYFLAVOR|ANYSWAPFIRST|ANYSWAP| + ANYCHANNELS|ANYPLANAR|ANYEXTRA|ANYSPACE, PackDoubleFrom16}, + { FLOAT_SH(1)|BYTES_SH(4), ANYFLAVOR|ANYSWAPFIRST|ANYSWAP| + ANYCHANNELS|ANYPLANAR|ANYEXTRA|ANYSPACE, PackFloatFrom16}, +#ifndef CMS_NO_HALF_SUPPORT + { FLOAT_SH(1)|BYTES_SH(2), ANYFLAVOR|ANYSWAPFIRST|ANYSWAP| + ANYCHANNELS|ANYPLANAR|ANYEXTRA|ANYSPACE, PackHalfFrom16}, +#endif + + { CHANNELS_SH(1)|BYTES_SH(1), ANYSPACE, Pack1Byte}, + { CHANNELS_SH(1)|BYTES_SH(1)|EXTRA_SH(1), ANYSPACE, Pack1ByteSkip1}, + { CHANNELS_SH(1)|BYTES_SH(1)|EXTRA_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Pack1ByteSkip1SwapFirst}, + + { CHANNELS_SH(1)|BYTES_SH(1)|FLAVOR_SH(1), ANYSPACE, Pack1ByteReversed}, + + { TYPE_LabV2_8, 0, PackLabV2_8 }, + { TYPE_ALabV2_8, 0, PackALabV2_8 }, + { TYPE_LabV2_16, 0, PackLabV2_16 }, + + { CHANNELS_SH(3)|BYTES_SH(1)|OPTIMIZED_SH(1), ANYSPACE, Pack3BytesOptimized}, + { CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1)|OPTIMIZED_SH(1), ANYSPACE, Pack3BytesAndSkip1Optimized}, + { CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1)|SWAPFIRST_SH(1)|OPTIMIZED_SH(1), + ANYSPACE, Pack3BytesAndSkip1SwapFirstOptimized}, + { CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1)|OPTIMIZED_SH(1), + ANYSPACE, Pack3BytesAndSkip1SwapSwapFirstOptimized}, + { CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|EXTRA_SH(1)|OPTIMIZED_SH(1), + ANYSPACE, Pack3BytesAndSkip1SwapOptimized}, + { CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|OPTIMIZED_SH(1), ANYSPACE, Pack3BytesSwapOptimized}, + + + + { CHANNELS_SH(3)|BYTES_SH(1), ANYSPACE, Pack3Bytes}, + { CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1), ANYSPACE, Pack3BytesAndSkip1}, + { CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Pack3BytesAndSkip1SwapFirst}, + { CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1), + ANYSPACE, Pack3BytesAndSkip1SwapSwapFirst}, + { CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|EXTRA_SH(1), ANYSPACE, Pack3BytesAndSkip1Swap}, + { CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1), ANYSPACE, Pack3BytesSwap}, + { CHANNELS_SH(4)|BYTES_SH(1), ANYSPACE, Pack4Bytes}, + { CHANNELS_SH(4)|BYTES_SH(1)|FLAVOR_SH(1), ANYSPACE, Pack4BytesReverse}, + { CHANNELS_SH(4)|BYTES_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Pack4BytesSwapFirst}, + { CHANNELS_SH(4)|BYTES_SH(1)|DOSWAP_SH(1), ANYSPACE, Pack4BytesSwap}, + { CHANNELS_SH(4)|BYTES_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Pack4BytesSwapSwapFirst}, + { CHANNELS_SH(6)|BYTES_SH(1), ANYSPACE, Pack6Bytes}, + { CHANNELS_SH(6)|BYTES_SH(1)|DOSWAP_SH(1), ANYSPACE, Pack6BytesSwap}, + + { BYTES_SH(1), ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA|ANYCHANNELS| + ANYSPACE|ANYPREMUL, PackChunkyBytes}, + + { BYTES_SH(1)|PLANAR_SH(1), ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA| + ANYCHANNELS|ANYSPACE|ANYPREMUL, PackPlanarBytes}, + + + { CHANNELS_SH(1)|BYTES_SH(2), ANYSPACE, Pack1Word}, + { CHANNELS_SH(1)|BYTES_SH(2)|EXTRA_SH(1), ANYSPACE, Pack1WordSkip1}, + { CHANNELS_SH(1)|BYTES_SH(2)|EXTRA_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Pack1WordSkip1SwapFirst}, + { CHANNELS_SH(1)|BYTES_SH(2)|FLAVOR_SH(1), ANYSPACE, Pack1WordReversed}, + { CHANNELS_SH(1)|BYTES_SH(2)|ENDIAN16_SH(1), ANYSPACE, Pack1WordBigEndian}, + { CHANNELS_SH(3)|BYTES_SH(2), ANYSPACE, Pack3Words}, + { CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1), ANYSPACE, Pack3WordsSwap}, + { CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1), ANYSPACE, Pack3WordsBigEndian}, + { CHANNELS_SH(3)|BYTES_SH(2)|EXTRA_SH(1), ANYSPACE, Pack3WordsAndSkip1}, + { CHANNELS_SH(3)|BYTES_SH(2)|EXTRA_SH(1)|DOSWAP_SH(1), ANYSPACE, Pack3WordsAndSkip1Swap}, + { CHANNELS_SH(3)|BYTES_SH(2)|EXTRA_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Pack3WordsAndSkip1SwapFirst}, + + { CHANNELS_SH(3)|BYTES_SH(2)|EXTRA_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1), + ANYSPACE, Pack3WordsAndSkip1SwapSwapFirst}, + + { CHANNELS_SH(4)|BYTES_SH(2), ANYSPACE, Pack4Words}, + { CHANNELS_SH(4)|BYTES_SH(2)|FLAVOR_SH(1), ANYSPACE, Pack4WordsReverse}, + { CHANNELS_SH(4)|BYTES_SH(2)|DOSWAP_SH(1), ANYSPACE, Pack4WordsSwap}, + { CHANNELS_SH(4)|BYTES_SH(2)|ENDIAN16_SH(1), ANYSPACE, Pack4WordsBigEndian}, + + { CHANNELS_SH(6)|BYTES_SH(2), ANYSPACE, Pack6Words}, + { CHANNELS_SH(6)|BYTES_SH(2)|DOSWAP_SH(1), ANYSPACE, Pack6WordsSwap}, + + { BYTES_SH(2), ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYENDIAN| + ANYEXTRA|ANYCHANNELS|ANYSPACE|ANYPREMUL, PackChunkyWords}, + { BYTES_SH(2)|PLANAR_SH(1), ANYFLAVOR|ANYENDIAN|ANYSWAP|ANYEXTRA| + ANYCHANNELS|ANYSPACE|ANYPREMUL, PackPlanarWords} + +}; + + +static const cmsFormattersFloat OutputFormattersFloat[] = { + // Type Mask Function + // ---------------------------- --------------------------------------------------- ---------------------------- + { TYPE_Lab_FLT, ANYPLANAR|ANYEXTRA, PackLabFloatFromFloat}, + { TYPE_XYZ_FLT, ANYPLANAR|ANYEXTRA, PackXYZFloatFromFloat}, + + { TYPE_Lab_DBL, ANYPLANAR|ANYEXTRA, PackLabDoubleFromFloat}, + { TYPE_XYZ_DBL, ANYPLANAR|ANYEXTRA, PackXYZDoubleFromFloat}, + + { TYPE_LabV2_8, ANYPLANAR|ANYEXTRA, PackEncodedBytesLabV2FromFloat}, + { TYPE_LabV2_16, ANYPLANAR|ANYEXTRA, PackEncodedWordsLabV2FromFloat}, + + { FLOAT_SH(1)|BYTES_SH(4), ANYPLANAR| + ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA|ANYCHANNELS|ANYSPACE, PackFloatsFromFloat }, + { FLOAT_SH(1)|BYTES_SH(0), ANYPLANAR| + ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA|ANYCHANNELS|ANYSPACE, PackDoublesFromFloat }, + + { BYTES_SH(2), ANYPLANAR| + ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA|ANYCHANNELS|ANYSPACE, PackWordsFromFloat }, + + { BYTES_SH(1), ANYPLANAR| + ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA|ANYCHANNELS|ANYSPACE, PackBytesFromFloat }, + +#ifndef CMS_NO_HALF_SUPPORT + { FLOAT_SH(1)|BYTES_SH(2), + ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA|ANYCHANNELS|ANYSPACE, PackHalfFromFloat }, +#endif + +}; + + +// Bit fields set to one in the mask are not compared +static +cmsFormatter _cmsGetStockOutputFormatter(cmsUInt32Number dwInput, cmsUInt32Number dwFlags) +{ + cmsUInt32Number i; + cmsFormatter fr; + + // Optimization is only a hint + dwInput &= ~OPTIMIZED_SH(1); + + switch (dwFlags) + { + + case CMS_PACK_FLAGS_16BITS: { + + for (i=0; i < sizeof(OutputFormatters16) / sizeof(cmsFormatters16); i++) { + const cmsFormatters16* f = OutputFormatters16 + i; + + if ((dwInput & ~f ->Mask) == f ->Type) { + fr.Fmt16 = f ->Frm; + return fr; + } + } + } + break; + + case CMS_PACK_FLAGS_FLOAT: { + + for (i=0; i < sizeof(OutputFormattersFloat) / sizeof(cmsFormattersFloat); i++) { + const cmsFormattersFloat* f = OutputFormattersFloat + i; + + if ((dwInput & ~f ->Mask) == f ->Type) { + fr.FmtFloat = f ->Frm; + return fr; + } + } + } + break; + + default:; + + } + + fr.Fmt16 = NULL; + return fr; +} + + +typedef struct _cms_formatters_factory_list { + + cmsFormatterFactory Factory; + struct _cms_formatters_factory_list *Next; + +} cmsFormattersFactoryList; + +_cmsFormattersPluginChunkType _cmsFormattersPluginChunk = { NULL }; + + +// Duplicates the zone of memory used by the plug-in in the new context +static +void DupFormatterFactoryList(struct _cmsContext_struct* ctx, + const struct _cmsContext_struct* src) +{ + _cmsFormattersPluginChunkType newHead = { NULL }; + cmsFormattersFactoryList* entry; + cmsFormattersFactoryList* Anterior = NULL; + _cmsFormattersPluginChunkType* head = (_cmsFormattersPluginChunkType*) src->chunks[FormattersPlugin]; + + _cmsAssert(head != NULL); + + // Walk the list copying all nodes + for (entry = head->FactoryList; + entry != NULL; + entry = entry ->Next) { + + cmsFormattersFactoryList *newEntry = ( cmsFormattersFactoryList *) _cmsSubAllocDup(ctx ->MemPool, entry, sizeof(cmsFormattersFactoryList)); + + if (newEntry == NULL) + return; + + // We want to keep the linked list order, so this is a little bit tricky + newEntry -> Next = NULL; + if (Anterior) + Anterior -> Next = newEntry; + + Anterior = newEntry; + + if (newHead.FactoryList == NULL) + newHead.FactoryList = newEntry; + } + + ctx ->chunks[FormattersPlugin] = _cmsSubAllocDup(ctx->MemPool, &newHead, sizeof(_cmsFormattersPluginChunkType)); +} + +// The interpolation plug-in memory chunk allocator/dup +void _cmsAllocFormattersPluginChunk(struct _cmsContext_struct* ctx, + const struct _cmsContext_struct* src) +{ + _cmsAssert(ctx != NULL); + + if (src != NULL) { + + // Duplicate the LIST + DupFormatterFactoryList(ctx, src); + } + else { + static _cmsFormattersPluginChunkType FormattersPluginChunk = { NULL }; + ctx ->chunks[FormattersPlugin] = _cmsSubAllocDup(ctx ->MemPool, &FormattersPluginChunk, sizeof(_cmsFormattersPluginChunkType)); + } +} + + + +// Formatters management +cmsBool _cmsRegisterFormattersPlugin(cmsContext ContextID, cmsPluginBase* Data) +{ + _cmsFormattersPluginChunkType* ctx = ( _cmsFormattersPluginChunkType*) _cmsContextGetClientChunk(ContextID, FormattersPlugin); + cmsPluginFormatters* Plugin = (cmsPluginFormatters*) Data; + cmsFormattersFactoryList* fl ; + + // Reset to built-in defaults + if (Data == NULL) { + + ctx ->FactoryList = NULL; + return TRUE; + } + + fl = (cmsFormattersFactoryList*) _cmsPluginMalloc(ContextID, sizeof(cmsFormattersFactoryList)); + if (fl == NULL) return FALSE; + + fl ->Factory = Plugin ->FormattersFactory; + + fl ->Next = ctx -> FactoryList; + ctx ->FactoryList = fl; + + return TRUE; +} + +cmsFormatter CMSEXPORT _cmsGetFormatter(cmsContext ContextID, + cmsUInt32Number Type, // Specific type, i.e. TYPE_RGB_8 + cmsFormatterDirection Dir, + cmsUInt32Number dwFlags) +{ + _cmsFormattersPluginChunkType* ctx = ( _cmsFormattersPluginChunkType*) _cmsContextGetClientChunk(ContextID, FormattersPlugin); + cmsFormattersFactoryList* f; + + if (T_CHANNELS(Type) == 0) { + static const cmsFormatter nullFormatter = { 0 }; + return nullFormatter; + } + + for (f =ctx->FactoryList; f != NULL; f = f ->Next) { + + cmsFormatter fn = f ->Factory(Type, Dir, dwFlags); + if (fn.Fmt16 != NULL) return fn; + } + + // Revert to default + if (Dir == cmsFormatterInput) + return _cmsGetStockInputFormatter(Type, dwFlags); + else + return _cmsGetStockOutputFormatter(Type, dwFlags); +} + + +// Return whatever given formatter refers to float values +cmsBool _cmsFormatterIsFloat(cmsUInt32Number Type) +{ + return T_FLOAT(Type) ? TRUE : FALSE; +} + +// Return whatever given formatter refers to 8 bits +cmsBool _cmsFormatterIs8bit(cmsUInt32Number Type) +{ + cmsUInt32Number Bytes = T_BYTES(Type); + + return (Bytes == 1); +} + +// Build a suitable formatter for the colorspace of this profile +cmsUInt32Number CMSEXPORT cmsFormatterForColorspaceOfProfile(cmsHPROFILE hProfile, cmsUInt32Number nBytes, cmsBool lIsFloat) +{ + + cmsColorSpaceSignature ColorSpace = cmsGetColorSpace(hProfile); + cmsUInt32Number ColorSpaceBits = (cmsUInt32Number) _cmsLCMScolorSpace(ColorSpace); + cmsInt32Number nOutputChans = cmsChannelsOfColorSpace(ColorSpace); + cmsUInt32Number Float = lIsFloat ? 1U : 0; + + // Unsupported color space? + if (nOutputChans < 0) return 0; + + // Fix float spaces + nBytes &= 7; + + // Create a fake formatter for result + return FLOAT_SH(Float) | COLORSPACE_SH(ColorSpaceBits) | BYTES_SH(nBytes) | CHANNELS_SH(nOutputChans); +} + +// Build a suitable formatter for the colorspace of this profile +cmsUInt32Number CMSEXPORT cmsFormatterForPCSOfProfile(cmsHPROFILE hProfile, cmsUInt32Number nBytes, cmsBool lIsFloat) +{ + + cmsColorSpaceSignature ColorSpace = cmsGetPCS(hProfile); + + cmsUInt32Number ColorSpaceBits = (cmsUInt32Number) _cmsLCMScolorSpace(ColorSpace); + cmsInt32Number nOutputChans = cmsChannelsOfColorSpace(ColorSpace); + cmsUInt32Number Float = lIsFloat ? 1U : 0; + + // Unsupported color space? + if (nOutputChans < 0) return 0; + + // Fix float spaces + nBytes &= 7; + + // Create a fake formatter for result + return FLOAT_SH(Float) | COLORSPACE_SH(ColorSpaceBits) | BYTES_SH(nBytes) | CHANNELS_SH(nOutputChans); +} + diff --git a/local/recipes/libs/lcms2/source/src/cmspcs.c b/local/recipes/libs/lcms2/source/src/cmspcs.c new file mode 100644 index 0000000000..88ee09eae5 --- /dev/null +++ b/local/recipes/libs/lcms2/source/src/cmspcs.c @@ -0,0 +1,950 @@ +//--------------------------------------------------------------------------------- +// +// Little Color Management System +// Copyright (c) 1998-2026 Marti Maria Saguer +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//--------------------------------------------------------------------------------- +// + +#include "lcms2_internal.h" + +// inter PCS conversions XYZ <-> CIE L* a* b* +/* + + + CIE 15:2004 CIELab is defined as: + + L* = 116*f(Y/Yn) - 16 0 <= L* <= 100 + a* = 500*[f(X/Xn) - f(Y/Yn)] + b* = 200*[f(Y/Yn) - f(Z/Zn)] + + and + + f(t) = t^(1/3) 1 >= t > (24/116)^3 + (841/108)*t + (16/116) 0 <= t <= (24/116)^3 + + + Reverse transform is: + + X = Xn*[a* / 500 + (L* + 16) / 116] ^ 3 if (X/Xn) > (24/116) + = Xn*(a* / 500 + L* / 116) / 7.787 if (X/Xn) <= (24/116) + + + + PCS in Lab2 is encoded as: + + 8 bit Lab PCS: + + L* 0..100 into a 0..ff byte. + a* t + 128 range is -128.0 +127.0 + b* + + 16 bit Lab PCS: + + L* 0..100 into a 0..ff00 word. + a* t + 128 range is -128.0 +127.9961 + b* + + + +Interchange Space Component Actual Range Encoded Range +CIE XYZ X 0 -> 1.99997 0x0000 -> 0xffff +CIE XYZ Y 0 -> 1.99997 0x0000 -> 0xffff +CIE XYZ Z 0 -> 1.99997 0x0000 -> 0xffff + +Version 2,3 +----------- + +CIELAB (16 bit) L* 0 -> 100.0 0x0000 -> 0xff00 +CIELAB (16 bit) a* -128.0 -> +127.996 0x0000 -> 0x8000 -> 0xffff +CIELAB (16 bit) b* -128.0 -> +127.996 0x0000 -> 0x8000 -> 0xffff + + +Version 4 +--------- + +CIELAB (16 bit) L* 0 -> 100.0 0x0000 -> 0xffff +CIELAB (16 bit) a* -128.0 -> +127 0x0000 -> 0x8080 -> 0xffff +CIELAB (16 bit) b* -128.0 -> +127 0x0000 -> 0x8080 -> 0xffff + +*/ + +// Conversions +void CMSEXPORT cmsXYZ2xyY(cmsCIExyY* Dest, const cmsCIEXYZ* Source) +{ + cmsFloat64Number ISum; + + ISum = 1./(Source -> X + Source -> Y + Source -> Z); + + Dest -> x = (Source -> X) * ISum; + Dest -> y = (Source -> Y) * ISum; + Dest -> Y = Source -> Y; +} + +void CMSEXPORT cmsxyY2XYZ(cmsCIEXYZ* Dest, const cmsCIExyY* Source) +{ + Dest -> X = (Source -> x / Source -> y) * Source -> Y; + Dest -> Y = Source -> Y; + Dest -> Z = ((1 - Source -> x - Source -> y) / Source -> y) * Source -> Y; +} + +/* + The break point (24/116)^3 = (6/29)^3 is a very small amount of tristimulus + primary (0.008856). Generally, this only happens for + nearly ideal blacks and for some orange / amber colors in transmission mode. + For example, the Z value of the orange turn indicator lamp lens on an + automobile will often be below this value. But the Z does not + contribute to the perceived color directly. +*/ + +static +cmsFloat64Number f(cmsFloat64Number t) +{ + const cmsFloat64Number Limit = (24.0/116.0) * (24.0/116.0) * (24.0/116.0); + + if (t <= Limit) + return (841.0/108.0) * t + (16.0/116.0); + else + return pow(t, 1.0/3.0); +} + +static +cmsFloat64Number f_1(cmsFloat64Number t) +{ + const cmsFloat64Number Limit = (24.0/116.0); + + if (t <= Limit) { + return (108.0/841.0) * (t - (16.0/116.0)); + } + + return t * t * t; +} + + +// Standard XYZ to Lab. it can handle negative XZY numbers in some cases +void CMSEXPORT cmsXYZ2Lab(const cmsCIEXYZ* WhitePoint, cmsCIELab* Lab, const cmsCIEXYZ* xyz) +{ + cmsFloat64Number fx, fy, fz; + + if (WhitePoint == NULL) + WhitePoint = cmsD50_XYZ(); + + fx = f(xyz->X / WhitePoint->X); + fy = f(xyz->Y / WhitePoint->Y); + fz = f(xyz->Z / WhitePoint->Z); + + Lab->L = 116.0*fy - 16.0; + Lab->a = 500.0*(fx - fy); + Lab->b = 200.0*(fy - fz); +} + + +// Standard XYZ to Lab. It can return negative XYZ in some cases +void CMSEXPORT cmsLab2XYZ(const cmsCIEXYZ* WhitePoint, cmsCIEXYZ* xyz, const cmsCIELab* Lab) +{ + cmsFloat64Number x, y, z; + + if (WhitePoint == NULL) + WhitePoint = cmsD50_XYZ(); + + y = (Lab-> L + 16.0) / 116.0; + x = y + 0.002 * Lab -> a; + z = y - 0.005 * Lab -> b; + + xyz -> X = f_1(x) * WhitePoint -> X; + xyz -> Y = f_1(y) * WhitePoint -> Y; + xyz -> Z = f_1(z) * WhitePoint -> Z; + +} + +static +cmsFloat64Number L2float2(cmsUInt16Number v) +{ + return (cmsFloat64Number) v / 652.800; +} + +// the a/b part +static +cmsFloat64Number ab2float2(cmsUInt16Number v) +{ + return ((cmsFloat64Number) v / 256.0) - 128.0; +} + +static +cmsUInt16Number L2Fix2(cmsFloat64Number L) +{ + return _cmsQuickSaturateWord(L * 652.8); +} + +static +cmsUInt16Number ab2Fix2(cmsFloat64Number ab) +{ + return _cmsQuickSaturateWord((ab + 128.0) * 256.0); +} + + +static +cmsFloat64Number L2float4(cmsUInt16Number v) +{ + return (cmsFloat64Number) v / 655.35; +} + +// the a/b part +static +cmsFloat64Number ab2float4(cmsUInt16Number v) +{ + return ((cmsFloat64Number) v / 257.0) - 128.0; +} + + +void CMSEXPORT cmsLabEncoded2FloatV2(cmsCIELab* Lab, const cmsUInt16Number wLab[3]) +{ + Lab->L = L2float2(wLab[0]); + Lab->a = ab2float2(wLab[1]); + Lab->b = ab2float2(wLab[2]); +} + + +void CMSEXPORT cmsLabEncoded2Float(cmsCIELab* Lab, const cmsUInt16Number wLab[3]) +{ + Lab->L = L2float4(wLab[0]); + Lab->a = ab2float4(wLab[1]); + Lab->b = ab2float4(wLab[2]); +} + +static +cmsFloat64Number Clamp_L_doubleV2(cmsFloat64Number L) +{ + const cmsFloat64Number L_max = (cmsFloat64Number) (0xFFFF * 100.0) / 0xFF00; + + if (L < 0) L = 0; + if (L > L_max) L = L_max; + + return L; +} + + +static +cmsFloat64Number Clamp_ab_doubleV2(cmsFloat64Number ab) +{ + if (ab < MIN_ENCODEABLE_ab2) ab = MIN_ENCODEABLE_ab2; + if (ab > MAX_ENCODEABLE_ab2) ab = MAX_ENCODEABLE_ab2; + + return ab; +} + +void CMSEXPORT cmsFloat2LabEncodedV2(cmsUInt16Number wLab[3], const cmsCIELab* fLab) +{ + cmsCIELab Lab; + + Lab.L = Clamp_L_doubleV2(fLab ->L); + Lab.a = Clamp_ab_doubleV2(fLab ->a); + Lab.b = Clamp_ab_doubleV2(fLab ->b); + + wLab[0] = L2Fix2(Lab.L); + wLab[1] = ab2Fix2(Lab.a); + wLab[2] = ab2Fix2(Lab.b); +} + + +static +cmsFloat64Number Clamp_L_doubleV4(cmsFloat64Number L) +{ + if (L < 0) L = 0; + if (L > 100.0) L = 100.0; + + return L; +} + +static +cmsFloat64Number Clamp_ab_doubleV4(cmsFloat64Number ab) +{ + if (ab < MIN_ENCODEABLE_ab4) ab = MIN_ENCODEABLE_ab4; + if (ab > MAX_ENCODEABLE_ab4) ab = MAX_ENCODEABLE_ab4; + + return ab; +} + +static +cmsUInt16Number L2Fix4(cmsFloat64Number L) +{ + return _cmsQuickSaturateWord(L * 655.35); +} + +static +cmsUInt16Number ab2Fix4(cmsFloat64Number ab) +{ + return _cmsQuickSaturateWord((ab + 128.0) * 257.0); +} + +void CMSEXPORT cmsFloat2LabEncoded(cmsUInt16Number wLab[3], const cmsCIELab* fLab) +{ + cmsCIELab Lab; + + Lab.L = Clamp_L_doubleV4(fLab ->L); + Lab.a = Clamp_ab_doubleV4(fLab ->a); + Lab.b = Clamp_ab_doubleV4(fLab ->b); + + wLab[0] = L2Fix4(Lab.L); + wLab[1] = ab2Fix4(Lab.a); + wLab[2] = ab2Fix4(Lab.b); +} + +// Auxiliary: convert to Radians +static +cmsFloat64Number RADIANS(cmsFloat64Number deg) +{ + return (deg * M_PI) / 180.; +} + + +// Auxiliary: atan2 but operating in degrees and returning 0 if a==b==0 +static +cmsFloat64Number atan2deg(cmsFloat64Number a, cmsFloat64Number b) +{ + cmsFloat64Number h; + + if (a == 0 && b == 0) + h = 0; + else + h = atan2(a, b); + + h *= (180. / M_PI); + + while (h > 360.) + h -= 360.; + + while ( h < 0) + h += 360.; + + return h; +} + + +// Auxiliary: Square +static +cmsFloat64Number Sqr(cmsFloat64Number v) +{ + return v * v; +} +// From cylindrical coordinates. No check is performed, then negative values are allowed +void CMSEXPORT cmsLab2LCh(cmsCIELCh* LCh, const cmsCIELab* Lab) +{ + LCh -> L = Lab -> L; + LCh -> C = pow(Sqr(Lab ->a) + Sqr(Lab ->b), 0.5); + LCh -> h = atan2deg(Lab ->b, Lab ->a); +} + + +// To cylindrical coordinates. No check is performed, then negative values are allowed +void CMSEXPORT cmsLCh2Lab(cmsCIELab* Lab, const cmsCIELCh* LCh) +{ + cmsFloat64Number h = (LCh -> h * M_PI) / 180.0; + + Lab -> L = LCh -> L; + Lab -> a = LCh -> C * cos(h); + Lab -> b = LCh -> C * sin(h); +} + +// In XYZ All 3 components are encoded using 1.15 fixed point +static +cmsUInt16Number XYZ2Fix(cmsFloat64Number d) +{ + return _cmsQuickSaturateWord(d * 32768.0); +} + +void CMSEXPORT cmsFloat2XYZEncoded(cmsUInt16Number XYZ[3], const cmsCIEXYZ* fXYZ) +{ + cmsCIEXYZ xyz; + + xyz.X = fXYZ -> X; + xyz.Y = fXYZ -> Y; + xyz.Z = fXYZ -> Z; + + // Clamp to encodeable values. + if (xyz.Y <= 0) { + + xyz.X = 0; + xyz.Y = 0; + xyz.Z = 0; + } + + if (xyz.X > MAX_ENCODEABLE_XYZ) + xyz.X = MAX_ENCODEABLE_XYZ; + + if (xyz.X < 0) + xyz.X = 0; + + if (xyz.Y > MAX_ENCODEABLE_XYZ) + xyz.Y = MAX_ENCODEABLE_XYZ; + + if (xyz.Y < 0) + xyz.Y = 0; + + if (xyz.Z > MAX_ENCODEABLE_XYZ) + xyz.Z = MAX_ENCODEABLE_XYZ; + + if (xyz.Z < 0) + xyz.Z = 0; + + + XYZ[0] = XYZ2Fix(xyz.X); + XYZ[1] = XYZ2Fix(xyz.Y); + XYZ[2] = XYZ2Fix(xyz.Z); +} + + +// To convert from Fixed 1.15 point to cmsFloat64Number +static +cmsFloat64Number XYZ2float(cmsUInt16Number v) +{ + cmsS15Fixed16Number fix32; + + // From 1.15 to 15.16 + fix32 = v << 1; + + // From fixed 15.16 to cmsFloat64Number + return _cms15Fixed16toDouble(fix32); +} + + +void CMSEXPORT cmsXYZEncoded2Float(cmsCIEXYZ* fXYZ, const cmsUInt16Number XYZ[3]) +{ + fXYZ -> X = XYZ2float(XYZ[0]); + fXYZ -> Y = XYZ2float(XYZ[1]); + fXYZ -> Z = XYZ2float(XYZ[2]); +} + + +// Returns dE on two Lab values +cmsFloat64Number CMSEXPORT cmsDeltaE(const cmsCIELab* Lab1, const cmsCIELab* Lab2) +{ + cmsFloat64Number dL, da, db; + + dL = fabs(Lab1 -> L - Lab2 -> L); + da = fabs(Lab1 -> a - Lab2 -> a); + db = fabs(Lab1 -> b - Lab2 -> b); + + return pow(Sqr(dL) + Sqr(da) + Sqr(db), 0.5); +} + + +// Return the CIE94 Delta E +cmsFloat64Number CMSEXPORT cmsCIE94DeltaE(const cmsCIELab* Lab1, const cmsCIELab* Lab2) +{ + cmsCIELCh LCh1, LCh2; + cmsFloat64Number dE, dL, dC, dh, dhsq; + cmsFloat64Number c12, sc, sh; + + dL = fabs(Lab1 ->L - Lab2 ->L); + + cmsLab2LCh(&LCh1, Lab1); + cmsLab2LCh(&LCh2, Lab2); + + dC = fabs(LCh1.C - LCh2.C); + dE = cmsDeltaE(Lab1, Lab2); + + dhsq = Sqr(dE) - Sqr(dL) - Sqr(dC); + if (dhsq < 0) + dh = 0; + else + dh = pow(dhsq, 0.5); + + c12 = sqrt(LCh1.C * LCh2.C); + + sc = 1.0 + (0.048 * c12); + sh = 1.0 + (0.014 * c12); + + return sqrt(Sqr(dL) + Sqr(dC) / Sqr(sc) + Sqr(dh) / Sqr(sh)); +} + + +// Auxiliary +static +cmsFloat64Number ComputeLBFD(const cmsCIELab* Lab) +{ + cmsFloat64Number yt; + + if (Lab->L > 7.996969) + yt = (Sqr((Lab->L+16)/116)*((Lab->L+16)/116))*100; + else + yt = 100 * (Lab->L / 903.3); + + return (54.6 * (M_LOG10E * (log(yt + 1.5))) - 9.6); +} + + + +// bfd - gets BFD(1:1) difference between Lab1, Lab2 +cmsFloat64Number CMSEXPORT cmsBFDdeltaE(const cmsCIELab* Lab1, const cmsCIELab* Lab2) +{ + cmsFloat64Number lbfd1,lbfd2,AveC,Aveh,dE,deltaL, + deltaC,deltah,dc,t,g,dh,rh,rc,rt,bfd; + cmsCIELCh LCh1, LCh2; + + + lbfd1 = ComputeLBFD(Lab1); + lbfd2 = ComputeLBFD(Lab2); + deltaL = lbfd2 - lbfd1; + + cmsLab2LCh(&LCh1, Lab1); + cmsLab2LCh(&LCh2, Lab2); + + deltaC = LCh2.C - LCh1.C; + AveC = (LCh1.C+LCh2.C)/2; + Aveh = (LCh1.h+LCh2.h)/2; + + dE = cmsDeltaE(Lab1, Lab2); + + if (Sqr(dE)>(Sqr(Lab2->L-Lab1->L)+Sqr(deltaC))) + deltah = sqrt(Sqr(dE)-Sqr(Lab2->L-Lab1->L)-Sqr(deltaC)); + else + deltah =0; + + + dc = 0.035 * AveC / (1 + 0.00365 * AveC)+0.521; + g = sqrt(Sqr(Sqr(AveC))/(Sqr(Sqr(AveC))+14000)); + t = 0.627+(0.055*cos((Aveh-254)/(180/M_PI))- + 0.040*cos((2*Aveh-136)/(180/M_PI))+ + 0.070*cos((3*Aveh-31)/(180/M_PI))+ + 0.049*cos((4*Aveh+114)/(180/M_PI))- + 0.015*cos((5*Aveh-103)/(180/M_PI))); + + dh = dc*(g*t+1-g); + rh = -0.260*cos((Aveh-308)/(180/M_PI))- + 0.379*cos((2*Aveh-160)/(180/M_PI))- + 0.636*cos((3*Aveh+254)/(180/M_PI))+ + 0.226*cos((4*Aveh+140)/(180/M_PI))- + 0.194*cos((5*Aveh+280)/(180/M_PI)); + + rc = sqrt((AveC*AveC*AveC*AveC*AveC*AveC)/((AveC*AveC*AveC*AveC*AveC*AveC)+70000000)); + rt = rh*rc; + + bfd = sqrt(Sqr(deltaL)+Sqr(deltaC/dc)+Sqr(deltah/dh)+(rt*(deltaC/dc)*(deltah/dh))); + + return bfd; +} + + +// cmc - CMC(l:c) difference between Lab1, Lab2 +cmsFloat64Number CMSEXPORT cmsCMCdeltaE(const cmsCIELab* Lab1, const cmsCIELab* Lab2, cmsFloat64Number l, cmsFloat64Number c) +{ + cmsFloat64Number dE,dL,dC,dh,sl,sc,sh,t,f,cmc; + cmsCIELCh LCh1, LCh2; + + if (Lab1 ->L == 0 && Lab2 ->L == 0) return 0; + + cmsLab2LCh(&LCh1, Lab1); + cmsLab2LCh(&LCh2, Lab2); + + + dL = Lab2->L-Lab1->L; + dC = LCh2.C-LCh1.C; + + dE = cmsDeltaE(Lab1, Lab2); + + if (Sqr(dE)>(Sqr(dL)+Sqr(dC))) + dh = sqrt(Sqr(dE)-Sqr(dL)-Sqr(dC)); + else + dh =0; + + if ((LCh1.h > 164) && (LCh1.h < 345)) + t = 0.56 + fabs(0.2 * cos(((LCh1.h + 168)/(180/M_PI)))); + else + t = 0.36 + fabs(0.4 * cos(((LCh1.h + 35 )/(180/M_PI)))); + + sc = 0.0638 * LCh1.C / (1 + 0.0131 * LCh1.C) + 0.638; + sl = 0.040975 * Lab1->L /(1 + 0.01765 * Lab1->L); + + if (Lab1->L<16) + sl = 0.511; + + f = sqrt((LCh1.C * LCh1.C * LCh1.C * LCh1.C)/((LCh1.C * LCh1.C * LCh1.C * LCh1.C)+1900)); + sh = sc*(t*f+1-f); + cmc = sqrt(Sqr(dL/(l*sl))+Sqr(dC/(c*sc))+Sqr(dh/sh)); + + return cmc; +} + +// dE2000 The weightings KL, KC and KH can be modified to reflect the relative +// importance of lightness, chroma and hue in different industrial applications +cmsFloat64Number CMSEXPORT cmsCIE2000DeltaE(const cmsCIELab* Lab1, const cmsCIELab* Lab2, + cmsFloat64Number Kl, cmsFloat64Number Kc, cmsFloat64Number Kh) +{ + cmsFloat64Number L1 = Lab1->L; + cmsFloat64Number a1 = Lab1->a; + cmsFloat64Number b1 = Lab1->b; + cmsFloat64Number C = sqrt( Sqr(a1) + Sqr(b1) ); + + cmsFloat64Number Ls = Lab2 ->L; + cmsFloat64Number as = Lab2 ->a; + cmsFloat64Number bs = Lab2 ->b; + cmsFloat64Number Cs = sqrt( Sqr(as) + Sqr(bs) ); + + cmsFloat64Number G = 0.5 * ( 1 - sqrt(pow((C + Cs) / 2 , 7.0) / (pow((C + Cs) / 2, 7.0) + pow(25.0, 7.0) ) )); + + cmsFloat64Number a_p = (1 + G ) * a1; + cmsFloat64Number b_p = b1; + cmsFloat64Number C_p = sqrt( Sqr(a_p) + Sqr(b_p)); + cmsFloat64Number h_p = atan2deg(b_p, a_p); + + + cmsFloat64Number a_ps = (1 + G) * as; + cmsFloat64Number b_ps = bs; + cmsFloat64Number C_ps = sqrt(Sqr(a_ps) + Sqr(b_ps)); + cmsFloat64Number h_ps = atan2deg(b_ps, a_ps); + + cmsFloat64Number meanC_p =(C_p + C_ps) / 2; + + cmsFloat64Number hps_plus_hp = h_ps + h_p; + cmsFloat64Number hps_minus_hp = h_ps - h_p; + + cmsFloat64Number meanh_p = fabs(hps_minus_hp) <= 180.000001 ? (hps_plus_hp)/2 : + (hps_plus_hp) < 360 ? (hps_plus_hp + 360)/2 : + (hps_plus_hp - 360)/2; + + cmsFloat64Number delta_h = (hps_minus_hp) <= -180.000001 ? (hps_minus_hp + 360) : + (hps_minus_hp) > 180 ? (hps_minus_hp - 360) : + (hps_minus_hp); + cmsFloat64Number delta_L = (Ls - L1); + cmsFloat64Number delta_C = (C_ps - C_p ); + + + cmsFloat64Number delta_H =2 * sqrt(C_ps*C_p) * sin(RADIANS(delta_h) / 2); + + cmsFloat64Number T = 1 - 0.17 * cos(RADIANS(meanh_p-30)) + + 0.24 * cos(RADIANS(2*meanh_p)) + + 0.32 * cos(RADIANS(3*meanh_p + 6)) + - 0.2 * cos(RADIANS(4*meanh_p - 63)); + + cmsFloat64Number Sl = 1 + (0.015 * Sqr((Ls + L1) /2- 50) )/ sqrt(20 + Sqr( (Ls+L1)/2 - 50) ); + + cmsFloat64Number Sc = 1 + 0.045 * (C_p + C_ps)/2; + cmsFloat64Number Sh = 1 + 0.015 * ((C_ps + C_p)/2) * T; + + cmsFloat64Number delta_ro = 30 * exp( -Sqr(((meanh_p - 275 ) / 25))); + + cmsFloat64Number Rc = 2 * sqrt(( pow(meanC_p, 7.0) )/( pow(meanC_p, 7.0) + pow(25.0, 7.0))); + + cmsFloat64Number Rt = -sin(2 * RADIANS(delta_ro)) * Rc; + + cmsFloat64Number deltaE00 = sqrt( Sqr(delta_L /(Sl * Kl)) + + Sqr(delta_C/(Sc * Kc)) + + Sqr(delta_H/(Sh * Kh)) + + Rt*(delta_C/(Sc * Kc)) * (delta_H / (Sh * Kh))); + + return deltaE00; +} + +// This function returns a number of gridpoints to be used as LUT table. It assumes same number +// of gripdpoints in all dimensions. Flags may override the choice. +cmsUInt32Number CMSEXPORT _cmsReasonableGridpointsByColorspace(cmsColorSpaceSignature Colorspace, cmsUInt32Number dwFlags) +{ + cmsUInt32Number nChannels; + + // Already specified? + if (dwFlags & 0x00FF0000) { + // Yes, grab'em + return (dwFlags >> 16) & 0xFF; + } + + nChannels = cmsChannelsOf(Colorspace); + + // HighResPrecalc is maximum resolution + if (dwFlags & cmsFLAGS_HIGHRESPRECALC) { + + if (nChannels > 4) + return 7; // 7 for Hifi + + if (nChannels == 4) // 23 for CMYK + return 23; + + return 49; // 49 for RGB and others + } + + + // LowResPrecal is lower resolution + if (dwFlags & cmsFLAGS_LOWRESPRECALC) { + + if (nChannels > 4) + return 6; // 6 for more than 4 channels + + if (nChannels == 1) + return 33; // For monochrome + + return 17; // 17 for remaining + } + + // Default values + if (nChannels > 4) + return 7; // 7 for Hifi + + if (nChannels == 4) + return 17; // 17 for CMYK + + return 33; // 33 for RGB +} + + +cmsBool _cmsEndPointsBySpace(cmsColorSpaceSignature Space, + cmsUInt16Number **White, + cmsUInt16Number **Black, + cmsUInt32Number *nOutputs) +{ + // Only most common spaces + + static cmsUInt16Number RGBblack[4] = { 0, 0, 0 }; + static cmsUInt16Number RGBwhite[4] = { 0xffff, 0xffff, 0xffff }; + static cmsUInt16Number CMYKblack[4] = { 0xffff, 0xffff, 0xffff, 0xffff }; // 400% of ink + static cmsUInt16Number CMYKwhite[4] = { 0, 0, 0, 0 }; + static cmsUInt16Number LABblack[4] = { 0, 0x8080, 0x8080 }; // V4 Lab encoding + static cmsUInt16Number LABwhite[4] = { 0xFFFF, 0x8080, 0x8080 }; + static cmsUInt16Number CMYblack[4] = { 0xffff, 0xffff, 0xffff }; + static cmsUInt16Number CMYwhite[4] = { 0, 0, 0 }; + static cmsUInt16Number Grayblack[4] = { 0 }; + static cmsUInt16Number GrayWhite[4] = { 0xffff }; + + switch (Space) { + + case cmsSigGrayData: if (White) *White = GrayWhite; + if (Black) *Black = Grayblack; + if (nOutputs) *nOutputs = 1; + return TRUE; + + case cmsSigRgbData: if (White) *White = RGBwhite; + if (Black) *Black = RGBblack; + if (nOutputs) *nOutputs = 3; + return TRUE; + + case cmsSigLabData: if (White) *White = LABwhite; + if (Black) *Black = LABblack; + if (nOutputs) *nOutputs = 3; + return TRUE; + + case cmsSigCmykData: if (White) *White = CMYKwhite; + if (Black) *Black = CMYKblack; + if (nOutputs) *nOutputs = 4; + return TRUE; + + case cmsSigCmyData: if (White) *White = CMYwhite; + if (Black) *Black = CMYblack; + if (nOutputs) *nOutputs = 3; + return TRUE; + + default:; + } + + return FALSE; +} + + + +// Several utilities ------------------------------------------------------- + +// Translate from our colorspace to ICC representation + +cmsColorSpaceSignature CMSEXPORT _cmsICCcolorSpace(int OurNotation) +{ + switch (OurNotation) { + + case 1: + case PT_GRAY: return cmsSigGrayData; + + case 2: + case PT_RGB: return cmsSigRgbData; + + case PT_CMY: return cmsSigCmyData; + case PT_CMYK: return cmsSigCmykData; + case PT_YCbCr:return cmsSigYCbCrData; + case PT_YUV: return cmsSigLuvData; + case PT_XYZ: return cmsSigXYZData; + + case PT_LabV2: + case PT_Lab: return cmsSigLabData; + + case PT_YUVK: return cmsSigLuvKData; + case PT_HSV: return cmsSigHsvData; + case PT_HLS: return cmsSigHlsData; + case PT_Yxy: return cmsSigYxyData; + + case PT_MCH1: return cmsSigMCH1Data; + case PT_MCH2: return cmsSigMCH2Data; + case PT_MCH3: return cmsSigMCH3Data; + case PT_MCH4: return cmsSigMCH4Data; + case PT_MCH5: return cmsSigMCH5Data; + case PT_MCH6: return cmsSigMCH6Data; + case PT_MCH7: return cmsSigMCH7Data; + case PT_MCH8: return cmsSigMCH8Data; + + case PT_MCH9: return cmsSigMCH9Data; + case PT_MCH10: return cmsSigMCHAData; + case PT_MCH11: return cmsSigMCHBData; + case PT_MCH12: return cmsSigMCHCData; + case PT_MCH13: return cmsSigMCHDData; + case PT_MCH14: return cmsSigMCHEData; + case PT_MCH15: return cmsSigMCHFData; + + default: return (cmsColorSpaceSignature) 0; + } +} + + +int CMSEXPORT _cmsLCMScolorSpace(cmsColorSpaceSignature ProfileSpace) +{ + switch (ProfileSpace) { + + case cmsSigGrayData: return PT_GRAY; + case cmsSigRgbData: return PT_RGB; + case cmsSigCmyData: return PT_CMY; + case cmsSigCmykData: return PT_CMYK; + case cmsSigYCbCrData:return PT_YCbCr; + case cmsSigLuvData: return PT_YUV; + case cmsSigXYZData: return PT_XYZ; + case cmsSigLabData: return PT_Lab; + case cmsSigLuvKData: return PT_YUVK; + case cmsSigHsvData: return PT_HSV; + case cmsSigHlsData: return PT_HLS; + case cmsSigYxyData: return PT_Yxy; + + case cmsSig1colorData: + case cmsSigMCH1Data: return PT_MCH1; + + case cmsSig2colorData: + case cmsSigMCH2Data: return PT_MCH2; + + case cmsSig3colorData: + case cmsSigMCH3Data: return PT_MCH3; + + case cmsSig4colorData: + case cmsSigMCH4Data: return PT_MCH4; + + case cmsSig5colorData: + case cmsSigMCH5Data: return PT_MCH5; + + case cmsSig6colorData: + case cmsSigMCH6Data: return PT_MCH6; + + case cmsSigMCH7Data: + case cmsSig7colorData:return PT_MCH7; + + case cmsSigMCH8Data: + case cmsSig8colorData:return PT_MCH8; + + case cmsSigMCH9Data: + case cmsSig9colorData:return PT_MCH9; + + case cmsSigMCHAData: + case cmsSig10colorData:return PT_MCH10; + + case cmsSigMCHBData: + case cmsSig11colorData:return PT_MCH11; + + case cmsSigMCHCData: + case cmsSig12colorData:return PT_MCH12; + + case cmsSigMCHDData: + case cmsSig13colorData:return PT_MCH13; + + case cmsSigMCHEData: + case cmsSig14colorData:return PT_MCH14; + + case cmsSigMCHFData: + case cmsSig15colorData:return PT_MCH15; + + default: return (cmsColorSpaceSignature) 0; + } +} + + +cmsInt32Number CMSEXPORT cmsChannelsOfColorSpace(cmsColorSpaceSignature ColorSpace) +{ + switch (ColorSpace) { + + case cmsSigMCH1Data: + case cmsSig1colorData: + case cmsSigGrayData: return 1; + + case cmsSigMCH2Data: + case cmsSig2colorData: return 2; + + case cmsSigXYZData: + case cmsSigLabData: + case cmsSigLuvData: + case cmsSigYCbCrData: + case cmsSigYxyData: + case cmsSigRgbData: + case cmsSigHsvData: + case cmsSigHlsData: + case cmsSigCmyData: + case cmsSigMCH3Data: + case cmsSig3colorData: return 3; + + case cmsSigLuvKData: + case cmsSigCmykData: + case cmsSigMCH4Data: + case cmsSig4colorData: return 4; + + case cmsSigMCH5Data: + case cmsSig5colorData: return 5; + + case cmsSigMCH6Data: + case cmsSig6colorData: return 6; + + case cmsSigMCH7Data: + case cmsSig7colorData: return 7; + + case cmsSigMCH8Data: + case cmsSig8colorData: return 8; + + case cmsSigMCH9Data: + case cmsSig9colorData: return 9; + + case cmsSigMCHAData: + case cmsSig10colorData: return 10; + + case cmsSigMCHBData: + case cmsSig11colorData: return 11; + + case cmsSigMCHCData: + case cmsSig12colorData: return 12; + + case cmsSigMCHDData: + case cmsSig13colorData: return 13; + + case cmsSigMCHEData: + case cmsSig14colorData: return 14; + + case cmsSigMCHFData: + case cmsSig15colorData: return 15; + + default: return -1; + } +} + +/** +* DEPRECATED: Provided for compatibility only +*/ +cmsUInt32Number CMSEXPORT cmsChannelsOf(cmsColorSpaceSignature ColorSpace) +{ + int n = cmsChannelsOfColorSpace(ColorSpace); + if (n < 0) return 3; + return (cmsUInt32Number)n; +} \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/src/cmsplugin.c b/local/recipes/libs/lcms2/source/src/cmsplugin.c new file mode 100644 index 0000000000..21465f38a1 --- /dev/null +++ b/local/recipes/libs/lcms2/source/src/cmsplugin.c @@ -0,0 +1,1055 @@ +//--------------------------------------------------------------------------------- +// +// Little Color Management System +// Copyright (c) 1998-2026 Marti Maria Saguer +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//--------------------------------------------------------------------------------- +// + +#include "lcms2_internal.h" + + +// ---------------------------------------------------------------------------------- +// Encoding & Decoding support functions +// ---------------------------------------------------------------------------------- + +// Little-Endian to Big-Endian + +// Adjust a word value after being read/ before being written from/to an ICC profile +cmsUInt16Number CMSEXPORT _cmsAdjustEndianess16(cmsUInt16Number Word) +{ +#ifndef CMS_USE_BIG_ENDIAN + + cmsUInt8Number* pByte = (cmsUInt8Number*) &Word; + cmsUInt8Number tmp; + + tmp = pByte[0]; + pByte[0] = pByte[1]; + pByte[1] = tmp; +#endif + + return Word; +} + + +// Transports to properly encoded values - note that icc profiles does use big endian notation. + +// 1 2 3 4 +// 4 3 2 1 + +cmsUInt32Number CMSEXPORT _cmsAdjustEndianess32(cmsUInt32Number DWord) +{ +#ifndef CMS_USE_BIG_ENDIAN + + cmsUInt8Number* pByte = (cmsUInt8Number*) &DWord; + cmsUInt8Number temp1; + cmsUInt8Number temp2; + + temp1 = *pByte++; + temp2 = *pByte++; + *(pByte-1) = *pByte; + *pByte++ = temp2; + *(pByte-3) = *pByte; + *pByte = temp1; +#endif + return DWord; +} + +// 1 2 3 4 5 6 7 8 +// 8 7 6 5 4 3 2 1 + +void CMSEXPORT _cmsAdjustEndianess64(cmsUInt64Number* Result, cmsUInt64Number* QWord) +{ + +#ifndef CMS_USE_BIG_ENDIAN + + cmsUInt8Number* pIn = (cmsUInt8Number*) QWord; + cmsUInt8Number* pOut = (cmsUInt8Number*) Result; + + _cmsAssert(Result != NULL); + + pOut[7] = pIn[0]; + pOut[6] = pIn[1]; + pOut[5] = pIn[2]; + pOut[4] = pIn[3]; + pOut[3] = pIn[4]; + pOut[2] = pIn[5]; + pOut[1] = pIn[6]; + pOut[0] = pIn[7]; + +#else + _cmsAssert(Result != NULL); + +# ifdef CMS_DONT_USE_INT64 + (*Result)[0] = (*QWord)[0]; + (*Result)[1] = (*QWord)[1]; +# else + *Result = *QWord; +# endif +#endif +} + +// Auxiliary -- read 8, 16 and 32-bit numbers +cmsBool CMSEXPORT _cmsReadUInt8Number(cmsIOHANDLER* io, cmsUInt8Number* n) +{ + cmsUInt8Number tmp; + + _cmsAssert(io != NULL); + + if (io -> Read(io, &tmp, sizeof(cmsUInt8Number), 1) != 1) + return FALSE; + + if (n != NULL) *n = tmp; + return TRUE; +} + +cmsBool CMSEXPORT _cmsReadUInt16Number(cmsIOHANDLER* io, cmsUInt16Number* n) +{ + cmsUInt16Number tmp; + + _cmsAssert(io != NULL); + + if (io -> Read(io, &tmp, sizeof(cmsUInt16Number), 1) != 1) + return FALSE; + + if (n != NULL) *n = _cmsAdjustEndianess16(tmp); + return TRUE; +} + +cmsBool CMSEXPORT _cmsReadUInt16Array(cmsIOHANDLER* io, cmsUInt32Number n, cmsUInt16Number* Array) +{ + cmsUInt32Number i; + + _cmsAssert(io != NULL); + + for (i=0; i < n; i++) { + + if (Array != NULL) { + if (!_cmsReadUInt16Number(io, Array + i)) return FALSE; + } + else { + if (!_cmsReadUInt16Number(io, NULL)) return FALSE; + } + + } + return TRUE; +} + +cmsBool CMSEXPORT _cmsReadUInt32Number(cmsIOHANDLER* io, cmsUInt32Number* n) +{ + cmsUInt32Number tmp; + + _cmsAssert(io != NULL); + + if (io -> Read(io, &tmp, sizeof(cmsUInt32Number), 1) != 1) + return FALSE; + + if (n != NULL) *n = _cmsAdjustEndianess32(tmp); + return TRUE; +} + +cmsBool CMSEXPORT _cmsReadFloat32Number(cmsIOHANDLER* io, cmsFloat32Number* n) +{ + union typeConverter { + cmsUInt32Number integer; + cmsFloat32Number floating_point; + } tmp; + + _cmsAssert(io != NULL); + + if (io->Read(io, &tmp.integer, sizeof(cmsUInt32Number), 1) != 1) + return FALSE; + + if (n != NULL) { + + tmp.integer = _cmsAdjustEndianess32(tmp.integer); + *n = tmp.floating_point; + + // Safeguard which covers against absurd values + if (*n > 1E+20 || *n < -1E+20) return FALSE; + + #if defined(_MSC_VER) && _MSC_VER < 1800 + return TRUE; + #elif defined (__BORLANDC__) + return TRUE; + #elif !defined(_MSC_VER) && (defined(__STDC_VERSION__) && __STDC_VERSION__ < 199901L) + return TRUE; + #else + + // fpclassify() required by C99 (only provided by MSVC >= 1800, VS2013 onwards) + return ((fpclassify(*n) == FP_ZERO) || (fpclassify(*n) == FP_NORMAL)); + #endif + } + + return TRUE; +} + + +cmsBool CMSEXPORT _cmsReadUInt64Number(cmsIOHANDLER* io, cmsUInt64Number* n) +{ + cmsUInt64Number tmp; + + _cmsAssert(io != NULL); + + if (io -> Read(io, &tmp, sizeof(cmsUInt64Number), 1) != 1) + return FALSE; + + if (n != NULL) { + + _cmsAdjustEndianess64(n, &tmp); + } + + return TRUE; +} + + +cmsBool CMSEXPORT _cmsRead15Fixed16Number(cmsIOHANDLER* io, cmsFloat64Number* n) +{ + cmsUInt32Number tmp; + + _cmsAssert(io != NULL); + + if (io -> Read(io, &tmp, sizeof(cmsUInt32Number), 1) != 1) + return FALSE; + + if (n != NULL) { + *n = _cms15Fixed16toDouble((cmsS15Fixed16Number) _cmsAdjustEndianess32(tmp)); + } + + return TRUE; +} + + +cmsBool CMSEXPORT _cmsReadXYZNumber(cmsIOHANDLER* io, cmsCIEXYZ* XYZ) +{ + cmsEncodedXYZNumber xyz; + + _cmsAssert(io != NULL); + + if (io ->Read(io, &xyz, sizeof(cmsEncodedXYZNumber), 1) != 1) return FALSE; + + if (XYZ != NULL) { + + XYZ->X = _cms15Fixed16toDouble((cmsS15Fixed16Number) _cmsAdjustEndianess32((cmsUInt32Number) xyz.X)); + XYZ->Y = _cms15Fixed16toDouble((cmsS15Fixed16Number) _cmsAdjustEndianess32((cmsUInt32Number) xyz.Y)); + XYZ->Z = _cms15Fixed16toDouble((cmsS15Fixed16Number) _cmsAdjustEndianess32((cmsUInt32Number) xyz.Z)); + } + return TRUE; +} + +cmsBool CMSEXPORT _cmsWriteUInt8Number(cmsIOHANDLER* io, cmsUInt8Number n) +{ + _cmsAssert(io != NULL); + + if (io -> Write(io, sizeof(cmsUInt8Number), &n) != 1) + return FALSE; + + return TRUE; +} + +cmsBool CMSEXPORT _cmsWriteUInt16Number(cmsIOHANDLER* io, cmsUInt16Number n) +{ + cmsUInt16Number tmp; + + _cmsAssert(io != NULL); + + tmp = _cmsAdjustEndianess16(n); + if (io -> Write(io, sizeof(cmsUInt16Number), &tmp) != 1) + return FALSE; + + return TRUE; +} + +cmsBool CMSEXPORT _cmsWriteUInt16Array(cmsIOHANDLER* io, cmsUInt32Number n, const cmsUInt16Number* Array) +{ + cmsUInt32Number i; + + _cmsAssert(io != NULL); + _cmsAssert(Array != NULL); + + for (i=0; i < n; i++) { + if (!_cmsWriteUInt16Number(io, Array[i])) return FALSE; + } + + return TRUE; +} + +cmsBool CMSEXPORT _cmsWriteUInt32Number(cmsIOHANDLER* io, cmsUInt32Number n) +{ + cmsUInt32Number tmp; + + _cmsAssert(io != NULL); + + tmp = _cmsAdjustEndianess32(n); + if (io -> Write(io, sizeof(cmsUInt32Number), &tmp) != 1) + return FALSE; + + return TRUE; +} + + +cmsBool CMSEXPORT _cmsWriteFloat32Number(cmsIOHANDLER* io, cmsFloat32Number n) +{ + union typeConverter { + cmsUInt32Number integer; + cmsFloat32Number floating_point; + } tmp; + + tmp.floating_point = n; + tmp.integer = _cmsAdjustEndianess32(tmp.integer); + if (io -> Write(io, sizeof(cmsUInt32Number), &tmp.integer) != 1) + return FALSE; + + return TRUE; +} + +cmsBool CMSEXPORT _cmsWriteUInt64Number(cmsIOHANDLER* io, cmsUInt64Number* n) +{ + cmsUInt64Number tmp; + + _cmsAssert(io != NULL); + + _cmsAdjustEndianess64(&tmp, n); + if (io -> Write(io, sizeof(cmsUInt64Number), &tmp) != 1) + return FALSE; + + return TRUE; +} + +cmsBool CMSEXPORT _cmsWrite15Fixed16Number(cmsIOHANDLER* io, cmsFloat64Number n) +{ + cmsUInt32Number tmp; + + _cmsAssert(io != NULL); + + tmp = _cmsAdjustEndianess32((cmsUInt32Number) _cmsDoubleTo15Fixed16(n)); + if (io -> Write(io, sizeof(cmsUInt32Number), &tmp) != 1) + return FALSE; + + return TRUE; +} + +cmsBool CMSEXPORT _cmsWriteXYZNumber(cmsIOHANDLER* io, const cmsCIEXYZ* XYZ) +{ + cmsEncodedXYZNumber xyz; + + _cmsAssert(io != NULL); + _cmsAssert(XYZ != NULL); + + xyz.X = (cmsS15Fixed16Number) _cmsAdjustEndianess32((cmsUInt32Number) _cmsDoubleTo15Fixed16(XYZ->X)); + xyz.Y = (cmsS15Fixed16Number) _cmsAdjustEndianess32((cmsUInt32Number) _cmsDoubleTo15Fixed16(XYZ->Y)); + xyz.Z = (cmsS15Fixed16Number) _cmsAdjustEndianess32((cmsUInt32Number) _cmsDoubleTo15Fixed16(XYZ->Z)); + + return io -> Write(io, sizeof(cmsEncodedXYZNumber), &xyz); +} + +// from Fixed point 8.8 to double +cmsFloat64Number CMSEXPORT _cms8Fixed8toDouble(cmsUInt16Number fixed8) +{ + return fixed8 / 256.0; +} + +cmsUInt16Number CMSEXPORT _cmsDoubleTo8Fixed8(cmsFloat64Number val) +{ + cmsS15Fixed16Number GammaFixed32 = _cmsDoubleTo15Fixed16(val); + return (cmsUInt16Number) ((GammaFixed32 >> 8) & 0xFFFF); +} + +// from Fixed point 15.16 to double +cmsFloat64Number CMSEXPORT _cms15Fixed16toDouble(cmsS15Fixed16Number fix32) +{ + return fix32 / 65536.0; +} + +// from double to Fixed point 15.16 +cmsS15Fixed16Number CMSEXPORT _cmsDoubleTo15Fixed16(cmsFloat64Number v) +{ + return ((cmsS15Fixed16Number) floor((v)*65536.0 + 0.5)); +} + +// Date/Time functions + +void CMSEXPORT _cmsDecodeDateTimeNumber(const cmsDateTimeNumber *Source, struct tm *Dest) +{ + + _cmsAssert(Dest != NULL); + _cmsAssert(Source != NULL); + + Dest->tm_sec = _cmsAdjustEndianess16(Source->seconds); + Dest->tm_min = _cmsAdjustEndianess16(Source->minutes); + Dest->tm_hour = _cmsAdjustEndianess16(Source->hours); + Dest->tm_mday = _cmsAdjustEndianess16(Source->day); + Dest->tm_mon = _cmsAdjustEndianess16(Source->month) - 1; + Dest->tm_year = _cmsAdjustEndianess16(Source->year) - 1900; + Dest->tm_wday = -1; + Dest->tm_yday = -1; + Dest->tm_isdst = 0; +} + +void CMSEXPORT _cmsEncodeDateTimeNumber(cmsDateTimeNumber *Dest, const struct tm *Source) +{ + _cmsAssert(Dest != NULL); + _cmsAssert(Source != NULL); + + Dest->seconds = _cmsAdjustEndianess16((cmsUInt16Number) Source->tm_sec); + Dest->minutes = _cmsAdjustEndianess16((cmsUInt16Number) Source->tm_min); + Dest->hours = _cmsAdjustEndianess16((cmsUInt16Number) Source->tm_hour); + Dest->day = _cmsAdjustEndianess16((cmsUInt16Number) Source->tm_mday); + Dest->month = _cmsAdjustEndianess16((cmsUInt16Number) (Source->tm_mon + 1)); + Dest->year = _cmsAdjustEndianess16((cmsUInt16Number) (Source->tm_year + 1900)); +} + +// Read base and return type base +cmsTagTypeSignature CMSEXPORT _cmsReadTypeBase(cmsIOHANDLER* io) +{ + _cmsTagBase Base; + + _cmsAssert(io != NULL); + + if (io -> Read(io, &Base, sizeof(_cmsTagBase), 1) != 1) + return (cmsTagTypeSignature) 0; + + return (cmsTagTypeSignature) _cmsAdjustEndianess32(Base.sig); +} + +// Setup base marker +cmsBool CMSEXPORT _cmsWriteTypeBase(cmsIOHANDLER* io, cmsTagTypeSignature sig) +{ + _cmsTagBase Base; + + _cmsAssert(io != NULL); + + Base.sig = (cmsTagTypeSignature) _cmsAdjustEndianess32(sig); + memset(&Base.reserved, 0, sizeof(Base.reserved)); + return io -> Write(io, sizeof(_cmsTagBase), &Base); +} + +cmsBool CMSEXPORT _cmsReadAlignment(cmsIOHANDLER* io) +{ + cmsUInt8Number Buffer[4]; + cmsUInt32Number NextAligned, At; + cmsUInt32Number BytesToNextAlignedPos; + + _cmsAssert(io != NULL); + + At = io -> Tell(io); + NextAligned = _cmsALIGNLONG(At); + BytesToNextAlignedPos = NextAligned - At; + if (BytesToNextAlignedPos == 0) return TRUE; + if (BytesToNextAlignedPos > 4) return FALSE; + + return (io ->Read(io, Buffer, BytesToNextAlignedPos, 1) == 1); +} + +cmsBool CMSEXPORT _cmsWriteAlignment(cmsIOHANDLER* io) +{ + cmsUInt8Number Buffer[4]; + cmsUInt32Number NextAligned, At; + cmsUInt32Number BytesToNextAlignedPos; + + _cmsAssert(io != NULL); + + At = io -> Tell(io); + NextAligned = _cmsALIGNLONG(At); + BytesToNextAlignedPos = NextAligned - At; + if (BytesToNextAlignedPos == 0) return TRUE; + if (BytesToNextAlignedPos > 4) return FALSE; + + memset(Buffer, 0, BytesToNextAlignedPos); + return io -> Write(io, BytesToNextAlignedPos, Buffer); +} + + +// To deal with text streams. 2K at most +cmsBool CMSEXPORT _cmsIOPrintf(cmsIOHANDLER* io, const char* frm, ...) +{ + va_list args; + int len; + cmsUInt8Number Buffer[2048]; + cmsBool rc; + cmsUInt8Number* ptr; + + _cmsAssert(io != NULL); + _cmsAssert(frm != NULL); + + va_start(args, frm); + + len = vsnprintf((char*) Buffer, 2047, frm, args); + if (len < 0 || len >= 2047) { + va_end(args); + return FALSE; // Truncated, which is a fatal error for us + } + + // setlocale may be active, no commas are needed in PS generator + // and PS generator is our only client + for (ptr = Buffer; *ptr; ptr++) + { + if (*ptr == ',') *ptr = '.'; + } + + rc = io ->Write(io, (cmsUInt32Number) len, Buffer); + + va_end(args); + + return rc; +} + + +// Plugin memory management ------------------------------------------------------------------------------------------------- + +// Specialized malloc for plug-ins, that is freed upon exit. +void* _cmsPluginMalloc(cmsContext ContextID, cmsUInt32Number size) +{ + struct _cmsContext_struct* ctx = _cmsGetContext(ContextID); + + if (ctx ->MemPool == NULL) { + + if (ContextID == NULL) { + + ctx->MemPool = _cmsCreateSubAlloc(0, 2*1024); + if (ctx->MemPool == NULL) return NULL; + } + else { + cmsSignalError(ContextID, cmsERROR_CORRUPTION_DETECTED, "NULL memory pool on context"); + return NULL; + } + } + + return _cmsSubAlloc(ctx->MemPool, size); +} + + +// Main plug-in dispatcher +cmsBool CMSEXPORT cmsPlugin(void* Plug_in) +{ + return cmsPluginTHR(NULL, Plug_in); +} + +cmsBool CMSEXPORT cmsPluginTHR(cmsContext id, void* Plug_in) +{ + cmsPluginBase* Plugin; + + for (Plugin = (cmsPluginBase*) Plug_in; + Plugin != NULL; + Plugin = Plugin -> Next) { + + if (Plugin -> Magic != cmsPluginMagicNumber) { + cmsSignalError(id, cmsERROR_UNKNOWN_EXTENSION, "Unrecognized plugin"); + return FALSE; + } + + if (Plugin ->ExpectedVersion > LCMS_VERSION) { + cmsSignalError(id, cmsERROR_UNKNOWN_EXTENSION, "plugin needs Little CMS %d, current version is %d", + Plugin ->ExpectedVersion, LCMS_VERSION); + return FALSE; + } + + switch (Plugin -> Type) { + + case cmsPluginMemHandlerSig: + if (!_cmsRegisterMemHandlerPlugin(id, Plugin)) return FALSE; + break; + + case cmsPluginInterpolationSig: + if (!_cmsRegisterInterpPlugin(id, Plugin)) return FALSE; + break; + + case cmsPluginTagTypeSig: + if (!_cmsRegisterTagTypePlugin(id, Plugin)) return FALSE; + break; + + case cmsPluginTagSig: + if (!_cmsRegisterTagPlugin(id, Plugin)) return FALSE; + break; + + case cmsPluginFormattersSig: + if (!_cmsRegisterFormattersPlugin(id, Plugin)) return FALSE; + break; + + case cmsPluginRenderingIntentSig: + if (!_cmsRegisterRenderingIntentPlugin(id, Plugin)) return FALSE; + break; + + case cmsPluginParametricCurveSig: + if (!_cmsRegisterParametricCurvesPlugin(id, Plugin)) return FALSE; + break; + + case cmsPluginMultiProcessElementSig: + if (!_cmsRegisterMultiProcessElementPlugin(id, Plugin)) return FALSE; + break; + + case cmsPluginOptimizationSig: + if (!_cmsRegisterOptimizationPlugin(id, Plugin)) return FALSE; + break; + + case cmsPluginTransformSig: + if (!_cmsRegisterTransformPlugin(id, Plugin)) return FALSE; + break; + + case cmsPluginMutexSig: + if (!_cmsRegisterMutexPlugin(id, Plugin)) return FALSE; + break; + + case cmsPluginParalellizationSig: + if (!_cmsRegisterParallelizationPlugin(id, Plugin)) return FALSE; + break; + + default: + cmsSignalError(id, cmsERROR_UNKNOWN_EXTENSION, "Unrecognized plugin type '%X'", Plugin -> Type); + return FALSE; + } + } + + // Keep a reference to the plug-in + return TRUE; +} + + +// Revert all plug-ins to default +void CMSEXPORT cmsUnregisterPlugins(void) +{ + cmsUnregisterPluginsTHR(NULL); +} + + +// The Global storage for system context. This is the one and only global variable +// pointers structure. All global vars are referenced here. +static struct _cmsContext_struct globalContext = { + + NULL, // Not in the linked list + NULL, // No suballocator + { + NULL, // UserPtr, + &_cmsLogErrorChunk, // Logger, + &_cmsAlarmCodesChunk, // AlarmCodes, + &_cmsAdaptationStateChunk, // AdaptationState, + &_cmsMemPluginChunk, // MemPlugin, + &_cmsInterpPluginChunk, // InterpPlugin, + &_cmsCurvesPluginChunk, // CurvesPlugin, + &_cmsFormattersPluginChunk, // FormattersPlugin, + &_cmsTagTypePluginChunk, // TagTypePlugin, + &_cmsTagPluginChunk, // TagPlugin, + &_cmsIntentsPluginChunk, // IntentPlugin, + &_cmsMPETypePluginChunk, // MPEPlugin, + &_cmsOptimizationPluginChunk, // OptimizationPlugin, + &_cmsTransformPluginChunk, // TransformPlugin, + &_cmsMutexPluginChunk, // MutexPlugin, + &_cmsParallelizationPluginChunk // ParallelizationPlugin + }, + + { NULL, NULL, NULL, NULL, NULL, NULL } // The default memory allocator is not used for context 0 +}; + + +// The context pool (linked list head) +static _cmsMutex _cmsContextPoolHeadMutex = CMS_MUTEX_INITIALIZER; +static struct _cmsContext_struct* _cmsContextPoolHead = NULL; + + +// Make sure context is initialized (needed on windows) +static +cmsBool InitContextMutex(void) +{ + // See the comments regarding locking in lcms2_internal.h + // for an explanation of why we need the following code. +#ifndef CMS_NO_PTHREADS +#ifdef CMS_IS_WINDOWS_ +#ifndef CMS_RELY_ON_WINDOWS_STATIC_MUTEX_INIT + + static cmsBool already_initialized = FALSE; + + if (!already_initialized) + { + static HANDLE _cmsWindowsInitMutex = NULL; + static volatile HANDLE* mutex = &_cmsWindowsInitMutex; + + if (*mutex == NULL) + { + HANDLE p = CreateMutex(NULL, FALSE, NULL); + if (p && InterlockedCompareExchangePointer((void**)mutex, (void*)p, NULL) != NULL) + CloseHandle(p); + } + if (*mutex == NULL || WaitForSingleObject(*mutex, INFINITE) == WAIT_FAILED) + { + cmsSignalError(0, cmsERROR_INTERNAL, "Mutex lock failed"); + return FALSE; + } + if (((void**)&_cmsContextPoolHeadMutex)[0] == NULL) + InitializeCriticalSection(&_cmsContextPoolHeadMutex); + if (*mutex == NULL || !ReleaseMutex(*mutex)) + { + cmsSignalError(0, cmsERROR_INTERNAL, "Mutex unlock failed"); + return FALSE; + } + already_initialized = TRUE; + } +#endif +#endif +#endif + + return TRUE; +} + + + +// Internal, get associated pointer, with guessing. Never returns NULL. +struct _cmsContext_struct* _cmsGetContext(cmsContext ContextID) +{ + struct _cmsContext_struct* id = (struct _cmsContext_struct*) ContextID; + struct _cmsContext_struct* ctx; + + // On 0, use global settings + if (id == NULL) + return &globalContext; + + InitContextMutex(); + + // Search + _cmsEnterCriticalSectionPrimitive(&_cmsContextPoolHeadMutex); + + for (ctx = _cmsContextPoolHead; + ctx != NULL; + ctx = ctx ->Next) { + + // Found it? + if (id == ctx) + { + _cmsLeaveCriticalSectionPrimitive(&_cmsContextPoolHeadMutex); + return ctx; // New-style context + } + } + + _cmsLeaveCriticalSectionPrimitive(&_cmsContextPoolHeadMutex); + return &globalContext; +} + + +// Internal: get the memory area associanted with each context client +// Returns the block assigned to the specific zone. Never return NULL. +void* _cmsContextGetClientChunk(cmsContext ContextID, _cmsMemoryClient mc) +{ + struct _cmsContext_struct* ctx; + void *ptr; + + if ((int) mc < 0 || mc >= MemoryClientMax) { + + cmsSignalError(ContextID, cmsERROR_INTERNAL, "Bad context client -- possible corruption"); + + // This is catastrophic. Should never reach here + _cmsAssert(0); + + // Reverts to global context + return globalContext.chunks[UserPtr]; + } + + ctx = _cmsGetContext(ContextID); + ptr = ctx ->chunks[mc]; + + if (ptr != NULL) + return ptr; + + // A null ptr means no special settings for that context, and this + // reverts to Context0 globals + return globalContext.chunks[mc]; +} + + +// This function returns the given context its default pristine state, +// as no plug-ins were declared. There is no way to unregister a single +// plug-in, as a single call to cmsPluginTHR() function may register +// many different plug-ins simultaneously, then there is no way to +// identify which plug-in to unregister. +void CMSEXPORT cmsUnregisterPluginsTHR(cmsContext ContextID) +{ + _cmsRegisterMemHandlerPlugin(ContextID, NULL); + _cmsRegisterInterpPlugin(ContextID, NULL); + _cmsRegisterTagTypePlugin(ContextID, NULL); + _cmsRegisterTagPlugin(ContextID, NULL); + _cmsRegisterFormattersPlugin(ContextID, NULL); + _cmsRegisterRenderingIntentPlugin(ContextID, NULL); + _cmsRegisterParametricCurvesPlugin(ContextID, NULL); + _cmsRegisterMultiProcessElementPlugin(ContextID, NULL); + _cmsRegisterOptimizationPlugin(ContextID, NULL); + _cmsRegisterTransformPlugin(ContextID, NULL); + _cmsRegisterMutexPlugin(ContextID, NULL); + _cmsRegisterParallelizationPlugin(ContextID, NULL); + +} + + +// Returns the memory manager plug-in, if any, from the Plug-in bundle +static +cmsPluginMemHandler* _cmsFindMemoryPlugin(void* PluginBundle) +{ + cmsPluginBase* Plugin; + + for (Plugin = (cmsPluginBase*) PluginBundle; + Plugin != NULL; + Plugin = Plugin -> Next) { + + if (Plugin -> Magic == cmsPluginMagicNumber && + Plugin -> ExpectedVersion <= LCMS_VERSION && + Plugin -> Type == cmsPluginMemHandlerSig) { + + // Found! + return (cmsPluginMemHandler*) Plugin; + } + } + + // Nope, revert to defaults + return NULL; +} + + +// Creates a new context with optional associated plug-ins. Caller may also specify an optional pointer to user-defined +// data that will be forwarded to plug-ins and logger. +cmsContext CMSEXPORT cmsCreateContext(void* Plugin, void* UserData) +{ + struct _cmsContext_struct* ctx; + struct _cmsContext_struct fakeContext; + + if (!InitContextMutex()) return NULL; + + _cmsInstallAllocFunctions(_cmsFindMemoryPlugin(Plugin), &fakeContext.DefaultMemoryManager); + + fakeContext.chunks[UserPtr] = UserData; + fakeContext.chunks[MemPlugin] = &fakeContext.DefaultMemoryManager; + + // Create the context structure. + ctx = (struct _cmsContext_struct*) _cmsMalloc(&fakeContext, sizeof(struct _cmsContext_struct)); + if (ctx == NULL) + return NULL; // Something very wrong happened! + + // Init the structure and the memory manager + memset(ctx, 0, sizeof(struct _cmsContext_struct)); + + // Keep memory manager + memcpy(&ctx->DefaultMemoryManager, &fakeContext.DefaultMemoryManager, sizeof(_cmsMemPluginChunk)); + + // Maintain the linked list (with proper locking) + _cmsEnterCriticalSectionPrimitive(&_cmsContextPoolHeadMutex); + ctx ->Next = _cmsContextPoolHead; + _cmsContextPoolHead = ctx; + _cmsLeaveCriticalSectionPrimitive(&_cmsContextPoolHeadMutex); + + ctx ->chunks[UserPtr] = UserData; + ctx ->chunks[MemPlugin] = &ctx->DefaultMemoryManager; + + // Now we can allocate the pool by using default memory manager + ctx ->MemPool = _cmsCreateSubAlloc(ctx, 22 * sizeof(void*)); // default size about 22 pointers + if (ctx ->MemPool == NULL) { + + cmsDeleteContext(ctx); + return NULL; + } + + _cmsAllocLogErrorChunk(ctx, NULL); + _cmsAllocAlarmCodesChunk(ctx, NULL); + _cmsAllocAdaptationStateChunk(ctx, NULL); + _cmsAllocMemPluginChunk(ctx, NULL); + _cmsAllocInterpPluginChunk(ctx, NULL); + _cmsAllocCurvesPluginChunk(ctx, NULL); + _cmsAllocFormattersPluginChunk(ctx, NULL); + _cmsAllocTagTypePluginChunk(ctx, NULL); + _cmsAllocMPETypePluginChunk(ctx, NULL); + _cmsAllocTagPluginChunk(ctx, NULL); + _cmsAllocIntentsPluginChunk(ctx, NULL); + _cmsAllocOptimizationPluginChunk(ctx, NULL); + _cmsAllocTransformPluginChunk(ctx, NULL); + _cmsAllocMutexPluginChunk(ctx, NULL); + _cmsAllocParallelizationPluginChunk(ctx, NULL); + + // Setup the plug-ins + if (!cmsPluginTHR(ctx, Plugin)) { + + cmsDeleteContext(ctx); + return NULL; + } + + return (cmsContext) ctx; +} + +// Duplicates a context with all associated plug-ins. +// Caller may specify an optional pointer to user-defined +// data that will be forwarded to plug-ins and logger. +cmsContext CMSEXPORT cmsDupContext(cmsContext ContextID, void* NewUserData) +{ + int i; + struct _cmsContext_struct* ctx; + const struct _cmsContext_struct* src = _cmsGetContext(ContextID); + + void* userData = (NewUserData != NULL) ? NewUserData : src -> chunks[UserPtr]; + + + ctx = (struct _cmsContext_struct*) _cmsMalloc(ContextID, sizeof(struct _cmsContext_struct)); + if (ctx == NULL) + return NULL; // Something very wrong happened + + if (!InitContextMutex()) return NULL; + + // Setup default memory allocators + if (ContextID == NULL) + _cmsInstallAllocFunctions(NULL, &ctx->DefaultMemoryManager); + else + memcpy(&ctx->DefaultMemoryManager, &src->DefaultMemoryManager, sizeof(ctx->DefaultMemoryManager)); + + // Maintain the linked list + _cmsEnterCriticalSectionPrimitive(&_cmsContextPoolHeadMutex); + ctx ->Next = _cmsContextPoolHead; + _cmsContextPoolHead = ctx; + _cmsLeaveCriticalSectionPrimitive(&_cmsContextPoolHeadMutex); + + ctx ->chunks[UserPtr] = userData; + ctx ->chunks[MemPlugin] = &ctx->DefaultMemoryManager; + + ctx ->MemPool = _cmsCreateSubAlloc(ctx, 22 * sizeof(void*)); + if (ctx ->MemPool == NULL) { + + cmsDeleteContext(ctx); + return NULL; + } + + // Allocate all required chunks. + _cmsAllocLogErrorChunk(ctx, src); + _cmsAllocAlarmCodesChunk(ctx, src); + _cmsAllocAdaptationStateChunk(ctx, src); + _cmsAllocMemPluginChunk(ctx, src); + _cmsAllocInterpPluginChunk(ctx, src); + _cmsAllocCurvesPluginChunk(ctx, src); + _cmsAllocFormattersPluginChunk(ctx, src); + _cmsAllocTagTypePluginChunk(ctx, src); + _cmsAllocMPETypePluginChunk(ctx, src); + _cmsAllocTagPluginChunk(ctx, src); + _cmsAllocIntentsPluginChunk(ctx, src); + _cmsAllocOptimizationPluginChunk(ctx, src); + _cmsAllocTransformPluginChunk(ctx, src); + _cmsAllocMutexPluginChunk(ctx, src); + _cmsAllocParallelizationPluginChunk(ctx, src); + + // Make sure no one failed + for (i=Logger; i < MemoryClientMax; i++) { + + if (src ->chunks[i] == NULL) { + cmsDeleteContext((cmsContext) ctx); + return NULL; + } + } + + return (cmsContext) ctx; +} + + +// Frees any resources associated with the given context, +// and destroys the context placeholder. +// The ContextID can no longer be used in any THR operation. +void CMSEXPORT cmsDeleteContext(cmsContext ContextID) +{ + if (ContextID == NULL) { + + cmsUnregisterPlugins(); + if (globalContext.MemPool != NULL) + _cmsSubAllocDestroy(globalContext.MemPool); + globalContext.MemPool = NULL; + } + else { + + struct _cmsContext_struct* ctx = (struct _cmsContext_struct*) ContextID; + struct _cmsContext_struct fakeContext; + struct _cmsContext_struct* prev; + + + InitContextMutex(); + + memcpy(&fakeContext.DefaultMemoryManager, &ctx->DefaultMemoryManager, sizeof(ctx->DefaultMemoryManager)); + + fakeContext.chunks[UserPtr] = ctx ->chunks[UserPtr]; + fakeContext.chunks[MemPlugin] = &fakeContext.DefaultMemoryManager; + + // Get rid of plugins + cmsUnregisterPluginsTHR(ContextID); + + // Since all memory is allocated in the private pool, all what we need to do is destroy the pool + if (ctx -> MemPool != NULL) + _cmsSubAllocDestroy(ctx ->MemPool); + ctx -> MemPool = NULL; + + // Maintain list + _cmsEnterCriticalSectionPrimitive(&_cmsContextPoolHeadMutex); + if (_cmsContextPoolHead == ctx) { + + _cmsContextPoolHead = ctx->Next; + } + else { + + // Search for previous + for (prev = _cmsContextPoolHead; + prev != NULL; + prev = prev ->Next) + { + if (prev -> Next == ctx) { + prev -> Next = ctx ->Next; + break; + } + } + } + _cmsLeaveCriticalSectionPrimitive(&_cmsContextPoolHeadMutex); + + // free the memory block itself + _cmsFree(&fakeContext, ctx); + } +} + +// Returns the user data associated to the given ContextID, or NULL if no user data was attached on context creation +void* CMSEXPORT cmsGetContextUserData(cmsContext ContextID) +{ + return _cmsContextGetClientChunk(ContextID, UserPtr); +} + + +// Use context mutex to provide thread-safe time +cmsBool _cmsGetTime(struct tm* ptr_time) +{ + struct tm* t; +#if defined(HAVE_GMTIME_R) || defined(HAVE_GMTIME_S) + struct tm tm; +#endif + + time_t now = time(NULL); + +#ifdef HAVE_GMTIME_R + t = gmtime_r(&now, &tm); +#elif defined(HAVE_GMTIME_S) + t = gmtime_s(&tm, &now) == 0 ? &tm : NULL; +#else + if (!InitContextMutex()) return FALSE; + + _cmsEnterCriticalSectionPrimitive(&_cmsContextPoolHeadMutex); + t = gmtime(&now); + _cmsLeaveCriticalSectionPrimitive(&_cmsContextPoolHeadMutex); +#endif + + if (t == NULL) + return FALSE; + else { + *ptr_time = *t; + return TRUE; + } +} diff --git a/local/recipes/libs/lcms2/source/src/cmsps2.c b/local/recipes/libs/lcms2/source/src/cmsps2.c new file mode 100644 index 0000000000..8997afcf9d --- /dev/null +++ b/local/recipes/libs/lcms2/source/src/cmsps2.c @@ -0,0 +1,1642 @@ +//--------------------------------------------------------------------------------- +// +// Little Color Management System +// Copyright (c) 1998-2026 Marti Maria Saguer +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//--------------------------------------------------------------------------------- +// + +#include "lcms2_internal.h" + +// PostScript ColorRenderingDictionary and ColorSpaceArray + + +#define MAXPSCOLS 60 // Columns on tables + +/* + Implementation + -------------- + + PostScript does use XYZ as its internal PCS. But since PostScript + interpolation tables are limited to 8 bits, I use Lab as a way to + improve the accuracy, favoring perceptual results. So, for the creation + of each CRD, CSA the profiles are converted to Lab via a device + link between profile -> Lab or Lab -> profile. The PS code necessary to + convert Lab <-> XYZ is also included. + + + + Color Space Arrays (CSA) + ================================================================================== + + In order to obtain precision, code chooses between three ways to implement + the device -> XYZ transform. These cases identifies monochrome profiles (often + implemented as a set of curves), matrix-shaper and Pipeline-based. + + Monochrome + ----------- + + This is implemented as /CIEBasedA CSA. The prelinearization curve is + placed into /DecodeA section, and matrix equals to D50. Since here is + no interpolation tables, I do the conversion directly to XYZ + + NOTE: CLUT-based monochrome profiles are NOT supported. So, cmsFLAGS_MATRIXINPUT + flag is forced on such profiles. + + [ /CIEBasedA + << + /DecodeA { transfer function } bind + /MatrixA [D50] + /RangeLMN [ 0.0 cmsD50X 0.0 cmsD50Y 0.0 cmsD50Z ] + /WhitePoint [D50] + /BlackPoint [BP] + /RenderingIntent (intent) + >> + ] + + On simpler profiles, the PCS is already XYZ, so no conversion is required. + + + Matrix-shaper based + ------------------- + + This is implemented both with /CIEBasedABC or /CIEBasedDEF depending on the + profile implementation. Since here there are no interpolation tables, I do + the conversion directly to XYZ + + + + [ /CIEBasedABC + << + /DecodeABC [ {transfer1} {transfer2} {transfer3} ] + /MatrixABC [Matrix] + /RangeLMN [ 0.0 cmsD50X 0.0 cmsD50Y 0.0 cmsD50Z ] + /DecodeLMN [ { / 2} dup dup ] + /WhitePoint [D50] + /BlackPoint [BP] + /RenderingIntent (intent) + >> + ] + + + CLUT based + ---------- + + Lab is used in such cases. + + [ /CIEBasedDEF + << + /DecodeDEF [ ] + /Table [ p p p [<...>]] + /RangeABC [ 0 1 0 1 0 1] + /DecodeABC[ ] + /RangeLMN [ -0.236 1.254 0 1 -0.635 1.640 ] + % -128/500 1+127/500 0 1 -127/200 1+128/200 + /MatrixABC [ 1 1 1 1 0 0 0 0 -1] + /WhitePoint [D50] + /BlackPoint [BP] + /RenderingIntent (intent) + ] + + + Color Rendering Dictionaries (CRD) + ================================== + These are always implemented as CLUT, and always are using Lab. Since CRD are expected to + be used as resources, the code adds the definition as well. + + << + /ColorRenderingType 1 + /WhitePoint [ D50 ] + /BlackPoint [BP] + /MatrixPQR [ Bradford ] + /RangePQR [-0.125 1.375 -0.125 1.375 -0.125 1.375 ] + /TransformPQR [ + {4 index 3 get div 2 index 3 get mul exch pop exch pop exch pop exch pop } bind + {4 index 4 get div 2 index 4 get mul exch pop exch pop exch pop exch pop } bind + {4 index 5 get div 2 index 5 get mul exch pop exch pop exch pop exch pop } bind + ] + /MatrixABC <...> + /EncodeABC <...> + /RangeABC <.. used for XYZ -> Lab> + /EncodeLMN + /RenderTable [ p p p [<...>]] + + /RenderingIntent (Perceptual) + >> + /Current exch /ColorRendering defineresource pop + + + The following stages are used to convert from XYZ to Lab + -------------------------------------------------------- + + Input is given at LMN stage on X, Y, Z + + Encode LMN gives us f(X/Xn), f(Y/Yn), f(Z/Zn) + + /EncodeLMN [ + + { 0.964200 div dup 0.008856 le {7.787 mul 16 116 div add}{1 3 div exp} ifelse } bind + { 1.000000 div dup 0.008856 le {7.787 mul 16 116 div add}{1 3 div exp} ifelse } bind + { 0.824900 div dup 0.008856 le {7.787 mul 16 116 div add}{1 3 div exp} ifelse } bind + + ] + + + MatrixABC is used to compute f(Y/Yn), f(X/Xn) - f(Y/Yn), f(Y/Yn) - f(Z/Zn) + + | 0 1 0| + | 1 -1 0| + | 0 1 -1| + + /MatrixABC [ 0 1 0 1 -1 1 0 0 -1 ] + + EncodeABC finally gives Lab values. + + /EncodeABC [ + { 116 mul 16 sub 100 div } bind + { 500 mul 128 add 255 div } bind + { 200 mul 128 add 255 div } bind + ] + + The following stages are used to convert Lab to XYZ + ---------------------------------------------------- + + /RangeABC [ 0 1 0 1 0 1] + /DecodeABC [ { 100 mul 16 add 116 div } bind + { 255 mul 128 sub 500 div } bind + { 255 mul 128 sub 200 div } bind + ] + + /MatrixABC [ 1 1 1 1 0 0 0 0 -1] + /DecodeLMN [ + {dup 6 29 div ge {dup dup mul mul} {4 29 div sub 108 841 div mul} ifelse 0.964200 mul} bind + {dup 6 29 div ge {dup dup mul mul} {4 29 div sub 108 841 div mul} ifelse } bind + {dup 6 29 div ge {dup dup mul mul} {4 29 div sub 108 841 div mul} ifelse 0.824900 mul} bind + ] + + +*/ + +/* + + PostScript algorithms discussion. + ========================================================================================================= + + 1D interpolation algorithm + + + 1D interpolation (float) + ------------------------ + + val2 = Domain * Value; + + cell0 = (int) floor(val2); + cell1 = (int) ceil(val2); + + rest = val2 - cell0; + + y0 = LutTable[cell0] ; + y1 = LutTable[cell1] ; + + y = y0 + (y1 - y0) * rest; + + + + PostScript code Stack + ================================================ + + { % v + + [array] % v tab + dup % v tab tab + length 1 sub % v tab dom + + 3 -1 roll % tab dom v + + mul % tab val2 + dup % tab val2 val2 + dup % tab val2 val2 val2 + floor cvi % tab val2 val2 cell0 + exch % tab val2 cell0 val2 + ceiling cvi % tab val2 cell0 cell1 + + 3 index % tab val2 cell0 cell1 tab + exch % tab val2 cell0 tab cell1 + get % tab val2 cell0 y1 + + 4 -1 roll % val2 cell0 y1 tab + 3 -1 roll % val2 y1 tab cell0 + get % val2 y1 y0 + + dup % val2 y1 y0 y0 + 3 1 roll % val2 y0 y1 y0 + + sub % val2 y0 (y1-y0) + 3 -1 roll % y0 (y1-y0) val2 + dup % y0 (y1-y0) val2 val2 + floor cvi % y0 (y1-y0) val2 floor(val2) + sub % y0 (y1-y0) rest + mul % y0 t1 + add % y + 65535 div % result + + } bind + + +*/ + + +// This struct holds the memory block currently being write +typedef struct { + _cmsStageCLutData* Pipeline; + cmsIOHANDLER* m; + + int FirstComponent; + int SecondComponent; + + const char* PreMaj; + const char* PostMaj; + const char* PreMin; + const char* PostMin; + + int FixWhite; // Force mapping of pure white + + cmsColorSpaceSignature ColorSpace; // ColorSpace of profile + + +} cmsPsSamplerCargo; + +static int _cmsPSActualColumn = 0; + + +// Convert to byte +static +cmsUInt8Number Word2Byte(cmsUInt16Number w) +{ + return (cmsUInt8Number) floor((cmsFloat64Number) w / 257.0 + 0.5); +} + + +// Write a cooked byte +static +void WriteByte(cmsIOHANDLER* m, cmsUInt8Number b) +{ + _cmsIOPrintf(m, "%02x", b); + _cmsPSActualColumn += 2; + + if (_cmsPSActualColumn > MAXPSCOLS) { + + _cmsIOPrintf(m, "\n"); + _cmsPSActualColumn = 0; + } +} + +// ----------------------------------------------------------------- PostScript generation + + +// Removes offending carriage returns + +static +char* RemoveCR(const char* txt) +{ + static char Buffer[2048]; + char* pt; + + strncpy(Buffer, txt, 2047); + Buffer[2047] = 0; + for (pt = Buffer; *pt; pt++) + if (*pt == '\n' || *pt == '\r') *pt = ' '; + + return Buffer; + +} + +// Writes the body of a PostScript string literal, escaping the metacharacters +// '\\', '(' and ')' and emitting non-printable / high-bit bytes as octal +// triples per PLRM 3.3.4.1. The caller is responsible for the surrounding +// '(' and ')' delimiters. +static +void EmitPSEscaped(cmsIOHANDLER* m, const char* txt) +{ + const unsigned char* p; + + if (txt == NULL) return; + + for (p = (const unsigned char*)txt; *p != 0; p++) { + unsigned char c = *p; + + if (c == '\\' || c == '(' || c == ')') { + _cmsIOPrintf(m, "\\%c", c); + } + else if (c < 0x20 || c >= 0x7F) { + _cmsIOPrintf(m, "\\%03o", c); + } + else { + _cmsIOPrintf(m, "%c", c); + } + } +} + +static +void EmitHeader(cmsIOHANDLER* m, const char* Title, cmsHPROFILE hProfile) +{ + time_t timer; + cmsMLU *Description, *Copyright; + char DescASCII[256], CopyrightASCII[256]; + + time(&timer); + + Description = (cmsMLU*) cmsReadTag(hProfile, cmsSigProfileDescriptionTag); + Copyright = (cmsMLU*) cmsReadTag(hProfile, cmsSigCopyrightTag); + + DescASCII[0] = DescASCII[255] = 0; + CopyrightASCII[0] = CopyrightASCII[255] = 0; + + if (Description != NULL) cmsMLUgetASCII(Description, cmsNoLanguage, cmsNoCountry, DescASCII, 255); + if (Copyright != NULL) cmsMLUgetASCII(Copyright, cmsNoLanguage, cmsNoCountry, CopyrightASCII, 255); + + _cmsIOPrintf(m, "%%!PS-Adobe-3.0\n"); + _cmsIOPrintf(m, "%%\n"); + _cmsIOPrintf(m, "%% %s\n", Title); + _cmsIOPrintf(m, "%% Source: %s\n", RemoveCR(DescASCII)); + _cmsIOPrintf(m, "%% %s\n", RemoveCR(CopyrightASCII)); + { + struct tm local_time; + char CreatedASCII[64]; + + if (localtime_r(&timer, &local_time) != NULL && + strftime(CreatedASCII, sizeof(CreatedASCII), "%a %b %e %H:%M:%S %Y", &local_time) > 0) + _cmsIOPrintf(m, "%% Created: %s\n", CreatedASCII); + } + _cmsIOPrintf(m, "%%\n"); + _cmsIOPrintf(m, "%%%%BeginResource\n"); + +} + + +// Emits White & Black point. White point is always D50, Black point is the device +// Black point adapted to D50. + +static +void EmitWhiteBlackD50(cmsIOHANDLER* m, cmsCIEXYZ* BlackPoint) +{ + + _cmsIOPrintf(m, "/BlackPoint [%f %f %f]\n", BlackPoint -> X, + BlackPoint -> Y, + BlackPoint -> Z); + + _cmsIOPrintf(m, "/WhitePoint [%f %f %f]\n", cmsD50_XYZ()->X, + cmsD50_XYZ()->Y, + cmsD50_XYZ()->Z); +} + + +static +void EmitRangeCheck(cmsIOHANDLER* m) +{ + _cmsIOPrintf(m, "dup 0.0 lt { pop 0.0 } if " + "dup 1.0 gt { pop 1.0 } if "); + +} + +// Does write the intent + +static +void EmitIntent(cmsIOHANDLER* m, cmsUInt32Number RenderingIntent) +{ + const char *intent; + + switch (RenderingIntent) { + + case INTENT_PERCEPTUAL: intent = "Perceptual"; break; + case INTENT_RELATIVE_COLORIMETRIC: intent = "RelativeColorimetric"; break; + case INTENT_ABSOLUTE_COLORIMETRIC: intent = "AbsoluteColorimetric"; break; + case INTENT_SATURATION: intent = "Saturation"; break; + + default: intent = "Undefined"; break; + } + + _cmsIOPrintf(m, "/RenderingIntent (%s)\n", intent ); +} + +// +// Convert L* to Y +// +// Y = Yn*[ (L* + 16) / 116] ^ 3 if (L*) >= 6 / 29 +// = Yn*( L* / 116) / 7.787 if (L*) < 6 / 29 +// + +// Lab -> XYZ, see the discussion above + +static +void EmitLab2XYZ(cmsIOHANDLER* m) +{ + _cmsIOPrintf(m, "/RangeABC [ 0 1 0 1 0 1]\n"); + _cmsIOPrintf(m, "/DecodeABC [\n"); + _cmsIOPrintf(m, "{100 mul 16 add 116 div } bind\n"); + _cmsIOPrintf(m, "{255 mul 128 sub 500 div } bind\n"); + _cmsIOPrintf(m, "{255 mul 128 sub 200 div } bind\n"); + _cmsIOPrintf(m, "]\n"); + _cmsIOPrintf(m, "/MatrixABC [ 1 1 1 1 0 0 0 0 -1]\n"); + _cmsIOPrintf(m, "/RangeLMN [ -0.236 1.254 0 1 -0.635 1.640 ]\n"); + _cmsIOPrintf(m, "/DecodeLMN [\n"); + _cmsIOPrintf(m, "{dup 6 29 div ge {dup dup mul mul} {4 29 div sub 108 841 div mul} ifelse 0.964200 mul} bind\n"); + _cmsIOPrintf(m, "{dup 6 29 div ge {dup dup mul mul} {4 29 div sub 108 841 div mul} ifelse } bind\n"); + _cmsIOPrintf(m, "{dup 6 29 div ge {dup dup mul mul} {4 29 div sub 108 841 div mul} ifelse 0.824900 mul} bind\n"); + _cmsIOPrintf(m, "]\n"); +} + + + +// Outputs a table of words. It does use 16 bits + +static +void Emit1Gamma(cmsIOHANDLER* m, cmsToneCurve* Table) +{ + cmsUInt32Number i; + cmsFloat64Number gamma; + + /** + * On error, empty tables or lienar assume gamma 1.0 + */ + if (Table == NULL || + Table->nEntries <= 0 || + cmsIsToneCurveLinear(Table)) { + + _cmsIOPrintf(m, "{ 1 } bind "); + return; + } + + + // Check if is really an exponential. If so, emit "exp" + gamma = cmsEstimateGamma(Table, 0.001); + if (gamma > 0) { + _cmsIOPrintf(m, "{ %g exp } bind ", gamma); + return; + } + + _cmsIOPrintf(m, "{ "); + + // Bounds check + EmitRangeCheck(m); + + // Emit interpolation code + + // PostScript code Stack + // =============== ======================== + // v + _cmsIOPrintf(m, " ["); + + for (i=0; i < Table->nEntries; i++) { + if (i % 10 == 0) + _cmsIOPrintf(m, "\n "); + _cmsIOPrintf(m, "%d ", Table->Table16[i]); + } + + _cmsIOPrintf(m, "] "); // v tab + + _cmsIOPrintf(m, "dup "); // v tab tab + _cmsIOPrintf(m, "length 1 sub "); // v tab dom + _cmsIOPrintf(m, "3 -1 roll "); // tab dom v + _cmsIOPrintf(m, "mul "); // tab val2 + _cmsIOPrintf(m, "dup "); // tab val2 val2 + _cmsIOPrintf(m, "dup "); // tab val2 val2 val2 + _cmsIOPrintf(m, "floor cvi "); // tab val2 val2 cell0 + _cmsIOPrintf(m, "exch "); // tab val2 cell0 val2 + _cmsIOPrintf(m, "ceiling cvi "); // tab val2 cell0 cell1 + _cmsIOPrintf(m, "3 index "); // tab val2 cell0 cell1 tab + _cmsIOPrintf(m, "exch "); // tab val2 cell0 tab cell1 + _cmsIOPrintf(m, "get\n "); // tab val2 cell0 y1 + _cmsIOPrintf(m, "4 -1 roll "); // val2 cell0 y1 tab + _cmsIOPrintf(m, "3 -1 roll "); // val2 y1 tab cell0 + _cmsIOPrintf(m, "get "); // val2 y1 y0 + _cmsIOPrintf(m, "dup "); // val2 y1 y0 y0 + _cmsIOPrintf(m, "3 1 roll "); // val2 y0 y1 y0 + _cmsIOPrintf(m, "sub "); // val2 y0 (y1-y0) + _cmsIOPrintf(m, "3 -1 roll "); // y0 (y1-y0) val2 + _cmsIOPrintf(m, "dup "); // y0 (y1-y0) val2 val2 + _cmsIOPrintf(m, "floor cvi "); // y0 (y1-y0) val2 floor(val2) + _cmsIOPrintf(m, "sub "); // y0 (y1-y0) rest + _cmsIOPrintf(m, "mul "); // y0 t1 + _cmsIOPrintf(m, "add "); // y + _cmsIOPrintf(m, "65535 div\n"); // result + + _cmsIOPrintf(m, " } bind "); +} + + +// Compare gamma table + +static +cmsBool GammaTableEquals(cmsUInt16Number* g1, cmsUInt16Number* g2, cmsUInt32Number nG1, cmsUInt32Number nG2) +{ + if (nG1 != nG2) return FALSE; + return memcmp(g1, g2, nG1 * sizeof(cmsUInt16Number)) == 0; +} + + +// Does write a set of gamma curves + +static +void EmitNGamma(cmsIOHANDLER* m, cmsUInt32Number n, cmsToneCurve* g[]) +{ + cmsUInt32Number i; + + + for( i=0; i < n; i++ ) + { + if (g[i] == NULL) return; // Error + + if (i > 0 && GammaTableEquals(g[i-1]->Table16, g[i]->Table16, g[i-1]->nEntries, g[i]->nEntries)) { + + _cmsIOPrintf(m, "dup "); + } + else { + Emit1Gamma(m, g[i]); + } + } + +} + + +// Following code dumps a LUT onto memory stream + + +// This is the sampler. Intended to work in SAMPLER_INSPECT mode, +// that is, the callback will be called for each knot with +// +// In[] The grid location coordinates, normalized to 0..ffff +// Out[] The Pipeline values, normalized to 0..ffff +// +// Returning a value other than 0 does terminate the sampling process +// +// Each row contains Pipeline values for all but first component. So, I +// detect row changing by keeping a copy of last value of first +// component. -1 is used to mark beginning of whole block. + +static +int OutputValueSampler(CMSREGISTER const cmsUInt16Number In[], CMSREGISTER cmsUInt16Number Out[], CMSREGISTER void* Cargo) +{ + cmsPsSamplerCargo* sc = (cmsPsSamplerCargo*) Cargo; + cmsUInt32Number i; + + + if (sc -> FixWhite) { + + if (In[0] == 0xFFFF) { // Only in L* = 100, ab = [-8..8] + + if ((In[1] >= 0x7800 && In[1] <= 0x8800) && + (In[2] >= 0x7800 && In[2] <= 0x8800)) { + + cmsUInt16Number* Black; + cmsUInt16Number* White; + cmsUInt32Number nOutputs; + + if (!_cmsEndPointsBySpace(sc ->ColorSpace, &White, &Black, &nOutputs)) + return 0; + + for (i=0; i < nOutputs; i++) + Out[i] = White[i]; + } + + + } + } + + + // Handle the parenthesis on rows + + if (In[0] != sc ->FirstComponent) { + + if (sc ->FirstComponent != -1) { + + _cmsIOPrintf(sc ->m, sc ->PostMin); + sc ->SecondComponent = -1; + _cmsIOPrintf(sc ->m, sc ->PostMaj); + } + + // Begin block + _cmsPSActualColumn = 0; + + _cmsIOPrintf(sc ->m, sc ->PreMaj); + sc ->FirstComponent = In[0]; + } + + + if (In[1] != sc ->SecondComponent) { + + if (sc ->SecondComponent != -1) { + + _cmsIOPrintf(sc ->m, sc ->PostMin); + } + + _cmsIOPrintf(sc ->m, sc ->PreMin); + sc ->SecondComponent = In[1]; + } + + // Dump table. + + for (i=0; i < sc -> Pipeline ->Params->nOutputs; i++) { + + cmsUInt16Number wWordOut = Out[i]; + cmsUInt8Number wByteOut; // Value as byte + + + // We always deal with Lab4 + + wByteOut = Word2Byte(wWordOut); + WriteByte(sc -> m, wByteOut); + } + + return 1; +} + +// Writes a Pipeline on memstream. Could be 8 or 16 bits based + +static +void WriteCLUT(cmsIOHANDLER* m, cmsStage* mpe, const char* PreMaj, + const char* PostMaj, + const char* PreMin, + const char* PostMin, + int FixWhite, + cmsColorSpaceSignature ColorSpace) +{ + cmsUInt32Number i; + cmsPsSamplerCargo sc; + + sc.FirstComponent = -1; + sc.SecondComponent = -1; + sc.Pipeline = (_cmsStageCLutData *) mpe ->Data; + sc.m = m; + sc.PreMaj = PreMaj; + sc.PostMaj= PostMaj; + + sc.PreMin = PreMin; + sc.PostMin = PostMin; + sc.FixWhite = FixWhite; + sc.ColorSpace = ColorSpace; + + if (sc.Pipeline != NULL && sc.Pipeline->Params != NULL) { + + _cmsIOPrintf(m, "["); + + for (i = 0; i < sc.Pipeline->Params->nInputs; i++) { + if (i < MAX_INPUT_DIMENSIONS) + _cmsIOPrintf(m, " %d ", sc.Pipeline->Params->nSamples[i]); + } + + _cmsIOPrintf(m, " [\n"); + + cmsStageSampleCLut16bit(mpe, OutputValueSampler, (void*)&sc, SAMPLER_INSPECT); + + _cmsIOPrintf(m, PostMin); + _cmsIOPrintf(m, PostMaj); + _cmsIOPrintf(m, "] "); + } + +} + + +// Dumps CIEBasedA Color Space Array + +static +int EmitCIEBasedA(cmsIOHANDLER* m, cmsToneCurve* Curve, cmsCIEXYZ* BlackPoint) +{ + + _cmsIOPrintf(m, "[ /CIEBasedA\n"); + _cmsIOPrintf(m, " <<\n"); + + _cmsIOPrintf(m, "/DecodeA "); + + Emit1Gamma(m, Curve); + + _cmsIOPrintf(m, " \n"); + + _cmsIOPrintf(m, "/MatrixA [ 0.9642 1.0000 0.8249 ]\n"); + _cmsIOPrintf(m, "/RangeLMN [ 0.0 0.9642 0.0 1.0000 0.0 0.8249 ]\n"); + + EmitWhiteBlackD50(m, BlackPoint); + EmitIntent(m, INTENT_PERCEPTUAL); + + _cmsIOPrintf(m, ">>\n"); + _cmsIOPrintf(m, "]\n"); + + return 1; +} + + +// Dumps CIEBasedABC Color Space Array + +static +int EmitCIEBasedABC(cmsIOHANDLER* m, cmsFloat64Number* Matrix, cmsToneCurve** CurveSet, cmsCIEXYZ* BlackPoint) +{ + int i; + + _cmsIOPrintf(m, "[ /CIEBasedABC\n"); + _cmsIOPrintf(m, "<<\n"); + _cmsIOPrintf(m, "/DecodeABC [ "); + + EmitNGamma(m, 3, CurveSet); + + _cmsIOPrintf(m, "]\n"); + + _cmsIOPrintf(m, "/MatrixABC [ " ); + + for( i=0; i < 3; i++ ) { + + _cmsIOPrintf(m, "%.6f %.6f %.6f ", Matrix[i + 3*0], + Matrix[i + 3*1], + Matrix[i + 3*2]); + } + + + _cmsIOPrintf(m, "]\n"); + + _cmsIOPrintf(m, "/RangeLMN [ 0.0 0.9642 0.0 1.0000 0.0 0.8249 ]\n"); + + EmitWhiteBlackD50(m, BlackPoint); + EmitIntent(m, INTENT_PERCEPTUAL); + + _cmsIOPrintf(m, ">>\n"); + _cmsIOPrintf(m, "]\n"); + + + return 1; +} + + +static +int EmitCIEBasedDEF(cmsIOHANDLER* m, cmsPipeline* Pipeline, cmsUInt32Number Intent, cmsCIEXYZ* BlackPoint) +{ + const char* PreMaj; + const char* PostMaj; + const char* PreMin, *PostMin; + cmsStage* mpe; + + mpe = Pipeline->Elements; + + switch (cmsStageInputChannels(mpe)) { + case 3: + _cmsIOPrintf(m, "[ /CIEBasedDEF\n"); + PreMaj = "<"; + PostMaj = ">\n"; + PreMin = PostMin = ""; + break; + + case 4: + _cmsIOPrintf(m, "[ /CIEBasedDEFG\n"); + PreMaj = "["; + PostMaj = "]\n"; + PreMin = "<"; + PostMin = ">\n"; + break; + + default: + return 0; + + } + + _cmsIOPrintf(m, "<<\n"); + + if (cmsStageType(mpe) == cmsSigCurveSetElemType) { + + _cmsIOPrintf(m, "/DecodeDEF [ "); + EmitNGamma(m, cmsStageOutputChannels(mpe), _cmsStageGetPtrToCurveSet(mpe)); + _cmsIOPrintf(m, "]\n"); + + mpe = mpe ->Next; + } + + if (cmsStageType(mpe) == cmsSigCLutElemType) { + + _cmsIOPrintf(m, "/Table "); + WriteCLUT(m, mpe, PreMaj, PostMaj, PreMin, PostMin, FALSE, (cmsColorSpaceSignature) 0); + _cmsIOPrintf(m, "]\n"); + } + + EmitLab2XYZ(m); + EmitWhiteBlackD50(m, BlackPoint); + EmitIntent(m, Intent); + + _cmsIOPrintf(m, " >>\n"); + _cmsIOPrintf(m, "]\n"); + + return 1; +} + +// Generates a curve from a gray profile + +static +cmsToneCurve* ExtractGray2Y(cmsContext ContextID, cmsHPROFILE hProfile, cmsUInt32Number Intent) +{ + cmsToneCurve* Out = cmsBuildTabulatedToneCurve16(ContextID, 256, NULL); + cmsHPROFILE hXYZ = cmsCreateXYZProfile(); + cmsHTRANSFORM xform = cmsCreateTransformTHR(ContextID, hProfile, TYPE_GRAY_8, hXYZ, TYPE_XYZ_DBL, Intent, cmsFLAGS_NOOPTIMIZE); + int i; + + if (Out != NULL && xform != NULL) { + for (i=0; i < 256; i++) { + + cmsUInt8Number Gray = (cmsUInt8Number) i; + cmsCIEXYZ XYZ; + + cmsDoTransform(xform, &Gray, &XYZ, 1); + + Out ->Table16[i] =_cmsQuickSaturateWord(XYZ.Y * 65535.0); + } + } + + if (xform) cmsDeleteTransform(xform); + if (hXYZ) cmsCloseProfile(hXYZ); + return Out; +} + + + +// Because PostScript has only 8 bits in /Table, we should use +// a more perceptually uniform space... I do choose Lab. + +static +cmsBool WriteInputLUT(cmsIOHANDLER* m, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number dwFlags) +{ + cmsHPROFILE hLab; + cmsHTRANSFORM xform; + cmsUInt32Number nChannels; + cmsUInt32Number InputFormat; + + cmsHPROFILE Profiles[2]; + cmsCIEXYZ BlackPointAdaptedToD50; + + // Does create a device-link based transform. + // The DeviceLink is next dumped as working CSA. + + InputFormat = cmsFormatterForColorspaceOfProfile(hProfile, 2, FALSE); + nChannels = T_CHANNELS(InputFormat); + + + cmsDetectBlackPoint(&BlackPointAdaptedToD50, hProfile, Intent, 0); + + // Adjust output to Lab4 + hLab = cmsCreateLab4ProfileTHR(m ->ContextID, NULL); + + Profiles[0] = hProfile; + Profiles[1] = hLab; + + xform = cmsCreateMultiprofileTransform(Profiles, 2, InputFormat, TYPE_Lab_DBL, Intent, 0); + cmsCloseProfile(hLab); + + if (xform == NULL) { + + cmsSignalError(m ->ContextID, cmsERROR_COLORSPACE_CHECK, "Cannot create transform Profile -> Lab"); + return FALSE; + } + + // Only 1, 3 and 4 channels are allowed + + switch (nChannels) { + + case 1: { + cmsToneCurve* Gray2Y = ExtractGray2Y(m ->ContextID, hProfile, Intent); + EmitCIEBasedA(m, Gray2Y, &BlackPointAdaptedToD50); + cmsFreeToneCurve(Gray2Y); + } + break; + + case 3: + case 4: { + cmsUInt32Number OutFrm = TYPE_Lab_16; + cmsPipeline* DeviceLink; + _cmsTRANSFORM* v = (_cmsTRANSFORM*) xform; + cmsBool rc; + + DeviceLink = cmsPipelineDup(v ->Lut); + if (DeviceLink == NULL) { + cmsDeleteTransform(xform); + return FALSE; + } + + dwFlags |= cmsFLAGS_FORCE_CLUT; + _cmsOptimizePipeline(m->ContextID, &DeviceLink, Intent, &InputFormat, &OutFrm, &dwFlags); + + rc = EmitCIEBasedDEF(m, DeviceLink, Intent, &BlackPointAdaptedToD50); + cmsPipelineFree(DeviceLink); + if (!rc) { + cmsDeleteTransform(xform); + return FALSE; + } + } + break; + + default: + + cmsDeleteTransform(xform); + cmsSignalError(m ->ContextID, cmsERROR_COLORSPACE_CHECK, "Only 3, 4 channels are supported for CSA. This profile has %d channels.", nChannels); + return FALSE; + } + + cmsDeleteTransform(xform); + return TRUE; +} + +static +cmsFloat64Number* GetPtrToMatrix(const cmsStage* mpe) +{ + _cmsStageMatrixData* Data = (_cmsStageMatrixData*) mpe ->Data; + + return Data -> Double; +} + + +// Does create CSA based on matrix-shaper. Allowed types are gray and RGB based +static +int WriteInputMatrixShaper(cmsIOHANDLER* m, cmsHPROFILE hProfile, cmsStage* Matrix, cmsStage* Shaper) +{ + cmsColorSpaceSignature ColorSpace; + int rc; + cmsCIEXYZ BlackPointAdaptedToD50; + + ColorSpace = cmsGetColorSpace(hProfile); + + cmsDetectBlackPoint(&BlackPointAdaptedToD50, hProfile, INTENT_RELATIVE_COLORIMETRIC, 0); + + if (ColorSpace == cmsSigGrayData) { + + cmsToneCurve** ShaperCurve = _cmsStageGetPtrToCurveSet(Shaper); + rc = EmitCIEBasedA(m, ShaperCurve[0], &BlackPointAdaptedToD50); + + } + else + if (ColorSpace == cmsSigRgbData) { + + cmsMAT3 Mat; + int i, j; + + memmove(&Mat, GetPtrToMatrix(Matrix), sizeof(Mat)); + + for (i = 0; i < 3; i++) + for (j = 0; j < 3; j++) + Mat.v[i].n[j] *= MAX_ENCODEABLE_XYZ; + + rc = EmitCIEBasedABC(m, (cmsFloat64Number *) &Mat, + _cmsStageGetPtrToCurveSet(Shaper), + &BlackPointAdaptedToD50); + } + else { + + cmsSignalError(m->ContextID, cmsERROR_COLORSPACE_CHECK, "Profile is not suitable for CSA. Unsupported colorspace."); + return 0; + } + + return rc; +} + + + +// Creates a PostScript color list from a named profile data. +// This is a HP extension, and it works in Lab instead of XYZ + +static +int WriteNamedColorCSA(cmsIOHANDLER* m, cmsHPROFILE hNamedColor, cmsUInt32Number Intent) +{ + cmsHTRANSFORM xform; + cmsHPROFILE hLab; + cmsUInt32Number i, nColors; + char ColorName[cmsMAX_PATH]; + cmsNAMEDCOLORLIST* NamedColorList; + + hLab = cmsCreateLab4ProfileTHR(m ->ContextID, NULL); + xform = cmsCreateTransform(hNamedColor, TYPE_NAMED_COLOR_INDEX, hLab, TYPE_Lab_DBL, Intent, 0); + cmsCloseProfile(hLab); + + if (xform == NULL) return 0; + + NamedColorList = cmsGetNamedColorList(xform); + if (NamedColorList == NULL) { + cmsDeleteTransform(xform); + return 0; + } + + _cmsIOPrintf(m, "<<\n"); + _cmsIOPrintf(m, "(colorlistcomment) (%s)\n", "Named color CSA"); + _cmsIOPrintf(m, "(Prefix) [ (Pantone ) (PANTONE ) ]\n"); + _cmsIOPrintf(m, "(Suffix) [ ( CV) ( CVC) ( C) ]\n"); + + nColors = cmsNamedColorCount(NamedColorList); + + for (i=0; i < nColors; i++) { + + cmsUInt16Number In[1]; + cmsCIELab Lab; + + In[0] = (cmsUInt16Number) i; + + if (!cmsNamedColorInfo(NamedColorList, i, ColorName, NULL, NULL, NULL, NULL)) + continue; + + cmsDoTransform(xform, In, &Lab, 1); + + _cmsIOPrintf(m, " ("); + EmitPSEscaped(m, ColorName); + _cmsIOPrintf(m, ") [ %.3f %.3f %.3f ]\n", Lab.L, Lab.a, Lab.b); + } + + _cmsIOPrintf(m, ">>\n"); + + cmsDeleteTransform(xform); + return 1; +} + + +// Does create a Color Space Array on XYZ colorspace for PostScript usage +static +cmsUInt32Number GenerateCSA(cmsContext ContextID, + cmsHPROFILE hProfile, + cmsUInt32Number Intent, + cmsUInt32Number dwFlags, + cmsIOHANDLER* mem) +{ + cmsUInt32Number dwBytesUsed; + cmsPipeline* lut = NULL; + cmsStage* Matrix, *Shaper; + + + // Is a named color profile? + if (cmsGetDeviceClass(hProfile) == cmsSigNamedColorClass) { + + if (!WriteNamedColorCSA(mem, hProfile, Intent)) goto Error; + } + else { + + + // Any profile class are allowed (including devicelink), but + // output (PCS) colorspace must be XYZ or Lab + cmsColorSpaceSignature ColorSpace = cmsGetPCS(hProfile); + + if (ColorSpace != cmsSigXYZData && + ColorSpace != cmsSigLabData) { + + cmsSignalError(ContextID, cmsERROR_COLORSPACE_CHECK, "Invalid output color space"); + goto Error; + } + + + // Read the lut with all necessary conversion stages + lut = _cmsReadInputLUT(hProfile, Intent); + if (lut == NULL) goto Error; + + + // Tone curves + matrix can be implemented without any LUT + if (cmsPipelineCheckAndRetreiveStages(lut, 2, cmsSigCurveSetElemType, cmsSigMatrixElemType, &Shaper, &Matrix)) { + + if (!WriteInputMatrixShaper(mem, hProfile, Matrix, Shaper)) goto Error; + + } + else { + // We need a LUT for the rest + if (!WriteInputLUT(mem, hProfile, Intent, dwFlags)) goto Error; + } + } + + + // Done, keep memory usage + dwBytesUsed = mem ->UsedSpace; + + // Get rid of LUT + if (lut != NULL) cmsPipelineFree(lut); + + // Finally, return used byte count + return dwBytesUsed; + +Error: + if (lut != NULL) cmsPipelineFree(lut); + return 0; +} + +// ------------------------------------------------------ Color Rendering Dictionary (CRD) + + + +/* + + Black point compensation plus chromatic adaptation: + + Step 1 - Chromatic adaptation + ============================= + + WPout + X = ------- PQR + Wpin + + Step 2 - Black point compensation + ================================= + + (WPout - BPout)*X - WPout*(BPin - BPout) + out = --------------------------------------- + WPout - BPin + + + Algorithm discussion + ==================== + + TransformPQR(WPin, BPin, WPout, BPout, PQR) + + Wpin,etc= { Xws Yws Zws Pws Qws Rws } + + + Algorithm Stack 0...n + =========================================================== + PQR BPout WPout BPin WPin + 4 index 3 get WPin PQR BPout WPout BPin WPin + div (PQR/WPin) BPout WPout BPin WPin + 2 index 3 get WPout (PQR/WPin) BPout WPout BPin WPin + mult WPout*(PQR/WPin) BPout WPout BPin WPin + + 2 index 3 get WPout WPout*(PQR/WPin) BPout WPout BPin WPin + 2 index 3 get BPout WPout WPout*(PQR/WPin) BPout WPout BPin WPin + sub (WPout-BPout) WPout*(PQR/WPin) BPout WPout BPin WPin + mult (WPout-BPout)* WPout*(PQR/WPin) BPout WPout BPin WPin + + 2 index 3 get WPout (BPout-WPout)* WPout*(PQR/WPin) BPout WPout BPin WPin + 4 index 3 get BPin WPout (BPout-WPout)* WPout*(PQR/WPin) BPout WPout BPin WPin + 3 index 3 get BPout BPin WPout (BPout-WPout)* WPout*(PQR/WPin) BPout WPout BPin WPin + + sub (BPin-BPout) WPout (BPout-WPout)* WPout*(PQR/WPin) BPout WPout BPin WPin + mult (BPin-BPout)*WPout (BPout-WPout)* WPout*(PQR/WPin) BPout WPout BPin WPin + sub (BPout-WPout)* WPout*(PQR/WPin)-(BPin-BPout)*WPout BPout WPout BPin WPin + + 3 index 3 get BPin (BPout-WPout)* WPout*(PQR/WPin)-(BPin-BPout)*WPout BPout WPout BPin WPin + 3 index 3 get WPout BPin (BPout-WPout)* WPout*(PQR/WPin)-(BPin-BPout)*WPout BPout WPout BPin WPin + exch + sub (WPout-BPin) (BPout-WPout)* WPout*(PQR/WPin)-(BPin-BPout)*WPout BPout WPout BPin WPin + div + + exch pop + exch pop + exch pop + exch pop + +*/ + + +static +void EmitPQRStage(cmsIOHANDLER* m, cmsHPROFILE hProfile, int DoBPC, int lIsAbsolute) +{ + + + if (lIsAbsolute) { + + // For absolute colorimetric intent, encode back to relative + // and generate a relative Pipeline + + // Relative encoding is obtained across XYZpcs*(D50/WhitePoint) + + cmsCIEXYZ White; + + _cmsReadMediaWhitePoint(&White, hProfile); + + _cmsIOPrintf(m,"/MatrixPQR [1 0 0 0 1 0 0 0 1 ]\n"); + _cmsIOPrintf(m,"/RangePQR [ -0.5 2 -0.5 2 -0.5 2 ]\n"); + + _cmsIOPrintf(m, "%% Absolute colorimetric -- encode to relative to maximize LUT usage\n" + "/TransformPQR [\n" + "{0.9642 mul %g div exch pop exch pop exch pop exch pop} bind\n" + "{1.0000 mul %g div exch pop exch pop exch pop exch pop} bind\n" + "{0.8249 mul %g div exch pop exch pop exch pop exch pop} bind\n]\n", + White.X, White.Y, White.Z); + return; + } + + + _cmsIOPrintf(m,"%% Bradford Cone Space\n" + "/MatrixPQR [0.8951 -0.7502 0.0389 0.2664 1.7135 -0.0685 -0.1614 0.0367 1.0296 ] \n"); + + _cmsIOPrintf(m, "/RangePQR [ -0.5 2 -0.5 2 -0.5 2 ]\n"); + + + // No BPC + + if (!DoBPC) { + + _cmsIOPrintf(m, "%% VonKries-like transform in Bradford Cone Space\n" + "/TransformPQR [\n" + "{exch pop exch 3 get mul exch pop exch 3 get div} bind\n" + "{exch pop exch 4 get mul exch pop exch 4 get div} bind\n" + "{exch pop exch 5 get mul exch pop exch 5 get div} bind\n]\n"); + } else { + + // BPC + + _cmsIOPrintf(m, "%% VonKries-like transform in Bradford Cone Space plus BPC\n" + "/TransformPQR [\n"); + + _cmsIOPrintf(m, "{4 index 3 get div 2 index 3 get mul " + "2 index 3 get 2 index 3 get sub mul " + "2 index 3 get 4 index 3 get 3 index 3 get sub mul sub " + "3 index 3 get 3 index 3 get exch sub div " + "exch pop exch pop exch pop exch pop } bind\n"); + + _cmsIOPrintf(m, "{4 index 4 get div 2 index 4 get mul " + "2 index 4 get 2 index 4 get sub mul " + "2 index 4 get 4 index 4 get 3 index 4 get sub mul sub " + "3 index 4 get 3 index 4 get exch sub div " + "exch pop exch pop exch pop exch pop } bind\n"); + + _cmsIOPrintf(m, "{4 index 5 get div 2 index 5 get mul " + "2 index 5 get 2 index 5 get sub mul " + "2 index 5 get 4 index 5 get 3 index 5 get sub mul sub " + "3 index 5 get 3 index 5 get exch sub div " + "exch pop exch pop exch pop exch pop } bind\n]\n"); + + } +} + + +static +void EmitXYZ2Lab(cmsIOHANDLER* m) +{ + _cmsIOPrintf(m, "/RangeLMN [ -0.635 2.0 0 2 -0.635 2.0 ]\n"); + _cmsIOPrintf(m, "/EncodeLMN [\n"); + _cmsIOPrintf(m, "{ 0.964200 div dup 0.008856 le {7.787 mul 16 116 div add}{1 3 div exp} ifelse } bind\n"); + _cmsIOPrintf(m, "{ 1.000000 div dup 0.008856 le {7.787 mul 16 116 div add}{1 3 div exp} ifelse } bind\n"); + _cmsIOPrintf(m, "{ 0.824900 div dup 0.008856 le {7.787 mul 16 116 div add}{1 3 div exp} ifelse } bind\n"); + _cmsIOPrintf(m, "]\n"); + _cmsIOPrintf(m, "/MatrixABC [ 0 1 0 1 -1 1 0 0 -1 ]\n"); + _cmsIOPrintf(m, "/EncodeABC [\n"); + + + _cmsIOPrintf(m, "{ 116 mul 16 sub 100 div } bind\n"); + _cmsIOPrintf(m, "{ 500 mul 128 add 256 div } bind\n"); + _cmsIOPrintf(m, "{ 200 mul 128 add 256 div } bind\n"); + + + _cmsIOPrintf(m, "]\n"); + + +} + +// Due to impedance mismatch between XYZ and almost all RGB and CMYK spaces +// I choose to dump LUTS in Lab instead of XYZ. There is still a lot of wasted +// space on 3D CLUT, but since space seems not to be a problem here, 33 points +// would give a reasonable accuracy. Note also that CRD tables must operate in +// 8 bits. + +static +cmsBool WriteOutputLUT(cmsIOHANDLER* m, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number dwFlags) +{ + cmsHPROFILE hLab; + cmsHTRANSFORM xform; + cmsUInt32Number i, nChannels; + cmsUInt32Number OutputFormat; + _cmsTRANSFORM* v; + cmsPipeline* DeviceLink; + cmsHPROFILE Profiles[3]; + cmsCIEXYZ BlackPointAdaptedToD50; + cmsBool lDoBPC = (cmsBool) (dwFlags & cmsFLAGS_BLACKPOINTCOMPENSATION); + cmsBool lFixWhite = (cmsBool) !(dwFlags & cmsFLAGS_NOWHITEONWHITEFIXUP); + cmsUInt32Number InFrm = TYPE_Lab_16; + cmsUInt32Number RelativeEncodingIntent; + cmsColorSpaceSignature ColorSpace; + cmsStage* first; + + hLab = cmsCreateLab4ProfileTHR(m ->ContextID, NULL); + if (hLab == NULL) return FALSE; + + OutputFormat = cmsFormatterForColorspaceOfProfile(hProfile, 2, FALSE); + nChannels = T_CHANNELS(OutputFormat); + + ColorSpace = cmsGetColorSpace(hProfile); + + // For absolute colorimetric, the LUT is encoded as relative in order to preserve precision. + + RelativeEncodingIntent = Intent; + if (RelativeEncodingIntent == INTENT_ABSOLUTE_COLORIMETRIC) + RelativeEncodingIntent = INTENT_RELATIVE_COLORIMETRIC; + + + // Use V4 Lab always + Profiles[0] = hLab; + Profiles[1] = hProfile; + + xform = cmsCreateMultiprofileTransformTHR(m ->ContextID, + Profiles, 2, TYPE_Lab_DBL, + OutputFormat, RelativeEncodingIntent, 0); + cmsCloseProfile(hLab); + + if (xform == NULL) { + cmsSignalError(m ->ContextID, cmsERROR_COLORSPACE_CHECK, "Cannot create transform Lab -> Profile in CRD creation"); + return FALSE; + } + + // Get a copy of the internal devicelink + v = (_cmsTRANSFORM*) xform; + DeviceLink = cmsPipelineDup(v ->Lut); + if (DeviceLink == NULL) { + cmsDeleteTransform(xform); + cmsSignalError(m->ContextID, cmsERROR_CORRUPTION_DETECTED, "Cannot access link for CRD"); + return FALSE; + } + + // We need a CLUT + dwFlags |= cmsFLAGS_FORCE_CLUT; + if (!_cmsOptimizePipeline(m->ContextID, &DeviceLink, RelativeEncodingIntent, &InFrm, &OutputFormat, &dwFlags)) { + cmsPipelineFree(DeviceLink); + cmsDeleteTransform(xform); + cmsSignalError(m->ContextID, cmsERROR_CORRUPTION_DETECTED, "Cannot create CLUT table for CRD"); + return FALSE; + } + + _cmsIOPrintf(m, "<<\n"); + _cmsIOPrintf(m, "/ColorRenderingType 1\n"); + + cmsDetectBlackPoint(&BlackPointAdaptedToD50, hProfile, Intent, 0); + + // Emit headers, etc. + EmitWhiteBlackD50(m, &BlackPointAdaptedToD50); + EmitPQRStage(m, hProfile, lDoBPC, Intent == INTENT_ABSOLUTE_COLORIMETRIC); + EmitXYZ2Lab(m); + + + // FIXUP: map Lab (100, 0, 0) to perfect white, because the particular encoding for Lab + // does map a=b=0 not falling into any specific node. Since range a,b goes -128..127, + // zero is slightly moved towards right, so assure next node (in L=100 slice) is mapped to + // zero. This would sacrifice a bit of highlights, but failure to do so would cause + // scum dot. Ouch. + + if (Intent == INTENT_ABSOLUTE_COLORIMETRIC) + lFixWhite = FALSE; + + _cmsIOPrintf(m, "/RenderTable "); + + first = cmsPipelineGetPtrToFirstStage(DeviceLink); + if (first != NULL) { + if (first->Type != cmsSigCLutElemType) { + cmsPipelineFree(DeviceLink); + cmsDeleteTransform(xform); + cmsSignalError(m->ContextID, cmsERROR_CORRUPTION_DETECTED, "Cannot create CLUT, revise your flags!"); + return FALSE; + } + + WriteCLUT(m, first, "<", ">\n", "", "", lFixWhite, ColorSpace); + } + + _cmsIOPrintf(m, " %d {} bind ", nChannels); + + for (i=1; i < nChannels; i++) + _cmsIOPrintf(m, "dup "); + + _cmsIOPrintf(m, "]\n"); + + EmitIntent(m, Intent); + + _cmsIOPrintf(m, ">>\n"); + + if (!(dwFlags & cmsFLAGS_NODEFAULTRESOURCEDEF)) { + + _cmsIOPrintf(m, "/Current exch /ColorRendering defineresource pop\n"); + } + + cmsPipelineFree(DeviceLink); + cmsDeleteTransform(xform); + + return TRUE; +} + + +// Builds a ASCII string containing colorant list in 0..1.0 range +static +void BuildColorantList(char *Colorant, cmsUInt32Number nColorant, cmsUInt16Number Out[]) +{ + char Buff[32]; + cmsUInt32Number j; + + Colorant[0] = 0; + if (nColorant > cmsMAXCHANNELS) + nColorant = cmsMAXCHANNELS; + + for (j = 0; j < nColorant; j++) { + + snprintf(Buff, 31, "%.3f", Out[j] / 65535.0); + Buff[31] = 0; + strcat(Colorant, Buff); + if (j < nColorant - 1) + strcat(Colorant, " "); + + } +} + + +// Creates a PostScript color list from a named profile data. +// This is a HP extension. + +static +int WriteNamedColorCRD(cmsIOHANDLER* m, cmsHPROFILE hNamedColor, cmsUInt32Number Intent, cmsUInt32Number dwFlags) +{ + cmsHTRANSFORM xform; + cmsUInt32Number i, nColors, nColorant; + cmsUInt32Number OutputFormat; + char ColorName[cmsMAX_PATH]; + char Colorant[512]; + cmsNAMEDCOLORLIST* NamedColorList; + + + OutputFormat = cmsFormatterForColorspaceOfProfile(hNamedColor, 2, FALSE); + nColorant = T_CHANNELS(OutputFormat); + + + xform = cmsCreateTransform(hNamedColor, TYPE_NAMED_COLOR_INDEX, NULL, OutputFormat, Intent, dwFlags); + if (xform == NULL) return 0; + + + NamedColorList = cmsGetNamedColorList(xform); + if (NamedColorList == NULL) { + cmsDeleteTransform(xform); + return 0; + } + + _cmsIOPrintf(m, "<<\n"); + _cmsIOPrintf(m, "(colorlistcomment) (%s) \n", "Named profile"); + _cmsIOPrintf(m, "(Prefix) [ (Pantone ) (PANTONE ) ]\n"); + _cmsIOPrintf(m, "(Suffix) [ ( CV) ( CVC) ( C) ]\n"); + + nColors = cmsNamedColorCount(NamedColorList); + + for (i=0; i < nColors; i++) { + + cmsUInt16Number In[1]; + cmsUInt16Number Out[cmsMAXCHANNELS]; + + In[0] = (cmsUInt16Number) i; + + if (!cmsNamedColorInfo(NamedColorList, i, ColorName, NULL, NULL, NULL, NULL)) + continue; + + cmsDoTransform(xform, In, Out, 1); + BuildColorantList(Colorant, nColorant, Out); + + _cmsIOPrintf(m, " ("); + EmitPSEscaped(m, ColorName); + _cmsIOPrintf(m, ") [ %s ]\n", Colorant); + } + + _cmsIOPrintf(m, " >>"); + + if (!(dwFlags & cmsFLAGS_NODEFAULTRESOURCEDEF)) { + + _cmsIOPrintf(m, " /Current exch /HPSpotTable defineresource pop\n"); + } + + cmsDeleteTransform(xform); + return 1; +} + + + +// This one does create a Color Rendering Dictionary. +// CRD are always LUT-Based, no matter if profile is +// implemented as matrix-shaper. + +static +cmsUInt32Number GenerateCRD(cmsContext ContextID, + cmsHPROFILE hProfile, + cmsUInt32Number Intent, cmsUInt32Number dwFlags, + cmsIOHANDLER* mem) +{ + cmsUInt32Number dwBytesUsed; + + if (!(dwFlags & cmsFLAGS_NODEFAULTRESOURCEDEF)) { + + EmitHeader(mem, "Color Rendering Dictionary (CRD)", hProfile); + } + + + // Is a named color profile? + if (cmsGetDeviceClass(hProfile) == cmsSigNamedColorClass) { + + if (!WriteNamedColorCRD(mem, hProfile, Intent, dwFlags)) { + return 0; + } + } + else { + + // CRD are always implemented as LUT + + if (!WriteOutputLUT(mem, hProfile, Intent, dwFlags)) { + return 0; + } + } + + if (!(dwFlags & cmsFLAGS_NODEFAULTRESOURCEDEF)) { + + _cmsIOPrintf(mem, "%%%%EndResource\n"); + _cmsIOPrintf(mem, "\n%% CRD End\n"); + } + + // Done, keep memory usage + dwBytesUsed = mem ->UsedSpace; + + // Finally, return used byte count + return dwBytesUsed; + + cmsUNUSED_PARAMETER(ContextID); +} + + + + +cmsUInt32Number CMSEXPORT cmsGetPostScriptColorResource(cmsContext ContextID, + cmsPSResourceType Type, + cmsHPROFILE hProfile, + cmsUInt32Number Intent, + cmsUInt32Number dwFlags, + cmsIOHANDLER* io) +{ + cmsUInt32Number rc; + + + switch (Type) { + + case cmsPS_RESOURCE_CSA: + rc = GenerateCSA(ContextID, hProfile, Intent, dwFlags, io); + break; + + default: + case cmsPS_RESOURCE_CRD: + rc = GenerateCRD(ContextID, hProfile, Intent, dwFlags, io); + break; + } + + return rc; +} + + + +cmsUInt32Number CMSEXPORT cmsGetPostScriptCRD(cmsContext ContextID, + cmsHPROFILE hProfile, + cmsUInt32Number Intent, cmsUInt32Number dwFlags, + void* Buffer, cmsUInt32Number dwBufferLen) +{ + cmsIOHANDLER* mem; + cmsUInt32Number dwBytesUsed; + + // Set up the serialization engine + if (Buffer == NULL) + mem = cmsOpenIOhandlerFromNULL(ContextID); + else + mem = cmsOpenIOhandlerFromMem(ContextID, Buffer, dwBufferLen, "w"); + + if (!mem) return 0; + + dwBytesUsed = cmsGetPostScriptColorResource(ContextID, cmsPS_RESOURCE_CRD, hProfile, Intent, dwFlags, mem); + + // Get rid of memory stream + cmsCloseIOhandler(mem); + + return dwBytesUsed; +} + + + +// Does create a Color Space Array on XYZ colorspace for PostScript usage +cmsUInt32Number CMSEXPORT cmsGetPostScriptCSA(cmsContext ContextID, + cmsHPROFILE hProfile, + cmsUInt32Number Intent, + cmsUInt32Number dwFlags, + void* Buffer, + cmsUInt32Number dwBufferLen) +{ + cmsIOHANDLER* mem; + cmsUInt32Number dwBytesUsed; + + if (Buffer == NULL) + mem = cmsOpenIOhandlerFromNULL(ContextID); + else + mem = cmsOpenIOhandlerFromMem(ContextID, Buffer, dwBufferLen, "w"); + + if (!mem) return 0; + + dwBytesUsed = cmsGetPostScriptColorResource(ContextID, cmsPS_RESOURCE_CSA, hProfile, Intent, dwFlags, mem); + + // Get rid of memory stream + cmsCloseIOhandler(mem); + + return dwBytesUsed; + +} diff --git a/local/recipes/libs/lcms2/source/src/cmssamp.c b/local/recipes/libs/lcms2/source/src/cmssamp.c new file mode 100644 index 0000000000..30b34c307b --- /dev/null +++ b/local/recipes/libs/lcms2/source/src/cmssamp.c @@ -0,0 +1,599 @@ +//--------------------------------------------------------------------------------- +// +// Little Color Management System +// Copyright (c) 1998-2026 Marti Maria Saguer +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//--------------------------------------------------------------------------------- +// + +#include "lcms2_internal.h" + + +#define cmsmin(a, b) (((a) < (b)) ? (a) : (b)) +#define cmsmax(a, b) (((a) > (b)) ? (a) : (b)) + +// This file contains routines for resampling and LUT optimization, black point detection +// and black preservation. + +// Black point detection ------------------------------------------------------------------------- + + +// PCS -> PCS round trip transform, always uses relative intent on the device -> pcs +static +cmsHTRANSFORM CreateRoundtripXForm(cmsHPROFILE hProfile, cmsUInt32Number nIntent) +{ + cmsContext ContextID = cmsGetProfileContextID(hProfile); + cmsHPROFILE hLab = cmsCreateLab4ProfileTHR(ContextID, NULL); + cmsHTRANSFORM xform; + cmsBool BPC[4] = { FALSE, FALSE, FALSE, FALSE }; + cmsFloat64Number States[4] = { 1.0, 1.0, 1.0, 1.0 }; + cmsHPROFILE hProfiles[4]; + cmsUInt32Number Intents[4]; + + hProfiles[0] = hLab; hProfiles[1] = hProfile; hProfiles[2] = hProfile; hProfiles[3] = hLab; + Intents[0] = INTENT_RELATIVE_COLORIMETRIC; Intents[1] = nIntent; Intents[2] = INTENT_RELATIVE_COLORIMETRIC; Intents[3] = INTENT_RELATIVE_COLORIMETRIC; + + xform = cmsCreateExtendedTransform(ContextID, 4, hProfiles, BPC, Intents, + States, NULL, 0, TYPE_Lab_DBL, TYPE_Lab_DBL, cmsFLAGS_NOCACHE|cmsFLAGS_NOOPTIMIZE); + + cmsCloseProfile(hLab); + return xform; +} + +// Use darker colorants to obtain black point. This works in the relative colorimetric intent and +// assumes more ink results in darker colors. No ink limit is assumed. +static +cmsBool BlackPointAsDarkerColorant(cmsHPROFILE hInput, + cmsUInt32Number Intent, + cmsCIEXYZ* BlackPoint, + cmsUInt32Number dwFlags) +{ + cmsUInt16Number *Black; + cmsHTRANSFORM xform; + cmsColorSpaceSignature Space; + cmsUInt32Number nChannels; + cmsUInt32Number dwFormat; + cmsHPROFILE hLab; + cmsCIELab Lab; + cmsCIEXYZ BlackXYZ; + cmsContext ContextID = cmsGetProfileContextID(hInput); + + // If the profile does not support input direction, assume Black point 0 + if (!cmsIsIntentSupported(hInput, Intent, LCMS_USED_AS_INPUT)) { + + BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0; + return FALSE; + } + + // Create a formatter which has n channels and no floating point + dwFormat = cmsFormatterForColorspaceOfProfile(hInput, 2, FALSE); + + // Try to get black by using black colorant + Space = cmsGetColorSpace(hInput); + + // This function returns darker colorant in 16 bits for several spaces + if (!_cmsEndPointsBySpace(Space, NULL, &Black, &nChannels)) { + + BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0; + return FALSE; + } + + if (nChannels != T_CHANNELS(dwFormat)) { + BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0; + return FALSE; + } + + // Lab will be used as the output space, but lab2 will avoid recursion + hLab = cmsCreateLab2ProfileTHR(ContextID, NULL); + if (hLab == NULL) { + BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0; + return FALSE; + } + + // Create the transform + xform = cmsCreateTransformTHR(ContextID, hInput, dwFormat, + hLab, TYPE_Lab_DBL, Intent, cmsFLAGS_NOOPTIMIZE|cmsFLAGS_NOCACHE); + cmsCloseProfile(hLab); + + if (xform == NULL) { + + // Something went wrong. Get rid of open resources and return zero as black + BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0; + return FALSE; + } + + // Convert black to Lab + cmsDoTransform(xform, Black, &Lab, 1); + + if (Lab.L > 95) + Lab.L = 0; // for synthetical negative profiles + else if (Lab.L < 0) + Lab.L = 0; + else if (Lab.L > 50) + Lab.L = 50; + + // Free the resources + cmsDeleteTransform(xform); + + // Convert from Lab (which is now clipped) to XYZ. + cmsLab2XYZ(NULL, &BlackXYZ, &Lab); + + if (BlackPoint != NULL) + *BlackPoint = BlackXYZ; + + return TRUE; + + cmsUNUSED_PARAMETER(dwFlags); +} + +// Get a black point of output CMYK profile, discounting any ink-limiting embedded +// in the profile. For doing that, we use perceptual intent in input direction: +// Lab (0, 0, 0) -> [Perceptual] Profile -> CMYK -> [Rel. colorimetric] Profile -> Lab +static +cmsBool BlackPointUsingPerceptualBlack(cmsCIEXYZ* BlackPoint, cmsHPROFILE hProfile) +{ + cmsHTRANSFORM hRoundTrip; + cmsCIELab LabIn, LabOut; + cmsCIEXYZ BlackXYZ; + + // Is the intent supported by the profile? + if (!cmsIsIntentSupported(hProfile, INTENT_PERCEPTUAL, LCMS_USED_AS_INPUT)) { + + BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0; + return TRUE; + } + + hRoundTrip = CreateRoundtripXForm(hProfile, INTENT_PERCEPTUAL); + if (hRoundTrip == NULL) { + BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0; + return FALSE; + } + + LabIn.L = LabIn.a = LabIn.b = 0; + cmsDoTransform(hRoundTrip, &LabIn, &LabOut, 1); + + // Clip Lab to reasonable limits + if (LabOut.L > 50) LabOut.L = 50; + LabOut.a = LabOut.b = 0; + + cmsDeleteTransform(hRoundTrip); + + // Convert it to XYZ + cmsLab2XYZ(NULL, &BlackXYZ, &LabOut); + + if (BlackPoint != NULL) + *BlackPoint = BlackXYZ; + + return TRUE; +} + + +static +cmsBool isInkColorspace(cmsColorSpaceSignature c) +{ + switch(c) + { + case cmsSigCmykData: + case cmsSigCmyData: + case cmsSigMCH1Data: + case cmsSigMCH2Data: + case cmsSigMCH3Data: + case cmsSigMCH4Data: + case cmsSigMCH5Data: + case cmsSigMCH6Data: + case cmsSigMCH7Data: + case cmsSigMCH8Data: + case cmsSigMCH9Data: + case cmsSigMCHAData: + case cmsSigMCHBData: + case cmsSigMCHCData: + case cmsSigMCHDData: + case cmsSigMCHEData: + case cmsSigMCHFData: + case cmsSig1colorData: + case cmsSig2colorData: + case cmsSig3colorData: + case cmsSig4colorData: + case cmsSig5colorData: + case cmsSig6colorData: + case cmsSig7colorData: + case cmsSig8colorData: + case cmsSig9colorData: + case cmsSig10colorData: + case cmsSig11colorData: + case cmsSig12colorData: + case cmsSig13colorData: + case cmsSig14colorData: + case cmsSig15colorData: + return TRUE; + default: + return FALSE; + } +} + +// This function shouldn't exist at all -- there is such quantity of broken +// profiles on black point tag, that we must somehow fix chromaticity to +// avoid huge tint when doing Black point compensation. This function does +// just that. There is a special flag for using black point tag, but turned +// off by default because it is bogus on most profiles. The detection algorithm +// involves to turn BP to neutral and to use only L component. +cmsBool CMSEXPORT cmsDetectBlackPoint(cmsCIEXYZ* BlackPoint, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number dwFlags) +{ + cmsProfileClassSignature devClass; + + // Make sure the device class is adequate + devClass = cmsGetDeviceClass(hProfile); + if (devClass == cmsSigLinkClass || + devClass == cmsSigAbstractClass || + devClass == cmsSigNamedColorClass) { + BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0; + return FALSE; + } + + // Make sure intent is adequate + if (Intent != INTENT_PERCEPTUAL && + Intent != INTENT_RELATIVE_COLORIMETRIC && + Intent != INTENT_SATURATION) { + BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0; + return FALSE; + } + + // v4 + perceptual & saturation intents does have its own black point, and it is + // well specified enough to use it. Black point tag is deprecated in V4. + if ((cmsGetEncodedICCversion(hProfile) >= 0x4000000) && + (Intent == INTENT_PERCEPTUAL || Intent == INTENT_SATURATION)) { + + // Matrix shaper share MRC & perceptual intents + if (cmsIsMatrixShaper(hProfile)) + return BlackPointAsDarkerColorant(hProfile, INTENT_RELATIVE_COLORIMETRIC, BlackPoint, 0); + + // Get Perceptual black out of v4 profiles. That is fixed for perceptual & saturation intents + BlackPoint -> X = cmsPERCEPTUAL_BLACK_X; + BlackPoint -> Y = cmsPERCEPTUAL_BLACK_Y; + BlackPoint -> Z = cmsPERCEPTUAL_BLACK_Z; + + return TRUE; + } + + +#ifdef CMS_USE_PROFILE_BLACK_POINT_TAG + + // v2, v4 rel/abs colorimetric + if (cmsIsTag(hProfile, cmsSigMediaBlackPointTag) && + Intent == INTENT_RELATIVE_COLORIMETRIC) { + + cmsCIEXYZ *BlackPtr, BlackXYZ, UntrustedBlackPoint, TrustedBlackPoint, MediaWhite; + cmsCIELab Lab; + + // If black point is specified, then use it, + + BlackPtr = cmsReadTag(hProfile, cmsSigMediaBlackPointTag); + if (BlackPtr != NULL) { + + BlackXYZ = *BlackPtr; + _cmsReadMediaWhitePoint(&MediaWhite, hProfile); + + // Black point is absolute XYZ, so adapt to D50 to get PCS value + cmsAdaptToIlluminant(&UntrustedBlackPoint, &MediaWhite, cmsD50_XYZ(), &BlackXYZ); + + // Force a=b=0 to get rid of any chroma + cmsXYZ2Lab(NULL, &Lab, &UntrustedBlackPoint); + Lab.a = Lab.b = 0; + if (Lab.L > 50) Lab.L = 50; // Clip to L* <= 50 + cmsLab2XYZ(NULL, &TrustedBlackPoint, &Lab); + + if (BlackPoint != NULL) + *BlackPoint = TrustedBlackPoint; + + return TRUE; + } + } +#endif + + // That is about v2 profiles. + + // If output profile, discount ink-limiting and that's all + if (Intent == INTENT_RELATIVE_COLORIMETRIC && + (cmsGetDeviceClass(hProfile) == cmsSigOutputClass) && + (isInkColorspace(cmsGetColorSpace(hProfile)))) + return BlackPointUsingPerceptualBlack(BlackPoint, hProfile); + + // Nope, compute BP using current intent. + return BlackPointAsDarkerColorant(hProfile, Intent, BlackPoint, dwFlags); +} + + + +// --------------------------------------------------------------------------------------------------------- + +// Least Squares Fit of a Quadratic Curve to Data +// http://www.personal.psu.edu/jhm/f90/lectures/lsq2.html + +static +cmsFloat64Number RootOfLeastSquaresFitQuadraticCurve(int n, cmsFloat64Number x[], cmsFloat64Number y[]) +{ + double sum_x = 0, sum_x2 = 0, sum_x3 = 0, sum_x4 = 0; + double sum_y = 0, sum_yx = 0, sum_yx2 = 0; + double d, a, b, c; + int i; + cmsMAT3 m; + cmsVEC3 v, res; + + if (n < 4) return 0; + + for (i=0; i < n; i++) { + + double xn = x[i]; + double yn = y[i]; + + sum_x += xn; + sum_x2 += xn*xn; + sum_x3 += xn*xn*xn; + sum_x4 += xn*xn*xn*xn; + + sum_y += yn; + sum_yx += yn*xn; + sum_yx2 += yn*xn*xn; + } + + _cmsVEC3init(&m.v[0], n, sum_x, sum_x2); + _cmsVEC3init(&m.v[1], sum_x, sum_x2, sum_x3); + _cmsVEC3init(&m.v[2], sum_x2, sum_x3, sum_x4); + + _cmsVEC3init(&v, sum_y, sum_yx, sum_yx2); + + if (!_cmsMAT3solve(&res, &m, &v)) return 0; + + + a = res.n[2]; + b = res.n[1]; + c = res.n[0]; + + if (fabs(a) < 1.0E-10) { + + if (fabs(b) < 1.0E-10) return 0; + return cmsmax(0, cmsmin(50, -c/b )); + } + else { + + d = b*b - 4.0 * a * c; + if (d <= 0) { + return 0; + } + else { + + double rt; + + if (fabs(a) < 1.0E-10) return 0; + + rt = (-b + sqrt(d)) / (2.0 * a); + + return cmsmax(0, cmsmin(50, rt)); + } + } + +} + + + +// Calculates the black point of a destination profile. +// This algorithm comes from the Adobe paper disclosing its black point compensation method. +cmsBool CMSEXPORT cmsDetectDestinationBlackPoint(cmsCIEXYZ* BlackPoint, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number dwFlags) +{ + cmsColorSpaceSignature ColorSpace; + cmsHTRANSFORM hRoundTrip = NULL; + cmsCIELab InitialLab, destLab, Lab; + cmsFloat64Number inRamp[256], outRamp[256]; + cmsFloat64Number MinL, MaxL; + cmsBool NearlyStraightMidrange = TRUE; + cmsFloat64Number yRamp[256]; + cmsFloat64Number x[256], y[256]; + cmsFloat64Number lo, hi; + int n, l; + cmsProfileClassSignature devClass; + + // Make sure the device class is adequate + devClass = cmsGetDeviceClass(hProfile); + if (devClass == cmsSigLinkClass || + devClass == cmsSigAbstractClass || + devClass == cmsSigNamedColorClass) { + BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0; + return FALSE; + } + + // Make sure intent is adequate + if (Intent != INTENT_PERCEPTUAL && + Intent != INTENT_RELATIVE_COLORIMETRIC && + Intent != INTENT_SATURATION) { + BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0; + return FALSE; + } + + + // v4 + perceptual & saturation intents does have its own black point, and it is + // well specified enough to use it. Black point tag is deprecated in V4. + if ((cmsGetEncodedICCversion(hProfile) >= 0x4000000) && + (Intent == INTENT_PERCEPTUAL || Intent == INTENT_SATURATION)) { + + // Matrix shaper share MRC & perceptual intents + if (cmsIsMatrixShaper(hProfile)) + return BlackPointAsDarkerColorant(hProfile, INTENT_RELATIVE_COLORIMETRIC, BlackPoint, 0); + + // Get Perceptual black out of v4 profiles. That is fixed for perceptual & saturation intents + BlackPoint -> X = cmsPERCEPTUAL_BLACK_X; + BlackPoint -> Y = cmsPERCEPTUAL_BLACK_Y; + BlackPoint -> Z = cmsPERCEPTUAL_BLACK_Z; + return TRUE; + } + + + // Check if the profile is lut based and gray, rgb or cmyk (7.2 in Adobe's document) + ColorSpace = cmsGetColorSpace(hProfile); + if (!cmsIsCLUT(hProfile, Intent, LCMS_USED_AS_OUTPUT ) || + (ColorSpace != cmsSigGrayData && + ColorSpace != cmsSigRgbData && + !isInkColorspace(ColorSpace))) { + + // In this case, handle as input case + return cmsDetectBlackPoint(BlackPoint, hProfile, Intent, dwFlags); + } + + // It is one of the valid cases!, use Adobe algorithm + + + // Set a first guess, that should work on good profiles. + if (Intent == INTENT_RELATIVE_COLORIMETRIC) { + + cmsCIEXYZ IniXYZ; + + // calculate initial Lab as source black point + if (!cmsDetectBlackPoint(&IniXYZ, hProfile, Intent, dwFlags)) { + return FALSE; + } + + // convert the XYZ to lab + cmsXYZ2Lab(NULL, &InitialLab, &IniXYZ); + + } else { + + // set the initial Lab to zero, that should be the black point for perceptual and saturation + InitialLab.L = 0; + InitialLab.a = 0; + InitialLab.b = 0; + } + + + // Step 2 + // ====== + + // Create a roundtrip. Define a Transform BT for all x in L*a*b* + hRoundTrip = CreateRoundtripXForm(hProfile, Intent); + if (hRoundTrip == NULL) return FALSE; + + // Compute ramps + + for (l=0; l < 256; l++) { + + Lab.L = (cmsFloat64Number) (l * 100.0) / 255.0; + Lab.a = cmsmin(50, cmsmax(-50, InitialLab.a)); + Lab.b = cmsmin(50, cmsmax(-50, InitialLab.b)); + + cmsDoTransform(hRoundTrip, &Lab, &destLab, 1); + + inRamp[l] = Lab.L; + outRamp[l] = destLab.L; + } + + // Make monotonic + for (l = 254; l > 0; --l) { + outRamp[l] = cmsmin(outRamp[l], outRamp[l+1]); + } + + // Check + if (! (outRamp[0] < outRamp[255])) { + + cmsDeleteTransform(hRoundTrip); + BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0; + return FALSE; + } + + + // Test for mid range straight (only on relative colorimetric) + NearlyStraightMidrange = TRUE; + MinL = outRamp[0]; MaxL = outRamp[255]; + if (Intent == INTENT_RELATIVE_COLORIMETRIC) { + + for (l=0; l < 256; l++) { + + if (! ((inRamp[l] <= MinL + 0.2 * (MaxL - MinL) ) || + (fabs(inRamp[l] - outRamp[l]) < 4.0 ))) + NearlyStraightMidrange = FALSE; + } + + // If the mid range is straight (as determined above) then the + // DestinationBlackPoint shall be the same as initialLab. + // Otherwise, the DestinationBlackPoint shall be determined + // using curve fitting. + if (NearlyStraightMidrange) { + + cmsLab2XYZ(NULL, BlackPoint, &InitialLab); + cmsDeleteTransform(hRoundTrip); + return TRUE; + } + } + + + // curve fitting: The round-trip curve normally looks like a nearly constant section at the black point, + // with a corner and a nearly straight line to the white point. + for (l=0; l < 256; l++) { + + yRamp[l] = (outRamp[l] - MinL) / (MaxL - MinL); + } + + // find the black point using the least squares error quadratic curve fitting + if (Intent == INTENT_RELATIVE_COLORIMETRIC) { + lo = 0.1; + hi = 0.5; + } + else { + + // Perceptual and saturation + lo = 0.03; + hi = 0.25; + } + + // Capture shadow points for the fitting. + n = 0; + for (l=0; l < 256; l++) { + + cmsFloat64Number ff = yRamp[l]; + + if (ff >= lo && ff < hi) { + x[n] = inRamp[l]; + y[n] = yRamp[l]; + n++; + } + } + + + // No suitable points + if (n < 3 ) { + cmsDeleteTransform(hRoundTrip); + BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0; + return FALSE; + } + + + // fit and get the vertex of quadratic curve + Lab.L = RootOfLeastSquaresFitQuadraticCurve(n, x, y); + + if (Lab.L < 0.0) { // clip to zero L* if the vertex is negative + Lab.L = 0; + } + + Lab.a = InitialLab.a; + Lab.b = InitialLab.b; + + cmsLab2XYZ(NULL, BlackPoint, &Lab); + + cmsDeleteTransform(hRoundTrip); + return TRUE; +} diff --git a/local/recipes/libs/lcms2/source/src/cmssm.c b/local/recipes/libs/lcms2/source/src/cmssm.c new file mode 100644 index 0000000000..264d34d59b --- /dev/null +++ b/local/recipes/libs/lcms2/source/src/cmssm.c @@ -0,0 +1,736 @@ +//--------------------------------------------------------------------------------- +// +// Little Color Management System +// Copyright (c) 1998-2026 Marti Maria Saguer +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//--------------------------------------------------------------------------------- +// + +#include "lcms2_internal.h" + + +// ------------------------------------------------------------------------ + +// Gamut boundary description by using Jan Morovic's Segment maxima method +// Many thanks to Jan for allowing me to use his algorithm. + +// r = C* +// alpha = Hab +// theta = L* + +#define SECTORS 16 // number of divisions in alpha and theta + +// Spherical coordinates +typedef struct { + + cmsFloat64Number r; + cmsFloat64Number alpha; + cmsFloat64Number theta; + +} cmsSpherical; + +typedef enum { + GP_EMPTY, + GP_SPECIFIED, + GP_MODELED + + } GDBPointType; + + +typedef struct { + + GDBPointType Type; + cmsSpherical p; // Keep also alpha & theta of maximum + +} cmsGDBPoint; + + +typedef struct { + + cmsContext ContextID; + cmsGDBPoint Gamut[SECTORS][SECTORS]; + +} cmsGDB; + + +// A line using the parametric form +// P = a + t*u +typedef struct { + + cmsVEC3 a; + cmsVEC3 u; + +} cmsLine; + + +// A plane using the parametric form +// Q = b + r*v + s*w +typedef struct { + + cmsVEC3 b; + cmsVEC3 v; + cmsVEC3 w; + +} cmsPlane; + + + +// -------------------------------------------------------------------------------------------- + +// ATAN2() which always returns degree positive numbers + +static +cmsFloat64Number _cmsAtan2(cmsFloat64Number y, cmsFloat64Number x) +{ + cmsFloat64Number a; + + // Deal with undefined case + if (x == 0.0 && y == 0.0) return 0; + + a = (atan2(y, x) * 180.0) / M_PI; + + while (a < 0) { + a += 360; + } + + return a; +} + +// Convert to spherical coordinates +static +void ToSpherical(cmsSpherical* sp, const cmsVEC3* v) +{ + + cmsFloat64Number L, a, b; + + L = v ->n[VX]; + a = v ->n[VY]; + b = v ->n[VZ]; + + sp ->r = sqrt( L*L + a*a + b*b ); + + if (sp ->r == 0) { + sp ->alpha = sp ->theta = 0; + return; + } + + sp ->alpha = _cmsAtan2(a, b); + sp ->theta = _cmsAtan2(sqrt(a*a + b*b), L); +} + + +// Convert to cartesian from spherical +static +void ToCartesian(cmsVEC3* v, const cmsSpherical* sp) +{ + cmsFloat64Number sin_alpha; + cmsFloat64Number cos_alpha; + cmsFloat64Number sin_theta; + cmsFloat64Number cos_theta; + cmsFloat64Number L, a, b; + + sin_alpha = sin((M_PI * sp ->alpha) / 180.0); + cos_alpha = cos((M_PI * sp ->alpha) / 180.0); + sin_theta = sin((M_PI * sp ->theta) / 180.0); + cos_theta = cos((M_PI * sp ->theta) / 180.0); + + a = sp ->r * sin_theta * sin_alpha; + b = sp ->r * sin_theta * cos_alpha; + L = sp ->r * cos_theta; + + v ->n[VX] = L; + v ->n[VY] = a; + v ->n[VZ] = b; +} + + +// Quantize sector of a spherical coordinate. Saturate 360, 180 to last sector +// The limits are the centers of each sector, so +static +void QuantizeToSector(const cmsSpherical* sp, int* alpha, int* theta) +{ + *alpha = (int) floor(((sp->alpha * (SECTORS)) / 360.0) ); + *theta = (int) floor(((sp->theta * (SECTORS)) / 180.0) ); + + if (*alpha >= SECTORS) + *alpha = SECTORS-1; + if (*theta >= SECTORS) + *theta = SECTORS-1; +} + + +// Line determined by 2 points +static +void LineOf2Points(cmsLine* line, cmsVEC3* a, cmsVEC3* b) +{ + + _cmsVEC3init(&line ->a, a ->n[VX], a ->n[VY], a ->n[VZ]); + _cmsVEC3init(&line ->u, b ->n[VX] - a ->n[VX], + b ->n[VY] - a ->n[VY], + b ->n[VZ] - a ->n[VZ]); +} + + +// Evaluate parametric line +static +void GetPointOfLine(cmsVEC3* p, const cmsLine* line, cmsFloat64Number t) +{ + p ->n[VX] = line ->a.n[VX] + t * line->u.n[VX]; + p ->n[VY] = line ->a.n[VY] + t * line->u.n[VY]; + p ->n[VZ] = line ->a.n[VZ] + t * line->u.n[VZ]; +} + + + +/* + Closest point in sector line1 to sector line2 (both are defined as 0 <=t <= 1) + http://softsurfer.com/Archive/algorithm_0106/algorithm_0106.htm + + Copyright 2001, softSurfer (www.softsurfer.com) + This code may be freely used and modified for any purpose + providing that this copyright notice is included with it. + SoftSurfer makes no warranty for this code, and cannot be held + liable for any real or imagined damage resulting from its use. + Users of this code must verify correctness for their application. + +*/ + +static +cmsBool ClosestLineToLine(cmsVEC3* r, const cmsLine* line1, const cmsLine* line2) +{ + cmsFloat64Number a, b, c, d, e, D; + cmsFloat64Number sc, sN, sD; + //cmsFloat64Number tc; // left for future use + cmsFloat64Number tN, tD; + cmsVEC3 w0; + + _cmsVEC3minus(&w0, &line1 ->a, &line2 ->a); + + a = _cmsVEC3dot(&line1 ->u, &line1 ->u); + b = _cmsVEC3dot(&line1 ->u, &line2 ->u); + c = _cmsVEC3dot(&line2 ->u, &line2 ->u); + d = _cmsVEC3dot(&line1 ->u, &w0); + e = _cmsVEC3dot(&line2 ->u, &w0); + + D = a*c - b * b; // Denominator + sD = tD = D; // default sD = D >= 0 + + if (D < MATRIX_DET_TOLERANCE) { // the lines are almost parallel + + sN = 0.0; // force using point P0 on segment S1 + sD = 1.0; // to prevent possible division by 0.0 later + tN = e; + tD = c; + } + else { // get the closest points on the infinite lines + + sN = (b*e - c*d); + tN = (a*e - b*d); + + if (sN < 0.0) { // sc < 0 => the s=0 edge is visible + + sN = 0.0; + tN = e; + tD = c; + } + else if (sN > sD) { // sc > 1 => the s=1 edge is visible + sN = sD; + tN = e + b; + tD = c; + } + } + + if (tN < 0.0) { // tc < 0 => the t=0 edge is visible + + tN = 0.0; + // recompute sc for this edge + if (-d < 0.0) + sN = 0.0; + else if (-d > a) + sN = sD; + else { + sN = -d; + sD = a; + } + } + else if (tN > tD) { // tc > 1 => the t=1 edge is visible + + tN = tD; + + // recompute sc for this edge + if ((-d + b) < 0.0) + sN = 0; + else if ((-d + b) > a) + sN = sD; + else { + sN = (-d + b); + sD = a; + } + } + // finally do the division to get sc and tc + sc = (fabs(sN) < MATRIX_DET_TOLERANCE ? 0.0 : sN / sD); + //tc = (fabs(tN) < MATRIX_DET_TOLERANCE ? 0.0 : tN / tD); // left for future use. + + GetPointOfLine(r, line1, sc); + return TRUE; +} + + + +// ------------------------------------------------------------------ Wrapper + + +// Allocate & free structure +cmsHANDLE CMSEXPORT cmsGBDAlloc(cmsContext ContextID) +{ + cmsGDB* gbd = (cmsGDB*) _cmsMallocZero(ContextID, sizeof(cmsGDB)); + if (gbd == NULL) return NULL; + + gbd -> ContextID = ContextID; + + return (cmsHANDLE) gbd; +} + + +void CMSEXPORT cmsGBDFree(cmsHANDLE hGBD) +{ + cmsGDB* gbd = (cmsGDB*) hGBD; + if (hGBD != NULL) + _cmsFree(gbd->ContextID, (void*) gbd); +} + + +// Auxiliary to retrieve a pointer to the segmentr containing the Lab value +static +cmsGDBPoint* GetPoint(cmsGDB* gbd, const cmsCIELab* Lab, cmsSpherical* sp) +{ + cmsVEC3 v; + int alpha, theta; + + // Housekeeping + _cmsAssert(gbd != NULL); + _cmsAssert(Lab != NULL); + _cmsAssert(sp != NULL); + + // Center L* by subtracting half of its domain, that's 50 + _cmsVEC3init(&v, Lab ->L - 50.0, Lab ->a, Lab ->b); + + // Convert to spherical coordinates + ToSpherical(sp, &v); + + if (sp ->r < 0 || sp ->alpha < 0 || sp->theta < 0) { + cmsSignalError(gbd ->ContextID, cmsERROR_RANGE, "spherical value out of range"); + return NULL; + } + + // On which sector it falls? + QuantizeToSector(sp, &alpha, &theta); + + if (alpha < 0 || theta < 0 || alpha >= SECTORS || theta >= SECTORS) { + cmsSignalError(gbd ->ContextID, cmsERROR_RANGE, " quadrant out of range"); + return NULL; + } + + // Get pointer to the sector + return &gbd ->Gamut[theta][alpha]; +} + +// Add a point to gamut descriptor. Point to add is in Lab color space. +// GBD is centered on a=b=0 and L*=50 +cmsBool CMSEXPORT cmsGDBAddPoint(cmsHANDLE hGBD, const cmsCIELab* Lab) +{ + cmsGDB* gbd = (cmsGDB*) hGBD; + cmsGDBPoint* ptr; + cmsSpherical sp; + + + // Get pointer to the sector + ptr = GetPoint(gbd, Lab, &sp); + if (ptr == NULL) return FALSE; + + // If no samples at this sector, add it + if (ptr ->Type == GP_EMPTY) { + + ptr -> Type = GP_SPECIFIED; + ptr -> p = sp; + } + else { + + + // Substitute only if radius is greater + if (sp.r > ptr -> p.r) { + + ptr -> Type = GP_SPECIFIED; + ptr -> p = sp; + } + } + + return TRUE; +} + +// Check if a given point falls inside gamut +cmsBool CMSEXPORT cmsGDBCheckPoint(cmsHANDLE hGBD, const cmsCIELab* Lab) +{ + cmsGDB* gbd = (cmsGDB*) hGBD; + cmsGDBPoint* ptr; + cmsSpherical sp; + + // Get pointer to the sector + ptr = GetPoint(gbd, Lab, &sp); + if (ptr == NULL) return FALSE; + + // If no samples at this sector, return no data + if (ptr ->Type == GP_EMPTY) return FALSE; + + // In gamut only if radius is greater + + return (sp.r <= ptr -> p.r); +} + +// ----------------------------------------------------------------------------------------------------------------------- + +// Find near sectors. The list of sectors found is returned on Close[]. +// The function returns the number of sectors as well. + +// 24 9 10 11 12 +// 23 8 1 2 13 +// 22 7 * 3 14 +// 21 6 5 4 15 +// 20 19 18 17 16 +// +// Those are the relative movements +// {-2,-2}, {-1, -2}, {0, -2}, {+1, -2}, {+2, -2}, +// {-2,-1}, {-1, -1}, {0, -1}, {+1, -1}, {+2, -1}, +// {-2, 0}, {-1, 0}, {0, 0}, {+1, 0}, {+2, 0}, +// {-2,+1}, {-1, +1}, {0, +1}, {+1, +1}, {+2, +1}, +// {-2,+2}, {-1, +2}, {0, +2}, {+1, +2}, {+2, +2}}; + + +static +const struct _spiral { + + int AdvX, AdvY; + + } Spiral[] = { {0, -1}, {+1, -1}, {+1, 0}, {+1, +1}, {0, +1}, {-1, +1}, + {-1, 0}, {-1, -1}, {-1, -2}, {0, -2}, {+1, -2}, {+2, -2}, + {+2, -1}, {+2, 0}, {+2, +1}, {+2, +2}, {+1, +2}, {0, +2}, + {-1, +2}, {-2, +2}, {-2, +1}, {-2, 0}, {-2, -1}, {-2, -2} }; + +#define NSTEPS (sizeof(Spiral) / sizeof(struct _spiral)) + +static +int FindNearSectors(cmsGDB* gbd, int alpha, int theta, cmsGDBPoint* Close[]) +{ + int nSectors = 0; + int a, t; + cmsUInt32Number i; + cmsGDBPoint* pt; + + for (i=0; i < NSTEPS; i++) { + + a = alpha + Spiral[i].AdvX; + t = theta + Spiral[i].AdvY; + + // Cycle at the end + a %= SECTORS; + t %= SECTORS; + + // Cycle at the begin + if (a < 0) a = SECTORS + a; + if (t < 0) t = SECTORS + t; + + pt = &gbd ->Gamut[t][a]; + + if (pt -> Type != GP_EMPTY) { + + Close[nSectors++] = pt; + } + } + + return nSectors; +} + + +// Interpolate a missing sector. Method identifies whatever this is top, bottom or mid +static +cmsBool InterpolateMissingSector(cmsGDB* gbd, int alpha, int theta) +{ + cmsSpherical sp; + cmsVEC3 Lab; + cmsVEC3 Centre; + cmsLine ray; + int nCloseSectors; + cmsGDBPoint* Close[NSTEPS + 1]; + cmsSpherical closel, templ; + cmsLine edge; + int k, m; + + // Is that point already specified? + if (gbd ->Gamut[theta][alpha].Type != GP_EMPTY) return TRUE; + + // Fill close points + nCloseSectors = FindNearSectors(gbd, alpha, theta, Close); + + + // Find a central point on the sector + sp.alpha = (cmsFloat64Number) ((alpha + 0.5) * 360.0) / (SECTORS); + sp.theta = (cmsFloat64Number) ((theta + 0.5) * 180.0) / (SECTORS); + sp.r = 50.0; + + // Convert to Cartesian + ToCartesian(&Lab, &sp); + + // Create a ray line from centre to this point + _cmsVEC3init(&Centre, 50.0, 0, 0); + LineOf2Points(&ray, &Lab, &Centre); + + // For all close sectors + closel.r = 0.0; + closel.alpha = 0; + closel.theta = 0; + + for (k=0; k < nCloseSectors; k++) { + + for(m = k+1; m < nCloseSectors; m++) { + + cmsVEC3 temp, a1, a2; + + // A line from sector to sector + ToCartesian(&a1, &Close[k]->p); + ToCartesian(&a2, &Close[m]->p); + + LineOf2Points(&edge, &a1, &a2); + + // Find a line + ClosestLineToLine(&temp, &ray, &edge); + + // Convert to spherical + ToSpherical(&templ, &temp); + + + if ( templ.r > closel.r && + templ.theta >= (theta*180.0/SECTORS) && + templ.theta <= ((theta+1)*180.0/SECTORS) && + templ.alpha >= (alpha*360.0/SECTORS) && + templ.alpha <= ((alpha+1)*360.0/SECTORS)) { + + closel = templ; + } + } + } + + gbd ->Gamut[theta][alpha].p = closel; + gbd ->Gamut[theta][alpha].Type = GP_MODELED; + + return TRUE; + +} + + +// Interpolate missing parts. The algorithm fist computes slices at +// theta=0 and theta=Max. +cmsBool CMSEXPORT cmsGDBCompute(cmsHANDLE hGBD, cmsUInt32Number dwFlags) +{ + int alpha, theta; + cmsGDB* gbd = (cmsGDB*) hGBD; + + _cmsAssert(hGBD != NULL); + + // Interpolate black + for (alpha = 0; alpha < SECTORS; alpha++) { + + if (!InterpolateMissingSector(gbd, alpha, 0)) return FALSE; + } + + // Interpolate white + for (alpha = 0; alpha < SECTORS; alpha++) { + + if (!InterpolateMissingSector(gbd, alpha, SECTORS-1)) return FALSE; + } + + + // Interpolate Mid + for (theta = 1; theta < SECTORS; theta++) { + for (alpha = 0; alpha < SECTORS; alpha++) { + + if (!InterpolateMissingSector(gbd, alpha, theta)) return FALSE; + } + } + + // Done + return TRUE; + + cmsUNUSED_PARAMETER(dwFlags); +} + + + + +// -------------------------------------------------------------------------------------------------------- + +// Great for debug, but not suitable for real use + +#if 0 +cmsBool cmsGBDdumpVRML(cmsHANDLE hGBD, const char* fname) +{ + FILE* fp; + int i, j; + cmsGDB* gbd = (cmsGDB*) hGBD; + cmsGDBPoint* pt; + + fp = fopen (fname, "wt"); + if (fp == NULL) + return FALSE; + + fprintf (fp, "#VRML V2.0 utf8\n"); + + // set the viewing orientation and distance + fprintf (fp, "DEF CamTest Group {\n"); + fprintf (fp, "\tchildren [\n"); + fprintf (fp, "\t\tDEF Cameras Group {\n"); + fprintf (fp, "\t\t\tchildren [\n"); + fprintf (fp, "\t\t\t\tDEF DefaultView Viewpoint {\n"); + fprintf (fp, "\t\t\t\t\tposition 0 0 340\n"); + fprintf (fp, "\t\t\t\t\torientation 0 0 1 0\n"); + fprintf (fp, "\t\t\t\t\tdescription \"default view\"\n"); + fprintf (fp, "\t\t\t\t}\n"); + fprintf (fp, "\t\t\t]\n"); + fprintf (fp, "\t\t},\n"); + fprintf (fp, "\t]\n"); + fprintf (fp, "}\n"); + + // Output the background stuff + fprintf (fp, "Background {\n"); + fprintf (fp, "\tskyColor [\n"); + fprintf (fp, "\t\t.5 .5 .5\n"); + fprintf (fp, "\t]\n"); + fprintf (fp, "}\n"); + + // Output the shape stuff + fprintf (fp, "Transform {\n"); + fprintf (fp, "\tscale .3 .3 .3\n"); + fprintf (fp, "\tchildren [\n"); + + // Draw the axes as a shape: + fprintf (fp, "\t\tShape {\n"); + fprintf (fp, "\t\t\tappearance Appearance {\n"); + fprintf (fp, "\t\t\t\tmaterial Material {\n"); + fprintf (fp, "\t\t\t\t\tdiffuseColor 0 0.8 0\n"); + fprintf (fp, "\t\t\t\t\temissiveColor 1.0 1.0 1.0\n"); + fprintf (fp, "\t\t\t\t\tshininess 0.8\n"); + fprintf (fp, "\t\t\t\t}\n"); + fprintf (fp, "\t\t\t}\n"); + fprintf (fp, "\t\t\tgeometry IndexedLineSet {\n"); + fprintf (fp, "\t\t\t\tcoord Coordinate {\n"); + fprintf (fp, "\t\t\t\t\tpoint [\n"); + fprintf (fp, "\t\t\t\t\t0.0 0.0 0.0,\n"); + fprintf (fp, "\t\t\t\t\t%f 0.0 0.0,\n", 255.0); + fprintf (fp, "\t\t\t\t\t0.0 %f 0.0,\n", 255.0); + fprintf (fp, "\t\t\t\t\t0.0 0.0 %f]\n", 255.0); + fprintf (fp, "\t\t\t\t}\n"); + fprintf (fp, "\t\t\t\tcoordIndex [\n"); + fprintf (fp, "\t\t\t\t\t0, 1, -1\n"); + fprintf (fp, "\t\t\t\t\t0, 2, -1\n"); + fprintf (fp, "\t\t\t\t\t0, 3, -1]\n"); + fprintf (fp, "\t\t\t}\n"); + fprintf (fp, "\t\t}\n"); + + + fprintf (fp, "\t\tShape {\n"); + fprintf (fp, "\t\t\tappearance Appearance {\n"); + fprintf (fp, "\t\t\t\tmaterial Material {\n"); + fprintf (fp, "\t\t\t\t\tdiffuseColor 0 0.8 0\n"); + fprintf (fp, "\t\t\t\t\temissiveColor 1 1 1\n"); + fprintf (fp, "\t\t\t\t\tshininess 0.8\n"); + fprintf (fp, "\t\t\t\t}\n"); + fprintf (fp, "\t\t\t}\n"); + fprintf (fp, "\t\t\tgeometry PointSet {\n"); + + // fill in the points here + fprintf (fp, "\t\t\t\tcoord Coordinate {\n"); + fprintf (fp, "\t\t\t\t\tpoint [\n"); + + // We need to transverse all gamut hull. + for (i=0; i < SECTORS; i++) + for (j=0; j < SECTORS; j++) { + + cmsVEC3 v; + + pt = &gbd ->Gamut[i][j]; + ToCartesian(&v, &pt ->p); + + fprintf (fp, "\t\t\t\t\t%g %g %g", v.n[0]+50, v.n[1], v.n[2]); + + if ((j == SECTORS - 1) && (i == SECTORS - 1)) + fprintf (fp, "]\n"); + else + fprintf (fp, ",\n"); + + } + + fprintf (fp, "\t\t\t\t}\n"); + + + + // fill in the face colors + fprintf (fp, "\t\t\t\tcolor Color {\n"); + fprintf (fp, "\t\t\t\t\tcolor [\n"); + + for (i=0; i < SECTORS; i++) + for (j=0; j < SECTORS; j++) { + + cmsVEC3 v; + + pt = &gbd ->Gamut[i][j]; + + + ToCartesian(&v, &pt ->p); + + + if (pt ->Type == GP_EMPTY) + fprintf (fp, "\t\t\t\t\t%g %g %g", 0.0, 0.0, 0.0); + else + if (pt ->Type == GP_MODELED) + fprintf (fp, "\t\t\t\t\t%g %g %g", 1.0, .5, .5); + else { + fprintf (fp, "\t\t\t\t\t%g %g %g", 1.0, 1.0, 1.0); + + } + + if ((j == SECTORS - 1) && (i == SECTORS - 1)) + fprintf (fp, "]\n"); + else + fprintf (fp, ",\n"); + } + fprintf (fp, "\t\t\t}\n"); + + + fprintf (fp, "\t\t\t}\n"); + fprintf (fp, "\t\t}\n"); + fprintf (fp, "\t]\n"); + fprintf (fp, "}\n"); + + fclose (fp); + + return TRUE; +} +#endif + diff --git a/local/recipes/libs/lcms2/source/src/cmstypes.c b/local/recipes/libs/lcms2/source/src/cmstypes.c new file mode 100644 index 0000000000..3afc5dc90e --- /dev/null +++ b/local/recipes/libs/lcms2/source/src/cmstypes.c @@ -0,0 +1,6252 @@ +//--------------------------------------------------------------------------------- +// +// Little Color Management System +// Copyright (c) 1998-2026 Marti Maria Saguer +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//--------------------------------------------------------------------------------- +// + +#include "lcms2_internal.h" + +// Tag Serialization ----------------------------------------------------------------------------- +// This file implements every single tag and tag type as described in the ICC spec. Some types +// have been deprecated, like ncl and Data. There is no implementation for those types as there +// are no profiles holding them. The programmer can also extend this list by defining his own types +// by using the appropriate plug-in. There are three types of plug ins regarding that. First type +// allows to define new tags using any existing type. Next plug-in type allows to define new types +// and the third one is very specific: allows to extend the number of elements in the multiprocessing +// elements special type. +//-------------------------------------------------------------------------------------------------- + +// Some broken types +#define cmsCorbisBrokenXYZtype ((cmsTagTypeSignature) 0x17A505B8) +#define cmsMonacoBrokenCurveType ((cmsTagTypeSignature) 0x9478ee00) + +// This is the linked list that keeps track of the defined types +typedef struct _cmsTagTypeLinkedList_st { + + cmsTagTypeHandler Handler; + struct _cmsTagTypeLinkedList_st* Next; + +} _cmsTagTypeLinkedList; + +// Some macros to define callbacks. +#define READ_FN(x) Type_##x##_Read +#define WRITE_FN(x) Type_##x##_Write +#define FREE_FN(x) Type_##x##_Free +#define DUP_FN(x) Type_##x##_Dup + +// Helper macro to define a handler. Callbacks do have a fixed naming convention. +#define TYPE_HANDLER(t, x) { (t), READ_FN(x), WRITE_FN(x), DUP_FN(x), FREE_FN(x), NULL, 0 } + +// Helper macro to define a MPE handler. Callbacks do have a fixed naming convention +#define TYPE_MPE_HANDLER(t, x) { (t), READ_FN(x), WRITE_FN(x), GenericMPEdup, GenericMPEfree, NULL, 0 } + +// Infinites +#define MINUS_INF (-1E22F) +#define PLUS_INF (+1E22F) + + +// Register a new type handler. This routine is shared between normal types and MPE. LinkedList points to the optional list head +static +cmsBool RegisterTypesPlugin(cmsContext id, cmsPluginBase* Data, _cmsMemoryClient pos) +{ + cmsPluginTagType* Plugin = (cmsPluginTagType*) Data; + _cmsTagTypePluginChunkType* ctx = ( _cmsTagTypePluginChunkType*) _cmsContextGetClientChunk(id, pos); + _cmsTagTypeLinkedList *pt; + + // Calling the function with NULL as plug-in would unregister the plug in. + if (Data == NULL) { + + // There is no need to set free the memory, as pool is destroyed as a whole. + ctx ->TagTypes = NULL; + return TRUE; + } + + // Registering happens in plug-in memory pool. + pt = (_cmsTagTypeLinkedList*) _cmsPluginMalloc(id, sizeof(_cmsTagTypeLinkedList)); + if (pt == NULL) return FALSE; + + pt ->Handler = Plugin ->Handler; + pt ->Next = ctx ->TagTypes; + + ctx ->TagTypes = pt; + + return TRUE; +} + +// Return handler for a given type or NULL if not found. Shared between normal types and MPE. It first tries the additions +// made by plug-ins and then the built-in defaults. +static +cmsTagTypeHandler* GetHandler(cmsTagTypeSignature sig, _cmsTagTypeLinkedList* PluginLinkedList, _cmsTagTypeLinkedList* DefaultLinkedList) +{ + _cmsTagTypeLinkedList* pt; + + for (pt = PluginLinkedList; + pt != NULL; + pt = pt ->Next) { + + if (sig == pt -> Handler.Signature) return &pt ->Handler; + } + + for (pt = DefaultLinkedList; + pt != NULL; + pt = pt ->Next) { + + if (sig == pt -> Handler.Signature) return &pt ->Handler; + } + + return NULL; +} + + +// Auxiliary to convert UTF-32 to UTF-16 in some cases +static +cmsBool _cmsWriteWCharArray(cmsIOHANDLER* io, cmsUInt32Number n, const wchar_t* Array) +{ + cmsUInt32Number i; + + _cmsAssert(io != NULL); + _cmsAssert(!(Array == NULL && n > 0)); + + for (i=0; i < n; i++) { + if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) Array[i])) return FALSE; + } + + return TRUE; +} + +// Try to promote correctly to wchar_t when 32 bits +cmsINLINE cmsBool is_surrogate(cmsUInt32Number uc) { return (uc - 0xd800u) < 2048u; } +cmsINLINE cmsBool is_high_surrogate(cmsUInt32Number uc) { return (uc & 0xfffffc00) == 0xd800; } +cmsINLINE cmsBool is_low_surrogate(cmsUInt32Number uc) { return (uc & 0xfffffc00) == 0xdc00; } + +cmsINLINE cmsUInt32Number surrogate_to_utf32(cmsUInt32Number high, cmsUInt32Number low) +{ + return (high << 10) + low - 0x35fdc00; +} + +cmsINLINE cmsBool convert_utf16_to_utf32(cmsIOHANDLER* io, cmsInt32Number n, wchar_t* output) +{ + cmsUInt16Number uc; + + while (n > 0) + { + if (!_cmsReadUInt16Number(io, &uc)) return FALSE; + n--; + + if (!is_surrogate(uc)) + { + *output++ = (wchar_t)uc; + } + else { + + cmsUInt16Number low; + + if (!_cmsReadUInt16Number(io, &low)) return FALSE; + n--; + + if (is_high_surrogate(uc) && is_low_surrogate(low)) + *output++ = (wchar_t)surrogate_to_utf32(uc, low); + else + return FALSE; // Corrupted string, just ignore + } + } + + return TRUE; +} + + +// Auxiliary to read an array of wchar_t +static +cmsBool _cmsReadWCharArray(cmsIOHANDLER* io, cmsUInt32Number n, wchar_t* Array) +{ + cmsUInt32Number i; + cmsUInt16Number tmp; + cmsBool is32 = sizeof(wchar_t) > sizeof(cmsUInt16Number); + + _cmsAssert(io != NULL); + + if (is32 && Array != NULL) + { + return convert_utf16_to_utf32(io, n, Array); + } + + for (i=0; i < n; i++) { + + if (Array != NULL) { + + if (!_cmsReadUInt16Number(io, &tmp)) return FALSE; + Array[i] = (wchar_t) tmp; + } + else { + if (!_cmsReadUInt16Number(io, NULL)) return FALSE; + } + + } + return TRUE; +} + +// To deal with position tables +typedef cmsBool (* PositionTableEntryFn)(struct _cms_typehandler_struct* self, + cmsIOHANDLER* io, + void* Cargo, + cmsUInt32Number n, + cmsUInt32Number SizeOfTag); + +// Helper function to deal with position tables as described in ICC spec 4.3 +// A table of n elements is read, where first comes n records containing offsets and sizes and +// then a block containing the data itself. This allows to reuse same data in more than one entry +static +cmsBool ReadPositionTable(struct _cms_typehandler_struct* self, + cmsIOHANDLER* io, + cmsUInt32Number Count, + cmsUInt32Number BaseOffset, + void *Cargo, + PositionTableEntryFn ElementFn) +{ + cmsUInt32Number i; + cmsUInt32Number *ElementOffsets = NULL, *ElementSizes = NULL; + cmsUInt32Number currentPosition; + + currentPosition = io->Tell(io); + + // Verify there is enough space left to read at least two cmsUInt32Number items for Count items. + if (((io->ReportedSize - currentPosition) / (2 * sizeof(cmsUInt32Number))) < Count) + return FALSE; + + // Let's take the offsets to each element + ElementOffsets = (cmsUInt32Number *) _cmsCalloc(io ->ContextID, Count, sizeof(cmsUInt32Number)); + if (ElementOffsets == NULL) goto Error; + + ElementSizes = (cmsUInt32Number *) _cmsCalloc(io ->ContextID, Count, sizeof(cmsUInt32Number)); + if (ElementSizes == NULL) goto Error; + + for (i=0; i < Count; i++) { + + if (!_cmsReadUInt32Number(io, &ElementOffsets[i])) goto Error; + if (!_cmsReadUInt32Number(io, &ElementSizes[i])) goto Error; + + ElementOffsets[i] += BaseOffset; + } + + // Seek to each element and read it + for (i=0; i < Count; i++) { + + if (!io -> Seek(io, ElementOffsets[i])) goto Error; + + // This is the reader callback + if (!ElementFn(self, io, Cargo, i, ElementSizes[i])) goto Error; + } + + // Success + if (ElementOffsets != NULL) _cmsFree(io ->ContextID, ElementOffsets); + if (ElementSizes != NULL) _cmsFree(io ->ContextID, ElementSizes); + return TRUE; + +Error: + if (ElementOffsets != NULL) _cmsFree(io ->ContextID, ElementOffsets); + if (ElementSizes != NULL) _cmsFree(io ->ContextID, ElementSizes); + return FALSE; +} + +// Same as anterior, but for write position tables +static +cmsBool WritePositionTable(struct _cms_typehandler_struct* self, + cmsIOHANDLER* io, + cmsUInt32Number SizeOfTag, + cmsUInt32Number Count, + cmsUInt32Number BaseOffset, + void *Cargo, + PositionTableEntryFn ElementFn) +{ + cmsUInt32Number i; + cmsUInt32Number DirectoryPos, CurrentPos, Before; + cmsUInt32Number *ElementOffsets = NULL, *ElementSizes = NULL; + + // Create table + ElementOffsets = (cmsUInt32Number *) _cmsCalloc(io ->ContextID, Count, sizeof(cmsUInt32Number)); + if (ElementOffsets == NULL) goto Error; + + ElementSizes = (cmsUInt32Number *) _cmsCalloc(io ->ContextID, Count, sizeof(cmsUInt32Number)); + if (ElementSizes == NULL) goto Error; + + // Keep starting position of curve offsets + DirectoryPos = io ->Tell(io); + + // Write a fake directory to be filled latter on + for (i=0; i < Count; i++) { + + if (!_cmsWriteUInt32Number(io, 0)) goto Error; // Offset + if (!_cmsWriteUInt32Number(io, 0)) goto Error; // size + } + + // Write each element. Keep track of the size as well. + for (i=0; i < Count; i++) { + + Before = io ->Tell(io); + ElementOffsets[i] = Before - BaseOffset; + + // Callback to write... + if (!ElementFn(self, io, Cargo, i, SizeOfTag)) goto Error; + + // Now the size + ElementSizes[i] = io ->Tell(io) - Before; + } + + // Write the directory + CurrentPos = io ->Tell(io); + if (!io ->Seek(io, DirectoryPos)) goto Error; + + for (i=0; i < Count; i++) { + if (!_cmsWriteUInt32Number(io, ElementOffsets[i])) goto Error; + if (!_cmsWriteUInt32Number(io, ElementSizes[i])) goto Error; + } + + if (!io ->Seek(io, CurrentPos)) goto Error; + + if (ElementOffsets != NULL) _cmsFree(io ->ContextID, ElementOffsets); + if (ElementSizes != NULL) _cmsFree(io ->ContextID, ElementSizes); + return TRUE; + +Error: + if (ElementOffsets != NULL) _cmsFree(io ->ContextID, ElementOffsets); + if (ElementSizes != NULL) _cmsFree(io ->ContextID, ElementSizes); + return FALSE; +} + + +// ******************************************************************************** +// Type XYZ. Only one value is allowed +// ******************************************************************************** + +//The XYZType contains an array of three encoded values for the XYZ tristimulus +//values. Tristimulus values must be non-negative. The signed encoding allows for +//implementation optimizations by minimizing the number of fixed formats. + + +static +void *Type_XYZ_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) +{ + cmsCIEXYZ* xyz; + + *nItems = 0; + xyz = (cmsCIEXYZ*) _cmsMallocZero(self ->ContextID, sizeof(cmsCIEXYZ)); + if (xyz == NULL) return NULL; + + if (!_cmsReadXYZNumber(io, xyz)) { + _cmsFree(self ->ContextID, xyz); + return NULL; + } + + *nItems = 1; + return (void*) xyz; + + cmsUNUSED_PARAMETER(SizeOfTag); +} + +static +cmsBool Type_XYZ_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) +{ + return _cmsWriteXYZNumber(io, (cmsCIEXYZ*) Ptr); + + cmsUNUSED_PARAMETER(nItems); + cmsUNUSED_PARAMETER(self); +} + +static +void* Type_XYZ_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) +{ + return _cmsDupMem(self ->ContextID, Ptr, sizeof(cmsCIEXYZ)); + + cmsUNUSED_PARAMETER(n); +} + +static +void Type_XYZ_Free(struct _cms_typehandler_struct* self, void *Ptr) +{ + _cmsFree(self ->ContextID, Ptr); +} + + +static +cmsTagTypeSignature DecideXYZtype(cmsFloat64Number ICCVersion, const void *Data) +{ + return cmsSigXYZType; + + cmsUNUSED_PARAMETER(ICCVersion); + cmsUNUSED_PARAMETER(Data); +} + + +// ******************************************************************************** +// Type chromaticity. Only one value is allowed +// ******************************************************************************** +// The chromaticity tag type provides basic chromaticity data and type of +// phosphors or colorants of a monitor to applications and utilities. + +static +void *Type_Chromaticity_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) +{ + cmsCIExyYTRIPLE* chrm; + cmsUInt16Number nChans, Table; + + *nItems = 0; + chrm = (cmsCIExyYTRIPLE*) _cmsMallocZero(self ->ContextID, sizeof(cmsCIExyYTRIPLE)); + if (chrm == NULL) return NULL; + + if (!_cmsReadUInt16Number(io, &nChans)) goto Error; + + // Let's recover from a bug introduced in early versions of lcms1 + if (nChans == 0 && SizeOfTag == 32) { + + if (!_cmsReadUInt16Number(io, NULL)) goto Error; + if (!_cmsReadUInt16Number(io, &nChans)) goto Error; + } + + if (nChans != 3) goto Error; + + if (!_cmsReadUInt16Number(io, &Table)) goto Error; + + if (!_cmsRead15Fixed16Number(io, &chrm ->Red.x)) goto Error; + if (!_cmsRead15Fixed16Number(io, &chrm ->Red.y)) goto Error; + + chrm ->Red.Y = 1.0; + + if (!_cmsRead15Fixed16Number(io, &chrm ->Green.x)) goto Error; + if (!_cmsRead15Fixed16Number(io, &chrm ->Green.y)) goto Error; + + chrm ->Green.Y = 1.0; + + if (!_cmsRead15Fixed16Number(io, &chrm ->Blue.x)) goto Error; + if (!_cmsRead15Fixed16Number(io, &chrm ->Blue.y)) goto Error; + + chrm ->Blue.Y = 1.0; + + *nItems = 1; + return (void*) chrm; + +Error: + _cmsFree(self ->ContextID, (void*) chrm); + return NULL; + + cmsUNUSED_PARAMETER(SizeOfTag); +} + +static +cmsBool SaveOneChromaticity(cmsFloat64Number x, cmsFloat64Number y, cmsIOHANDLER* io) +{ + if (!_cmsWriteUInt32Number(io, (cmsUInt32Number) _cmsDoubleTo15Fixed16(x))) return FALSE; + if (!_cmsWriteUInt32Number(io, (cmsUInt32Number) _cmsDoubleTo15Fixed16(y))) return FALSE; + + return TRUE; +} + +static +cmsBool Type_Chromaticity_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) +{ + cmsCIExyYTRIPLE* chrm = (cmsCIExyYTRIPLE*) Ptr; + + if (!_cmsWriteUInt16Number(io, 3)) return FALSE; // nChannels + if (!_cmsWriteUInt16Number(io, 0)) return FALSE; // Table + + if (!SaveOneChromaticity(chrm -> Red.x, chrm -> Red.y, io)) return FALSE; + if (!SaveOneChromaticity(chrm -> Green.x, chrm -> Green.y, io)) return FALSE; + if (!SaveOneChromaticity(chrm -> Blue.x, chrm -> Blue.y, io)) return FALSE; + + return TRUE; + + cmsUNUSED_PARAMETER(nItems); + cmsUNUSED_PARAMETER(self); +} + +static +void* Type_Chromaticity_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) +{ + return _cmsDupMem(self ->ContextID, Ptr, sizeof(cmsCIExyYTRIPLE)); + + cmsUNUSED_PARAMETER(n); +} + +static +void Type_Chromaticity_Free(struct _cms_typehandler_struct* self, void* Ptr) +{ + _cmsFree(self ->ContextID, Ptr); +} + + +// ******************************************************************************** +// Type cmsSigColorantOrderType +// ******************************************************************************** + +// This is an optional tag which specifies the laydown order in which colorants will +// be printed on an n-colorant device. The laydown order may be the same as the +// channel generation order listed in the colorantTableTag or the channel order of a +// colour space such as CMYK, in which case this tag is not needed. When this is not +// the case (for example, ink-towers sometimes use the order KCMY), this tag may be +// used to specify the laydown order of the colorants. + + +static +void *Type_ColorantOrderType_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) +{ + cmsUInt8Number* ColorantOrder; + cmsUInt32Number Count; + + *nItems = 0; + if (!_cmsReadUInt32Number(io, &Count)) return NULL; + if (Count > cmsMAXCHANNELS) return NULL; + + ColorantOrder = (cmsUInt8Number*) _cmsCalloc(self ->ContextID, cmsMAXCHANNELS, sizeof(cmsUInt8Number)); + if (ColorantOrder == NULL) return NULL; + + // We use FF as end marker + memset(ColorantOrder, 0xFF, cmsMAXCHANNELS * sizeof(cmsUInt8Number)); + + if (io ->Read(io, ColorantOrder, sizeof(cmsUInt8Number), Count) != Count) { + + _cmsFree(self ->ContextID, (void*) ColorantOrder); + return NULL; + } + + *nItems = 1; + return (void*) ColorantOrder; + + cmsUNUSED_PARAMETER(SizeOfTag); +} + +static +cmsBool Type_ColorantOrderType_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) +{ + cmsUInt8Number* ColorantOrder = (cmsUInt8Number*) Ptr; + cmsUInt32Number i, sz, Count; + + // Get the length + for (Count=i=0; i < cmsMAXCHANNELS; i++) { + if (ColorantOrder[i] != 0xFF) Count++; + } + + if (!_cmsWriteUInt32Number(io, Count)) return FALSE; + + sz = Count * sizeof(cmsUInt8Number); + if (!io -> Write(io, sz, ColorantOrder)) return FALSE; + + return TRUE; + + cmsUNUSED_PARAMETER(nItems); + cmsUNUSED_PARAMETER(self); +} + +static +void* Type_ColorantOrderType_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) +{ + return _cmsDupMem(self ->ContextID, Ptr, cmsMAXCHANNELS * sizeof(cmsUInt8Number)); + + cmsUNUSED_PARAMETER(n); +} + + +static +void Type_ColorantOrderType_Free(struct _cms_typehandler_struct* self, void* Ptr) +{ + _cmsFree(self ->ContextID, Ptr); +} + +// ******************************************************************************** +// Type cmsSigUInt8ArrayType +// ******************************************************************************** +// This type represents an array of generic 1-byte/8-bit quantity. + +static +void* Type_UInt8_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) +{ + cmsUInt8Number* array; + cmsUInt32Number i, n; + + *nItems = 0; + n = SizeOfTag / sizeof(cmsUInt8Number); + array = (cmsUInt8Number*)_cmsCalloc(self->ContextID, n, sizeof(cmsUInt8Number)); + if (array == NULL) return NULL; + + for (i = 0; i < n; i++) { + + if (!_cmsReadUInt8Number(io, &array[i])) { + + _cmsFree(self->ContextID, array); + return NULL; + } + } + + *nItems = n; + return (void*)array; +} + +static +cmsBool Type_UInt8_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) +{ + cmsUInt8Number* Value = (cmsUInt8Number*)Ptr; + cmsUInt32Number i; + + for (i = 0; i < nItems; i++) { + + if (!_cmsWriteUInt8Number(io, Value[i])) return FALSE; + } + + return TRUE; + + cmsUNUSED_PARAMETER(self); +} + +static +void* Type_UInt8_Dup(struct _cms_typehandler_struct* self, const void* Ptr, cmsUInt32Number n) +{ + return _cmsDupMem(self->ContextID, Ptr, n * sizeof(cmsUInt8Number)); +} + + +static +void Type_UInt8_Free(struct _cms_typehandler_struct* self, void* Ptr) +{ + _cmsFree(self->ContextID, Ptr); +} + +// ******************************************************************************** +// Type cmsSigUInt32ArrayType +// ******************************************************************************** +// This type represents an array of generic 4-byte/32-bit quantity. +static +void* Type_UInt32_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) +{ + cmsUInt32Number* array; + cmsUInt32Number i, n; + + *nItems = 0; + n = SizeOfTag / sizeof(cmsUInt32Number); + array = (cmsUInt32Number*)_cmsCalloc(self->ContextID, n, sizeof(cmsUInt32Number)); + if (array == NULL) return NULL; + + for (i = 0; i < n; i++) { + + if (!_cmsReadUInt32Number(io, &array[i])) { + + _cmsFree(self->ContextID, array); + return NULL; + } + } + + *nItems = n; + return (void*)array; +} + +static +cmsBool Type_UInt32_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) +{ + cmsUInt32Number* Value = (cmsUInt32Number*)Ptr; + cmsUInt32Number i; + + for (i = 0; i < nItems; i++) { + + if (!_cmsWriteUInt32Number(io, Value[i])) return FALSE; + } + + return TRUE; + + cmsUNUSED_PARAMETER(self); +} + +static +void* Type_UInt32_Dup(struct _cms_typehandler_struct* self, const void* Ptr, cmsUInt32Number n) +{ + return _cmsDupMem(self->ContextID, Ptr, n * sizeof(cmsUInt32Number)); +} + + +static +void Type_UInt32_Free(struct _cms_typehandler_struct* self, void* Ptr) +{ + _cmsFree(self->ContextID, Ptr); +} + +// ******************************************************************************** +// Type cmsSigUInt64ArrayType +// ******************************************************************************** +// This type represents an array of generic 8-byte/64-bit quantity. +static +void* Type_UInt64_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) +{ + cmsUInt64Number* array; + cmsUInt32Number i, n; + + *nItems = 0; + n = SizeOfTag / sizeof(cmsUInt64Number); + array = (cmsUInt64Number*)_cmsCalloc(self->ContextID, n, sizeof(cmsUInt64Number)); + if (array == NULL) return NULL; + + for (i = 0; i < n; i++) { + + if (!_cmsReadUInt64Number(io, &array[i])) { + + _cmsFree(self->ContextID, array); + return NULL; + } + } + + *nItems = n; + return (void*)array; +} + +static +cmsBool Type_UInt64_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) +{ + cmsUInt64Number* Value = (cmsUInt64Number*)Ptr; + cmsUInt32Number i; + + for (i = 0; i < nItems; i++) { + + if (!_cmsWriteUInt64Number(io, &Value[i])) return FALSE; + } + + return TRUE; + + cmsUNUSED_PARAMETER(self); +} + +static +void* Type_UInt64_Dup(struct _cms_typehandler_struct* self, const void* Ptr, cmsUInt32Number n) +{ + return _cmsDupMem(self->ContextID, Ptr, n * sizeof(cmsUInt64Number)); +} + + +static +void Type_UInt64_Free(struct _cms_typehandler_struct* self, void* Ptr) +{ + _cmsFree(self->ContextID, Ptr); +} + +// ******************************************************************************** +// Type cmsSigS15Fixed16ArrayType +// ******************************************************************************** +// This type represents an array of generic 4-byte/32-bit fixed point quantity. +// The number of values is determined from the size of the tag. + +static +void *Type_S15Fixed16_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) +{ + cmsFloat64Number* array_double; + cmsUInt32Number i, n; + + *nItems = 0; + n = SizeOfTag / sizeof(cmsUInt32Number); + array_double = (cmsFloat64Number*) _cmsCalloc(self ->ContextID, n, sizeof(cmsFloat64Number)); + if (array_double == NULL) return NULL; + + for (i=0; i < n; i++) { + + if (!_cmsRead15Fixed16Number(io, &array_double[i])) { + + _cmsFree(self ->ContextID, array_double); + return NULL; + } + } + + *nItems = n; + return (void*) array_double; +} + +static +cmsBool Type_S15Fixed16_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) +{ + cmsFloat64Number* Value = (cmsFloat64Number*) Ptr; + cmsUInt32Number i; + + for (i=0; i < nItems; i++) { + + if (!_cmsWrite15Fixed16Number(io, Value[i])) return FALSE; + } + + return TRUE; + + cmsUNUSED_PARAMETER(self); +} + +static +void* Type_S15Fixed16_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) +{ + return _cmsDupMem(self ->ContextID, Ptr, n * sizeof(cmsFloat64Number)); +} + + +static +void Type_S15Fixed16_Free(struct _cms_typehandler_struct* self, void* Ptr) +{ + _cmsFree(self ->ContextID, Ptr); +} + +// ******************************************************************************** +// Type cmsSigU16Fixed16ArrayType +// ******************************************************************************** +// This type represents an array of generic 4-byte/32-bit quantity. +// The number of values is determined from the size of the tag. + + +static +void *Type_U16Fixed16_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) +{ + cmsFloat64Number* array_double; + cmsUInt32Number v; + cmsUInt32Number i, n; + + *nItems = 0; + n = SizeOfTag / sizeof(cmsUInt32Number); + array_double = (cmsFloat64Number*) _cmsCalloc(self ->ContextID, n, sizeof(cmsFloat64Number)); + if (array_double == NULL) return NULL; + + for (i=0; i < n; i++) { + + if (!_cmsReadUInt32Number(io, &v)) { + _cmsFree(self ->ContextID, (void*) array_double); + return NULL; + } + + // Convert to cmsFloat64Number + array_double[i] = (cmsFloat64Number) (v / 65536.0); + } + + *nItems = n; + return (void*) array_double; +} + +static +cmsBool Type_U16Fixed16_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) +{ + cmsFloat64Number* Value = (cmsFloat64Number*) Ptr; + cmsUInt32Number i; + + for (i=0; i < nItems; i++) { + + cmsUInt32Number v = (cmsUInt32Number) floor(Value[i]*65536.0 + 0.5); + + if (!_cmsWriteUInt32Number(io, v)) return FALSE; + } + + return TRUE; + + cmsUNUSED_PARAMETER(self); +} + + +static +void* Type_U16Fixed16_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) +{ + return _cmsDupMem(self ->ContextID, Ptr, n * sizeof(cmsFloat64Number)); +} + +static +void Type_U16Fixed16_Free(struct _cms_typehandler_struct* self, void* Ptr) +{ + _cmsFree(self ->ContextID, Ptr); +} + +// ******************************************************************************** +// Type cmsSigSignatureType +// ******************************************************************************** +// +// The signatureType contains a four-byte sequence, Sequences of less than four +// characters are padded at the end with spaces, 20h. +// Typically this type is used for registered tags that can be displayed on many +// development systems as a sequence of four characters. + +static +void *Type_Signature_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) +{ + cmsSignature* SigPtr = (cmsSignature*) _cmsMalloc(self ->ContextID, sizeof(cmsSignature)); + if (SigPtr == NULL) return NULL; + + if (!_cmsReadUInt32Number(io, SigPtr)) return NULL; + *nItems = 1; + + return SigPtr; + + cmsUNUSED_PARAMETER(SizeOfTag); +} + +static +cmsBool Type_Signature_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) +{ + cmsSignature* SigPtr = (cmsSignature*) Ptr; + + return _cmsWriteUInt32Number(io, *SigPtr); + + cmsUNUSED_PARAMETER(nItems); + cmsUNUSED_PARAMETER(self); +} + +static +void* Type_Signature_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) +{ + return _cmsDupMem(self ->ContextID, Ptr, n * sizeof(cmsSignature)); +} + +static +void Type_Signature_Free(struct _cms_typehandler_struct* self, void* Ptr) +{ + _cmsFree(self ->ContextID, Ptr); +} + + +// ******************************************************************************** +// Type cmsSigTextType +// ******************************************************************************** +// +// The textType is a simple text structure that contains a 7-bit ASCII text string. +// The length of the string is obtained by subtracting 8 from the element size portion +// of the tag itself. This string must be terminated with a 00h byte. + +static +void *Type_Text_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) +{ + char* Text = NULL; + cmsMLU* mlu = NULL; + + // Create a container + mlu = cmsMLUalloc(self ->ContextID, 1); + if (mlu == NULL) return NULL; + + *nItems = 0; + + // We need to store the "\0" at the end, so +1 + if (SizeOfTag == UINT_MAX) goto Error; + + Text = (char*) _cmsMalloc(self ->ContextID, SizeOfTag + 1); + if (Text == NULL) goto Error; + + if (io -> Read(io, Text, sizeof(char), SizeOfTag) != SizeOfTag) goto Error; + + // Make sure text is properly ended + Text[SizeOfTag] = 0; + *nItems = 1; + + // Keep the result + if (!cmsMLUsetASCII(mlu, cmsNoLanguage, cmsNoCountry, Text)) goto Error; + + _cmsFree(self ->ContextID, Text); + return (void*) mlu; + +Error: + if (mlu != NULL) + cmsMLUfree(mlu); + if (Text != NULL) + _cmsFree(self ->ContextID, Text); + + return NULL; +} + +// The conversion implies to choose a language. So, we choose the actual language. +static +cmsBool Type_Text_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) +{ + cmsMLU* mlu = (cmsMLU*) Ptr; + cmsUInt32Number size; + cmsBool rc; + char* Text; + + // Get the size of the string. Note there is an extra "\0" at the end + size = cmsMLUgetASCII(mlu, cmsNoLanguage, cmsNoCountry, NULL, 0); + if (size == 0) return FALSE; // Cannot be zero! + + // Create memory + Text = (char*) _cmsMalloc(self ->ContextID, size); + if (Text == NULL) return FALSE; + + cmsMLUgetASCII(mlu, cmsNoLanguage, cmsNoCountry, Text, size); + + // Write it, including separator + rc = io ->Write(io, size, Text); + + _cmsFree(self ->ContextID, Text); + return rc; + + cmsUNUSED_PARAMETER(nItems); +} + +static +void* Type_Text_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) +{ + return (void*) cmsMLUdup((cmsMLU*) Ptr); + + cmsUNUSED_PARAMETER(n); + cmsUNUSED_PARAMETER(self); +} + + +static +void Type_Text_Free(struct _cms_typehandler_struct* self, void* Ptr) +{ + cmsMLU* mlu = (cmsMLU*) Ptr; + cmsMLUfree(mlu); + return; + + cmsUNUSED_PARAMETER(self); +} + +static +cmsTagTypeSignature DecideTextType(cmsFloat64Number ICCVersion, const void *Data) +{ + if (ICCVersion >= 4.0) + return cmsSigMultiLocalizedUnicodeType; + + return cmsSigTextType; + + cmsUNUSED_PARAMETER(Data); +} + + +// ******************************************************************************** +// Type cmsSigDataType +// ******************************************************************************** + +// General purpose data type +static +void *Type_Data_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) +{ + cmsICCData* BinData; + cmsUInt32Number LenOfData; + + *nItems = 0; + + if (SizeOfTag < sizeof(cmsUInt32Number)) return NULL; + + LenOfData = SizeOfTag - sizeof(cmsUInt32Number); + if (LenOfData > INT_MAX) return NULL; + + BinData = (cmsICCData*) _cmsMalloc(self ->ContextID, sizeof(cmsICCData) + LenOfData - 1); + if (BinData == NULL) return NULL; + + BinData ->len = LenOfData; + if (!_cmsReadUInt32Number(io, &BinData->flag)) { + _cmsFree(self ->ContextID, BinData); + return NULL; + } + + if (io -> Read(io, BinData ->data, sizeof(cmsUInt8Number), LenOfData) != LenOfData) { + + _cmsFree(self ->ContextID, BinData); + return NULL; + } + + *nItems = 1; + + return (void*) BinData; +} + + +static +cmsBool Type_Data_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) +{ + cmsICCData* BinData = (cmsICCData*) Ptr; + + if (!_cmsWriteUInt32Number(io, BinData ->flag)) return FALSE; + + return io ->Write(io, BinData ->len, BinData ->data); + + cmsUNUSED_PARAMETER(nItems); + cmsUNUSED_PARAMETER(self); +} + + +static +void* Type_Data_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) +{ + cmsICCData* BinData = (cmsICCData*) Ptr; + + return _cmsDupMem(self ->ContextID, Ptr, sizeof(cmsICCData) + BinData ->len - 1); + + cmsUNUSED_PARAMETER(n); +} + +static +void Type_Data_Free(struct _cms_typehandler_struct* self, void* Ptr) +{ + _cmsFree(self ->ContextID, Ptr); +} + +// ******************************************************************************** +// Type cmsSigTextDescriptionType +// ******************************************************************************** + +static +void *Type_Text_Description_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) +{ + char* Text = NULL; + wchar_t* UnicodeString = NULL; + cmsMLU* mlu = NULL; + cmsUInt32Number AsciiCount; + cmsUInt32Number i, UnicodeCode, UnicodeCount; + cmsUInt16Number ScriptCodeCode, Dummy; + cmsUInt8Number ScriptCodeCount; + + *nItems = 0; + + // One dword should be there + if (SizeOfTag < sizeof(cmsUInt32Number)) return NULL; + + // Read len of ASCII + if (!_cmsReadUInt32Number(io, &AsciiCount)) return NULL; + if (AsciiCount > 0x7ffff) return NULL; + + SizeOfTag -= sizeof(cmsUInt32Number); + + // Check for size + if (SizeOfTag < AsciiCount) return NULL; + + // All seems Ok, allocate the container + mlu = cmsMLUalloc(self ->ContextID, 2); + if (mlu == NULL) return NULL; + + // As many memory as size of tag + Text = (char*) _cmsMalloc(self ->ContextID, AsciiCount + 1); + if (Text == NULL) goto Error; + + // Read it + if (io ->Read(io, Text, sizeof(char), AsciiCount) != AsciiCount) goto Error; + SizeOfTag -= AsciiCount; + + // Make sure there is a terminator + Text[AsciiCount] = 0; + + // Set the MLU entry. From here we can be tolerant to wrong types + if (!cmsMLUsetASCII(mlu, cmsNoLanguage, cmsNoCountry, Text)) goto Error; + _cmsFree(self ->ContextID, (void*) Text); + Text = NULL; + + // Skip Unicode code + if (SizeOfTag < 2* sizeof(cmsUInt32Number)) goto Done; + if (!_cmsReadUInt32Number(io, &UnicodeCode)) goto Done; + if (!_cmsReadUInt32Number(io, &UnicodeCount)) goto Done; + SizeOfTag -= 2* sizeof(cmsUInt32Number); + + if (UnicodeCount == 0 || UnicodeCount > 0x7ffff || + SizeOfTag < UnicodeCount*sizeof(cmsUInt16Number)) goto Done; + + UnicodeString = (wchar_t*)_cmsMallocZero(self->ContextID, (UnicodeCount + 1) * sizeof(wchar_t)); + if (UnicodeString == NULL) goto Done; + + if (!_cmsReadWCharArray(io, UnicodeCount, UnicodeString)) { + _cmsFree(self->ContextID, (void*)UnicodeString); + goto Done; + } + + UnicodeString[UnicodeCount] = 0; + + if (!cmsMLUsetWide(mlu, cmsV2Unicode, cmsV2Unicode, UnicodeString)) { + _cmsFree(self->ContextID, (void*)UnicodeString); + goto Done; + } + + _cmsFree(self->ContextID, (void*)UnicodeString); + UnicodeString = NULL; + + SizeOfTag -= UnicodeCount*sizeof(cmsUInt16Number); + + // Skip ScriptCode code if present. Some buggy profiles does have less + // data that strictly required. We need to skip it as this type may come + // embedded in other types. + + if (SizeOfTag >= sizeof(cmsUInt16Number) + sizeof(cmsUInt8Number) + 67) { + + if (!_cmsReadUInt16Number(io, &ScriptCodeCode)) goto Done; + if (!_cmsReadUInt8Number(io, &ScriptCodeCount)) goto Done; + + // Skip rest of tag + for (i=0; i < 67; i++) { + if (!io ->Read(io, &Dummy, sizeof(cmsUInt8Number), 1)) goto Error; + } + } + +Done: + + *nItems = 1; + return mlu; + +Error: + if (UnicodeString) _cmsFree(self->ContextID, (void*)UnicodeString); + if (Text) _cmsFree(self ->ContextID, (void*) Text); + if (mlu) cmsMLUfree(mlu); + return NULL; +} + + +// This tag can come IN UNALIGNED SIZE. In order to prevent issues, we force zeros on description to align it +static +cmsBool Type_Text_Description_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) +{ + cmsMLU* mlu = (cmsMLU*) Ptr; + char *Text = NULL; + wchar_t *Wide = NULL; + cmsUInt32Number len, len_text, len_tag_requirement, len_aligned; + cmsBool rc = FALSE; + char Filler[68]; + + // Used below for writing zeroes + memset(Filler, 0, sizeof(Filler)); + + // Get the len of string + len = cmsMLUgetASCII(mlu, cmsNoLanguage, cmsNoCountry, NULL, 0); + + // Specification ICC.1:2001-04 (v2.4.0): It has been found that textDescriptionType can contain misaligned data + //(see clause 4.1 for the definition of 'aligned'). Because the Unicode language + // code and Unicode count immediately follow the ASCII description, their + // alignment is not correct if the ASCII count is not a multiple of four. The + // ScriptCode code is misaligned when the ASCII count is odd. Profile reading and + // writing software must be written carefully in order to handle these alignment + // problems. + // + // The above last sentence suggest to handle alignment issues in the + // parser. The provided example (Table 69 on Page 60) makes this clear. + // The padding only in the ASCII count is not sufficient for a aligned tag + // size, with the same text size in ASCII and Unicode. + + // Null strings + if (len <= 0) { + + Text = (char*) _cmsDupMem(self ->ContextID, "", sizeof(char)); + Wide = (wchar_t*) _cmsDupMem(self ->ContextID, L"", sizeof(wchar_t)); + } + else { + // Create independent buffers + Text = (char*) _cmsCalloc(self ->ContextID, len, sizeof(char)); + if (Text == NULL) goto Error; + + Wide = (wchar_t*) _cmsCalloc(self ->ContextID, len, sizeof(wchar_t)); + if (Wide == NULL) goto Error; + + // Get both representations. + cmsMLUgetASCII(mlu, cmsNoLanguage, cmsNoCountry, Text, len * sizeof(char)); + cmsMLUgetWide(mlu, cmsV2Unicode, cmsV2Unicode, Wide, len * sizeof(wchar_t)); + } + + // Tell the real text len including the null terminator and padding + len_text = (cmsUInt32Number) strlen(Text) + 1; + // Compute an total tag size requirement + len_tag_requirement = (8+4+len_text+4+4+2*len_text+2+1+67); + len_aligned = _cmsALIGNLONG(len_tag_requirement); + + // * cmsUInt32Number count; * Description length + // * cmsInt8Number desc[count] * NULL terminated ascii string + // * cmsUInt32Number ucLangCode; * UniCode language code + // * cmsUInt32Number ucCount; * UniCode description length + // * cmsInt16Number ucDesc[ucCount];* The UniCode description + // * cmsUInt16Number scCode; * ScriptCode code + // * cmsUInt8Number scCount; * ScriptCode count + // * cmsInt8Number scDesc[67]; * ScriptCode Description + + if (!_cmsWriteUInt32Number(io, len_text)) goto Error; + if (!io ->Write(io, len_text, Text)) goto Error; + + if (!_cmsWriteUInt32Number(io, 0)) goto Error; // ucLanguageCode + + if (!_cmsWriteUInt32Number(io, len_text)) goto Error; + // Note that in some compilers sizeof(cmsUInt16Number) != sizeof(wchar_t) + if (!_cmsWriteWCharArray(io, len_text, Wide)) goto Error; + + // ScriptCode Code & count (unused) + if (!_cmsWriteUInt16Number(io, 0)) goto Error; + if (!_cmsWriteUInt8Number(io, 0)) goto Error; + + if (!io ->Write(io, 67, Filler)) goto Error; + + // possibly add pad at the end of tag + if (len_aligned > len_tag_requirement) + if (!io ->Write(io, len_aligned - len_tag_requirement, Filler)) goto Error; + + rc = TRUE; + +Error: + if (Text) _cmsFree(self ->ContextID, Text); + if (Wide) _cmsFree(self ->ContextID, Wide); + + return rc; + + cmsUNUSED_PARAMETER(nItems); +} + + +static +void* Type_Text_Description_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) +{ + return (void*) cmsMLUdup((cmsMLU*) Ptr); + + cmsUNUSED_PARAMETER(n); + cmsUNUSED_PARAMETER(self); +} + +static +void Type_Text_Description_Free(struct _cms_typehandler_struct* self, void* Ptr) +{ + cmsMLU* mlu = (cmsMLU*) Ptr; + + cmsMLUfree(mlu); + return; + + cmsUNUSED_PARAMETER(self); +} + + +static +cmsTagTypeSignature DecideTextDescType(cmsFloat64Number ICCVersion, const void *Data) +{ + if (ICCVersion >= 4.0) + return cmsSigMultiLocalizedUnicodeType; + + return cmsSigTextDescriptionType; + + cmsUNUSED_PARAMETER(Data); +} + + +// ******************************************************************************** +// Type cmsSigCurveType +// ******************************************************************************** + +static +void *Type_Curve_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) +{ + cmsUInt32Number Count; + cmsToneCurve* NewGamma; + + *nItems = 0; + if (!_cmsReadUInt32Number(io, &Count)) return NULL; + + switch (Count) { + + case 0: // Linear. + { + cmsFloat64Number SingleGamma = 1.0; + + NewGamma = cmsBuildParametricToneCurve(self ->ContextID, 1, &SingleGamma); + if (!NewGamma) return NULL; + *nItems = 1; + return NewGamma; + } + + case 1: // Specified as the exponent of gamma function + { + cmsUInt16Number SingleGammaFixed; + cmsFloat64Number SingleGamma; + + if (!_cmsReadUInt16Number(io, &SingleGammaFixed)) return NULL; + SingleGamma = _cms8Fixed8toDouble(SingleGammaFixed); + + *nItems = 1; + return cmsBuildParametricToneCurve(self ->ContextID, 1, &SingleGamma); + } + + default: // Curve + + if (Count > 0x7FFF) + return NULL; // This is to prevent bad guys for doing bad things + + NewGamma = cmsBuildTabulatedToneCurve16(self ->ContextID, Count, NULL); + if (!NewGamma) return NULL; + + if (!_cmsReadUInt16Array(io, Count, NewGamma -> Table16)) { + cmsFreeToneCurve(NewGamma); + return NULL; + } + + *nItems = 1; + return NewGamma; + } + + cmsUNUSED_PARAMETER(SizeOfTag); +} + + +static +cmsBool Type_Curve_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) +{ + cmsToneCurve* Curve = (cmsToneCurve*) Ptr; + + if (Curve ->nSegments == 1 && Curve ->Segments[0].Type == 1) { + + // Single gamma, preserve number + cmsUInt16Number SingleGammaFixed = _cmsDoubleTo8Fixed8(Curve ->Segments[0].Params[0]); + + if (!_cmsWriteUInt32Number(io, 1)) return FALSE; + if (!_cmsWriteUInt16Number(io, SingleGammaFixed)) return FALSE; + return TRUE; + + } + + if (!_cmsWriteUInt32Number(io, Curve ->nEntries)) return FALSE; + return _cmsWriteUInt16Array(io, Curve ->nEntries, Curve ->Table16); + + cmsUNUSED_PARAMETER(nItems); + cmsUNUSED_PARAMETER(self); +} + + +static +void* Type_Curve_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) +{ + return (void*) cmsDupToneCurve((cmsToneCurve*) Ptr); + + cmsUNUSED_PARAMETER(n); + cmsUNUSED_PARAMETER(self); +} + +static +void Type_Curve_Free(struct _cms_typehandler_struct* self, void* Ptr) +{ + cmsToneCurve* gamma = (cmsToneCurve*) Ptr; + + cmsFreeToneCurve(gamma); + return; + + cmsUNUSED_PARAMETER(self); +} + + +// ******************************************************************************** +// Type cmsSigParametricCurveType +// ******************************************************************************** + + +// Decide which curve type to use on writing +static +cmsTagTypeSignature DecideCurveType(cmsFloat64Number ICCVersion, const void *Data) +{ + cmsToneCurve* Curve = (cmsToneCurve*) Data; + + if (ICCVersion < 4.0) return cmsSigCurveType; + if (Curve ->nSegments != 1) return cmsSigCurveType; // Only 1-segment curves can be saved as parametric + if (Curve ->Segments[0].Type < 0) return cmsSigCurveType; // Only non-inverted curves + if (Curve ->Segments[0].Type > 5) return cmsSigCurveType; // Only ICC parametric curves + + return cmsSigParametricCurveType; +} + +static +void *Type_ParametricCurve_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) +{ + static const int ParamsByType[] = { 1, 3, 4, 5, 7 }; + cmsFloat64Number Params[10]; + cmsUInt16Number Type; + int i, n; + cmsToneCurve* NewGamma; + + if (!_cmsReadUInt16Number(io, &Type)) return NULL; + if (!_cmsReadUInt16Number(io, NULL)) return NULL; // Reserved + + if (Type > 4) { + + cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unknown parametric curve type '%d'", Type); + return NULL; + } + + memset(Params, 0, sizeof(Params)); + n = ParamsByType[Type]; + + for (i=0; i < n; i++) { + + if (!_cmsRead15Fixed16Number(io, &Params[i])) return NULL; + } + + NewGamma = cmsBuildParametricToneCurve(self ->ContextID, Type+1, Params); + + *nItems = 1; + return NewGamma; + + cmsUNUSED_PARAMETER(SizeOfTag); +} + + +static +cmsBool Type_ParametricCurve_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) +{ + cmsToneCurve* Curve = (cmsToneCurve*) Ptr; + int i, nParams, typen; + static const int ParamsByType[] = { 0, 1, 3, 4, 5, 7 }; + + typen = Curve -> Segments[0].Type; + + if (Curve ->nSegments > 1 || typen < 1) { + + cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Multisegment or Inverted parametric curves cannot be written"); + return FALSE; + } + + if (typen > 5) { + cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported parametric curve"); + return FALSE; + } + + nParams = ParamsByType[typen]; + + if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) (Curve ->Segments[0].Type - 1))) return FALSE; + if (!_cmsWriteUInt16Number(io, 0)) return FALSE; // Reserved + + for (i=0; i < nParams; i++) { + + if (!_cmsWrite15Fixed16Number(io, Curve -> Segments[0].Params[i])) return FALSE; + } + + return TRUE; + + cmsUNUSED_PARAMETER(nItems); +} + +static +void* Type_ParametricCurve_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) +{ + return (void*) cmsDupToneCurve((cmsToneCurve*) Ptr); + + cmsUNUSED_PARAMETER(n); + cmsUNUSED_PARAMETER(self); +} + +static +void Type_ParametricCurve_Free(struct _cms_typehandler_struct* self, void* Ptr) +{ + cmsToneCurve* gamma = (cmsToneCurve*) Ptr; + + cmsFreeToneCurve(gamma); + return; + + cmsUNUSED_PARAMETER(self); +} + + +// ******************************************************************************** +// Type cmsSigDateTimeType +// ******************************************************************************** + +// A 12-byte value representation of the time and date, where the byte usage is assigned +// as specified in table 1. The actual values are encoded as 16-bit unsigned integers +// (uInt16Number - see 5.1.6). +// +// All the dateTimeNumber values in a profile shall be in Coordinated Universal Time +// (UTC, also known as GMT or ZULU Time). Profile writers are required to convert local +// time to UTC when setting these values. Programs that display these values may show +// the dateTimeNumber as UTC, show the equivalent local time (at current locale), or +// display both UTC and local versions of the dateTimeNumber. + +static +void *Type_DateTime_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) +{ + cmsDateTimeNumber timestamp; + struct tm * NewDateTime; + + *nItems = 0; + NewDateTime = (struct tm*) _cmsMalloc(self ->ContextID, sizeof(struct tm)); + if (NewDateTime == NULL) return NULL; + + if (io->Read(io, ×tamp, sizeof(cmsDateTimeNumber), 1) != 1) return NULL; + + _cmsDecodeDateTimeNumber(×tamp, NewDateTime); + + *nItems = 1; + return NewDateTime; + + cmsUNUSED_PARAMETER(SizeOfTag); +} + + +static +cmsBool Type_DateTime_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) +{ + struct tm * DateTime = (struct tm*) Ptr; + cmsDateTimeNumber timestamp; + + _cmsEncodeDateTimeNumber(×tamp, DateTime); + if (!io ->Write(io, sizeof(cmsDateTimeNumber), ×tamp)) return FALSE; + + return TRUE; + + cmsUNUSED_PARAMETER(nItems); + cmsUNUSED_PARAMETER(self); +} + +static +void* Type_DateTime_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) +{ + return _cmsDupMem(self ->ContextID, Ptr, sizeof(struct tm)); + + cmsUNUSED_PARAMETER(n); +} + +static +void Type_DateTime_Free(struct _cms_typehandler_struct* self, void* Ptr) +{ + _cmsFree(self ->ContextID, Ptr); +} + + + +// ******************************************************************************** +// Type icMeasurementType +// ******************************************************************************** + +/* +The measurementType information refers only to the internal profile data and is +meant to provide profile makers an alternative to the default measurement +specifications. +*/ + +static +void *Type_Measurement_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) +{ + cmsICCMeasurementConditions mc; + + + memset(&mc, 0, sizeof(mc)); + + if (!_cmsReadUInt32Number(io, &mc.Observer)) return NULL; + if (!_cmsReadXYZNumber(io, &mc.Backing)) return NULL; + if (!_cmsReadUInt32Number(io, &mc.Geometry)) return NULL; + if (!_cmsRead15Fixed16Number(io, &mc.Flare)) return NULL; + if (!_cmsReadUInt32Number(io, &mc.IlluminantType)) return NULL; + + *nItems = 1; + return _cmsDupMem(self ->ContextID, &mc, sizeof(cmsICCMeasurementConditions)); + + cmsUNUSED_PARAMETER(SizeOfTag); +} + + +static +cmsBool Type_Measurement_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) +{ + cmsICCMeasurementConditions* mc =(cmsICCMeasurementConditions*) Ptr; + + if (!_cmsWriteUInt32Number(io, mc->Observer)) return FALSE; + if (!_cmsWriteXYZNumber(io, &mc->Backing)) return FALSE; + if (!_cmsWriteUInt32Number(io, mc->Geometry)) return FALSE; + if (!_cmsWrite15Fixed16Number(io, mc->Flare)) return FALSE; + if (!_cmsWriteUInt32Number(io, mc->IlluminantType)) return FALSE; + + return TRUE; + + cmsUNUSED_PARAMETER(nItems); + cmsUNUSED_PARAMETER(self); +} + +static +void* Type_Measurement_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) +{ + return _cmsDupMem(self ->ContextID, Ptr, sizeof(cmsICCMeasurementConditions)); + + cmsUNUSED_PARAMETER(n); +} + +static +void Type_Measurement_Free(struct _cms_typehandler_struct* self, void* Ptr) +{ + _cmsFree(self ->ContextID, Ptr); +} + + +// ******************************************************************************** +// Type cmsSigMultiLocalizedUnicodeType +// ******************************************************************************** +// +// Do NOT trust SizeOfTag as there is an issue on the definition of profileSequenceDescTag. See the TechNote from +// Max Derhak and Rohit Patil about this: basically the size of the string table should be guessed and cannot be +// taken from the size of tag if this tag is embedded as part of bigger structures (profileSequenceDescTag, for instance) +// + +static +void *Type_MLU_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) +{ + cmsMLU* mlu; + cmsUInt32Number Count, RecLen, NumOfWchar; + cmsUInt32Number SizeOfHeader; + cmsUInt32Number Len, Offset; + cmsUInt32Number i; + wchar_t* Block; + cmsUInt32Number BeginOfThisString, EndOfThisString, LargestPosition; + + *nItems = 0; + if (!_cmsReadUInt32Number(io, &Count)) return NULL; + if (!_cmsReadUInt32Number(io, &RecLen)) return NULL; + + if (RecLen != 12) { + + cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, "multiLocalizedUnicodeType of len != 12 is not supported."); + return NULL; + } + + mlu = cmsMLUalloc(self ->ContextID, Count); + if (mlu == NULL) return NULL; + + mlu ->UsedEntries = Count; + + SizeOfHeader = 12 * Count + sizeof(_cmsTagBase); + LargestPosition = 0; + + for (i=0; i < Count; i++) { + + if (!_cmsReadUInt16Number(io, &mlu ->Entries[i].Language)) goto Error; + if (!_cmsReadUInt16Number(io, &mlu ->Entries[i].Country)) goto Error; + + // Now deal with Len and offset. + if (!_cmsReadUInt32Number(io, &Len)) goto Error; + if (!_cmsReadUInt32Number(io, &Offset)) goto Error; + + // Offset MUST be even because it indexes a block of utf16 chars. + // Tricky profiles that uses odd positions will not work anyway + // because the whole utf16 block is previously converted to wchar_t + // and sizeof this type may be of 4 bytes. On Linux systems, for example. + if (Offset & 1) goto Error; + + // Check for overflow + if (Offset < (SizeOfHeader + 8)) goto Error; + if (((Offset + Len) < Len) || ((Offset + Len) > SizeOfTag + 8)) goto Error; + + // True begin of the string + BeginOfThisString = Offset - SizeOfHeader - 8; + + // Adjust to wchar_t elements + mlu ->Entries[i].Len = (Len * sizeof(wchar_t)) / sizeof(cmsUInt16Number); + mlu ->Entries[i].StrW = (BeginOfThisString * sizeof(wchar_t)) / sizeof(cmsUInt16Number); + + // To guess maximum size, add offset + len + EndOfThisString = BeginOfThisString + Len; + if (EndOfThisString > LargestPosition) + LargestPosition = EndOfThisString; + } + + // Now read the remaining of tag and fill all strings. Subtract the directory + SizeOfTag = (LargestPosition * sizeof(wchar_t)) / sizeof(cmsUInt16Number); + if (SizeOfTag == 0) + { + Block = NULL; + } + else + { + // Make sure this is an even utf16 size. + if (SizeOfTag & 1) goto Error; + + Block = (wchar_t*) _cmsCalloc(self ->ContextID, 1, SizeOfTag); + if (Block == NULL) goto Error; + + NumOfWchar = SizeOfTag / sizeof(wchar_t); + if (!_cmsReadWCharArray(io, NumOfWchar, Block)) { + _cmsFree(self->ContextID, Block); + goto Error; + } + } + + mlu ->MemPool = Block; + mlu ->PoolSize = SizeOfTag; + mlu ->PoolUsed = SizeOfTag; + + *nItems = 1; + return (void*) mlu; + +Error: + if (mlu) cmsMLUfree(mlu); + return NULL; +} + +static +cmsBool Type_MLU_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) +{ + cmsMLU* mlu =(cmsMLU*) Ptr; + cmsUInt32Number HeaderSize; + cmsUInt32Number Len, Offset; + cmsUInt32Number i; + + if (Ptr == NULL) { + + // Empty placeholder + if (!_cmsWriteUInt32Number(io, 0)) return FALSE; + if (!_cmsWriteUInt32Number(io, 12)) return FALSE; + return TRUE; + } + + if (!_cmsWriteUInt32Number(io, mlu ->UsedEntries)) return FALSE; + if (!_cmsWriteUInt32Number(io, 12)) return FALSE; + + HeaderSize = 12 * mlu ->UsedEntries + sizeof(_cmsTagBase); + + for (i=0; i < mlu ->UsedEntries; i++) { + + Len = mlu ->Entries[i].Len; + Offset = mlu ->Entries[i].StrW; + + Len = (Len * sizeof(cmsUInt16Number)) / sizeof(wchar_t); + Offset = (Offset * sizeof(cmsUInt16Number)) / sizeof(wchar_t) + HeaderSize + 8; + + if (!_cmsWriteUInt16Number(io, mlu ->Entries[i].Language)) return FALSE; + if (!_cmsWriteUInt16Number(io, mlu ->Entries[i].Country)) return FALSE; + if (!_cmsWriteUInt32Number(io, Len)) return FALSE; + if (!_cmsWriteUInt32Number(io, Offset)) return FALSE; + } + + if (!_cmsWriteWCharArray(io, mlu ->PoolUsed / sizeof(wchar_t), (wchar_t*) mlu ->MemPool)) return FALSE; + + return TRUE; + + cmsUNUSED_PARAMETER(nItems); + cmsUNUSED_PARAMETER(self); +} + + +static +void* Type_MLU_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) +{ + return (void*) cmsMLUdup((cmsMLU*) Ptr); + + cmsUNUSED_PARAMETER(n); + cmsUNUSED_PARAMETER(self); +} + +static +void Type_MLU_Free(struct _cms_typehandler_struct* self, void* Ptr) +{ + cmsMLUfree((cmsMLU*) Ptr); + return; + + cmsUNUSED_PARAMETER(self); +} + + +// ******************************************************************************** +// Type cmsSigLut8Type +// ******************************************************************************** + +// Decide which LUT type to use on writing +static +cmsTagTypeSignature DecideLUTtypeA2B(cmsFloat64Number ICCVersion, const void *Data) +{ + cmsPipeline* Lut = (cmsPipeline*) Data; + + if (ICCVersion < 4.0) { + if (Lut ->SaveAs8Bits) return cmsSigLut8Type; + return cmsSigLut16Type; + } + else { + return cmsSigLutAtoBType; + } +} + +static +cmsTagTypeSignature DecideLUTtypeB2A(cmsFloat64Number ICCVersion, const void *Data) +{ + cmsPipeline* Lut = (cmsPipeline*) Data; + + if (ICCVersion < 4.0) { + if (Lut ->SaveAs8Bits) return cmsSigLut8Type; + return cmsSigLut16Type; + } + else { + return cmsSigLutBtoAType; + } +} + +/* +This structure represents a colour transform using tables of 8-bit precision. +This type contains four processing elements: a 3 by 3 matrix (which shall be +the identity matrix unless the input colour space is XYZ), a set of one dimensional +input tables, a multidimensional lookup table, and a set of one dimensional output +tables. Data is processed using these elements via the following sequence: +(matrix) -> (1d input tables) -> (multidimensional lookup table - CLUT) -> (1d output tables) + +Byte Position Field Length (bytes) Content Encoded as... +8 1 Number of Input Channels (i) uInt8Number +9 1 Number of Output Channels (o) uInt8Number +10 1 Number of CLUT grid points (identical for each side) (g) uInt8Number +11 1 Reserved for padding (fill with 00h) + +12..15 4 Encoded e00 parameter s15Fixed16Number +*/ + + +// Read 8 bit tables as gamma functions +static +cmsBool Read8bitTables(cmsContext ContextID, cmsIOHANDLER* io, cmsPipeline* lut, cmsUInt32Number nChannels) +{ + cmsUInt8Number* Temp = NULL; + cmsUInt32Number i, j; + cmsToneCurve* Tables[cmsMAXCHANNELS]; + + if (nChannels > cmsMAXCHANNELS) return FALSE; + if (nChannels <= 0) return FALSE; + + memset(Tables, 0, sizeof(Tables)); + + Temp = (cmsUInt8Number*) _cmsMalloc(ContextID, 256); + if (Temp == NULL) return FALSE; + + for (i=0; i < nChannels; i++) { + Tables[i] = cmsBuildTabulatedToneCurve16(ContextID, 256, NULL); + if (Tables[i] == NULL) goto Error; + } + + for (i=0; i < nChannels; i++) { + + if (io ->Read(io, Temp, 256, 1) != 1) goto Error; + + for (j=0; j < 256; j++) + Tables[i]->Table16[j] = (cmsUInt16Number) FROM_8_TO_16(Temp[j]); + } + + _cmsFree(ContextID, Temp); + Temp = NULL; + + if (!cmsPipelineInsertStage(lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, nChannels, Tables))) + goto Error; + + for (i=0; i < nChannels; i++) + cmsFreeToneCurve(Tables[i]); + + return TRUE; + +Error: + for (i=0; i < nChannels; i++) { + if (Tables[i]) cmsFreeToneCurve(Tables[i]); + } + + if (Temp) _cmsFree(ContextID, Temp); + return FALSE; +} + + +static +cmsBool Write8bitTables(cmsContext ContextID, cmsIOHANDLER* io, cmsUInt32Number n, _cmsStageToneCurvesData* Tables) +{ + int j; + cmsUInt32Number i; + cmsUInt8Number val; + + for (i=0; i < n; i++) { + + if (Tables) { + + // Usual case of identity curves + if ((Tables ->TheCurves[i]->nEntries == 2) && + (Tables->TheCurves[i]->Table16[0] == 0) && + (Tables->TheCurves[i]->Table16[1] == 65535)) { + + for (j=0; j < 256; j++) { + if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) j)) return FALSE; + } + } + else + if (Tables ->TheCurves[i]->nEntries != 256) { + cmsSignalError(ContextID, cmsERROR_RANGE, "LUT8 needs 256 entries on prelinearization"); + return FALSE; + } + else + for (j=0; j < 256; j++) { + + val = (cmsUInt8Number) FROM_16_TO_8(Tables->TheCurves[i]->Table16[j]); + + if (!_cmsWriteUInt8Number(io, val)) return FALSE; + } + } + } + return TRUE; +} + + +// Check overflow +static +cmsUInt32Number uipow(cmsUInt32Number n, cmsUInt32Number a, cmsUInt32Number b) +{ + cmsUInt32Number rv = 1, rc; + + if (a == 0) return 0; + if (n == 0) return 0; + + for (; b > 0; b--) { + + rv *= a; + + // Check for overflow + if (rv > UINT_MAX / a) return (cmsUInt32Number) -1; + + } + + rc = rv * n; + + if (rv != rc / n) return (cmsUInt32Number) -1; + return rc; +} + + +// That will create a MPE LUT with Matrix, pre tables, CLUT and post tables. +// 8 bit lut may be scaled easily to v4 PCS, but we need also to properly adjust +// PCS on BToAxx tags and AtoB if abstract. We need to fix input direction. + +static +void *Type_LUT8_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) +{ + cmsUInt8Number InputChannels, OutputChannels, CLUTpoints; + cmsUInt8Number* Temp = NULL; + cmsPipeline* NewLUT = NULL; + cmsUInt32Number nTabSize, i; + cmsFloat64Number Matrix[3*3]; + + *nItems = 0; + + if (!_cmsReadUInt8Number(io, &InputChannels)) goto Error; + if (!_cmsReadUInt8Number(io, &OutputChannels)) goto Error; + if (!_cmsReadUInt8Number(io, &CLUTpoints)) goto Error; + + if (CLUTpoints == 1) goto Error; // Impossible value, 0 for no CLUT and then 2 at least + + // Padding + if (!_cmsReadUInt8Number(io, NULL)) goto Error; + + // Do some checking + if (InputChannels == 0 || InputChannels > cmsMAXCHANNELS) goto Error; + if (OutputChannels == 0 || OutputChannels > cmsMAXCHANNELS) goto Error; + + // Allocates an empty Pipeline + NewLUT = cmsPipelineAlloc(self ->ContextID, InputChannels, OutputChannels); + if (NewLUT == NULL) goto Error; + + // Read the Matrix + if (!_cmsRead15Fixed16Number(io, &Matrix[0])) goto Error; + if (!_cmsRead15Fixed16Number(io, &Matrix[1])) goto Error; + if (!_cmsRead15Fixed16Number(io, &Matrix[2])) goto Error; + if (!_cmsRead15Fixed16Number(io, &Matrix[3])) goto Error; + if (!_cmsRead15Fixed16Number(io, &Matrix[4])) goto Error; + if (!_cmsRead15Fixed16Number(io, &Matrix[5])) goto Error; + if (!_cmsRead15Fixed16Number(io, &Matrix[6])) goto Error; + if (!_cmsRead15Fixed16Number(io, &Matrix[7])) goto Error; + if (!_cmsRead15Fixed16Number(io, &Matrix[8])) goto Error; + + + // Only operates if not identity... + if ((InputChannels == 3) && !_cmsMAT3isIdentity((cmsMAT3*) Matrix)) { + + if (!cmsPipelineInsertStage(NewLUT, cmsAT_BEGIN, cmsStageAllocMatrix(self ->ContextID, 3, 3, Matrix, NULL))) + goto Error; + } + + // Get input tables + if (!Read8bitTables(self ->ContextID, io, NewLUT, InputChannels)) goto Error; + + // Get 3D CLUT. Check the overflow.... + nTabSize = uipow(OutputChannels, CLUTpoints, InputChannels); + if (nTabSize == (cmsUInt32Number) -1) goto Error; + if (nTabSize > 0) { + + cmsUInt16Number *PtrW, *T; + + PtrW = T = (cmsUInt16Number*) _cmsCalloc(self ->ContextID, nTabSize, sizeof(cmsUInt16Number)); + if (T == NULL) goto Error; + + Temp = (cmsUInt8Number*) _cmsMalloc(self ->ContextID, nTabSize); + if (Temp == NULL) { + _cmsFree(self ->ContextID, T); + goto Error; + } + + if (io ->Read(io, Temp, nTabSize, 1) != 1) { + _cmsFree(self ->ContextID, T); + _cmsFree(self ->ContextID, Temp); + goto Error; + } + + for (i = 0; i < nTabSize; i++) { + + *PtrW++ = FROM_8_TO_16(Temp[i]); + } + _cmsFree(self ->ContextID, Temp); + Temp = NULL; + + if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, cmsStageAllocCLut16bit(self ->ContextID, CLUTpoints, InputChannels, OutputChannels, T))) { + _cmsFree(self ->ContextID, T); + goto Error; + } + _cmsFree(self ->ContextID, T); + } + + + // Get output tables + if (!Read8bitTables(self ->ContextID, io, NewLUT, OutputChannels)) goto Error; + + *nItems = 1; + return NewLUT; + +Error: + if (NewLUT != NULL) cmsPipelineFree(NewLUT); + return NULL; + + cmsUNUSED_PARAMETER(SizeOfTag); +} + +// We only allow a specific MPE structure: Matrix plus prelin, plus clut, plus post-lin. +static +cmsBool Type_LUT8_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) +{ + cmsUInt32Number j, nTabSize, i; + cmsUInt8Number val; + cmsPipeline* NewLUT = (cmsPipeline*) Ptr; + cmsStage* mpe; + _cmsStageToneCurvesData* PreMPE = NULL, *PostMPE = NULL; + _cmsStageMatrixData* MatMPE = NULL; + _cmsStageCLutData* clut = NULL; + cmsUInt32Number clutPoints; + + // Disassemble the LUT into components. + mpe = NewLUT -> Elements; + + if (mpe == NULL) { // Should never be empty. Corrupted? + cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, "empty LUT8 is not supported"); + return FALSE; + } + + if (mpe ->Type == cmsSigMatrixElemType) { + + if (mpe->InputChannels != 3 || mpe->OutputChannels != 3) return FALSE; + MatMPE = (_cmsStageMatrixData*) mpe ->Data; + mpe = mpe -> Next; + } + + if (mpe != NULL && mpe ->Type == cmsSigCurveSetElemType) { + PreMPE = (_cmsStageToneCurvesData*) mpe ->Data; + mpe = mpe -> Next; + } + + if (mpe != NULL && mpe ->Type == cmsSigCLutElemType) { + clut = (_cmsStageCLutData*) mpe -> Data; + mpe = mpe ->Next; + } + + if (mpe != NULL && mpe ->Type == cmsSigCurveSetElemType) { + PostMPE = (_cmsStageToneCurvesData*) mpe ->Data; + mpe = mpe -> Next; + } + + // That should be all + if (mpe != NULL) { + cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, "LUT is not suitable to be saved as LUT8"); + return FALSE; + } + + if (clut == NULL) + clutPoints = 0; + else { + // Lut8 only allows same CLUT points in all dimensions + clutPoints = clut->Params->nSamples[0]; + for (i = 1; i < cmsPipelineInputChannels(NewLUT); i++) { + if (clut->Params->nSamples[i] != clutPoints) { + cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, "LUT with different samples per dimension not suitable to be saved as LUT16"); + return FALSE; + } + } + } + + if (!_cmsWriteUInt8Number(io, (cmsUInt8Number)cmsPipelineInputChannels(NewLUT))) return FALSE; + if (!_cmsWriteUInt8Number(io, (cmsUInt8Number)cmsPipelineOutputChannels(NewLUT))) return FALSE; + if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) clutPoints)) return FALSE; + if (!_cmsWriteUInt8Number(io, 0)) return FALSE; // Padding + + if (MatMPE != NULL) { + + for (i = 0; i < 9; i++) + { + if (!_cmsWrite15Fixed16Number(io, MatMPE->Double[i])) return FALSE; + } + } + else { + + if (!_cmsWrite15Fixed16Number(io, 1)) return FALSE; + if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE; + if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE; + if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE; + if (!_cmsWrite15Fixed16Number(io, 1)) return FALSE; + if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE; + if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE; + if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE; + if (!_cmsWrite15Fixed16Number(io, 1)) return FALSE; + } + + // The prelinearization table + if (!Write8bitTables(self ->ContextID, io, NewLUT ->InputChannels, PreMPE)) return FALSE; + + nTabSize = uipow(NewLUT->OutputChannels, clutPoints, NewLUT ->InputChannels); + if (nTabSize == (cmsUInt32Number) -1) return FALSE; + if (nTabSize > 0) { + + // The 3D CLUT. + if (clut != NULL) { + + for (j=0; j < nTabSize; j++) { + + val = (cmsUInt8Number) FROM_16_TO_8(clut ->Tab.T[j]); + if (!_cmsWriteUInt8Number(io, val)) return FALSE; + } + } + } + + // The postlinearization table + if (!Write8bitTables(self ->ContextID, io, NewLUT ->OutputChannels, PostMPE)) return FALSE; + + return TRUE; + + cmsUNUSED_PARAMETER(nItems); +} + + +static +void* Type_LUT8_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) +{ + return (void*) cmsPipelineDup((cmsPipeline*) Ptr); + + cmsUNUSED_PARAMETER(n); + cmsUNUSED_PARAMETER(self); +} + +static +void Type_LUT8_Free(struct _cms_typehandler_struct* self, void* Ptr) +{ + cmsPipelineFree((cmsPipeline*) Ptr); + return; + + cmsUNUSED_PARAMETER(self); +} + +// ******************************************************************************** +// Type cmsSigLut16Type +// ******************************************************************************** + +// Read 16 bit tables as gamma functions +static +cmsBool Read16bitTables(cmsContext ContextID, cmsIOHANDLER* io, cmsPipeline* lut, + cmsUInt32Number nChannels, cmsUInt32Number nEntries) +{ + cmsUInt32Number i; + cmsToneCurve* Tables[cmsMAXCHANNELS]; + + // Maybe an empty table? (this is a lcms extension) + if (nEntries <= 0) return TRUE; + + // Check for malicious profiles + if (nEntries < 2) return FALSE; + if (nChannels > cmsMAXCHANNELS) return FALSE; + + // Init table to zero + memset(Tables, 0, sizeof(Tables)); + + for (i=0; i < nChannels; i++) { + + Tables[i] = cmsBuildTabulatedToneCurve16(ContextID, nEntries, NULL); + if (Tables[i] == NULL) goto Error; + + if (!_cmsReadUInt16Array(io, nEntries, Tables[i]->Table16)) goto Error; + } + + + // Add the table (which may certainly be an identity, but this is up to the optimizer, not the reading code) + if (!cmsPipelineInsertStage(lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, nChannels, Tables))) + goto Error; + + for (i=0; i < nChannels; i++) + cmsFreeToneCurve(Tables[i]); + + return TRUE; + +Error: + for (i=0; i < nChannels; i++) { + if (Tables[i]) cmsFreeToneCurve(Tables[i]); + } + + return FALSE; +} + +static +cmsBool Write16bitTables(cmsContext ContextID, cmsIOHANDLER* io, _cmsStageToneCurvesData* Tables) +{ + cmsUInt32Number j; + cmsUInt32Number i; + cmsUInt16Number val; + cmsUInt32Number nEntries; + + _cmsAssert(Tables != NULL); + + for (i=0; i < Tables ->nCurves; i++) { + + nEntries = Tables->TheCurves[i]->nEntries; + + for (j=0; j < nEntries; j++) { + + val = Tables->TheCurves[i]->Table16[j]; + if (!_cmsWriteUInt16Number(io, val)) return FALSE; + } + } + return TRUE; + + cmsUNUSED_PARAMETER(ContextID); +} + +static +void *Type_LUT16_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) +{ + cmsUInt8Number InputChannels, OutputChannels, CLUTpoints; + cmsPipeline* NewLUT = NULL; + cmsUInt32Number nTabSize; + cmsFloat64Number Matrix[3*3]; + cmsUInt16Number InputEntries, OutputEntries; + + *nItems = 0; + + if (!_cmsReadUInt8Number(io, &InputChannels)) return NULL; + if (!_cmsReadUInt8Number(io, &OutputChannels)) return NULL; + if (!_cmsReadUInt8Number(io, &CLUTpoints)) return NULL; // 255 maximum + + // Padding + if (!_cmsReadUInt8Number(io, NULL)) return NULL; + + // Do some checking + if (InputChannels == 0 || InputChannels > cmsMAXCHANNELS) goto Error; + if (OutputChannels == 0 || OutputChannels > cmsMAXCHANNELS) goto Error; + + // Allocates an empty LUT + NewLUT = cmsPipelineAlloc(self ->ContextID, InputChannels, OutputChannels); + if (NewLUT == NULL) goto Error; + + // Read the Matrix + if (!_cmsRead15Fixed16Number(io, &Matrix[0])) goto Error; + if (!_cmsRead15Fixed16Number(io, &Matrix[1])) goto Error; + if (!_cmsRead15Fixed16Number(io, &Matrix[2])) goto Error; + if (!_cmsRead15Fixed16Number(io, &Matrix[3])) goto Error; + if (!_cmsRead15Fixed16Number(io, &Matrix[4])) goto Error; + if (!_cmsRead15Fixed16Number(io, &Matrix[5])) goto Error; + if (!_cmsRead15Fixed16Number(io, &Matrix[6])) goto Error; + if (!_cmsRead15Fixed16Number(io, &Matrix[7])) goto Error; + if (!_cmsRead15Fixed16Number(io, &Matrix[8])) goto Error; + + + // Only operates on 3 channels + if ((InputChannels == 3) && !_cmsMAT3isIdentity((cmsMAT3*) Matrix)) { + + if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, cmsStageAllocMatrix(self ->ContextID, 3, 3, Matrix, NULL))) + goto Error; + } + + if (!_cmsReadUInt16Number(io, &InputEntries)) goto Error; + if (!_cmsReadUInt16Number(io, &OutputEntries)) goto Error; + + if (InputEntries > 0x7FFF || OutputEntries > 0x7FFF) goto Error; + if (CLUTpoints == 1) goto Error; // Impossible value, 0 for no CLUT and then 2 at least + + // Get input tables + if (!Read16bitTables(self ->ContextID, io, NewLUT, InputChannels, InputEntries)) goto Error; + + // Get 3D CLUT + nTabSize = uipow(OutputChannels, CLUTpoints, InputChannels); + if (nTabSize == (cmsUInt32Number) -1) goto Error; + if (nTabSize > 0) { + + cmsUInt16Number *T; + + T = (cmsUInt16Number*) _cmsCalloc(self ->ContextID, nTabSize, sizeof(cmsUInt16Number)); + if (T == NULL) goto Error; + + if (!_cmsReadUInt16Array(io, nTabSize, T)) { + _cmsFree(self ->ContextID, T); + goto Error; + } + + if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, cmsStageAllocCLut16bit(self ->ContextID, CLUTpoints, InputChannels, OutputChannels, T))) { + _cmsFree(self ->ContextID, T); + goto Error; + } + _cmsFree(self ->ContextID, T); + } + + + // Get output tables + if (!Read16bitTables(self ->ContextID, io, NewLUT, OutputChannels, OutputEntries)) goto Error; + + *nItems = 1; + return NewLUT; + +Error: + if (NewLUT != NULL) cmsPipelineFree(NewLUT); + return NULL; + + cmsUNUSED_PARAMETER(SizeOfTag); +} + +// We only allow some specific MPE structures: Matrix plus prelin, plus clut, plus post-lin. +// Some empty defaults are created for missing parts + +static +cmsBool Type_LUT16_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) +{ + cmsUInt32Number nTabSize; + cmsPipeline* NewLUT = (cmsPipeline*) Ptr; + cmsStage* mpe; + _cmsStageToneCurvesData* PreMPE = NULL, *PostMPE = NULL; + _cmsStageMatrixData* MatMPE = NULL; + _cmsStageCLutData* clut = NULL; + cmsUInt32Number i, InputChannels, OutputChannels, clutPoints; + + // Disassemble the LUT into components. + mpe = NewLUT -> Elements; + if (mpe != NULL && mpe ->Type == cmsSigMatrixElemType) { + + MatMPE = (_cmsStageMatrixData*) mpe ->Data; + if (mpe->InputChannels != 3 || mpe->OutputChannels != 3) return FALSE; + mpe = mpe -> Next; + } + + + if (mpe != NULL && mpe ->Type == cmsSigCurveSetElemType) { + PreMPE = (_cmsStageToneCurvesData*) mpe ->Data; + mpe = mpe -> Next; + } + + if (mpe != NULL && mpe ->Type == cmsSigCLutElemType) { + clut = (_cmsStageCLutData*) mpe -> Data; + mpe = mpe ->Next; + } + + if (mpe != NULL && mpe ->Type == cmsSigCurveSetElemType) { + PostMPE = (_cmsStageToneCurvesData*) mpe ->Data; + mpe = mpe -> Next; + } + + // That should be all + if (mpe != NULL) { + cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, "LUT is not suitable to be saved as LUT16"); + return FALSE; + } + + InputChannels = cmsPipelineInputChannels(NewLUT); + OutputChannels = cmsPipelineOutputChannels(NewLUT); + + if (clut == NULL) + clutPoints = 0; + else { + // Lut16 only allows same CLUT points in all dimensions + clutPoints = clut->Params->nSamples[0]; + for (i = 1; i < InputChannels; i++) { + if (clut->Params->nSamples[i] != clutPoints) { + cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, "LUT with different samples per dimension not suitable to be saved as LUT16"); + return FALSE; + } + } + } + + if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) InputChannels)) return FALSE; + if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) OutputChannels)) return FALSE; + if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) clutPoints)) return FALSE; + if (!_cmsWriteUInt8Number(io, 0)) return FALSE; // Padding + + if (MatMPE != NULL) { + + for (i = 0; i < 9; i++) + { + if (!_cmsWrite15Fixed16Number(io, MatMPE->Double[i])) return FALSE; + } + + } + else { + + if (!_cmsWrite15Fixed16Number(io, 1)) return FALSE; + if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE; + if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE; + if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE; + if (!_cmsWrite15Fixed16Number(io, 1)) return FALSE; + if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE; + if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE; + if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE; + if (!_cmsWrite15Fixed16Number(io, 1)) return FALSE; + } + + + if (PreMPE != NULL) { + if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) PreMPE ->TheCurves[0]->nEntries)) return FALSE; + } else { + if (!_cmsWriteUInt16Number(io, 2)) return FALSE; + } + + if (PostMPE != NULL) { + if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) PostMPE ->TheCurves[0]->nEntries)) return FALSE; + } else { + if (!_cmsWriteUInt16Number(io, 2)) return FALSE; + + } + + // The prelinearization table + + if (PreMPE != NULL) { + if (!Write16bitTables(self ->ContextID, io, PreMPE)) return FALSE; + } + else { + for (i=0; i < InputChannels; i++) { + + if (!_cmsWriteUInt16Number(io, 0)) return FALSE; + if (!_cmsWriteUInt16Number(io, 0xffff)) return FALSE; + } + } + + nTabSize = uipow(OutputChannels, clutPoints, InputChannels); + if (nTabSize == (cmsUInt32Number) -1) return FALSE; + if (nTabSize > 0) { + // The 3D CLUT. + if (clut != NULL) { + if (!_cmsWriteUInt16Array(io, nTabSize, clut->Tab.T)) return FALSE; + } + } + + // The postlinearization table + if (PostMPE != NULL) { + if (!Write16bitTables(self ->ContextID, io, PostMPE)) return FALSE; + } + else { + for (i=0; i < OutputChannels; i++) { + + if (!_cmsWriteUInt16Number(io, 0)) return FALSE; + if (!_cmsWriteUInt16Number(io, 0xffff)) return FALSE; + } + } + + return TRUE; + + cmsUNUSED_PARAMETER(nItems); +} + +static +void* Type_LUT16_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) +{ + return (void*) cmsPipelineDup((cmsPipeline*) Ptr); + + cmsUNUSED_PARAMETER(n); + cmsUNUSED_PARAMETER(self); +} + +static +void Type_LUT16_Free(struct _cms_typehandler_struct* self, void* Ptr) +{ + cmsPipelineFree((cmsPipeline*) Ptr); + return; + + cmsUNUSED_PARAMETER(self); +} + + +// ******************************************************************************** +// Type cmsSigLutAToBType +// ******************************************************************************** + + +// V4 stuff. Read matrix for LutAtoB and LutBtoA + +static +cmsStage* ReadMatrix(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number Offset) +{ + cmsFloat64Number dMat[3*3]; + cmsFloat64Number dOff[3]; + cmsStage* Mat; + + // Go to address + if (!io -> Seek(io, Offset)) return NULL; + + // Read the Matrix + if (!_cmsRead15Fixed16Number(io, &dMat[0])) return NULL; + if (!_cmsRead15Fixed16Number(io, &dMat[1])) return NULL; + if (!_cmsRead15Fixed16Number(io, &dMat[2])) return NULL; + if (!_cmsRead15Fixed16Number(io, &dMat[3])) return NULL; + if (!_cmsRead15Fixed16Number(io, &dMat[4])) return NULL; + if (!_cmsRead15Fixed16Number(io, &dMat[5])) return NULL; + if (!_cmsRead15Fixed16Number(io, &dMat[6])) return NULL; + if (!_cmsRead15Fixed16Number(io, &dMat[7])) return NULL; + if (!_cmsRead15Fixed16Number(io, &dMat[8])) return NULL; + + if (!_cmsRead15Fixed16Number(io, &dOff[0])) return NULL; + if (!_cmsRead15Fixed16Number(io, &dOff[1])) return NULL; + if (!_cmsRead15Fixed16Number(io, &dOff[2])) return NULL; + + Mat = cmsStageAllocMatrix(self ->ContextID, 3, 3, dMat, dOff); + + return Mat; +} + + + + +// V4 stuff. Read CLUT part for LutAtoB and LutBtoA + +static +cmsStage* ReadCLUT(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, + cmsUInt32Number Offset, cmsUInt32Number InputChannels, cmsUInt32Number OutputChannels) +{ + cmsUInt8Number gridPoints8[cmsMAXCHANNELS]; // Number of grid points in each dimension. + cmsUInt32Number GridPoints[cmsMAXCHANNELS], i; + cmsUInt8Number Precision; + cmsStage* CLUT; + _cmsStageCLutData* Data; + + if (!io -> Seek(io, Offset)) return NULL; + if (io -> Read(io, gridPoints8, cmsMAXCHANNELS, 1) != 1) return NULL; + + + for (i=0; i < cmsMAXCHANNELS; i++) { + + if (gridPoints8[i] == 1) return NULL; // Impossible value, 0 for no CLUT and then 2 at least + GridPoints[i] = gridPoints8[i]; + } + + if (!_cmsReadUInt8Number(io, &Precision)) return NULL; + + if (!_cmsReadUInt8Number(io, NULL)) return NULL; + if (!_cmsReadUInt8Number(io, NULL)) return NULL; + if (!_cmsReadUInt8Number(io, NULL)) return NULL; + + CLUT = cmsStageAllocCLut16bitGranular(self ->ContextID, GridPoints, InputChannels, OutputChannels, NULL); + if (CLUT == NULL) return NULL; + + Data = (_cmsStageCLutData*) CLUT ->Data; + + // Precision can be 1 or 2 bytes + if (Precision == 1) { + + cmsUInt8Number v; + + for (i=0; i < Data ->nEntries; i++) { + + if (io ->Read(io, &v, sizeof(cmsUInt8Number), 1) != 1) { + cmsStageFree(CLUT); + return NULL; + } + Data ->Tab.T[i] = FROM_8_TO_16(v); + } + + } + else + if (Precision == 2) { + + if (!_cmsReadUInt16Array(io, Data->nEntries, Data ->Tab.T)) { + cmsStageFree(CLUT); + return NULL; + } + } + else { + cmsStageFree(CLUT); + cmsSignalError(self ->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unknown precision of '%d'", Precision); + return NULL; + } + + return CLUT; +} + +static +cmsToneCurve* ReadEmbeddedCurve(struct _cms_typehandler_struct* self, cmsIOHANDLER* io) +{ + cmsTagTypeSignature BaseType; + cmsUInt32Number nItems; + + BaseType = _cmsReadTypeBase(io); + switch (BaseType) { + + case cmsSigCurveType: + return (cmsToneCurve*) Type_Curve_Read(self, io, &nItems, 0); + + case cmsSigParametricCurveType: + return (cmsToneCurve*) Type_ParametricCurve_Read(self, io, &nItems, 0); + + default: + { + char String[5]; + + _cmsTagSignature2String(String, (cmsTagSignature) BaseType); + cmsSignalError(self ->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unknown curve type '%s'", String); + } + return NULL; + } +} + + +// Read a set of curves from specific offset +static +cmsStage* ReadSetOfCurves(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number Offset, cmsUInt32Number nCurves) +{ + cmsToneCurve* Curves[cmsMAXCHANNELS]; + cmsUInt32Number i; + cmsStage* Lin = NULL; + + if (nCurves > cmsMAXCHANNELS) return FALSE; + + if (!io -> Seek(io, Offset)) return FALSE; + + for (i=0; i < nCurves; i++) + Curves[i] = NULL; + + for (i=0; i < nCurves; i++) { + + Curves[i] = ReadEmbeddedCurve(self, io); + if (Curves[i] == NULL) goto Error; + if (!_cmsReadAlignment(io)) goto Error; + + } + + Lin = cmsStageAllocToneCurves(self ->ContextID, nCurves, Curves); + +Error: + for (i=0; i < nCurves; i++) + cmsFreeToneCurve(Curves[i]); + + return Lin; +} + + +// LutAtoB type + +// This structure represents a colour transform. The type contains up to five processing +// elements which are stored in the AtoBTag tag in the following order: a set of one +// dimensional curves, a 3 by 3 matrix with offset terms, a set of one dimensional curves, +// a multidimensional lookup table, and a set of one dimensional output curves. +// Data are processed using these elements via the following sequence: +// +//("A" curves) -> (multidimensional lookup table - CLUT) -> ("M" curves) -> (matrix) -> ("B" curves). +// +/* +It is possible to use any or all of these processing elements. At least one processing element +must be included.Only the following combinations are allowed: + +B +M - Matrix - B +A - CLUT - B +A - CLUT - M - Matrix - B + +*/ + +static +void* Type_LUTA2B_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) +{ + cmsUInt32Number BaseOffset; + cmsUInt8Number inputChan; // Number of input channels + cmsUInt8Number outputChan; // Number of output channels + cmsUInt32Number offsetB; // Offset to first "B" curve + cmsUInt32Number offsetMat; // Offset to matrix + cmsUInt32Number offsetM; // Offset to first "M" curve + cmsUInt32Number offsetC; // Offset to CLUT + cmsUInt32Number offsetA; // Offset to first "A" curve + cmsPipeline* NewLUT = NULL; + + + BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase); + + if (!_cmsReadUInt8Number(io, &inputChan)) return NULL; + if (!_cmsReadUInt8Number(io, &outputChan)) return NULL; + + if (!_cmsReadUInt16Number(io, NULL)) return NULL; + + if (!_cmsReadUInt32Number(io, &offsetB)) return NULL; + if (!_cmsReadUInt32Number(io, &offsetMat)) return NULL; + if (!_cmsReadUInt32Number(io, &offsetM)) return NULL; + if (!_cmsReadUInt32Number(io, &offsetC)) return NULL; + if (!_cmsReadUInt32Number(io, &offsetA)) return NULL; + + if (inputChan == 0 || inputChan >= cmsMAXCHANNELS) return NULL; + if (outputChan == 0 || outputChan >= cmsMAXCHANNELS) return NULL; + + // Allocates an empty LUT + NewLUT = cmsPipelineAlloc(self ->ContextID, inputChan, outputChan); + if (NewLUT == NULL) return NULL; + + if (offsetA!= 0) { + if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadSetOfCurves(self, io, BaseOffset + offsetA, inputChan))) + goto Error; + } + + if (offsetC != 0) { + if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadCLUT(self, io, BaseOffset + offsetC, inputChan, outputChan))) + goto Error; + } + + if (offsetM != 0) { + if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadSetOfCurves(self, io, BaseOffset + offsetM, outputChan))) + goto Error; + } + + if (offsetMat != 0) { + if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadMatrix(self, io, BaseOffset + offsetMat))) + goto Error; + } + + if (offsetB != 0) { + if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadSetOfCurves(self, io, BaseOffset + offsetB, outputChan))) + goto Error; + } + + *nItems = 1; + return NewLUT; +Error: + cmsPipelineFree(NewLUT); + return NULL; + + cmsUNUSED_PARAMETER(SizeOfTag); +} + +// Write a set of curves +static +cmsBool WriteMatrix(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsStage* mpe) +{ + cmsUInt32Number i, n; + + _cmsStageMatrixData* m = (_cmsStageMatrixData*) mpe -> Data; + + n = mpe->InputChannels * mpe->OutputChannels; + + // Write the Matrix + for (i = 0; i < n; i++) + { + if (!_cmsWrite15Fixed16Number(io, m->Double[i])) return FALSE; + } + + if (m->Offset != NULL) { + + for (i = 0; i < mpe->OutputChannels; i++) + { + if (!_cmsWrite15Fixed16Number(io, m->Offset[i])) return FALSE; + } + } + else { + for (i = 0; i < mpe->OutputChannels; i++) + { + if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE; + } + } + + + return TRUE; + + cmsUNUSED_PARAMETER(self); +} + + +// Write a set of curves +static +cmsBool WriteSetOfCurves(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsTagTypeSignature Type, cmsStage* mpe) +{ + cmsUInt32Number i, n; + cmsTagTypeSignature CurrentType; + cmsToneCurve** Curves; + + + n = cmsStageOutputChannels(mpe); + Curves = _cmsStageGetPtrToCurveSet(mpe); + + for (i=0; i < n; i++) { + + // If this is a table-based curve, use curve type even on V4 + CurrentType = Type; + + if ((Curves[i] ->nSegments == 0) || // 16 bits tabulated + ((Curves[i]->nSegments == 3) && (Curves[i] ->Segments[1].Type == 0)) ) // Floating-point tabulated + CurrentType = cmsSigCurveType; + else + if (Curves[i] ->Segments[0].Type < 0) + CurrentType = cmsSigCurveType; + + if (!_cmsWriteTypeBase(io, CurrentType)) return FALSE; + + switch (CurrentType) { + + case cmsSigCurveType: + if (!Type_Curve_Write(self, io, Curves[i], 1)) return FALSE; + break; + + case cmsSigParametricCurveType: + if (!Type_ParametricCurve_Write(self, io, Curves[i], 1)) return FALSE; + break; + + default: + { + char String[5]; + + _cmsTagSignature2String(String, (cmsTagSignature) Type); + cmsSignalError(self ->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unknown curve type '%s'", String); + } + return FALSE; + } + + if (!_cmsWriteAlignment(io)) return FALSE; + } + + + return TRUE; +} + + +static +cmsBool WriteCLUT(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt8Number Precision, cmsStage* mpe) +{ + cmsUInt8Number gridPoints[cmsMAXCHANNELS]; // Number of grid points in each dimension. + cmsUInt32Number i; + _cmsStageCLutData* CLUT = ( _cmsStageCLutData*) mpe -> Data; + + if (CLUT ->HasFloatValues) { + cmsSignalError(self ->ContextID, cmsERROR_NOT_SUITABLE, "Cannot save floating point data, CLUT are 8 or 16 bit only"); + return FALSE; + } + + memset(gridPoints, 0, sizeof(gridPoints)); + for (i=0; i < (cmsUInt32Number) CLUT ->Params ->nInputs; i++) + gridPoints[i] = (cmsUInt8Number) CLUT ->Params ->nSamples[i]; + + if (!io -> Write(io, cmsMAXCHANNELS*sizeof(cmsUInt8Number), gridPoints)) return FALSE; + + if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) Precision)) return FALSE; + if (!_cmsWriteUInt8Number(io, 0)) return FALSE; + if (!_cmsWriteUInt8Number(io, 0)) return FALSE; + if (!_cmsWriteUInt8Number(io, 0)) return FALSE; + + // Precision can be 1 or 2 bytes + if (Precision == 1) { + + for (i=0; i < CLUT->nEntries; i++) { + + if (!_cmsWriteUInt8Number(io, FROM_16_TO_8(CLUT->Tab.T[i]))) return FALSE; + } + } + else + if (Precision == 2) { + + if (!_cmsWriteUInt16Array(io, CLUT->nEntries, CLUT ->Tab.T)) return FALSE; + } + else { + cmsSignalError(self ->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unknown precision of '%d'", Precision); + return FALSE; + } + + if (!_cmsWriteAlignment(io)) return FALSE; + + return TRUE; +} + + + + +static +cmsBool Type_LUTA2B_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) +{ + cmsPipeline* Lut = (cmsPipeline*) Ptr; + cmsUInt32Number inputChan, outputChan; + cmsStage *A = NULL, *B = NULL, *M = NULL; + cmsStage * Matrix = NULL; + cmsStage * CLUT = NULL; + cmsUInt32Number offsetB = 0, offsetMat = 0, offsetM = 0, offsetC = 0, offsetA = 0; + cmsUInt32Number BaseOffset, DirectoryPos, CurrentPos; + + // Get the base for all offsets + BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase); + + if (Lut ->Elements != NULL) + if (!cmsPipelineCheckAndRetreiveStages(Lut, 1, cmsSigCurveSetElemType, &B)) + if (!cmsPipelineCheckAndRetreiveStages(Lut, 3, cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType, &M, &Matrix, &B)) + if (!cmsPipelineCheckAndRetreiveStages(Lut, 3, cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType, &A, &CLUT, &B)) + if (!cmsPipelineCheckAndRetreiveStages(Lut, 5, cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType, + cmsSigMatrixElemType, cmsSigCurveSetElemType, &A, &CLUT, &M, &Matrix, &B)) { + + cmsSignalError(self->ContextID, cmsERROR_NOT_SUITABLE, "LUT is not suitable to be saved as LutAToB"); + return FALSE; + } + + // Get input, output channels + inputChan = cmsPipelineInputChannels(Lut); + outputChan = cmsPipelineOutputChannels(Lut); + + // Write channel count + if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) inputChan)) return FALSE; + if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) outputChan)) return FALSE; + if (!_cmsWriteUInt16Number(io, 0)) return FALSE; + + // Keep directory to be filled latter + DirectoryPos = io ->Tell(io); + + // Write the directory + if (!_cmsWriteUInt32Number(io, 0)) return FALSE; + if (!_cmsWriteUInt32Number(io, 0)) return FALSE; + if (!_cmsWriteUInt32Number(io, 0)) return FALSE; + if (!_cmsWriteUInt32Number(io, 0)) return FALSE; + if (!_cmsWriteUInt32Number(io, 0)) return FALSE; + + if (A != NULL) { + + offsetA = io ->Tell(io) - BaseOffset; + if (!WriteSetOfCurves(self, io, cmsSigParametricCurveType, A)) return FALSE; + } + + if (CLUT != NULL) { + offsetC = io ->Tell(io) - BaseOffset; + if (!WriteCLUT(self, io, (Lut ->SaveAs8Bits ? 1U : 2U), CLUT)) return FALSE; + + } + if (M != NULL) { + + offsetM = io ->Tell(io) - BaseOffset; + if (!WriteSetOfCurves(self, io, cmsSigParametricCurveType, M)) return FALSE; + } + + if (Matrix != NULL) { + offsetMat = io ->Tell(io) - BaseOffset; + if (!WriteMatrix(self, io, Matrix)) return FALSE; + } + + if (B != NULL) { + + offsetB = io ->Tell(io) - BaseOffset; + if (!WriteSetOfCurves(self, io, cmsSigParametricCurveType, B)) return FALSE; + } + + CurrentPos = io ->Tell(io); + + if (!io ->Seek(io, DirectoryPos)) return FALSE; + + if (!_cmsWriteUInt32Number(io, offsetB)) return FALSE; + if (!_cmsWriteUInt32Number(io, offsetMat)) return FALSE; + if (!_cmsWriteUInt32Number(io, offsetM)) return FALSE; + if (!_cmsWriteUInt32Number(io, offsetC)) return FALSE; + if (!_cmsWriteUInt32Number(io, offsetA)) return FALSE; + + if (!io ->Seek(io, CurrentPos)) return FALSE; + + return TRUE; + + cmsUNUSED_PARAMETER(nItems); +} + + +static +void* Type_LUTA2B_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) +{ + return (void*) cmsPipelineDup((cmsPipeline*) Ptr); + + cmsUNUSED_PARAMETER(n); + cmsUNUSED_PARAMETER(self); +} + +static +void Type_LUTA2B_Free(struct _cms_typehandler_struct* self, void* Ptr) +{ + cmsPipelineFree((cmsPipeline*) Ptr); + return; + + cmsUNUSED_PARAMETER(self); +} + + +// LutBToA type + +static +void* Type_LUTB2A_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) +{ + cmsUInt8Number inputChan; // Number of input channels + cmsUInt8Number outputChan; // Number of output channels + cmsUInt32Number BaseOffset; // Actual position in file + cmsUInt32Number offsetB; // Offset to first "B" curve + cmsUInt32Number offsetMat; // Offset to matrix + cmsUInt32Number offsetM; // Offset to first "M" curve + cmsUInt32Number offsetC; // Offset to CLUT + cmsUInt32Number offsetA; // Offset to first "A" curve + cmsPipeline* NewLUT = NULL; + + + BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase); + + if (!_cmsReadUInt8Number(io, &inputChan)) return NULL; + if (!_cmsReadUInt8Number(io, &outputChan)) return NULL; + + if (inputChan == 0 || inputChan >= cmsMAXCHANNELS) return NULL; + if (outputChan == 0 || outputChan >= cmsMAXCHANNELS) return NULL; + + // Padding + if (!_cmsReadUInt16Number(io, NULL)) return NULL; + + if (!_cmsReadUInt32Number(io, &offsetB)) return NULL; + if (!_cmsReadUInt32Number(io, &offsetMat)) return NULL; + if (!_cmsReadUInt32Number(io, &offsetM)) return NULL; + if (!_cmsReadUInt32Number(io, &offsetC)) return NULL; + if (!_cmsReadUInt32Number(io, &offsetA)) return NULL; + + // Allocates an empty LUT + NewLUT = cmsPipelineAlloc(self ->ContextID, inputChan, outputChan); + if (NewLUT == NULL) return NULL; + + if (offsetB != 0) { + if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadSetOfCurves(self, io, BaseOffset + offsetB, inputChan))) + goto Error; + } + + if (offsetMat != 0) { + if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadMatrix(self, io, BaseOffset + offsetMat))) + goto Error; + } + + if (offsetM != 0) { + if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadSetOfCurves(self, io, BaseOffset + offsetM, inputChan))) + goto Error; + } + + if (offsetC != 0) { + if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadCLUT(self, io, BaseOffset + offsetC, inputChan, outputChan))) + goto Error; + } + + if (offsetA!= 0) { + if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadSetOfCurves(self, io, BaseOffset + offsetA, outputChan))) + goto Error; + } + + *nItems = 1; + return NewLUT; +Error: + cmsPipelineFree(NewLUT); + return NULL; + + cmsUNUSED_PARAMETER(SizeOfTag); +} + + +/* +B +B - Matrix - M +B - CLUT - A +B - Matrix - M - CLUT - A +*/ + +static +cmsBool Type_LUTB2A_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) +{ + cmsPipeline* Lut = (cmsPipeline*) Ptr; + cmsUInt32Number inputChan, outputChan; + cmsStage *A = NULL, *B = NULL, *M = NULL; + cmsStage *Matrix = NULL; + cmsStage *CLUT = NULL; + cmsUInt32Number offsetB = 0, offsetMat = 0, offsetM = 0, offsetC = 0, offsetA = 0; + cmsUInt32Number BaseOffset, DirectoryPos, CurrentPos; + + + BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase); + + if (!cmsPipelineCheckAndRetreiveStages(Lut, 1, cmsSigCurveSetElemType, &B)) + if (!cmsPipelineCheckAndRetreiveStages(Lut, 3, cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType, &B, &Matrix, &M)) + if (!cmsPipelineCheckAndRetreiveStages(Lut, 3, cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType, &B, &CLUT, &A)) + if (!cmsPipelineCheckAndRetreiveStages(Lut, 5, cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType, + cmsSigCLutElemType, cmsSigCurveSetElemType, &B, &Matrix, &M, &CLUT, &A)) { + cmsSignalError(self->ContextID, cmsERROR_NOT_SUITABLE, "LUT is not suitable to be saved as LutBToA"); + return FALSE; + } + + inputChan = cmsPipelineInputChannels(Lut); + outputChan = cmsPipelineOutputChannels(Lut); + + if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) inputChan)) return FALSE; + if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) outputChan)) return FALSE; + if (!_cmsWriteUInt16Number(io, 0)) return FALSE; + + DirectoryPos = io ->Tell(io); + + if (!_cmsWriteUInt32Number(io, 0)) return FALSE; + if (!_cmsWriteUInt32Number(io, 0)) return FALSE; + if (!_cmsWriteUInt32Number(io, 0)) return FALSE; + if (!_cmsWriteUInt32Number(io, 0)) return FALSE; + if (!_cmsWriteUInt32Number(io, 0)) return FALSE; + + if (A != NULL) { + + offsetA = io ->Tell(io) - BaseOffset; + if (!WriteSetOfCurves(self, io, cmsSigParametricCurveType, A)) return FALSE; + } + + if (CLUT != NULL) { + offsetC = io ->Tell(io) - BaseOffset; + if (!WriteCLUT(self, io, (Lut ->SaveAs8Bits ? 1U : 2U), CLUT)) return FALSE; + + } + if (M != NULL) { + + offsetM = io ->Tell(io) - BaseOffset; + if (!WriteSetOfCurves(self, io, cmsSigParametricCurveType, M)) return FALSE; + } + + if (Matrix != NULL) { + offsetMat = io ->Tell(io) - BaseOffset; + if (!WriteMatrix(self, io, Matrix)) return FALSE; + } + + if (B != NULL) { + + offsetB = io ->Tell(io) - BaseOffset; + if (!WriteSetOfCurves(self, io, cmsSigParametricCurveType, B)) return FALSE; + } + + CurrentPos = io ->Tell(io); + + if (!io ->Seek(io, DirectoryPos)) return FALSE; + + if (!_cmsWriteUInt32Number(io, offsetB)) return FALSE; + if (!_cmsWriteUInt32Number(io, offsetMat)) return FALSE; + if (!_cmsWriteUInt32Number(io, offsetM)) return FALSE; + if (!_cmsWriteUInt32Number(io, offsetC)) return FALSE; + if (!_cmsWriteUInt32Number(io, offsetA)) return FALSE; + + if (!io ->Seek(io, CurrentPos)) return FALSE; + + return TRUE; + + cmsUNUSED_PARAMETER(nItems); +} + + + +static +void* Type_LUTB2A_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) +{ + return (void*) cmsPipelineDup((cmsPipeline*) Ptr); + + cmsUNUSED_PARAMETER(n); + cmsUNUSED_PARAMETER(self); +} + +static +void Type_LUTB2A_Free(struct _cms_typehandler_struct* self, void* Ptr) +{ + cmsPipelineFree((cmsPipeline*) Ptr); + return; + + cmsUNUSED_PARAMETER(self); +} + + + +// ******************************************************************************** +// Type cmsSigColorantTableType +// ******************************************************************************** +/* +The purpose of this tag is to identify the colorants used in the profile by a +unique name and set of XYZ or L*a*b* values to give the colorant an unambiguous +value. The first colorant listed is the colorant of the first device channel of +a lut tag. The second colorant listed is the colorant of the second device channel +of a lut tag, and so on. +*/ + +static +void *Type_ColorantTable_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) +{ + cmsUInt32Number i, Count; + cmsNAMEDCOLORLIST* List; + char Name[34]; + cmsUInt16Number PCS[3]; + + + if (!_cmsReadUInt32Number(io, &Count)) return NULL; + + if (Count > cmsMAXCHANNELS) { + cmsSignalError(self->ContextID, cmsERROR_RANGE, "Too many colorants '%d'", Count); + return NULL; + } + + List = cmsAllocNamedColorList(self ->ContextID, Count, 0, "", ""); + if (List == NULL) + return NULL; + + for (i=0; i < Count; i++) { + + if (io ->Read(io, Name, 32, 1) != 1) goto Error; + Name[32] = 0; + + if (!_cmsReadUInt16Array(io, 3, PCS)) goto Error; + + if (!cmsAppendNamedColor(List, Name, PCS, NULL)) goto Error; + + } + + *nItems = 1; + return List; + +Error: + *nItems = 0; + cmsFreeNamedColorList(List); + return NULL; + + cmsUNUSED_PARAMETER(SizeOfTag); +} + + + +// Saves a colorant table. It is using the named color structure for simplicity sake +static +cmsBool Type_ColorantTable_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) +{ + cmsNAMEDCOLORLIST* NamedColorList = (cmsNAMEDCOLORLIST*) Ptr; + cmsUInt32Number i, nColors; + + nColors = cmsNamedColorCount(NamedColorList); + + if (!_cmsWriteUInt32Number(io, nColors)) return FALSE; + + for (i=0; i < nColors; i++) { + + char root[cmsMAX_PATH]; + cmsUInt16Number PCS[3]; + + memset(root, 0, sizeof(root)); + + if (!cmsNamedColorInfo(NamedColorList, i, root, NULL, NULL, PCS, NULL)) return 0; + root[32] = 0; + + if (!io ->Write(io, 32, root)) return FALSE; + if (!_cmsWriteUInt16Array(io, 3, PCS)) return FALSE; + } + + return TRUE; + + cmsUNUSED_PARAMETER(nItems); + cmsUNUSED_PARAMETER(self); +} + + +static +void* Type_ColorantTable_Dup(struct _cms_typehandler_struct* self, const void* Ptr, cmsUInt32Number n) +{ + cmsNAMEDCOLORLIST* nc = (cmsNAMEDCOLORLIST*) Ptr; + return (void*) cmsDupNamedColorList(nc); + + cmsUNUSED_PARAMETER(n); + cmsUNUSED_PARAMETER(self); +} + + +static +void Type_ColorantTable_Free(struct _cms_typehandler_struct* self, void* Ptr) +{ + cmsFreeNamedColorList((cmsNAMEDCOLORLIST*) Ptr); + return; + + cmsUNUSED_PARAMETER(self); +} + + +// ******************************************************************************** +// Type cmsSigNamedColor2Type +// ******************************************************************************** +// +//The namedColor2Type is a count value and array of structures that provide color +//coordinates for 7-bit ASCII color names. For each named color, a PCS and optional +//device representation of the color are given. Both representations are 16-bit values. +//The device representation corresponds to the header's 'color space of data' field. +//This representation should be consistent with the 'number of device components' +//field in the namedColor2Type. If this field is 0, device coordinates are not provided. +//The PCS representation corresponds to the header's PCS field. The PCS representation +//is always provided. Color names are fixed-length, 32-byte fields including null +//termination. In order to maintain maximum portability, it is strongly recommended +//that special characters of the 7-bit ASCII set not be used. + +static +void *Type_NamedColor_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) +{ + cmsUInt32Number vendorFlag; // Bottom 16 bits for ICC use + cmsUInt32Number count; // Count of named colors + cmsUInt32Number nDeviceCoords; // Num of device coordinates + char prefix[32]; // Prefix for each color name + char suffix[32]; // Suffix for each color name + cmsNAMEDCOLORLIST* v; + cmsUInt32Number i; + + + *nItems = 0; + if (!_cmsReadUInt32Number(io, &vendorFlag)) return NULL; + if (!_cmsReadUInt32Number(io, &count)) return NULL; + if (!_cmsReadUInt32Number(io, &nDeviceCoords)) return NULL; + + if (io -> Read(io, prefix, 32, 1) != 1) return NULL; + if (io -> Read(io, suffix, 32, 1) != 1) return NULL; + + prefix[31] = suffix[31] = 0; + + v = cmsAllocNamedColorList(self ->ContextID, count, nDeviceCoords, prefix, suffix); + if (v == NULL) { + cmsSignalError(self->ContextID, cmsERROR_RANGE, "Too many named colors '%d'", count); + return NULL; + } + + if (nDeviceCoords > cmsMAXCHANNELS) { + cmsSignalError(self->ContextID, cmsERROR_RANGE, "Too many device coordinates '%d'", nDeviceCoords); + goto Error; + } + for (i=0; i < count; i++) { + + cmsUInt16Number PCS[3]; + cmsUInt16Number Colorant[cmsMAXCHANNELS]; + char Root[33]; + + memset(Colorant, 0, sizeof(Colorant)); + if (io -> Read(io, Root, 32, 1) != 1) goto Error; + Root[32] = 0; // To prevent exploits + + if (!_cmsReadUInt16Array(io, 3, PCS)) goto Error; + if (!_cmsReadUInt16Array(io, nDeviceCoords, Colorant)) goto Error; + + if (!cmsAppendNamedColor(v, Root, PCS, Colorant)) goto Error; + } + + *nItems = 1; + return (void*) v ; + +Error: + cmsFreeNamedColorList(v); + return NULL; + + cmsUNUSED_PARAMETER(SizeOfTag); +} + + +// Saves a named color list into a named color profile +static +cmsBool Type_NamedColor_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) +{ + cmsNAMEDCOLORLIST* NamedColorList = (cmsNAMEDCOLORLIST*) Ptr; + char prefix[33]; // Prefix for each color name + char suffix[33]; // Suffix for each color name + cmsUInt32Number i, nColors; + + nColors = cmsNamedColorCount(NamedColorList); + + if (!_cmsWriteUInt32Number(io, 0)) return FALSE; + if (!_cmsWriteUInt32Number(io, nColors)) return FALSE; + if (!_cmsWriteUInt32Number(io, NamedColorList ->ColorantCount)) return FALSE; + + memcpy(prefix, (const char*) NamedColorList->Prefix, sizeof(prefix)); + memcpy(suffix, (const char*) NamedColorList->Suffix, sizeof(suffix)); + + suffix[32] = prefix[32] = 0; + + if (!io ->Write(io, 32, prefix)) return FALSE; + if (!io ->Write(io, 32, suffix)) return FALSE; + + for (i=0; i < nColors; i++) { + + cmsUInt16Number PCS[3]; + cmsUInt16Number Colorant[cmsMAXCHANNELS]; + char Root[cmsMAX_PATH]; + + memset(Root, 0, sizeof(Root)); + memset(PCS, 0, sizeof(PCS)); + memset(Colorant, 0, sizeof(Colorant)); + + if (!cmsNamedColorInfo(NamedColorList, i, Root, NULL, NULL, PCS, Colorant)) return 0; + Root[32] = 0; + if (!io ->Write(io, 32 , Root)) return FALSE; + if (!_cmsWriteUInt16Array(io, 3, PCS)) return FALSE; + if (!_cmsWriteUInt16Array(io, NamedColorList ->ColorantCount, Colorant)) return FALSE; + } + + return TRUE; + + cmsUNUSED_PARAMETER(nItems); + cmsUNUSED_PARAMETER(self); +} + +static +void* Type_NamedColor_Dup(struct _cms_typehandler_struct* self, const void* Ptr, cmsUInt32Number n) +{ + cmsNAMEDCOLORLIST* nc = (cmsNAMEDCOLORLIST*) Ptr; + + return (void*) cmsDupNamedColorList(nc); + + cmsUNUSED_PARAMETER(n); + cmsUNUSED_PARAMETER(self); +} + + +static +void Type_NamedColor_Free(struct _cms_typehandler_struct* self, void* Ptr) +{ + cmsFreeNamedColorList((cmsNAMEDCOLORLIST*) Ptr); + return; + + cmsUNUSED_PARAMETER(self); +} + + +// ******************************************************************************** +// Type cmsSigProfileSequenceDescType +// ******************************************************************************** + +// This type is an array of structures, each of which contains information from the +// header fields and tags from the original profiles which were combined to create +// the final profile. The order of the structures is the order in which the profiles +// were combined and includes a structure for the final profile. This provides a +// description of the profile sequence from source to destination, +// typically used with the DeviceLink profile. + +static +cmsBool ReadEmbeddedText(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsMLU** mlu, cmsUInt32Number SizeOfTag) +{ + cmsTagTypeSignature BaseType; + cmsUInt32Number nItems; + + BaseType = _cmsReadTypeBase(io); + + switch (BaseType) { + + case cmsSigTextType: + if (*mlu) cmsMLUfree(*mlu); + *mlu = (cmsMLU*)Type_Text_Read(self, io, &nItems, SizeOfTag); + return (*mlu != NULL); + + case cmsSigTextDescriptionType: + if (*mlu) cmsMLUfree(*mlu); + *mlu = (cmsMLU*) Type_Text_Description_Read(self, io, &nItems, SizeOfTag); + return (*mlu != NULL); + + /* + TBD: Size is needed for MLU, and we have no idea on which is the available size + */ + + case cmsSigMultiLocalizedUnicodeType: + if (*mlu) cmsMLUfree(*mlu); + *mlu = (cmsMLU*) Type_MLU_Read(self, io, &nItems, SizeOfTag); + return (*mlu != NULL); + + default: return FALSE; + } +} + + +static +void *Type_ProfileSequenceDesc_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) +{ + cmsSEQ* OutSeq; + cmsUInt32Number i, Count; + + *nItems = 0; + + if (!_cmsReadUInt32Number(io, &Count)) return NULL; + + if (SizeOfTag < sizeof(cmsUInt32Number)) return NULL; + SizeOfTag -= sizeof(cmsUInt32Number); + + + OutSeq = cmsAllocProfileSequenceDescription(self ->ContextID, Count); + if (OutSeq == NULL) return NULL; + + OutSeq ->n = Count; + + // Get structures as well + + for (i=0; i < Count; i++) { + + cmsPSEQDESC* sec = &OutSeq -> seq[i]; + + if (!_cmsReadUInt32Number(io, &sec ->deviceMfg)) goto Error; + if (SizeOfTag < sizeof(cmsUInt32Number)) goto Error; + SizeOfTag -= sizeof(cmsUInt32Number); + + if (!_cmsReadUInt32Number(io, &sec ->deviceModel)) goto Error; + if (SizeOfTag < sizeof(cmsUInt32Number)) goto Error; + SizeOfTag -= sizeof(cmsUInt32Number); + + if (!_cmsReadUInt64Number(io, &sec ->attributes)) goto Error; + if (SizeOfTag < sizeof(cmsUInt64Number)) goto Error; + SizeOfTag -= sizeof(cmsUInt64Number); + + if (!_cmsReadUInt32Number(io, (cmsUInt32Number *)&sec ->technology)) goto Error; + if (SizeOfTag < sizeof(cmsUInt32Number)) goto Error; + SizeOfTag -= sizeof(cmsUInt32Number); + + if (!ReadEmbeddedText(self, io, &sec ->Manufacturer, SizeOfTag)) goto Error; + if (!ReadEmbeddedText(self, io, &sec ->Model, SizeOfTag)) goto Error; + } + + *nItems = 1; + return OutSeq; + +Error: + cmsFreeProfileSequenceDescription(OutSeq); + return NULL; +} + + +// Aux--Embed a text description type. It can be of type text description or multilocalized unicode +// and it depends of the version number passed on cmsTagDescriptor structure instead of stack +static +cmsBool SaveDescription(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsMLU* Text) +{ + if (self ->ICCVersion < 0x4000000) { + + if (!_cmsWriteTypeBase(io, cmsSigTextDescriptionType)) return FALSE; + return Type_Text_Description_Write(self, io, Text, 1); + } + else { + if (!_cmsWriteTypeBase(io, cmsSigMultiLocalizedUnicodeType)) return FALSE; + return Type_MLU_Write(self, io, Text, 1); + } +} + + +static +cmsBool Type_ProfileSequenceDesc_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) +{ + cmsSEQ* Seq = (cmsSEQ*) Ptr; + cmsUInt32Number i; + + if (!_cmsWriteUInt32Number(io, Seq->n)) return FALSE; + + for (i=0; i < Seq ->n; i++) { + + cmsPSEQDESC* sec = &Seq -> seq[i]; + + if (!_cmsWriteUInt32Number(io, sec ->deviceMfg)) return FALSE; + if (!_cmsWriteUInt32Number(io, sec ->deviceModel)) return FALSE; + if (!_cmsWriteUInt64Number(io, &sec ->attributes)) return FALSE; + if (!_cmsWriteUInt32Number(io, sec ->technology)) return FALSE; + + if (!SaveDescription(self, io, sec ->Manufacturer)) return FALSE; + if (!SaveDescription(self, io, sec ->Model)) return FALSE; + } + + return TRUE; + + cmsUNUSED_PARAMETER(nItems); +} + + +static +void* Type_ProfileSequenceDesc_Dup(struct _cms_typehandler_struct* self, const void* Ptr, cmsUInt32Number n) +{ + return (void*) cmsDupProfileSequenceDescription((cmsSEQ*) Ptr); + + cmsUNUSED_PARAMETER(n); + cmsUNUSED_PARAMETER(self); +} + +static +void Type_ProfileSequenceDesc_Free(struct _cms_typehandler_struct* self, void* Ptr) +{ + cmsFreeProfileSequenceDescription((cmsSEQ*) Ptr); + return; + + cmsUNUSED_PARAMETER(self); +} + + +// ******************************************************************************** +// Type cmsSigProfileSequenceIdType +// ******************************************************************************** +/* +In certain workflows using ICC Device Link Profiles, it is necessary to identify the +original profiles that were combined to create the Device Link Profile. +This type is an array of structures, each of which contains information for +identification of a profile used in a sequence +*/ + + +static +cmsBool ReadSeqID(struct _cms_typehandler_struct* self, + cmsIOHANDLER* io, + void* Cargo, + cmsUInt32Number n, + cmsUInt32Number SizeOfTag) +{ + cmsSEQ* OutSeq = (cmsSEQ*) Cargo; + cmsPSEQDESC* seq = &OutSeq ->seq[n]; + + if (io -> Read(io, seq ->ProfileID.ID8, 16, 1) != 1) return FALSE; + if (!ReadEmbeddedText(self, io, &seq ->Description, SizeOfTag)) return FALSE; + + return TRUE; +} + + + +static +void *Type_ProfileSequenceId_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) +{ + cmsSEQ* OutSeq; + cmsUInt32Number Count; + cmsUInt32Number BaseOffset; + + *nItems = 0; + + // Get actual position as a basis for element offsets + BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase); + + // Get table count + if (!_cmsReadUInt32Number(io, &Count)) return NULL; + + // Allocate an empty structure + OutSeq = cmsAllocProfileSequenceDescription(self ->ContextID, Count); + if (OutSeq == NULL) return NULL; + + + // Read the position table + if (!ReadPositionTable(self, io, Count, BaseOffset, OutSeq, ReadSeqID)) { + + cmsFreeProfileSequenceDescription(OutSeq); + return NULL; + } + + // Success + *nItems = 1; + return OutSeq; + + cmsUNUSED_PARAMETER(SizeOfTag); +} + + +static +cmsBool WriteSeqID(struct _cms_typehandler_struct* self, + cmsIOHANDLER* io, + void* Cargo, + cmsUInt32Number n, + cmsUInt32Number SizeOfTag) +{ + cmsSEQ* Seq = (cmsSEQ*) Cargo; + + if (!io ->Write(io, 16, Seq ->seq[n].ProfileID.ID8)) return FALSE; + + // Store here the MLU + if (!SaveDescription(self, io, Seq ->seq[n].Description)) return FALSE; + + return TRUE; + + cmsUNUSED_PARAMETER(SizeOfTag); +} + +static +cmsBool Type_ProfileSequenceId_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) +{ + cmsSEQ* Seq = (cmsSEQ*) Ptr; + cmsUInt32Number BaseOffset; + + // Keep the base offset + BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase); + + // This is the table count + if (!_cmsWriteUInt32Number(io, Seq ->n)) return FALSE; + + // This is the position table and content + if (!WritePositionTable(self, io, 0, Seq ->n, BaseOffset, Seq, WriteSeqID)) return FALSE; + + return TRUE; + + cmsUNUSED_PARAMETER(nItems); +} + +static +void* Type_ProfileSequenceId_Dup(struct _cms_typehandler_struct* self, const void* Ptr, cmsUInt32Number n) +{ + return (void*) cmsDupProfileSequenceDescription((cmsSEQ*) Ptr); + + cmsUNUSED_PARAMETER(n); + cmsUNUSED_PARAMETER(self); +} + +static +void Type_ProfileSequenceId_Free(struct _cms_typehandler_struct* self, void* Ptr) +{ + cmsFreeProfileSequenceDescription((cmsSEQ*) Ptr); + return; + + cmsUNUSED_PARAMETER(self); +} + + +// ******************************************************************************** +// Type cmsSigUcrBgType +// ******************************************************************************** +/* +This type contains curves representing the under color removal and black +generation and a text string which is a general description of the method used +for the ucr/bg. +*/ + +static +void *Type_UcrBg_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) +{ + cmsUcrBg* n = (cmsUcrBg*) _cmsMallocZero(self ->ContextID, sizeof(cmsUcrBg)); + cmsUInt32Number CountUcr, CountBg; + cmsInt32Number SignedSizeOfTag = (cmsInt32Number)SizeOfTag; + char* ASCIIString; + + *nItems = 0; + if (n == NULL) return NULL; + + // First curve is Under color removal + + if (SignedSizeOfTag < (cmsInt32Number) sizeof(cmsUInt32Number)) return NULL; + if (!_cmsReadUInt32Number(io, &CountUcr)) return NULL; + SignedSizeOfTag -= sizeof(cmsUInt32Number); + + n ->Ucr = cmsBuildTabulatedToneCurve16(self ->ContextID, CountUcr, NULL); + if (n ->Ucr == NULL) goto error; + + if (SignedSizeOfTag < (cmsInt32Number)(CountUcr * sizeof(cmsUInt16Number))) goto error; + if (!_cmsReadUInt16Array(io, CountUcr, n ->Ucr->Table16)) goto error; + + SignedSizeOfTag -= CountUcr * sizeof(cmsUInt16Number); + + // Second curve is Black generation + + if (SignedSizeOfTag < (cmsInt32Number)sizeof(cmsUInt32Number)) goto error; + if (!_cmsReadUInt32Number(io, &CountBg)) goto error; + SignedSizeOfTag -= sizeof(cmsUInt32Number); + + n ->Bg = cmsBuildTabulatedToneCurve16(self ->ContextID, CountBg, NULL); + if (n ->Bg == NULL) goto error; + + if (SignedSizeOfTag < (cmsInt32Number) (CountBg * sizeof(cmsUInt16Number))) goto error; + if (!_cmsReadUInt16Array(io, CountBg, n ->Bg->Table16)) goto error; + SignedSizeOfTag -= CountBg * sizeof(cmsUInt16Number); + + if (SignedSizeOfTag < 0 || SignedSizeOfTag > 32000) goto error; + + // Now comes the text. The length is specified by the tag size + n ->Desc = cmsMLUalloc(self ->ContextID, 1); + if (n ->Desc == NULL) goto error; + + ASCIIString = (char*) _cmsMalloc(self ->ContextID, SignedSizeOfTag + 1); + if (io->Read(io, ASCIIString, sizeof(char), SignedSizeOfTag) != (cmsUInt32Number)SignedSizeOfTag) + { + _cmsFree(self->ContextID, ASCIIString); + goto error; + } + + ASCIIString[SignedSizeOfTag] = 0; + cmsMLUsetASCII(n ->Desc, cmsNoLanguage, cmsNoCountry, ASCIIString); + _cmsFree(self ->ContextID, ASCIIString); + + *nItems = 1; + return (void*) n; + +error: + + if (n->Ucr) cmsFreeToneCurve(n->Ucr); + if (n->Bg) cmsFreeToneCurve(n->Bg); + if (n->Desc) cmsMLUfree(n->Desc); + _cmsFree(self->ContextID, n); + *nItems = 0; + return NULL; + +} + +static +cmsBool Type_UcrBg_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) +{ + cmsUcrBg* Value = (cmsUcrBg*) Ptr; + cmsUInt32Number TextSize; + char* Text; + + // First curve is Under color removal + if (!_cmsWriteUInt32Number(io, Value ->Ucr ->nEntries)) return FALSE; + if (!_cmsWriteUInt16Array(io, Value ->Ucr ->nEntries, Value ->Ucr ->Table16)) return FALSE; + + // Then black generation + if (!_cmsWriteUInt32Number(io, Value ->Bg ->nEntries)) return FALSE; + if (!_cmsWriteUInt16Array(io, Value ->Bg ->nEntries, Value ->Bg ->Table16)) return FALSE; + + // Now comes the text. The length is specified by the tag size + TextSize = cmsMLUgetASCII(Value ->Desc, cmsNoLanguage, cmsNoCountry, NULL, 0); + Text = (char*) _cmsMalloc(self ->ContextID, TextSize); + if (cmsMLUgetASCII(Value ->Desc, cmsNoLanguage, cmsNoCountry, Text, TextSize) != TextSize) return FALSE; + + if (!io ->Write(io, TextSize, Text)) return FALSE; + _cmsFree(self ->ContextID, Text); + + return TRUE; + + cmsUNUSED_PARAMETER(nItems); +} + +static +void* Type_UcrBg_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) +{ + cmsUcrBg* Src = (cmsUcrBg*) Ptr; + cmsUcrBg* NewUcrBg = (cmsUcrBg*) _cmsMallocZero(self ->ContextID, sizeof(cmsUcrBg)); + + if (NewUcrBg == NULL) return NULL; + + NewUcrBg ->Bg = cmsDupToneCurve(Src ->Bg); + NewUcrBg ->Ucr = cmsDupToneCurve(Src ->Ucr); + NewUcrBg ->Desc = cmsMLUdup(Src ->Desc); + + return (void*) NewUcrBg; + + cmsUNUSED_PARAMETER(n); +} + +static +void Type_UcrBg_Free(struct _cms_typehandler_struct* self, void *Ptr) +{ + cmsUcrBg* Src = (cmsUcrBg*) Ptr; + + if (Src ->Ucr) cmsFreeToneCurve(Src ->Ucr); + if (Src ->Bg) cmsFreeToneCurve(Src ->Bg); + if (Src ->Desc) cmsMLUfree(Src ->Desc); + + _cmsFree(self ->ContextID, Ptr); +} + +// ******************************************************************************** +// Type cmsSigCrdInfoType +// ******************************************************************************** + +/* +This type contains the PostScript product name to which this profile corresponds +and the names of the companion CRDs. Recall that a single profile can generate +multiple CRDs. It is implemented as a MLU being the language code "PS" and then +country varies for each element: + + nm: PostScript product name + #0: Rendering intent 0 CRD name + #1: Rendering intent 1 CRD name + #2: Rendering intent 2 CRD name + #3: Rendering intent 3 CRD name +*/ + + + +// Auxiliary, read an string specified as count + string +static +cmsBool ReadCountAndString(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsMLU* mlu, cmsUInt32Number* SizeOfTag, const char* Section) +{ + cmsUInt32Number Count; + char* Text; + + if (*SizeOfTag < sizeof(cmsUInt32Number)) return FALSE; + + if (!_cmsReadUInt32Number(io, &Count)) return FALSE; + + if (Count > UINT_MAX - sizeof(cmsUInt32Number)) return FALSE; + if (*SizeOfTag < Count + sizeof(cmsUInt32Number)) return FALSE; + + Text = (char*) _cmsMalloc(self ->ContextID, Count+1); + if (Text == NULL) return FALSE; + + if (io ->Read(io, Text, sizeof(cmsUInt8Number), Count) != Count) { + _cmsFree(self ->ContextID, Text); + return FALSE; + } + + Text[Count] = 0; + + cmsMLUsetASCII(mlu, "PS", Section, Text); + _cmsFree(self ->ContextID, Text); + + *SizeOfTag -= (Count + sizeof(cmsUInt32Number)); + return TRUE; +} + +static +cmsBool WriteCountAndString(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsMLU* mlu, const char* Section) +{ + cmsUInt32Number TextSize; + char* Text; + + TextSize = cmsMLUgetASCII(mlu, "PS", Section, NULL, 0); + Text = (char*) _cmsMalloc(self ->ContextID, TextSize); + + if (!_cmsWriteUInt32Number(io, TextSize)) return FALSE; + + if (cmsMLUgetASCII(mlu, "PS", Section, Text, TextSize) == 0) return FALSE; + + if (!io ->Write(io, TextSize, Text)) return FALSE; + _cmsFree(self ->ContextID, Text); + + return TRUE; +} + +static +void *Type_CrdInfo_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) +{ + cmsMLU* mlu = cmsMLUalloc(self ->ContextID, 5); + + *nItems = 0; + if (!ReadCountAndString(self, io, mlu, &SizeOfTag, "nm")) goto Error; + if (!ReadCountAndString(self, io, mlu, &SizeOfTag, "#0")) goto Error; + if (!ReadCountAndString(self, io, mlu, &SizeOfTag, "#1")) goto Error; + if (!ReadCountAndString(self, io, mlu, &SizeOfTag, "#2")) goto Error; + if (!ReadCountAndString(self, io, mlu, &SizeOfTag, "#3")) goto Error; + + *nItems = 1; + return (void*) mlu; + +Error: + cmsMLUfree(mlu); + return NULL; + +} + +static +cmsBool Type_CrdInfo_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) +{ + + cmsMLU* mlu = (cmsMLU*) Ptr; + + if (!WriteCountAndString(self, io, mlu, "nm")) goto Error; + if (!WriteCountAndString(self, io, mlu, "#0")) goto Error; + if (!WriteCountAndString(self, io, mlu, "#1")) goto Error; + if (!WriteCountAndString(self, io, mlu, "#2")) goto Error; + if (!WriteCountAndString(self, io, mlu, "#3")) goto Error; + + return TRUE; + +Error: + return FALSE; + + cmsUNUSED_PARAMETER(nItems); +} + + +static +void* Type_CrdInfo_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) +{ + return (void*) cmsMLUdup((cmsMLU*) Ptr); + + cmsUNUSED_PARAMETER(n); + cmsUNUSED_PARAMETER(self); +} + +static +void Type_CrdInfo_Free(struct _cms_typehandler_struct* self, void *Ptr) +{ + cmsMLUfree((cmsMLU*) Ptr); + return; + + cmsUNUSED_PARAMETER(self); +} + +// ******************************************************************************** +// Type cmsSigScreeningType +// ******************************************************************************** +// +//The screeningType describes various screening parameters including screen +//frequency, screening angle, and spot shape. + +static +void *Type_Screening_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) +{ + cmsScreening* sc = NULL; + cmsUInt32Number i; + + sc = (cmsScreening*) _cmsMallocZero(self ->ContextID, sizeof(cmsScreening)); + if (sc == NULL) return NULL; + + *nItems = 0; + + if (!_cmsReadUInt32Number(io, &sc ->Flag)) goto Error; + if (!_cmsReadUInt32Number(io, &sc ->nChannels)) goto Error; + + if (sc ->nChannels > cmsMAXCHANNELS - 1) + sc ->nChannels = cmsMAXCHANNELS - 1; + + for (i=0; i < sc ->nChannels; i++) { + + if (!_cmsRead15Fixed16Number(io, &sc ->Channels[i].Frequency)) goto Error; + if (!_cmsRead15Fixed16Number(io, &sc ->Channels[i].ScreenAngle)) goto Error; + if (!_cmsReadUInt32Number(io, &sc ->Channels[i].SpotShape)) goto Error; + } + + + *nItems = 1; + + return (void*) sc; + +Error: + if (sc != NULL) + _cmsFree(self ->ContextID, sc); + + return NULL; + + cmsUNUSED_PARAMETER(SizeOfTag); +} + + +static +cmsBool Type_Screening_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) +{ + cmsScreening* sc = (cmsScreening* ) Ptr; + cmsUInt32Number i; + + if (!_cmsWriteUInt32Number(io, sc ->Flag)) return FALSE; + if (!_cmsWriteUInt32Number(io, sc ->nChannels)) return FALSE; + + for (i=0; i < sc ->nChannels; i++) { + + if (!_cmsWrite15Fixed16Number(io, sc ->Channels[i].Frequency)) return FALSE; + if (!_cmsWrite15Fixed16Number(io, sc ->Channels[i].ScreenAngle)) return FALSE; + if (!_cmsWriteUInt32Number(io, sc ->Channels[i].SpotShape)) return FALSE; + } + + return TRUE; + + cmsUNUSED_PARAMETER(nItems); + cmsUNUSED_PARAMETER(self); +} + + +static +void* Type_Screening_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) +{ + return _cmsDupMem(self ->ContextID, Ptr, sizeof(cmsScreening)); + + cmsUNUSED_PARAMETER(n); +} + + +static +void Type_Screening_Free(struct _cms_typehandler_struct* self, void* Ptr) +{ + _cmsFree(self ->ContextID, Ptr); +} + +// ******************************************************************************** +// Type cmsSigViewingConditionsType +// ******************************************************************************** +// +//This type represents a set of viewing condition parameters including: +//CIE 'absolute' illuminant white point tristimulus values and CIE 'absolute' +//surround tristimulus values. + +static +void *Type_ViewingConditions_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) +{ + cmsICCViewingConditions* vc = NULL; + + vc = (cmsICCViewingConditions*) _cmsMallocZero(self ->ContextID, sizeof(cmsICCViewingConditions)); + if (vc == NULL) return NULL; + + *nItems = 0; + + if (!_cmsReadXYZNumber(io, &vc ->IlluminantXYZ)) goto Error; + if (!_cmsReadXYZNumber(io, &vc ->SurroundXYZ)) goto Error; + if (!_cmsReadUInt32Number(io, &vc ->IlluminantType)) goto Error; + + *nItems = 1; + + return (void*) vc; + +Error: + if (vc != NULL) + _cmsFree(self ->ContextID, vc); + + return NULL; + + cmsUNUSED_PARAMETER(SizeOfTag); +} + + +static +cmsBool Type_ViewingConditions_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) +{ + cmsICCViewingConditions* sc = (cmsICCViewingConditions* ) Ptr; + + if (!_cmsWriteXYZNumber(io, &sc ->IlluminantXYZ)) return FALSE; + if (!_cmsWriteXYZNumber(io, &sc ->SurroundXYZ)) return FALSE; + if (!_cmsWriteUInt32Number(io, sc ->IlluminantType)) return FALSE; + + return TRUE; + + cmsUNUSED_PARAMETER(nItems); + cmsUNUSED_PARAMETER(self); +} + + +static +void* Type_ViewingConditions_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) +{ + return _cmsDupMem(self->ContextID, Ptr, sizeof(cmsICCViewingConditions)); + + cmsUNUSED_PARAMETER(n); +} + + +static +void Type_ViewingConditions_Free(struct _cms_typehandler_struct* self, void* Ptr) +{ + _cmsFree(self ->ContextID, Ptr); +} + + +// ******************************************************************************** +// Type cmsSigMultiProcessElementType +// ******************************************************************************** + + +static +void* GenericMPEdup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) +{ + return (void*) cmsStageDup((cmsStage*) Ptr); + + cmsUNUSED_PARAMETER(n); + cmsUNUSED_PARAMETER(self); +} + +static +void GenericMPEfree(struct _cms_typehandler_struct* self, void *Ptr) +{ + cmsStageFree((cmsStage*) Ptr); + return; + + cmsUNUSED_PARAMETER(self); +} + +// Each curve is stored in one or more curve segments, with break-points specified between curve segments. +// The first curve segment always starts at -Infinity, and the last curve segment always ends at +Infinity. The +// first and last curve segments shall be specified in terms of a formula, whereas the other segments shall be +// specified either in terms of a formula, or by a sampled curve. + + +// Read an embedded segmented curve +static +cmsToneCurve* ReadSegmentedCurve(struct _cms_typehandler_struct* self, cmsIOHANDLER* io) +{ + cmsCurveSegSignature ElementSig; + cmsUInt32Number i, j; + cmsUInt16Number nSegments; + cmsCurveSegment* Segments; + cmsToneCurve* Curve; + cmsFloat32Number PrevBreak = MINUS_INF; // - infinite + + // Take signature and channels for each element. + if (!_cmsReadUInt32Number(io, (cmsUInt32Number*) &ElementSig)) return NULL; + + // That should be a segmented curve + if (ElementSig != cmsSigSegmentedCurve) return NULL; + + if (!_cmsReadUInt32Number(io, NULL)) return NULL; + if (!_cmsReadUInt16Number(io, &nSegments)) return NULL; + if (!_cmsReadUInt16Number(io, NULL)) return NULL; + + if (nSegments < 1) return NULL; + Segments = (cmsCurveSegment*) _cmsCalloc(self ->ContextID, nSegments, sizeof(cmsCurveSegment)); + if (Segments == NULL) return NULL; + + // Read breakpoints + for (i=0; i < (cmsUInt32Number) nSegments - 1; i++) { + + Segments[i].x0 = PrevBreak; + if (!_cmsReadFloat32Number(io, &Segments[i].x1)) goto Error; + PrevBreak = Segments[i].x1; + } + + Segments[nSegments-1].x0 = PrevBreak; + Segments[nSegments-1].x1 = PLUS_INF; // A big cmsFloat32Number number + + // Read segments + for (i=0; i < nSegments; i++) { + + if (!_cmsReadUInt32Number(io, (cmsUInt32Number*) &ElementSig)) goto Error; + if (!_cmsReadUInt32Number(io, NULL)) goto Error; + + switch (ElementSig) { + + case cmsSigFormulaCurveSeg: { + + cmsUInt16Number Type; + cmsUInt32Number ParamsByType[] = { 4, 5, 5 }; + + if (!_cmsReadUInt16Number(io, &Type)) goto Error; + if (!_cmsReadUInt16Number(io, NULL)) goto Error; + + Segments[i].Type = Type + 6; + if (Type > 2) goto Error; + + for (j = 0; j < ParamsByType[Type]; j++) { + + cmsFloat32Number f; + if (!_cmsReadFloat32Number(io, &f)) goto Error; + Segments[i].Params[j] = f; + } + } + break; + + + case cmsSigSampledCurveSeg: { + cmsUInt32Number Count; + + if (!_cmsReadUInt32Number(io, &Count)) goto Error; + + // The first point is implicit in the last stage, we allocate an extra note to be populated latter on + Count++; + Segments[i].nGridPoints = Count; + Segments[i].SampledPoints = (cmsFloat32Number*)_cmsCalloc(self->ContextID, Count, sizeof(cmsFloat32Number)); + if (Segments[i].SampledPoints == NULL) goto Error; + + Segments[i].SampledPoints[0] = 0; + for (j = 1; j < Count; j++) { + if (!_cmsReadFloat32Number(io, &Segments[i].SampledPoints[j])) goto Error; + } + } + break; + + default: + { + char String[5]; + + _cmsTagSignature2String(String, (cmsTagSignature) ElementSig); + cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unknown curve element type '%s' found.", String); + } + goto Error; + + } + } + + Curve = cmsBuildSegmentedToneCurve(self ->ContextID, nSegments, Segments); + + for (i=0; i < nSegments; i++) { + if (Segments[i].SampledPoints) _cmsFree(self ->ContextID, Segments[i].SampledPoints); + } + _cmsFree(self ->ContextID, Segments); + + // Explore for missing implicit points + for (i = 0; i < nSegments; i++) { + + // If sampled curve, fix it + if (Curve->Segments[i].Type == 0) { + + Curve->Segments[i].SampledPoints[0] = cmsEvalToneCurveFloat(Curve, Curve->Segments[i].x0); + } + } + + return Curve; + +Error: + if (Segments) { + for (i=0; i < nSegments; i++) { + if (Segments[i].SampledPoints) _cmsFree(self ->ContextID, Segments[i].SampledPoints); + } + _cmsFree(self ->ContextID, Segments); + } + return NULL; +} + + +static +cmsBool ReadMPECurve(struct _cms_typehandler_struct* self, + cmsIOHANDLER* io, + void* Cargo, + cmsUInt32Number n, + cmsUInt32Number SizeOfTag) +{ + cmsToneCurve** GammaTables = ( cmsToneCurve**) Cargo; + + GammaTables[n] = ReadSegmentedCurve(self, io); + return (GammaTables[n] != NULL); + + cmsUNUSED_PARAMETER(SizeOfTag); +} + +static +void *Type_MPEcurve_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) +{ + cmsStage* mpe = NULL; + cmsUInt16Number InputChans, OutputChans; + cmsUInt32Number i, BaseOffset; + cmsToneCurve** GammaTables; + + *nItems = 0; + + // Get actual position as a basis for element offsets + BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase); + + if (!_cmsReadUInt16Number(io, &InputChans)) return NULL; + if (!_cmsReadUInt16Number(io, &OutputChans)) return NULL; + + if (InputChans != OutputChans) return NULL; + + GammaTables = (cmsToneCurve**) _cmsCalloc(self ->ContextID, InputChans, sizeof(cmsToneCurve*)); + if (GammaTables == NULL) return NULL; + + if (ReadPositionTable(self, io, InputChans, BaseOffset, GammaTables, ReadMPECurve)) { + + mpe = cmsStageAllocToneCurves(self ->ContextID, InputChans, GammaTables); + } + else { + mpe = NULL; + } + + for (i=0; i < InputChans; i++) { + if (GammaTables[i]) cmsFreeToneCurve(GammaTables[i]); + } + + _cmsFree(self ->ContextID, GammaTables); + *nItems = (mpe != NULL) ? 1U : 0; + return mpe; + + cmsUNUSED_PARAMETER(SizeOfTag); +} + + +// Write a single segmented curve. NO CHECK IS PERFORMED ON VALIDITY +static +cmsBool WriteSegmentedCurve(cmsIOHANDLER* io, cmsToneCurve* g) +{ + cmsUInt32Number i, j; + cmsCurveSegment* Segments = g ->Segments; + cmsUInt32Number nSegments = g ->nSegments; + + if (!_cmsWriteUInt32Number(io, cmsSigSegmentedCurve)) goto Error; + if (!_cmsWriteUInt32Number(io, 0)) goto Error; + if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) nSegments)) goto Error; + if (!_cmsWriteUInt16Number(io, 0)) goto Error; + + // Write the break-points + for (i=0; i < nSegments - 1; i++) { + if (!_cmsWriteFloat32Number(io, Segments[i].x1)) goto Error; + } + + // Write the segments + for (i=0; i < g ->nSegments; i++) { + + cmsCurveSegment* ActualSeg = Segments + i; + + if (ActualSeg -> Type == 0) { + + // This is a sampled curve. First point is implicit in the ICC format, but not in our representation + if (!_cmsWriteUInt32Number(io, (cmsUInt32Number) cmsSigSampledCurveSeg)) goto Error; + if (!_cmsWriteUInt32Number(io, 0)) goto Error; + if (!_cmsWriteUInt32Number(io, ActualSeg -> nGridPoints - 1)) goto Error; + + for (j=1; j < g ->Segments[i].nGridPoints; j++) { + if (!_cmsWriteFloat32Number(io, ActualSeg -> SampledPoints[j])) goto Error; + } + + } + else { + int Type; + cmsUInt32Number ParamsByType[] = { 4, 5, 5 }; + + // This is a formula-based + if (!_cmsWriteUInt32Number(io, (cmsUInt32Number) cmsSigFormulaCurveSeg)) goto Error; + if (!_cmsWriteUInt32Number(io, 0)) goto Error; + + // We only allow 1, 2 and 3 as types + Type = ActualSeg ->Type - 6; + if (Type > 2 || Type < 0) goto Error; + + if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) Type)) goto Error; + if (!_cmsWriteUInt16Number(io, 0)) goto Error; + + for (j=0; j < ParamsByType[Type]; j++) { + if (!_cmsWriteFloat32Number(io, (cmsFloat32Number) ActualSeg ->Params[j])) goto Error; + } + } + + // It seems there is no need to align. Code is here, and for safety commented out + // if (!_cmsWriteAlignment(io)) goto Error; + } + + return TRUE; + +Error: + return FALSE; +} + + +static +cmsBool WriteMPECurve(struct _cms_typehandler_struct* self, + cmsIOHANDLER* io, + void* Cargo, + cmsUInt32Number n, + cmsUInt32Number SizeOfTag) +{ + _cmsStageToneCurvesData* Curves = (_cmsStageToneCurvesData*) Cargo; + + return WriteSegmentedCurve(io, Curves ->TheCurves[n]); + + cmsUNUSED_PARAMETER(SizeOfTag); + cmsUNUSED_PARAMETER(self); +} + +// Write a curve, checking first for validity +static +cmsBool Type_MPEcurve_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) +{ + cmsUInt32Number BaseOffset; + cmsStage* mpe = (cmsStage*) Ptr; + _cmsStageToneCurvesData* Curves = (_cmsStageToneCurvesData*) mpe ->Data; + + BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase); + + // Write the header. Since those are curves, input and output channels are same + if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) mpe ->InputChannels)) return FALSE; + if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) mpe ->InputChannels)) return FALSE; + + if (!WritePositionTable(self, io, 0, + mpe ->InputChannels, BaseOffset, Curves, WriteMPECurve)) return FALSE; + + + return TRUE; + + cmsUNUSED_PARAMETER(nItems); +} + + + +// The matrix is organized as an array of PxQ+Q elements, where P is the number of input channels to the +// matrix, and Q is the number of output channels. The matrix elements are each float32Numbers. The array +// is organized as follows: +// array = [e11, e12, ..., e1P, e21, e22, ..., e2P, ..., eQ1, eQ2, ..., eQP, e1, e2, ..., eQ] + +static +void *Type_MPEmatrix_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) +{ + cmsStage* mpe; + cmsUInt16Number InputChans, OutputChans; + cmsUInt32Number nElems, i; + cmsFloat64Number* Matrix; + cmsFloat64Number* Offsets; + + if (!_cmsReadUInt16Number(io, &InputChans)) return NULL; + if (!_cmsReadUInt16Number(io, &OutputChans)) return NULL; + + + // Input and output chans may be ANY (up to 0xffff), + // but we choose to limit to 16 channels for now + if (InputChans >= cmsMAXCHANNELS) return NULL; + if (OutputChans >= cmsMAXCHANNELS) return NULL; + + nElems = (cmsUInt32Number) InputChans * OutputChans; + + Matrix = (cmsFloat64Number*) _cmsCalloc(self ->ContextID, nElems, sizeof(cmsFloat64Number)); + if (Matrix == NULL) return NULL; + + Offsets = (cmsFloat64Number*) _cmsCalloc(self ->ContextID, OutputChans, sizeof(cmsFloat64Number)); + if (Offsets == NULL) { + + _cmsFree(self ->ContextID, Matrix); + return NULL; + } + + for (i=0; i < nElems; i++) { + + cmsFloat32Number v; + + if (!_cmsReadFloat32Number(io, &v)) { + _cmsFree(self ->ContextID, Matrix); + _cmsFree(self ->ContextID, Offsets); + return NULL; + } + Matrix[i] = v; + } + + + for (i=0; i < OutputChans; i++) { + + cmsFloat32Number v; + + if (!_cmsReadFloat32Number(io, &v)) { + _cmsFree(self ->ContextID, Matrix); + _cmsFree(self ->ContextID, Offsets); + return NULL; + } + Offsets[i] = v; + } + + + mpe = cmsStageAllocMatrix(self ->ContextID, OutputChans, InputChans, Matrix, Offsets); + _cmsFree(self ->ContextID, Matrix); + _cmsFree(self ->ContextID, Offsets); + + *nItems = 1; + + return mpe; + + cmsUNUSED_PARAMETER(SizeOfTag); +} + +static +cmsBool Type_MPEmatrix_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) +{ + cmsUInt32Number i, nElems; + cmsStage* mpe = (cmsStage*) Ptr; + _cmsStageMatrixData* Matrix = (_cmsStageMatrixData*) mpe ->Data; + + if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) mpe ->InputChannels)) return FALSE; + if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) mpe ->OutputChannels)) return FALSE; + + nElems = mpe ->InputChannels * mpe ->OutputChannels; + + for (i=0; i < nElems; i++) { + if (!_cmsWriteFloat32Number(io, (cmsFloat32Number) Matrix->Double[i])) return FALSE; + } + + + for (i=0; i < mpe ->OutputChannels; i++) { + + if (Matrix ->Offset == NULL) { + + if (!_cmsWriteFloat32Number(io, 0)) return FALSE; + } + else { + if (!_cmsWriteFloat32Number(io, (cmsFloat32Number) Matrix->Offset[i])) return FALSE; + } + } + + return TRUE; + + cmsUNUSED_PARAMETER(nItems); + cmsUNUSED_PARAMETER(self); +} + + + +static +void *Type_MPEclut_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) +{ + cmsStage* mpe = NULL; + cmsUInt16Number InputChans, OutputChans; + cmsUInt8Number Dimensions8[16]; + cmsUInt32Number i, nMaxGrids, GridPoints[MAX_INPUT_DIMENSIONS]; + _cmsStageCLutData* clut; + + if (!_cmsReadUInt16Number(io, &InputChans)) return NULL; + if (!_cmsReadUInt16Number(io, &OutputChans)) return NULL; + + if (InputChans == 0 || InputChans >= cmsMAXCHANNELS) goto Error; + if (OutputChans == 0 || OutputChans >= cmsMAXCHANNELS) goto Error; + + if (io ->Read(io, Dimensions8, sizeof(cmsUInt8Number), 16) != 16) + goto Error; + + // Copy MAX_INPUT_DIMENSIONS at most. Expand to cmsUInt32Number + nMaxGrids = InputChans > MAX_INPUT_DIMENSIONS ? (cmsUInt32Number) MAX_INPUT_DIMENSIONS : InputChans; + + for (i = 0; i < nMaxGrids; i++) { + if (Dimensions8[i] == 1) goto Error; // Impossible value, 0 for no CLUT and then 2 at least + GridPoints[i] = (cmsUInt32Number)Dimensions8[i]; + } + + // Allocate the true CLUT + mpe = cmsStageAllocCLutFloatGranular(self ->ContextID, GridPoints, InputChans, OutputChans, NULL); + if (mpe == NULL) goto Error; + + // Read and sanitize the data + clut = (_cmsStageCLutData*) mpe ->Data; + for (i=0; i < clut ->nEntries; i++) { + + if (!_cmsReadFloat32Number(io, &clut->Tab.TFloat[i])) goto Error; + } + + *nItems = 1; + return mpe; + +Error: + *nItems = 0; + if (mpe != NULL) cmsStageFree(mpe); + return NULL; + + cmsUNUSED_PARAMETER(SizeOfTag); +} + +// Write a CLUT in floating point +static +cmsBool Type_MPEclut_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) +{ + cmsUInt8Number Dimensions8[16]; // 16 because the spec says 16 and not max number of channels + cmsUInt32Number i; + cmsStage* mpe = (cmsStage*) Ptr; + _cmsStageCLutData* clut = (_cmsStageCLutData*) mpe ->Data; + + // Check for maximum number of channels supported by lcms + if (mpe -> InputChannels > MAX_INPUT_DIMENSIONS) return FALSE; + + // Only floats are supported in MPE + if (clut ->HasFloatValues == FALSE) return FALSE; + + if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) mpe ->InputChannels)) return FALSE; + if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) mpe ->OutputChannels)) return FALSE; + + memset(Dimensions8, 0, sizeof(Dimensions8)); + + for (i=0; i < mpe ->InputChannels; i++) + Dimensions8[i] = (cmsUInt8Number) clut ->Params ->nSamples[i]; + + if (!io ->Write(io, 16, Dimensions8)) return FALSE; + + for (i=0; i < clut ->nEntries; i++) { + + if (!_cmsWriteFloat32Number(io, clut ->Tab.TFloat[i])) return FALSE; + } + + return TRUE; + + cmsUNUSED_PARAMETER(nItems); + cmsUNUSED_PARAMETER(self); +} + + + +// This is the list of built-in MPE types +static _cmsTagTypeLinkedList SupportedMPEtypes[] = { + +{{ (cmsTagTypeSignature) cmsSigBAcsElemType, NULL, NULL, NULL, NULL, NULL, 0 }, &SupportedMPEtypes[1] }, // Ignore those elements for now +{{ (cmsTagTypeSignature) cmsSigEAcsElemType, NULL, NULL, NULL, NULL, NULL, 0 }, &SupportedMPEtypes[2] }, // (That's what the spec says) + +{TYPE_MPE_HANDLER((cmsTagTypeSignature) cmsSigCurveSetElemType, MPEcurve), &SupportedMPEtypes[3] }, +{TYPE_MPE_HANDLER((cmsTagTypeSignature) cmsSigMatrixElemType, MPEmatrix), &SupportedMPEtypes[4] }, +{TYPE_MPE_HANDLER((cmsTagTypeSignature) cmsSigCLutElemType, MPEclut), NULL }, +}; + +_cmsTagTypePluginChunkType _cmsMPETypePluginChunk = { NULL }; + +static +cmsBool ReadMPEElem(struct _cms_typehandler_struct* self, + cmsIOHANDLER* io, + void* Cargo, + cmsUInt32Number n, + cmsUInt32Number SizeOfTag) +{ + cmsStageSignature ElementSig; + cmsTagTypeHandler* TypeHandler; + cmsUInt32Number nItems; + cmsPipeline *NewLUT = (cmsPipeline *) Cargo; + _cmsTagTypePluginChunkType* MPETypePluginChunk = ( _cmsTagTypePluginChunkType*) _cmsContextGetClientChunk(self->ContextID, MPEPlugin); + + + // Take signature and channels for each element. + if (!_cmsReadUInt32Number(io, (cmsUInt32Number*) &ElementSig)) return FALSE; + + // The reserved placeholder + if (!_cmsReadUInt32Number(io, NULL)) return FALSE; + + // Read diverse MPE types + TypeHandler = GetHandler((cmsTagTypeSignature) ElementSig, MPETypePluginChunk ->TagTypes, SupportedMPEtypes); + if (TypeHandler == NULL) { + + char String[5]; + + _cmsTagSignature2String(String, (cmsTagSignature) ElementSig); + + // An unknown element was found. + cmsSignalError(self ->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unknown MPE type '%s' found.", String); + return FALSE; + } + + // If no read method, just ignore the element (valid for cmsSigBAcsElemType and cmsSigEAcsElemType) + // Read the MPE. No size is given + if (TypeHandler ->ReadPtr != NULL) { + + // This is a real element which should be read and processed + if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, (cmsStage*) TypeHandler ->ReadPtr(self, io, &nItems, SizeOfTag))) + return FALSE; + } + + return TRUE; + + cmsUNUSED_PARAMETER(n); +} + + +// This is the main dispatcher for MPE +static +void *Type_MPE_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) +{ + cmsUInt16Number InputChans, OutputChans; + cmsUInt32Number ElementCount; + cmsPipeline *NewLUT = NULL; + cmsUInt32Number BaseOffset; + + // Get actual position as a basis for element offsets + BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase); + + // Read channels and element count + if (!_cmsReadUInt16Number(io, &InputChans)) return NULL; + if (!_cmsReadUInt16Number(io, &OutputChans)) return NULL; + + if (InputChans == 0 || InputChans >= cmsMAXCHANNELS) return NULL; + if (OutputChans == 0 || OutputChans >= cmsMAXCHANNELS) return NULL; + + // Allocates an empty LUT + NewLUT = cmsPipelineAlloc(self ->ContextID, InputChans, OutputChans); + if (NewLUT == NULL) return NULL; + + if (!_cmsReadUInt32Number(io, &ElementCount)) goto Error; + if (!ReadPositionTable(self, io, ElementCount, BaseOffset, NewLUT, ReadMPEElem)) goto Error; + + // Check channel count + if (InputChans != NewLUT->InputChannels || + OutputChans != NewLUT->OutputChannels) goto Error; + + // Success + *nItems = 1; + return NewLUT; + + // Error +Error: + if (NewLUT != NULL) cmsPipelineFree(NewLUT); + *nItems = 0; + return NULL; + + cmsUNUSED_PARAMETER(SizeOfTag); +} + + + +// This one is a little bit more complex, so we don't use position tables this time. +static +cmsBool Type_MPE_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) +{ + cmsUInt32Number i, BaseOffset, DirectoryPos, CurrentPos; + cmsUInt32Number inputChan, outputChan; + cmsUInt32Number ElemCount; + cmsUInt32Number *ElementOffsets = NULL, *ElementSizes = NULL, Before; + cmsStageSignature ElementSig; + cmsPipeline* Lut = (cmsPipeline*) Ptr; + cmsStage* Elem = Lut ->Elements; + cmsTagTypeHandler* TypeHandler; + _cmsTagTypePluginChunkType* MPETypePluginChunk = ( _cmsTagTypePluginChunkType*) _cmsContextGetClientChunk(self->ContextID, MPEPlugin); + + BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase); + + inputChan = cmsPipelineInputChannels(Lut); + outputChan = cmsPipelineOutputChannels(Lut); + ElemCount = cmsPipelineStageCount(Lut); + + ElementOffsets = (cmsUInt32Number *) _cmsCalloc(self ->ContextID, ElemCount, sizeof(cmsUInt32Number)); + if (ElementOffsets == NULL) goto Error; + + ElementSizes = (cmsUInt32Number *) _cmsCalloc(self ->ContextID, ElemCount, sizeof(cmsUInt32Number)); + if (ElementSizes == NULL) goto Error; + + // Write the head + if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) inputChan)) goto Error; + if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) outputChan)) goto Error; + if (!_cmsWriteUInt32Number(io, (cmsUInt16Number) ElemCount)) goto Error; + + DirectoryPos = io ->Tell(io); + + // Write a fake directory to be filled latter on + for (i=0; i < ElemCount; i++) { + if (!_cmsWriteUInt32Number(io, 0)) goto Error; // Offset + if (!_cmsWriteUInt32Number(io, 0)) goto Error; // size + } + + // Write each single tag. Keep track of the size as well. + for (i=0; i < ElemCount; i++) { + + ElementOffsets[i] = io ->Tell(io) - BaseOffset; + + ElementSig = Elem ->Type; + + TypeHandler = GetHandler((cmsTagTypeSignature) ElementSig, MPETypePluginChunk->TagTypes, SupportedMPEtypes); + if (TypeHandler == NULL) { + + char String[5]; + + _cmsTagSignature2String(String, (cmsTagSignature) ElementSig); + + // An unknown element was found. + cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Found unknown MPE type '%s'", String); + goto Error; + } + + Before = io ->Tell(io); + + if (!_cmsWriteUInt32Number(io, ElementSig)) goto Error; + if (!_cmsWriteUInt32Number(io, 0)) goto Error; + + if (!TypeHandler ->WritePtr(self, io, Elem, 1)) goto Error; + if (!_cmsWriteAlignment(io)) goto Error; + + ElementSizes[i] = io ->Tell(io) - Before; + + Elem = Elem ->Next; + } + + // Write the directory + CurrentPos = io ->Tell(io); + + if (!io ->Seek(io, DirectoryPos)) goto Error; + + for (i=0; i < ElemCount; i++) { + if (!_cmsWriteUInt32Number(io, ElementOffsets[i])) goto Error; + if (!_cmsWriteUInt32Number(io, ElementSizes[i])) goto Error; + } + + if (!io ->Seek(io, CurrentPos)) goto Error; + + if (ElementOffsets != NULL) _cmsFree(self ->ContextID, ElementOffsets); + if (ElementSizes != NULL) _cmsFree(self ->ContextID, ElementSizes); + return TRUE; + +Error: + if (ElementOffsets != NULL) _cmsFree(self ->ContextID, ElementOffsets); + if (ElementSizes != NULL) _cmsFree(self ->ContextID, ElementSizes); + return FALSE; + + cmsUNUSED_PARAMETER(nItems); +} + + +static +void* Type_MPE_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) +{ + return (void*) cmsPipelineDup((cmsPipeline*) Ptr); + + cmsUNUSED_PARAMETER(n); + cmsUNUSED_PARAMETER(self); +} + +static +void Type_MPE_Free(struct _cms_typehandler_struct* self, void *Ptr) +{ + cmsPipelineFree((cmsPipeline*) Ptr); + return; + + cmsUNUSED_PARAMETER(self); +} + + +// ******************************************************************************** +// Type cmsSigVcgtType +// ******************************************************************************** + + +#define cmsVideoCardGammaTableType 0 +#define cmsVideoCardGammaFormulaType 1 + +// Used internally +typedef struct { + double Gamma; + double Min; + double Max; +} _cmsVCGTGAMMA; + + +static +void *Type_vcgt_Read(struct _cms_typehandler_struct* self, + cmsIOHANDLER* io, + cmsUInt32Number* nItems, + cmsUInt32Number SizeOfTag) +{ + cmsUInt32Number TagType, n, i; + cmsToneCurve** Curves; + + *nItems = 0; + + // Read tag type + if (!_cmsReadUInt32Number(io, &TagType)) return NULL; + + // Allocate space for the array + Curves = ( cmsToneCurve**) _cmsCalloc(self ->ContextID, 3, sizeof(cmsToneCurve*)); + if (Curves == NULL) return NULL; + + // There are two possible flavors + switch (TagType) { + + // Gamma is stored as a table + case cmsVideoCardGammaTableType: + { + cmsUInt16Number nChannels, nElems, nBytes; + + // Check channel count, which should be 3 (we don't support monochrome this time) + if (!_cmsReadUInt16Number(io, &nChannels)) goto Error; + + if (nChannels != 3) { + cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported number of channels for VCGT '%d'", nChannels); + goto Error; + } + + // Get Table element count and bytes per element + if (!_cmsReadUInt16Number(io, &nElems)) goto Error; + if (!_cmsReadUInt16Number(io, &nBytes)) goto Error; + + // Adobe's quirk fixup. Fixing broken profiles... + if (nElems == 256 && nBytes == 1 && SizeOfTag == 1576) + nBytes = 2; + + + // Populate tone curves + for (n=0; n < 3; n++) { + + Curves[n] = cmsBuildTabulatedToneCurve16(self ->ContextID, nElems, NULL); + if (Curves[n] == NULL) goto Error; + + // On depending on byte depth + switch (nBytes) { + + // One byte, 0..255 + case 1: + for (i=0; i < nElems; i++) { + + cmsUInt8Number v; + + if (!_cmsReadUInt8Number(io, &v)) goto Error; + Curves[n] ->Table16[i] = FROM_8_TO_16(v); + } + break; + + // One word 0..65535 + case 2: + if (!_cmsReadUInt16Array(io, nElems, Curves[n]->Table16)) goto Error; + break; + + // Unsupported + default: + cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported bit depth for VCGT '%d'", nBytes * 8); + goto Error; + } + } // For all 3 channels + } + break; + + // In this case, gamma is stored as a formula + case cmsVideoCardGammaFormulaType: + { + _cmsVCGTGAMMA Colorant[3]; + + // Populate tone curves + for (n=0; n < 3; n++) { + + double Params[10]; + + if (!_cmsRead15Fixed16Number(io, &Colorant[n].Gamma)) goto Error; + if (!_cmsRead15Fixed16Number(io, &Colorant[n].Min)) goto Error; + if (!_cmsRead15Fixed16Number(io, &Colorant[n].Max)) goto Error; + + // Parametric curve type 5 is: + // Y = (aX + b)^Gamma + e | X >= d + // Y = cX + f | X < d + + // vcgt formula is: + // Y = (Max - Min) * (X ^ Gamma) + Min + + // So, the translation is + // a = (Max - Min) ^ ( 1 / Gamma) + // e = Min + // b=c=d=f=0 + + Params[0] = Colorant[n].Gamma; + Params[1] = pow((Colorant[n].Max - Colorant[n].Min), (1.0 / Colorant[n].Gamma)); + Params[2] = 0; + Params[3] = 0; + Params[4] = 0; + Params[5] = Colorant[n].Min; + Params[6] = 0; + + Curves[n] = cmsBuildParametricToneCurve(self ->ContextID, 5, Params); + if (Curves[n] == NULL) goto Error; + } + } + break; + + // Unsupported + default: + cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported tag type for VCGT '%d'", TagType); + goto Error; + } + + *nItems = 1; + return (void*) Curves; + +// Regret, free all resources +Error: + + cmsFreeToneCurveTriple(Curves); + _cmsFree(self ->ContextID, Curves); + return NULL; + + cmsUNUSED_PARAMETER(SizeOfTag); +} + + +// We don't support all flavors, only 16bits tables and formula +static +cmsBool Type_vcgt_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) +{ + cmsToneCurve** Curves = (cmsToneCurve**) Ptr; + cmsUInt32Number i, j; + + if (cmsGetToneCurveParametricType(Curves[0]) == 5 && + cmsGetToneCurveParametricType(Curves[1]) == 5 && + cmsGetToneCurveParametricType(Curves[2]) == 5) { + + if (!_cmsWriteUInt32Number(io, cmsVideoCardGammaFormulaType)) return FALSE; + + // Save parameters + for (i=0; i < 3; i++) { + + _cmsVCGTGAMMA v; + + v.Gamma = Curves[i] ->Segments[0].Params[0]; + v.Min = Curves[i] ->Segments[0].Params[5]; + v.Max = pow(Curves[i] ->Segments[0].Params[1], v.Gamma) + v.Min; + + if (!_cmsWrite15Fixed16Number(io, v.Gamma)) return FALSE; + if (!_cmsWrite15Fixed16Number(io, v.Min)) return FALSE; + if (!_cmsWrite15Fixed16Number(io, v.Max)) return FALSE; + } + } + + else { + + // Always store as a table of 256 words + if (!_cmsWriteUInt32Number(io, cmsVideoCardGammaTableType)) return FALSE; + if (!_cmsWriteUInt16Number(io, 3)) return FALSE; + if (!_cmsWriteUInt16Number(io, 256)) return FALSE; + if (!_cmsWriteUInt16Number(io, 2)) return FALSE; + + for (i=0; i < 3; i++) { + for (j=0; j < 256; j++) { + + cmsFloat32Number v = cmsEvalToneCurveFloat(Curves[i], (cmsFloat32Number) (j / 255.0)); + cmsUInt16Number n = _cmsQuickSaturateWord(v * 65535.0); + + if (!_cmsWriteUInt16Number(io, n)) return FALSE; + } + } + } + + return TRUE; + + cmsUNUSED_PARAMETER(self); + cmsUNUSED_PARAMETER(nItems); +} + +static +void* Type_vcgt_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) +{ + cmsToneCurve** OldCurves = (cmsToneCurve**) Ptr; + cmsToneCurve** NewCurves; + + NewCurves = ( cmsToneCurve**) _cmsCalloc(self ->ContextID, 3, sizeof(cmsToneCurve*)); + if (NewCurves == NULL) return NULL; + + NewCurves[0] = cmsDupToneCurve(OldCurves[0]); + NewCurves[1] = cmsDupToneCurve(OldCurves[1]); + NewCurves[2] = cmsDupToneCurve(OldCurves[2]); + + return (void*) NewCurves; + + cmsUNUSED_PARAMETER(n); +} + + +static +void Type_vcgt_Free(struct _cms_typehandler_struct* self, void* Ptr) +{ + cmsFreeToneCurveTriple((cmsToneCurve**) Ptr); + _cmsFree(self ->ContextID, Ptr); +} + + +// ******************************************************************************** +// Type cmsSigDictType +// ******************************************************************************** + +// Single column of the table can point to wchar or MLUC elements. Holds arrays of data +typedef struct { + cmsContext ContextID; + cmsUInt32Number *Offsets; + cmsUInt32Number *Sizes; +} _cmsDICelem; + +typedef struct { + _cmsDICelem Name, Value, DisplayName, DisplayValue; + +} _cmsDICarray; + +// Allocate an empty array element +static +cmsBool AllocElem(cmsContext ContextID, _cmsDICelem* e, cmsUInt32Number Count) +{ + e->Offsets = (cmsUInt32Number *) _cmsCalloc(ContextID, Count, sizeof(cmsUInt32Number)); + if (e->Offsets == NULL) return FALSE; + + e->Sizes = (cmsUInt32Number *) _cmsCalloc(ContextID, Count, sizeof(cmsUInt32Number)); + if (e->Sizes == NULL) { + + _cmsFree(ContextID, e -> Offsets); + return FALSE; + } + + e ->ContextID = ContextID; + return TRUE; +} + +// Free an array element +static +void FreeElem(_cmsDICelem* e) +{ + if (e ->Offsets != NULL) _cmsFree(e -> ContextID, e -> Offsets); + if (e ->Sizes != NULL) _cmsFree(e -> ContextID, e -> Sizes); + e->Offsets = e ->Sizes = NULL; +} + +// Get rid of whole array +static +void FreeArray( _cmsDICarray* a) +{ + if (a ->Name.Offsets != NULL) FreeElem(&a->Name); + if (a ->Value.Offsets != NULL) FreeElem(&a ->Value); + if (a ->DisplayName.Offsets != NULL) FreeElem(&a->DisplayName); + if (a ->DisplayValue.Offsets != NULL) FreeElem(&a ->DisplayValue); +} + + +// Allocate whole array +static +cmsBool AllocArray(cmsContext ContextID, _cmsDICarray* a, cmsUInt32Number Count, cmsUInt32Number Length) +{ + // Empty values + memset(a, 0, sizeof(_cmsDICarray)); + + // On depending on record size, create column arrays + if (!AllocElem(ContextID, &a ->Name, Count)) goto Error; + if (!AllocElem(ContextID, &a ->Value, Count)) goto Error; + + if (Length > 16) { + if (!AllocElem(ContextID, &a -> DisplayName, Count)) goto Error; + + } + if (Length > 24) { + if (!AllocElem(ContextID, &a ->DisplayValue, Count)) goto Error; + } + return TRUE; + +Error: + FreeArray(a); + return FALSE; +} + +// Read one element +static +cmsBool ReadOneElem(cmsIOHANDLER* io, _cmsDICelem* e, cmsUInt32Number i, cmsUInt32Number BaseOffset) +{ + if (!_cmsReadUInt32Number(io, &e->Offsets[i])) return FALSE; + if (!_cmsReadUInt32Number(io, &e ->Sizes[i])) return FALSE; + + // An offset of zero has special meaning and shall be preserved + if (e ->Offsets[i] > 0) + e ->Offsets[i] += BaseOffset; + return TRUE; +} + + +static +cmsBool ReadOffsetArray(cmsIOHANDLER* io, _cmsDICarray* a, + cmsUInt32Number Count, cmsUInt32Number Length, cmsUInt32Number BaseOffset, + cmsInt32Number* SignedSizeOfTagPtr) +{ + cmsUInt32Number i; + cmsInt32Number SignedSizeOfTag = *SignedSizeOfTagPtr; + + // Read column arrays + for (i=0; i < Count; i++) { + + if (SignedSizeOfTag < 4 * (cmsInt32Number) sizeof(cmsUInt32Number)) return FALSE; + SignedSizeOfTag -= 4 * sizeof(cmsUInt32Number); + + if (!ReadOneElem(io, &a -> Name, i, BaseOffset)) return FALSE; + if (!ReadOneElem(io, &a -> Value, i, BaseOffset)) return FALSE; + + if (Length > 16) { + + if (SignedSizeOfTag < 2 * (cmsInt32Number) sizeof(cmsUInt32Number)) return FALSE; + SignedSizeOfTag -= 2 * sizeof(cmsUInt32Number); + + if (!ReadOneElem(io, &a ->DisplayName, i, BaseOffset)) return FALSE; + + } + + if (Length > 24) { + + if (SignedSizeOfTag < 2 * (cmsInt32Number) sizeof(cmsUInt32Number)) return FALSE; + SignedSizeOfTag -= 2 * (cmsInt32Number) sizeof(cmsUInt32Number); + + if (!ReadOneElem(io, & a -> DisplayValue, i, BaseOffset)) return FALSE; + } + } + + *SignedSizeOfTagPtr = SignedSizeOfTag; + return TRUE; +} + + +// Write one element +static +cmsBool WriteOneElem(cmsIOHANDLER* io, _cmsDICelem* e, cmsUInt32Number i) +{ + if (!_cmsWriteUInt32Number(io, e->Offsets[i])) return FALSE; + if (!_cmsWriteUInt32Number(io, e ->Sizes[i])) return FALSE; + + return TRUE; +} + +static +cmsBool WriteOffsetArray(cmsIOHANDLER* io, _cmsDICarray* a, cmsUInt32Number Count, cmsUInt32Number Length) +{ + cmsUInt32Number i; + + for (i=0; i < Count; i++) { + + if (!WriteOneElem(io, &a -> Name, i)) return FALSE; + if (!WriteOneElem(io, &a -> Value, i)) return FALSE; + + if (Length > 16) { + + if (!WriteOneElem(io, &a -> DisplayName, i)) return FALSE; + } + + if (Length > 24) { + + if (!WriteOneElem(io, &a -> DisplayValue, i)) return FALSE; + } + } + + return TRUE; +} + +static +cmsBool ReadOneWChar(cmsIOHANDLER* io, _cmsDICelem* e, cmsUInt32Number i, wchar_t ** wcstr) +{ + + cmsUInt32Number nChars; + + // Special case for undefined strings (see ICC Votable + // Proposal Submission, Dictionary Type and Metadata TAG Definition) + if (e -> Offsets[i] == 0) { + + *wcstr = NULL; + return TRUE; + } + + if (!io -> Seek(io, e -> Offsets[i])) return FALSE; + + nChars = e ->Sizes[i] / sizeof(cmsUInt16Number); + if (nChars > 0x7ffff) return FALSE; + + *wcstr = (wchar_t*) _cmsMallocZero(e ->ContextID, (nChars + 1) * sizeof(wchar_t)); + if (*wcstr == NULL) return FALSE; + + if (!_cmsReadWCharArray(io, nChars, *wcstr)) { + _cmsFree(e ->ContextID, *wcstr); + return FALSE; + } + + // End of string marker + (*wcstr)[nChars] = 0; + return TRUE; +} + +static +cmsUInt32Number mywcslen(const wchar_t *s) +{ + const wchar_t *p; + + p = s; + while (*p) + p++; + + return (cmsUInt32Number)(p - s); +} + +static +cmsBool WriteOneWChar(cmsIOHANDLER* io, _cmsDICelem* e, cmsUInt32Number i, const wchar_t * wcstr, cmsUInt32Number BaseOffset) +{ + cmsUInt32Number Before = io ->Tell(io); + cmsUInt32Number n; + + e ->Offsets[i] = Before - BaseOffset; + + if (wcstr == NULL) { + e ->Sizes[i] = 0; + e ->Offsets[i] = 0; + return TRUE; + } + + n = mywcslen(wcstr); + if (!_cmsWriteWCharArray(io, n, wcstr)) return FALSE; + + e ->Sizes[i] = io ->Tell(io) - Before; + return TRUE; +} + +static +cmsBool ReadOneMLUC(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, _cmsDICelem* e, cmsUInt32Number i, cmsMLU** mlu) +{ + cmsUInt32Number nItems = 0; + + // A way to get null MLUCs + if (e -> Offsets[i] == 0 || e ->Sizes[i] == 0) { + + *mlu = NULL; + return TRUE; + } + + if (!io -> Seek(io, e -> Offsets[i])) return FALSE; + + *mlu = (cmsMLU*) Type_MLU_Read(self, io, &nItems, e ->Sizes[i]); + return *mlu != NULL; +} + +static +cmsBool WriteOneMLUC(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, _cmsDICelem* e, cmsUInt32Number i, const cmsMLU* mlu, cmsUInt32Number BaseOffset) +{ + cmsUInt32Number Before; + + // Special case for undefined strings (see ICC Votable + // Proposal Submission, Dictionary Type and Metadata TAG Definition) + if (mlu == NULL) { + e ->Sizes[i] = 0; + e ->Offsets[i] = 0; + return TRUE; + } + + Before = io ->Tell(io); + if (e->Offsets != NULL) + e ->Offsets[i] = Before - BaseOffset; + + if (!Type_MLU_Write(self, io, (void*) mlu, 1)) return FALSE; + + if (e->Sizes != NULL) + e ->Sizes[i] = io ->Tell(io) - Before; + return TRUE; +} + + +static +void *Type_Dictionary_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) +{ + cmsHANDLE hDict = NULL; + cmsUInt32Number i, Count, Length; + cmsUInt32Number BaseOffset; + _cmsDICarray a; + wchar_t *NameWCS = NULL, *ValueWCS = NULL; + cmsMLU *DisplayNameMLU = NULL, *DisplayValueMLU=NULL; + cmsBool rc; + cmsInt32Number SignedSizeOfTag = (cmsInt32Number)SizeOfTag; + + *nItems = 0; + memset(&a, 0, sizeof(a)); + + // Get actual position as a basis for element offsets + BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase); + + // Get name-value record count + SignedSizeOfTag -= sizeof(cmsUInt32Number); + if (SignedSizeOfTag < 0) goto Error; + if (!_cmsReadUInt32Number(io, &Count)) return NULL; + + // Get rec length + SignedSizeOfTag -= sizeof(cmsUInt32Number); + if (SignedSizeOfTag < 0) goto Error; + if (!_cmsReadUInt32Number(io, &Length)) return NULL; + + + // Check for valid lengths + if (Length != 16 && Length != 24 && Length != 32) { + cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unknown record length in dictionary '%d'", Length); + return NULL; + } + + // Creates an empty dictionary + hDict = cmsDictAlloc(self -> ContextID); + if (hDict == NULL) return NULL; + + // On depending on record size, create column arrays + if (!AllocArray(self -> ContextID, &a, Count, Length)) goto Error; + + // Read column arrays + if (!ReadOffsetArray(io, &a, Count, Length, BaseOffset, &SignedSizeOfTag)) goto Error; + + // Seek to each element and read it + for (i=0; i < Count; i++) { + + if (!ReadOneWChar(io, &a.Name, i, &NameWCS)) goto Error; + if (!ReadOneWChar(io, &a.Value, i, &ValueWCS)) goto Error; + + if (Length > 16) { + if (!ReadOneMLUC(self, io, &a.DisplayName, i, &DisplayNameMLU)) goto Error; + } + + if (Length > 24) { + if (!ReadOneMLUC(self, io, &a.DisplayValue, i, &DisplayValueMLU)) goto Error; + } + + if (NameWCS == NULL || ValueWCS == NULL) { + + cmsSignalError(self->ContextID, cmsERROR_CORRUPTION_DETECTED, "Bad dictionary Name/Value"); + rc = FALSE; + } + else { + + rc = cmsDictAddEntry(hDict, NameWCS, ValueWCS, DisplayNameMLU, DisplayValueMLU); + } + + if (NameWCS != NULL) _cmsFree(self ->ContextID, NameWCS); + if (ValueWCS != NULL) _cmsFree(self ->ContextID, ValueWCS); + if (DisplayNameMLU != NULL) cmsMLUfree(DisplayNameMLU); + if (DisplayValueMLU != NULL) cmsMLUfree(DisplayValueMLU); + + if (!rc) goto Error; + } + + FreeArray(&a); + *nItems = 1; + return (void*) hDict; + +Error: + FreeArray(&a); + if (hDict != NULL) cmsDictFree(hDict); + return NULL; +} + + +static +cmsBool Type_Dictionary_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) +{ + cmsHANDLE hDict = (cmsHANDLE) Ptr; + const cmsDICTentry* p; + cmsBool AnyName, AnyValue; + cmsUInt32Number i, Count, Length; + cmsUInt32Number DirectoryPos, CurrentPos, BaseOffset; + _cmsDICarray a; + + if (hDict == NULL) return FALSE; + + BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase); + + // Let's inspect the dictionary + Count = 0; AnyName = FALSE; AnyValue = FALSE; + for (p = cmsDictGetEntryList(hDict); p != NULL; p = cmsDictNextEntry(p)) { + + if (p ->DisplayName != NULL) AnyName = TRUE; + if (p ->DisplayValue != NULL) AnyValue = TRUE; + Count++; + } + + Length = 16; + if (AnyName) Length += 8; + if (AnyValue) Length += 8; + + if (!_cmsWriteUInt32Number(io, Count)) return FALSE; + if (!_cmsWriteUInt32Number(io, Length)) return FALSE; + + // Keep starting position of offsets table + DirectoryPos = io ->Tell(io); + + // Allocate offsets array + if (!AllocArray(self ->ContextID, &a, Count, Length)) goto Error; + + // Write a fake directory to be filled latter on + if (!WriteOffsetArray(io, &a, Count, Length)) goto Error; + + // Write each element. Keep track of the size as well. + p = cmsDictGetEntryList(hDict); + for (i=0; i < Count; i++) { + + if (!WriteOneWChar(io, &a.Name, i, p ->Name, BaseOffset)) goto Error; + if (!WriteOneWChar(io, &a.Value, i, p ->Value, BaseOffset)) goto Error; + + if (p ->DisplayName != NULL) { + if (!WriteOneMLUC(self, io, &a.DisplayName, i, p ->DisplayName, BaseOffset)) goto Error; + } + + if (p ->DisplayValue != NULL) { + if (!WriteOneMLUC(self, io, &a.DisplayValue, i, p ->DisplayValue, BaseOffset)) goto Error; + } + + p = cmsDictNextEntry(p); + } + + // Write the directory + CurrentPos = io ->Tell(io); + if (!io ->Seek(io, DirectoryPos)) goto Error; + + if (!WriteOffsetArray(io, &a, Count, Length)) goto Error; + + if (!io ->Seek(io, CurrentPos)) goto Error; + + FreeArray(&a); + return TRUE; + +Error: + FreeArray(&a); + return FALSE; + + cmsUNUSED_PARAMETER(nItems); +} + + +static +void* Type_Dictionary_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n) +{ + return (void*) cmsDictDup((cmsHANDLE) Ptr); + + cmsUNUSED_PARAMETER(n); + cmsUNUSED_PARAMETER(self); +} + + +static +void Type_Dictionary_Free(struct _cms_typehandler_struct* self, void* Ptr) +{ + cmsDictFree((cmsHANDLE) Ptr); + cmsUNUSED_PARAMETER(self); +} + +// cicp VideoSignalType + +static +void* Type_VideoSignal_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) +{ + cmsVideoSignalType* cicp = NULL; + + if (SizeOfTag != 4) return NULL; + + cicp = (cmsVideoSignalType*)_cmsCalloc(self->ContextID, 1, sizeof(cmsVideoSignalType)); + if (cicp == NULL) return NULL; + + if (!_cmsReadUInt8Number(io, &cicp->ColourPrimaries)) goto Error; + if (!_cmsReadUInt8Number(io, &cicp->TransferCharacteristics)) goto Error; + if (!_cmsReadUInt8Number(io, &cicp->MatrixCoefficients)) goto Error; + if (!_cmsReadUInt8Number(io, &cicp->VideoFullRangeFlag)) goto Error; + + // Success + *nItems = 1; + return cicp; + +Error: + if (cicp != NULL) _cmsFree(self->ContextID, cicp); + return NULL; +} + +static +cmsBool Type_VideoSignal_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) +{ + cmsVideoSignalType* cicp = (cmsVideoSignalType*)Ptr; + + if (!_cmsWriteUInt8Number(io, cicp->ColourPrimaries)) return FALSE; + if (!_cmsWriteUInt8Number(io, cicp->TransferCharacteristics)) return FALSE; + if (!_cmsWriteUInt8Number(io, cicp->MatrixCoefficients)) return FALSE; + if (!_cmsWriteUInt8Number(io, cicp->VideoFullRangeFlag)) return FALSE; + + return TRUE; + + cmsUNUSED_PARAMETER(self); + cmsUNUSED_PARAMETER(nItems); +} + +void* Type_VideoSignal_Dup(struct _cms_typehandler_struct* self, const void* Ptr, cmsUInt32Number n) +{ + return _cmsDupMem(self->ContextID, Ptr, sizeof(cmsVideoSignalType)); + + cmsUNUSED_PARAMETER(n); +} + + +static +void Type_VideoSignal_Free(struct _cms_typehandler_struct* self, void* Ptr) +{ + _cmsFree(self->ContextID, Ptr); +} + + +// ******************************************************************************** +// Microsoft's MHC2 Type support +// ******************************************************************************** + +static +void SetIdentity(cmsFloat64Number XYZ2XYZmatrix[3][4]) +{ + XYZ2XYZmatrix[0][0] = 1.0; XYZ2XYZmatrix[0][1] = 0.0; XYZ2XYZmatrix[0][2] = 0.0; XYZ2XYZmatrix[0][3] = 0.0; + XYZ2XYZmatrix[1][0] = 0.0; XYZ2XYZmatrix[1][1] = 1.0; XYZ2XYZmatrix[1][2] = 0.0; XYZ2XYZmatrix[1][3] = 0.0; + XYZ2XYZmatrix[2][0] = 0.0; XYZ2XYZmatrix[2][1] = 0.0; XYZ2XYZmatrix[2][2] = 1.0; XYZ2XYZmatrix[2][3] = 0.0; +} + +static +cmsBool CloseEnough(cmsFloat64Number a, cmsFloat64Number b) +{ + return fabs(b - a) < (1.0 / 65535.0); +} + +cmsBool IsIdentity(cmsFloat64Number XYZ2XYZmatrix[3][4]) +{ + cmsFloat64Number Identity[3][4]; + int i, j; + + SetIdentity(Identity); + + for (i = 0; i < 3; i++) + for (j = 0; j < 4; j++) + if (!CloseEnough(XYZ2XYZmatrix[i][j], Identity[i][j])) return FALSE; + + return TRUE; +} + +static +void Type_MHC2_Free(struct _cms_typehandler_struct* self, void* Ptr) +{ + cmsMHC2Type* mhc2 = (cmsMHC2Type*)Ptr; + + if (mhc2->RedCurve != NULL) _cmsFree(self->ContextID, mhc2->RedCurve); + if (mhc2->GreenCurve != NULL) _cmsFree(self->ContextID, mhc2->GreenCurve); + if (mhc2->BlueCurve != NULL) _cmsFree(self->ContextID, mhc2->BlueCurve); + + _cmsFree(self->ContextID, Ptr); +} + +void* Type_MHC2_Dup(struct _cms_typehandler_struct* self, const void* Ptr, cmsUInt32Number n) +{ + cmsMHC2Type* mhc2 = (cmsMHC2Type*)_cmsDupMem(self->ContextID, Ptr, sizeof(cmsMHC2Type)); + + mhc2->RedCurve = (cmsFloat64Number*) _cmsDupMem(self->ContextID, mhc2->RedCurve, mhc2->CurveEntries*sizeof(cmsFloat64Number)); + mhc2->GreenCurve = (cmsFloat64Number*) _cmsDupMem(self->ContextID, mhc2->GreenCurve, mhc2->CurveEntries * sizeof(cmsFloat64Number)); + mhc2->BlueCurve = (cmsFloat64Number*) _cmsDupMem(self->ContextID, mhc2->BlueCurve, mhc2->CurveEntries * sizeof(cmsFloat64Number)); + + if (mhc2->RedCurve == NULL || + mhc2->GreenCurve == NULL || + mhc2->BlueCurve == NULL) { + + Type_MHC2_Free(self, mhc2); + return NULL; + } + + return mhc2; + + cmsUNUSED_PARAMETER(n); +} + + +static +cmsBool WriteDoubles(cmsIOHANDLER* io, cmsUInt32Number n, cmsFloat64Number* Values) +{ + cmsUInt32Number i; + + for (i = 0; i < n; i++) { + + if (!_cmsWrite15Fixed16Number(io, *Values++)) return FALSE; + } + + return TRUE; +} + +static +cmsBool Type_MHC2_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems) +{ + cmsMHC2Type* mhc2 = (cmsMHC2Type*)Ptr; + cmsUInt32Number BaseOffset = io->Tell(io) - sizeof(_cmsTagBase); + cmsUInt32Number TablesOffsetPos; + cmsUInt32Number MatrixOffset; + cmsUInt32Number OffsetRedTable, OffsetGreenTable, OffsetBlueTable; + + if (!_cmsWriteUInt32Number(io, mhc2->CurveEntries)) return FALSE; + + if (!_cmsWrite15Fixed16Number(io, mhc2->MinLuminance)) return FALSE; + if (!_cmsWrite15Fixed16Number(io, mhc2->PeakLuminance)) return FALSE; + + TablesOffsetPos = io->Tell(io); + + if (!_cmsWriteUInt32Number(io, 0)) return FALSE; // Matrix + if (!_cmsWriteUInt32Number(io, 0)) return FALSE; // Curve R + if (!_cmsWriteUInt32Number(io, 0)) return FALSE; // Curve G + if (!_cmsWriteUInt32Number(io, 0)) return FALSE; // Curve B + + + if (IsIdentity(mhc2->XYZ2XYZmatrix)) + { + MatrixOffset = 0; + } + else + { + MatrixOffset = io->Tell(io) - BaseOffset; + if (!WriteDoubles(io, 3 * 4, &mhc2->XYZ2XYZmatrix[0][0])) return FALSE; + } + + OffsetRedTable = io->Tell(io) - BaseOffset; + + if(!_cmsWriteUInt32Number(io, cmsSigS15Fixed16ArrayType)) return FALSE; + if(!_cmsWriteUInt32Number(io, 0)) return FALSE; + + if (!WriteDoubles(io, mhc2->CurveEntries, mhc2->RedCurve)) return FALSE; + + OffsetGreenTable = io->Tell(io) - BaseOffset; + if (!_cmsWriteUInt32Number(io, cmsSigS15Fixed16ArrayType)) return FALSE; + if (!_cmsWriteUInt32Number(io, 0)) return FALSE; + if (!WriteDoubles(io, mhc2->CurveEntries, mhc2->GreenCurve)) return FALSE; + + OffsetBlueTable = io->Tell(io) - BaseOffset; + if (!_cmsWriteUInt32Number(io, cmsSigS15Fixed16ArrayType)) return FALSE; + if (!_cmsWriteUInt32Number(io, 0)) return FALSE; + if (!WriteDoubles(io, mhc2->CurveEntries, mhc2->BlueCurve)) return FALSE; + + if (!io->Seek(io, TablesOffsetPos)) return FALSE; + + if (!_cmsWriteUInt32Number(io, MatrixOffset)) return FALSE; + if (!_cmsWriteUInt32Number(io, OffsetRedTable)) return FALSE; + if (!_cmsWriteUInt32Number(io, OffsetGreenTable)) return FALSE; + if (!_cmsWriteUInt32Number(io, OffsetBlueTable)) return FALSE; + + return TRUE; + + cmsUNUSED_PARAMETER(self); + cmsUNUSED_PARAMETER(nItems); +} + + +static +cmsBool ReadDoublesAt(cmsIOHANDLER* io, cmsUInt32Number At, cmsUInt32Number n, cmsFloat64Number* Values) +{ + cmsUInt32Number CurrentPos = io->Tell(io); + cmsUInt32Number i; + + if (!io->Seek(io, At)) return FALSE; + + for (i = 0; i < n; i++) { + + if (!_cmsRead15Fixed16Number(io, Values++)) return FALSE; + } + + if (!io->Seek(io, CurrentPos)) return FALSE; + + return TRUE; +} + +static +void* Type_MHC2_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag) +{ + cmsMHC2Type* mhc2 = NULL; + + cmsUInt32Number BaseOffset = io->Tell(io) - sizeof(_cmsTagBase); + cmsUInt32Number MatrixOffset; + cmsUInt32Number OffsetRedTable, OffsetGreenTable, OffsetBlueTable; + + mhc2 = (cmsMHC2Type*)_cmsCalloc(self->ContextID, 1, sizeof(cmsMHC2Type)); + if (mhc2 == NULL) return NULL; + + if (!_cmsReadUInt32Number(io, &mhc2->CurveEntries)) goto Error; + + if (mhc2->CurveEntries > 4096) goto Error; + + mhc2->RedCurve = (cmsFloat64Number*)_cmsCalloc(self->ContextID, mhc2->CurveEntries, sizeof(cmsFloat64Number)); + mhc2->GreenCurve = (cmsFloat64Number*)_cmsCalloc(self->ContextID, mhc2->CurveEntries, sizeof(cmsFloat64Number)); + mhc2->BlueCurve = (cmsFloat64Number*)_cmsCalloc(self->ContextID, mhc2->CurveEntries, sizeof(cmsFloat64Number)); + + if (mhc2->RedCurve == NULL || + mhc2->GreenCurve == NULL || + mhc2->BlueCurve == NULL) goto Error; + + if (!_cmsRead15Fixed16Number(io, &mhc2->MinLuminance)) goto Error; + if (!_cmsRead15Fixed16Number(io, &mhc2->PeakLuminance)) goto Error; + + if (!_cmsReadUInt32Number(io, &MatrixOffset)) goto Error; + if (!_cmsReadUInt32Number(io, &OffsetRedTable)) goto Error; + if (!_cmsReadUInt32Number(io, &OffsetGreenTable)) goto Error; + if (!_cmsReadUInt32Number(io, &OffsetBlueTable)) goto Error; + + if (MatrixOffset == 0) + SetIdentity(mhc2->XYZ2XYZmatrix); + else + { + if (!ReadDoublesAt(io, BaseOffset + MatrixOffset, 3*4, &mhc2->XYZ2XYZmatrix[0][0])) goto Error; + } + + // Skip sf32 tag and filler (8bytes) + if (!ReadDoublesAt(io, BaseOffset + OffsetRedTable + 8, mhc2->CurveEntries, mhc2->RedCurve)) goto Error; + if (!ReadDoublesAt(io, BaseOffset + OffsetGreenTable + 8, mhc2->CurveEntries, mhc2->GreenCurve)) goto Error; + if (!ReadDoublesAt(io, BaseOffset + OffsetBlueTable + 8, mhc2->CurveEntries, mhc2->BlueCurve)) goto Error; + + // Success + *nItems = 1; + return mhc2; + +Error: + Type_MHC2_Free(self, mhc2); + return NULL; + + cmsUNUSED_PARAMETER(SizeOfTag); +} + + + +// ******************************************************************************** +// Type support main routines +// ******************************************************************************** + + +// This is the list of built-in types +static const _cmsTagTypeLinkedList SupportedTagTypes[] = { + +{TYPE_HANDLER(cmsSigChromaticityType, Chromaticity), (_cmsTagTypeLinkedList*) &SupportedTagTypes[1] }, +{TYPE_HANDLER(cmsSigColorantOrderType, ColorantOrderType), (_cmsTagTypeLinkedList*) &SupportedTagTypes[2] }, +{TYPE_HANDLER(cmsSigS15Fixed16ArrayType, S15Fixed16), (_cmsTagTypeLinkedList*) &SupportedTagTypes[3] }, +{TYPE_HANDLER(cmsSigU16Fixed16ArrayType, U16Fixed16), (_cmsTagTypeLinkedList*) &SupportedTagTypes[4] }, +{TYPE_HANDLER(cmsSigTextType, Text), (_cmsTagTypeLinkedList*) &SupportedTagTypes[5] }, +{TYPE_HANDLER(cmsSigTextDescriptionType, Text_Description), (_cmsTagTypeLinkedList*) &SupportedTagTypes[6] }, +{TYPE_HANDLER(cmsSigCurveType, Curve), (_cmsTagTypeLinkedList*) &SupportedTagTypes[7] }, +{TYPE_HANDLER(cmsSigParametricCurveType, ParametricCurve), (_cmsTagTypeLinkedList*) &SupportedTagTypes[8] }, +{TYPE_HANDLER(cmsSigDateTimeType, DateTime), (_cmsTagTypeLinkedList*) &SupportedTagTypes[9] }, +{TYPE_HANDLER(cmsSigLut8Type, LUT8), (_cmsTagTypeLinkedList*) &SupportedTagTypes[10] }, +{TYPE_HANDLER(cmsSigLut16Type, LUT16), (_cmsTagTypeLinkedList*) &SupportedTagTypes[11] }, +{TYPE_HANDLER(cmsSigColorantTableType, ColorantTable), (_cmsTagTypeLinkedList*) &SupportedTagTypes[12] }, +{TYPE_HANDLER(cmsSigNamedColor2Type, NamedColor), (_cmsTagTypeLinkedList*) &SupportedTagTypes[13] }, +{TYPE_HANDLER(cmsSigMultiLocalizedUnicodeType, MLU), (_cmsTagTypeLinkedList*) &SupportedTagTypes[14] }, +{TYPE_HANDLER(cmsSigProfileSequenceDescType, ProfileSequenceDesc),(_cmsTagTypeLinkedList*) &SupportedTagTypes[15] }, +{TYPE_HANDLER(cmsSigSignatureType, Signature), (_cmsTagTypeLinkedList*) &SupportedTagTypes[16] }, +{TYPE_HANDLER(cmsSigMeasurementType, Measurement), (_cmsTagTypeLinkedList*) &SupportedTagTypes[17] }, +{TYPE_HANDLER(cmsSigDataType, Data), (_cmsTagTypeLinkedList*) &SupportedTagTypes[18] }, +{TYPE_HANDLER(cmsSigLutAtoBType, LUTA2B), (_cmsTagTypeLinkedList*) &SupportedTagTypes[19] }, +{TYPE_HANDLER(cmsSigLutBtoAType, LUTB2A), (_cmsTagTypeLinkedList*) &SupportedTagTypes[20] }, +{TYPE_HANDLER(cmsSigUcrBgType, UcrBg), (_cmsTagTypeLinkedList*) &SupportedTagTypes[21] }, +{TYPE_HANDLER(cmsSigCrdInfoType, CrdInfo), (_cmsTagTypeLinkedList*) &SupportedTagTypes[22] }, +{TYPE_HANDLER(cmsSigMultiProcessElementType, MPE), (_cmsTagTypeLinkedList*) &SupportedTagTypes[23] }, +{TYPE_HANDLER(cmsSigScreeningType, Screening), (_cmsTagTypeLinkedList*) &SupportedTagTypes[24] }, +{TYPE_HANDLER(cmsSigViewingConditionsType, ViewingConditions), (_cmsTagTypeLinkedList*) &SupportedTagTypes[25] }, +{TYPE_HANDLER(cmsSigXYZType, XYZ), (_cmsTagTypeLinkedList*) &SupportedTagTypes[26] }, +{TYPE_HANDLER(cmsCorbisBrokenXYZtype, XYZ), (_cmsTagTypeLinkedList*) &SupportedTagTypes[27] }, +{TYPE_HANDLER(cmsMonacoBrokenCurveType, Curve), (_cmsTagTypeLinkedList*) &SupportedTagTypes[28] }, +{TYPE_HANDLER(cmsSigProfileSequenceIdType, ProfileSequenceId), (_cmsTagTypeLinkedList*) &SupportedTagTypes[29] }, +{TYPE_HANDLER(cmsSigDictType, Dictionary), (_cmsTagTypeLinkedList*) &SupportedTagTypes[30] }, +{TYPE_HANDLER(cmsSigcicpType, VideoSignal), (_cmsTagTypeLinkedList*) &SupportedTagTypes[31] }, +{TYPE_HANDLER(cmsSigVcgtType, vcgt), (_cmsTagTypeLinkedList*) &SupportedTagTypes[32] }, +{TYPE_HANDLER(cmsSigMHC2Type, MHC2), (_cmsTagTypeLinkedList*) &SupportedTagTypes[33] }, +{TYPE_HANDLER(cmsSigUInt8ArrayType, UInt8), (_cmsTagTypeLinkedList*) &SupportedTagTypes[34] }, +{TYPE_HANDLER(cmsSigUInt32ArrayType, UInt32), (_cmsTagTypeLinkedList*) &SupportedTagTypes[35] }, +{TYPE_HANDLER(cmsSigUInt64ArrayType, UInt64), NULL } +}; + + +_cmsTagTypePluginChunkType _cmsTagTypePluginChunk = { NULL }; + + + +// Duplicates the zone of memory used by the plug-in in the new context +static +void DupTagTypeList(struct _cmsContext_struct* ctx, + const struct _cmsContext_struct* src, + int loc) +{ + _cmsTagTypePluginChunkType newHead = { NULL }; + _cmsTagTypeLinkedList* entry; + _cmsTagTypeLinkedList* Anterior = NULL; + _cmsTagTypePluginChunkType* head = (_cmsTagTypePluginChunkType*) src->chunks[loc]; + + // Walk the list copying all nodes + for (entry = head->TagTypes; + entry != NULL; + entry = entry ->Next) { + + _cmsTagTypeLinkedList *newEntry = ( _cmsTagTypeLinkedList *) _cmsSubAllocDup(ctx ->MemPool, entry, sizeof(_cmsTagTypeLinkedList)); + + if (newEntry == NULL) + return; + + // We want to keep the linked list order, so this is a little bit tricky + newEntry -> Next = NULL; + if (Anterior) + Anterior -> Next = newEntry; + + Anterior = newEntry; + + if (newHead.TagTypes == NULL) + newHead.TagTypes = newEntry; + } + + ctx ->chunks[loc] = _cmsSubAllocDup(ctx->MemPool, &newHead, sizeof(_cmsTagTypePluginChunkType)); +} + + +void _cmsAllocTagTypePluginChunk(struct _cmsContext_struct* ctx, + const struct _cmsContext_struct* src) +{ + if (src != NULL) { + + // Duplicate the LIST + DupTagTypeList(ctx, src, TagTypePlugin); + } + else { + static _cmsTagTypePluginChunkType TagTypePluginChunk = { NULL }; + ctx ->chunks[TagTypePlugin] = _cmsSubAllocDup(ctx ->MemPool, &TagTypePluginChunk, sizeof(_cmsTagTypePluginChunkType)); + } +} + +void _cmsAllocMPETypePluginChunk(struct _cmsContext_struct* ctx, + const struct _cmsContext_struct* src) +{ + if (src != NULL) { + + // Duplicate the LIST + DupTagTypeList(ctx, src, MPEPlugin); + } + else { + static _cmsTagTypePluginChunkType TagTypePluginChunk = { NULL }; + ctx ->chunks[MPEPlugin] = _cmsSubAllocDup(ctx ->MemPool, &TagTypePluginChunk, sizeof(_cmsTagTypePluginChunkType)); + } + +} + + +// Both kind of plug-ins share same structure +cmsBool _cmsRegisterTagTypePlugin(cmsContext id, cmsPluginBase* Data) +{ + return RegisterTypesPlugin(id, Data, TagTypePlugin); +} + +cmsBool _cmsRegisterMultiProcessElementPlugin(cmsContext id, cmsPluginBase* Data) +{ + return RegisterTypesPlugin(id, Data,MPEPlugin); +} + + +// Wrapper for tag types +cmsTagTypeHandler* _cmsGetTagTypeHandler(cmsContext ContextID, cmsTagTypeSignature sig) +{ + _cmsTagTypePluginChunkType* ctx = ( _cmsTagTypePluginChunkType*) _cmsContextGetClientChunk(ContextID, TagTypePlugin); + + return GetHandler(sig, ctx->TagTypes, (_cmsTagTypeLinkedList*) SupportedTagTypes); +} + +// ******************************************************************************** +// Tag support main routines +// ******************************************************************************** + +typedef struct _cmsTagLinkedList_st { + + cmsTagSignature Signature; + cmsTagDescriptor Descriptor; + struct _cmsTagLinkedList_st* Next; + +} _cmsTagLinkedList; + +// This is the list of built-in tags. The data of this list can be modified by plug-ins +static _cmsTagLinkedList SupportedTags[] = { + + { cmsSigAToB0Tag, { 1, 3, { cmsSigLut16Type, cmsSigLutAtoBType, cmsSigLut8Type}, DecideLUTtypeA2B}, &SupportedTags[1]}, + { cmsSigAToB1Tag, { 1, 3, { cmsSigLut16Type, cmsSigLutAtoBType, cmsSigLut8Type}, DecideLUTtypeA2B}, &SupportedTags[2]}, + { cmsSigAToB2Tag, { 1, 3, { cmsSigLut16Type, cmsSigLutAtoBType, cmsSigLut8Type}, DecideLUTtypeA2B}, &SupportedTags[3]}, + { cmsSigBToA0Tag, { 1, 3, { cmsSigLut16Type, cmsSigLutBtoAType, cmsSigLut8Type}, DecideLUTtypeB2A}, &SupportedTags[4]}, + { cmsSigBToA1Tag, { 1, 3, { cmsSigLut16Type, cmsSigLutBtoAType, cmsSigLut8Type}, DecideLUTtypeB2A}, &SupportedTags[5]}, + { cmsSigBToA2Tag, { 1, 3, { cmsSigLut16Type, cmsSigLutBtoAType, cmsSigLut8Type}, DecideLUTtypeB2A}, &SupportedTags[6]}, + + // Allow corbis and its broken XYZ type + { cmsSigRedColorantTag, { 1, 2, { cmsSigXYZType, cmsCorbisBrokenXYZtype }, DecideXYZtype}, &SupportedTags[7]}, + { cmsSigGreenColorantTag, { 1, 2, { cmsSigXYZType, cmsCorbisBrokenXYZtype }, DecideXYZtype}, &SupportedTags[8]}, + { cmsSigBlueColorantTag, { 1, 2, { cmsSigXYZType, cmsCorbisBrokenXYZtype }, DecideXYZtype}, &SupportedTags[9]}, + + { cmsSigRedTRCTag, { 1, 3, { cmsSigCurveType, cmsSigParametricCurveType, cmsMonacoBrokenCurveType }, DecideCurveType}, &SupportedTags[10]}, + { cmsSigGreenTRCTag, { 1, 3, { cmsSigCurveType, cmsSigParametricCurveType, cmsMonacoBrokenCurveType }, DecideCurveType}, &SupportedTags[11]}, + { cmsSigBlueTRCTag, { 1, 3, { cmsSigCurveType, cmsSigParametricCurveType, cmsMonacoBrokenCurveType }, DecideCurveType}, &SupportedTags[12]}, + + { cmsSigCalibrationDateTimeTag, { 1, 1, { cmsSigDateTimeType }, NULL}, &SupportedTags[13]}, + { cmsSigCharTargetTag, { 1, 1, { cmsSigTextType }, NULL}, &SupportedTags[14]}, + + { cmsSigChromaticAdaptationTag, { 9, 1, { cmsSigS15Fixed16ArrayType }, NULL}, &SupportedTags[15]}, + { cmsSigChromaticityTag, { 1, 1, { cmsSigChromaticityType }, NULL}, &SupportedTags[16]}, + { cmsSigColorantOrderTag, { 1, 1, { cmsSigColorantOrderType }, NULL}, &SupportedTags[17]}, + { cmsSigColorantTableTag, { 1, 1, { cmsSigColorantTableType }, NULL}, &SupportedTags[18]}, + { cmsSigColorantTableOutTag, { 1, 1, { cmsSigColorantTableType }, NULL}, &SupportedTags[19]}, + + { cmsSigCopyrightTag, { 1, 3, { cmsSigTextType, cmsSigMultiLocalizedUnicodeType, cmsSigTextDescriptionType}, DecideTextType}, &SupportedTags[20]}, + { cmsSigDateTimeTag, { 1, 1, { cmsSigDateTimeType }, NULL}, &SupportedTags[21]}, + + { cmsSigDeviceMfgDescTag, { 1, 3, { cmsSigTextDescriptionType, cmsSigMultiLocalizedUnicodeType, cmsSigTextType}, DecideTextDescType}, &SupportedTags[22]}, + { cmsSigDeviceModelDescTag, { 1, 3, { cmsSigTextDescriptionType, cmsSigMultiLocalizedUnicodeType, cmsSigTextType}, DecideTextDescType}, &SupportedTags[23]}, + + { cmsSigGamutTag, { 1, 3, { cmsSigLut16Type, cmsSigLutBtoAType, cmsSigLut8Type }, DecideLUTtypeB2A}, &SupportedTags[24]}, + + { cmsSigGrayTRCTag, { 1, 2, { cmsSigCurveType, cmsSigParametricCurveType }, DecideCurveType}, &SupportedTags[25]}, + { cmsSigLuminanceTag, { 1, 1, { cmsSigXYZType }, NULL}, &SupportedTags[26]}, + + { cmsSigMediaBlackPointTag, { 1, 2, { cmsSigXYZType, cmsCorbisBrokenXYZtype }, NULL}, &SupportedTags[27]}, + { cmsSigMediaWhitePointTag, { 1, 2, { cmsSigXYZType, cmsCorbisBrokenXYZtype }, NULL}, &SupportedTags[28]}, + + { cmsSigNamedColor2Tag, { 1, 1, { cmsSigNamedColor2Type }, NULL}, &SupportedTags[29]}, + + { cmsSigPreview0Tag, { 1, 3, { cmsSigLut16Type, cmsSigLutBtoAType, cmsSigLut8Type }, DecideLUTtypeB2A}, &SupportedTags[30]}, + { cmsSigPreview1Tag, { 1, 3, { cmsSigLut16Type, cmsSigLutBtoAType, cmsSigLut8Type }, DecideLUTtypeB2A}, &SupportedTags[31]}, + { cmsSigPreview2Tag, { 1, 3, { cmsSigLut16Type, cmsSigLutBtoAType, cmsSigLut8Type }, DecideLUTtypeB2A}, &SupportedTags[32]}, + + { cmsSigProfileDescriptionTag, { 1, 3, { cmsSigTextDescriptionType, cmsSigMultiLocalizedUnicodeType, cmsSigTextType}, DecideTextDescType}, &SupportedTags[33]}, + { cmsSigProfileSequenceDescTag, { 1, 1, { cmsSigProfileSequenceDescType }, NULL}, &SupportedTags[34]}, + { cmsSigTechnologyTag, { 1, 1, { cmsSigSignatureType }, NULL}, &SupportedTags[35]}, + + { cmsSigColorimetricIntentImageStateTag, { 1, 1, { cmsSigSignatureType }, NULL}, &SupportedTags[36]}, + { cmsSigPerceptualRenderingIntentGamutTag, { 1, 1, { cmsSigSignatureType }, NULL}, &SupportedTags[37]}, + { cmsSigSaturationRenderingIntentGamutTag, { 1, 1, { cmsSigSignatureType }, NULL}, &SupportedTags[38]}, + + { cmsSigMeasurementTag, { 1, 1, { cmsSigMeasurementType }, NULL}, &SupportedTags[39]}, + + { cmsSigPs2CRD0Tag, { 1, 1, { cmsSigDataType }, NULL}, &SupportedTags[40]}, + { cmsSigPs2CRD1Tag, { 1, 1, { cmsSigDataType }, NULL}, &SupportedTags[41]}, + { cmsSigPs2CRD2Tag, { 1, 1, { cmsSigDataType }, NULL}, &SupportedTags[42]}, + { cmsSigPs2CRD3Tag, { 1, 1, { cmsSigDataType }, NULL}, &SupportedTags[43]}, + { cmsSigPs2CSATag, { 1, 1, { cmsSigDataType }, NULL}, &SupportedTags[44]}, + { cmsSigPs2RenderingIntentTag, { 1, 1, { cmsSigDataType }, NULL}, &SupportedTags[45]}, + + { cmsSigViewingCondDescTag, { 1, 3, { cmsSigTextDescriptionType, cmsSigMultiLocalizedUnicodeType, cmsSigTextType}, DecideTextDescType}, &SupportedTags[46]}, + + { cmsSigUcrBgTag, { 1, 1, { cmsSigUcrBgType}, NULL}, &SupportedTags[47]}, + { cmsSigCrdInfoTag, { 1, 1, { cmsSigCrdInfoType}, NULL}, &SupportedTags[48]}, + + { cmsSigDToB0Tag, { 1, 1, { cmsSigMultiProcessElementType}, NULL}, &SupportedTags[49]}, + { cmsSigDToB1Tag, { 1, 1, { cmsSigMultiProcessElementType}, NULL}, &SupportedTags[50]}, + { cmsSigDToB2Tag, { 1, 1, { cmsSigMultiProcessElementType}, NULL}, &SupportedTags[51]}, + { cmsSigDToB3Tag, { 1, 1, { cmsSigMultiProcessElementType}, NULL}, &SupportedTags[52]}, + { cmsSigBToD0Tag, { 1, 1, { cmsSigMultiProcessElementType}, NULL}, &SupportedTags[53]}, + { cmsSigBToD1Tag, { 1, 1, { cmsSigMultiProcessElementType}, NULL}, &SupportedTags[54]}, + { cmsSigBToD2Tag, { 1, 1, { cmsSigMultiProcessElementType}, NULL}, &SupportedTags[55]}, + { cmsSigBToD3Tag, { 1, 1, { cmsSigMultiProcessElementType}, NULL}, &SupportedTags[56]}, + + { cmsSigScreeningDescTag, { 1, 1, { cmsSigTextDescriptionType }, NULL}, &SupportedTags[57]}, + { cmsSigViewingConditionsTag, { 1, 1, { cmsSigViewingConditionsType }, NULL}, &SupportedTags[58]}, + + { cmsSigScreeningTag, { 1, 1, { cmsSigScreeningType}, NULL }, &SupportedTags[59]}, + { cmsSigVcgtTag, { 1, 1, { cmsSigVcgtType}, NULL }, &SupportedTags[60]}, + { cmsSigMetaTag, { 1, 1, { cmsSigDictType}, NULL }, &SupportedTags[61]}, + { cmsSigProfileSequenceIdTag, { 1, 1, { cmsSigProfileSequenceIdType}, NULL }, &SupportedTags[62]}, + + { cmsSigProfileDescriptionMLTag,{ 1, 1, { cmsSigMultiLocalizedUnicodeType}, NULL}, &SupportedTags[63]}, + { cmsSigcicpTag, { 1, 1, { cmsSigcicpType}, NULL }, &SupportedTags[64]}, + + { cmsSigArgyllArtsTag, { 9, 1, { cmsSigS15Fixed16ArrayType}, NULL}, &SupportedTags[65]}, + { cmsSigMHC2Tag, { 1, 1, { cmsSigMHC2Type }, NULL}, NULL} + +}; + +/* + Not supported Why + ======================= ========================================= + cmsSigOutputResponseTag ==> WARNING, POSSIBLE PATENT ON THIS SUBJECT! + cmsSigNamedColorTag ==> Deprecated + cmsSigDataTag ==> Ancient, unused + cmsSigDeviceSettingsTag ==> Deprecated, useless +*/ + + +_cmsTagPluginChunkType _cmsTagPluginChunk = { NULL }; + + +// Duplicates the zone of memory used by the plug-in in the new context +static +void DupTagList(struct _cmsContext_struct* ctx, + const struct _cmsContext_struct* src) +{ + _cmsTagPluginChunkType newHead = { NULL }; + _cmsTagLinkedList* entry; + _cmsTagLinkedList* Anterior = NULL; + _cmsTagPluginChunkType* head = (_cmsTagPluginChunkType*) src->chunks[TagPlugin]; + + // Walk the list copying all nodes + for (entry = head->Tag; + entry != NULL; + entry = entry ->Next) { + + _cmsTagLinkedList *newEntry = ( _cmsTagLinkedList *) _cmsSubAllocDup(ctx ->MemPool, entry, sizeof(_cmsTagLinkedList)); + + if (newEntry == NULL) + return; + + // We want to keep the linked list order, so this is a little bit tricky + newEntry -> Next = NULL; + if (Anterior) + Anterior -> Next = newEntry; + + Anterior = newEntry; + + if (newHead.Tag == NULL) + newHead.Tag = newEntry; + } + + ctx ->chunks[TagPlugin] = _cmsSubAllocDup(ctx->MemPool, &newHead, sizeof(_cmsTagPluginChunkType)); +} + +void _cmsAllocTagPluginChunk(struct _cmsContext_struct* ctx, + const struct _cmsContext_struct* src) +{ + if (src != NULL) { + + DupTagList(ctx, src); + } + else { + static _cmsTagPluginChunkType TagPluginChunk = { NULL }; + ctx ->chunks[TagPlugin] = _cmsSubAllocDup(ctx ->MemPool, &TagPluginChunk, sizeof(_cmsTagPluginChunkType)); + } + +} + +cmsBool _cmsRegisterTagPlugin(cmsContext id, cmsPluginBase* Data) +{ + cmsPluginTag* Plugin = (cmsPluginTag*) Data; + _cmsTagLinkedList *pt; + _cmsTagPluginChunkType* TagPluginChunk = ( _cmsTagPluginChunkType*) _cmsContextGetClientChunk(id, TagPlugin); + + if (Data == NULL) { + + TagPluginChunk->Tag = NULL; + return TRUE; + } + + pt = (_cmsTagLinkedList*) _cmsPluginMalloc(id, sizeof(_cmsTagLinkedList)); + if (pt == NULL) return FALSE; + + pt ->Signature = Plugin ->Signature; + pt ->Descriptor = Plugin ->Descriptor; + pt ->Next = TagPluginChunk ->Tag; + + TagPluginChunk ->Tag = pt; + + return TRUE; +} + +// Return a descriptor for a given tag or NULL +cmsTagDescriptor* _cmsGetTagDescriptor(cmsContext ContextID, cmsTagSignature sig) +{ + _cmsTagLinkedList* pt; + _cmsTagPluginChunkType* TagPluginChunk = ( _cmsTagPluginChunkType*) _cmsContextGetClientChunk(ContextID, TagPlugin); + + for (pt = TagPluginChunk->Tag; + pt != NULL; + pt = pt ->Next) { + + if (sig == pt -> Signature) return &pt ->Descriptor; + } + + for (pt = SupportedTags; + pt != NULL; + pt = pt ->Next) { + + if (sig == pt -> Signature) return &pt ->Descriptor; + } + + return NULL; +} + +cmsBool _cmsAvoidTypeCheckOnTags(cmsContext ContextID) +{ + _cmsTagLinkedList* pt; + _cmsTagPluginChunkType* TagPluginChunk = (_cmsTagPluginChunkType*)_cmsContextGetClientChunk(ContextID, TagPlugin); + + for (pt = TagPluginChunk->Tag; + pt != NULL; + pt = pt->Next) { + + if (pt->Signature == (cmsTagSignature)0) return TRUE; + } + + return FALSE; +} diff --git a/local/recipes/libs/lcms2/source/src/cmsvirt.c b/local/recipes/libs/lcms2/source/src/cmsvirt.c new file mode 100644 index 0000000000..796f0bcc75 --- /dev/null +++ b/local/recipes/libs/lcms2/source/src/cmsvirt.c @@ -0,0 +1,1364 @@ +//--------------------------------------------------------------------------------- +// +// Little Color Management System +// Copyright (c) 1998-2026 Marti Maria Saguer +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//--------------------------------------------------------------------------------- +// + +#include "lcms2_internal.h" + +// Virtual (built-in) profiles +// ----------------------------------------------------------------------------------- + +static +cmsBool SetTextTags(cmsHPROFILE hProfile, const wchar_t* Description) +{ + cmsMLU *DescriptionMLU, *CopyrightMLU; + cmsBool rc = FALSE; + cmsContext ContextID = cmsGetProfileContextID(hProfile); + + DescriptionMLU = cmsMLUalloc(ContextID, 1); + CopyrightMLU = cmsMLUalloc(ContextID, 1); + + if (DescriptionMLU == NULL || CopyrightMLU == NULL) goto Error; + + if (!cmsMLUsetWide(DescriptionMLU, "en", "US", Description)) goto Error; + if (!cmsMLUsetWide(CopyrightMLU, "en", "US", L"No copyright, use freely")) goto Error; + + if (!cmsWriteTag(hProfile, cmsSigProfileDescriptionTag, DescriptionMLU)) goto Error; + if (!cmsWriteTag(hProfile, cmsSigCopyrightTag, CopyrightMLU)) goto Error; + + rc = TRUE; + +Error: + + if (DescriptionMLU) + cmsMLUfree(DescriptionMLU); + if (CopyrightMLU) + cmsMLUfree(CopyrightMLU); + return rc; +} + + +static +cmsBool SetSeqDescTag(cmsHPROFILE hProfile, const char* Model) +{ + cmsBool rc = FALSE; + cmsContext ContextID = cmsGetProfileContextID(hProfile); + cmsSEQ* Seq = cmsAllocProfileSequenceDescription(ContextID, 1); + + if (Seq == NULL) return FALSE; + + Seq->seq[0].deviceMfg = (cmsSignature) 0; + Seq->seq[0].deviceModel = (cmsSignature) 0; + +#ifdef CMS_DONT_USE_INT64 + Seq->seq[0].attributes[0] = 0; + Seq->seq[0].attributes[1] = 0; +#else + Seq->seq[0].attributes = 0; +#endif + + Seq->seq[0].technology = (cmsTechnologySignature) 0; + + cmsMLUsetASCII( Seq->seq[0].Manufacturer, cmsNoLanguage, cmsNoCountry, "Little CMS"); + cmsMLUsetASCII( Seq->seq[0].Model, cmsNoLanguage, cmsNoCountry, Model); + + if (!_cmsWriteProfileSequence(hProfile, Seq)) goto Error; + + rc = TRUE; + +Error: + if (Seq) + cmsFreeProfileSequenceDescription(Seq); + + return rc; +} + + + +// This function creates a profile based on White point, primaries and +// transfer functions. +cmsHPROFILE CMSEXPORT cmsCreateRGBProfileTHR(cmsContext ContextID, + const cmsCIExyY* WhitePoint, + const cmsCIExyYTRIPLE* Primaries, + cmsToneCurve* const TransferFunction[3]) +{ + cmsHPROFILE hICC; + cmsMAT3 MColorants; + cmsCIEXYZTRIPLE Colorants; + cmsCIExyY MaxWhite; + cmsMAT3 CHAD; + cmsCIEXYZ WhitePointXYZ; + + hICC = cmsCreateProfilePlaceholder(ContextID); + if (!hICC) // can't allocate + return NULL; + + cmsSetProfileVersion(hICC, 4.4); + + cmsSetDeviceClass(hICC, cmsSigDisplayClass); + cmsSetColorSpace(hICC, cmsSigRgbData); + cmsSetPCS(hICC, cmsSigXYZData); + + cmsSetHeaderRenderingIntent(hICC, INTENT_PERCEPTUAL); + + + // Implement profile using following tags: + // + // 1 cmsSigProfileDescriptionTag + // 2 cmsSigMediaWhitePointTag + // 3 cmsSigRedColorantTag + // 4 cmsSigGreenColorantTag + // 5 cmsSigBlueColorantTag + // 6 cmsSigRedTRCTag + // 7 cmsSigGreenTRCTag + // 8 cmsSigBlueTRCTag + // 9 Chromatic adaptation Tag + // This conforms a standard RGB DisplayProfile as says ICC, and then I add (As per addendum II) + // 10 cmsSigChromaticityTag + + + if (!SetTextTags(hICC, L"RGB built-in")) goto Error; + + if (WhitePoint) { + + if (!cmsWriteTag(hICC, cmsSigMediaWhitePointTag, cmsD50_XYZ())) goto Error; + + cmsxyY2XYZ(&WhitePointXYZ, WhitePoint); + _cmsAdaptationMatrix(&CHAD, NULL, &WhitePointXYZ, cmsD50_XYZ()); + + // This is a V4 tag, but many CMM does read and understand it no matter which version + if (!cmsWriteTag(hICC, cmsSigChromaticAdaptationTag, (void*) &CHAD)) goto Error; + } + + if (WhitePoint && Primaries) { + + MaxWhite.x = WhitePoint -> x; + MaxWhite.y = WhitePoint -> y; + MaxWhite.Y = 1.0; + + if (!_cmsBuildRGB2XYZtransferMatrix(&MColorants, &MaxWhite, Primaries)) goto Error; + + Colorants.Red.X = MColorants.v[0].n[0]; + Colorants.Red.Y = MColorants.v[1].n[0]; + Colorants.Red.Z = MColorants.v[2].n[0]; + + Colorants.Green.X = MColorants.v[0].n[1]; + Colorants.Green.Y = MColorants.v[1].n[1]; + Colorants.Green.Z = MColorants.v[2].n[1]; + + Colorants.Blue.X = MColorants.v[0].n[2]; + Colorants.Blue.Y = MColorants.v[1].n[2]; + Colorants.Blue.Z = MColorants.v[2].n[2]; + + if (!cmsWriteTag(hICC, cmsSigRedColorantTag, (void*) &Colorants.Red)) goto Error; + if (!cmsWriteTag(hICC, cmsSigBlueColorantTag, (void*) &Colorants.Blue)) goto Error; + if (!cmsWriteTag(hICC, cmsSigGreenColorantTag, (void*) &Colorants.Green)) goto Error; + } + + + if (TransferFunction) { + + // Tries to minimize space. Thanks to Richard Hughes for this nice idea + if (!cmsWriteTag(hICC, cmsSigRedTRCTag, (void*) TransferFunction[0])) goto Error; + + if (TransferFunction[1] == TransferFunction[0]) { + + if (!cmsLinkTag (hICC, cmsSigGreenTRCTag, cmsSigRedTRCTag)) goto Error; + + } else { + + if (!cmsWriteTag(hICC, cmsSigGreenTRCTag, (void*) TransferFunction[1])) goto Error; + } + + if (TransferFunction[2] == TransferFunction[0]) { + + if (!cmsLinkTag (hICC, cmsSigBlueTRCTag, cmsSigRedTRCTag)) goto Error; + + } else { + + if (!cmsWriteTag(hICC, cmsSigBlueTRCTag, (void*) TransferFunction[2])) goto Error; + } + } + + if (Primaries) { + if (!cmsWriteTag(hICC, cmsSigChromaticityTag, (void*) Primaries)) goto Error; + } + + + return hICC; + +Error: + if (hICC) + cmsCloseProfile(hICC); + return NULL; +} + +cmsHPROFILE CMSEXPORT cmsCreateRGBProfile(const cmsCIExyY* WhitePoint, + const cmsCIExyYTRIPLE* Primaries, + cmsToneCurve* const TransferFunction[3]) +{ + return cmsCreateRGBProfileTHR(NULL, WhitePoint, Primaries, TransferFunction); +} + + + +// This function creates a profile based on White point and transfer function. +cmsHPROFILE CMSEXPORT cmsCreateGrayProfileTHR(cmsContext ContextID, + const cmsCIExyY* WhitePoint, + const cmsToneCurve* TransferFunction) +{ + cmsHPROFILE hICC; + cmsCIEXYZ tmp; + + hICC = cmsCreateProfilePlaceholder(ContextID); + if (!hICC) // can't allocate + return NULL; + + cmsSetProfileVersion(hICC, 4.4); + + cmsSetDeviceClass(hICC, cmsSigDisplayClass); + cmsSetColorSpace(hICC, cmsSigGrayData); + cmsSetPCS(hICC, cmsSigXYZData); + cmsSetHeaderRenderingIntent(hICC, INTENT_PERCEPTUAL); + + + // Implement profile using following tags: + // + // 1 cmsSigProfileDescriptionTag + // 2 cmsSigMediaWhitePointTag + // 3 cmsSigGrayTRCTag + + // This conforms a standard Gray DisplayProfile + + // Fill-in the tags + + if (!SetTextTags(hICC, L"gray built-in")) goto Error; + + + if (WhitePoint) { + + cmsxyY2XYZ(&tmp, WhitePoint); + if (!cmsWriteTag(hICC, cmsSigMediaWhitePointTag, (void*) &tmp)) goto Error; + } + + if (TransferFunction) { + + if (!cmsWriteTag(hICC, cmsSigGrayTRCTag, (void*) TransferFunction)) goto Error; + } + + return hICC; + +Error: + if (hICC) + cmsCloseProfile(hICC); + return NULL; +} + + + +cmsHPROFILE CMSEXPORT cmsCreateGrayProfile(const cmsCIExyY* WhitePoint, + const cmsToneCurve* TransferFunction) +{ + return cmsCreateGrayProfileTHR(NULL, WhitePoint, TransferFunction); +} + +// This is a devicelink operating in the target colorspace with as many transfer functions as components + +cmsHPROFILE CMSEXPORT cmsCreateLinearizationDeviceLinkTHR(cmsContext ContextID, + cmsColorSpaceSignature ColorSpace, + cmsToneCurve* const TransferFunctions[]) +{ + cmsHPROFILE hICC; + cmsPipeline* Pipeline; + cmsInt32Number nChannels; + + hICC = cmsCreateProfilePlaceholder(ContextID); + if (!hICC) + return NULL; + + cmsSetProfileVersion(hICC, 4.4); + + cmsSetDeviceClass(hICC, cmsSigLinkClass); + cmsSetColorSpace(hICC, ColorSpace); + cmsSetPCS(hICC, ColorSpace); + + cmsSetHeaderRenderingIntent(hICC, INTENT_PERCEPTUAL); + + // Set up channels + nChannels = cmsChannelsOfColorSpace(ColorSpace); + + // Creates a Pipeline with prelinearization step only + Pipeline = cmsPipelineAlloc(ContextID, nChannels, nChannels); + if (Pipeline == NULL) goto Error; + + + // Copy tables to Pipeline + if (!cmsPipelineInsertStage(Pipeline, cmsAT_BEGIN, cmsStageAllocToneCurves(ContextID, nChannels, TransferFunctions))) + goto Error; + + // Create tags + if (!SetTextTags(hICC, L"Linearization built-in")) goto Error; + if (!cmsWriteTag(hICC, cmsSigAToB0Tag, (void*) Pipeline)) goto Error; + if (!SetSeqDescTag(hICC, "Linearization built-in")) goto Error; + + // Pipeline is already on virtual profile + cmsPipelineFree(Pipeline); + + // Ok, done + return hICC; + +Error: + cmsPipelineFree(Pipeline); + if (hICC) + cmsCloseProfile(hICC); + + + return NULL; +} + +cmsHPROFILE CMSEXPORT cmsCreateLinearizationDeviceLink(cmsColorSpaceSignature ColorSpace, + cmsToneCurve* const TransferFunctions[]) +{ + return cmsCreateLinearizationDeviceLinkTHR(NULL, ColorSpace, TransferFunctions); +} + +// Ink-limiting algorithm +// +// Sum = C + M + Y + K +// If Sum > InkLimit +// Ratio= 1 - (Sum - InkLimit) / (C + M + Y) +// if Ratio <0 +// Ratio=0 +// endif +// Else +// Ratio=1 +// endif +// +// C = Ratio * C +// M = Ratio * M +// Y = Ratio * Y +// K: Does not change + +static +int InkLimitingSampler(CMSREGISTER const cmsUInt16Number In[], CMSREGISTER cmsUInt16Number Out[], CMSREGISTER void* Cargo) +{ + cmsFloat64Number InkLimit = *(cmsFloat64Number *) Cargo; + cmsFloat64Number SumCMY, SumCMYK, Ratio; + + InkLimit = (InkLimit * 655.35); + + SumCMY = (cmsFloat64Number) In[0] + In[1] + In[2]; + SumCMYK = SumCMY + In[3]; + + if (SumCMYK > InkLimit && SumCMY > 0) { + + Ratio = 1 - ((SumCMYK - InkLimit) / SumCMY); + if (Ratio < 0) + Ratio = 0; + } + else Ratio = 1; + + Out[0] = _cmsQuickSaturateWord(In[0] * Ratio); // C + Out[1] = _cmsQuickSaturateWord(In[1] * Ratio); // M + Out[2] = _cmsQuickSaturateWord(In[2] * Ratio); // Y + + Out[3] = In[3]; // K (untouched) + + return TRUE; +} + +// This is a devicelink operating in CMYK for ink-limiting + +cmsHPROFILE CMSEXPORT cmsCreateInkLimitingDeviceLinkTHR(cmsContext ContextID, + cmsColorSpaceSignature ColorSpace, + cmsFloat64Number Limit) +{ + cmsHPROFILE hICC; + cmsPipeline* LUT; + cmsStage* CLUT; + cmsInt32Number nChannels; + + if (ColorSpace != cmsSigCmykData) { + cmsSignalError(ContextID, cmsERROR_COLORSPACE_CHECK, "InkLimiting: Only CMYK currently supported"); + return NULL; + } + + if (Limit < 1.0 || Limit > 400) { + + cmsSignalError(ContextID, cmsERROR_RANGE, "InkLimiting: Limit should be between 1..400"); + if (Limit < 1) Limit = 1; + if (Limit > 400) Limit = 400; + } + + hICC = cmsCreateProfilePlaceholder(ContextID); + if (!hICC) // can't allocate + return NULL; + + cmsSetProfileVersion(hICC, 4.4); + + cmsSetDeviceClass(hICC, cmsSigLinkClass); + cmsSetColorSpace(hICC, ColorSpace); + cmsSetPCS(hICC, ColorSpace); + + cmsSetHeaderRenderingIntent(hICC, INTENT_PERCEPTUAL); + + + // Creates a Pipeline with 3D grid only + LUT = cmsPipelineAlloc(ContextID, 4, 4); + if (LUT == NULL) goto Error; + + + nChannels = cmsChannelsOf(ColorSpace); + + CLUT = cmsStageAllocCLut16bit(ContextID, 17, nChannels, nChannels, NULL); + if (CLUT == NULL) goto Error; + + if (!cmsStageSampleCLut16bit(CLUT, InkLimitingSampler, (void*) &Limit, 0)) goto Error; + + if (!cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocIdentityCurves(ContextID, nChannels)) || + !cmsPipelineInsertStage(LUT, cmsAT_END, CLUT) || + !cmsPipelineInsertStage(LUT, cmsAT_END, _cmsStageAllocIdentityCurves(ContextID, nChannels))) + goto Error; + + // Create tags + if (!SetTextTags(hICC, L"ink-limiting built-in")) goto Error; + + if (!cmsWriteTag(hICC, cmsSigAToB0Tag, (void*) LUT)) goto Error; + if (!SetSeqDescTag(hICC, "ink-limiting built-in")) goto Error; + + // cmsPipeline is already on virtual profile + cmsPipelineFree(LUT); + + // Ok, done + return hICC; + +Error: + if (LUT != NULL) + cmsPipelineFree(LUT); + + if (hICC != NULL) + cmsCloseProfile(hICC); + + return NULL; +} + +cmsHPROFILE CMSEXPORT cmsCreateInkLimitingDeviceLink(cmsColorSpaceSignature ColorSpace, cmsFloat64Number Limit) +{ + return cmsCreateInkLimitingDeviceLinkTHR(NULL, ColorSpace, Limit); +} + + +// Creates a fake Lab identity. +cmsHPROFILE CMSEXPORT cmsCreateLab2ProfileTHR(cmsContext ContextID, const cmsCIExyY* WhitePoint) +{ + cmsHPROFILE hProfile; + cmsPipeline* LUT = NULL; + + hProfile = cmsCreateRGBProfileTHR(ContextID, WhitePoint == NULL ? cmsD50_xyY() : WhitePoint, NULL, NULL); + if (hProfile == NULL) return NULL; + + cmsSetProfileVersion(hProfile, 2.1); + + cmsSetDeviceClass(hProfile, cmsSigAbstractClass); + cmsSetColorSpace(hProfile, cmsSigLabData); + cmsSetPCS(hProfile, cmsSigLabData); + + if (!SetTextTags(hProfile, L"Lab identity built-in")) + goto Error; + + // An identity LUT is all we need + LUT = cmsPipelineAlloc(ContextID, 3, 3); + if (LUT == NULL) + goto Error; + + if (!cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocIdentityCLut(ContextID, 3))) + goto Error; + + if (!cmsWriteTag(hProfile, cmsSigAToB0Tag, LUT)) + goto Error; + + cmsPipelineFree(LUT); + + return hProfile; + +Error: + + if (LUT != NULL) + cmsPipelineFree(LUT); + + if (hProfile != NULL) + cmsCloseProfile(hProfile); + + return NULL; +} + + +cmsHPROFILE CMSEXPORT cmsCreateLab2Profile(const cmsCIExyY* WhitePoint) +{ + return cmsCreateLab2ProfileTHR(NULL, WhitePoint); +} + + +// Creates a fake Lab V4 identity. +cmsHPROFILE CMSEXPORT cmsCreateLab4ProfileTHR(cmsContext ContextID, const cmsCIExyY* WhitePoint) +{ + cmsHPROFILE hProfile; + cmsPipeline* LUT = NULL; + cmsCIEXYZ xyz; + + if (WhitePoint == NULL) + xyz = *cmsD50_XYZ(); + else + cmsxyY2XYZ(&xyz, WhitePoint); + + hProfile = cmsCreateRGBProfileTHR(ContextID, NULL, NULL, NULL); + if (hProfile == NULL) return NULL; + + cmsSetProfileVersion(hProfile, 4.4); + + cmsSetDeviceClass(hProfile, cmsSigAbstractClass); + cmsSetColorSpace(hProfile, cmsSigLabData); + cmsSetPCS(hProfile, cmsSigLabData); + + if (!cmsWriteTag(hProfile, cmsSigMediaWhitePointTag, &xyz)) goto Error; + if (!SetTextTags(hProfile, L"Lab identity built-in")) goto Error; + + // An empty LUTs is all we need + LUT = cmsPipelineAlloc(ContextID, 3, 3); + if (LUT == NULL) goto Error; + + if (!cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocIdentityCurves(ContextID, 3))) + goto Error; + + if (!cmsWriteTag(hProfile, cmsSigAToB0Tag, LUT)) goto Error; + cmsPipelineFree(LUT); + + return hProfile; + +Error: + + if (LUT != NULL) + cmsPipelineFree(LUT); + + if (hProfile != NULL) + cmsCloseProfile(hProfile); + + return NULL; +} + +cmsHPROFILE CMSEXPORT cmsCreateLab4Profile(const cmsCIExyY* WhitePoint) +{ + return cmsCreateLab4ProfileTHR(NULL, WhitePoint); +} + + +// Creates a fake XYZ identity +cmsHPROFILE CMSEXPORT cmsCreateXYZProfileTHR(cmsContext ContextID) +{ + cmsHPROFILE hProfile; + cmsPipeline* LUT = NULL; + + hProfile = cmsCreateRGBProfileTHR(ContextID, cmsD50_xyY(), NULL, NULL); + if (hProfile == NULL) return NULL; + + cmsSetProfileVersion(hProfile, 4.4); + + cmsSetDeviceClass(hProfile, cmsSigAbstractClass); + cmsSetColorSpace(hProfile, cmsSigXYZData); + cmsSetPCS(hProfile, cmsSigXYZData); + + if (!SetTextTags(hProfile, L"XYZ identity built-in")) goto Error; + + // An identity LUT is all we need + LUT = cmsPipelineAlloc(ContextID, 3, 3); + if (LUT == NULL) goto Error; + + if (!cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocIdentityCurves(ContextID, 3))) + goto Error; + + if (!cmsWriteTag(hProfile, cmsSigAToB0Tag, LUT)) goto Error; + cmsPipelineFree(LUT); + + return hProfile; + +Error: + + if (LUT != NULL) + cmsPipelineFree(LUT); + + if (hProfile != NULL) + cmsCloseProfile(hProfile); + + return NULL; +} + + +cmsHPROFILE CMSEXPORT cmsCreateXYZProfile(void) +{ + return cmsCreateXYZProfileTHR(NULL); +} + + +//sRGB Curves are defined by: +// +//If R'sRGB,G'sRGB, B'sRGB < 0.04045 +// +// R = R'sRGB / 12.92 +// G = G'sRGB / 12.92 +// B = B'sRGB / 12.92 +// +// +//else if R'sRGB,G'sRGB, B'sRGB >= 0.04045 +// +// R = ((R'sRGB + 0.055) / 1.055)^2.4 +// G = ((G'sRGB + 0.055) / 1.055)^2.4 +// B = ((B'sRGB + 0.055) / 1.055)^2.4 + +static +cmsToneCurve* Build_sRGBGamma(cmsContext ContextID) +{ + cmsFloat64Number Parameters[5]; + + Parameters[0] = 2.4; + Parameters[1] = 1. / 1.055; + Parameters[2] = 0.055 / 1.055; + Parameters[3] = 1. / 12.92; + Parameters[4] = 0.04045; + + return cmsBuildParametricToneCurve(ContextID, 4, Parameters); +} + +// Create the ICC virtual profile for sRGB space +cmsHPROFILE CMSEXPORT cmsCreate_sRGBProfileTHR(cmsContext ContextID) +{ + cmsCIExyY D65 = { 0.3127, 0.3290, 1.0 }; + cmsCIExyYTRIPLE Rec709Primaries = { + {0.6400, 0.3300, 1.0}, + {0.3000, 0.6000, 1.0}, + {0.1500, 0.0600, 1.0} + }; + cmsToneCurve* Gamma22[3]; + cmsHPROFILE hsRGB; + + // cmsWhitePointFromTemp(&D65, 6504); + Gamma22[0] = Gamma22[1] = Gamma22[2] = Build_sRGBGamma(ContextID); + if (Gamma22[0] == NULL) return NULL; + + hsRGB = cmsCreateRGBProfileTHR(ContextID, &D65, &Rec709Primaries, Gamma22); + cmsFreeToneCurve(Gamma22[0]); + if (hsRGB == NULL) return NULL; + + if (!SetTextTags(hsRGB, L"sRGB built-in")) { + cmsCloseProfile(hsRGB); + return NULL; + } + + return hsRGB; +} + +cmsHPROFILE CMSEXPORT cmsCreate_sRGBProfile(void) +{ + return cmsCreate_sRGBProfileTHR(NULL); +} + +/** +* Oklab colorspace profile (experimental) +* +* This virtual profile cannot be saved as an ICC file +*/ +cmsHPROFILE CMSEXPORT cmsCreate_OkLabProfile(cmsContext ctx) +{ + cmsStage* XYZPCS = _cmsStageNormalizeFromXyzFloat(ctx); + cmsStage* PCSXYZ = _cmsStageNormalizeToXyzFloat(ctx); + + const double M_D65_D50[] = + { + 1.047886, 0.022919, -0.050216, + 0.029582, 0.990484, -0.017079, + -0.009252, 0.015073, 0.751678 + }; + + const double M_D50_D65[] = + { + 0.955512609517083, -0.023073214184645, 0.063308961782107, + -0.028324949364887, 1.009942432477107, 0.021054814890112, + 0.012328875695483, -0.020535835374141, 1.330713916450354 + }; + + cmsStage* D65toD50 = cmsStageAllocMatrix(ctx, 3, 3, M_D65_D50, NULL); + cmsStage* D50toD65 = cmsStageAllocMatrix(ctx, 3, 3, M_D50_D65, NULL); + + const double M_D65_LMS[] = + { + 0.8189330101, 0.3618667424, -0.1288597137, + 0.0329845436, 0.9293118715, 0.0361456387, + 0.0482003018, 0.2643662691, 0.6338517070 + }; + + const double M_LMS_D65[] = + { + 1.227013851103521, -0.557799980651822, 0.281256148966468, + -0.040580178423281, 1.112256869616830, -0.071676678665601, + -0.076381284505707, -0.421481978418013, 1.586163220440795 + }; + + cmsStage* D65toLMS = cmsStageAllocMatrix(ctx, 3, 3, M_D65_LMS, NULL); + cmsStage* LMStoD65 = cmsStageAllocMatrix(ctx, 3, 3, M_LMS_D65, NULL); + + cmsToneCurve* CubeRoot = cmsBuildGamma(ctx, 1.0 / 3.0); + cmsToneCurve* Cube = cmsBuildGamma(ctx, 3.0); + + cmsToneCurve* Roots[3] = { CubeRoot, CubeRoot, CubeRoot }; + cmsToneCurve* Cubes[3] = { Cube, Cube, Cube }; + + cmsStage* NonLinearityFw = cmsStageAllocToneCurves(ctx, 3, Roots); + cmsStage* NonLinearityRv = cmsStageAllocToneCurves(ctx, 3, Cubes); + + const double M_LMSprime_OkLab[] = + { + 0.2104542553, 0.7936177850, -0.0040720468, + 1.9779984951, -2.4285922050, 0.4505937099, + 0.0259040371, 0.7827717662, -0.8086757660 + }; + + const double M_OkLab_LMSprime[] = + { + 0.999999998450520, 0.396337792173768, 0.215803758060759, + 1.000000008881761, -0.105561342323656, -0.063854174771706, + 1.000000054672411, -0.089484182094966, -1.291485537864092 + }; + + cmsStage* LMSprime_OkLab = cmsStageAllocMatrix(ctx, 3, 3, M_LMSprime_OkLab, NULL); + cmsStage* OkLab_LMSprime = cmsStageAllocMatrix(ctx, 3, 3, M_OkLab_LMSprime, NULL); + + cmsPipeline* AToB = cmsPipelineAlloc(ctx, 3, 3); + cmsPipeline* BToA = cmsPipelineAlloc(ctx, 3, 3); + + cmsHPROFILE hProfile = cmsCreateProfilePlaceholder(ctx); + if (!hProfile) // can't allocate + goto error; + + cmsSetProfileVersion(hProfile, 4.4); + + cmsSetDeviceClass(hProfile, cmsSigColorSpaceClass); + cmsSetColorSpace(hProfile, cmsSig3colorData); + cmsSetPCS(hProfile, cmsSigXYZData); + + cmsSetHeaderRenderingIntent(hProfile, INTENT_RELATIVE_COLORIMETRIC); + + /** + * Conversion PCS (XYZ/D50) to OkLab + */ + if (!cmsPipelineInsertStage(BToA, cmsAT_END, PCSXYZ)) goto error; + if (!cmsPipelineInsertStage(BToA, cmsAT_END, D50toD65)) goto error; + if (!cmsPipelineInsertStage(BToA, cmsAT_END, D65toLMS)) goto error; + if (!cmsPipelineInsertStage(BToA, cmsAT_END, NonLinearityFw)) goto error; + if (!cmsPipelineInsertStage(BToA, cmsAT_END, LMSprime_OkLab)) goto error; + + if (!cmsWriteTag(hProfile, cmsSigBToA0Tag, BToA)) goto error; + + if (!cmsPipelineInsertStage(AToB, cmsAT_END, OkLab_LMSprime)) goto error; + if (!cmsPipelineInsertStage(AToB, cmsAT_END, NonLinearityRv)) goto error; + if (!cmsPipelineInsertStage(AToB, cmsAT_END, LMStoD65)) goto error; + if (!cmsPipelineInsertStage(AToB, cmsAT_END, D65toD50)) goto error; + if (!cmsPipelineInsertStage(AToB, cmsAT_END, XYZPCS)) goto error; + + if (!cmsWriteTag(hProfile, cmsSigAToB0Tag, AToB)) goto error; + + cmsPipelineFree(BToA); + cmsPipelineFree(AToB); + + cmsFreeToneCurve(CubeRoot); + cmsFreeToneCurve(Cube); + + return hProfile; + +error: + cmsPipelineFree(BToA); + cmsPipelineFree(AToB); + + cmsFreeToneCurve(CubeRoot); + cmsFreeToneCurve(Cube); + cmsCloseProfile(hProfile); + + return NULL; + +} + + +typedef struct { + cmsFloat64Number Brightness; + cmsFloat64Number Contrast; + cmsFloat64Number Hue; + cmsFloat64Number Saturation; + cmsBool lAdjustWP; + cmsCIEXYZ WPsrc, WPdest; + +} BCHSWADJUSTS, *LPBCHSWADJUSTS; + + +static +int bchswSampler(CMSREGISTER const cmsUInt16Number In[], CMSREGISTER cmsUInt16Number Out[], CMSREGISTER void* Cargo) +{ + cmsCIELab LabIn, LabOut; + cmsCIELCh LChIn, LChOut; + cmsCIEXYZ XYZ; + LPBCHSWADJUSTS bchsw = (LPBCHSWADJUSTS) Cargo; + + + cmsLabEncoded2Float(&LabIn, In); + + + cmsLab2LCh(&LChIn, &LabIn); + + // Do some adjusts on LCh + + LChOut.L = LChIn.L * bchsw ->Contrast + bchsw ->Brightness; + LChOut.C = LChIn.C + bchsw -> Saturation; + LChOut.h = LChIn.h + bchsw -> Hue; + + + cmsLCh2Lab(&LabOut, &LChOut); + + // Move white point in Lab + if (bchsw->lAdjustWP) { + cmsLab2XYZ(&bchsw->WPsrc, &XYZ, &LabOut); + cmsXYZ2Lab(&bchsw->WPdest, &LabOut, &XYZ); + } + + // Back to encoded + + cmsFloat2LabEncoded(Out, &LabOut); + + return TRUE; +} + + +// Creates an abstract profile operating in Lab space for Brightness, +// contrast, Saturation and white point displacement + +cmsHPROFILE CMSEXPORT cmsCreateBCHSWabstractProfileTHR(cmsContext ContextID, + cmsUInt32Number nLUTPoints, + cmsFloat64Number Bright, + cmsFloat64Number Contrast, + cmsFloat64Number Hue, + cmsFloat64Number Saturation, + cmsUInt32Number TempSrc, + cmsUInt32Number TempDest) +{ + cmsHPROFILE hICC; + cmsPipeline* Pipeline; + BCHSWADJUSTS bchsw; + cmsCIExyY WhitePnt; + cmsStage* CLUT; + cmsUInt32Number Dimensions[MAX_INPUT_DIMENSIONS]; + cmsUInt32Number i; + + bchsw.Brightness = Bright; + bchsw.Contrast = Contrast; + bchsw.Hue = Hue; + bchsw.Saturation = Saturation; + if (TempSrc == TempDest) { + + bchsw.lAdjustWP = FALSE; + } + else { + bchsw.lAdjustWP = TRUE; + cmsWhitePointFromTemp(&WhitePnt, TempSrc); + cmsxyY2XYZ(&bchsw.WPsrc, &WhitePnt); + cmsWhitePointFromTemp(&WhitePnt, TempDest); + cmsxyY2XYZ(&bchsw.WPdest, &WhitePnt); + + } + + hICC = cmsCreateProfilePlaceholder(ContextID); + if (!hICC) // can't allocate + return NULL; + + cmsSetDeviceClass(hICC, cmsSigAbstractClass); + cmsSetColorSpace(hICC, cmsSigLabData); + cmsSetPCS(hICC, cmsSigLabData); + + cmsSetHeaderRenderingIntent(hICC, INTENT_PERCEPTUAL); + + // Creates a Pipeline with 3D grid only + Pipeline = cmsPipelineAlloc(ContextID, 3, 3); + if (Pipeline == NULL) { + cmsCloseProfile(hICC); + return NULL; + } + + for (i=0; i < MAX_INPUT_DIMENSIONS; i++) Dimensions[i] = nLUTPoints; + CLUT = cmsStageAllocCLut16bitGranular(ContextID, Dimensions, 3, 3, NULL); + if (CLUT == NULL) + goto Error; + + if (!cmsStageSampleCLut16bit(CLUT, bchswSampler, (void*) &bchsw, 0)) + goto Error; + + if (!cmsPipelineInsertStage(Pipeline, cmsAT_END, CLUT)) + goto Error; + + // Create tags + if (!SetTextTags(hICC, L"BCHS built-in")) + goto Error; + + if (!cmsWriteTag(hICC, cmsSigMediaWhitePointTag, (void*)cmsD50_XYZ())) + goto Error; + + if (!cmsWriteTag(hICC, cmsSigAToB0Tag, (void*)Pipeline)) + goto Error; + + // Pipeline is already on virtual profile + cmsPipelineFree(Pipeline); + + // Ok, done + return hICC; + +Error: + cmsPipelineFree(Pipeline); + cmsCloseProfile(hICC); + return NULL; +} + + +CMSAPI cmsHPROFILE CMSEXPORT cmsCreateBCHSWabstractProfile(cmsUInt32Number nLUTPoints, + cmsFloat64Number Bright, + cmsFloat64Number Contrast, + cmsFloat64Number Hue, + cmsFloat64Number Saturation, + cmsUInt32Number TempSrc, + cmsUInt32Number TempDest) +{ + return cmsCreateBCHSWabstractProfileTHR(NULL, nLUTPoints, Bright, Contrast, Hue, Saturation, TempSrc, TempDest); +} + + +// Creates a fake NULL profile. This profile return 1 channel as always 0. +// Is useful only for gamut checking tricks +cmsHPROFILE CMSEXPORT cmsCreateNULLProfileTHR(cmsContext ContextID) +{ + cmsHPROFILE hProfile; + cmsPipeline* LUT = NULL; + cmsStage* PostLin; + cmsStage* OutLin; + cmsToneCurve* EmptyTab[3]; + cmsUInt16Number Zero[2] = { 0, 0 }; + const cmsFloat64Number PickLstarMatrix[] = { 1, 0, 0 }; + + hProfile = cmsCreateProfilePlaceholder(ContextID); + if (!hProfile) // can't allocate + return NULL; + + cmsSetProfileVersion(hProfile, 4.4); + + if (!SetTextTags(hProfile, L"NULL profile built-in")) goto Error; + + + cmsSetDeviceClass(hProfile, cmsSigOutputClass); + cmsSetColorSpace(hProfile, cmsSigGrayData); + cmsSetPCS(hProfile, cmsSigLabData); + + // Create a valid ICC 4 structure + LUT = cmsPipelineAlloc(ContextID, 3, 1); + if (LUT == NULL) goto Error; + + EmptyTab[0] = EmptyTab[1] = EmptyTab[2] = cmsBuildTabulatedToneCurve16(ContextID, 2, Zero); + PostLin = cmsStageAllocToneCurves(ContextID, 3, EmptyTab); + OutLin = cmsStageAllocToneCurves(ContextID, 1, EmptyTab); + cmsFreeToneCurve(EmptyTab[0]); + + if (!cmsPipelineInsertStage(LUT, cmsAT_END, PostLin)) + goto Error; + + if (!cmsPipelineInsertStage(LUT, cmsAT_END, cmsStageAllocMatrix(ContextID, 1, 3, PickLstarMatrix, NULL))) + goto Error; + + if (!cmsPipelineInsertStage(LUT, cmsAT_END, OutLin)) + goto Error; + + if (!cmsWriteTag(hProfile, cmsSigBToA0Tag, (void*) LUT)) goto Error; + if (!cmsWriteTag(hProfile, cmsSigMediaWhitePointTag, cmsD50_XYZ())) goto Error; + + cmsPipelineFree(LUT); + return hProfile; + +Error: + + if (LUT != NULL) + cmsPipelineFree(LUT); + + if (hProfile != NULL) + cmsCloseProfile(hProfile); + + return NULL; +} + +cmsHPROFILE CMSEXPORT cmsCreateNULLProfile(void) +{ + return cmsCreateNULLProfileTHR(NULL); +} + + +static +int IsPCS(cmsColorSpaceSignature ColorSpace) +{ + return (ColorSpace == cmsSigXYZData || + ColorSpace == cmsSigLabData); +} + + +static +void FixColorSpaces(cmsHPROFILE hProfile, + cmsColorSpaceSignature ColorSpace, + cmsColorSpaceSignature PCS, + cmsUInt32Number dwFlags) +{ + if (dwFlags & cmsFLAGS_GUESSDEVICECLASS) { + + if (IsPCS(ColorSpace) && IsPCS(PCS)) { + + cmsSetDeviceClass(hProfile, cmsSigAbstractClass); + cmsSetColorSpace(hProfile, ColorSpace); + cmsSetPCS(hProfile, PCS); + return; + } + + if (IsPCS(ColorSpace) && !IsPCS(PCS)) { + + cmsSetDeviceClass(hProfile, cmsSigOutputClass); + cmsSetPCS(hProfile, ColorSpace); + cmsSetColorSpace(hProfile, PCS); + return; + } + + if (IsPCS(PCS) && !IsPCS(ColorSpace)) { + + cmsSetDeviceClass(hProfile, cmsSigInputClass); + cmsSetColorSpace(hProfile, ColorSpace); + cmsSetPCS(hProfile, PCS); + return; + } + } + + cmsSetDeviceClass(hProfile, cmsSigLinkClass); + cmsSetColorSpace(hProfile, ColorSpace); + cmsSetPCS(hProfile, PCS); +} + + + +// This function creates a named color profile dumping all the contents of transform to a single profile +// In this way, LittleCMS may be used to "group" several named color databases into a single profile. +// It has, however, several minor limitations. PCS is always Lab, which is not very critic since this +// is the normal PCS for named color profiles. +static +cmsHPROFILE CreateNamedColorDevicelink(cmsHTRANSFORM xform) +{ + _cmsTRANSFORM* v = (_cmsTRANSFORM*) xform; + cmsHPROFILE hICC = NULL; + cmsUInt32Number i, nColors; + cmsNAMEDCOLORLIST *nc2 = NULL, *Original = NULL; + + // Create an empty placeholder + hICC = cmsCreateProfilePlaceholder(v->ContextID); + if (hICC == NULL) return NULL; + + // Critical information + cmsSetDeviceClass(hICC, cmsSigNamedColorClass); + cmsSetColorSpace(hICC, v ->ExitColorSpace); + cmsSetPCS(hICC, cmsSigLabData); + + // Tag profile with information + if (!SetTextTags(hICC, L"Named color devicelink")) goto Error; + + Original = cmsGetNamedColorList(xform); + if (Original == NULL) goto Error; + + nColors = cmsNamedColorCount(Original); + nc2 = cmsDupNamedColorList(Original); + if (nc2 == NULL) goto Error; + + // Colorant count now depends on the output space + nc2 ->ColorantCount = cmsPipelineOutputChannels(v ->Lut); + + // Make sure we have proper formatters + cmsChangeBuffersFormat(xform, TYPE_NAMED_COLOR_INDEX, + FLOAT_SH(0) | COLORSPACE_SH(_cmsLCMScolorSpace(v ->ExitColorSpace)) + | BYTES_SH(2) | CHANNELS_SH(cmsChannelsOfColorSpace(v ->ExitColorSpace))); + + // Apply the transfor to colorants. + for (i=0; i < nColors; i++) { + cmsDoTransform(xform, &i, nc2 ->List[i].DeviceColorant, 1); + } + + if (!cmsWriteTag(hICC, cmsSigNamedColor2Tag, (void*) nc2)) goto Error; + cmsFreeNamedColorList(nc2); + + return hICC; + +Error: + if (hICC != NULL) cmsCloseProfile(hICC); + return NULL; +} + + +// This structure holds information about which MPU can be stored on a profile based on the version + +typedef struct { + cmsBool IsV4; // Is a V4 tag? + cmsTagSignature RequiredTag; // Set to 0 for both types + cmsTagTypeSignature LutType; // The LUT type + int nTypes; // Number of types (up to 5) + cmsStageSignature MpeTypes[5]; // 5 is the maximum number + +} cmsAllowedLUT; + +#define cmsSig0 ((cmsTagSignature) 0) + +static const cmsAllowedLUT AllowedLUTTypes[] = { + + { FALSE, cmsSig0, cmsSigLut16Type, 4, { cmsSigMatrixElemType, cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType } }, + { FALSE, cmsSig0, cmsSigLut16Type, 3, { cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType } }, + { FALSE, cmsSig0, cmsSigLut16Type, 2, { cmsSigCurveSetElemType, cmsSigCLutElemType } }, + { TRUE, cmsSig0, cmsSigLutAtoBType, 1, { cmsSigCurveSetElemType } }, + { TRUE , cmsSigAToB0Tag, cmsSigLutAtoBType, 3, { cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType } }, + { TRUE , cmsSigAToB0Tag, cmsSigLutAtoBType, 3, { cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType } }, + { TRUE , cmsSigAToB0Tag, cmsSigLutAtoBType, 5, { cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType }}, + { TRUE , cmsSigBToA0Tag, cmsSigLutBtoAType, 1, { cmsSigCurveSetElemType }}, + { TRUE , cmsSigBToA0Tag, cmsSigLutBtoAType, 3, { cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType }}, + { TRUE , cmsSigBToA0Tag, cmsSigLutBtoAType, 3, { cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType }}, + { TRUE , cmsSigBToA0Tag, cmsSigLutBtoAType, 5, { cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType }} +}; + +#define SIZE_OF_ALLOWED_LUT (sizeof(AllowedLUTTypes)/sizeof(cmsAllowedLUT)) + +// Check a single entry +static +cmsBool CheckOne(const cmsAllowedLUT* Tab, const cmsPipeline* Lut) +{ + cmsStage* mpe; + int n; + + for (n=0, mpe = Lut ->Elements; mpe != NULL; mpe = mpe ->Next, n++) { + + if (n >= Tab ->nTypes) return FALSE; + if (cmsStageType(mpe) != Tab ->MpeTypes[n]) return FALSE; + } + + return (n == Tab ->nTypes); +} + + +static +const cmsAllowedLUT* FindCombination(const cmsPipeline* Lut, cmsBool IsV4, cmsTagSignature DestinationTag) +{ + cmsUInt32Number n; + + for (n=0; n < SIZE_OF_ALLOWED_LUT; n++) { + + const cmsAllowedLUT* Tab = AllowedLUTTypes + n; + + if (IsV4 ^ Tab -> IsV4) continue; + if ((Tab ->RequiredTag != 0) && (Tab ->RequiredTag != DestinationTag)) continue; + + if (CheckOne(Tab, Lut)) return Tab; + } + + return NULL; +} + + +// Does convert a transform into a device link profile +cmsHPROFILE CMSEXPORT cmsTransform2DeviceLink(cmsHTRANSFORM hTransform, cmsFloat64Number Version, cmsUInt32Number dwFlags) +{ + cmsHPROFILE hProfile = NULL; + cmsUInt32Number FrmIn, FrmOut; + cmsInt32Number ChansIn, ChansOut; + int ColorSpaceBitsIn, ColorSpaceBitsOut; + _cmsTRANSFORM* xform = (_cmsTRANSFORM*) hTransform; + cmsPipeline* LUT = NULL; + cmsStage* mpe; + cmsContext ContextID = cmsGetTransformContextID(hTransform); + const cmsAllowedLUT* AllowedLUT; + cmsTagSignature DestinationTag; + cmsProfileClassSignature deviceClass; + + _cmsAssert(hTransform != NULL); + + // Check if the pipeline holding is valid + if (xform -> Lut == NULL) return NULL; + + // Get the first mpe to check for named color + mpe = cmsPipelineGetPtrToFirstStage(xform ->Lut); + + // Check if is a named color transform + if (mpe != NULL) { + + if (cmsStageType(mpe) == cmsSigNamedColorElemType) { + return CreateNamedColorDevicelink(hTransform); + } + } + + // First thing to do is to get a copy of the transformation + LUT = cmsPipelineDup(xform ->Lut); + if (LUT == NULL) return NULL; + + // Time to fix the Lab2/Lab4 issue. + if ((xform ->EntryColorSpace == cmsSigLabData) && (Version < 4.0)) { + + if (!cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocLabV2ToV4curves(ContextID))) + goto Error; + } + + // On the output side too. Note that due to V2/V4 PCS encoding on lab we cannot fix white misalignments + if ((xform ->ExitColorSpace) == cmsSigLabData && (Version < 4.0)) { + + dwFlags |= cmsFLAGS_NOWHITEONWHITEFIXUP; + if (!cmsPipelineInsertStage(LUT, cmsAT_END, _cmsStageAllocLabV4ToV2(ContextID))) + goto Error; + } + + + hProfile = cmsCreateProfilePlaceholder(ContextID); + if (!hProfile) goto Error; // can't allocate + + cmsSetProfileVersion(hProfile, Version); + + FixColorSpaces(hProfile, xform -> EntryColorSpace, xform -> ExitColorSpace, dwFlags); + + // Optimize the LUT and precalculate a devicelink + + ChansIn = cmsChannelsOfColorSpace(xform -> EntryColorSpace); + ChansOut = cmsChannelsOfColorSpace(xform -> ExitColorSpace); + + ColorSpaceBitsIn = _cmsLCMScolorSpace(xform -> EntryColorSpace); + ColorSpaceBitsOut = _cmsLCMScolorSpace(xform -> ExitColorSpace); + + FrmIn = COLORSPACE_SH(ColorSpaceBitsIn) | CHANNELS_SH(ChansIn)|BYTES_SH(2); + FrmOut = COLORSPACE_SH(ColorSpaceBitsOut) | CHANNELS_SH(ChansOut)|BYTES_SH(2); + + deviceClass = cmsGetDeviceClass(hProfile); + + if (deviceClass == cmsSigOutputClass) + DestinationTag = cmsSigBToA0Tag; + else + DestinationTag = cmsSigAToB0Tag; + + // Check if the profile/version can store the result + if (dwFlags & cmsFLAGS_FORCE_CLUT) + AllowedLUT = NULL; + else + AllowedLUT = FindCombination(LUT, Version >= 4.0, DestinationTag); + + if (AllowedLUT == NULL) { + + // Try to optimize + _cmsOptimizePipeline(ContextID, &LUT, xform ->RenderingIntent, &FrmIn, &FrmOut, &dwFlags); + AllowedLUT = FindCombination(LUT, Version >= 4.0, DestinationTag); + + } + + // If no way, then force CLUT that for sure can be written + if (AllowedLUT == NULL) { + + cmsStage* FirstStage; + cmsStage* LastStage; + + dwFlags |= cmsFLAGS_FORCE_CLUT; + _cmsOptimizePipeline(ContextID, &LUT, xform ->RenderingIntent, &FrmIn, &FrmOut, &dwFlags); + + // Put identity curves if needed + FirstStage = cmsPipelineGetPtrToFirstStage(LUT); + if (FirstStage != NULL && FirstStage ->Type != cmsSigCurveSetElemType) + if (!cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocIdentityCurves(ContextID, ChansIn))) + goto Error; + + LastStage = cmsPipelineGetPtrToLastStage(LUT); + if (LastStage != NULL && LastStage ->Type != cmsSigCurveSetElemType) + if (!cmsPipelineInsertStage(LUT, cmsAT_END, _cmsStageAllocIdentityCurves(ContextID, ChansOut))) + goto Error; + + AllowedLUT = FindCombination(LUT, Version >= 4.0, DestinationTag); + } + + // Somethings is wrong... + if (AllowedLUT == NULL) { + goto Error; + } + + + if (dwFlags & cmsFLAGS_8BITS_DEVICELINK) + cmsPipelineSetSaveAs8bitsFlag(LUT, TRUE); + + // Tag profile with information + if (!SetTextTags(hProfile, L"devicelink")) goto Error; + + // Store result + if (!cmsWriteTag(hProfile, DestinationTag, LUT)) goto Error; + + + // Colorant tables have special rules depening on deviceClass + if (xform -> InputColorant != NULL && + (deviceClass == cmsSigLinkClass || deviceClass == cmsSigInputClass)) { + + if (!cmsWriteTag(hProfile, cmsSigColorantTableTag, xform->InputColorant)) goto Error; + } + + if (xform -> OutputColorant != NULL) { + + if (deviceClass == cmsSigLinkClass) { + + if (!cmsWriteTag(hProfile, cmsSigColorantTableOutTag, xform->OutputColorant)) goto Error; + } + else + { + if (!cmsWriteTag(hProfile, cmsSigColorantTableTag, xform->OutputColorant)) goto Error; + } + } + + if ((deviceClass == cmsSigLinkClass) && (xform ->Sequence != NULL)) { + if (!_cmsWriteProfileSequence(hProfile, xform ->Sequence)) goto Error; + } + + // Set the white point + if (deviceClass == cmsSigInputClass) { + if (!cmsWriteTag(hProfile, cmsSigMediaWhitePointTag, &xform ->EntryWhitePoint)) goto Error; + } + else { + if (!cmsWriteTag(hProfile, cmsSigMediaWhitePointTag, &xform ->ExitWhitePoint)) goto Error; + } + + + // Per 7.2.15 in spec 4.3 + cmsSetHeaderRenderingIntent(hProfile, xform ->RenderingIntent); + + cmsPipelineFree(LUT); + return hProfile; + +Error: + if (LUT != NULL) cmsPipelineFree(LUT); + cmsCloseProfile(hProfile); + return NULL; +} diff --git a/local/recipes/libs/lcms2/source/src/cmswtpnt.c b/local/recipes/libs/lcms2/source/src/cmswtpnt.c new file mode 100644 index 0000000000..8630286bc2 --- /dev/null +++ b/local/recipes/libs/lcms2/source/src/cmswtpnt.c @@ -0,0 +1,353 @@ +//--------------------------------------------------------------------------------- +// +// Little Color Management System +// Copyright (c) 1998-2026 Marti Maria Saguer +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//--------------------------------------------------------------------------------- +// + +#include "lcms2_internal.h" + + +// D50 - Widely used +const cmsCIEXYZ* CMSEXPORT cmsD50_XYZ(void) +{ + static cmsCIEXYZ D50XYZ = {cmsD50X, cmsD50Y, cmsD50Z}; + + return &D50XYZ; +} + +const cmsCIExyY* CMSEXPORT cmsD50_xyY(void) +{ + static cmsCIExyY D50xyY; + + cmsXYZ2xyY(&D50xyY, cmsD50_XYZ()); + + return &D50xyY; +} + +// Obtains WhitePoint from Temperature +cmsBool CMSEXPORT cmsWhitePointFromTemp(cmsCIExyY* WhitePoint, cmsFloat64Number TempK) +{ + cmsFloat64Number x, y; + cmsFloat64Number T, T2, T3; + // cmsFloat64Number M1, M2; + + _cmsAssert(WhitePoint != NULL); + + T = TempK; + T2 = T*T; // Square + T3 = T2*T; // Cube + + // For correlated color temperature (T) between 4000K and 7000K: + + if (T >= 4000. && T <= 7000.) + { + x = -4.6070*(1E9/T3) + 2.9678*(1E6/T2) + 0.09911*(1E3/T) + 0.244063; + } + else + // or for correlated color temperature (T) between 7000K and 25000K: + + if (T > 7000.0 && T <= 25000.0) + { + x = -2.0064*(1E9/T3) + 1.9018*(1E6/T2) + 0.24748*(1E3/T) + 0.237040; + } + else { + cmsSignalError(0, cmsERROR_RANGE, "cmsWhitePointFromTemp: invalid temp"); + return FALSE; + } + + // Obtain y(x) + y = -3.000*(x*x) + 2.870*x - 0.275; + + // wave factors (not used, but here for futures extensions) + + // M1 = (-1.3515 - 1.7703*x + 5.9114 *y)/(0.0241 + 0.2562*x - 0.7341*y); + // M2 = (0.0300 - 31.4424*x + 30.0717*y)/(0.0241 + 0.2562*x - 0.7341*y); + + WhitePoint -> x = x; + WhitePoint -> y = y; + WhitePoint -> Y = 1.0; + + return TRUE; +} + + + +typedef struct { + + cmsFloat64Number mirek; // temp (in microreciprocal kelvin) + cmsFloat64Number ut; // u coord of intersection w/ blackbody locus + cmsFloat64Number vt; // v coord of intersection w/ blackbody locus + cmsFloat64Number tt; // slope of ISOTEMPERATURE. line + + } ISOTEMPERATURE; + +static const ISOTEMPERATURE isotempdata[] = { +// {Mirek, Ut, Vt, Tt } + {0, 0.18006, 0.26352, -0.24341}, + {10, 0.18066, 0.26589, -0.25479}, + {20, 0.18133, 0.26846, -0.26876}, + {30, 0.18208, 0.27119, -0.28539}, + {40, 0.18293, 0.27407, -0.30470}, + {50, 0.18388, 0.27709, -0.32675}, + {60, 0.18494, 0.28021, -0.35156}, + {70, 0.18611, 0.28342, -0.37915}, + {80, 0.18740, 0.28668, -0.40955}, + {90, 0.18880, 0.28997, -0.44278}, + {100, 0.19032, 0.29326, -0.47888}, + {125, 0.19462, 0.30141, -0.58204}, + {150, 0.19962, 0.30921, -0.70471}, + {175, 0.20525, 0.31647, -0.84901}, + {200, 0.21142, 0.32312, -1.0182 }, + {225, 0.21807, 0.32909, -1.2168 }, + {250, 0.22511, 0.33439, -1.4512 }, + {275, 0.23247, 0.33904, -1.7298 }, + {300, 0.24010, 0.34308, -2.0637 }, + {325, 0.24702, 0.34655, -2.4681 }, + {350, 0.25591, 0.34951, -2.9641 }, + {375, 0.26400, 0.35200, -3.5814 }, + {400, 0.27218, 0.35407, -4.3633 }, + {425, 0.28039, 0.35577, -5.3762 }, + {450, 0.28863, 0.35714, -6.7262 }, + {475, 0.29685, 0.35823, -8.5955 }, + {500, 0.30505, 0.35907, -11.324 }, + {525, 0.31320, 0.35968, -15.628 }, + {550, 0.32129, 0.36011, -23.325 }, + {575, 0.32931, 0.36038, -40.770 }, + {600, 0.33724, 0.36051, -116.45 } +}; + +#define NISO sizeof(isotempdata)/sizeof(ISOTEMPERATURE) + + +// Robertson's method +cmsBool CMSEXPORT cmsTempFromWhitePoint(cmsFloat64Number* TempK, const cmsCIExyY* WhitePoint) +{ + cmsUInt32Number j; + cmsFloat64Number us,vs; + cmsFloat64Number uj,vj,tj,di,dj,mi,mj; + cmsFloat64Number xs, ys; + + _cmsAssert(WhitePoint != NULL); + _cmsAssert(TempK != NULL); + + di = mi = 0; + xs = WhitePoint -> x; + ys = WhitePoint -> y; + + // convert (x,y) to CIE 1960 (u,WhitePoint) + + us = (2*xs) / (-xs + 6*ys + 1.5); + vs = (3*ys) / (-xs + 6*ys + 1.5); + + + for (j=0; j < NISO; j++) { + + uj = isotempdata[j].ut; + vj = isotempdata[j].vt; + tj = isotempdata[j].tt; + mj = isotempdata[j].mirek; + + dj = ((vs - vj) - tj * (us - uj)) / sqrt(1.0 + tj * tj); + + if ((j != 0) && (di/dj < 0.0)) { + + // Found a match + *TempK = 1000000.0 / (mi + (di / (di - dj)) * (mj - mi)); + return TRUE; + } + + di = dj; + mi = mj; + } + + // Not found + return FALSE; +} + + +// Compute chromatic adaptation matrix using Chad as cone matrix + +static +cmsBool ComputeChromaticAdaptation(cmsMAT3* Conversion, + const cmsCIEXYZ* SourceWhitePoint, + const cmsCIEXYZ* DestWhitePoint, + const cmsMAT3* Chad) + +{ + + cmsMAT3 Chad_Inv; + cmsVEC3 ConeSourceXYZ, ConeSourceRGB; + cmsVEC3 ConeDestXYZ, ConeDestRGB; + cmsMAT3 Cone, Tmp; + + + Tmp = *Chad; + if (!_cmsMAT3inverse(&Tmp, &Chad_Inv)) return FALSE; + + _cmsVEC3init(&ConeSourceXYZ, SourceWhitePoint -> X, + SourceWhitePoint -> Y, + SourceWhitePoint -> Z); + + _cmsVEC3init(&ConeDestXYZ, DestWhitePoint -> X, + DestWhitePoint -> Y, + DestWhitePoint -> Z); + + _cmsMAT3eval(&ConeSourceRGB, Chad, &ConeSourceXYZ); + _cmsMAT3eval(&ConeDestRGB, Chad, &ConeDestXYZ); + + if ((fabs(ConeSourceRGB.n[0]) < MATRIX_DET_TOLERANCE) || + (fabs(ConeSourceRGB.n[1]) < MATRIX_DET_TOLERANCE) || + (fabs(ConeSourceRGB.n[2]) < MATRIX_DET_TOLERANCE)) return FALSE; + + // Build matrix + _cmsVEC3init(&Cone.v[0], ConeDestRGB.n[0]/ConeSourceRGB.n[0], 0.0, 0.0); + _cmsVEC3init(&Cone.v[1], 0.0, ConeDestRGB.n[1]/ConeSourceRGB.n[1], 0.0); + _cmsVEC3init(&Cone.v[2], 0.0, 0.0, ConeDestRGB.n[2]/ConeSourceRGB.n[2]); + + // Normalize + _cmsMAT3per(&Tmp, &Cone, Chad); + _cmsMAT3per(Conversion, &Chad_Inv, &Tmp); + + return TRUE; +} + +// Returns the final chrmatic adaptation from illuminant FromIll to Illuminant ToIll +// The cone matrix can be specified in ConeMatrix. If NULL, Bradford is assumed +cmsBool _cmsAdaptationMatrix(cmsMAT3* r, const cmsMAT3* ConeMatrix, const cmsCIEXYZ* FromIll, const cmsCIEXYZ* ToIll) +{ + cmsMAT3 LamRigg = {{ // Bradford matrix + {{ 0.8951, 0.2664, -0.1614 }}, + {{ -0.7502, 1.7135, 0.0367 }}, + {{ 0.0389, -0.0685, 1.0296 }} + }}; + + if (ConeMatrix == NULL) + ConeMatrix = &LamRigg; + + return ComputeChromaticAdaptation(r, FromIll, ToIll, ConeMatrix); +} + +// Same as anterior, but assuming D50 destination. White point is given in xyY +static +cmsBool _cmsAdaptMatrixToD50(cmsMAT3* r, const cmsCIExyY* SourceWhitePt) +{ + cmsCIEXYZ Dn; + cmsMAT3 Bradford; + cmsMAT3 Tmp; + + cmsxyY2XYZ(&Dn, SourceWhitePt); + + if (!_cmsAdaptationMatrix(&Bradford, NULL, &Dn, cmsD50_XYZ())) return FALSE; + + Tmp = *r; + _cmsMAT3per(r, &Bradford, &Tmp); + + return TRUE; +} + +// Build a White point, primary chromas transfer matrix from RGB to CIE XYZ +// This is just an approximation, I am not handling all the non-linear +// aspects of the RGB to XYZ process, and assuming that the gamma correction +// has transitive property in the transformation chain. +// +// the algorithm: +// +// - First I build the absolute conversion matrix using +// primaries in XYZ. This matrix is next inverted +// - Then I eval the source white point across this matrix +// obtaining the coefficients of the transformation +// - Then, I apply these coefficients to the original matrix +// +cmsBool _cmsBuildRGB2XYZtransferMatrix(cmsMAT3* r, const cmsCIExyY* WhitePt, const cmsCIExyYTRIPLE* Primrs) +{ + cmsVEC3 WhitePoint, Coef; + cmsMAT3 Result, Primaries; + cmsFloat64Number xn, yn; + cmsFloat64Number xr, yr; + cmsFloat64Number xg, yg; + cmsFloat64Number xb, yb; + + xn = WhitePt -> x; + yn = WhitePt -> y; + xr = Primrs -> Red.x; + yr = Primrs -> Red.y; + xg = Primrs -> Green.x; + yg = Primrs -> Green.y; + xb = Primrs -> Blue.x; + yb = Primrs -> Blue.y; + + // Build Primaries matrix + _cmsVEC3init(&Primaries.v[0], xr, xg, xb); + _cmsVEC3init(&Primaries.v[1], yr, yg, yb); + _cmsVEC3init(&Primaries.v[2], (1-xr-yr), (1-xg-yg), (1-xb-yb)); + + + // Result = Primaries ^ (-1) inverse matrix + if (!_cmsMAT3inverse(&Primaries, &Result)) + return FALSE; + + + _cmsVEC3init(&WhitePoint, xn/yn, 1.0, (1.0-xn-yn)/yn); + + // Across inverse primaries ... + _cmsMAT3eval(&Coef, &Result, &WhitePoint); + + // Give us the Coefs, then I build transformation matrix + _cmsVEC3init(&r -> v[0], Coef.n[VX]*xr, Coef.n[VY]*xg, Coef.n[VZ]*xb); + _cmsVEC3init(&r -> v[1], Coef.n[VX]*yr, Coef.n[VY]*yg, Coef.n[VZ]*yb); + _cmsVEC3init(&r -> v[2], Coef.n[VX]*(1.0-xr-yr), Coef.n[VY]*(1.0-xg-yg), Coef.n[VZ]*(1.0-xb-yb)); + + + return _cmsAdaptMatrixToD50(r, WhitePt); + +} + + +// Adapts a color to a given illuminant. Original color is expected to have +// a SourceWhitePt white point. +cmsBool CMSEXPORT cmsAdaptToIlluminant(cmsCIEXYZ* Result, + const cmsCIEXYZ* SourceWhitePt, + const cmsCIEXYZ* Illuminant, + const cmsCIEXYZ* Value) +{ + cmsMAT3 Bradford; + cmsVEC3 In, Out; + + _cmsAssert(Result != NULL); + _cmsAssert(SourceWhitePt != NULL); + _cmsAssert(Illuminant != NULL); + _cmsAssert(Value != NULL); + + if (!_cmsAdaptationMatrix(&Bradford, NULL, SourceWhitePt, Illuminant)) return FALSE; + + _cmsVEC3init(&In, Value -> X, Value -> Y, Value -> Z); + _cmsMAT3eval(&Out, &Bradford, &In); + + Result -> X = Out.n[0]; + Result -> Y = Out.n[1]; + Result -> Z = Out.n[2]; + + return TRUE; +} + + diff --git a/local/recipes/libs/lcms2/source/src/cmsxform.c b/local/recipes/libs/lcms2/source/src/cmsxform.c new file mode 100644 index 0000000000..934328bc80 --- /dev/null +++ b/local/recipes/libs/lcms2/source/src/cmsxform.c @@ -0,0 +1,1506 @@ +//--------------------------------------------------------------------------------- +// +// Little Color Management System +// Copyright (c) 1998-2026 Marti Maria Saguer +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//--------------------------------------------------------------------------------- +// + +#include "lcms2_internal.h" + +// Transformations stuff +// ----------------------------------------------------------------------- + +#define DEFAULT_OBSERVER_ADAPTATION_STATE 1.0 + +// The Context0 observer adaptation state. +_cmsAdaptationStateChunkType _cmsAdaptationStateChunk = { DEFAULT_OBSERVER_ADAPTATION_STATE }; + +// Init and duplicate observer adaptation state +void _cmsAllocAdaptationStateChunk(struct _cmsContext_struct* ctx, + const struct _cmsContext_struct* src) +{ + static _cmsAdaptationStateChunkType AdaptationStateChunk = { DEFAULT_OBSERVER_ADAPTATION_STATE }; + void* from; + + if (src != NULL) { + from = src ->chunks[AdaptationStateContext]; + } + else { + from = &AdaptationStateChunk; + } + + ctx ->chunks[AdaptationStateContext] = _cmsSubAllocDup(ctx ->MemPool, from, sizeof(_cmsAdaptationStateChunkType)); +} + + +// Sets adaptation state for absolute colorimetric intent in the given context. Adaptation state applies on all +// but cmsCreateExtendedTransformTHR(). Little CMS can handle incomplete adaptation states. +cmsFloat64Number CMSEXPORT cmsSetAdaptationStateTHR(cmsContext ContextID, cmsFloat64Number d) +{ + cmsFloat64Number prev; + _cmsAdaptationStateChunkType* ptr = (_cmsAdaptationStateChunkType*) _cmsContextGetClientChunk(ContextID, AdaptationStateContext); + + // Get previous value for return + prev = ptr ->AdaptationState; + + // Set the value if d is positive or zero + if (d >= 0.0) { + + ptr ->AdaptationState = d; + } + + // Always return previous value + return prev; +} + + +// The adaptation state may be defaulted by this function. If you don't like it, use the extended transform routine +cmsFloat64Number CMSEXPORT cmsSetAdaptationState(cmsFloat64Number d) +{ + return cmsSetAdaptationStateTHR(NULL, d); +} + +// ----------------------------------------------------------------------- + +// Alarm codes for 16-bit transformations, because the fixed range of containers there are +// no values left to mark out of gamut. + +#define DEFAULT_ALARM_CODES_VALUE {0x7F00, 0x7F00, 0x7F00, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} + +_cmsAlarmCodesChunkType _cmsAlarmCodesChunk = { DEFAULT_ALARM_CODES_VALUE }; + +// Sets the codes used to mark out-out-gamut on Proofing transforms for a given context. Values are meant to be +// encoded in 16 bits. +void CMSEXPORT cmsSetAlarmCodesTHR(cmsContext ContextID, const cmsUInt16Number AlarmCodesP[cmsMAXCHANNELS]) +{ + _cmsAlarmCodesChunkType* ContextAlarmCodes = (_cmsAlarmCodesChunkType*) _cmsContextGetClientChunk(ContextID, AlarmCodesContext); + + _cmsAssert(ContextAlarmCodes != NULL); // Can't happen + + memcpy(ContextAlarmCodes->AlarmCodes, AlarmCodesP, sizeof(ContextAlarmCodes->AlarmCodes)); +} + +// Gets the current codes used to mark out-out-gamut on Proofing transforms for the given context. +// Values are meant to be encoded in 16 bits. +void CMSEXPORT cmsGetAlarmCodesTHR(cmsContext ContextID, cmsUInt16Number AlarmCodesP[cmsMAXCHANNELS]) +{ + _cmsAlarmCodesChunkType* ContextAlarmCodes = (_cmsAlarmCodesChunkType*) _cmsContextGetClientChunk(ContextID, AlarmCodesContext); + + _cmsAssert(ContextAlarmCodes != NULL); // Can't happen + + memcpy(AlarmCodesP, ContextAlarmCodes->AlarmCodes, sizeof(ContextAlarmCodes->AlarmCodes)); +} + +void CMSEXPORT cmsSetAlarmCodes(const cmsUInt16Number NewAlarm[cmsMAXCHANNELS]) +{ + _cmsAssert(NewAlarm != NULL); + + cmsSetAlarmCodesTHR(NULL, NewAlarm); +} + +void CMSEXPORT cmsGetAlarmCodes(cmsUInt16Number OldAlarm[cmsMAXCHANNELS]) +{ + _cmsAssert(OldAlarm != NULL); + cmsGetAlarmCodesTHR(NULL, OldAlarm); +} + + +// Init and duplicate alarm codes +void _cmsAllocAlarmCodesChunk(struct _cmsContext_struct* ctx, + const struct _cmsContext_struct* src) +{ + static _cmsAlarmCodesChunkType AlarmCodesChunk = { DEFAULT_ALARM_CODES_VALUE }; + void* from; + + if (src != NULL) { + from = src ->chunks[AlarmCodesContext]; + } + else { + from = &AlarmCodesChunk; + } + + ctx ->chunks[AlarmCodesContext] = _cmsSubAllocDup(ctx ->MemPool, from, sizeof(_cmsAlarmCodesChunkType)); +} + +// ----------------------------------------------------------------------- + +// Get rid of transform resources +void CMSEXPORT cmsDeleteTransform(cmsHTRANSFORM hTransform) +{ + _cmsTRANSFORM* p = (_cmsTRANSFORM*) hTransform; + + _cmsAssert(p != NULL); + + if (p -> GamutCheck) + cmsPipelineFree(p -> GamutCheck); + + if (p -> Lut) + cmsPipelineFree(p -> Lut); + + if (p ->InputColorant) + cmsFreeNamedColorList(p ->InputColorant); + + if (p -> OutputColorant) + cmsFreeNamedColorList(p ->OutputColorant); + + if (p ->Sequence) + cmsFreeProfileSequenceDescription(p ->Sequence); + + if (p ->UserData) + p ->FreeUserData(p ->ContextID, p ->UserData); + + _cmsFree(p ->ContextID, (void *) p); +} + + +static +cmsUInt32Number PixelSize(cmsUInt32Number Format) +{ + cmsUInt32Number fmt_bytes = T_BYTES(Format); + + // For double, the T_BYTES field is zero + if (fmt_bytes == 0) + return sizeof(cmsUInt64Number); + + // Otherwise, it is already correct for all formats + return fmt_bytes; +} + + + + +// Apply transform. +void CMSEXPORT cmsDoTransform(cmsHTRANSFORM Transform, + const void* InputBuffer, + void* OutputBuffer, + cmsUInt32Number Size) + +{ + _cmsTRANSFORM* p = (_cmsTRANSFORM*) Transform; + cmsStride stride; + + stride.BytesPerLineIn = 0; // Not used + stride.BytesPerLineOut = 0; + stride.BytesPerPlaneIn = Size * PixelSize(p->InputFormat); + stride.BytesPerPlaneOut = Size * PixelSize(p->OutputFormat); + + p -> xform(p, InputBuffer, OutputBuffer, Size, 1, &stride); +} + + +// This is a legacy stride for planar +void CMSEXPORT cmsDoTransformStride(cmsHTRANSFORM Transform, + const void* InputBuffer, + void* OutputBuffer, + cmsUInt32Number Size, cmsUInt32Number Stride) + +{ + _cmsTRANSFORM* p = (_cmsTRANSFORM*) Transform; + cmsStride stride; + + stride.BytesPerLineIn = 0; + stride.BytesPerLineOut = 0; + stride.BytesPerPlaneIn = Stride; + stride.BytesPerPlaneOut = Stride; + + p -> xform(p, InputBuffer, OutputBuffer, Size, 1, &stride); +} + +// This is the "fast" function for plugins +void CMSEXPORT cmsDoTransformLineStride(cmsHTRANSFORM Transform, + const void* InputBuffer, + void* OutputBuffer, + cmsUInt32Number PixelsPerLine, + cmsUInt32Number LineCount, + cmsUInt32Number BytesPerLineIn, + cmsUInt32Number BytesPerLineOut, + cmsUInt32Number BytesPerPlaneIn, + cmsUInt32Number BytesPerPlaneOut) + +{ + _cmsTRANSFORM* p = (_cmsTRANSFORM*) Transform; + cmsStride stride; + + stride.BytesPerLineIn = BytesPerLineIn; + stride.BytesPerLineOut = BytesPerLineOut; + stride.BytesPerPlaneIn = BytesPerPlaneIn; + stride.BytesPerPlaneOut = BytesPerPlaneOut; + + p->xform(p, InputBuffer, OutputBuffer, PixelsPerLine, LineCount, &stride); +} + + + +// Transform routines ---------------------------------------------------------------------------------------------------------- + +// Float xform converts floats. Since there are no performance issues, one routine does all job, including gamut check. +// Note that because extended range, we can use a -1.0 value for out of gamut in this case. +static +void FloatXFORM(_cmsTRANSFORM* p, + const void* in, + void* out, + cmsUInt32Number PixelsPerLine, + cmsUInt32Number LineCount, + const cmsStride* Stride) +{ + cmsUInt8Number* accum; + cmsUInt8Number* output; + cmsFloat32Number fIn[cmsMAXCHANNELS], fOut[cmsMAXCHANNELS]; + cmsFloat32Number OutOfGamut; + size_t i, j, c, strideIn, strideOut; + + _cmsHandleExtraChannels(p, in, out, PixelsPerLine, LineCount, Stride); + + strideIn = 0; + strideOut = 0; + memset(fIn, 0, sizeof(fIn)); + memset(fOut, 0, sizeof(fOut)); + + for (i = 0; i < LineCount; i++) { + + accum = (cmsUInt8Number*)in + strideIn; + output = (cmsUInt8Number*)out + strideOut; + + for (j = 0; j < PixelsPerLine; j++) { + + accum = p->FromInputFloat(p, fIn, accum, Stride->BytesPerPlaneIn); + + // Any gamut check to do? + if (p->GamutCheck != NULL) { + + // Evaluate gamut marker. + cmsPipelineEvalFloat(fIn, &OutOfGamut, p->GamutCheck); + + // Is current color out of gamut? + if (OutOfGamut > 0.0) { + + _cmsAlarmCodesChunkType* ContextAlarmCodes = (_cmsAlarmCodesChunkType*)_cmsContextGetClientChunk(p->ContextID, AlarmCodesContext); + + // Certainly, out of gamut + for (c = 0; c < cmsMAXCHANNELS; c++) + fOut[c] = ContextAlarmCodes->AlarmCodes[c] / 65535.0F; + + } + else { + // No, proceed normally + cmsPipelineEvalFloat(fIn, fOut, p->Lut); + } + } + else { + + // No gamut check at all + cmsPipelineEvalFloat(fIn, fOut, p->Lut); + } + + + output = p->ToOutputFloat(p, fOut, output, Stride->BytesPerPlaneOut); + } + + strideIn += Stride->BytesPerLineIn; + strideOut += Stride->BytesPerLineOut; + } + +} + + +static +void NullFloatXFORM(_cmsTRANSFORM* p, + const void* in, + void* out, + cmsUInt32Number PixelsPerLine, + cmsUInt32Number LineCount, + const cmsStride* Stride) + +{ + cmsUInt8Number* accum; + cmsUInt8Number* output; + cmsFloat32Number fIn[cmsMAXCHANNELS]; + size_t i, j, strideIn, strideOut; + + _cmsHandleExtraChannels(p, in, out, PixelsPerLine, LineCount, Stride); + + strideIn = 0; + strideOut = 0; + memset(fIn, 0, sizeof(fIn)); + + for (i = 0; i < LineCount; i++) { + + accum = (cmsUInt8Number*) in + strideIn; + output = (cmsUInt8Number*) out + strideOut; + + for (j = 0; j < PixelsPerLine; j++) { + + accum = p->FromInputFloat(p, fIn, accum, Stride ->BytesPerPlaneIn); + output = p->ToOutputFloat(p, fIn, output, Stride->BytesPerPlaneOut); + } + + strideIn += Stride->BytesPerLineIn; + strideOut += Stride->BytesPerLineOut; + } +} + +// 16 bit precision ----------------------------------------------------------------------------------------------------------- + +// Null transformation, only applies formatters. No cache +static +void NullXFORM(_cmsTRANSFORM* p, + const void* in, + void* out, + cmsUInt32Number PixelsPerLine, + cmsUInt32Number LineCount, + const cmsStride* Stride) +{ + cmsUInt8Number* accum; + cmsUInt8Number* output; + cmsUInt16Number wIn[cmsMAXCHANNELS]; + size_t i, j, strideIn, strideOut; + + _cmsHandleExtraChannels(p, in, out, PixelsPerLine, LineCount, Stride); + + strideIn = 0; + strideOut = 0; + memset(wIn, 0, sizeof(wIn)); + + for (i = 0; i < LineCount; i++) { + + accum = (cmsUInt8Number*)in + strideIn; + output = (cmsUInt8Number*)out + strideOut; + + for (j = 0; j < PixelsPerLine; j++) { + + accum = p->FromInput(p, wIn, accum, Stride->BytesPerPlaneIn); + output = p->ToOutput(p, wIn, output, Stride->BytesPerPlaneOut); + } + + strideIn += Stride->BytesPerLineIn; + strideOut += Stride->BytesPerLineOut; + } + +} + + +// No gamut check, no cache, 16 bits +static +void PrecalculatedXFORM(_cmsTRANSFORM* p, + const void* in, + void* out, + cmsUInt32Number PixelsPerLine, + cmsUInt32Number LineCount, + const cmsStride* Stride) +{ + CMSREGISTER cmsUInt8Number* accum; + CMSREGISTER cmsUInt8Number* output; + cmsUInt16Number wIn[cmsMAXCHANNELS], wOut[cmsMAXCHANNELS]; + size_t i, j, strideIn, strideOut; + + _cmsHandleExtraChannels(p, in, out, PixelsPerLine, LineCount, Stride); + + strideIn = 0; + strideOut = 0; + memset(wIn, 0, sizeof(wIn)); + memset(wOut, 0, sizeof(wOut)); + + for (i = 0; i < LineCount; i++) { + + accum = (cmsUInt8Number*)in + strideIn; + output = (cmsUInt8Number*)out + strideOut; + + for (j = 0; j < PixelsPerLine; j++) { + + accum = p->FromInput(p, wIn, accum, Stride->BytesPerPlaneIn); + p->Lut->Eval16Fn(wIn, wOut, p->Lut->Data); + output = p->ToOutput(p, wOut, output, Stride->BytesPerPlaneOut); + } + + strideIn += Stride->BytesPerLineIn; + strideOut += Stride->BytesPerLineOut; + } + +} + + +// Auxiliary: Handle precalculated gamut check. The retrieval of context may be alittle bit slow, but this function is not critical. +static +void TransformOnePixelWithGamutCheck(_cmsTRANSFORM* p, + const cmsUInt16Number wIn[], + cmsUInt16Number wOut[]) +{ + cmsUInt16Number wOutOfGamut; + + p ->GamutCheck ->Eval16Fn(wIn, &wOutOfGamut, p ->GamutCheck ->Data); + if (wOutOfGamut >= 1) { + + cmsUInt32Number i; + _cmsAlarmCodesChunkType* ContextAlarmCodes = (_cmsAlarmCodesChunkType*) _cmsContextGetClientChunk(p->ContextID, AlarmCodesContext); + + for (i=0; i < p ->Lut->OutputChannels; i++) { + + wOut[i] = ContextAlarmCodes ->AlarmCodes[i]; + } + } + else + p ->Lut ->Eval16Fn(wIn, wOut, p -> Lut->Data); +} + +// Gamut check, No cache, 16 bits. +static +void PrecalculatedXFORMGamutCheck(_cmsTRANSFORM* p, + const void* in, + void* out, + cmsUInt32Number PixelsPerLine, + cmsUInt32Number LineCount, + const cmsStride* Stride) +{ + cmsUInt8Number* accum; + cmsUInt8Number* output; + cmsUInt16Number wIn[cmsMAXCHANNELS], wOut[cmsMAXCHANNELS]; + size_t i, j, strideIn, strideOut; + + _cmsHandleExtraChannels(p, in, out, PixelsPerLine, LineCount, Stride); + + strideIn = 0; + strideOut = 0; + memset(wIn, 0, sizeof(wIn)); + memset(wOut, 0, sizeof(wOut)); + + for (i = 0; i < LineCount; i++) { + + accum = (cmsUInt8Number*)in + strideIn; + output = (cmsUInt8Number*)out + strideOut; + + for (j = 0; j < PixelsPerLine; j++) { + + accum = p->FromInput(p, wIn, accum, Stride->BytesPerPlaneIn); + TransformOnePixelWithGamutCheck(p, wIn, wOut); + output = p->ToOutput(p, wOut, output, Stride->BytesPerPlaneOut); + } + + strideIn += Stride->BytesPerLineIn; + strideOut += Stride->BytesPerLineOut; + } +} + +// No gamut check, Cache, 16 bits, +static +void CachedXFORM(_cmsTRANSFORM* p, + const void* in, + void* out, + cmsUInt32Number PixelsPerLine, + cmsUInt32Number LineCount, + const cmsStride* Stride) +{ + cmsUInt8Number* accum; + cmsUInt8Number* output; + cmsUInt16Number wIn[cmsMAXCHANNELS], wOut[cmsMAXCHANNELS]; + _cmsCACHE Cache; + size_t i, j, strideIn, strideOut; + + _cmsHandleExtraChannels(p, in, out, PixelsPerLine, LineCount, Stride); + + // Empty buffers for quick memcmp + memset(wIn, 0, sizeof(wIn)); + memset(wOut, 0, sizeof(wOut)); + + // Get copy of zero cache + memcpy(&Cache, &p->Cache, sizeof(Cache)); + + strideIn = 0; + strideOut = 0; + + for (i = 0; i < LineCount; i++) { + + accum = (cmsUInt8Number*)in + strideIn; + output = (cmsUInt8Number*)out + strideOut; + + for (j = 0; j < PixelsPerLine; j++) { + + accum = p->FromInput(p, wIn, accum, Stride->BytesPerPlaneIn); + + if (memcmp(wIn, Cache.CacheIn, sizeof(Cache.CacheIn)) == 0) { + + memcpy(wOut, Cache.CacheOut, sizeof(Cache.CacheOut)); + } + else { + p->Lut->Eval16Fn(wIn, wOut, p->Lut->Data); + + memcpy(Cache.CacheIn, wIn, sizeof(Cache.CacheIn)); + memcpy(Cache.CacheOut, wOut, sizeof(Cache.CacheOut)); + } + + output = p->ToOutput(p, wOut, output, Stride->BytesPerPlaneOut); + } + + strideIn += Stride->BytesPerLineIn; + strideOut += Stride->BytesPerLineOut; + } +} + +// All those nice features together +static +void CachedXFORMGamutCheck(_cmsTRANSFORM* p, + const void* in, + void* out, + cmsUInt32Number PixelsPerLine, + cmsUInt32Number LineCount, + const cmsStride* Stride) +{ + cmsUInt8Number* accum; + cmsUInt8Number* output; + cmsUInt16Number wIn[cmsMAXCHANNELS], wOut[cmsMAXCHANNELS]; + _cmsCACHE Cache; + size_t i, j, strideIn, strideOut; + + _cmsHandleExtraChannels(p, in, out, PixelsPerLine, LineCount, Stride); + + // Empty buffers for quick memcmp + memset(wIn, 0, sizeof(wIn)); + memset(wOut, 0, sizeof(wOut)); + + // Get copy of zero cache + memcpy(&Cache, &p->Cache, sizeof(Cache)); + + strideIn = 0; + strideOut = 0; + + for (i = 0; i < LineCount; i++) { + + accum = (cmsUInt8Number*)in + strideIn; + output = (cmsUInt8Number*)out + strideOut; + + for (j = 0; j < PixelsPerLine; j++) { + + accum = p->FromInput(p, wIn, accum, Stride->BytesPerPlaneIn); + + if (memcmp(wIn, Cache.CacheIn, sizeof(Cache.CacheIn)) == 0) { + + memcpy(wOut, Cache.CacheOut, sizeof(Cache.CacheOut)); + } + else { + TransformOnePixelWithGamutCheck(p, wIn, wOut); + + memcpy(Cache.CacheIn, wIn, sizeof(Cache.CacheIn)); + memcpy(Cache.CacheOut, wOut, sizeof(Cache.CacheOut)); + } + + output = p->ToOutput(p, wOut, output, Stride->BytesPerPlaneOut); + } + + strideIn += Stride->BytesPerLineIn; + strideOut += Stride->BytesPerLineOut; + } +} + +// Transform plug-ins ---------------------------------------------------------------------------------------------------- + +// List of used-defined transform factories +typedef struct _cmsTransformCollection_st { + + _cmsTransform2Factory Factory; + cmsBool OldXform; // Factory returns xform function in the old style + + struct _cmsTransformCollection_st *Next; + +} _cmsTransformCollection; + +// The linked list head +_cmsTransformPluginChunkType _cmsTransformPluginChunk = { NULL }; + + +// Duplicates the zone of memory used by the plug-in in the new context +static +void DupPluginTransformList(struct _cmsContext_struct* ctx, + const struct _cmsContext_struct* src) +{ + _cmsTransformPluginChunkType newHead = { NULL }; + _cmsTransformCollection* entry; + _cmsTransformCollection* Anterior = NULL; + _cmsTransformPluginChunkType* head = (_cmsTransformPluginChunkType*) src->chunks[TransformPlugin]; + + // Walk the list copying all nodes + for (entry = head->TransformCollection; + entry != NULL; + entry = entry ->Next) { + + _cmsTransformCollection *newEntry = ( _cmsTransformCollection *) _cmsSubAllocDup(ctx ->MemPool, entry, sizeof(_cmsTransformCollection)); + + if (newEntry == NULL) + return; + + // We want to keep the linked list order, so this is a little bit tricky + newEntry -> Next = NULL; + if (Anterior) + Anterior -> Next = newEntry; + + Anterior = newEntry; + + if (newHead.TransformCollection == NULL) + newHead.TransformCollection = newEntry; + } + + ctx ->chunks[TransformPlugin] = _cmsSubAllocDup(ctx->MemPool, &newHead, sizeof(_cmsTransformPluginChunkType)); +} + +// Allocates memory for transform plugin factory +void _cmsAllocTransformPluginChunk(struct _cmsContext_struct* ctx, + const struct _cmsContext_struct* src) +{ + if (src != NULL) { + + // Copy all linked list + DupPluginTransformList(ctx, src); + } + else { + static _cmsTransformPluginChunkType TransformPluginChunkType = { NULL }; + ctx ->chunks[TransformPlugin] = _cmsSubAllocDup(ctx ->MemPool, &TransformPluginChunkType, sizeof(_cmsTransformPluginChunkType)); + } +} + +// Adaptor for old versions of plug-in +static +void _cmsTransform2toTransformAdaptor(struct _cmstransform_struct *CMMcargo, + const void* InputBuffer, + void* OutputBuffer, + cmsUInt32Number PixelsPerLine, + cmsUInt32Number LineCount, + const cmsStride* Stride) +{ + + size_t i, strideIn, strideOut; + + _cmsHandleExtraChannels(CMMcargo, InputBuffer, OutputBuffer, PixelsPerLine, LineCount, Stride); + + strideIn = 0; + strideOut = 0; + + for (i = 0; i < LineCount; i++) { + + void *accum = (cmsUInt8Number*)InputBuffer + strideIn; + void *output = (cmsUInt8Number*)OutputBuffer + strideOut; + + CMMcargo->OldXform(CMMcargo, accum, output, PixelsPerLine, Stride->BytesPerPlaneIn); + + strideIn += Stride->BytesPerLineIn; + strideOut += Stride->BytesPerLineOut; + } +} + + + +// Register new ways to transform +cmsBool _cmsRegisterTransformPlugin(cmsContext ContextID, cmsPluginBase* Data) +{ + cmsPluginTransform* Plugin = (cmsPluginTransform*) Data; + _cmsTransformCollection* fl; + _cmsTransformPluginChunkType* ctx = ( _cmsTransformPluginChunkType*) _cmsContextGetClientChunk(ContextID,TransformPlugin); + + if (Data == NULL) { + + // Free the chain. Memory is safely freed at exit + ctx->TransformCollection = NULL; + return TRUE; + } + + // Factory callback is required + if (Plugin->factories.xform == NULL) return FALSE; + + + fl = (_cmsTransformCollection*) _cmsPluginMalloc(ContextID, sizeof(_cmsTransformCollection)); + if (fl == NULL) return FALSE; + + // Check for full xform plug-ins previous to 2.8, we would need an adapter in that case + if (Plugin->base.ExpectedVersion < 2080) { + + fl->OldXform = TRUE; + } + else + fl->OldXform = FALSE; + + // Copy the parameters + fl->Factory = Plugin->factories.xform; + + // Keep linked list + fl ->Next = ctx->TransformCollection; + ctx->TransformCollection = fl; + + // All is ok + return TRUE; +} + + +void CMSEXPORT _cmsSetTransformUserData(struct _cmstransform_struct *CMMcargo, void* ptr, _cmsFreeUserDataFn FreePrivateDataFn) +{ + _cmsAssert(CMMcargo != NULL); + CMMcargo ->UserData = ptr; + CMMcargo ->FreeUserData = FreePrivateDataFn; +} + +// returns the pointer defined by the plug-in to store private data +void * CMSEXPORT _cmsGetTransformUserData(struct _cmstransform_struct *CMMcargo) +{ + _cmsAssert(CMMcargo != NULL); + return CMMcargo ->UserData; +} + +// returns the current formatters +void CMSEXPORT _cmsGetTransformFormatters16(struct _cmstransform_struct *CMMcargo, cmsFormatter16* FromInput, cmsFormatter16* ToOutput) +{ + _cmsAssert(CMMcargo != NULL); + if (FromInput) *FromInput = CMMcargo ->FromInput; + if (ToOutput) *ToOutput = CMMcargo ->ToOutput; +} + +void CMSEXPORT _cmsGetTransformFormattersFloat(struct _cmstransform_struct *CMMcargo, cmsFormatterFloat* FromInput, cmsFormatterFloat* ToOutput) +{ + _cmsAssert(CMMcargo != NULL); + if (FromInput) *FromInput = CMMcargo ->FromInputFloat; + if (ToOutput) *ToOutput = CMMcargo ->ToOutputFloat; +} + +// returns original flags +cmsUInt32Number CMSEXPORT _cmsGetTransformFlags(struct _cmstransform_struct* CMMcargo) +{ + _cmsAssert(CMMcargo != NULL); + return CMMcargo->dwOriginalFlags; +} + +// Returns the worker callback for parallelization plug-ins +_cmsTransform2Fn CMSEXPORT _cmsGetTransformWorker(struct _cmstransform_struct* CMMcargo) +{ + _cmsAssert(CMMcargo != NULL); + return CMMcargo->Worker; +} + +// This field holds maximum number of workers or -1 to auto +cmsInt32Number CMSEXPORT _cmsGetTransformMaxWorkers(struct _cmstransform_struct* CMMcargo) +{ + _cmsAssert(CMMcargo != NULL); + return CMMcargo->MaxWorkers; +} + +// This field is actually unused and reserved +cmsUInt32Number CMSEXPORT _cmsGetTransformWorkerFlags(struct _cmstransform_struct* CMMcargo) +{ + _cmsAssert(CMMcargo != NULL); + return CMMcargo->WorkerFlags; +} + +// In the case there is a parallelization plug-in, let it to do its job +static +void ParalellizeIfSuitable(_cmsTRANSFORM* p) +{ + _cmsParallelizationPluginChunkType* ctx = (_cmsParallelizationPluginChunkType*)_cmsContextGetClientChunk(p->ContextID, ParallelizationPlugin); + + _cmsAssert(p != NULL); + if (ctx != NULL && ctx->SchedulerFn != NULL) { + + p->Worker = p->xform; + p->xform = ctx->SchedulerFn; + p->MaxWorkers = ctx->MaxWorkers; + p->WorkerFlags = ctx->WorkerFlags; + } +} + + +/** +* An empty unroll to avoid a check with NULL on cmsDoTransform() +*/ +static +cmsUInt8Number* UnrollNothing(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wIn[], + CMSREGISTER cmsUInt8Number* accum, + CMSREGISTER cmsUInt32Number Stride) +{ + return accum; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(wIn); + cmsUNUSED_PARAMETER(Stride); +} + +static +cmsUInt8Number* PackNothing(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wOut[], + CMSREGISTER cmsUInt8Number* output, + CMSREGISTER cmsUInt32Number Stride) +{ + return output; + + cmsUNUSED_PARAMETER(info); + cmsUNUSED_PARAMETER(wOut); + cmsUNUSED_PARAMETER(Stride); +} + +// Allocate transform struct and set it to defaults. Ask the optimization plug-in about if those formats are proper +// for separated transforms. If this is the case, +static +_cmsTRANSFORM* AllocEmptyTransform(cmsContext ContextID, cmsPipeline* lut, + cmsUInt32Number Intent, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags) +{ + _cmsTransformPluginChunkType* ctx = ( _cmsTransformPluginChunkType*) _cmsContextGetClientChunk(ContextID, TransformPlugin); + _cmsTransformCollection* Plugin; + + // Allocate needed memory + _cmsTRANSFORM* p = (_cmsTRANSFORM*)_cmsMallocZero(ContextID, sizeof(_cmsTRANSFORM)); + if (!p) { + cmsPipelineFree(lut); + return NULL; + } + + // Store the proposed pipeline + p->Lut = lut; + + // Let's see if any plug-in want to do the transform by itself + if (p->Lut != NULL) { + + if (!(*dwFlags & cmsFLAGS_NOOPTIMIZE)) + { + for (Plugin = ctx->TransformCollection; + Plugin != NULL; + Plugin = Plugin->Next) { + + if (Plugin->Factory(&p->xform, &p->UserData, &p->FreeUserData, &p->Lut, InputFormat, OutputFormat, dwFlags)) { + + // Last plugin in the declaration order takes control. We just keep + // the original parameters as a logging. + // Note that cmsFLAGS_CAN_CHANGE_FORMATTER is not set, so by default + // an optimized transform is not reusable. The plug-in can, however, change + // the flags and make it suitable. + + p->ContextID = ContextID; + p->InputFormat = *InputFormat; + p->OutputFormat = *OutputFormat; + p->dwOriginalFlags = *dwFlags; + + // Fill the formatters just in case the optimized routine is interested. + // No error is thrown if the formatter doesn't exist. It is up to the optimization + // factory to decide what to do in those cases. + p->FromInput = _cmsGetFormatter(ContextID, *InputFormat, cmsFormatterInput, CMS_PACK_FLAGS_16BITS).Fmt16; + p->ToOutput = _cmsGetFormatter(ContextID, *OutputFormat, cmsFormatterOutput, CMS_PACK_FLAGS_16BITS).Fmt16; + p->FromInputFloat = _cmsGetFormatter(ContextID, *InputFormat, cmsFormatterInput, CMS_PACK_FLAGS_FLOAT).FmtFloat; + p->ToOutputFloat = _cmsGetFormatter(ContextID, *OutputFormat, cmsFormatterOutput, CMS_PACK_FLAGS_FLOAT).FmtFloat; + + // Save the day? (Ignore the warning) + if (Plugin->OldXform) { + p->OldXform = (_cmsTransformFn)(void*)p->xform; + p->xform = _cmsTransform2toTransformAdaptor; + } + + ParalellizeIfSuitable(p); + return p; + } + } + } + + // Not suitable for the transform plug-in, let's check the pipeline plug-in + _cmsOptimizePipeline(ContextID, &p->Lut, Intent, InputFormat, OutputFormat, dwFlags); + } + + // Check whatever this is a true floating point transform + if (_cmsFormatterIsFloat(*InputFormat) || _cmsFormatterIsFloat(*OutputFormat)) { + + // Get formatter function always return a valid union, but the contents of this union may be NULL. + p ->FromInputFloat = _cmsGetFormatter(ContextID, *InputFormat, cmsFormatterInput, CMS_PACK_FLAGS_FLOAT).FmtFloat; + p ->ToOutputFloat = _cmsGetFormatter(ContextID, *OutputFormat, cmsFormatterOutput, CMS_PACK_FLAGS_FLOAT).FmtFloat; + *dwFlags |= cmsFLAGS_CAN_CHANGE_FORMATTER; + + if (p ->FromInputFloat == NULL || p ->ToOutputFloat == NULL) { + + cmsSignalError(ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported raster format"); + cmsDeleteTransform(p); + return NULL; + } + + if (*dwFlags & cmsFLAGS_NULLTRANSFORM) { + + p ->xform = NullFloatXFORM; + } + else { + // Float transforms don't use cache, always are non-NULL + p ->xform = FloatXFORM; + } + + } + else { + + // Formats are intended to be changed before use + if (*InputFormat == 0 && *OutputFormat == 0) { + p->FromInput = UnrollNothing; + p->ToOutput = PackNothing; + *dwFlags |= cmsFLAGS_CAN_CHANGE_FORMATTER; + } + else { + + cmsUInt32Number BytesPerPixelInput; + + p ->FromInput = _cmsGetFormatter(ContextID, *InputFormat, cmsFormatterInput, CMS_PACK_FLAGS_16BITS).Fmt16; + p ->ToOutput = _cmsGetFormatter(ContextID, *OutputFormat, cmsFormatterOutput, CMS_PACK_FLAGS_16BITS).Fmt16; + + if (p ->FromInput == NULL || p ->ToOutput == NULL) { + + cmsSignalError(ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported raster format"); + cmsDeleteTransform(p); + return NULL; + } + + BytesPerPixelInput = T_BYTES(*InputFormat); + if (BytesPerPixelInput == 0 || BytesPerPixelInput >= 2) + *dwFlags |= cmsFLAGS_CAN_CHANGE_FORMATTER; + + } + + if (*dwFlags & cmsFLAGS_NULLTRANSFORM) { + + p ->xform = NullXFORM; + } + else { + if (*dwFlags & cmsFLAGS_NOCACHE) { + + if (*dwFlags & cmsFLAGS_GAMUTCHECK) + p ->xform = PrecalculatedXFORMGamutCheck; // Gamut check, no cache + else + p ->xform = PrecalculatedXFORM; // No cache, no gamut check + } + else { + + if (*dwFlags & cmsFLAGS_GAMUTCHECK) + p ->xform = CachedXFORMGamutCheck; // Gamut check, cache + else + p ->xform = CachedXFORM; // No gamut check, cache + + } + } + } + + /** + * Check consistency for alpha channel copy + */ + if (*dwFlags & cmsFLAGS_COPY_ALPHA) + { + if (T_EXTRA(*InputFormat) != T_EXTRA(*OutputFormat)) + { + cmsSignalError(ContextID, cmsERROR_NOT_SUITABLE, "Mismatched alpha channels"); + cmsDeleteTransform(p); + return NULL; + } + } + + p ->InputFormat = *InputFormat; + p ->OutputFormat = *OutputFormat; + p ->dwOriginalFlags = *dwFlags; + p ->ContextID = ContextID; + p ->UserData = NULL; + ParalellizeIfSuitable(p); + return p; +} + +static +cmsBool GetXFormColorSpaces(cmsUInt32Number nProfiles, cmsHPROFILE hProfiles[], cmsColorSpaceSignature* Input, cmsColorSpaceSignature* Output) +{ + cmsColorSpaceSignature ColorSpaceIn, ColorSpaceOut; + cmsColorSpaceSignature PostColorSpace; + cmsUInt32Number i; + + if (nProfiles == 0) return FALSE; + if (hProfiles[0] == NULL) return FALSE; + + *Input = PostColorSpace = cmsGetColorSpace(hProfiles[0]); + + for (i=0; i < nProfiles; i++) { + + cmsProfileClassSignature cls; + cmsHPROFILE hProfile = hProfiles[i]; + + int lIsInput = (PostColorSpace != cmsSigXYZData) && + (PostColorSpace != cmsSigLabData); + + if (hProfile == NULL) return FALSE; + + cls = cmsGetDeviceClass(hProfile); + + if (cls == cmsSigNamedColorClass) { + + ColorSpaceIn = cmsSig1colorData; + ColorSpaceOut = (nProfiles > 1) ? cmsGetPCS(hProfile) : cmsGetColorSpace(hProfile); + } + else + if (lIsInput || (cls == cmsSigLinkClass)) { + + ColorSpaceIn = cmsGetColorSpace(hProfile); + ColorSpaceOut = cmsGetPCS(hProfile); + } + else + { + ColorSpaceIn = cmsGetPCS(hProfile); + ColorSpaceOut = cmsGetColorSpace(hProfile); + } + + if (i==0) + *Input = ColorSpaceIn; + + PostColorSpace = ColorSpaceOut; + } + + *Output = PostColorSpace; + + return TRUE; +} + +// Check colorspace +static +cmsBool IsProperColorSpace(cmsColorSpaceSignature Check, cmsUInt32Number dwFormat) +{ + int Space1 = (int) T_COLORSPACE(dwFormat); + int Space2 = _cmsLCMScolorSpace(Check); + + if (dwFormat == 0) return TRUE; // Bypass used by linkicc + + if (Space1 == PT_ANY) return (T_CHANNELS(dwFormat) == cmsChannelsOf(Check)); + if (Space1 == Space2) return TRUE; + + if (Space1 == PT_LabV2 && Space2 == PT_Lab) return TRUE; + if (Space1 == PT_Lab && Space2 == PT_LabV2) return TRUE; + + return FALSE; +} + +// ---------------------------------------------------------------------------------------------------------------- + +// Jun-21-2000: Some profiles (those that comes with W2K) comes +// with the media white (media black?) x 100. Add a sanity check + +static +void NormalizeXYZ(cmsCIEXYZ* Dest) +{ + while (Dest -> X > 2. && + Dest -> Y > 2. && + Dest -> Z > 2.) { + + Dest -> X /= 10.; + Dest -> Y /= 10.; + Dest -> Z /= 10.; + } +} + +static +void SetWhitePoint(cmsCIEXYZ* wtPt, const cmsCIEXYZ* src) +{ + if (src == NULL) { + wtPt ->X = cmsD50X; + wtPt ->Y = cmsD50Y; + wtPt ->Z = cmsD50Z; + } + else { + wtPt ->X = src->X; + wtPt ->Y = src->Y; + wtPt ->Z = src->Z; + + NormalizeXYZ(wtPt); + } + +} + +// New to lcms 2.0 -- have all parameters available. +cmsHTRANSFORM CMSEXPORT cmsCreateExtendedTransform(cmsContext ContextID, + cmsUInt32Number nProfiles, cmsHPROFILE hProfiles[], + cmsBool BPC[], + cmsUInt32Number Intents[], + cmsFloat64Number AdaptationStates[], + cmsHPROFILE hGamutProfile, + cmsUInt32Number nGamutPCSposition, + cmsUInt32Number InputFormat, + cmsUInt32Number OutputFormat, + cmsUInt32Number dwFlags) +{ + _cmsTRANSFORM* xform; + cmsColorSpaceSignature EntryColorSpace; + cmsColorSpaceSignature ExitColorSpace; + cmsPipeline* Lut; + cmsUInt32Number LastIntent; + + // Safeguard + if (nProfiles <= 0 || nProfiles > 255) { + cmsSignalError(ContextID, cmsERROR_RANGE, "Wrong number of profiles. 1..255 expected, %d found.", nProfiles); + return NULL; + } + + LastIntent = Intents[nProfiles - 1]; + + // If it is a fake transform + if (dwFlags & cmsFLAGS_NULLTRANSFORM) + { + return AllocEmptyTransform(ContextID, NULL, INTENT_PERCEPTUAL, &InputFormat, &OutputFormat, &dwFlags); + } + + // If gamut check is requested, make sure we have a gamut profile + if (dwFlags & cmsFLAGS_GAMUTCHECK) { + if (hGamutProfile == NULL) dwFlags &= ~cmsFLAGS_GAMUTCHECK; + } + + if ((dwFlags & cmsFLAGS_GAMUTCHECK) && (nGamutPCSposition <= 0 || nGamutPCSposition >= nProfiles - 1)) { + cmsSignalError(ContextID, cmsERROR_RANGE, "Wrong gamut PCS position '%d'", nGamutPCSposition); + return NULL; + } + + // On floating point transforms, inhibit cache + if (_cmsFormatterIsFloat(InputFormat) || _cmsFormatterIsFloat(OutputFormat)) + dwFlags |= cmsFLAGS_NOCACHE; + + // Mark entry/exit spaces + if (!GetXFormColorSpaces(nProfiles, hProfiles, &EntryColorSpace, &ExitColorSpace)) { + cmsSignalError(ContextID, cmsERROR_NULL, "NULL input profiles on transform"); + return NULL; + } + + // Check if proper colorspaces + if (!IsProperColorSpace(EntryColorSpace, InputFormat)) { + cmsSignalError(ContextID, cmsERROR_COLORSPACE_CHECK, "Wrong input color space on transform"); + return NULL; + } + + if (!IsProperColorSpace(ExitColorSpace, OutputFormat)) { + cmsSignalError(ContextID, cmsERROR_COLORSPACE_CHECK, "Wrong output color space on transform"); + return NULL; + } + + // Check whatever the transform is 16 bits and involves linear RGB in first profile. If so, disable optimizations + if (EntryColorSpace == cmsSigRgbData && T_BYTES(InputFormat) == 2 && !(dwFlags & cmsFLAGS_NOOPTIMIZE)) + { + cmsFloat64Number gamma = cmsDetectRGBProfileGamma(hProfiles[0], 0.1); + + if (gamma > 0 && gamma < 1.6) + dwFlags |= cmsFLAGS_NOOPTIMIZE; + } + + // Create a pipeline with all transformations + Lut = _cmsLinkProfiles(ContextID, nProfiles, Intents, hProfiles, BPC, AdaptationStates, dwFlags); + if (Lut == NULL) { + cmsSignalError(ContextID, cmsERROR_NOT_SUITABLE, "Couldn't link the profiles"); + return NULL; + } + + // Check channel count + if ((cmsChannelsOfColorSpace(EntryColorSpace) != (cmsInt32Number) cmsPipelineInputChannels(Lut)) || + (cmsChannelsOfColorSpace(ExitColorSpace) != (cmsInt32Number) cmsPipelineOutputChannels(Lut))) { + cmsPipelineFree(Lut); + cmsSignalError(ContextID, cmsERROR_NOT_SUITABLE, "Channel count doesn't match. Profile is corrupted"); + return NULL; + } + + + // All seems ok + xform = AllocEmptyTransform(ContextID, Lut, LastIntent, &InputFormat, &OutputFormat, &dwFlags); + if (xform == NULL) { + return NULL; + } + + // Keep values + xform ->EntryColorSpace = EntryColorSpace; + xform ->ExitColorSpace = ExitColorSpace; + xform ->RenderingIntent = Intents[nProfiles-1]; + + // Take white points + SetWhitePoint(&xform->EntryWhitePoint, (cmsCIEXYZ*) cmsReadTag(hProfiles[0], cmsSigMediaWhitePointTag)); + SetWhitePoint(&xform->ExitWhitePoint, (cmsCIEXYZ*) cmsReadTag(hProfiles[nProfiles-1], cmsSigMediaWhitePointTag)); + + + // Create a gamut check LUT if requested + if (hGamutProfile != NULL && (dwFlags & cmsFLAGS_GAMUTCHECK)) + xform ->GamutCheck = _cmsCreateGamutCheckPipeline(ContextID, hProfiles, + BPC, Intents, + AdaptationStates, + nGamutPCSposition, + hGamutProfile); + + + // Try to read input and output colorant table + if (cmsIsTag(hProfiles[0], cmsSigColorantTableTag)) { + + // Input table can only come in this way. + xform ->InputColorant = cmsDupNamedColorList((cmsNAMEDCOLORLIST*) cmsReadTag(hProfiles[0], cmsSigColorantTableTag)); + } + + // Output is a little bit more complex. + if (cmsGetDeviceClass(hProfiles[nProfiles-1]) == cmsSigLinkClass) { + + // This tag may exist only on devicelink profiles. + if (cmsIsTag(hProfiles[nProfiles-1], cmsSigColorantTableOutTag)) { + + // It may be NULL if error + xform ->OutputColorant = cmsDupNamedColorList((cmsNAMEDCOLORLIST*) cmsReadTag(hProfiles[nProfiles-1], cmsSigColorantTableOutTag)); + } + + } else { + + if (cmsIsTag(hProfiles[nProfiles-1], cmsSigColorantTableTag)) { + + xform -> OutputColorant = cmsDupNamedColorList((cmsNAMEDCOLORLIST*) cmsReadTag(hProfiles[nProfiles-1], cmsSigColorantTableTag)); + } + } + + // Store the sequence of profiles + if (dwFlags & cmsFLAGS_KEEP_SEQUENCE) { + xform ->Sequence = _cmsCompileProfileSequence(ContextID, nProfiles, hProfiles); + } + else + xform ->Sequence = NULL; + + // If this is a cached transform, init first value, which is zero (16 bits only) + if (!(dwFlags & cmsFLAGS_NOCACHE)) { + + memset(&xform ->Cache.CacheIn, 0, sizeof(xform ->Cache.CacheIn)); + + if (xform ->GamutCheck != NULL) { + TransformOnePixelWithGamutCheck(xform, xform ->Cache.CacheIn, xform->Cache.CacheOut); + } + else { + + xform ->Lut ->Eval16Fn(xform ->Cache.CacheIn, xform->Cache.CacheOut, xform -> Lut->Data); + } + + } + + return (cmsHTRANSFORM) xform; +} + +// Multiprofile transforms: Gamut check is not available here, as it is unclear from which profile the gamut comes. +cmsHTRANSFORM CMSEXPORT cmsCreateMultiprofileTransformTHR(cmsContext ContextID, + cmsHPROFILE hProfiles[], + cmsUInt32Number nProfiles, + cmsUInt32Number InputFormat, + cmsUInt32Number OutputFormat, + cmsUInt32Number Intent, + cmsUInt32Number dwFlags) +{ + cmsUInt32Number i; + cmsBool BPC[256]; + cmsUInt32Number Intents[256]; + cmsFloat64Number AdaptationStates[256]; + + if (nProfiles <= 0 || nProfiles > 255) { + cmsSignalError(ContextID, cmsERROR_RANGE, "Wrong number of profiles. 1..255 expected, %d found.", nProfiles); + return NULL; + } + + for (i=0; i < nProfiles; i++) { + BPC[i] = dwFlags & cmsFLAGS_BLACKPOINTCOMPENSATION ? TRUE : FALSE; + Intents[i] = Intent; + AdaptationStates[i] = cmsSetAdaptationStateTHR(ContextID, -1); + } + + + return cmsCreateExtendedTransform(ContextID, nProfiles, hProfiles, BPC, Intents, AdaptationStates, NULL, 0, InputFormat, OutputFormat, dwFlags); +} + + + +cmsHTRANSFORM CMSEXPORT cmsCreateMultiprofileTransform(cmsHPROFILE hProfiles[], + cmsUInt32Number nProfiles, + cmsUInt32Number InputFormat, + cmsUInt32Number OutputFormat, + cmsUInt32Number Intent, + cmsUInt32Number dwFlags) +{ + + if (nProfiles <= 0 || nProfiles > 255) { + cmsSignalError(NULL, cmsERROR_RANGE, "Wrong number of profiles. 1..255 expected, %d found.", nProfiles); + return NULL; + } + + return cmsCreateMultiprofileTransformTHR(cmsGetProfileContextID(hProfiles[0]), + hProfiles, + nProfiles, + InputFormat, + OutputFormat, + Intent, + dwFlags); +} + +cmsHTRANSFORM CMSEXPORT cmsCreateTransformTHR(cmsContext ContextID, + cmsHPROFILE Input, + cmsUInt32Number InputFormat, + cmsHPROFILE Output, + cmsUInt32Number OutputFormat, + cmsUInt32Number Intent, + cmsUInt32Number dwFlags) +{ + + cmsHPROFILE hArray[2]; + + hArray[0] = Input; + hArray[1] = Output; + + return cmsCreateMultiprofileTransformTHR(ContextID, hArray, Output == NULL ? 1U : 2U, InputFormat, OutputFormat, Intent, dwFlags); +} + +CMSAPI cmsHTRANSFORM CMSEXPORT cmsCreateTransform(cmsHPROFILE Input, + cmsUInt32Number InputFormat, + cmsHPROFILE Output, + cmsUInt32Number OutputFormat, + cmsUInt32Number Intent, + cmsUInt32Number dwFlags) +{ + return cmsCreateTransformTHR(cmsGetProfileContextID(Input), Input, InputFormat, Output, OutputFormat, Intent, dwFlags); +} + + +cmsHTRANSFORM CMSEXPORT cmsCreateProofingTransformTHR(cmsContext ContextID, + cmsHPROFILE InputProfile, + cmsUInt32Number InputFormat, + cmsHPROFILE OutputProfile, + cmsUInt32Number OutputFormat, + cmsHPROFILE ProofingProfile, + cmsUInt32Number nIntent, + cmsUInt32Number ProofingIntent, + cmsUInt32Number dwFlags) +{ + cmsHPROFILE hArray[4]; + cmsUInt32Number Intents[4]; + cmsBool BPC[4]; + cmsFloat64Number Adaptation[4]; + cmsBool DoBPC = (dwFlags & cmsFLAGS_BLACKPOINTCOMPENSATION) ? TRUE : FALSE; + + + hArray[0] = InputProfile; hArray[1] = ProofingProfile; hArray[2] = ProofingProfile; hArray[3] = OutputProfile; + Intents[0] = nIntent; Intents[1] = nIntent; Intents[2] = INTENT_RELATIVE_COLORIMETRIC; Intents[3] = ProofingIntent; + BPC[0] = DoBPC; BPC[1] = DoBPC; BPC[2] = 0; BPC[3] = 0; + + Adaptation[0] = Adaptation[1] = Adaptation[2] = Adaptation[3] = cmsSetAdaptationStateTHR(ContextID, -1); + + if (!(dwFlags & (cmsFLAGS_SOFTPROOFING|cmsFLAGS_GAMUTCHECK))) + return cmsCreateTransformTHR(ContextID, InputProfile, InputFormat, OutputProfile, OutputFormat, nIntent, dwFlags); + + return cmsCreateExtendedTransform(ContextID, 4, hArray, BPC, Intents, Adaptation, + ProofingProfile, 1, InputFormat, OutputFormat, dwFlags); + +} + + +cmsHTRANSFORM CMSEXPORT cmsCreateProofingTransform(cmsHPROFILE InputProfile, + cmsUInt32Number InputFormat, + cmsHPROFILE OutputProfile, + cmsUInt32Number OutputFormat, + cmsHPROFILE ProofingProfile, + cmsUInt32Number nIntent, + cmsUInt32Number ProofingIntent, + cmsUInt32Number dwFlags) +{ + return cmsCreateProofingTransformTHR(cmsGetProfileContextID(InputProfile), + InputProfile, + InputFormat, + OutputProfile, + OutputFormat, + ProofingProfile, + nIntent, + ProofingIntent, + dwFlags); +} + + +// Grab the ContextID from an open transform. Returns NULL if a NULL transform is passed +cmsContext CMSEXPORT cmsGetTransformContextID(cmsHTRANSFORM hTransform) +{ + _cmsTRANSFORM* xform = (_cmsTRANSFORM*) hTransform; + + if (xform == NULL) return NULL; + return xform -> ContextID; +} + +// Grab the input/output formats +cmsUInt32Number CMSEXPORT cmsGetTransformInputFormat(cmsHTRANSFORM hTransform) +{ + _cmsTRANSFORM* xform = (_cmsTRANSFORM*) hTransform; + + if (xform == NULL) return 0; + return xform->InputFormat; +} + +cmsUInt32Number CMSEXPORT cmsGetTransformOutputFormat(cmsHTRANSFORM hTransform) +{ + _cmsTRANSFORM* xform = (_cmsTRANSFORM*) hTransform; + + if (xform == NULL) return 0; + return xform->OutputFormat; +} + +// Returns the optimized pipeline (Lut) inside a transform. Read-only; do not free. +cmsPipeline* CMSEXPORT cmsGetTransformPipeline(cmsHTRANSFORM hTransform) +{ + _cmsTRANSFORM* xform = (_cmsTRANSFORM*) hTransform; + if (xform == NULL) return NULL; + return xform->Lut; +} + +// Returns the gamut-check pipeline inside a transform. Read-only; do not free. +cmsPipeline* CMSEXPORT cmsGetTransformGamutCheckPipeline(cmsHTRANSFORM hTransform) +{ + _cmsTRANSFORM* xform = (_cmsTRANSFORM*) hTransform; + if (xform == NULL) return NULL; + return xform->GamutCheck; +} + +// For backwards compatibility +cmsBool CMSEXPORT cmsChangeBuffersFormat(cmsHTRANSFORM hTransform, + cmsUInt32Number InputFormat, + cmsUInt32Number OutputFormat) +{ + _cmsTRANSFORM* xform = (_cmsTRANSFORM*) hTransform; + cmsFormatter16 FromInput, ToOutput; + + + // We only can afford to change formatters if previous transform is at least 16 bits + if (!(xform ->dwOriginalFlags & cmsFLAGS_CAN_CHANGE_FORMATTER)) { + + cmsSignalError(xform ->ContextID, cmsERROR_NOT_SUITABLE, "cmsChangeBuffersFormat works only on transforms created originally with at least 16 bits of precision"); + return FALSE; + } + + FromInput = _cmsGetFormatter(xform->ContextID, InputFormat, cmsFormatterInput, CMS_PACK_FLAGS_16BITS).Fmt16; + ToOutput = _cmsGetFormatter(xform->ContextID, OutputFormat, cmsFormatterOutput, CMS_PACK_FLAGS_16BITS).Fmt16; + + if (FromInput == NULL || ToOutput == NULL) { + + cmsSignalError(xform -> ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported raster format"); + return FALSE; + } + + xform ->InputFormat = InputFormat; + xform ->OutputFormat = OutputFormat; + xform ->FromInput = FromInput; + xform ->ToOutput = ToOutput; + return TRUE; +} + +cmsNAMEDCOLORLIST* CMSEXPORT cmsGetTransformInputColorants(cmsHTRANSFORM hTransform) +{ + _cmsTRANSFORM* xform = (_cmsTRANSFORM*)hTransform; + + if (xform == NULL) return NULL; + return xform->InputColorant; +} + +cmsNAMEDCOLORLIST* CMSEXPORT cmsGetTransformOutputColorants(cmsHTRANSFORM hTransform) +{ + _cmsTRANSFORM* xform = (_cmsTRANSFORM*)hTransform; + + if (xform == NULL) return NULL; + return xform->OutputColorant; +} diff --git a/local/recipes/libs/lcms2/source/src/lcms2.def b/local/recipes/libs/lcms2/source/src/lcms2.def new file mode 100644 index 0000000000..328639c5f0 --- /dev/null +++ b/local/recipes/libs/lcms2/source/src/lcms2.def @@ -0,0 +1,384 @@ +EXPORTS + +_cms15Fixed16toDouble = _cms15Fixed16toDouble +_cms8Fixed8toDouble = _cms8Fixed8toDouble +cmsAdaptToIlluminant = cmsAdaptToIlluminant +_cmsAdjustEndianess16 = _cmsAdjustEndianess16 +_cmsAdjustEndianess32 = _cmsAdjustEndianess32 +_cmsAdjustEndianess64 = _cmsAdjustEndianess64 +cmsAllocNamedColorList = cmsAllocNamedColorList +cmsAllocProfileSequenceDescription = cmsAllocProfileSequenceDescription +cmsAppendNamedColor = cmsAppendNamedColor +cmsBFDdeltaE = cmsBFDdeltaE +cmsBuildGamma = cmsBuildGamma +cmsBuildParametricToneCurve = cmsBuildParametricToneCurve +cmsBuildSegmentedToneCurve = cmsBuildSegmentedToneCurve +cmsBuildTabulatedToneCurve16 = cmsBuildTabulatedToneCurve16 +cmsBuildTabulatedToneCurveFloat = cmsBuildTabulatedToneCurveFloat +_cmsCalloc = _cmsCalloc +cmsChannelsOf = cmsChannelsOf +cmsChannelsOfColorSpace = cmsChannelsOfColorSpace +cmsCIE2000DeltaE = cmsCIE2000DeltaE +cmsCIE94DeltaE = cmsCIE94DeltaE +cmsCIECAM02Done = cmsCIECAM02Done +cmsCIECAM02Forward = cmsCIECAM02Forward +cmsCIECAM02Init = cmsCIECAM02Init +cmsCIECAM02Reverse = cmsCIECAM02Reverse +cmsCloseIOhandler = cmsCloseIOhandler +cmsCloseProfile = cmsCloseProfile +cmsCMCdeltaE = cmsCMCdeltaE +cmsCreate_sRGBProfile = cmsCreate_sRGBProfile +cmsCreate_sRGBProfileTHR = cmsCreate_sRGBProfileTHR +cmsCreateBCHSWabstractProfile = cmsCreateBCHSWabstractProfile +cmsCreateBCHSWabstractProfileTHR = cmsCreateBCHSWabstractProfileTHR +cmsCreateExtendedTransform = cmsCreateExtendedTransform +cmsCreateGrayProfile = cmsCreateGrayProfile +cmsCreateGrayProfileTHR = cmsCreateGrayProfileTHR +cmsCreateInkLimitingDeviceLink = cmsCreateInkLimitingDeviceLink +cmsCreateInkLimitingDeviceLinkTHR = cmsCreateInkLimitingDeviceLinkTHR +cmsCreateLab2Profile = cmsCreateLab2Profile +cmsCreateLab2ProfileTHR = cmsCreateLab2ProfileTHR +cmsCreateLab4Profile = cmsCreateLab4Profile +cmsCreateLab4ProfileTHR = cmsCreateLab4ProfileTHR +cmsCreateLinearizationDeviceLink = cmsCreateLinearizationDeviceLink +cmsCreateLinearizationDeviceLinkTHR = cmsCreateLinearizationDeviceLinkTHR +cmsCreateMultiprofileTransform = cmsCreateMultiprofileTransform +cmsCreateMultiprofileTransformTHR = cmsCreateMultiprofileTransformTHR +cmsCreateNULLProfile = cmsCreateNULLProfile +cmsCreateNULLProfileTHR = cmsCreateNULLProfileTHR +cmsCreateProfilePlaceholder = cmsCreateProfilePlaceholder +cmsCreateProofingTransform = cmsCreateProofingTransform +cmsCreateProofingTransformTHR = cmsCreateProofingTransformTHR +cmsCreateRGBProfile = cmsCreateRGBProfile +cmsCreateRGBProfileTHR = cmsCreateRGBProfileTHR +cmsCreateTransform = cmsCreateTransform +cmsCreateTransformTHR = cmsCreateTransformTHR +cmsCreateXYZProfile = cmsCreateXYZProfile +cmsCreateXYZProfileTHR = cmsCreateXYZProfileTHR +cmsD50_xyY = cmsD50_xyY +cmsD50_XYZ = cmsD50_XYZ +_cmsDecodeDateTimeNumber = _cmsDecodeDateTimeNumber +_cmsDefaultICCintents = _cmsDefaultICCintents +cmsDeleteTransform = cmsDeleteTransform +cmsDeltaE = cmsDeltaE +cmsDetectBlackPoint = cmsDetectBlackPoint +cmsDetectDestinationBlackPoint = cmsDetectDestinationBlackPoint +cmsDetectTAC = cmsDetectTAC +cmsDesaturateLab = cmsDesaturateLab +cmsDoTransform = cmsDoTransform +cmsDoTransformStride = cmsDoTransformStride +cmsDoTransformLineStride = cmsDoTransformLineStride +_cmsDoubleTo15Fixed16 = _cmsDoubleTo15Fixed16 +_cmsDoubleTo8Fixed8 = _cmsDoubleTo8Fixed8 +_cmsDupMem = _cmsDupMem +cmsDupNamedColorList = cmsDupNamedColorList +cmsDupProfileSequenceDescription = cmsDupProfileSequenceDescription +cmsDupToneCurve = cmsDupToneCurve +_cmsEncodeDateTimeNumber = _cmsEncodeDateTimeNumber +cmsEstimateGamma = cmsEstimateGamma +cmsGetToneCurveEstimatedTableEntries = cmsGetToneCurveEstimatedTableEntries +cmsGetToneCurveEstimatedTable = cmsGetToneCurveEstimatedTable +cmsEvalToneCurve16 = cmsEvalToneCurve16 +cmsEvalToneCurveFloat = cmsEvalToneCurveFloat +cmsfilelength = cmsfilelength +cmsFloat2LabEncoded = cmsFloat2LabEncoded +cmsFloat2LabEncodedV2 = cmsFloat2LabEncodedV2 +cmsFloat2XYZEncoded = cmsFloat2XYZEncoded +cmsFormatterForColorspaceOfProfile = cmsFormatterForColorspaceOfProfile +cmsFormatterForPCSOfProfile = cmsFormatterForPCSOfProfile +_cmsFree = _cmsFree +cmsFreeNamedColorList = cmsFreeNamedColorList +cmsFreeProfileSequenceDescription = cmsFreeProfileSequenceDescription +cmsFreeToneCurve = cmsFreeToneCurve +cmsFreeToneCurveTriple = cmsFreeToneCurveTriple +cmsGBDAlloc = cmsGBDAlloc +cmsGBDFree = cmsGBDFree +cmsGDBAddPoint = cmsGDBAddPoint +cmsGDBCheckPoint = cmsGDBCheckPoint +cmsGDBCompute = cmsGDBCompute +cmsGetAlarmCodes = cmsGetAlarmCodes +cmsGetColorSpace = cmsGetColorSpace +cmsGetDeviceClass = cmsGetDeviceClass +cmsGetEncodedICCversion = cmsGetEncodedICCversion +cmsGetHeaderAttributes = cmsGetHeaderAttributes +cmsGetHeaderCreationDateTime = cmsGetHeaderCreationDateTime +cmsGetHeaderFlags = cmsGetHeaderFlags +cmsGetHeaderManufacturer = cmsGetHeaderManufacturer +cmsGetHeaderModel = cmsGetHeaderModel +cmsGetHeaderProfileID = cmsGetHeaderProfileID +cmsGetHeaderRenderingIntent = cmsGetHeaderRenderingIntent +cmsGetNamedColorList = cmsGetNamedColorList +cmsGetPCS = cmsGetPCS +cmsGetPostScriptColorResource = cmsGetPostScriptColorResource +cmsGetPostScriptCRD = cmsGetPostScriptCRD +cmsGetPostScriptCSA = cmsGetPostScriptCSA +cmsGetProfileInfo = cmsGetProfileInfo +cmsGetProfileInfoASCII = cmsGetProfileInfoASCII +cmsGetProfileInfoUTF8 = cmsGetProfileInfoUTF8 +cmsGetProfileContextID = cmsGetProfileContextID +cmsGetProfileVersion = cmsGetProfileVersion +cmsGetSupportedIntents = cmsGetSupportedIntents +cmsGetTagCount = cmsGetTagCount +cmsGetTagSignature = cmsGetTagSignature +cmsGetTransformContextID = cmsGetTransformContextID +_cmsICCcolorSpace = _cmsICCcolorSpace +_cmsIOPrintf = _cmsIOPrintf +cmsIsCLUT = cmsIsCLUT +cmsIsIntentSupported = cmsIsIntentSupported +cmsIsMatrixShaper = cmsIsMatrixShaper +cmsIsTag = cmsIsTag +cmsIsToneCurveDescending = cmsIsToneCurveDescending +cmsIsToneCurveLinear = cmsIsToneCurveLinear +cmsIsToneCurveMonotonic = cmsIsToneCurveMonotonic +cmsIsToneCurveMultisegment = cmsIsToneCurveMultisegment +cmsGetToneCurveParametricType = cmsGetToneCurveParametricType +cmsIT8Alloc = cmsIT8Alloc +cmsIT8DefineDblFormat = cmsIT8DefineDblFormat +cmsIT8EnumDataFormat = cmsIT8EnumDataFormat +cmsIT8EnumProperties = cmsIT8EnumProperties +cmsIT8EnumPropertyMulti = cmsIT8EnumPropertyMulti +cmsIT8Free = cmsIT8Free +cmsIT8GetData = cmsIT8GetData +cmsIT8GetDataDbl = cmsIT8GetDataDbl +cmsIT8FindDataFormat = cmsIT8FindDataFormat +cmsIT8GetDataRowCol = cmsIT8GetDataRowCol +cmsIT8GetDataRowColDbl = cmsIT8GetDataRowColDbl +cmsIT8GetPatchName = cmsIT8GetPatchName +cmsIT8GetPatchByName = cmsIT8GetPatchByName +cmsIT8GetProperty = cmsIT8GetProperty +cmsIT8GetPropertyDbl = cmsIT8GetPropertyDbl +cmsIT8GetPropertyMulti = cmsIT8GetPropertyMulti +cmsIT8GetSheetType = cmsIT8GetSheetType +cmsIT8LoadFromFile = cmsIT8LoadFromFile +cmsIT8LoadFromMem = cmsIT8LoadFromMem +cmsIT8SaveToFile = cmsIT8SaveToFile +cmsIT8SaveToMem = cmsIT8SaveToMem +cmsIT8SetComment = cmsIT8SetComment +cmsIT8SetData = cmsIT8SetData +cmsIT8SetDataDbl = cmsIT8SetDataDbl +cmsIT8SetDataFormat = cmsIT8SetDataFormat +cmsIT8SetDataRowCol = cmsIT8SetDataRowCol +cmsIT8SetDataRowColDbl = cmsIT8SetDataRowColDbl +cmsIT8SetPropertyDbl = cmsIT8SetPropertyDbl +cmsIT8SetPropertyHex = cmsIT8SetPropertyHex +cmsIT8SetPropertyStr = cmsIT8SetPropertyStr +cmsIT8SetPropertyMulti = cmsIT8SetPropertyMulti +cmsIT8SetPropertyUncooked = cmsIT8SetPropertyUncooked +cmsIT8SetSheetType = cmsIT8SetSheetType +cmsIT8SetTable = cmsIT8SetTable +cmsIT8SetTableByLabel = cmsIT8SetTableByLabel +cmsIT8SetIndexColumn = cmsIT8SetIndexColumn +cmsIT8TableCount = cmsIT8TableCount +cmsJoinToneCurve = cmsJoinToneCurve +cmsLab2LCh = cmsLab2LCh +cmsLab2XYZ = cmsLab2XYZ +cmsLabEncoded2Float = cmsLabEncoded2Float +cmsLabEncoded2FloatV2 = cmsLabEncoded2FloatV2 +cmsLCh2Lab = cmsLCh2Lab +_cmsLCMScolorSpace = _cmsLCMScolorSpace +cmsLinkTag = cmsLinkTag +cmsTagLinkedTo = cmsTagLinkedTo +cmsPipelineAlloc = cmsPipelineAlloc +cmsPipelineCat = cmsPipelineCat +cmsPipelineCheckAndRetreiveStages = cmsPipelineCheckAndRetreiveStages +cmsPipelineDup = cmsPipelineDup +cmsPipelineStageCount = cmsPipelineStageCount +cmsPipelineEval16 = cmsPipelineEval16 +cmsPipelineEvalFloat = cmsPipelineEvalFloat +cmsPipelineEvalReverseFloat = cmsPipelineEvalReverseFloat +cmsPipelineFree = cmsPipelineFree +cmsPipelineGetPtrToFirstStage = cmsPipelineGetPtrToFirstStage +cmsPipelineGetPtrToLastStage = cmsPipelineGetPtrToLastStage +cmsPipelineInputChannels = cmsPipelineInputChannels +cmsPipelineInsertStage = cmsPipelineInsertStage +cmsPipelineOutputChannels = cmsPipelineOutputChannels +cmsPipelineSetSaveAs8bitsFlag = cmsPipelineSetSaveAs8bitsFlag +_cmsPipelineSetOptimizationParameters = _cmsPipelineSetOptimizationParameters +cmsPipelineUnlinkStage = cmsPipelineUnlinkStage +_cmsMalloc = _cmsMalloc +_cmsMallocZero = _cmsMallocZero +_cmsMAT3eval = _cmsMAT3eval +_cmsMAT3identity = _cmsMAT3identity +_cmsMAT3inverse = _cmsMAT3inverse +_cmsMAT3isIdentity = _cmsMAT3isIdentity +_cmsMAT3per = _cmsMAT3per +_cmsMAT3solve = _cmsMAT3solve +cmsMD5computeID = cmsMD5computeID +cmsMLUalloc = cmsMLUalloc +cmsMLUdup = cmsMLUdup +cmsMLUfree = cmsMLUfree +cmsMLUgetASCII = cmsMLUgetASCII +cmsMLUgetTranslation = cmsMLUgetTranslation +cmsMLUgetWide = cmsMLUgetWide +cmsMLUgetUTF8 = cmsMLUgetUTF8 +cmsMLUsetASCII = cmsMLUsetASCII +cmsMLUsetWide = cmsMLUsetWide +cmsMLUsetUTF8 = cmsMLUsetUTF8 +cmsStageAllocCLut16bit = cmsStageAllocCLut16bit +cmsStageAllocCLut16bitGranular = cmsStageAllocCLut16bitGranular +cmsStageAllocCLutFloat = cmsStageAllocCLutFloat +cmsStageAllocCLutFloatGranular = cmsStageAllocCLutFloatGranular +cmsStageAllocToneCurves = cmsStageAllocToneCurves +cmsStageAllocIdentity = cmsStageAllocIdentity +cmsStageAllocMatrix = cmsStageAllocMatrix +_cmsStageAllocPlaceholder = _cmsStageAllocPlaceholder +cmsStageDup = cmsStageDup +cmsStageFree = cmsStageFree +cmsStageNext = cmsStageNext +cmsStageInputChannels = cmsStageInputChannels +cmsStageOutputChannels = cmsStageOutputChannels +cmsStageSampleCLut16bit = cmsStageSampleCLut16bit +cmsStageSampleCLutFloat = cmsStageSampleCLutFloat +cmsStageType = cmsStageType +cmsStageData = cmsStageData +cmsGetStageContextID = cmsGetStageContextID +cmsNamedColorCount = cmsNamedColorCount +cmsNamedColorIndex = cmsNamedColorIndex +cmsNamedColorInfo = cmsNamedColorInfo +cmsOpenIOhandlerFromFile = cmsOpenIOhandlerFromFile +cmsOpenIOhandlerFromMem = cmsOpenIOhandlerFromMem +cmsOpenIOhandlerFromNULL = cmsOpenIOhandlerFromNULL +cmsOpenIOhandlerFromStream = cmsOpenIOhandlerFromStream +cmsOpenProfileFromFile = cmsOpenProfileFromFile +cmsOpenProfileFromFileTHR = cmsOpenProfileFromFileTHR +cmsOpenProfileFromIOhandlerTHR = cmsOpenProfileFromIOhandlerTHR +cmsOpenProfileFromIOhandler2THR = cmsOpenProfileFromIOhandler2THR +cmsOpenProfileFromMem = cmsOpenProfileFromMem +cmsOpenProfileFromMemTHR = cmsOpenProfileFromMemTHR +cmsOpenProfileFromStream = cmsOpenProfileFromStream +cmsOpenProfileFromStreamTHR = cmsOpenProfileFromStreamTHR +cmsCreateDeviceLinkFromCubeFileTHR = cmsCreateDeviceLinkFromCubeFileTHR +cmsCreateDeviceLinkFromCubeFile = cmsCreateDeviceLinkFromCubeFile +cmsPlugin = cmsPlugin +_cmsRead15Fixed16Number = _cmsRead15Fixed16Number +_cmsReadAlignment = _cmsReadAlignment +_cmsReadFloat32Number = _cmsReadFloat32Number +cmsReadRawTag = cmsReadRawTag +cmsReadTag = cmsReadTag +_cmsReadTypeBase = _cmsReadTypeBase +_cmsReadUInt16Array = _cmsReadUInt16Array +_cmsReadUInt16Number = _cmsReadUInt16Number +_cmsReadUInt32Number = _cmsReadUInt32Number +_cmsReadUInt64Number = _cmsReadUInt64Number +_cmsReadUInt8Number = _cmsReadUInt8Number +_cmsReadXYZNumber = _cmsReadXYZNumber +_cmsRealloc = _cmsRealloc +cmsReverseToneCurve = cmsReverseToneCurve +cmsReverseToneCurveEx = cmsReverseToneCurveEx +cmsSaveProfileToFile = cmsSaveProfileToFile +cmsSaveProfileToIOhandler = cmsSaveProfileToIOhandler +cmsSaveProfileToMem = cmsSaveProfileToMem +cmsSaveProfileToStream = cmsSaveProfileToStream +cmsSetAdaptationState = cmsSetAdaptationState +cmsSetAlarmCodes = cmsSetAlarmCodes +cmsSetColorSpace = cmsSetColorSpace +cmsSetDeviceClass = cmsSetDeviceClass +cmsSetEncodedICCversion = cmsSetEncodedICCversion +cmsSetHeaderAttributes = cmsSetHeaderAttributes +cmsSetHeaderFlags = cmsSetHeaderFlags +cmsSetHeaderManufacturer = cmsSetHeaderManufacturer +cmsSetHeaderModel = cmsSetHeaderModel +cmsSetHeaderProfileID = cmsSetHeaderProfileID +cmsSetHeaderRenderingIntent = cmsSetHeaderRenderingIntent +cmsSetLogErrorHandler = cmsSetLogErrorHandler +cmsSetPCS = cmsSetPCS +cmsSetProfileVersion = cmsSetProfileVersion +cmsSignalError = cmsSignalError +cmsSmoothToneCurve = cmsSmoothToneCurve +cmsstrcasecmp = cmsstrcasecmp +cmsTempFromWhitePoint = cmsTempFromWhitePoint +cmsTransform2DeviceLink = cmsTransform2DeviceLink +cmsUnregisterPlugins = cmsUnregisterPlugins +_cmsVEC3cross = _cmsVEC3cross +_cmsVEC3distance = _cmsVEC3distance +_cmsVEC3dot = _cmsVEC3dot +_cmsVEC3init = _cmsVEC3init +_cmsVEC3length = _cmsVEC3length +_cmsVEC3minus = _cmsVEC3minus +cmsWhitePointFromTemp = cmsWhitePointFromTemp +_cmsWrite15Fixed16Number = _cmsWrite15Fixed16Number +_cmsWriteAlignment = _cmsWriteAlignment +_cmsWriteFloat32Number = _cmsWriteFloat32Number +cmsWriteRawTag = cmsWriteRawTag +cmsWriteTag = cmsWriteTag +_cmsWriteTypeBase = _cmsWriteTypeBase +_cmsWriteUInt16Array = _cmsWriteUInt16Array +_cmsWriteUInt16Number = _cmsWriteUInt16Number +_cmsWriteUInt32Number = _cmsWriteUInt32Number +_cmsWriteUInt64Number = _cmsWriteUInt64Number +_cmsWriteUInt8Number = _cmsWriteUInt8Number +_cmsWriteXYZNumber = _cmsWriteXYZNumber +cmsxyY2XYZ = cmsxyY2XYZ +cmsXYZ2Lab = cmsXYZ2Lab +cmsXYZ2xyY = cmsXYZ2xyY +cmsXYZEncoded2Float = cmsXYZEncoded2Float +cmsSliceSpace16 = cmsSliceSpace16 +cmsSliceSpaceFloat = cmsSliceSpaceFloat +cmsChangeBuffersFormat = cmsChangeBuffersFormat +cmsDictAlloc = cmsDictAlloc +cmsDictFree = cmsDictFree +cmsDictDup = cmsDictDup +cmsDictAddEntry = cmsDictAddEntry +cmsDictGetEntryList = cmsDictGetEntryList +cmsDictNextEntry = cmsDictNextEntry +_cmsGetTransformUserData = _cmsGetTransformUserData +_cmsSetTransformUserData = _cmsSetTransformUserData +cmsGetHeaderCreator = cmsGetHeaderCreator +cmsPluginTHR = cmsPluginTHR +cmsGetPipelineContextID = cmsGetPipelineContextID +cmsGetTransformInputFormat = cmsGetTransformInputFormat +cmsGetTransformOutputFormat = cmsGetTransformOutputFormat +cmsCreateContext = cmsCreateContext +cmsDupContext = cmsDupContext +cmsDeleteContext = cmsDeleteContext +cmsGetContextUserData = cmsGetContextUserData +cmsUnregisterPluginsTHR = cmsUnregisterPluginsTHR +cmsSetAlarmCodesTHR = cmsSetAlarmCodesTHR +cmsGetAlarmCodesTHR = cmsGetAlarmCodesTHR +cmsSetAdaptationStateTHR = cmsSetAdaptationStateTHR +cmsSetLogErrorHandlerTHR = cmsSetLogErrorHandlerTHR +cmsGetSupportedIntentsTHR = cmsGetSupportedIntentsTHR +cmsMLUtranslationsCount = cmsMLUtranslationsCount +cmsMLUtranslationsCodes = cmsMLUtranslationsCodes +_cmsCreateMutex = _cmsCreateMutex +_cmsDestroyMutex = _cmsDestroyMutex +_cmsLockMutex = _cmsLockMutex +_cmsUnlockMutex = _cmsUnlockMutex +cmsGetProfileIOhandler = cmsGetProfileIOhandler +cmsGetEncodedCMMversion = cmsGetEncodedCMMversion +_cmsFloat2Half = _cmsFloat2Half +_cmsHalf2Float = _cmsHalf2Float +_cmsFreeInterpParams = _cmsFreeInterpParams +_cmsGetFormatter = _cmsGetFormatter +_cmsGetTransformFormatters16 = _cmsGetTransformFormatters16 +_cmsGetTransformFormattersFloat = _cmsGetTransformFormattersFloat +_cmsQuantizeVal = _cmsQuantizeVal +_cmsReadDevicelinkLUT = _cmsReadDevicelinkLUT +_cmsReadInputLUT = _cmsReadInputLUT +_cmsReadOutputLUT = _cmsReadOutputLUT +_cmsStageAllocIdentityCLut = _cmsStageAllocIdentityCLut +_cmsStageAllocIdentityCurves = _cmsStageAllocIdentityCurves +_cmsStageAllocLab2XYZ = _cmsStageAllocLab2XYZ +_cmsStageAllocLabV2ToV4 = _cmsStageAllocLabV2ToV4 +_cmsStageAllocLabV4ToV2 = _cmsStageAllocLabV4ToV2 +_cmsStageAllocNamedColor = _cmsStageAllocNamedColor +_cmsStageAllocXYZ2Lab = _cmsStageAllocXYZ2Lab +cmsMD5add = cmsMD5add +cmsMD5alloc = cmsMD5alloc +cmsMD5finish = cmsMD5finish +_cmsComputeInterpParams = _cmsComputeInterpParams +cmsGetToneCurveSegment = cmsGetToneCurveSegment +cmsDetectRGBProfileGamma = cmsDetectRGBProfileGamma +_cmsOptimizePipeline = _cmsOptimizePipeline +_cmsReasonableGridpointsByColorspace = _cmsReasonableGridpointsByColorspace +_cmsGetTransformFlags = _cmsGetTransformFlags +_cmsGetTransformWorker = _cmsGetTransformWorker +_cmsGetTransformMaxWorkers = _cmsGetTransformMaxWorkers +_cmsGetTransformWorkerFlags = _cmsGetTransformWorkerFlags +cmsGetTagOffsetAndSize = cmsGetTagOffsetAndSize +cmsGetHeaderCMM = cmsGetHeaderCMM +_cmsSetHeaderCMM = _cmsSetHeaderCMM +cmsGetTransformPipeline = cmsGetTransformPipeline +cmsGetTransformGamutCheckPipeline = cmsGetTransformGamutCheckPipeline +cmsGetTransformInputColorants = cmsGetTransformInputColorants +cmsGetTransformOutputColorants = cmsGetTransformOutputColorants diff --git a/local/recipes/libs/lcms2/source/src/lcms2.rc.in b/local/recipes/libs/lcms2/source/src/lcms2.rc.in new file mode 100644 index 0000000000..6f6cd5f239 --- /dev/null +++ b/local/recipes/libs/lcms2/source/src/lcms2.rc.in @@ -0,0 +1,56 @@ +//--------------------------------------------------------------------------------- +// +// Little Color Management System +// Copyright (c) 1998-2025 Marti Maria Saguer +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//--------------------------------------------------------------------------------- +// +#include + +1 VERSIONINFO +FILEVERSION @LCMS2_VERSION_MAJOR@, @LCMS2_VERSION_MINOR@, @LCMS2_VERSION_MICRO@, 0 +PRODUCTVERSION @LCMS2_VERSION_MAJOR@, @LCMS2_VERSION_MINOR@, @LCMS2_VERSION_MICRO@, 0 +FILEFLAGSMASK 0x0L +#ifdef _DEBUG +FILEFLAGS VS_FF_DEBUG +#endif +FILEOS VOS_NT_WINDOWS32 +FILETYPE VFT_DLL +{ + BLOCK "StringFileInfo" + { + BLOCK "040904e4" + { + VALUE "CompanyName", "Marti Maria" + VALUE "FileDescription", "lcms color engine" + VALUE "FileVersion", @LCMS2_VERSION@ + VALUE "InternalName", "lcms2" + VALUE "LegalCopyright", "Copyright (C) Marti Maria 2025" + VALUE "OriginalFilename", "lcms2.dll" + VALUE "ProductName", "LittleCMS color engine" + VALUE "ProductVersion", @LCMS2_VERSION@ + } + } + BLOCK "VarFileInfo" + { + VALUE "Translation", 0x409, 1252 + } +} diff --git a/local/recipes/libs/lcms2/source/src/lcms2_internal.h b/local/recipes/libs/lcms2/source/src/lcms2_internal.h new file mode 100644 index 0000000000..655c9aff73 --- /dev/null +++ b/local/recipes/libs/lcms2/source/src/lcms2_internal.h @@ -0,0 +1,1158 @@ + +// +// Little Color Management System +// Copyright (c) 1998-2026 Marti Maria Saguer +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//--------------------------------------------------------------------------------- +// + +#ifndef _lcms_internal_H + +// Include plug-in foundation +#ifndef _lcms_plugin_H +# include "lcms2_plugin.h" +#endif + +// ctype is part of C99 as per 7.1.2 +#include + +// assert macro is part of C99 as per 7.2 +#include + +// Some needed constants +#ifndef M_PI +# define M_PI 3.14159265358979323846 +#endif + +#ifndef M_LOG10E +# define M_LOG10E 0.434294481903251827651 +#endif + +// BorlandC 5.5, VC2003 are broken on that +#if defined(__BORLANDC__) || (defined(_MSC_VER) && (_MSC_VER < 1400)) // 1400 == VC++ 8.0 +#define sinf(x) (float)sin((float)x) +#define sqrtf(x) (float)sqrt((float)x) +#endif + + +// Alignment of ICC file format uses 4 bytes (cmsUInt32Number) +#define _cmsALIGNLONG(x) (((x)+(sizeof(cmsUInt32Number)-1)) & ~(sizeof(cmsUInt32Number)-1)) + +// Alignment to memory pointer + +// (Ultra)SPARC with gcc requires ptr alignment of 8 bytes +// even though sizeof(void *) is only four: for greatest flexibility +// allow the build to specify ptr alignment. +#ifndef CMS_PTR_ALIGNMENT +# define CMS_PTR_ALIGNMENT sizeof(void *) +#endif + +#define _cmsALIGNMEM(x) (((x)+(CMS_PTR_ALIGNMENT - 1)) & ~(CMS_PTR_ALIGNMENT - 1)) + +// Maximum encodeable values in floating point +#define MAX_ENCODEABLE_XYZ (1.0 + 32767.0/32768.0) +#define MIN_ENCODEABLE_ab2 (-128.0) +#define MAX_ENCODEABLE_ab2 ((65535.0/256.0) - 128.0) +#define MIN_ENCODEABLE_ab4 (-128.0) +#define MAX_ENCODEABLE_ab4 (127.0) + +// Maximum of channels for internal pipeline evaluation +#define MAX_STAGE_CHANNELS 128 + +// Unused parameter warning suppression +#define cmsUNUSED_PARAMETER(x) ((void)x) + +// The specification for "inline" is section 6.7.4 of the C99 standard (ISO/IEC 9899:1999). +// unfortunately VisualC++ does not conform that +#if defined(_MSC_VER) || defined(__BORLANDC__) +# define cmsINLINE __inline +#else +# define cmsINLINE static inline +#endif + +// Allow signed overflow, we know this is harmless in this particular context +#if defined(__clang__) +# define CMS_NO_SANITIZE __attribute__((no_sanitize("signed-integer-overflow"))) +#else +# define CMS_NO_SANITIZE +#endif + +// Other replacement functions +#ifdef _MSC_VER +# ifndef snprintf +# define snprintf _snprintf +# endif +# ifndef vsnprintf +# define vsnprintf _vsnprintf +# endif + +/// Properly define some macros to accommodate +/// older MSVC versions. +# if defined(_MSC_VER) && _MSC_VER <= 1700 + #include + #define isnan _isnan + #define isinf(x) (!_finite((x))) +# endif + +#if !defined(_MSC_VER) && (defined(__STDC_VERSION__) && __STDC_VERSION__ < 199901L) + #if !defined(isinf) + #define isinf(x) (!finite((x))) + #endif +#endif + + +#endif + +// A fast way to convert from/to 16 <-> 8 bits +#define FROM_8_TO_16(rgb) (cmsUInt16Number) ((((cmsUInt16Number) (rgb)) << 8)|(rgb)) +#define FROM_16_TO_8(rgb) (cmsUInt8Number) ((((cmsUInt32Number)(rgb) * 65281U + 8388608U) >> 24) & 0xFFU) + +// Code analysis is broken on asserts +#ifdef _MSC_VER +# if (_MSC_VER >= 1500) +# define _cmsAssert(a) { assert((a)); __analysis_assume((a)); } +# else +# define _cmsAssert(a) assert((a)) +# endif +#else +# define _cmsAssert(a) assert((a)) +#endif + +//--------------------------------------------------------------------------------- + +// Determinant lower than that are assumed zero (used on matrix invert) +#define MATRIX_DET_TOLERANCE 0.0001 + +//--------------------------------------------------------------------------------- + +// Fixed point +#define FIXED_TO_INT(x) ((x)>>16) +#define FIXED_REST_TO_INT(x) ((x)&0xFFFFU) +#define ROUND_FIXED_TO_INT(x) (((x)+0x8000)>>16) + +cmsINLINE cmsS15Fixed16Number _cmsToFixedDomain(int a) { return a + ((a + 0x7fff) / 0xffff); } +cmsINLINE int _cmsFromFixedDomain(cmsS15Fixed16Number a) { return a - ((a + 0x7fff) >> 16); } + +// ----------------------------------------------------------------------------------------------------------- + +// Fast floor conversion logic. Thanks to Sree Kotay and Stuart Nixon +// note than this only works in the range ..-32767...+32767 because +// mantissa is interpreted as 15.16 fixed point. +// The union is to avoid pointer aliasing overoptimization. +cmsINLINE int _cmsQuickFloor(cmsFloat64Number val) +{ +#ifdef CMS_DONT_USE_FAST_FLOOR + return (int) floor(val); +#else + const cmsFloat64Number _lcms_double2fixmagic = 68719476736.0 * 1.5; // 2^36 * 1.5, (52-16=36) uses limited precision to floor + union { + cmsFloat64Number val; + int halves[2]; + } temp; + + temp.val = val + _lcms_double2fixmagic; + +#ifdef CMS_USE_BIG_ENDIAN + return temp.halves[1] >> 16; +#else + return temp.halves[0] >> 16; +#endif +#endif +} + +// Fast floor restricted to 0..65535.0 +cmsINLINE cmsUInt16Number _cmsQuickFloorWord(cmsFloat64Number d) +{ + return (cmsUInt16Number) _cmsQuickFloor(d - 32767.0) + 32767U; +} + +// Floor to word, taking care of saturation +cmsINLINE cmsUInt16Number _cmsQuickSaturateWord(cmsFloat64Number d) +{ + d += 0.5; + if (d <= 0) return 0; + if (d >= 65535.0) return 0xffff; + + return _cmsQuickFloorWord(d); +} + +// Test bed entry points--------------------------------------------------------------- +#define CMSCHECKPOINT CMSAPI + +// Pthread support -------------------------------------------------------------------- +#ifndef CMS_NO_PTHREADS + +// This is the threading support. Unfortunately, it has to be platform-dependent because +// windows does not support pthreads. +#ifdef CMS_IS_WINDOWS_ + +#define WIN32_LEAN_AND_MEAN 1 +#include + + +// The locking scheme in LCMS requires a single 'top level' mutex +// to work. This is actually implemented on Windows as a +// CriticalSection, because they are lighter weight. With +// pthreads, this is statically inited. Unfortunately, windows +// can't officially statically init critical sections. +// +// We can work around this in 2 ways. +// +// 1) We can use a proper mutex purely to protect the init +// of the CriticalSection. This in turns requires us to protect +// the Mutex creation, which we can do using the snappily +// named InterlockedCompareExchangePointer API (present on +// windows XP and above). +// +// 2) In cases where we want to work on pre-Windows XP, we +// can use an even more horrible hack described below. +// +// So why wouldn't we always use 2)? Because not calling +// the init function for a critical section means it fails +// testing with ApplicationVerifier (and presumably similar +// tools). +// +// We therefore default to 1, and people who want to be able +// to run on pre-Windows XP boxes can build with: +// CMS_RELY_ON_WINDOWS_STATIC_MUTEX_INIT +// defined. This is automatically set for builds using +// versions of MSVC that don't have this API available. +// +// From: http://locklessinc.com/articles/pthreads_on_windows/ +// The pthreads API has an initialization macro that has no correspondence to anything in +// the windows API. By investigating the internal definition of the critical section type, +// one may work out how to initialize one without calling InitializeCriticalSection(). +// The trick here is that InitializeCriticalSection() is not allowed to fail. It tries +// to allocate a critical section debug object, but if no memory is available, it sets +// the pointer to a specific value. (One would expect that value to be NULL, but it is +// actually (void *)-1 for some reason.) Thus we can use this special value for that +// pointer, and the critical section code will work. + +// The other important part of the critical section type to initialize is the number +// of waiters. This controls whether or not the mutex is locked. Fortunately, this +// part of the critical section is unlikely to change. Apparently, many programs +// already test critical sections to see if they are locked using this value, so +// Microsoft felt that it was necessary to keep it set at -1 for an unlocked critical +// section, even when they changed the underlying algorithm to be more scalable. +// The final parts of the critical section object are unimportant, and can be set +// to zero for their defaults. This yields to an initialization macro: + +typedef CRITICAL_SECTION _cmsMutex; + +#ifdef _MSC_VER +# if (_MSC_VER >= 1800) +# pragma warning(disable : 26135) +# pragma warning(disable : 4127) +# endif +#endif + +#ifndef CMS_RELY_ON_WINDOWS_STATIC_MUTEX_INIT +// If we are building with a version of MSVC smaller +// than 1400 (i.e. before VS2005) then we don't have +// the InterlockedCompareExchangePointer API, so use +// the old version. +# ifdef _MSC_VER +# if _MSC_VER < 1400 +# define CMS_RELY_ON_WINDOWS_STATIC_MUTEX_INIT +# endif +# endif +#endif + +#ifdef CMS_RELY_ON_WINDOWS_STATIC_MUTEX_INIT +# define CMS_MUTEX_INITIALIZER {(PRTL_CRITICAL_SECTION_DEBUG) -1,-1,0,0,0,0} +#else +# define CMS_MUTEX_INITIALIZER {(PRTL_CRITICAL_SECTION_DEBUG)NULL,-1,0,0,0,0} +#endif + +cmsINLINE int _cmsLockPrimitive(_cmsMutex *m) +{ + EnterCriticalSection(m); + return 0; +} + +cmsINLINE int _cmsUnlockPrimitive(_cmsMutex *m) +{ + LeaveCriticalSection(m); + return 0; +} + +cmsINLINE int _cmsInitMutexPrimitive(_cmsMutex *m) +{ + InitializeCriticalSection(m); + return 0; +} + +cmsINLINE int _cmsDestroyMutexPrimitive(_cmsMutex *m) +{ + DeleteCriticalSection(m); + return 0; +} + +cmsINLINE int _cmsEnterCriticalSectionPrimitive(_cmsMutex *m) +{ + EnterCriticalSection(m); + return 0; +} + +cmsINLINE int _cmsLeaveCriticalSectionPrimitive(_cmsMutex *m) +{ + LeaveCriticalSection(m); + return 0; +} + +#else + +// Rest of the wide world +#include + +#define CMS_MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER +typedef pthread_mutex_t _cmsMutex; + + +cmsINLINE int _cmsLockPrimitive(_cmsMutex *m) +{ + return pthread_mutex_lock(m); +} + +cmsINLINE int _cmsUnlockPrimitive(_cmsMutex *m) +{ + return pthread_mutex_unlock(m); +} + +cmsINLINE int _cmsInitMutexPrimitive(_cmsMutex *m) +{ + return pthread_mutex_init(m, NULL); +} + +cmsINLINE int _cmsDestroyMutexPrimitive(_cmsMutex *m) +{ + return pthread_mutex_destroy(m); +} + +cmsINLINE int _cmsEnterCriticalSectionPrimitive(_cmsMutex *m) +{ + return pthread_mutex_lock(m); +} + +cmsINLINE int _cmsLeaveCriticalSectionPrimitive(_cmsMutex *m) +{ + return pthread_mutex_unlock(m); +} + +#endif +#else + +#define CMS_MUTEX_INITIALIZER 0 +typedef int _cmsMutex; + + +cmsINLINE int _cmsLockPrimitive(_cmsMutex *m) +{ + cmsUNUSED_PARAMETER(m); + return 0; +} + +cmsINLINE int _cmsUnlockPrimitive(_cmsMutex *m) +{ + cmsUNUSED_PARAMETER(m); + return 0; +} + +cmsINLINE int _cmsInitMutexPrimitive(_cmsMutex *m) +{ + cmsUNUSED_PARAMETER(m); + return 0; +} + +cmsINLINE int _cmsDestroyMutexPrimitive(_cmsMutex *m) +{ + cmsUNUSED_PARAMETER(m); + return 0; +} + +cmsINLINE int _cmsEnterCriticalSectionPrimitive(_cmsMutex *m) +{ + cmsUNUSED_PARAMETER(m); + return 0; +} + +cmsINLINE int _cmsLeaveCriticalSectionPrimitive(_cmsMutex *m) +{ + cmsUNUSED_PARAMETER(m); + return 0; +} +#endif + +// Plug-In registration --------------------------------------------------------------- + +// Specialized function for plug-in memory management. No pairing free() since whole pool is freed at once. +void* _cmsPluginMalloc(cmsContext ContextID, cmsUInt32Number size); + +// Memory management +cmsBool _cmsRegisterMemHandlerPlugin(cmsContext ContextID, cmsPluginBase* Plugin); + +// Interpolation +cmsBool _cmsRegisterInterpPlugin(cmsContext ContextID, cmsPluginBase* Plugin); + +// Parametric curves +cmsBool _cmsRegisterParametricCurvesPlugin(cmsContext ContextID, cmsPluginBase* Plugin); + +// Formatters management +cmsBool _cmsRegisterFormattersPlugin(cmsContext ContextID, cmsPluginBase* Plugin); + +// Tag type management +cmsBool _cmsRegisterTagTypePlugin(cmsContext ContextID, cmsPluginBase* Plugin); + +// Tag management +cmsBool _cmsRegisterTagPlugin(cmsContext ContextID, cmsPluginBase* Plugin); + +// Intent management +cmsBool _cmsRegisterRenderingIntentPlugin(cmsContext ContextID, cmsPluginBase* Plugin); + +// Multi Process elements +cmsBool _cmsRegisterMultiProcessElementPlugin(cmsContext ContextID, cmsPluginBase* Plugin); + +// Optimization +cmsBool _cmsRegisterOptimizationPlugin(cmsContext ContextID, cmsPluginBase* Plugin); + +// Transform +cmsBool _cmsRegisterTransformPlugin(cmsContext ContextID, cmsPluginBase* Plugin); + +// Mutex +cmsBool _cmsRegisterMutexPlugin(cmsContext ContextID, cmsPluginBase* Plugin); + +// Parallelization +cmsBool _cmsRegisterParallelizationPlugin(cmsContext ContextID, cmsPluginBase* Plugin); + +// --------------------------------------------------------------------------------------------------------- + +// Suballocators. +typedef struct _cmsSubAllocator_chunk_st { + + cmsUInt8Number* Block; + cmsUInt32Number BlockSize; + cmsUInt32Number Used; + + struct _cmsSubAllocator_chunk_st* next; + +} _cmsSubAllocator_chunk; + + +typedef struct { + + cmsContext ContextID; + _cmsSubAllocator_chunk* h; + +} _cmsSubAllocator; + + +_cmsSubAllocator* _cmsCreateSubAlloc(cmsContext ContextID, cmsUInt32Number Initial); +void _cmsSubAllocDestroy(_cmsSubAllocator* s); +void* _cmsSubAlloc(_cmsSubAllocator* s, cmsUInt32Number size); +void* _cmsSubAllocDup(_cmsSubAllocator* s, const void *ptr, cmsUInt32Number size); + +// ---------------------------------------------------------------------------------- + +// The context clients. +typedef enum { + + UserPtr, // User-defined pointer + Logger, + AlarmCodesContext, + AdaptationStateContext, + MemPlugin, + InterpPlugin, + CurvesPlugin, + FormattersPlugin, + TagTypePlugin, + TagPlugin, + IntentPlugin, + MPEPlugin, + OptimizationPlugin, + TransformPlugin, + MutexPlugin, + ParallelizationPlugin, + + // Last in list + MemoryClientMax + +} _cmsMemoryClient; + + +// Container for memory management plug-in. +typedef struct { + + _cmsMallocFnPtrType MallocPtr; + _cmsMalloZerocFnPtrType MallocZeroPtr; + _cmsFreeFnPtrType FreePtr; + _cmsReallocFnPtrType ReallocPtr; + _cmsCallocFnPtrType CallocPtr; + _cmsDupFnPtrType DupPtr; + +} _cmsMemPluginChunkType; + +// Copy memory management function pointers from plug-in to chunk, taking care of missing routines +void _cmsInstallAllocFunctions(cmsPluginMemHandler* Plugin, _cmsMemPluginChunkType* ptr); + +// Internal structure for context +struct _cmsContext_struct { + + struct _cmsContext_struct* Next; // Points to next context in the new style + _cmsSubAllocator* MemPool; // The memory pool that stores context data + + void* chunks[MemoryClientMax]; // array of pointers to client chunks. Memory itself is held in the suballocator. + // If NULL, then it reverts to global Context0 + + _cmsMemPluginChunkType DefaultMemoryManager; // The allocators used for creating the context itself. Cannot be overridden +}; + +// Returns a pointer to a valid context structure, including the global one if id is zero. +// Verifies the magic number. +struct _cmsContext_struct* _cmsGetContext(cmsContext ContextID); + +// Returns the block assigned to the specific zone. +void* _cmsContextGetClientChunk(cmsContext id, _cmsMemoryClient mc); + + +// Chunks of context memory by plug-in client ------------------------------------------------------- + +// Those structures encapsulates all variables needed by the several context clients (mostly plug-ins) + +// Container for error logger -- not a plug-in +typedef struct { + + cmsLogErrorHandlerFunction LogErrorHandler; // Set to NULL for Context0 fallback + +} _cmsLogErrorChunkType; + +// The global Context0 storage for error logger +extern _cmsLogErrorChunkType _cmsLogErrorChunk; + +// Allocate and init error logger container. +void _cmsAllocLogErrorChunk(struct _cmsContext_struct* ctx, + const struct _cmsContext_struct* src); + +// Container for alarm codes -- not a plug-in +typedef struct { + + cmsUInt16Number AlarmCodes[cmsMAXCHANNELS]; + +} _cmsAlarmCodesChunkType; + +// The global Context0 storage for alarm codes +extern _cmsAlarmCodesChunkType _cmsAlarmCodesChunk; + +// Allocate and init alarm codes container. +void _cmsAllocAlarmCodesChunk(struct _cmsContext_struct* ctx, + const struct _cmsContext_struct* src); + +// Container for adaptation state -- not a plug-in +typedef struct { + + cmsFloat64Number AdaptationState; + +} _cmsAdaptationStateChunkType; + +// The global Context0 storage for adaptation state +extern _cmsAdaptationStateChunkType _cmsAdaptationStateChunk; + +// Allocate and init adaptation state container. +void _cmsAllocAdaptationStateChunk(struct _cmsContext_struct* ctx, + const struct _cmsContext_struct* src); + + +// The global Context0 storage for memory management +extern _cmsMemPluginChunkType _cmsMemPluginChunk; + +// Allocate and init memory management container. +void _cmsAllocMemPluginChunk(struct _cmsContext_struct* ctx, + const struct _cmsContext_struct* src); + +// Container for interpolation plug-in +typedef struct { + + cmsInterpFnFactory Interpolators; + +} _cmsInterpPluginChunkType; + +// The global Context0 storage for interpolation plug-in +extern _cmsInterpPluginChunkType _cmsInterpPluginChunk; + +// Allocate and init interpolation container. +void _cmsAllocInterpPluginChunk(struct _cmsContext_struct* ctx, + const struct _cmsContext_struct* src); + +// Container for parametric curves plug-in +typedef struct { + + struct _cmsParametricCurvesCollection_st* ParametricCurves; + +} _cmsCurvesPluginChunkType; + +// The global Context0 storage for tone curves plug-in +extern _cmsCurvesPluginChunkType _cmsCurvesPluginChunk; + +// Allocate and init parametric curves container. +void _cmsAllocCurvesPluginChunk(struct _cmsContext_struct* ctx, + const struct _cmsContext_struct* src); + +// Container for formatters plug-in +typedef struct { + + struct _cms_formatters_factory_list* FactoryList; + +} _cmsFormattersPluginChunkType; + +// The global Context0 storage for formatters plug-in +extern _cmsFormattersPluginChunkType _cmsFormattersPluginChunk; + +// Allocate and init formatters container. +void _cmsAllocFormattersPluginChunk(struct _cmsContext_struct* ctx, + const struct _cmsContext_struct* src); + +// This chunk type is shared by TagType plug-in and MPE Plug-in +typedef struct { + + struct _cmsTagTypeLinkedList_st* TagTypes; + +} _cmsTagTypePluginChunkType; + + +// The global Context0 storage for tag types plug-in +extern _cmsTagTypePluginChunkType _cmsTagTypePluginChunk; + + +// The global Context0 storage for mult process elements plug-in +extern _cmsTagTypePluginChunkType _cmsMPETypePluginChunk; + +// Allocate and init Tag types container. +void _cmsAllocTagTypePluginChunk(struct _cmsContext_struct* ctx, + const struct _cmsContext_struct* src); +// Allocate and init MPE container. +void _cmsAllocMPETypePluginChunk(struct _cmsContext_struct* ctx, + const struct _cmsContext_struct* src); +// Container for tag plug-in +typedef struct { + + struct _cmsTagLinkedList_st* Tag; + +} _cmsTagPluginChunkType; + + +// The global Context0 storage for tag plug-in +extern _cmsTagPluginChunkType _cmsTagPluginChunk; + +// Allocate and init Tag container. +void _cmsAllocTagPluginChunk(struct _cmsContext_struct* ctx, + const struct _cmsContext_struct* src); + +// Container for intents plug-in +typedef struct { + + struct _cms_intents_list* Intents; + +} _cmsIntentsPluginChunkType; + + +// The global Context0 storage for intents plug-in +extern _cmsIntentsPluginChunkType _cmsIntentsPluginChunk; + +// Allocate and init intents container. +void _cmsAllocIntentsPluginChunk(struct _cmsContext_struct* ctx, + const struct _cmsContext_struct* src); + +// Container for optimization plug-in +typedef struct { + + struct _cmsOptimizationCollection_st* OptimizationCollection; + +} _cmsOptimizationPluginChunkType; + + +// The global Context0 storage for optimizers plug-in +extern _cmsOptimizationPluginChunkType _cmsOptimizationPluginChunk; + +// Allocate and init optimizers container. +void _cmsAllocOptimizationPluginChunk(struct _cmsContext_struct* ctx, + const struct _cmsContext_struct* src); + +// Container for transform plug-in +typedef struct { + + struct _cmsTransformCollection_st* TransformCollection; + +} _cmsTransformPluginChunkType; + +// The global Context0 storage for full-transform replacement plug-in +extern _cmsTransformPluginChunkType _cmsTransformPluginChunk; + +// Allocate and init transform container. +void _cmsAllocTransformPluginChunk(struct _cmsContext_struct* ctx, + const struct _cmsContext_struct* src); + +// Container for mutex plug-in +typedef struct { + + _cmsCreateMutexFnPtrType CreateMutexPtr; + _cmsDestroyMutexFnPtrType DestroyMutexPtr; + _cmsLockMutexFnPtrType LockMutexPtr; + _cmsUnlockMutexFnPtrType UnlockMutexPtr; + +} _cmsMutexPluginChunkType; + +// The global Context0 storage for mutex plug-in +extern _cmsMutexPluginChunkType _cmsMutexPluginChunk; + +// Allocate and init mutex container. +void _cmsAllocMutexPluginChunk(struct _cmsContext_struct* ctx, + const struct _cmsContext_struct* src); + +// Container for parallelization plug-in +typedef struct { + + cmsInt32Number MaxWorkers; // Number of workers to do as maximum + cmsInt32Number WorkerFlags; // reserved + _cmsTransform2Fn SchedulerFn; // callback to setup functions + +} _cmsParallelizationPluginChunkType; + +// The global Context0 storage for parallelization plug-in +extern _cmsParallelizationPluginChunkType _cmsParallelizationPluginChunk; + +// Allocate parallelization container. +void _cmsAllocParallelizationPluginChunk(struct _cmsContext_struct* ctx, + const struct _cmsContext_struct* src); + + + +// ---------------------------------------------------------------------------------- +// MLU internal representation +typedef struct { + + cmsUInt16Number Language; + cmsUInt16Number Country; + + cmsUInt32Number StrW; // Offset to current unicode string + cmsUInt32Number Len; // Length in bytes + +} _cmsMLUentry; + +struct _cms_MLU_struct { + + cmsContext ContextID; + + // The directory + cmsUInt32Number AllocatedEntries; + cmsUInt32Number UsedEntries; + _cmsMLUentry* Entries; // Array of pointers to strings allocated in MemPool + + // The Pool + cmsUInt32Number PoolSize; // The maximum allocated size + cmsUInt32Number PoolUsed; // The used size + void* MemPool; // Pointer to begin of memory pool +}; + +// Named color list internal representation +typedef struct { + + char Name[cmsMAX_PATH]; + cmsUInt16Number PCS[3]; + cmsUInt16Number DeviceColorant[cmsMAXCHANNELS]; + +} _cmsNAMEDCOLOR; + +struct _cms_NAMEDCOLORLIST_struct { + + cmsUInt32Number nColors; + cmsUInt32Number Allocated; + cmsUInt32Number ColorantCount; + + char Prefix[33]; // Prefix and suffix are defined to be 32 characters at most + char Suffix[33]; + + _cmsNAMEDCOLOR* List; + + cmsContext ContextID; +}; + + +// ---------------------------------------------------------------------------------- + +// This is the internal struct holding profile details. + +// Maximum supported tags in a profile +#define MAX_TABLE_TAG 100 + +typedef struct _cms_iccprofile_struct { + + // I/O handler + cmsIOHANDLER* IOhandler; + + // The thread ID + cmsContext ContextID; + + // Creation time + struct tm Created; + + // Color management module identification + cmsUInt32Number CMM; + + // Only most important items found in ICC profiles + cmsUInt32Number Version; + cmsProfileClassSignature DeviceClass; + cmsColorSpaceSignature ColorSpace; + cmsColorSpaceSignature PCS; + cmsUInt32Number RenderingIntent; + + cmsPlatformSignature platform; + cmsUInt32Number flags; + cmsUInt32Number manufacturer, model; + cmsUInt64Number attributes; + cmsUInt32Number creator; + + cmsProfileID ProfileID; + + // Dictionary + cmsUInt32Number TagCount; + cmsTagSignature TagNames[MAX_TABLE_TAG]; + cmsTagSignature TagLinked[MAX_TABLE_TAG]; // The tag to which is linked (0=none) + cmsUInt32Number TagSizes[MAX_TABLE_TAG]; // Size on disk + cmsUInt32Number TagOffsets[MAX_TABLE_TAG]; + cmsBool TagSaveAsRaw[MAX_TABLE_TAG]; // True to write uncooked + void * TagPtrs[MAX_TABLE_TAG]; + cmsTagTypeHandler* TagTypeHandlers[MAX_TABLE_TAG]; // Same structure may be serialized on different types + // depending on profile version, so we keep track of the + // type handler for each tag in the list. + // Special + cmsBool IsWrite; + + // Keep a mutex for cmsReadTag -- Note that this only works if the user includes a mutex plugin + void * UsrMutex; + +} _cmsICCPROFILE; + +// IO helpers for profiles +cmsBool _cmsReadHeader(_cmsICCPROFILE* Icc); +cmsBool _cmsWriteHeader(_cmsICCPROFILE* Icc, cmsUInt32Number UsedSpace); +int _cmsSearchTag(_cmsICCPROFILE* Icc, cmsTagSignature sig, cmsBool lFollowLinks); + +// Tag types +cmsTagTypeHandler* _cmsGetTagTypeHandler(cmsContext ContextID, cmsTagTypeSignature sig); +cmsTagTypeSignature _cmsGetTagTrueType(cmsHPROFILE hProfile, cmsTagSignature sig); +cmsTagDescriptor* _cmsGetTagDescriptor(cmsContext ContextID, cmsTagSignature sig); +cmsBool _cmsAvoidTypeCheckOnTags(cmsContext ContextID); + +// Error logging --------------------------------------------------------------------------------------------------------- + +void _cmsTagSignature2String(char String[5], cmsTagSignature sig); + +// Interpolation --------------------------------------------------------------------------------------------------------- + +CMSCHECKPOINT cmsInterpParams* CMSEXPORT _cmsComputeInterpParams(cmsContext ContextID, cmsUInt32Number nSamples, cmsUInt32Number InputChan, cmsUInt32Number OutputChan, const void* Table, cmsUInt32Number dwFlags); +cmsInterpParams* _cmsComputeInterpParamsEx(cmsContext ContextID, const cmsUInt32Number nSamples[], cmsUInt32Number InputChan, cmsUInt32Number OutputChan, const void* Table, cmsUInt32Number dwFlags); +CMSCHECKPOINT void CMSEXPORT _cmsFreeInterpParams(cmsInterpParams* p); +cmsBool _cmsSetInterpolationRoutine(cmsContext ContextID, cmsInterpParams* p); + +// Curves ---------------------------------------------------------------------------------------------------------------- + +// This struct holds information about a segment, plus a pointer to the function that implements the evaluation. +// In the case of table-based, Eval pointer is set to NULL + +// The gamma function main structure +struct _cms_curve_struct { + + cmsInterpParams* InterpParams; // Private optimizations for interpolation + + cmsUInt32Number nSegments; // Number of segments in the curve. Zero for a 16-bit based tables + cmsCurveSegment* Segments; // The segments + cmsInterpParams** SegInterp; // Array of private optimizations for interpolation in table-based segments + + cmsParametricCurveEvaluator* Evals; // Evaluators (one per segment) + + // 16 bit Table-based representation follows + cmsUInt32Number nEntries; // Number of table elements + cmsUInt16Number* Table16; // The table itself. +}; + + +// Pipelines & Stages --------------------------------------------------------------------------------------------- + +// A single stage +struct _cmsStage_struct { + + cmsContext ContextID; + + cmsStageSignature Type; // Identifies the stage + cmsStageSignature Implements; // Identifies the *function* of the stage (for optimizations) + + cmsUInt32Number InputChannels; // Input channels -- for optimization purposes + cmsUInt32Number OutputChannels; // Output channels -- for optimization purposes + + _cmsStageEvalFn EvalPtr; // Points to fn that evaluates the stage (always in floating point) + _cmsStageDupElemFn DupElemPtr; // Points to a fn that duplicates the *data* of the stage + _cmsStageFreeElemFn FreePtr; // Points to a fn that sets the *data* of the stage free + + // A generic pointer to whatever memory needed by the stage + void* Data; + + // Maintains linked list (used internally) + struct _cmsStage_struct* Next; +}; + + +// Special Stages (cannot be saved) +CMSCHECKPOINT cmsStage* CMSEXPORT _cmsStageAllocLab2XYZ(cmsContext ContextID); +CMSCHECKPOINT cmsStage* CMSEXPORT _cmsStageAllocXYZ2Lab(cmsContext ContextID); +cmsStage* _cmsStageAllocLabPrelin(cmsContext ContextID); +CMSCHECKPOINT cmsStage* CMSEXPORT _cmsStageAllocLabV2ToV4(cmsContext ContextID); +cmsStage* _cmsStageAllocLabV2ToV4curves(cmsContext ContextID); +CMSCHECKPOINT cmsStage* CMSEXPORT _cmsStageAllocLabV4ToV2(cmsContext ContextID); +CMSCHECKPOINT cmsStage* CMSEXPORT _cmsStageAllocNamedColor(cmsNAMEDCOLORLIST* NamedColorList, cmsBool UsePCS); +CMSCHECKPOINT cmsStage* CMSEXPORT _cmsStageAllocIdentityCurves(cmsContext ContextID, cmsUInt32Number nChannels); +CMSCHECKPOINT cmsStage* CMSEXPORT _cmsStageAllocIdentityCLut(cmsContext ContextID, cmsUInt32Number nChan); +cmsStage* _cmsStageNormalizeFromLabFloat(cmsContext ContextID); +cmsStage* _cmsStageNormalizeFromXyzFloat(cmsContext ContextID); +cmsStage* _cmsStageNormalizeToLabFloat(cmsContext ContextID); +cmsStage* _cmsStageNormalizeToXyzFloat(cmsContext ContextID); +cmsStage* _cmsStageClipNegatives(cmsContext ContextID, cmsUInt32Number nChannels); + + +// For curve set only +cmsToneCurve** _cmsStageGetPtrToCurveSet(const cmsStage* mpe); + +struct _cmsPipeline_struct { + + cmsStage* Elements; // Points to elements chain + cmsUInt32Number InputChannels, OutputChannels; + + // Data & evaluators + void *Data; + + _cmsPipelineEval16Fn Eval16Fn; + _cmsPipelineEvalFloatFn EvalFloatFn; + _cmsFreeUserDataFn FreeDataFn; + _cmsDupUserDataFn DupDataFn; + + cmsContext ContextID; // Environment + + cmsBool SaveAs8Bits; // Implementation-specific: save as 8 bits if possible +}; + +// LUT reading & creation ------------------------------------------------------------------------------------------- + +// Read tags using low-level function, provide necessary glue code to adapt versions, etc. All those return a brand new copy +// of the LUTS, since ownership of original is up to the profile. The user should free allocated resources. + +CMSCHECKPOINT cmsPipeline* CMSEXPORT _cmsReadInputLUT(cmsHPROFILE hProfile, cmsUInt32Number Intent); +CMSCHECKPOINT cmsPipeline* CMSEXPORT _cmsReadOutputLUT(cmsHPROFILE hProfile, cmsUInt32Number Intent); +CMSCHECKPOINT cmsPipeline* CMSEXPORT _cmsReadDevicelinkLUT(cmsHPROFILE hProfile, cmsUInt32Number Intent); + +// Special values +cmsBool _cmsReadMediaWhitePoint(cmsCIEXYZ* Dest, cmsHPROFILE hProfile); +cmsBool _cmsReadCHAD(cmsMAT3* Dest, cmsHPROFILE hProfile); + +// Profile linker -------------------------------------------------------------------------------------------------- + +// Link several profiles to obtain a single LUT modelling the whole color transform. Intents, Black point +// compensation and Adaptation parameters may vary across profiles. BPC and Adaptation refers to the PCS +// after the profile. I.e, BPC[0] refers to connetion between profile(0) and profile(1) +cmsPipeline* _cmsLinkProfiles(cmsContext ContextID, + cmsUInt32Number nProfiles, + cmsUInt32Number TheIntents[], + cmsHPROFILE hProfiles[], + cmsBool BPC[], + cmsFloat64Number AdaptationStates[], + cmsUInt32Number dwFlags); + +// Sequence -------------------------------------------------------------------------------------------------------- + +cmsSEQ* _cmsReadProfileSequence(cmsHPROFILE hProfile); +cmsBool _cmsWriteProfileSequence(cmsHPROFILE hProfile, const cmsSEQ* seq); +cmsSEQ* _cmsCompileProfileSequence(cmsContext ContextID, cmsUInt32Number nProfiles, cmsHPROFILE hProfiles[]); + + +// LUT optimization ------------------------------------------------------------------------------------------------ + +CMSCHECKPOINT cmsUInt16Number CMSEXPORT _cmsQuantizeVal(cmsFloat64Number i, cmsUInt32Number MaxSamples); + +CMSAPI cmsUInt32Number CMSEXPORT _cmsReasonableGridpointsByColorspace(cmsColorSpaceSignature Colorspace, cmsUInt32Number dwFlags); + +cmsBool _cmsEndPointsBySpace(cmsColorSpaceSignature Space, + cmsUInt16Number **White, + cmsUInt16Number **Black, + cmsUInt32Number *nOutputs); + +CMSAPI cmsBool CMSEXPORT _cmsOptimizePipeline(cmsContext ContextID, + cmsPipeline** Lut, + cmsUInt32Number Intent, + cmsUInt32Number* InputFormat, + cmsUInt32Number* OutputFormat, + cmsUInt32Number* dwFlags ); + + +// Hi level LUT building ---------------------------------------------------------------------------------------------- + +cmsPipeline* _cmsCreateGamutCheckPipeline(cmsContext ContextID, + cmsHPROFILE hProfiles[], + cmsBool BPC[], + cmsUInt32Number Intents[], + cmsFloat64Number AdaptationStates[], + cmsUInt32Number nGamutPCSposition, + cmsHPROFILE hGamut); + + +// Formatters ------------------------------------------------------------------------------------------------------------ + +#define cmsFLAGS_CAN_CHANGE_FORMATTER 0x02000000 // Allow change buffer format + +cmsBool _cmsFormatterIsFloat(cmsUInt32Number Type); +cmsBool _cmsFormatterIs8bit(cmsUInt32Number Type); + +CMSCHECKPOINT cmsFormatter CMSEXPORT _cmsGetFormatter(cmsContext ContextID, + cmsUInt32Number Type, // Specific type, i.e. TYPE_RGB_8 + cmsFormatterDirection Dir, + cmsUInt32Number dwFlags); + + +#ifndef CMS_NO_HALF_SUPPORT + +// Half float +CMSCHECKPOINT cmsFloat32Number CMSEXPORT _cmsHalf2Float(cmsUInt16Number h); +CMSCHECKPOINT cmsUInt16Number CMSEXPORT _cmsFloat2Half(cmsFloat32Number flt); + +#endif + +// Transform logic ------------------------------------------------------------------------------------------------------ + +struct _cmstransform_struct; + +typedef struct { + + // 1-pixel cache (16 bits only) + cmsUInt16Number CacheIn[cmsMAXCHANNELS]; + cmsUInt16Number CacheOut[cmsMAXCHANNELS]; + +} _cmsCACHE; + + + +// Transformation +typedef struct _cmstransform_struct { + + cmsUInt32Number InputFormat, OutputFormat; // Keep formats for further reference + + // Points to transform code + _cmsTransform2Fn xform; + + // Formatters, cannot be embedded into LUT because cache + cmsFormatter16 FromInput; + cmsFormatter16 ToOutput; + + cmsFormatterFloat FromInputFloat; + cmsFormatterFloat ToOutputFloat; + + // 1-pixel cache seed for zero as input (16 bits, read only) + _cmsCACHE Cache; + + // A Pipeline holding the full (optimized) transform + cmsPipeline* Lut; + + // A Pipeline holding the gamut check. It goes from the input space to bilevel + cmsPipeline* GamutCheck; + + // Colorant tables + cmsNAMEDCOLORLIST* InputColorant; // Input Colorant table + cmsNAMEDCOLORLIST* OutputColorant; // Colorant table (for n chans > CMYK) + + // Informational only + cmsColorSpaceSignature EntryColorSpace; + cmsColorSpaceSignature ExitColorSpace; + + // White points (informative only) + cmsCIEXYZ EntryWhitePoint; + cmsCIEXYZ ExitWhitePoint; + + // Profiles used to create the transform + cmsSEQ* Sequence; + + cmsUInt32Number dwOriginalFlags; + cmsFloat64Number AdaptationState; + + // The intent of this transform. That is usually the last intent in the profilechain, but may differ + cmsUInt32Number RenderingIntent; + + // An id that uniquely identifies the running context. May be null. + cmsContext ContextID; + + // A user-defined pointer that can be used to store data for transform plug-ins + void* UserData; + _cmsFreeUserDataFn FreeUserData; + + // A way to provide backwards compatibility with full xform plugins + _cmsTransformFn OldXform; + + // A one-worker transform entry for parallelization + _cmsTransform2Fn Worker; + cmsInt32Number MaxWorkers; + cmsUInt32Number WorkerFlags; + +} _cmsTRANSFORM; + +// Copies extra channels from input to output if the original flags in the transform structure +// instructs to do so. This function is called on all standard transform functions. +void _cmsHandleExtraChannels(_cmsTRANSFORM* p, const void* in, + void* out, + cmsUInt32Number PixelsPerLine, + cmsUInt32Number LineCount, + const cmsStride* Stride); + +// ----------------------------------------------------------------------------------------------------------------------- + +cmsHTRANSFORM _cmsChain2Lab(cmsContext ContextID, + cmsUInt32Number nProfiles, + cmsUInt32Number InputFormat, + cmsUInt32Number OutputFormat, + const cmsUInt32Number Intents[], + const cmsHPROFILE hProfiles[], + const cmsBool BPC[], + const cmsFloat64Number AdaptationStates[], + cmsUInt32Number dwFlags); + + +cmsToneCurve* _cmsBuildKToneCurve(cmsContext ContextID, + cmsUInt32Number nPoints, + cmsUInt32Number nProfiles, + const cmsUInt32Number Intents[], + const cmsHPROFILE hProfiles[], + const cmsBool BPC[], + const cmsFloat64Number AdaptationStates[], + cmsUInt32Number dwFlags); + +cmsBool _cmsAdaptationMatrix(cmsMAT3* r, const cmsMAT3* ConeMatrix, const cmsCIEXYZ* FromIll, const cmsCIEXYZ* ToIll); + +cmsBool _cmsBuildRGB2XYZtransferMatrix(cmsMAT3* r, const cmsCIExyY* WhitePoint, const cmsCIExyYTRIPLE* Primaries); + + +// thread-safe gettime +cmsBool _cmsGetTime(struct tm* ptr_time); + +#define _lcms_internal_H +#endif diff --git a/local/recipes/libs/lcms2/source/src/meson.build b/local/recipes/libs/lcms2/source/src/meson.build new file mode 100644 index 0000000000..a79bce1fe6 --- /dev/null +++ b/local/recipes/libs/lcms2/source/src/meson.build @@ -0,0 +1,72 @@ +lcms2_srcs = files( + 'cmsalpha.c', + 'cmscam02.c', + 'cmscgats.c', + 'cmscnvrt.c', + 'cmserr.c', + 'cmsgamma.c', + 'cmsgmt.c', + 'cmshalf.c', + 'cmsintrp.c', + 'cmsio0.c', + 'cmsio1.c', + 'cmslut.c', + 'cmsmd5.c', + 'cmsmtrx.c', + 'cmsnamed.c', + 'cmsopt.c', + 'cmspack.c', + 'cmspcs.c', + 'cmsplugin.c', + 'cmsps2.c', + 'cmssamp.c', + 'cmssm.c', + 'cmstypes.c', + 'cmsvirt.c', + 'cmswtpnt.c', + 'cmsxform.c', +) + +if host_machine.system() == 'windows' + if get_option('default_library') == 'shared' + + lcms2_rc = configure_file( + input: 'lcms2.rc.in', + configuration: version_cfg, + output: 'lcms2.rc', + ) + + lcms2_srcs += win.compile_resources(lcms2_rc) + cargs += '-DCMS_DLL_BUILD=1' + endif +endif + +if get_option('versionedlibs') + liblcms2_lib = library( + 'lcms2', + lcms2_srcs, + include_directories: inc_dirs, + gnu_symbol_visibility: 'hidden', + dependencies: deps, + c_args: cargs, + version: library_version, + # vs_module_defs: 'lcms2.def', + install: true, + ) +else + liblcms2_lib = library( + 'lcms2', + lcms2_srcs, + include_directories: inc_dirs, + gnu_symbol_visibility: 'hidden', + dependencies: deps, + c_args: cargs, + install: true, + ) +endif + +liblcms2_dep = declare_dependency( + link_with: liblcms2_lib, + include_directories: [inc_dirs, include_directories('.')], + dependencies: deps, +) diff --git a/local/recipes/libs/lcms2/source/testbed/Makefile.am b/local/recipes/libs/lcms2/source/testbed/Makefile.am new file mode 100644 index 0000000000..c8bacf54b1 --- /dev/null +++ b/local/recipes/libs/lcms2/source/testbed/Makefile.am @@ -0,0 +1,34 @@ +# +# Makefile for building testcms +# + +# Don't require all the GNU mandated files +AUTOMAKE_OPTIONS = 1.7 foreign + +AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(top_srcdir)/src + +check_PROGRAMS = testcms + +# CFLAGS = --pedantic -Wall -std=c99 -O2 + +# The testsuite binary is statically linked. This is necessary as it uses some +# of the internal functions that are not necessarily exported by the shared +# library. +testcms_LDADD = $(top_builddir)/src/liblcms2.la +testcms_LDFLAGS = -static @LDFLAGS@ +testcms_SOURCES = testcms2.c testplugin.c zoo_icc.c testcms2.h + +EXTRA_DIST = test1.icc bad.icc toosmall.icc test2.icc \ + test3.icc test4.icc \ + test5.icc ibm-t61.icc crayons.icc bad_mpe.icc + +check: + if [ $(top_srcdir) != $(top_builddir) ]; then \ + cp $(top_srcdir)/testbed/*.ic? $(top_builddir)/testbed; \ + fi + LD_LIBRARY_PATH=$(top_builddir)/src/.libs ./testcms + if [ $(top_srcdir) != $(top_builddir) ]; then \ + rm -f $(top_builddir)/testbed/*.ic?; \ + fi + + diff --git a/local/recipes/libs/lcms2/source/testbed/Makefile.in b/local/recipes/libs/lcms2/source/testbed/Makefile.in new file mode 100644 index 0000000000..51f3492ac5 --- /dev/null +++ b/local/recipes/libs/lcms2/source/testbed/Makefile.in @@ -0,0 +1,672 @@ +# Makefile.in generated by automake 1.18.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2025 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# +# Makefile for building testcms +# +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +am__rm_f = rm -f $(am__rm_f_notfound) +am__rm_rf = rm -rf $(am__rm_f_notfound) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +check_PROGRAMS = testcms$(EXEEXT) +subdir = testbed +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_append_compile_flags.m4 \ + $(top_srcdir)/m4/ax_append_flag.m4 \ + $(top_srcdir)/m4/ax_check_compile_flag.m4 \ + $(top_srcdir)/m4/ax_gcc_func_attribute.m4 \ + $(top_srcdir)/m4/ax_pthread.m4 \ + $(top_srcdir)/m4/ax_require_defined.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am_testcms_OBJECTS = testcms2.$(OBJEXT) testplugin.$(OBJEXT) \ + zoo_icc.$(OBJEXT) +testcms_OBJECTS = $(am_testcms_OBJECTS) +testcms_DEPENDENCIES = $(top_builddir)/src/liblcms2.la +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +testcms_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(testcms_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = ./$(DEPDIR)/testcms2.Po \ + ./$(DEPDIR)/testplugin.Po ./$(DEPDIR)/zoo_icc.Po +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(testcms_SOURCES) +DIST_SOURCES = $(testcms_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ETAGS = @ETAGS@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FILECMD = @FILECMD@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +JPEGICC_DEPLIBS = @JPEGICC_DEPLIBS@ +LCMS_LIB_DEPLIBS = @LCMS_LIB_DEPLIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBRARY_AGE = @LIBRARY_AGE@ +LIBRARY_CURRENT = @LIBRARY_CURRENT@ +LIBRARY_REVISION = @LIBRARY_REVISION@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_DEPS = @LIBTOOL_DEPS@ +LIB_JPEG = @LIB_JPEG@ +LIB_MATH = @LIB_MATH@ +LIB_PLUGINS = @LIB_PLUGINS@ +LIB_THREAD = @LIB_THREAD@ +LIB_TIFF = @LIB_TIFF@ +LIB_ZLIB = @LIB_ZLIB@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_CXX = @PTHREAD_CXX@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +TIFFICC_DEPLIBS = @TIFFICC_DEPLIBS@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__rm_f_notfound = @am__rm_f_notfound@ +am__tar = @am__tar@ +am__untar = @am__untar@ +am__xargs_n = @am__xargs_n@ +ax_pthread_config = @ax_pthread_config@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +inline = @inline@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +# Don't require all the GNU mandated files +AUTOMAKE_OPTIONS = 1.7 foreign +AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(top_srcdir)/src + +# CFLAGS = --pedantic -Wall -std=c99 -O2 + +# The testsuite binary is statically linked. This is necessary as it uses some +# of the internal functions that are not necessarily exported by the shared +# library. +testcms_LDADD = $(top_builddir)/src/liblcms2.la +testcms_LDFLAGS = -static @LDFLAGS@ +testcms_SOURCES = testcms2.c testplugin.c zoo_icc.c testcms2.h +EXTRA_DIST = test1.icc bad.icc toosmall.icc test2.icc \ + test3.icc test4.icc \ + test5.icc ibm-t61.icc crayons.icc bad_mpe.icc + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign testbed/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign testbed/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-checkPROGRAMS: + $(am__rm_f) $(check_PROGRAMS) + test -z "$(EXEEXT)" || $(am__rm_f) $(check_PROGRAMS:$(EXEEXT)=) + +testcms$(EXEEXT): $(testcms_OBJECTS) $(testcms_DEPENDENCIES) $(EXTRA_testcms_DEPENDENCIES) + @rm -f testcms$(EXEEXT) + $(AM_V_CCLD)$(testcms_LINK) $(testcms_OBJECTS) $(testcms_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testcms2.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testplugin.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoo_icc.Po@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @: >>$@ + +am--depfiles: $(am__depfiles_remade) + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -$(am__rm_f) $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || $(am__rm_f) $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ + mostlyclean-am + +distclean: distclean-am + -rm -f ./$(DEPDIR)/testcms2.Po + -rm -f ./$(DEPDIR)/testplugin.Po + -rm -f ./$(DEPDIR)/zoo_icc.Po + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f ./$(DEPDIR)/testcms2.Po + -rm -f ./$(DEPDIR)/testplugin.Po + -rm -f ./$(DEPDIR)/zoo_icc.Po + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: check-am install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ + clean-checkPROGRAMS clean-generic clean-libtool cscopelist-am \ + ctags ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +check: + if [ $(top_srcdir) != $(top_builddir) ]; then \ + cp $(top_srcdir)/testbed/*.ic? $(top_builddir)/testbed; \ + fi + LD_LIBRARY_PATH=$(top_builddir)/src/.libs ./testcms + if [ $(top_srcdir) != $(top_builddir) ]; then \ + rm -f $(top_builddir)/testbed/*.ic?; \ + fi + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: + +# Tell GNU make to disable its built-in pattern rules. +%:: %,v +%:: RCS/%,v +%:: RCS/% +%:: s.% +%:: SCCS/s.% diff --git a/local/recipes/libs/lcms2/source/testbed/alpha_test.c b/local/recipes/libs/lcms2/source/testbed/alpha_test.c new file mode 100644 index 0000000000..17f6dc1f44 --- /dev/null +++ b/local/recipes/libs/lcms2/source/testbed/alpha_test.c @@ -0,0 +1,306 @@ + + +#include +#include +#include + +#include "lcms2_internal.h" + +/** +* Premultiplied alpha. This conversion generates irreversible information loss. +* +* 8 bits: +* prgb = rgb * (alpha/255) +* rgb = prgb * (255 / alpha) +* +* 16 bits: +* prgb = rgb * (alpha/65535) +* rgb = prgb * (65535/alpha) +* +*/ +uint8_t to_premul8_float(uint8_t rgb8, uint8_t a8) +{ + double alpha_factor, rgb; + + if (a8 == 0) return rgb8; + alpha_factor = (double) a8 / 255.0; + rgb = ((double) rgb8 * alpha_factor); + + return (uint8_t)round(rgb); +} + +uint8_t from_premul8_float(uint8_t rgb8, uint8_t a8) +{ + double alpha_factor, rgb; + + if (a8 == 0) return rgb8; + alpha_factor = 255.0 / (double)a8; + rgb = ((double)rgb8 * alpha_factor); + if (rgb > 255.0) rgb = 255.0; + return (uint8_t)round(rgb); +} + +uint16_t to_premul16_float(uint16_t rgb16, uint16_t a16) +{ + double alpha_factor, rgb; + + if (a16 == 0) return rgb16; + alpha_factor = (double)a16 / 65535.0; + rgb = ((double)rgb16 * alpha_factor); + return (uint16_t)round(rgb); +} + +uint16_t from_premul16_float(uint16_t rgb16, uint16_t a16) +{ + double alpha_factor, rgb; + + if (a16 == 0) return rgb16; + alpha_factor = 65535.0 / (double)a16; + rgb = ((double)rgb16 * alpha_factor); + if (rgb > 65535.0) rgb = 65535.0; + return (uint16_t)round(rgb); +} + + +/** +** Optimized versions +* +* alpha_factor goes 0..1.0 in 1.15 fixed point format +* (a16 / 0xffff) which equals to _cmsToFixedDomain() inline (15.16) +* +* rgb 16.0 fixed point x alpha factor 1.15 = (a*b + 0x8000) >> 15 +* +*/ +uint16_t to_premul16(uint16_t rgb16, uint16_t a16) +{ + uint32_t alpha_factor, rgb; + + if (a16 == 0) return rgb16; + alpha_factor = _cmsToFixedDomain(a16); + rgb = ((uint32_t) rgb16 * alpha_factor + 0x8000) >> 16; + + return (uint16_t)rgb; +} + +uint16_t from_premul16(uint16_t rgb16, uint16_t a16) +{ + uint32_t alpha_factor, rgb; + + if (a16 == 0) return rgb16; + alpha_factor = _cmsToFixedDomain(a16); + rgb = (((uint32_t) rgb16) << 16) / alpha_factor; + if (rgb > 0xffff) rgb = 0xffff; + + return (uint16_t)rgb; +} + + +uint8_t to_premul8(uint8_t rgb8, uint8_t a8) +{ + uint32_t alpha_factor, rgb; + + if (a8 == 0) return rgb8; + alpha_factor = _cmsToFixedDomain(FROM_8_TO_16(a8)); + rgb = ((uint32_t)rgb8 * alpha_factor + 0x8000) >> 16; + return (uint8_t)rgb; +} + + +uint8_t from_premul8(uint8_t rgb8, uint8_t a8) +{ + uint32_t alpha_factor, rgb; + + if (a8 == 0) return rgb8; + alpha_factor = _cmsToFixedDomain(FROM_8_TO_16(a8)); + rgb = (((uint32_t)rgb8) << 16) / alpha_factor; + if (rgb > 0xff) rgb = 0xff; + return (uint8_t)rgb; +} + + +static +void dif16to(void) +{ + int32_t gpremul, gpremul1; + int32_t max, max1, max2, a, g; + + printf("Premul TO diff\n"); + max = max1 = max2 = 0; + for (a = 0; a < 65536; a += 255) + for (g = 0; g < 65536; g++) + { + gpremul = to_premul16_float(g, a); + gpremul1 = to_premul16(g, a); + + if (gpremul != gpremul1) + { + int32_t dif = abs(gpremul - gpremul1); + if (dif > max) + { + max = dif; + max1 = gpremul; + max2 = gpremul1; + } + + } + } + + printf("Error max=%d on pre:%d pre1:%d\n", max, max1, max2); + +} + + +static +void dif16from(void) +{ + int32_t gpremul, gpremul1; + int32_t max, max1, max2, maxa, maxg, a, g; + + printf("Premul FROM diff\n"); + max = max1 = max2 = maxa = maxg = 0; + for (a = 0; a < 65536; a += 255) + for (g = 0; g < 65536; g++) + { + gpremul = from_premul16_float(g, a); + gpremul1 = from_premul16(g, a); + + if (gpremul != gpremul1) + { + int32_t dif = abs(gpremul - gpremul1); + if (dif > max) + { + max = dif; + max1 = gpremul; + max2 = gpremul1; + maxa = a; + maxg = g; + } + + } + } + + printf("Error max=%d on pre:%d pre1:%d (a:%d g:%d)\n", max, max1, max2, maxa, maxg); + + from_premul16_float(maxg, maxa); + from_premul16(maxg, maxa); +} + +static +void dif8to(void) +{ + int32_t gpremul, gpremul1; + int32_t max, max1, max2, a, g; + + printf("Premul TO8 diff\n"); + max = max1 = max2 = 0; + for (a = 0; a < 256; a++) + for (g = 0; g < 256; g++) + { + gpremul = to_premul8_float(g, a); + gpremul1 = to_premul8(g, a); + + if (gpremul != gpremul1) + { + int32_t dif = abs(gpremul - gpremul1); + if (dif > max) + { + max = dif; + max1 = gpremul; + max2 = gpremul1; + } + + } + } + + printf("Error max=%d on pre:%d pre1:%d\n", max, max1, max2); + +} + + +static +void dif8from(void) +{ + int32_t gpremul, gpremul1; + int32_t max, max1, max2, maxa, maxg, a, g; + + printf("Premul FROM8 diff\n"); + max = max1 = max2 = maxa = maxg = 0; + for (a = 0; a < 256; a++) + for (g = 0; g < 256; g++) + { + gpremul = from_premul8_float(g, a); + gpremul1 = from_premul8(g, a); + + if (gpremul != gpremul1) + { + int32_t dif = abs(gpremul - gpremul1); + if (dif > max) + { + max = dif; + max1 = gpremul; + max2 = gpremul1; + maxa = a; + maxg = g; + } + + } + } + + printf("Error max=%d on pre:%d pre1:%d (a:%d g:%d)\n", max, max1, max2, maxa, maxg); + + from_premul8_float(maxg, maxa); + from_premul8(maxg, maxa); +} + + + + + + +static +void toFixedDomain(void) +{ + int32_t g; + + for (g = 0; g < 65536; g++) + { + uint32_t a = _cmsToFixedDomain(g); + uint32_t b = (uint32_t)round(((double)g / 65535.0) * 65536.0); + + if (a != b) + printf("%d != %d\n", a, b); + } +} + +static +void fromFixedDomain(void) +{ + int32_t g; + + for (g = 0; g <= 65536; g++) + { + uint32_t a = _cmsFromFixedDomain(g); + uint32_t b = (uint32_t)round(((double)g / 65536.0) * 65535.0); + + if (a != b) + printf("%d != %d\n", a, b); + } +} + +// Check alpha +int main() +{ + toFixedDomain(); + fromFixedDomain(); + + dif8from(); + dif8to(); + + dif16from(); + dif16to(); + + + return 0; + + +} \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/testbed/bad.icc b/local/recipes/libs/lcms2/source/testbed/bad.icc new file mode 100644 index 0000000000..ddfa62291f --- /dev/null +++ b/local/recipes/libs/lcms2/source/testbed/bad.icc @@ -0,0 +1,21 @@ +SHELL = /bin/sh + +CFLAGS = -g -O4 -fomit-frame-pointer -Wall -I../include + +testcms.o: testcms.c + +testcms: testcms.o ../src/liblcms.a + $(CC) $(CFLAGS) testcms.o ../src/liblcms.a -o $@ -lm + +all: testcms test + +test: testcms + ./testcms + +install: + # Nothing to install + +clean: + -rm testcms.o testcms testcms.exe + + diff --git a/local/recipes/libs/lcms2/source/testbed/bad_mpe.icc b/local/recipes/libs/lcms2/source/testbed/bad_mpe.icc new file mode 100644 index 0000000000000000000000000000000000000000..5a86c6c87919d18b76bda5b31d5b653417f40233 GIT binary patch literal 300 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 aR)7n005~KAU@-weRW$&@0SA2q?*9XHvqWM5 literal 0 HcmV?d00001 diff --git a/local/recipes/libs/lcms2/source/testbed/ibm-t61.icc b/local/recipes/libs/lcms2/source/testbed/ibm-t61.icc new file mode 100755 index 0000000000000000000000000000000000000000..53b3505c66b57ca34182e0d56be6f2ed952ba92e GIT binary patch literal 25244 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 yit)D!SA|lcL})tyX84=0.53.0 +foreach icc : iccs + # fs.copyfile(icc) # DOES NOT WORK ON FEDORA 40 + configure_file(input : icc, output : icc, copy : true) +endforeach + +testcms = executable( + 'testcms', + testcms_srcs, + dependencies: [liblcms2_dep, m_dep], + c_args: cargs, +) + +test( + 'testcms', + testcms, + workdir: meson.current_build_dir(), + timeout: 600, +) diff --git a/local/recipes/libs/lcms2/source/testbed/new.icc b/local/recipes/libs/lcms2/source/testbed/new.icc new file mode 100644 index 0000000000000000000000000000000000000000..9ef11bd2a2966fc6ff55ecc3499ed66e6a944ec4 GIT binary patch literal 67268 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�vDR{ojH-S)@dBvB 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 JuL^%v{|AZN6C3~l literal 0 HcmV?d00001 diff --git a/local/recipes/libs/lcms2/source/testbed/test1.icc b/local/recipes/libs/lcms2/source/testbed/test1.icc new file mode 100755 index 0000000000000000000000000000000000000000..d0245c813cfb52a7260186c8a9ba5ae6b8160124 GIT binary patch literal 557536 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

      u~a{qX$F`z8IWheD5?Spm>*^|7jW2jia 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ëLe#YTVXVdMC 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

      {$&C5t9HT%M7t-T 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

      H}m2g5AtIjukvG^ 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�Zp|XL9G=?M@d^qXHlE5qo6J7UjeB|L%z*YD7IM(6*gN@{=gLKTx_SB zu+H~d-8~0)W0@BR?Sv<m?|E@CQ^{Z-!d?UC`iSKHiLR8SZqY4qUWipBl0e9~y9x z?K_9l^qwH=x=^j#(N8OG+ea^NL3MWhZoiu9-hjG_9%g-6FSov=C*)rN8Ad;%{K0Qf zX1NNgtv5iu!?tHl&L*R6&e*F*tmvn28S@SgT1W1?>@4p+=dS5GNy_Lz-dG!|w_E#t ziktS+OY8RemRIlft1L&)Y3UwTb#Wj2UjbRh^P$*cF;rTh9thMA(&VuIVT+^rjlEX5 zv%}kckK8c|-HSBz3^>a=&$}nLpC+cYqW%7sW0aicBecBwLp}vH2kC{C{fy$W1AZmN z2Lelr_A~z#kZb%sl$tF>9>@}Cv{^RQY`5`Nx0Utzp$&wiquc%V-7yaB9aQzS4W22i$`ycG^>%MEsYa6x^HeYv+X}sc=&~S;6Sa*S}szG^! z%5xM=`C0Fj(lgZ5;?uOW!c+A0{8PRe`jdYD3Me)D5_urspbW$}kK4?bT^?Az{rH`= z_WK`hA@)q{Vzk~j4{jW>3#%J;5!RyqhicUKP;r$QUwVa{P&D8nE4=I_&qqHu^q0I9 zITxwQtiOCznHT8)3aHxg2{f2|@}kw`hoK|uR-PDHvE#t_db^&*Kq7H!V1M>(|x&4_6za41{&t^bSnJ3o}y9Q)}0~co2eQdC9 z%$=>hhvTH(C2&*k5_u`3q!7(0IVAaxM`+R=&oI@9*S`Xq4c{K`-tyV$n?L?^@WIkm zy-(L}ZGXAdtPzatYrq0iJY$8=owg#kQa=^dgdB^5?XK#G<`Jwv@f7<g-W}NZTm#&0_ml$IF3oJ42g&Qe$+MN_LjUz`-_5MvZ)>_D^_`%u+m8bCRE_ zc_~xs(6p!OaP4GrM8@M}f$pJNsJpKgW!_awGViD(b+^>fbLPJq{!7p$ z19DydpZ6k{K!I#h5M;i7FT5jPY5e}b??w9mycdtu0v$RcJ9A7e&KyPW#cg#|<}i9M z<_d_>yQxC&X6D}-wt*gF33+Z9(BmnPOA3T+k1)`AMb4x#5?*MS%4ZsmW=g|Ld#VY| zm{jvK(e<X{a4NaJNpq=skTPZ8wa(TMYgHBkjO)Tnh(EiV{I*5qGO<`te-6wVolMjAAxzd)|z zYLq|Nf-(?hP>8&kLU-gr;8Fh|i3f!qqF05K_!qhU%Bf6t%Hs^4?tXfB&Ye_Y-c5A< zYijgsJV{-2NvSV7uPP`yos?gEGAXZQu0RaZkb*Sm9ajA(ckgV5dLW!o27&~|IA16x za-f7Pd{yQZ_pAv0deR4{+|T0aMl!;4htkFQS2ePtONyM5b4q>b=_GyWNwvQ8m^!!Y zh-U6UEYgtre>D_1Zbp0mrYHm9h-MEU4+2MrG6EaQ$q~~Pl$eQfM&kWqmS!Z6mob>l z&mGXl6`s?im7Gk@DLD2*)X zEs$2W>yvAmbG3CXIq7vR+1k3+?2OvhY+cP^49ds`V;R7NZK|3bpQ}XN?5fc(bSfoi-Z#dXG=! z`QyIIqx+Z{eI4Aq_9lL5Lv3VLRh6{1q(a?LQkvRWUYy!kS(IL1Rj93-Dd4aCne=JbjxtE>S*cDn* z*($0kZi=nbHz*r&YEv8YD^nYb%F>V?ZQWb}Int1c>Z}6fla|=7NBILosB$ugT8zVV zqdRuIjflU~<>hg`--~s2&{J~w5>2uDv|oD55vIQC0Jo%Q55F?EC#p81OV*Imk=mHi znA(_Ao7Rw5m0mYjAQ5TELK+HRXa8;1K?TZURHL5}^%$F{E$)tEokZ+VAKClTC?V*? zO%Kuj%T#&y8Ae+3QUBcPer8eWK2C*xPk2pcued&~C%z%MN8OOxo?f5Pq^+APphOz7 z&3}d>>))ZwdM)x{wxImMu9uA%^GEG&wzqb>s!5bhc9mUf)=NohLn zn^kitpr8!Zw*`CImDzhjYch5V>r#7T>(slGYE`>4<_xH|d;_^iL$M|5KR_NtHF`Jd zowiT4V0PZ^#5i0(;zT+-YU_98j!VeiA%di9z*E|Ko|fErl95q+)K6b=FrcUq>B!y3 zuE^ROQmO3|RHg2XtxWDqtePvJMjG-geu7eq-;f8g5_ur&UNt#w7;ken9_n*&K7Y%^ z>)1W3zw(rs`4*WfnH@lj*%{r4@IJ+~eBZ8xw{ zO#?(}{RK}|?OAF{%_+LJ9C?Ms$NaMMj|S%EqUSX0FeguUI4m#Yh)_RQK)dxTC^r28 zD$xC?wO;(H*>1`G4%^MwFKo3sd1sq@{{v%M?|n;F8`97;h>5JfN{Fw$-m#yR?CJC z?bvqe)}J;9A8g0(er)X1jx;phaR{rsi4oP@z(-eICC8T!c*=@V&0m1(ef(_+w}`{p3N{uAj~hF8Sl|*qWUv17X+kY^QtEGjp%n2^&VmLx-SJ zlszaMbqmpt;KQ=2wR1bzov&4wkO@GuF7w7j~rd=Z>B!Q!bR`rx>bg(v7Bgg7Zn7z|&1v_`7f|0QjOwFWV zVHpS3)-hmb69o=-5^%H^gR{K|TpWbp>L>t=V+3HG_~7mo4mjs9z|R?A|M?|EZT}IH z%$Gt2nqQQS*$LV1HjqWYf{yG3X`X(N?8AnnfG|)63qi$=1XXAZDEM)&lhNpzOh(V7&hh{C zOyaSSN%8_MdM4FWHYEFpLlR4bp2;Y5m}%@QWqABdqA=n0A;QmO(XvTtto(68y!>H; zOg@&7D8DOJ%12}>*<1h~(h!R@Xpn|1$90hFx&w0EtRV-7fo!5D=sf%&mBInFA0KHD zLlQUoRZ?jDOj5Y?rBWz=rjR5)NsLyE%j1;yWeLi=GP!a@rce$iCMkxbX>$TXkcN1q zA=P3jtQAW4!us)|wHQc5*L3Z>?TLan}* zn4unstPJEIi(Y#%ZqAU8Cm}C}4!It|kmVf?>4B2z zR8HJvN{IZChOc~(EJ_|tiqZ@x#iiU(DpRj1(ozQ!b5btG)}@|}t4li-SDQW;fWQ6= zkZ+%la@Mc2|7(yBvJLql=BOV9yPM)rSN zPT`K1`U*x1f@5yxgvhVzM9F`psM1a+X?4dGd07YLqc$A8F0pKk=jNJG;0A5hl&b>@8)nz@HO z2xlYY!`L7n#&xEWKzdq3_IXg_9W+ww8*;riDC$B*sQg5cSaVPxpV618%I?x?^{r|7 z`OT?C1hD0$MqhR zdks|In~ikd<(7b`Q*~VVq4EgLo}%cC&OCWeb52TLT~^ zSplUei&5^h9r-Y(FKgUwCmIPZ_gXyNZ+3W7FP)@tPaI@K?(bpByIOggrh1{Sx+*5O zv^=pOzcj5lr$k?(FVvUj=jW9aq8a@~`ohAw0MY9{hZMu_A@A?p{c@xM)&FQ-Otq`= zvpRRnhb;uVI~|@**Y|sRpS|kIIe5}X(sLj{*4)d{RCk2yN}43OdG*qQ%o=rZT6K15 zdWF7JSE?_~F3vB`Eh;FQ3lM`eq#_OZR*O*fe;M*&Q2p<;8TDZ7m~3=68S5aJ-`wNj zczFazIX+Bg_g$un+fMpPYY(y1rF%m%^gY7djE>j>O`Eb<*^*JJXw;V_*XT=AEAxxB zoIN+NgbOXJ(~N)j9Mi&b?6MRNh-kp?Z& z@H+cnigFN@$Rn(ET07O~`sY{&cI(hVjKzg}_AbYsU_JUC5QExoc}3J-rNx#0<)_L& z!%Wki;AX0i@^j^fA`4;<%8MlZsYQZ=`9+bt3kzdA=LX2ueFi$iZ=u+H0rEgl{crdC zt9qvuk6T>+7}@P?cyZXw=EQwlxBZWuy}KUbgPKM>!>eylqf0L{1jxZ z>S%b5?1)4kcQ_$0>PT{)=txc;|8U8ifW&p5LiUbtpu}uG>H}E_wRVf2H97t|*6FzJ z#%WWdQ==vh2gj`lJrfQ-E%&jkx)D-%GPCcY%IZhd2eROCtKE{}1Lhmg+}dh-_<@o0 zo(W5G8`|@(A9D?^8o`H`4|#}7u2Ez22I$hPOMVLNg}@}uxnOnDS)N95HatakR-BS> zHbE0}Mv*!fK(p>+DBAf2RG58@W?_8uyxHc5(O&cA=Z4mAIXbr0V()~JYsZv@M+3_K zSKW7Em7_TWCBtMv!Jt=U4%*+>U8TpT4fsjbmjmUhODsj=MUGPXSC}g9FOe$tVzhED zfOg%7CpN{JNlpFM@r0eLIt!n|X@~h0agsbfM*ef9k(O39$0&>>A4;4lq zK)u=fPg_ktA3C*a;faxze;j!9r(yTA?baUq$N;{%c&5(5S32z6`0!=ft7PM*tn&?v?pk$oykehF`kMkcZ&Qe-dj3Jq{UB?ePW+@ z(4!~37*P}649R1fujmooPw>dse=b1XCWEQ=&2OE(@x@1n?*II4@6__eZ8PgvH^8<{ zm9T4PKA4#4z}#8`mi8*Jb&`XFs}!8Eap39}^9t)8J>!mxoWbKIFNp-v3ldTI!h~ zcDq8s-iQZ|#$0eR=75U{8(d9-0c*+vH&Z6y%z^-KJ{N$t<`W3n^bN%9TnI|b<&c81 zz3G@;pvBujD#;a+JV~IWQ$Zf+3kmE%hz$*f=m-u(ig_T84gq08C5 z7NH5Bj7STgh|q?O3o^qV2(m-p#D6vXXN~?>tONazPaq6E4{_*uNJ7s;8p@kzV0S?V z-Wt-;^PoY`LlSx(6aju9V+TQeC>vtcoX1{ zGzd0+{dXTm3hLv`L>jU&J0Q#53Ni^Upd}MQ?L~zoKYviMf+3N|11UcY;=~aU9V3{D zl!>M!O7VnPEq*9Y6WW@K$G$f*RNVEJMvYpnW ztd=3wbgP*@vzHLN{qAhbLBO+XORAVC^lXaBWG!|RzC`oD8A7RV2BLYWu>WO#am z+Q%RHFu^lP+|cK$(1@prLeb-dXvui2JnDXwCi;#<7c(p_h#3@BL|+p%Mqdu^j5!~^ zJN9gNZ`_*z7Sa%jG`!Bd>(E@U*RvpA`yhE(GtlE4A(x0lnHUOaseUgtLBUgMPUu8( zsNkVWAh{=xj=B@4h`AM|jU5z~#9b9M#$Ar+j5{CE8+TgJlW<(vEj>C1Ab8cs5REjv z&YNdiEkPax@gL*L3TExQ+86=B|9eWk{yT7-v2DuUIRIRwAr5Is+4&>npp0|DYahgU6Y^npAs@yX_2jrb zFCh~jmwC~~ihKia>4Uk~bYa4aDY4O~Rmy~8^7O=m33_k3{#miEH<77D*_n?yEHB#y8 zd%c*+{YxJ%Jed(0b2wEd+n=ma?p9?dcP19ATjjMW&4~?&Mop8VQPZesQa8*22wC|t zNH=^5={x5`9;$H)(LBmxr$3PoV~FN)m_4f?*gdKyVMc4bNkg@C-%FK2+*8FNqC>f& z*u9x?^6qq%sx2i$-KZ%@txc{t z%ysLl3U}klDuVU>da~2425;Qe78>JBV*vMX1xM6Z6cO8%7cFnjPE4xPrKVJBbJI%G z%e2L5HQJK2T5V}+ZF*^HU0P{sed?Ql@Rc8d9BIhd`2)(`qrQ7PwEvI1(sI|$)0J*J zAJyW`Mw`esgKb{8i~A__#8&IbT!)ijN0@9ZC%=%06x-?h%{uPIdg@t>wnaXQRegqn#ZvLorAIMK?C0Cb{pCJ z>RyuD=_8lvo9J#9h4mU>=nO_d4{q6y)pD@+vd6xmB6EoN8TG zc8xYWt2X^jK*WlVK)K-y$lCQi(tzrJyCuknS@o*Qb=^dr+oroM_^m@dM6-)mvDjm0 z$h5vgGbo z+BX40q(Ox==bXzylg-Z zkguS;j}?>O9U{+c7bT~*#HXqnlQX3CS(!1lC0Vgmm08mADx{}6LseX(eG?!?8j?4B z4*FfF{R+}SPL0_c?SJI#)bRl4Sv%qpSUgAz%Np>H)SM4a zNIV^;h&d6d79EwRh8<4Rat`KaF#D@Bc)c}RetWG}*j$_bCLntGhmf}6Qz$e+^}p43 zXddYN=k<<1jop8e))I3dAebSP<=fpMmE5e zMO}_J)s9AIPW31Nr<#z0GI$+O597 zban006Qf)H-2ZsjuCC|iwhc3OZspINJqssrj9gUb>PD%&l-mrx;%0y-VUQISeVrF0 zz7`P|aWyJF?5ZrDcU2P~d?h;}aG*f?CP209J;>Yi0h)#J5!70KIMHnR+08>+emr%1 z&GP>7&6|3j?L;#O%}P%tXxO_s`w<>FdK|zyGpla@}gw1F^LM zc9~X!g>4Dgy5`I{;Iz}OWDTnORg(moe1gnKc7Oip3o-{`{j6wr!~fW1|wV zu*v~zhcvKrO$H}7#S8{7d*O}-o)J7^o{_zxro1TPr{3PeNgrCo6NXRN6MuThL=b~J z5zJse=K8(~C|zOz4ciQE_W$4!#v(8>%mP!BRFpkX zf{m>V>>c94**OL$_=@Nr@yY`YV)w#_zVs%9y!0V*Uoc4QX@3%HI*|M( zpzbGw@vhYdCvSZ`Z{OqjpL9+y{jLetEUH2tL;-AFs{_MLYB1WK2&TK@z|tfdY|JHK zZz%*Ps|awl2?wlg7`WSo0N$PpLf+`uEE~(?;5nveELo;{P1BBEc_x1 zmVB>)6+g*g&Ego?uv7$FR)oX$RUxqJ4-S~D4F>adOt4%Z1lE5Bfb9lDatODOBtP;lK;0ngW;9B~F;JR4>^2!e& zXzgbpKpNtZ28HDcNJ73?GSZ+#8l)sgh@)X4I)DgbwkHU}y&+ue1EH}D;K_Y~lk5ka zRDWP+_)oL5{hzY){U?G;{Kwf9e)rk6es|f;zN4&mzu5qf6(0Z#X%KDx4y3ylAunbH zXi&d-3d&-r-7P>#bOb5Y4dVPs5EbkN;xHNrL=51^_(7=5A9zUtz)cIB=41vw<>&(+ zvx@^Cuqy-aaq0p_InDmJSiOP6tiD+RFQkFJ=2MU$4RWO6wHK3yG^8UBA`NE&YN7)q zQrtl5M}jyO1)@TIKrHkHLA3uXzBKS|idgqKmCR92J#&QH8Z^w_ z&Abt`pLIR3KX^948-0i2A`Q`-zXipvg^-H8nAce?9cDY|aOTL9vPT{z78DE;$e7*` z8$zFnitwKnM+H6;NSTx2Nvw&`jNox@A^RS;l0Cv{3?Alo1`o3Pg0C_A*_VQjaW4j) zoE4y5uWpnTFD!Id)R_-8oH|HvQKj#wbDDNEWc*v>XW1%P6$HHa<=tx5t z(h!flIW^Mo+6T#TS_8S5Ey#y4LAe}Tl*@5_rJ)j^CkJ{zQF0j%W#NHiv5~=dB4wOg zf;8S>SYgO@ZbRrma8KA@tYcwkIq16Fqv1z+NBD<$ha(P#%nmSqe;@crgA{2<*@fm& zp#4R?GwKh*pgBtJMktqK{VJR6{49e)m`Dkr+*flLcT{0PHxnY+*CUl70})wa7eY(< zXF}>DPV%}1$9RVXhe8ht4ul;P?hQXE+{5n|?S2E`xAc7wto{V#o4$rL)Nh_+gYqCw zs4oVy5%S%4Kt93Zc^=tuBG=0u&1LnxoyMULs>6Z?q;cHy(aB+_B)W)W!UEx;h$``Z zeygM}e7~euuwT+G+%M@ww2Ssj+TH;8BMl;?L4h=AQNOv~7G*J<&^ZjQ=p07(?Jo-n zrcVmVcK3@sF(Y}tq#K#R^h+sx<{4!S@0d)%KNy!L+8doK>5VLl>XbA@w~2dWS|okZ z&5?c4jZuBk4T$Z}4MbpC+rTGSV`WvT>kG+s)wx>Mol zG+06>Udm(APwB!~M^Ysr`;(-C-bA&eQ<@pw5?>VC5LXjd8`}|A9orjM9k)BKDsFdd z<=^ZV%=)X|cjKwKB3XDLtk}kr!W)Sdma7Z;=+ux~0YP?u24_PkgbwH@;Zb z8#f!kL>i)y2KB}-A=?Cb5OxdEOpYaJHtMS9Wp3-yS)^O<)Dd@GZz9{BZ=w*6Rr%5P z6|-60dVXk2R+O+#E03y7ONlGhLW0c(#KWUm7@)~KW=p5ww*hIu{pAbjN8-hLu+dYWY$%2L(5AA zqQat>=$w2-e1<+BBa%E=ctN`!VcR`9YXg7TZ1r}eU zewgo}+;PEVwadc0jhID)yD`6A7_!=Y__C8_?@7E{^C60NRUad$u!|Xz-5MfHZxlr* z)y2ijs*~igm6=LOd5KC;)~FH{x2mEF+Z3^R9f@)J4*6_A=;C)lzVbuRZT=LBEWdr$4O`9^TqFo^#h}JUBf5aF|$f z0Bxr1lO=HXq{^AS`HB8L)e67P_Qas(jzmsfr<_~UDVq%t{4x)cSG*6o+de|GFi{VJ z?Pn8p_MhHvxBc?sjZHrtA2s@Y-y`ewZ4(YgRSz(Z1$T)=-7N||X^_E;zsd{|UkVX~ zofk=h&m_bIoYKV8Pw1uI$Eu{BM>?g{{oM(^-Q5X(owEayMe`tK#e0yy{R4C!$cHmE zHXq(^via!7VZ(1u-QKvU|KZM+-A^qxHN3DlE_v>1r+-Rt&zSI{s2=+G#f}983r0C1 zyj%Q;pqtSm-$7+0^@c9m<9cZ{{#r{k{$gJ=`S_j~&m*$~F$>=T?aFtdc;|a)9>;r= z^;Yw4bsK$hW@zR2hwpFvb@$|sHLWkrwpD|TSphgXWCPAE9cAfNlT=zf+EbT22x9W@ zaXH*O5urgN(cyl#6%jtSv=QF73L`vj*GAxmcMIKb^vw#$etH|SR=oq|#_vFl`P*YH zChwlVw&?StcUS({H?d)9`wPSMbzo{(2G$mOaB$E87OQzdAS$LjDe+HeK9P@o{RHDd zfuRq$O!gQ*IOtv^+y9=7!?>5iq20@2Q|^^>Jnz_fS#z95leo_l#prfA-RNncvn zL?E5}nC;7Y6y_f|E(-7)j}4%YD*~zG=>gv3nX>|E^9`VQl>yZ5G#Ksv^X-$v-+y>u z{I_qqp08fm44YO|!;U{o(K_USrD-bISgXL%K?)d`SioT;Uy*RamtF+^3o0q}Im3hd zEWj&xibV-}%JcSr%BM0W#WdPvJdHXjn-$3U-TEi<9GTW{P=Otv!&lQ zqx!!VHZL!Q9qV(zXlp8%?NWf1SpwKw#elP|1hDo(z@c6TqH`#Cx^lrA%LX4e<|{w< zz?ndt|4cBR@sdZNy^J7IUkYahO1?38-u{ijxicRc92)y#UhmY;pR~ZTZ);)Q!eZF? zdlqc{BL#MBNJQC#I56K43D!nJus7j@vsoBmEO_8<#Q}nKFpzDS;AI;KR6Bp5+xvo_ z104b#sSxbs4V+n-YW&dP^!|4Z4qbfTVE5B+-)(_KpHw0bq5xJc(80Q2lVQ_x8Ejh} z4LjF~z+@vIEH;ON%~mehZ)by(Aq!k~1Oawu0N{4{0l~-@$i{T=GNFODDHVLoDBx%2 z1^(uCQo(%_1@N1^fV9~IJhqU4g7Drt8%Orf zGw3<}jzP^;1B1fp_uk2bFW*mwA3l*H9g(o~y9ii0p9gDyV!?(*0kCDUFBtwxhh0l( zV6v17X1`Ow;&(5wUgiO|%gJEBoCHoQ2;j03515rWa9`zy%mp_ftey>UUHv`~SAPh8 ze|`a6lZzQ(SUvF)rx&i>BLM?c4MAU4!F+7{|XJ5Rqq37)rSy()*%F~g8;3A7_EZ{ z?f*w$w?mkR3GnEazz(tnW{4vM2%W(<))nZ97@(=K;GKa5irx(R(QTU2 z<~HTsjeX+XhkfLI2s0bthBSC04M8Yh9JcKT5F0OsDC9{+q1s!7>fQ*F355Ar0WZ)F zf_Y95ByfR%Xbkwt+<=kn4nA6UpyuJgyBJZ4oAIv0J*T$do>IGT6VyHKvj+kO(2451z`d9z~wkYa0CXJ zQEm_*#eshk9vJC(@X-^1R!W$mRTG}m8VQrM4#FeaZo)&K1NbqYqqtG(3Bqgu9({M9 zq3A-Z4Xa0E}PZ?F7 z6Z96(2lO7#dyIaM5#OWaVV@HogS0bVSE&~%SE-l&5%55@zaP>NzV`FKXFA z)&Clt5hzHOkU(>I5fg}+67%pA0wHNUJl69*Pf5AU&Y+Gki>S8(8fZiQz0~WzN2phP z&r>fjuK1ksy+S|XH^4aJf7y37!29?2fcg6eAVL~sNQ2twCp5=-31m2}Mj53|D6_T` zQb-oh6TR)9Bm`g{#&GfXBm(k?AeJ&5nnWGsWcgfUl`<{|*85)Y-|c(W@3`M7bj@Rd zm;4R|Ui3c@^jE-M=7qr70P52BAQ<@|k;n&8Z2ksPjTfL9slP&&^GcMTo=VtFNdq?7kJrzXE?$ zUiLX=H|H#?;|+ihs(CrcgNQ~NRH)B7-30Z6*e*tWT4-LZ+q##z_^nTJNXGYdp4KC& zzRrUxHhv%>!s~ogoX;td%I|1|Ht=A09&>+aMev@GW_Ay+kKM^V&29@h&29-j&1nif z#c2#X&1skgU?2@VP`A%Dj&b;VLoZ+ojgyA8<}*c zODQb;8D%)-m^6xUFjgM0H!_9QE6!$j3X8d|5p}#Kes@S6|7b{U#EFm^M3vw~NTuKe zZ#KXe)x4odLp;g{X||yKf0VP%bNCtcCjIuJ&~4@8LfrbhMZ|4G#U7@Y^JtEzb%FRJ zDIt{oDv@umJU*y1At|^eHiO#`T@YFmSrt|xX$vnE_lK8Aj=m!?im=Nbl;HljT~63|wUTIZwuIt%RPT@9r{j3{q(=C* zB}X$Gm5H1hd1^?7G&j5?zAU03wn?Cm-7CnAJrt1}dpJTLdxWo#IT}725P)i4KGGmx zjcV_$pF^(2H)uZV{8vRT3nxmjzuhf&UolvXUw^R?Yka)Y!{IaRARF-gjiwgKGy*`?!%a(_y zW~K_0wR&-4T1BKZwJkC}WnZLBvtJ@t_lp$C2Zgf%!KmhyARWnnd;nS7KS6y#pQHIK zUrkgve|x9a<-2PgPCuPJY5vE-1CBeodvLZ*tzK?b4ZdE*)hyrK@-S9LiG-&qOyDc? z)Iw=)wj?IIG)j`$93|52jf&Lni;PJ>AdXAz7tIE+k%lOwL4!2p7=DcAaeg{e=J5H$ zDyJ`oo1DJ9e8P0W@e8J_`i|QhwjOY^uIcr_mUPfP_02(yjCvkZT`lA#R>X$Km8yi1 z#X5le)ia8cbIgLI^>c^~vUK7?yA^1>chTN*#VY+bYEz&uvZci(k0~w zcccgd+VaGVmMRIYsY~Khe?aV4bwC_c)-OT`{|Vs#{0_(#y#uJUKF~je>ADS(xyKB9nc-Yw_>jut2GvJAnU7&kKoe5$fqdbUrOvq*) zjt}uYs1Bzd$Psv=LzGB;9YSL7A%SQ6Apy1VP{eG22-W_|MQ@`Xh_|8C^zEr?%eQa0 zn7(uF`mY}zxx4nuJ&(67XnktBwCaiNI{moQPVJbxjdGOi8he{Y6y6N*<_&UugRVsc zGOol1Q!XcQNq=RB;LeqYV$QUOx|}*1iamTh6yJ9&Y&IYY)&81AsQzE~7V1SYcvx?0 zaOLE$^Nx=!`FP)>wcm6+-@35=mC1_I8S4!>FC2HIJ$JWIJS92AJn_Z~9{ZAbkC>F8 zhoL_72NGYeF?j&to;JvBw20|)yMgI+YcJFB`U$4fxii7D0SVu~1?fK1tzx zTb-K>PTlY4D(N zo59(EkKQ^sw%~)_r^~)*dA07x8rb?<2^g);26MFkZ@ohXj;1JgU?l>AT{w6;ae?N_ z0zbEa85WNIGK4^RAtI5d6Ug{!wTIjD91qv&3bNCSE|SxW?tcW*zBPct?+vCJ7aII^ z>O+GgcRzo7_vFG4+h&%3RR`-Al)}~}Ik01O3K(yYgT=O3)Ng=hE|{WT2Mg5WV9f?k zJ0{Q^{K40W0YNTQ;JSLE;)n>*SRBaFpt=;)oSZi+knwb~JrlrxaeWd`5)`WridM;RR3Yka_QEfrkXQ^4&{Prz>=19>A6 zyf)#0w#f~AH)9}h3o6dGI?ck#?zav0ADm~+TDe%N+9DmE8;-Y~;){udL>WRTyaq!{0BBUb}=?I2jKKF;; zzof&eZz!<#I}h0KJqfn_K!EM@aj^48H!xm+1+$-A!Qv+uu>RQz>=rtJ<3f9IS!4^? zMK*x@#R^D^X9Mh3zlS`C4}h@dBkcZ4jDY6llL30^HYvpXWxP`)&pAU_u_<`On*lM&9Pk+y;Ff0zm~u;S zZL$QHZuGeial~>4bH;KSbJ=1Fd)4BJ`wjEQ?nD0wIIVmS@UJ}x^nEfAY2X;n2cGF- z;Mpt(j>}pICT)Ts+IH{{+y(Ry6QGIAfD&f`9!g6frdt7CZw2mU)_`ra223xa-+Bgn z-1<58ywy|p0jmkzHOq1QpyfmCkkvl{E@2}!mncEqgN!&%7 zNBAq&4+%G{#@q*OM%`}O{u6**{vME#2f;vI3$an~ zLAzV-!wxsyZ#(`I;EwW>uj_w*l&cLvo|I_Y_s9=g1kqN%LnNyI1*rB8_cR0^!x-2s z3kV9ge&ru&`;sBEe@@dlOnGNJPI{I&KJjRDd`#NoI8Hp}I7YnWFiN~`e~U2WIEcUH zd=)?HatVLe^`8Jd(m+M^e-O&m@{t!4wGCx+j2A*Y@*v{TJcwwt|1TsN0^i4ECWL7* z%?`Dh3X<4A@s~P2VrZNm`eZxbr-Ufi#Le zLmqWI=`rg5PXGyB-v`zIY~+K8P(~?k+qWPy{s|IMFGixnDv)9}Kooxa3o+IBDL>Hi zaY%^mL$=uA9y7uDPJqVcwr{rUO?oM2kXDbq=G}!I@H&FM=y?r$&hw7jNv}J&qm(=N zL*65V1Jn`XKLH*~-v!^-wKwuXB2hj_y6qcKnk;~1t6w46VFjpM*H6oE+n&UD89fyH zTioUIY;T8%9EaEmF4u!J*ee0q?iYPa@aO1tgwsBqgcGzw#ACF}#6vzK#QpSJq&~(l zxtB5Q(e3-sfY*|D|E_z(kOvX77Wp9CzD9Fe=R+#W|ED=Fdy$G+`$Ub~{6Oxp>rR}n z`H+NTdzCMAz7!IVJ;zDLonq;T$C(A>!-16^{Q)hW`~3HM?eRO~)#HEDvom1Ot37a# z(t>CXy77;IH>$gXUe~>^>;JW%K+?7^(R|YH(V00vztTA^d8)&#exSu|7}1ao2NiU) z%W*8bvl71R2|={`k?=%fe`u=5US5vZZceFpS8zSGoz+8YVI8M6vaZqUgRjwQ5jE^< zwCY&^D!M)k)mcJxKV+!STC@ENG?x?2L9|^ko#VXtQI6a4(H#8RK^<}HB@NZ=bYh_W z(fANdf3z6iCr%*u2$Lxt5jtv1c!5ttXceP2q}{iQchI+jH^3+h8DNwmO5OnY{5tRN zdQXfrB(6jI|Jy%9KFHUQYyZP!9%kWKzWb8leEg~bJ$~z%42szijlcbVB?r?hjUaTy z#dtPHE2#C7Gf5~q)fU$Vq-}PP;dM;F` z*E=26-r43~zRY+0?ok0|!JQ(vU#^$9tvFwd-Eu6~!*qWJ!@ehlg>6d;BQ_>Rdeum! zwDLIh|Do$I!>VAq_kVcyrn^JBySv$&X4Bo>ol=t0jiexo2qJ=k9oXHiw|d!nS=eHu z>%X{u&x_})czAq{&AVC549Iz|b7m6PE*(f2t{hEUSuvG9P<|kzuj~?XJ-x5&MjDd3 zyzJ&*fh5$LdGneRYiQSF$NLAkVU;7_w>92EuSb2wo~-keyuHy~?c#bLlM`#g=m%ED zyX{<_?myL?A3E7l8a>up6F=P4n!K{1FRj0BIHR{_LuP07bXLdGb6Fi#S2H`Ru4OE% zx}LtQ@n5;y2Ns6S}syIC`k7Dq%%OQ%Y}JcY0^bs?4^giR|WvT{#W)r*j(WE@wB^ zUCC;$y_VTrb1ma4X>GKRcX7FHYMlAK&g_ zIK45*cI$W)V{#EK>BgB{xgY&LF+a9ul*;5#&y9@;;WAKf)nn$R{_liD!QmQl03Kf9uLG6FE^WW5o$|qf1k&hMO}=hkCOMR}Saq zt=N>GJ#a8TYx#w|+}=yMi@Psp7j|9A`WujqHI!owt%_9W*JFY;HcTJJU74P2c4oTy zj}r5ln|cBVE?LQKJL9Y~am?Ft_&|tL|K4b?&K*fX&0Dh~Yd06fRcxq8E?(b|p1-au zJ8SJwZraF(yyP|e@)CzH=B2K>l#{XIa&}h#m8`!3c{u)3NeXl*QeaSz`fIH%_4R}^ z<^Enva`~Y$)3FD-e7kR3NN>FAs5x@p(`?{Wpnd1DNRQ@22>~_x(!$oj> zx|vR{-xa2ud9K28;JG2s)+ZK{>+ajD4c>M)?z-krYrYuHs5uwsQ+7HvxZp%?WcJaL zxYWbdNeKtrQls||q=)Zaml?c!S7zYOGnql#u4RO6x|R_!`FEg1oC1xgyZhu&|7(-? zla}P(K}~Z0Uoq;Dx2kNr-x=|4dTk@N=B0yj-%~gJwnu(ewf93EOYg*ZEWVZOmw7!q zB;{&RMBL@7n8=GQ2_fhEll;$&CHtJ(k>Yvcbc*NETgkrrZl(C|zWG<6LX-k+m_Jw{ zMShH{lIPp>$d#KM4B!L;I+QO-Fp z5;1|g_qQ8^Twm`Ea-KOK==khzh~vWt zp??FKQTq=Fler0ga&15A|BGzo@CO0P?jLe&n?aLz42(nv!Ca;jY*iY-LAwgv3`@Yr zEDwULGa-VW0&xy;km4K(Ij+G_;^vEg0D3^Drwaxkoqlcca{PJJ)8WSr54*2-y#5As z@uLUAOK$97Cg+Z^k|WpH$nGB^)G3f>9|H}(m7piq1tv00V5yAvFKCv4vtB-Up!WAO zO@&~K1c3_f}Lh2xag#Ur+y;%VcuXq zXAo{04zcDTkYwQx8CKqqZ|w$UHqKCIYmW^w8Vu6#VXnXOe4Iiq@1l|uM^S%YW+s#O zn8+~jV+KKjy#o|@>p@Mp0(2G?f}wOa`eSLBJ4gb1)p&4Gj{y(ONbu1Lhd`YW2-OXQ zD1ASOH}Hm3LpR7aa)Cl)2MmwXq0Ynx+D!k()vbh_KEOowpJ5`KZcxb3Lqd9hlc@!S z*=j(FdkHA;=VKk2pd+3PhLZ7ME*%5bvXNjX9|leeA;3@!0#9Xs@Ky0evEl_`Y90`+ z&VU3BCrHzGT%YmDv5JcFsL5eFC z6!_vnO&}Vyg~Gu=Bm_*wg1}PTA8Z%-f}MmnI7xZ}L&_aIq#58N;{t&)ju0wq4^eV7 zh?ld56nRT*Qv8jh2bsu@GlYy?C8Q6tAPr9mDfvt&*+8YH0vB^U2(w0kBzq{xaR!14 zw=Zb$c!MslCm8U#g9$$a%mrM)O27$df{tJ>WDm|lbZ`^41uqdB@Ds6wAW?G&7d3?_ zvA+S1+ARNh5Z>532r%G+Fbe^Qz}{XY=4vAXlprih4MLK&ATUQ4d`tAetJ(nETMfar z#|WHP8G++EBXF292D@ovpq(}b+dIfpBcRO~0sXZR*uOIbhYyB7on{UG1~_Z6{O3W; zdoe-!To8%(I7ef?IGP~~(f&#h8KDm0iP{j7r3V2;2H?BY5WJd=z`ffT7=y;(vepEg zHk*LMUK6lCWdihnkY^@fH)9MAuZ_X+ozYL{4@TdeXAQqQe_9Z5(Pa70g9yO$D53bb zeGK*&<7~wt&P5h2SY?O_SBJ<1Z3xTMgWv)~2&gmypGITw>NElO6{f%#H3ip=rr^BC z3>;6Ifx|6Ruzzj}4lhl?>9xt6%R7^At{;rQIL#V=cA7O=2w-4l&=)<3`7B0+F4upa zR1%(XPQ)|LiQdW(AF2T{aXJv0t`A|0jUc$(1pMnw!MDQJME^}}> zZVt{j&B5uZ`7h@gvmdT+%)T<-nSOHlX!^nVquG1sS@VSe4|SIRJcxN8Bxc?Z`p=UR zhcri7NbyvL~YrzN-_v;4`p zYB|SvWbw^y#^N*Mt@%gB2lKbCA1z+F%v#O-1@Ka1fgsfXk@Hy$^n)_c56ZR{gKP&G z$Z%JN^gsCa`43tD@Lg~H&1bvy7q7$CpS&(u z&wAar`r!WD>aE9n%Nh3%*3aE$Z5}f|(;of>@Kt4jP}Ki1*!xexd~puutQT8}L4mzA zsp8>i*1%Gy0a6ZvHuGvDJt83Y&K^jkMR1UG$moLAw`WV|LF%H`_f4 z-edPD=mh;i;0^jc|7Ui$d_Ou|^ZVp<$^Vn{xqweDXa52O;rP+0y_2!uoQv6<5(8eS zun>kS^dKtn4uUdIwI79nx}Wo7j6P(in!irZw|<#iPJ5QnVD}_;nf=4)6%O~KMjh{j zZ*;m9y4U$e$SLQmA-9|_g*d=FzbC&&43T=Wk2(@{s{%moU{?z2I^rp^N^LbU6{-e@FvpWS@HaBvL?XP4mb-s|^%s7+U z?Qt@BrRTAvG4I0(Q$7dc_xVi6pYz=vf8S?E+#BDm@vr@+5?=dlN_g%6Hy{GXPe#p| ziaZQ~BkLW4ZMn zhqBwf_h&Bm-IG4-zcXzzU|Z_0z^RlIfg4k92TrEE3|xN$h2>oAjd|FU8yKfx4F)qs`7%r_hd9QuMP58#Jqx|_5KHA56LQVH~#L;#(r#WwF$n)4xv&46N zX-(j0MQh0Fvfl8OrK=}(2Ui4}?&^)9O)X1to@mSQ zSld+OJ6vBCw6eA-w7g=!?_31h~_4W>9rt|ys`3~>2mfSVv zqPA($*KllIsP*cRSf~D>RFCe#9KW{y;^3yfs_@#L=IF|hlt+`+d7NI zJp1-rN^ITbq_Tdix54nnV5@IJ1wqxTD#FVL8={K`y5jPeuS&@7 zolMH;o=!^Zx|o!{>`r1<``!4Q)_ZZee*rRa9ZKi5H}>7T<;jm#8f0c%pWNA{NiLk1 zq#Qo2#kKR8x%h^I4oV|?J@i)W2(;+l5^3MMDS=TxneJURo*!5`RvK0?QX7@CrXx0E z^b)DE+I=rBwQFG@2gk1vC(t5=`d@~8TBA&!Y*r>$ z&vB5G*Tg8(m(@9@&Y6geoun(QJnE+1bI{+kbvlezzbnqAa(k+0$(9`d{LRH7SsSY( zQYTxZ6V~^~#jG1kh+MlPA#C(?LfD$S@sUIK;$jBx$HlI=AG;8ckJ*E2)ZHEEL9CD@ zZ^k9b{|<4GbC=l3!FwWP`yCaw^*0QKhA!L6_MUgqXglp=RDUAGy5eYzWAUM6x4ivX z-Wk({0m*wRL*jNdM?~)EiwfN~8WT9RE!J<-$yncw_hSOqKZprl`yeJ{^g;AOKoR!+ z>oI@OElz$6i;`R0*~rCXY~!DfvIKVLXVT486{dii!-89GOfAU;IZnbbR@J)a+3UVxi zpuyD%27--XzNi9hWs80}E9d_7(n$XqsGBqwZWuckXAuD}u zdgzXyNA2uC?V#IzJVvK|xIwpiKVxtC?v2AjKqn`8F~USHZ=sTt2bjt9S!S~777G~x z0m=%HVeJA{?k3O`tO65p^dF>i!CoO97%Iu&tq})-+UPy#g+iP`0HhdsLyidpmYCt; zcyl`RT3ExFr4>GOVgaWt&Eb)SIsCgIKL(k}wGD)v*~3H*;v8(ja}XojgEl8)dnh0S$!kNi zycV=A$jRM=>^n>)o6Zrk>KY;K_i%jlAQsONN;41iXaaWNC`bc_kPUbVS%SZ?DTIj_L5!$AB#Y`mrkExaAVmvua6gr7 zIf)+3Mf6}W3sQq#P{9jA(!LWC3lvHi))4@_OkN<&%m4{yXZ%@l03}vCP-mloHoFbz zvs;5Phb5SEnu9f`DcErtgEJSJ6x?W7aBD#jj|N2Ws6rgCD#R}c(9r{NLJz`Kn-$!! zm*j5B1>Q7%@L`C8kG}+XMaqDCvOKutD1ze>C9tbi2HQ3juU~bRlu%Q6=*$bV6#dMtk$W44se%b$ZU4VI{@>?(P5&1MO=fUK4`MzK;;q9DzD8USXe|Iic%N0EuOtM7$%1c! z0(fOAgIkdbxKycuW3w9AcdG+^P#tX7YJkmV4Y1m)0hXsUz~UP6NFB^yBVVwtUswyM z{xk*E@1~%(5a6i64DRSb%x5wD&<_ekofT>&0AY@zcnnSwfh0 z)WNk;1DrcG!Erzn>_;?#zEKlsyEVb~m?qdQ|99wY{Py$R<0kU$rOIEEy|`pZF7q%wpjp+A?S0Rbgi;9H~p)4NsY zhi9+uH}@gkFN|^B&#qf^XI=N{esnpd``-DQ&RfUFI*u54CXr>7H^wQ-YPhCB~|MicQykAGKKb zO?ZX=Oh}`_i=a-!XMrn>o&<~-J@VgR^uTwg(LJA|Mt8if8r}5z*XWwZJJZYV-_0+$ zfyEhjusrDjRto`sIDR;4?>HnCJ((Qbmjy;VP>6TE7ubu><+{my&J0j`pBAP5Dk(+# zd3>JUztLre4_*U}`PG0O7MBB#SX}VGY;o5Au?3zCvpVkk z-TJUE*dFi$+kO5(TL=hLU_$N91WDNM&B7WAFt4=)?^!Fe5cpX}7yVS?BK0=kN8v?I zxZ0D9B<=etIr{%3lo;QLtuebA(`s=ss>kYl=8JC{;nc`B*F=6FH}?Qr~Zy905<_WNQc9ri@;ble$r z+;LmfO~ujQc~Q zjlhcr2eF5>?$Wm^168h+MC+U@NHIE@n`?0-tHk<1Mm2ppt=WE8YPaL|rkkK5@&w_9AKF4y_0oT&=eIaZcve4sefa!)~l?T)+(`z<;3PMfkiTqZO78RHpi z+}EaU^jMQR?KzZk&U0nTBaaoyA3O(AK6vz}eEcgAiDRdr-pj|&GOVFi1vB3|EFYH{ zvpw&z;JVjq&40DiLGnzixAM`3P@VnNamKqU(k!=@=Fv75FL793SnV>lxP>v2*W)pi zJLEN(J>lJ-wace3^OR3d<~^UTjJL=;@6P{t@70;{ClHNer=i{}kfPxE0}3=KQ-5@5 zGrjFGWO+Pb%64hxM(IOx-}c%5%&{&xTN+++T&xwrkBb6)$krt zD^b35X;NQe|NZ`I1Lmv4Mm(oh(!>ugcT?Qe6`(!U9%($$oM^SSA%niUcCpjo(lW;K z%36=^@^!ByZDuV?c&#db@^`=1mbZWvQY0W z!Jc<5_M6)j$ZW3~<>@Ld%I$GgrVC>R+((CP#P+UqRoL3^r#0CVZnSn;yyZ}98hxNC z*QvLmgwa`B?b%k{;?q>s>tA0n99UhpDY&xqKydkzE5T(Y&x6W~Uj|kb&jeH!z4BiO zNWgW-!G3d@B*F6s1eVE@cLPe~(TFm+wn>h9dQz9`z?hZjjy2Bm8&~;gjtztw4)w)a z4s@l^dpfe6I$Dd|TAC}p8X6mYYwEiKDr<*=N~GtiNt(=c%aECsGUV>07`eDjnsRJPn`6%g3*o7CjXGxIQ$uVRu+o-MO&L+Q*^U zHP3@{m%a$ft9lu@5Rih}zW_DwQtZ38N|7&plH}=#2)VuubMJd3CYKHqB_MU6FF0}e zXlPvTwy@})6Jb$Z_d;WqJr9X%e-WI}`XXo{APdJYMcv&vum45Kt6?5;WfL1YHI3T) zxB%IDOo?UuumSJTew#&odt4OT@vWA|ts%xsH%D8QZcMT(oXB#{882{4AFJ?A9&PfA z8|ev*8eS6|Hnb%qWaY7tpus!A!Tm3S!}?wXMfAK3TnNY&B2bC6;@t!N0_4UzR&stD z_TCR+_WV2-nLIDYG<-&vd-(}V(T<~za*YQ))tBxM)L*hU(rodr1e@#~=? z+xSDd_E86xIEU`5bqmeeu?i=$hy<;n0a@$ot@1~Dh#`RF0 zq^mJTv6oZKBQ9oJ2cIvd`<<~?CUi}UeGhQrYV4ErP3UF{CeFzlv3xjF2d zT@YBxg})QH$nDjbKiI%Tj_+n7d+{EE4VPHS&@*n*_ezG^{z{XzZpN6q^rekZ{&OeE zjAvd7Nl$~+VxL55M?6l{4}O$s?DwF+%=3PgCF5?ZjnkbKwsyBCXtbOA={DD|)2y$& zpjlr0WM_5eoBcvSBRl!9oQYf=qma{EQUBu{Y(2wFMsKi^<)8RS#}^rn8P@_he~!G$1@lgnNWYTkoF&Zlm?Ju zt^`%~BGkFrU?P|bHlhjOBoPfBGU4Da9}J<2=sl=-LW&yWSFVQRuTm}g&qi(QpUZVD z=f-u+=l1BB{kWiG`t7c^@wZnCa%Yf`OX~?av4cXU4^hd+Gnj$6MkO8hnMmy~9!fbZ zVlD(l%phoTr(mx?4$Ot3fF_FB2k{_qm-GWaJns-9>ju$y#vxh34ziUn>!56oO#ow9 zu4)Kls`{`~O%G0~>B2v%3vp!(GZ>h|IDj6+mJ|O^e|O&^qz=zwECEhR9*8hypeK|B z${aDE#T^cYyup|^!0dyN4>$^Y07H}k-eMTKUt|vv61I>aX#ts1CU^kO0BU4(pi>qv zX_HfjjdE(RXF<+xCgkuQ3fXZ4GZ1Gn1A#e+M$ADh`InF!V5Ou0FEtj#m?N-`U{GfF z15FMu(C2aoQ*H)W@j3&Y&jFnH>EJG41HOXT02VTVXki0L5z)c_h%}%~R23S;l%PvY z0al4G#Ic=(>^VRo6Q|IFK@Xw@=b#Kdh-~yAl70~q1?-d%;G_D1D3b^74OdWLb^=uv zd(dK~gFc%Ln6O)cC5HvjI84Ej(+J$S^uU)(3qrWnA%;g8Qh5|0k5?9!@Jho{zJ=H~ zjULP~LWaA*Rt!a2ypIY@j(NW@P<0)Y@OV52aAhvEc6R67u-+JH2ZCCD?Gg9@_= zXfPXr4zmFmu;_v*i#AxXpde>KfzFCzomB<`StTKoRU8u7L?LZK@c0)qUUk9@_UMJ! zV=v3jgdONMoM7+D3-ts=|$Q1|E(nVlgD*=XW5}@BJ3A(E!L1&#LXiZ6i z=3eBOBxqbh?n{FDj0C8CLVhhmw_y>wAL9R^h@Zb>gZ_gZ;(%U^qb@5r8nJ_;H77W^ z@Pd=CAUH&b06kF*tg{z^MTrEMRZD_NizFEJNP)phDbQal1-hH1KxY?nSPHbyOM%uM ztm_3bi}lQ59Wc*)EfVO+{E0344-SYk`XDao2e}xsgR2!MFr0XS;UfqxVIts|AP)3Q z39u=W1gk13FmI9uvo2{cSs@KZBhp~FK^hEpAP1yD{|s_V8uXrGZ6C0v?^p{+{?r7? zA8H`=LlvZd2k7d|;DnljfjJ0w^kUrg*}((f)An-U15ZyO@CX(KM(iSRN|yxt0x6(X zNP|s-3|Mu@f3U?VESO9qCuM&bUz7Q1{6yx5!CUF?24AJV>VfoUZIJn> z334Ab{sbIUnb7)W22b=MywQvC)n&sd94GkG`M}>z2z&#@z$;n;+*72$B~Jz%%Vfd6 zRu1TGa$wsl|I2zve$IMK{)g3O`EQoH<-b}UmHTXYS?-hB1KE#euVp`&evx@=_)G4U zJ}A7<1;rOSp!7T7j6F>c)S13W0Qxb(+H4SF%n6}3e0UX+5Cr*&K|q8g_$En%XSVE5 zw-WguF4YR(oLUsVICLw1vL95OwI5adV7Ec>J$;A5Tlyh|*S6;sW^C@szqFo_dus7n z@v-SI<%g!Aavy!EdnTavJ7_yIfj8>RK?D{u%P0dk@u9;# zg}d}u%C~4=RBzaT`ZXKSylf3xmlgm#aD0E%-l3@fqj4_cQFkZeo=C!X-V^A8zhd3R zzD5U1&PK$@z70uLcomqh^uoVf`KfQc$`hY<)ra1Fs`tHCtKRh(SNq3po7yeLLAC3y z7u2u1K2X2t@>=7Z^H;6YPM~wr5p<6^g5J>u052Rr2(@=4YTpF(LsC(9r{h`g3{&o3 z>9zu2lAT50C-_Rt#74+IjY?K{6rQVmKXi%eouC@^TLG;a*Zq66uK2CgzT`WmeZgn5 z&ROqiozq^Ybx(NxqkGhAM)#1%SN;9&U^wj#M!S(+9)AM9a#RRI%^8cNq92lldove* zM)Qq0zvNl*z0GzIev$6E=y6J@%-zIz#hbC2s#l{5H7-R|YM%>l&^;5jOz&h!zy7h{ zVS~d#6NU!^cNpypIBK*v;F{5{fM-VA{Xdy(@dMM%zF@Y|56m_!00hWTArdubB9bYO z`WyFXp(e}s5(D=4CFb1Ei)aE5^WDU5X9vn$O^;T(kdmr?Ix$cCc>EH*BeB&62V+`{ z_CsQ-5D`vwk>?hd`s8?^G%@_EjENcwpbtf!D3y=FUz$dU^Vg=APB$zXw-YD zs5f(QPKuPU=c>;1sZy79rpko#QKdEStx{*v%Z0u&XYwMHk7p-p9LmVj-IrQuusgZJ zct=vb>DGjH^Ud+gEjPpsTdj}XU_BPI$7VG8w9RnTeVd`EcQz{{=WGWf!FEN|!axXq z|8c1IGVq*t0iN?NRiw;SsZ!t7YBB%YV8C{#-kke#wS&m%axa-9B_YcD3t}~Q=cVaw z%g!^}oVmnwLq@g5`m|=NvD9vxk(5=m)k)*@m5Dp-RwNv^TONPgt~dU*T~FM1yY9H3 zc3pA5=Ar)%grV+EK;4~8 zwkCZ;emJxy%`FK2=|h1e)O)$8H%qbST`fmu8x_dYc16lRJ<8OJT?U-T+iivRH!-Ak z)cGrIu8z>0s7TOXTbf}qT#|3Gvar;8U~vttFTd5UJGakqSdDr&@fJCK^IDM{8sChnA+Atf=~_}n?y zR+V$Xts?thMn(1~*NUt!E|pndohvi{1Y%Hkr=#91#2Tt3$Xuf&nOU}o+#L`imsZJ8 zjt}avPxo60Z0&KBm|W(iINBDhG1MHbKhThD(o>sdv21C9O>1R^T~m3zV_oSom+F#1 zMn%!Mduib=_mYCM9z}~ExfkVsbSuvL%qYqI;<^wJhwG4udb1e&?$wLP*A{W|v`2{C z7~&vj*GQ5>!=N5f(%P;)Q$S?R4NWgW-#u`ddf7gkT zkL|+b)&M)XG=lf;uM;QJW9lqhMof6ehv?$NgKlyI{r+k_z2Um;UGc`v9cdPIZMn8p z%_a6_jnz)Y^)0T8>-yYtYeqdYmu~e+uR89PT5;Dawfvn&dfBXdM(HQF%q4#UNw^Mq z*zc~G*Z;!gO&6ZKUx{xIj^VlY4Z>u{qzdzfaU-6QwYH*zYg}b}hJ01q2Sat5`eTi1 z`%=s+yR&VUbQakac2qj$wKchBwe+~BHLvkZZk+N;s6XNrS9jYhuJ(;*LiIOhMk-j^*1d z1eZ-YNH%TsP^_K^)F>a1&?_2CFv%NDx6E9VXPdgZ)IMQVt#i!aGS`R|E8Ro-Cp`lD z_IvvGT=VennsEd%4?N1;Z`~GDJ_Wy79G2t9A;~b#&#{Tn$11x0CAxX-> z0Zq2feWrX(d+6fTJKf~Uw)?3TZVl7UnTj<`-SydlRbZlahLIbLlaI@azKI6CO+ zyJmvnwR+mkW9SOQW918m$BNIcUVWckz5BlW0pxSyI&hIM?QA#)RB{GAh(nvHWIJlF zwdes1oE9Nnr&L&)PZ)AnAGHxKJ?tV?aL`9Fdw+;}+H|x|;@%{~nB7^X;X4a0gSS`N z_-$>WdrkE_xNRDDblI@S$!X$}qtp0vN5{2a9G%yEcXAp26DVd!Uy_~N?j<+}RC0Wh zN~Tf&ZaPRML+FDnyUIhFuF6xZujq0txn#+of5A~a^PHzl%9%i=_|uW~o~T%;QkArR#y^){gteZ0z^$wx#d6U`yNi%*J-xXIq;opxJKz6R2b*v+Y!z z1I!<+!~8$yAhu6a$U5`@mS1EgO%J$8^+OrTk_VbB`S(q^Gw#v_lkPCYWB>7!j<_AB z5PUOE#s5Z{hS&8xZMUmsdd^oG4eT%V8PP7RHL*Fj%f#yJc@wKsPmL{(e=;>Y0%m51 z!Tfiifr|TpkP9P(977Lc?`{g&cm(I*EEDO#cQI;S^ODlnGL*%yHCQrV8F3`Pvf+)J zaTbhx=`9-aGDyPzMU;&9^CWrqXIV-vPm5I?{;g4`Kk3x4emtyc`Dlxl`Gb>MX7?Xz zn*8%l+vw&GUBer{{@~d%Laq!Ea%uwgKd!-6)W4%ADWvxjl{EarOv=9Tlf~bpsF~kX zS(3l$vB!Qh=Z^SB=MVYnDirY5Th!-Eu(-#UXbIOZ$x;rVb7W|rOXaLTH7Z!l_9>dp zu2VGmIIU>>{=9m?*QuGmg|I+qYsk* zlZRxW&P_tS9Rr$dVPMFKXD_(@z>e1&Tm{_0ThIl9gdHGKlm`3N$V!aN@BC4_+Gh@mWC_zZt{{8bOAT9ux^{L7fOb zWGSKwqoT^NMN|onBB%f0IwDFGl# z^+wI_21-oMsP`Q}kA)5|(-a{*T z4+FgTI2WHJO#Zs2F^juOF}}>2k`|q;(>LzfC$9_ zB&jrzqgsP9lLcrnnSm~|F&Lr$V9u-ywk%rU#G(csEK2A*-~kR+DM&@{VKJKsRIuUW zmTZF1%Kkfh@ORN9uE8MsFs11@5PnI&@& zrI>&O#SmmE`k+YF0adCNXi?QcpNfG8CPlDfk^y@r32EWcc+vgf`y~$izXO&yzO6dbe?A0#-WM`p1)3!r z*f?;2wHFsygz|uCJRcZm@`FK<0O(Z-f=-hlXmtvLX1@?<3=4t!xDcpqMs^E=>QUsP zAgXMv>lN1Yng6H4FaGaxAn;Wh1iwgv(C>h?8jg=1ggr9v$2g)V@Pi@2qEj3FC%;W=+l zCvI@};R8mPAUG!o&pBj?e4`hMezC0*`()E7_R(sY*n6wx;_ob1i@mX2C-%x>N^Hh_ zTI_|{NzrGf{}X*`@=WBR!AJ3X`g0O@^g!}9dO|mK{{);Aso;iM*Bku@f2<=I*CSY; z6#~rI@d;{f@blpN;TiMFp7PC^9%zw&UFax=BW*~pY6cm03TycCa%$WP5 z{tiX$ABp~06s|`EzVjAp!}Tr1mG5Jqzu+6cD3O=mDdJB(a~C~!Un23)tw!=5qeb$L zYq!)b=RxTkPHUyFIc}1<;;={NqQeQ9^Y%An&e%VfIbrun{wV#I;$a#n9kd1I1Gb>@ zJK&Dv`=Ra)LERaR^~B@;NWhCm>7mrf-q- zHJ>Wk%ifK07ri><&v`CaIODNe@ud5D#p7<=A74^38=eMaDSv}Fnv$cWqF@s!u}$W#`7rNUEoekkm&Wu zScyyFX)@O@?k+>w|p#RE}=D$|h_YP-Yh)pv%qYiPt2BZe!(t{bfgdtuZc`qii}1dMu-o&~_x2L+-~=cSC|NHy=HS z5`1T_LYh3TmL@l96)ERx^x2M9+VD=7xr%Nt_LJUR5UwzhAFn!=ldicYD^F)AV~PG? zdbMGHT8nXSN{?w*@{swm#7T>`guRw6@#ig@;vQQz#?D$a#DYbAEST5F{0W4j?v6vf zmx*&xAWr7W7Ll2y;^c0)}`%eueLl6Ob7lgOqDZ>jaAAqu0#F{-NzQ#1$j zvvrr}6&dv8R2p|?HJG+%cAB@O4_Y>+ja${H?6R&&K5er!>49}s(g*9xM6g0ED--?% z!g1_G)SKC;d5cBK*Gducv`&EhuZ5GGZI>p8+q77AH=FZJH8=>bul1A~sR~k9RS~5+ zP@1UKTau~US-9A+eQ}vdOMabMV{W@;UCw~@(yX<%l^NSPnrqltQesk9Ty4Izu+^$!ai2|T{s^r&cMH8B=crwN_CNHz zthcnh%sJb9ycjM&18jZ=qH*k0J_3tzJ<0{i+d91Su8obH>t-c~my3~I%T<{+^%!%G zbti*WYf^OUmu4GQR~DI8lvi4mmNr=zmGsyyE*_@m7H+c7 zDmY}HvG{-X8Tqg6GV*@VGjf5JnFF@J1F^Uc8N39Fa4xENaSm9>rB3X-qX)2WP>5_D zRHm*UFyL6zXDzUz+gZH3(_6N^Jy^M^HCnT-DM`1gA=9v|uE4aorre@nX@gB}WhX7G zV#qG7Y=eEuk^>G&CD$Ahi)ZW;i@w_>6#_lE0RIR64T#4%nAhG*c*&PqPI99S&;9o> zlOuynWaltH**L5~9UanRU%AqfuXn&vti8`url}`TskSRpqjFh-ZfRS(VPQ+YXpdK z+{jF>bTW}s{dn$uHI+=QaYP0r@nDch5wijtyCF`XPW*a396q&{?ud%VqBEuZN= z_;`e0!=FF~8~$EmC$HK5z3)oO*=rhq^;<3KRjInOS!fEX` zONWuumJY*@E$oM8E$mi;rTvOOfkGzov6hf)o#;QTB;*kG;CE~yWE}NhKjz?@POy=s zCnZVgNe$-3$4xl1j?ws2k1#|M4*N<(9}JZZKM<=Jv@b=)Z#qZAYtIsGx7~Gm&O5sd z9JUV|(zk9gvYk3YV;G!G;EHo*0ee@rDbvWxR&{W2byNnAGA#O{M0eo1-ifUt`6s*2lEH32|0*+ zUhYeyA~uG~{Fy!ckp;M{j5{WGBQJGVP9 z1A=RC3_Xawcot*R9zs?h!hL`my!s-AA>#z(~Xn<(~ryMXBdyg&v;(bxlDe;xe@`rxduU0koV!{f$0IHu@m(=mCV!abgBR znD~G+#T}HWE}+Ha0EWzTuwbzP8jB@3v*HB=Y(@~ot`E^1+K|Sn0fk&DP{*wVy_kPk z%OejvdF0>}k1YK22gfFH4YuJLOykcY?tu>UVV0r?kpDl-V4x2YhCYb@PiEo?Jm>+4 zq6Z*Fp@Sj?+on{E&r{97n8_F{nGAr=tOG90n&5-khfo#;NI?G~53>)I=s$F@iNPxL zAST&_Vf!EK$33_e_rNIbfgaogb?4E8K`$!xE+LUm(EoTzh}#cBoX~%u12?e-Az}fG zhzZD0jIb7cP^0LA4n+$L(SIo1%)|$a(R-+3W`|a0Ht73< zowx_aaS!z49%w=zX2})wVD1nS{RqE*%%d>g5@L@v*q{$$4pbbQofzPp=wdBeAVxGm zil~7+Q3hp-0%%ZVL63p~35qD#Pz1o4!VNwYyl9k)qJ@fotRV$|0ESvrFxI4k33?$$ zx=f&N%nUl#ETHMk0xG_&pb)_dGRdqUmCFVarEDNx%MPNg>>$#O3?Qr7L1-M=%npLP zki+aCaE=Z5?;tPOfcq0GaQ$QjPGAKNWd0uuu>Bv5HK_OmFcr+uhcMN~It-b?(2520 z9I*~>R!|LN1;s=*kk4iZ*x){l9>@Diy5oJhL@syXXB7YxIMxO_Cjr);2@II6SzWZ{(j|lw#12#Ce9qMgI>~%Zi*9_bj3RC;&nL42o{uIKyzflvc;6bg@xC_d;hixYcvCX--aeQ$K)1&;?O|I}?HhIE-!T6ovS)(5!rwl>#gaL>hGXU}50mu3A zQG0u$_VvfFgK=*J<9Y-dvi$J1V*BXj#PQn0hwC{boac#465j)-Z2r5B#R9h-sswM^ zHws?2>kzs^?-Ra69}>PmTPJ+Zc8kbq+x;RZZO(}tv$-#F*!r#50jnR2rY%8oj|E8W zn#cVAf>$l$_^5mRkWkeAk$BHslsa`TLYMhth$-t#Af5e*zX#Vn-w>W#UUB@_Jky0P zx#tU?cPkY=>sBLniqR~7!nJGBQP+V*hh0V_4mxj;*yprca^Z(_)IS4?_8G*Vx9`o+WGUR)z0(qUPN_m{DO}(9H z#(F8q@b2=B+=l5cF4E_H9kNfewud@w!ed=7-dA&aG zbFR2L-953b`a5H~4Yo%Q8g7kRYP2bGo$-cXjo>U68pkSP%Lqx0)?W>$X^uI%K&hWrg){@+O;s!~-_{ z2^Vd9|t7Yg~ogSU7 zvlSez@sQkGIbD8x*=&_fC9#_8ic)n~7vvhO$SXEpI;YBPaZZ!PaP~Z_fvkl#{TWMb z7o@MZ?@rrmKQHB+Lr3yGhxX*39omxK*taGk?M`HNAHrgwoeIA<2V+sHKrc{teiwV5 zHyiQHffj8#-eSey-{dB-quxhuV@Bg7Z%i8_U5(Q z^vvnC>&jj1(2+gn*qXJ=sU`EYb5r`ioEy`hIyI!dcC1fhj`gX`;X_y)e0MthW&yl! zxhy@cm84IbP;=jkntR-faHzwax2w%Xd~=Jp>{#PWhP1VonvA{}&by z?M&2~7hx=_r0HIRfNr$H`**_o&sU+n-KM;)T~1=_I;P01Yzt5xZ3)vDYK+tEuTM4X zsm(E+S6yV$URh;5x4g-&scfD@ed(ZcP4Patgmw-*Z>bdhhB>&?!l$d9@cun~I@qg7JNt~d4ZRMcRo$M_OS+~j4RwU5 z_qE07bhjiMb~a_1wl)-4G}l#F*Vi`K)l_#lR#x@9lvXTrD=ObKsi5?*dtS+P_c_Ji zPMTBnhg)tTbDdMbTs{O_a99gyL%9S!YT(n&c0OI|=Fz#Us7qk$Zai?~~HYm|J=&bItewmL`F)wpn3ckyYM; zO55z7Cdc&o^PQ9DjkqOrj!lYf+v6VH`jJOe%LDhQrWcc<8kt*E!{4~#^?$Hz0p>wS z51O#=-38Bu{qJLoiFTn5V9grrdE)+{!L=s5o;8kQ?W;XynpXNN)-DfGuUHzbQ@kX} zAb)X|NzS4Ii;Uq4o7AC3`^15HPO<$%E|I-!+`@WxO`1Lb+@z4MuO@|bK6eZ0c;_0@ z#{Lg1kB@wqqq}X``-lHNi#muy(BC!&&xIUfV6zhx2)bKYH5dk*yw;`$f8xwLBl&;0tU~z%ozC6Wk&z6 z&NF)7I{PnR&i*~`!-|Q1Zh-fm5ATgNaB>;ZKIm_P2VMdX*u7hv+V*Hu;~qF<{<5hDLlhGaM61T`Pu7Usm!%WBr%*q5ca>4#&bcPjcl4V3Y+GhA zb<0*u&rK(-CU5-Qa`L*LEj`9wTe+`h)*td4#^BR#WH6Y6Q>%y$Kz|GLSHJ`J!2>qo zo{W+UQj~vDm$ENf^U^N3iIP5=CJ}djrcBhiaQU#a2}-lhWT?(Om9OD{vO?SUM6>SH zV?FwwN0%77AKq-_cJR27>;5~2u6uqmblLUF*l7ndaoYYqUm^$k7&*{+WDrM@1MPTcH-YdBxosOfm=sHVe(Tbd5%o@m&g{!7dDB-6G%!E`2ayASJN zDb~R{i~(|>Eg1jh(C>o>ZH5Oe!S{2d-w{&mV>ya^tV5yST2Sz}&b+{Hr||tB&k*`P z4i)o$94GGeC|%OyQNHw~Z>nTnzG;*aKT$IB3*+shb{^UG8*hu`wWZGWqlu>P$>(&ELir1|p=Ql`Hil`?tu ziKOu_k0p(s{w8VoI+L1wwh;-O`)Il6V z7I96a$sUR{*f;NSYBMqz=x;rQIXHnDh_hISmoNu-Hb^FNkeK_>M-Jlu2M_s!)Zh7o zJJUi2U_j2yoE(@f*)nI&ig|Em%!e~#K|DPc#nWPGJT+E~{Gpkz$QJVD*=oKl+s>C^ z$HA%h7|+3WB8yyu9B2^wZP2ek4wG|-DE=$dU?2yXjvQplAOFrDT$lv%2YKWVs>mO- zkUtoZ88angW=#gnk#v|lsiQ4QESQsFv77|U=7g-0!$Yz-+!zT~00glU*t;J&*fE?3 zXK)@MhpD-a3g`j6L~G&!5jU!}v@k zkQ2;Ftq)5IbZtmJU2-;lXDnetf1so6of3`AjvF&y5b=ji3YcfC02^l+P4b@|nVV zunq0p&wnR(lK)2L8vnJ_SG>QZp74Gb|DE?j_>T9C&-lNfWj}uazK)4wZpQz{1v!X| z4RGZ%$Ekc~8z^8FkpgCtjJD(om|iK`Qzu~Bt)NTrR=Z#DMstziwdQicUm9bAKQ*=p z{!rf|c&T<=@SExt{&STt_|KGn;6Igr$^Sv-o!~neCVVWzL?6N?!Q*bcTlhrpnBWJ!OM>ro?g}1h{UCUt`BM0m1{1rd!Nl)sFp1AU;BS2|`0Xjc z8}0DHocP%Dn72D}As+#A4;H?5i4p$cm?nB*moIu|TQ2(9re5^ard9N#b+_ny>jBZX zR*OZCtX7G>vD_$nXt7Il-~5>HOS8+uyQW_X@0dIhyJ_-=#K*==@|qEox?;qnFB>tL ziLi0~X~-XZkw45p{t$?{3B=l*;lh9CH%0J=cYyF$&j`^^9?7B~Cgq4db}JG4#_$Zv0vtt`&ro& zlWxl%o%EgTA-CV<_q#I1y)H~?w+mC=<@`R(4}L!ozCQ#+;y6Yhn9%Q$*4)!jXWpY( zQv_cI%@p1Vj1vDOAVu=pj9lr<{v|RO{HtZpO>dSvJ-t)@q+hT6ala9TqrNK?5BY3R zJTPsy;=XAoly-Z6th96LBc*LqUZ`yLVyYXxnA!$UroR3I*bMmnV0i8bc;7f2Cu-BH zL<9OM-ju$HvE}YXx$|#EP8VGb50&^REMEFdXol>G+4=HEL&_Bo&8ky65Ik3TU(kG& z-9ZagcFr7C-5xlmwk2Sj+NK#t)HnEFR$u4;Kz+^hXBw;g-fFJ!Wm?O@GN1QhGvWPb z!|#rJ-y|HT;a>MNEqa`yNB5G<=thz=|5D;K(V2u`$>VX+vWH?)qJ=>byvQp06;B_}9u zOUh8*l#s8sA-+swZCtJ9n%EZYl`&m9%cBQ$mqabqTO7GweK(dZ3)NBTjFn+H^+Tv-W2$S(V5vsuGxaM+@^X5!C0-Q#PTYC*~JyJm4?b*&vn)WwOjL-v`rEpYMCa} z+cZ;QenYrwdtJOnOHGP^ z@;-GM={Mv0d!0n{d%Psu=KISvb%iL`bw;aKwI^wpwPorR&&@Z=Z!R~@ZE7&jYUs2| zuOF~Uu3KrBShL+euIjXXY{gys*z#ZOV$0sz#+I^iY$n1|afzGH(HHQ(H*l$W9{oSE z0Q0aA`<=)_77Z)Y!eL{sd&pkUJ~&yTX`!ENZC|ib#ezt+lAZ*u!tQk4IbCxMvO7yn z(mU$RQrg=s6I%PNV_R0(Mm24@)d?ZT?x*oIXxoA3`{8AN|!Eq+#q zd1%Kxp#KL3Fb^ZxcZUaCxKxh1m+Djd5*vQg=p?b4#nYtAM`kJ%4~MJd55{Ta45Vsj zEX>tU?JG7)?5#14>uEKQn%`>`-nGnTcIOt`;Pzv-L9MrKgIb>2%xrpX6V%9Tf*P3h zL|87-cUX(JFa{TqK^%wv-bL_S$RUPTA%9pcL9J`FsBw)2uX?qMux#a2$-)&gWaliO zt(dheMm23ovS!j~wod%wLjCBGDx>h>7Sq{-3(SKSF0l;g+hpb6d(_&m=cbk4{3lj^ z^Ilo`b+G>fD@6WKi}L~g`&>Wn{fGWeNcrRFa07C9jK8N*GI2jaiea5wSX7J9K4*Uhs-0gMj7T#?zNBHuV|ZVCKE(u-TN6 z8)j36el+!3_?MYiKQr^{d!H8=gF7wAAFu{aVf+t3e=BmBmB<15;X@mC;`s-=WvO6~ z9_8+~<}!A>2~u`V6HnL~C>6USOg3_RoI>cfH04=a=BNd3F4Oei)S&INu}gRA`VoE4 zwd)N$#ts^|um0G;edYHCla~Ey=(dy@x-MZx6SQwJGefCC$3*!p*!ql|SQBfN=W7FfpHtaS~H6 zq)T~zlrQamzDm~hT&ukE*@X%Yr&lZ5o!qNvd;GGZ?a{}IHV0oSS?_1cR{NOBL~itA z46y!>A_Le1{SD9`MGn&qA6^F^TyO^a|Ccxly(yv@cjamNT|M%-XGPxkTxrTZZ_e{x zAkY17IN$AVqR{#CY?0&VrDArUHHq8YSs-Ec=?Y1UTRSDqKKV$}?Bj=$rdOUznOuA$ zZE}IhOym;Q;7RBofc`e0A=vunegE;$N_>r=abJ5QZ(g9b(;LdkldeG zliO1la(+669G}kM?4O2lHcu0HR!_3|=15Bi&+zXbZ-Cs6|d{X*n0snCyvejsvysgH;z{X*n~`UiXD z4>o_-KIkF?FhK_J@9aUBdBFes!T--DMV3f1ET1G?HBo)%Q3E z{cU?O2hi__ehc(Vp`VHIk3kL-41FKyyZ=DsfHv4LA`8@nm?D!gVv5Kf)JYfFgBJ23 zHD*al$U$V-Wa#=sClWbBI=~wM!{TRy00Yl((obL)*8dphe>?~4fPN+Pb3Q=^gB&X4 zK9S#JqRBrZ|M(f%$8#dncZA%7NDpYEEgHCQNfqOw%v6wlXp=NEBor$k`*4JgCkO;F zU_1jEZwuax7(SFHz$}n|SRj8e!>f@E$8?-HrZ$;l3Vs}un$0m$Jjb|954eiI!drrU8 z8?=Pc3-J5{m@V=TTlicXU@_hfTaKByp)KAV)11jMl_-o!3fhv3wv=*AtQKR_0_G7D zVk`uMNL7~5JKidK%WZ(t4thlg(ciPszDY0X5j20LU(lMLp#22=h)iZ8%pUoN1AMMM zu)(nn#=^=O?eW6g%)pq0^O$BL$5gX0E|?F6D(7-ZxPRdIz{Wx@WmtI=8qRI*)l*bzbl<>AVwsq{D>gbeQO@ z4ilRQb4Q*3WcY1QczdG~D#cwg95 z@b20)@cw1p#=mXd&A(~AkblE^G5@;ND*jcgP5jH2d-xYDPYTXkd@ML)@wMQD#dFb7 z^LJv0&6xNh1e*s;ndC&6C-RS}@Y_D{{{A=)z_`pXp+Eg>=ofES?mI7U?xA}S@7|kq33A~s2T$Xl3knvVoEa^4bY_agp}-u;{Q*T%duCKh@0!sdv)#W< zcB_B4?B?l%avP^FlUwh%UVg3b9{JTirxjLCyRER?`v-+3Q~y*NoywFJO<~F-Uhl)E z!}|wH5(|U(jh3g^sK@v*T8X|0Mg9

        D6+xYLnd{3DS8q66XK;=98VBzJ^nNN=5; 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 z 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¨d*kn=?oOYJ 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 ~(j|zx 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 K75MPKe*2$AJ#1qD literal 0 HcmV?d00001 diff --git a/local/recipes/libs/lcms2/source/testbed/test4.icc b/local/recipes/libs/lcms2/source/testbed/test4.icc new file mode 100755 index 0000000000000000000000000000000000000000..2270061be6ee16a73b922df534d0ccf5a0e69bba GIT binary patch literal 61020 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 literal 0 HcmV?d00001 diff --git a/local/recipes/libs/lcms2/source/testbed/test5.icc b/local/recipes/libs/lcms2/source/testbed/test5.icc new file mode 100755 index 0000000000000000000000000000000000000000..34583ab1cd704fda2bf6f39ef42de9a91344729f GIT binary patch literal 3240 zcmb`JcT`i!9>?e2n_g%Mkxu9x1t|ffhF+vf6BS4T1VVt204jFG6FD&m5x zOOdr=!NQ_gz`j8q0?N9$im0f(8+b?AbKbr`_Pjag&i%~y_nY5u=Fa@ixd2d(2sr84 zumS+-La`{!$AcLi6U)T+02mMf4p;$@z{$=G3iplxf7{;m0Z3-NV8s3u?Srts^`l%d6r9Od}g^`#@uuv7xigJ zc|A9si!#DOS)3!`$@mz`g*kj)E&v!Cl=TIYbUw<_DAUt<3Fsa$0+}x6anPI?S$v8p zB8-i44FCj6@*GZ_!(v{ZZ0%rihM1Wx;foUz1w3X_hKMQRB?y?3Y#wTx-J{G4m`Cuk z#mr1mMiO7ZGiM6_$E+EDS!V$v01spXF<^pBAOaa63Gjgc)yz>vh>m5JY#>2ZF-QQ3 zGd3pbm4SLQ(T9hs0+b}Emux}*=O(*9vmxJv&fE)#(fv*Pmh79BQ3n8P0zH?~Z(8CW z0NOSKpz`pWrhfnc`2ql1Z_fFKlt8{%jDBTyQ25u_R1i3`d+~qv&IUo?oAs;PKZiN_ z3D%Z*a|029HLwJKk>;BJInT*y9>z=JiFiT|j~R*HV!kk$$<7dR`C@*CkjWP^{k+(A zRt|P{7S@(%0e@}(aN5`TvoKpXDAVe{0Qw3`pm388kl(ujhDHWR+&v*yQxF898hj2+xOEusa+8N5ISAWH<|61sA~E z;Yzp;J_fhK7vLN4Jy;6AgeMSykP!x=gIFLegpC9vu}BgkLe?ThNCi@dG$9>G7jg%Y zB4fx03=TuXFfkSwCyXy<35J8o!mPz?!&G68U|KPkFn2Hmm~qS(EETJPHN!e${jky4 zWNa?B5LyjPFp=3UJJ-L#6 zoP3o$K>k2cqL@F06g{tMM?Nhs~Hl|KjcT(r57pb36f2aX# zm}-P+tkyWF(XBC|sio#WwOHci__o3CB2eNOuYQ<>?` z6fi59mzd)^8alo@5}jI|9-S#&Bi$vs8+Ds?pXibFSb9l%<$9fZ zg-vZuQ%tK(Z<@hoc4mCDy=J}USaSz+p?RHozXip@-6F@L(PF@oVHs$-(X!3*)qMT= zvGaG#@0$N*f$ajpg8BuItdy+$tu|V9Sp8{jYR$2(w!XWNy3l*!x`pivU)z}3@ND+k z+_$CK2H9@0?X>-DXKyF6YqA@)*SC+iud(lE(ODs^ZLF&fSO*V>bq=Q;J~-MriXBfl z{^4Zdl;(8QX=IVnBHp6oYe!H?G?uw_$e^ z_f+>|?yo!+c!)e&JSN$W>^1E3o`|Q9XOU-*my*{KuPU#n-n!n&-i_YlKDIuqea`!0 zeFJ=V`1bp0`f>ak{Koz5{nz+k3ZMjp2UG<-3p5QB1$G3%LHa}#&(xEupxWc%;Wk$>LmR(z}wp_6M z%nJDx2`f&8FHB!ZhKf46Tg3jNVMM z%)(4*mSfhgtZ`9*=ukG4y)3(3OhJR zIlRhy)eoyNt2wJX^L6q!`~7kK()--|BM$@*UO&uvIQ3}#W9;Li zCkjt0o@zX;`_1IHW~rU@%z)=W_p|V4j|Mq|FaMSOuTMh-&#BKVhP8(qMyy9pk9v>Z zda?Ay(96u1Q)7j{EB;>d%J|jKf4Ke8Jsv$i^jh?K`p<1|RNowaYxA~qB4py}yYzQc mlSS`U-yiwF`q1?;>f`WK?kD`G%FiaBJH7;bc|4syJ^gQ+!Q`+2 literal 0 HcmV?d00001 diff --git a/local/recipes/libs/lcms2/source/testbed/testcms2.c b/local/recipes/libs/lcms2/source/testbed/testcms2.c new file mode 100644 index 0000000000..9e6f722e7f --- /dev/null +++ b/local/recipes/libs/lcms2/source/testbed/testcms2.c @@ -0,0 +1,9928 @@ +//--------------------------------------------------------------------------------- +// +// Little Color Management System +// Copyright (c) 1998-2026 Marti Maria Saguer +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//--------------------------------------------------------------------------------- +// + +#include "testcms2.h" + +// A single check. Returns 1 if success, 0 if failed +typedef cmsInt32Number (*TestFn)(void); + +// A parametric Tone curve test function +typedef cmsFloat32Number (* dblfnptr)(cmsFloat32Number x, const cmsFloat64Number Params[]); + +// Some globals to keep track of error +#define TEXT_ERROR_BUFFER_SIZE 4096 + +static char ReasonToFailBuffer[TEXT_ERROR_BUFFER_SIZE]; +static char SubTestBuffer[TEXT_ERROR_BUFFER_SIZE]; +static cmsInt32Number TotalTests = 0, TotalFail = 0; +static cmsBool TrappedError; +static cmsInt32Number SimultaneousErrors; + + +#define cmsmin(a, b) (((a) < (b)) ? (a) : (b)) + +// Die, a fatal unexpected error is detected! +void Die(const char* Reason, ...) +{ + va_list args; + va_start(args, Reason); + vsprintf(ReasonToFailBuffer, Reason, args); + va_end(args); + printf("\n%s\n", ReasonToFailBuffer); + fflush(stdout); + exit(1); +} + +static +void* chknull(void* mem) +{ + if (mem == NULL) + Die("Memory may be corrupted"); + + return mem; +} + +// Memory management replacement ----------------------------------------------------------------------------- + + +// This is just a simple plug-in for malloc, free and realloc to keep track of memory allocated, +// maximum requested as a single block and maximum allocated at a given time. Results are printed at the end +static cmsUInt32Number SingleHit, MaxAllocated=0, TotalMemory=0; + +// I'm hiding the size before the block. This is a well-known technique and probably the blocks coming from +// malloc are built in a way similar to that, but I do on my own to be portable. +typedef struct { + cmsUInt32Number KeepSize; + cmsContext WhoAllocated; + cmsUInt32Number DontCheck; + + union { + cmsUInt64Number HiSparc; + + // '_cmsMemoryBlock' block is prepended by the + // allocator for any requested size. Thus, union holds + // "widest" type to guarantee proper '_cmsMemoryBlock' + // alignment for any requested size. + + } alignment; + + +} _cmsMemoryBlock; + +#define SIZE_OF_MEM_HEADER (sizeof(_cmsMemoryBlock)) + +// This is a fake thread descriptor used to check thread integrity. +// Basically it returns a different threadID each time it is called. +// Then the memory management replacement functions does check if each +// free() is being called with same ContextID used on malloc() +static +cmsContext DbgThread(void) +{ + static cmsUInt32Number n = 1; + + return (cmsContext) (void*) ((cmsUInt8Number*) NULL + (n++ % 0xff0)); +} + +// The allocate routine +static +void* DebugMalloc(cmsContext ContextID, cmsUInt32Number size) +{ + _cmsMemoryBlock* blk; + + if (size <= 0) { + Die("malloc requested with zero bytes"); + } + + TotalMemory += size; + + if (TotalMemory > MaxAllocated) + MaxAllocated = TotalMemory; + + if (size > SingleHit) + SingleHit = size; + + blk = (_cmsMemoryBlock*) chknull(malloc(size + SIZE_OF_MEM_HEADER)); + if (blk == NULL) return NULL; + + blk ->KeepSize = size; + blk ->WhoAllocated = ContextID; + blk ->DontCheck = 0; + + return (void*) ((cmsUInt8Number*) blk + SIZE_OF_MEM_HEADER); +} + + +// The free routine +static +void DebugFree(cmsContext ContextID, void *Ptr) +{ + _cmsMemoryBlock* blk; + + if (Ptr == NULL) { + Die("NULL free (which is a no-op in C, but may be an clue of something going wrong)"); + } + + blk = (_cmsMemoryBlock*) (((cmsUInt8Number*) Ptr) - SIZE_OF_MEM_HEADER); + TotalMemory -= blk ->KeepSize; + + if (blk ->WhoAllocated != ContextID && !blk->DontCheck) { + Die("Trying to free memory allocated by a different thread"); + } + + free(blk); +} + + +// Reallocate, just a malloc, a copy and a free in this case. +static +void * DebugRealloc(cmsContext ContextID, void* Ptr, cmsUInt32Number NewSize) +{ + _cmsMemoryBlock* blk; + void* NewPtr; + cmsUInt32Number max_sz; + + NewPtr = DebugMalloc(ContextID, NewSize); + if (Ptr == NULL) return NewPtr; + + blk = (_cmsMemoryBlock*) (((cmsUInt8Number*) Ptr) - SIZE_OF_MEM_HEADER); + max_sz = blk -> KeepSize > NewSize ? NewSize : blk ->KeepSize; + memmove(NewPtr, Ptr, max_sz); + DebugFree(ContextID, Ptr); + + return NewPtr; +} + +// Let's know the totals +static +void DebugMemPrintTotals(void) +{ + printf("[Memory statistics]\n"); + printf("Allocated = %u MaxAlloc = %u Single block hit = %u\n", TotalMemory, MaxAllocated, SingleHit); +} + + +void DebugMemDontCheckThis(void *Ptr) +{ + _cmsMemoryBlock* blk = (_cmsMemoryBlock*) (((cmsUInt8Number*) Ptr) - SIZE_OF_MEM_HEADER); + + blk ->DontCheck = 1; +} + + +// Memory string +static +const char* MemStr(cmsUInt32Number size) +{ + static char Buffer[1024]; + + if (size > 1024*1024) { + sprintf(Buffer, "%g Mb", (cmsFloat64Number) size / (1024.0*1024.0)); + } + else + if (size > 1024) { + sprintf(Buffer, "%g Kb", (cmsFloat64Number) size / 1024.0); + } + else + sprintf(Buffer, "%g bytes", (cmsFloat64Number) size); + + return Buffer; +} + + +void TestMemoryLeaks(cmsBool ok) +{ + if (TotalMemory > 0) + printf("Ok, but %s are left!\n", MemStr(TotalMemory)); + else { + if (ok) printf("Ok.\n"); + } +} + +// Here we go with the plug-in declaration +static cmsPluginMemHandler DebugMemHandler = {{ cmsPluginMagicNumber, 2060, cmsPluginMemHandlerSig, NULL }, + DebugMalloc, DebugFree, DebugRealloc, NULL, NULL, NULL }; + +// Returns a pointer to the memhandler plugin +void* PluginMemHandler(void) +{ + return (void*) &DebugMemHandler; +} + +cmsContext WatchDogContext(void* usr) +{ + cmsContext ctx; + + ctx = cmsCreateContext(&DebugMemHandler, usr); + + if (ctx == NULL) + Die("Unable to create memory managed context"); + + DebugMemDontCheckThis(ctx); + return ctx; +} + + + +static +void FatalErrorQuit(cmsContext ContextID, cmsUInt32Number ErrorCode, const char *Text) +{ + Die(Text); + + cmsUNUSED_PARAMETER(ContextID); + cmsUNUSED_PARAMETER(ErrorCode); +} + + +void ResetFatalError(void) +{ + cmsSetLogErrorHandler(FatalErrorQuit); +} + + +// Print a dot for gauging +void Dot(void) +{ + fprintf(stdout, "."); fflush(stdout); +} + +void Say(const char* str) +{ + fprintf(stdout, "%s", str); fflush(stdout); +} + + +// Keep track of the reason to fail + +void Fail(const char* frm, ...) +{ + va_list args; + va_start(args, frm); + vsprintf(ReasonToFailBuffer, frm, args); + va_end(args); +} + +// Keep track of subtest + +void SubTest(const char* frm, ...) +{ + va_list args; + + Dot(); + va_start(args, frm); + vsprintf(SubTestBuffer, frm, args); + va_end(args); +} + +// The check framework +static +void Check(const char* Title, TestFn Fn) +{ + printf("Checking %s ...", Title); + fflush(stdout); + + ReasonToFailBuffer[0] = 0; + SubTestBuffer[0] = 0; + TrappedError = FALSE; + SimultaneousErrors = 0; + TotalTests++; + + if (Fn() && !TrappedError) { + + // It is a good place to check memory + TestMemoryLeaks(TRUE); + + } + else { + printf("FAIL!\n"); + + if (SubTestBuffer[0]) + printf("%s: [%s]\n\t%s\n", Title, SubTestBuffer, ReasonToFailBuffer); + else + printf("%s:\n\t%s\n", Title, ReasonToFailBuffer); + + if (SimultaneousErrors > 1) + printf("\tMore than one (%d) errors were reported\n", SimultaneousErrors); + + TotalFail++; + } + fflush(stdout); +} + +// Dump a tone curve, for easy diagnostic +void DumpToneCurve(cmsToneCurve* gamma, const char* FileName) +{ + cmsHANDLE hIT8; + cmsUInt32Number i; + + hIT8 = cmsIT8Alloc(gamma ->InterpParams->ContextID); + + cmsIT8SetPropertyDbl(hIT8, "NUMBER_OF_FIELDS", 2); + cmsIT8SetPropertyDbl(hIT8, "NUMBER_OF_SETS", gamma ->nEntries); + + cmsIT8SetDataFormat(hIT8, 0, "SAMPLE_ID"); + cmsIT8SetDataFormat(hIT8, 1, "VALUE"); + + for (i=0; i < gamma ->nEntries; i++) { + char Val[30]; + + sprintf(Val, "%u", i); + cmsIT8SetDataRowCol(hIT8, i, 0, Val); + sprintf(Val, "0x%x", gamma ->Table16[i]); + cmsIT8SetDataRowCol(hIT8, i, 1, Val); + } + + cmsIT8SaveToFile(hIT8, FileName); + cmsIT8Free(hIT8); +} + +// ------------------------------------------------------------------------------------------------- + + +// Used to perform several checks. +// The space used is a clone of a well-known commercial +// color space which I will name "Above RGB" +static +cmsHPROFILE Create_AboveRGB(void) +{ + cmsToneCurve* Curve[3]; + cmsHPROFILE hProfile; + cmsCIExyY D65; + cmsCIExyYTRIPLE Primaries = {{0.64, 0.33, 1 }, + {0.21, 0.71, 1 }, + {0.15, 0.06, 1 }}; + + Curve[0] = Curve[1] = Curve[2] = cmsBuildGamma(DbgThread(), 2.19921875); + + cmsWhitePointFromTemp(&D65, 6504); + hProfile = cmsCreateRGBProfileTHR(DbgThread(), &D65, &Primaries, Curve); + cmsFreeToneCurve(Curve[0]); + + return hProfile; +} + +// A gamma-2.2 gray space +static +cmsHPROFILE Create_Gray22(void) +{ + cmsHPROFILE hProfile; + cmsToneCurve* Curve = cmsBuildGamma(DbgThread(), 2.2); + if (Curve == NULL) return NULL; + + hProfile = cmsCreateGrayProfileTHR(DbgThread(), cmsD50_xyY(), Curve); + cmsFreeToneCurve(Curve); + + return hProfile; +} + +// A gamma-3.0 gray space +static +cmsHPROFILE Create_Gray30(void) +{ + cmsHPROFILE hProfile; + cmsToneCurve* Curve = cmsBuildGamma(DbgThread(), 3.0); + if (Curve == NULL) return NULL; + + hProfile = cmsCreateGrayProfileTHR(DbgThread(), cmsD50_xyY(), Curve); + cmsFreeToneCurve(Curve); + + return hProfile; +} + + +static +cmsHPROFILE Create_GrayLab(void) +{ + cmsHPROFILE hProfile; + cmsToneCurve* Curve = cmsBuildGamma(DbgThread(), 1.0); + if (Curve == NULL) return NULL; + + hProfile = cmsCreateGrayProfileTHR(DbgThread(), cmsD50_xyY(), Curve); + cmsFreeToneCurve(Curve); + + cmsSetPCS(hProfile, cmsSigLabData); + return hProfile; +} + +// A CMYK devicelink that adds gamma 3.0 to each channel +static +cmsHPROFILE Create_CMYK_DeviceLink(void) +{ + cmsHPROFILE hProfile; + cmsToneCurve* Tab[4]; + cmsToneCurve* Curve = cmsBuildGamma(DbgThread(), 3.0); + if (Curve == NULL) return NULL; + + Tab[0] = Curve; + Tab[1] = Curve; + Tab[2] = Curve; + Tab[3] = Curve; + + hProfile = cmsCreateLinearizationDeviceLinkTHR(DbgThread(), cmsSigCmykData, Tab); + if (hProfile == NULL) return NULL; + + cmsFreeToneCurve(Curve); + + return hProfile; +} + + +// Create a fake CMYK profile, without any other requirement that being coarse CMYK. +// DON'T USE THIS PROFILE FOR ANYTHING, IT IS USELESS BUT FOR TESTING PURPOSES. +typedef struct { + + cmsHTRANSFORM hLab2sRGB; + cmsHTRANSFORM sRGB2Lab; + cmsHTRANSFORM hIlimit; + +} FakeCMYKParams; + +static +cmsFloat64Number Clip(cmsFloat64Number v) +{ + if (v < 0) return 0; + if (v > 1) return 1; + + return v; +} + +static +cmsInt32Number ForwardSampler(CMSREGISTER const cmsUInt16Number In[], cmsUInt16Number Out[], void* Cargo) +{ + FakeCMYKParams* p = (FakeCMYKParams*) Cargo; + cmsFloat64Number rgb[3], cmyk[4]; + cmsFloat64Number c, m, y, k; + + cmsDoTransform(p ->hLab2sRGB, In, rgb, 1); + + c = 1 - rgb[0]; + m = 1 - rgb[1]; + y = 1 - rgb[2]; + + k = (c < m ? cmsmin(c, y) : cmsmin(m, y)); + + // NONSENSE WARNING!: I'm doing this just because this is a test + // profile that may have ink limit up to 400%. There is no UCR here + // so the profile is basically useless for anything but testing. + + cmyk[0] = c; + cmyk[1] = m; + cmyk[2] = y; + cmyk[3] = k; + + cmsDoTransform(p ->hIlimit, cmyk, Out, 1); + + return 1; +} + + +static +cmsInt32Number ReverseSampler(CMSREGISTER const cmsUInt16Number In[], CMSREGISTER cmsUInt16Number Out[], CMSREGISTER void* Cargo) +{ + FakeCMYKParams* p = (FakeCMYKParams*) Cargo; + cmsFloat64Number c, m, y, k, rgb[3]; + + c = In[0] / 65535.0; + m = In[1] / 65535.0; + y = In[2] / 65535.0; + k = In[3] / 65535.0; + + if (k == 0) { + + rgb[0] = Clip(1 - c); + rgb[1] = Clip(1 - m); + rgb[2] = Clip(1 - y); + } + else + if (k == 1) { + + rgb[0] = rgb[1] = rgb[2] = 0; + } + else { + + rgb[0] = Clip((1 - c) * (1 - k)); + rgb[1] = Clip((1 - m) * (1 - k)); + rgb[2] = Clip((1 - y) * (1 - k)); + } + + cmsDoTransform(p ->sRGB2Lab, rgb, Out, 1); + return 1; +} + + + +static +cmsHPROFILE CreateFakeCMYK(cmsFloat64Number InkLimit, cmsBool lUseAboveRGB) +{ + cmsHPROFILE hICC; + cmsPipeline* AToB0, *BToA0; + cmsStage* CLUT; + cmsContext ContextID; + FakeCMYKParams p; + cmsHPROFILE hLab, hsRGB, hLimit; + cmsUInt32Number cmykfrm; + + + if (lUseAboveRGB) + hsRGB = Create_AboveRGB(); + else + hsRGB = cmsCreate_sRGBProfile(); + + hLab = cmsCreateLab4Profile(NULL); + hLimit = cmsCreateInkLimitingDeviceLink(cmsSigCmykData, InkLimit); + + cmykfrm = FLOAT_SH(1) | BYTES_SH(0)|CHANNELS_SH(4); + p.hLab2sRGB = cmsCreateTransform(hLab, TYPE_Lab_16, hsRGB, TYPE_RGB_DBL, INTENT_PERCEPTUAL, cmsFLAGS_NOOPTIMIZE|cmsFLAGS_NOCACHE); + p.sRGB2Lab = cmsCreateTransform(hsRGB, TYPE_RGB_DBL, hLab, TYPE_Lab_16, INTENT_PERCEPTUAL, cmsFLAGS_NOOPTIMIZE|cmsFLAGS_NOCACHE); + p.hIlimit = cmsCreateTransform(hLimit, cmykfrm, NULL, TYPE_CMYK_16, INTENT_PERCEPTUAL, cmsFLAGS_NOOPTIMIZE|cmsFLAGS_NOCACHE); + + cmsCloseProfile(hLab); cmsCloseProfile(hsRGB); cmsCloseProfile(hLimit); + + ContextID = DbgThread(); + hICC = cmsCreateProfilePlaceholder(ContextID); + if (!hICC) return NULL; + + cmsSetProfileVersion(hICC, 4.3); + + cmsSetDeviceClass(hICC, cmsSigOutputClass); + cmsSetColorSpace(hICC, cmsSigCmykData); + cmsSetPCS(hICC, cmsSigLabData); + + BToA0 = cmsPipelineAlloc(ContextID, 3, 4); + if (BToA0 == NULL) return 0; + CLUT = cmsStageAllocCLut16bit(ContextID, 17, 3, 4, NULL); + if (CLUT == NULL) return 0; + if (!cmsStageSampleCLut16bit(CLUT, ForwardSampler, &p, 0)) return 0; + + cmsPipelineInsertStage(BToA0, cmsAT_BEGIN, _cmsStageAllocIdentityCurves(ContextID, 3)); + cmsPipelineInsertStage(BToA0, cmsAT_END, CLUT); + cmsPipelineInsertStage(BToA0, cmsAT_END, _cmsStageAllocIdentityCurves(ContextID, 4)); + + if (!cmsWriteTag(hICC, cmsSigBToA0Tag, (void*) BToA0)) return 0; + cmsPipelineFree(BToA0); + + AToB0 = cmsPipelineAlloc(ContextID, 4, 3); + if (AToB0 == NULL) return 0; + CLUT = cmsStageAllocCLut16bit(ContextID, 17, 4, 3, NULL); + if (CLUT == NULL) return 0; + if (!cmsStageSampleCLut16bit(CLUT, ReverseSampler, &p, 0)) return 0; + + cmsPipelineInsertStage(AToB0, cmsAT_BEGIN, _cmsStageAllocIdentityCurves(ContextID, 4)); + cmsPipelineInsertStage(AToB0, cmsAT_END, CLUT); + cmsPipelineInsertStage(AToB0, cmsAT_END, _cmsStageAllocIdentityCurves(ContextID, 3)); + + if (!cmsWriteTag(hICC, cmsSigAToB0Tag, (void*) AToB0)) return 0; + cmsPipelineFree(AToB0); + + cmsDeleteTransform(p.hLab2sRGB); + cmsDeleteTransform(p.sRGB2Lab); + cmsDeleteTransform(p.hIlimit); + + cmsLinkTag(hICC, cmsSigAToB1Tag, cmsSigAToB0Tag); + cmsLinkTag(hICC, cmsSigAToB2Tag, cmsSigAToB0Tag); + cmsLinkTag(hICC, cmsSigBToA1Tag, cmsSigBToA0Tag); + cmsLinkTag(hICC, cmsSigBToA2Tag, cmsSigBToA0Tag); + + return hICC; +} + + +// Does create several profiles for latter use------------------------------------------------------------------------------------------------ + +static +cmsInt32Number OneVirtual(cmsHPROFILE h, const char* SubTestTxt, const char* FileName) +{ + SubTest(SubTestTxt); + if (h == NULL) return 0; + + if (!cmsSaveProfileToFile(h, FileName)) return 0; + cmsCloseProfile(h); + + h = cmsOpenProfileFromFile(FileName, "r"); + if (h == NULL) return 0; + + cmsCloseProfile(h); + return 1; +} + + + +// This test checks the ability of lcms2 to save its built-ins as valid profiles. +// It does not check the functionality of such profiles +static +cmsInt32Number CreateTestProfiles(void) +{ + cmsHPROFILE h; + + h = cmsCreate_sRGBProfileTHR(DbgThread()); + if (!OneVirtual(h, "sRGB profile", "sRGBlcms2.icc")) return 0; + + // ---- + + h = Create_AboveRGB(); + if (!OneVirtual(h, "aRGB profile", "aRGBlcms2.icc")) return 0; + + // ---- + + h = Create_Gray22(); + if (!OneVirtual(h, "Gray profile", "graylcms2.icc")) return 0; + + // ---- + + h = Create_Gray30(); + if (!OneVirtual(h, "Gray 3.0 profile", "gray3lcms2.icc")) return 0; + + // ---- + + h = Create_GrayLab(); + if (!OneVirtual(h, "Gray Lab profile", "glablcms2.icc")) return 0; + + // ---- + + h = Create_CMYK_DeviceLink(); + if (!OneVirtual(h, "Linearization profile", "linlcms2.icc")) return 0; + + // ------- + h = cmsCreateInkLimitingDeviceLinkTHR(DbgThread(), cmsSigCmykData, 150); + if (h == NULL) return 0; + if (!OneVirtual(h, "Ink-limiting profile", "limitlcms2.icc")) return 0; + + // ------ + + h = cmsCreateLab2ProfileTHR(DbgThread(), NULL); + if (!OneVirtual(h, "Lab 2 identity profile", "labv2lcms2.icc")) return 0; + + // ---- + + h = cmsCreateLab4ProfileTHR(DbgThread(), NULL); + if (!OneVirtual(h, "Lab 4 identity profile", "labv4lcms2.icc")) return 0; + + // ---- + + h = cmsCreateXYZProfileTHR(DbgThread()); + if (!OneVirtual(h, "XYZ identity profile", "xyzlcms2.icc")) return 0; + + // ---- + + h = cmsCreateNULLProfileTHR(DbgThread()); + if (!OneVirtual(h, "NULL profile", "nullcms2.icc")) return 0; + + // --- + + h = cmsCreateBCHSWabstractProfileTHR(DbgThread(), 17, 0, 0, 0, 0, 5000, 6000); + if (!OneVirtual(h, "BCHS profile", "bchslcms2.icc")) return 0; + + // --- + + h = CreateFakeCMYK(300, FALSE); + if (!OneVirtual(h, "Fake CMYK profile", "lcms2cmyk.icc")) return 0; + + // --- + + h = cmsCreateBCHSWabstractProfileTHR(DbgThread(), 17, 0, 1.2, 0, 3, 5000, 5000); + if (!OneVirtual(h, "Brightness", "brightness.icc")) return 0; + return 1; +} + +static +void RemoveTestProfiles(void) +{ + remove("sRGBlcms2.icc"); + remove("aRGBlcms2.icc"); + remove("graylcms2.icc"); + remove("gray3lcms2.icc"); + remove("linlcms2.icc"); + remove("limitlcms2.icc"); + remove("labv2lcms2.icc"); + remove("labv4lcms2.icc"); + remove("xyzlcms2.icc"); + remove("nullcms2.icc"); + remove("bchslcms2.icc"); + remove("lcms2cmyk.icc"); + remove("glablcms2.icc"); + remove("lcms2link.icc"); + remove("lcms2link2.icc"); + remove("brightness.icc"); +} + +// ------------------------------------------------------------------------------------------------- + +// Check the size of basic types. If this test fails, nothing is going to work anyway +static +cmsInt32Number CheckBaseTypes(void) +{ + // Ignore warnings about conditional expression +#ifdef _MSC_VER +#pragma warning(disable: 4127) +#endif + + if (sizeof(cmsUInt8Number) != 1) return 0; + if (sizeof(cmsInt8Number) != 1) return 0; + if (sizeof(cmsUInt16Number) != 2) return 0; + if (sizeof(cmsInt16Number) != 2) return 0; + if (sizeof(cmsUInt32Number) != 4) return 0; + if (sizeof(cmsInt32Number) != 4) return 0; + if (sizeof(cmsUInt64Number) != 8) return 0; + if (sizeof(cmsInt64Number) != 8) return 0; + if (sizeof(cmsFloat32Number) != 4) return 0; + if (sizeof(cmsFloat64Number) != 8) return 0; + if (sizeof(cmsSignature) != 4) return 0; + if (sizeof(cmsU8Fixed8Number) != 2) return 0; + if (sizeof(cmsS15Fixed16Number) != 4) return 0; + if (sizeof(cmsU16Fixed16Number) != 4) return 0; + + return 1; +} + +// ------------------------------------------------------------------------------------------------- + + +// Are we little or big endian? From Harbison&Steele. +static +cmsInt32Number CheckEndianness(void) +{ + cmsInt32Number BigEndian, IsOk; + union { + long l; + char c[sizeof (long)]; + } u; + + u.l = 1; + BigEndian = (u.c[sizeof (long) - 1] == 1); + +#ifdef CMS_USE_BIG_ENDIAN + IsOk = BigEndian; +#else + IsOk = !BigEndian; +#endif + + if (!IsOk) { + Die("\nOOOPPSS! You have CMS_USE_BIG_ENDIAN toggle misconfigured!\n\n" + "Please, edit lcms2.h and %s the CMS_USE_BIG_ENDIAN toggle.\n", BigEndian? "uncomment" : "comment"); + return 0; + } + + return 1; +} + +// Check quick floor +static +cmsInt32Number CheckQuickFloor(void) +{ + if ((_cmsQuickFloor(1.234) != 1) || + (_cmsQuickFloor(32767.234) != 32767) || + (_cmsQuickFloor(-1.234) != -2) || + (_cmsQuickFloor(-32767.1) != -32768)) { + + Die("\nOOOPPSS! _cmsQuickFloor() does not work as expected in your machine!\n\n" + "Please, edit lcms2.h and uncomment the CMS_DONT_USE_FAST_FLOOR toggle.\n"); + return 0; + + } + + return 1; +} + +// Quick floor restricted to word +static +cmsInt32Number CheckQuickFloorWord(void) +{ + cmsUInt32Number i; + + for (i=0; i < 65535; i++) { + + if (_cmsQuickFloorWord((cmsFloat64Number) i + 0.1234) != i) { + + Die("\nOOOPPSS! _cmsQuickFloorWord() does not work as expected in your machine!\n\n" + "Please, edit lcms2.h and uncomment the CMS_DONT_USE_FAST_FLOOR toggle.\n"); + return 0; + } + } + + return 1; +} + +// ------------------------------------------------------------------------------------------------- + +// Precision stuff. + +// On 15.16 fixed point, this is the maximum we can obtain. Remember ICC profiles have storage limits on this number +#define FIXED_PRECISION_15_16 (1.0 / 65535.0) + +// On 8.8 fixed point, that is the max we can obtain. +#define FIXED_PRECISION_8_8 (1.0 / 255.0) + +// On cmsFloat32Number type, this is the precision we expect +#define FLOAT_PRECISSION (0.00001) + +static cmsFloat64Number MaxErr; + +cmsBool IsGoodVal(const char *title, cmsFloat64Number in, cmsFloat64Number out, cmsFloat64Number max) +{ + cmsFloat64Number Err = fabs(in - out); + + if (Err > MaxErr) MaxErr = Err; + + if ((Err > max )) { + + Fail("(%s): Must be %f, But is %f ", title, in, out); + return FALSE; + } + + return TRUE; +} + + +cmsBool IsGoodFixed15_16(const char *title, cmsFloat64Number in, cmsFloat64Number out) +{ + return IsGoodVal(title, in, out, FIXED_PRECISION_15_16); +} + + +cmsBool IsGoodFixed8_8(const char *title, cmsFloat64Number in, cmsFloat64Number out) +{ + return IsGoodVal(title, in, out, FIXED_PRECISION_8_8); +} + +cmsBool IsGoodWord(const char *title, cmsUInt16Number in, cmsUInt16Number out) +{ + if ((abs(in - out) > 0 )) { + + Fail("(%s): Must be %x, But is %x ", title, in, out); + return FALSE; + } + + return TRUE; +} + +cmsBool IsGoodWordPrec(const char *title, cmsUInt16Number in, cmsUInt16Number out, cmsUInt16Number maxErr) +{ + if ((abs(in - out) > maxErr )) { + + Fail("(%s): Must be %x, But is %x ", title, in, out); + return FALSE; + } + + return TRUE; +} + +// Fixed point ---------------------------------------------------------------------------------------------- + +static +cmsInt32Number TestSingleFixed15_16(cmsFloat64Number d) +{ + cmsS15Fixed16Number f = _cmsDoubleTo15Fixed16(d); + cmsFloat64Number RoundTrip = _cms15Fixed16toDouble(f); + cmsFloat64Number Error = fabs(d - RoundTrip); + + return ( Error <= FIXED_PRECISION_15_16); +} + +static +cmsInt32Number CheckFixedPoint15_16(void) +{ + if (!TestSingleFixed15_16(1.0)) return 0; + if (!TestSingleFixed15_16(2.0)) return 0; + if (!TestSingleFixed15_16(1.23456)) return 0; + if (!TestSingleFixed15_16(0.99999)) return 0; + if (!TestSingleFixed15_16(0.1234567890123456789099999)) return 0; + if (!TestSingleFixed15_16(-1.0)) return 0; + if (!TestSingleFixed15_16(-2.0)) return 0; + if (!TestSingleFixed15_16(-1.23456)) return 0; + if (!TestSingleFixed15_16(-1.1234567890123456789099999)) return 0; + if (!TestSingleFixed15_16(+32767.1234567890123456789099999)) return 0; + if (!TestSingleFixed15_16(-32767.1234567890123456789099999)) return 0; + return 1; +} + +static +cmsInt32Number TestSingleFixed8_8(cmsFloat64Number d) +{ + cmsS15Fixed16Number f = _cmsDoubleTo8Fixed8(d); + cmsFloat64Number RoundTrip = _cms8Fixed8toDouble((cmsUInt16Number) f); + cmsFloat64Number Error = fabs(d - RoundTrip); + + return ( Error <= FIXED_PRECISION_8_8); +} + +static +cmsInt32Number CheckFixedPoint8_8(void) +{ + if (!TestSingleFixed8_8(1.0)) return 0; + if (!TestSingleFixed8_8(2.0)) return 0; + if (!TestSingleFixed8_8(1.23456)) return 0; + if (!TestSingleFixed8_8(0.99999)) return 0; + if (!TestSingleFixed8_8(0.1234567890123456789099999)) return 0; + if (!TestSingleFixed8_8(+255.1234567890123456789099999)) return 0; + + return 1; +} + +// D50 constant -------------------------------------------------------------------------------------------- + +static +cmsInt32Number CheckD50Roundtrip(void) +{ + cmsFloat64Number cmsD50X_2 = 0.96420288; + cmsFloat64Number cmsD50Y_2 = 1.0; + cmsFloat64Number cmsD50Z_2 = 0.82490540; + + cmsS15Fixed16Number xe = _cmsDoubleTo15Fixed16(cmsD50X); + cmsS15Fixed16Number ye = _cmsDoubleTo15Fixed16(cmsD50Y); + cmsS15Fixed16Number ze = _cmsDoubleTo15Fixed16(cmsD50Z); + + cmsFloat64Number x = _cms15Fixed16toDouble(xe); + cmsFloat64Number y = _cms15Fixed16toDouble(ye); + cmsFloat64Number z = _cms15Fixed16toDouble(ze); + + double dx = fabs(cmsD50X - x); + double dy = fabs(cmsD50Y - y); + double dz = fabs(cmsD50Z - z); + + double euc = sqrt(dx*dx + dy*dy + dz* dz); + + if (euc > 1E-5) { + + Fail("D50 roundtrip |err| > (%f) ", euc); + return 0; + } + + xe = _cmsDoubleTo15Fixed16(cmsD50X_2); + ye = _cmsDoubleTo15Fixed16(cmsD50Y_2); + ze = _cmsDoubleTo15Fixed16(cmsD50Z_2); + + x = _cms15Fixed16toDouble(xe); + y = _cms15Fixed16toDouble(ye); + z = _cms15Fixed16toDouble(ze); + + dx = fabs(cmsD50X_2 - x); + dy = fabs(cmsD50Y_2 - y); + dz = fabs(cmsD50Z_2 - z); + + euc = sqrt(dx*dx + dy*dy + dz* dz); + + if (euc > 1E-5) { + + Fail("D50 roundtrip |err| > (%f) ", euc); + return 0; + } + + + return 1; +} + +// Linear interpolation ----------------------------------------------------------------------------------------------- + +// Since prime factors of 65535 (FFFF) are, +// +// 0xFFFF = 3 * 5 * 17 * 257 +// +// I test tables of 2, 4, 6, and 18 points, that will be exact. + +static +void BuildTable(cmsInt32Number n, cmsUInt16Number Tab[], cmsBool Descending) +{ + cmsInt32Number i; + + for (i=0; i < n; i++) { + cmsFloat64Number v = (cmsFloat64Number) ((cmsFloat64Number) 65535.0 * i ) / (n-1); + + Tab[Descending ? (n - i - 1) : i ] = (cmsUInt16Number) floor(v + 0.5); + } +} + +// A single function that does check 1D interpolation +// nNodesToCheck = number on nodes to check +// Down = Create decreasing tables +// Reverse = Check reverse interpolation +// max_err = max allowed error + +static +cmsInt32Number Check1D(cmsInt32Number nNodesToCheck, cmsBool Down, cmsInt32Number max_err) +{ + cmsUInt32Number i; + cmsUInt16Number in, out; + cmsInterpParams* p; + cmsUInt16Number* Tab; + + Tab = (cmsUInt16Number*) chknull(malloc(sizeof(cmsUInt16Number)* nNodesToCheck)); + if (Tab == NULL) return 0; + + p = _cmsComputeInterpParams(DbgThread(), nNodesToCheck, 1, 1, Tab, CMS_LERP_FLAGS_16BITS); + if (p == NULL) return 0; + + BuildTable(nNodesToCheck, Tab, Down); + + for (i=0; i <= 0xffff; i++) { + + in = (cmsUInt16Number) i; + out = 0; + + p ->Interpolation.Lerp16(&in, &out, p); + + if (Down) out = 0xffff - out; + + if (abs(out - in) > max_err) { + + Fail("(%dp): Must be %x, But is %x : ", nNodesToCheck, in, out); + _cmsFreeInterpParams(p); + free(Tab); + return 0; + } + } + + _cmsFreeInterpParams(p); + free(Tab); + return 1; +} + + +static +cmsInt32Number Check1DLERP2(void) +{ + return Check1D(2, FALSE, 0); +} + + +static +cmsInt32Number Check1DLERP3(void) +{ + return Check1D(3, FALSE, 1); +} + + +static +cmsInt32Number Check1DLERP4(void) +{ + return Check1D(4, FALSE, 0); +} + +static +cmsInt32Number Check1DLERP6(void) +{ + return Check1D(6, FALSE, 0); +} + +static +cmsInt32Number Check1DLERP18(void) +{ + return Check1D(18, FALSE, 0); +} + + +static +cmsInt32Number Check1DLERP2Down(void) +{ + return Check1D(2, TRUE, 0); +} + + +static +cmsInt32Number Check1DLERP3Down(void) +{ + return Check1D(3, TRUE, 1); +} + +static +cmsInt32Number Check1DLERP6Down(void) +{ + return Check1D(6, TRUE, 0); +} + +static +cmsInt32Number Check1DLERP18Down(void) +{ + return Check1D(18, TRUE, 0); +} + +static +cmsInt32Number ExhaustiveCheck1DLERP(void) +{ + cmsUInt32Number j; + + printf("\n"); + for (j=10; j <= 4096; j++) { + + if ((j % 10) == 0) printf("%u \r", j); + + if (!Check1D(j, FALSE, 1)) return 0; + } + + printf("\rResult is "); + return 1; +} + +static +cmsInt32Number ExhaustiveCheck1DLERPDown(void) +{ + cmsUInt32Number j; + + printf("\n"); + for (j=10; j <= 4096; j++) { + + if ((j % 10) == 0) printf("%u \r", j); + + if (!Check1D(j, TRUE, 1)) return 0; + } + + + printf("\rResult is "); + return 1; +} + + + +// 3D interpolation ------------------------------------------------------------------------------------------------- + +static +cmsInt32Number Check3DinterpolationFloatTetrahedral(void) +{ + cmsInterpParams* p; + cmsInt32Number i; + cmsFloat32Number In[3], Out[3]; + cmsFloat32Number FloatTable[] = { //R G B + + 0, 0, 0, // B=0,G=0,R=0 + 0, 0, .25, // B=1,G=0,R=0 + + 0, .5, 0, // B=0,G=1,R=0 + 0, .5, .25, // B=1,G=1,R=0 + + 1, 0, 0, // B=0,G=0,R=1 + 1, 0, .25, // B=1,G=0,R=1 + + 1, .5, 0, // B=0,G=1,R=1 + 1, .5, .25 // B=1,G=1,R=1 + + }; + + p = _cmsComputeInterpParams(DbgThread(), 2, 3, 3, FloatTable, CMS_LERP_FLAGS_FLOAT); + + + MaxErr = 0.0; + for (i=0; i < 0xffff; i++) { + + In[0] = In[1] = In[2] = (cmsFloat32Number) ( (cmsFloat32Number) i / 65535.0F); + + p ->Interpolation.LerpFloat(In, Out, p); + + if (!IsGoodFixed15_16("Channel 1", Out[0], In[0])) goto Error; + if (!IsGoodFixed15_16("Channel 2", Out[1], (cmsFloat32Number) In[1] / 2.F)) goto Error; + if (!IsGoodFixed15_16("Channel 3", Out[2], (cmsFloat32Number) In[2] / 4.F)) goto Error; + } + + if (MaxErr > 0) printf("|Err|<%lf ", MaxErr); + _cmsFreeInterpParams(p); + return 1; + +Error: + _cmsFreeInterpParams(p); + return 0; +} + +static +cmsInt32Number Check3DinterpolationFloatTrilinear(void) +{ + cmsInterpParams* p; + cmsInt32Number i; + cmsFloat32Number In[3], Out[3]; + cmsFloat32Number FloatTable[] = { //R G B + + 0, 0, 0, // B=0,G=0,R=0 + 0, 0, .25, // B=1,G=0,R=0 + + 0, .5, 0, // B=0,G=1,R=0 + 0, .5, .25, // B=1,G=1,R=0 + + 1, 0, 0, // B=0,G=0,R=1 + 1, 0, .25, // B=1,G=0,R=1 + + 1, .5, 0, // B=0,G=1,R=1 + 1, .5, .25 // B=1,G=1,R=1 + + }; + + p = _cmsComputeInterpParams(DbgThread(), 2, 3, 3, FloatTable, CMS_LERP_FLAGS_FLOAT|CMS_LERP_FLAGS_TRILINEAR); + + MaxErr = 0.0; + for (i=0; i < 0xffff; i++) { + + In[0] = In[1] = In[2] = (cmsFloat32Number) ( (cmsFloat32Number) i / 65535.0F); + + p ->Interpolation.LerpFloat(In, Out, p); + + if (!IsGoodFixed15_16("Channel 1", Out[0], In[0])) goto Error; + if (!IsGoodFixed15_16("Channel 2", Out[1], (cmsFloat32Number) In[1] / 2.F)) goto Error; + if (!IsGoodFixed15_16("Channel 3", Out[2], (cmsFloat32Number) In[2] / 4.F)) goto Error; + } + + if (MaxErr > 0) printf("|Err|<%lf ", MaxErr); + _cmsFreeInterpParams(p); + return 1; + +Error: + _cmsFreeInterpParams(p); + return 0; + +} + +static +cmsInt32Number Check3DinterpolationTetrahedral16(void) +{ + cmsInterpParams* p; + cmsInt32Number i; + cmsUInt16Number In[3], Out[3]; + cmsUInt16Number Table[] = { + + 0, 0, 0, + 0, 0, 0xffff, + + 0, 0xffff, 0, + 0, 0xffff, 0xffff, + + 0xffff, 0, 0, + 0xffff, 0, 0xffff, + + 0xffff, 0xffff, 0, + 0xffff, 0xffff, 0xffff + }; + + p = _cmsComputeInterpParams(DbgThread(), 2, 3, 3, Table, CMS_LERP_FLAGS_16BITS); + + MaxErr = 0.0; + for (i=0; i < 0xffff; i++) { + + In[0] = In[1] = In[2] = (cmsUInt16Number) i; + + p ->Interpolation.Lerp16(In, Out, p); + + if (!IsGoodWord("Channel 1", Out[0], In[0])) goto Error; + if (!IsGoodWord("Channel 2", Out[1], In[1])) goto Error; + if (!IsGoodWord("Channel 3", Out[2], In[2])) goto Error; + } + + if (MaxErr > 0) printf("|Err|<%lf ", MaxErr); + _cmsFreeInterpParams(p); + return 1; + +Error: + _cmsFreeInterpParams(p); + return 0; +} + +static +cmsInt32Number Check3DinterpolationTrilinear16(void) +{ + cmsInterpParams* p; + cmsInt32Number i; + cmsUInt16Number In[3], Out[3]; + cmsUInt16Number Table[] = { + + 0, 0, 0, + 0, 0, 0xffff, + + 0, 0xffff, 0, + 0, 0xffff, 0xffff, + + 0xffff, 0, 0, + 0xffff, 0, 0xffff, + + 0xffff, 0xffff, 0, + 0xffff, 0xffff, 0xffff + }; + + p = _cmsComputeInterpParams(DbgThread(), 2, 3, 3, Table, CMS_LERP_FLAGS_TRILINEAR); + + MaxErr = 0.0; + for (i=0; i < 0xffff; i++) { + + In[0] = In[1] = In[2] = (cmsUInt16Number) i; + + p ->Interpolation.Lerp16(In, Out, p); + + if (!IsGoodWord("Channel 1", Out[0], In[0])) goto Error; + if (!IsGoodWord("Channel 2", Out[1], In[1])) goto Error; + if (!IsGoodWord("Channel 3", Out[2], In[2])) goto Error; + } + + if (MaxErr > 0) printf("|Err|<%lf ", MaxErr); + _cmsFreeInterpParams(p); + return 1; + +Error: + _cmsFreeInterpParams(p); + return 0; +} + + +static +cmsInt32Number ExaustiveCheck3DinterpolationFloatTetrahedral(void) +{ + cmsInterpParams* p; + cmsInt32Number r, g, b; + cmsFloat32Number In[3], Out[3]; + cmsFloat32Number FloatTable[] = { //R G B + + 0, 0, 0, // B=0,G=0,R=0 + 0, 0, .25, // B=1,G=0,R=0 + + 0, .5, 0, // B=0,G=1,R=0 + 0, .5, .25, // B=1,G=1,R=0 + + 1, 0, 0, // B=0,G=0,R=1 + 1, 0, .25, // B=1,G=0,R=1 + + 1, .5, 0, // B=0,G=1,R=1 + 1, .5, .25 // B=1,G=1,R=1 + + }; + + p = _cmsComputeInterpParams(DbgThread(), 2, 3, 3, FloatTable, CMS_LERP_FLAGS_FLOAT); + + MaxErr = 0.0; + for (r=0; r < 0xff; r++) + for (g=0; g < 0xff; g++) + for (b=0; b < 0xff; b++) + { + + In[0] = (cmsFloat32Number) r / 255.0F; + In[1] = (cmsFloat32Number) g / 255.0F; + In[2] = (cmsFloat32Number) b / 255.0F; + + + p ->Interpolation.LerpFloat(In, Out, p); + + if (!IsGoodFixed15_16("Channel 1", Out[0], In[0])) goto Error; + if (!IsGoodFixed15_16("Channel 2", Out[1], (cmsFloat32Number) In[1] / 2.F)) goto Error; + if (!IsGoodFixed15_16("Channel 3", Out[2], (cmsFloat32Number) In[2] / 4.F)) goto Error; + } + + if (MaxErr > 0) printf("|Err|<%lf ", MaxErr); + _cmsFreeInterpParams(p); + return 1; + +Error: + _cmsFreeInterpParams(p); + return 0; +} + +static +cmsInt32Number ExaustiveCheck3DinterpolationFloatTrilinear(void) +{ + cmsInterpParams* p; + cmsInt32Number r, g, b; + cmsFloat32Number In[3], Out[3]; + cmsFloat32Number FloatTable[] = { //R G B + + 0, 0, 0, // B=0,G=0,R=0 + 0, 0, .25, // B=1,G=0,R=0 + + 0, .5, 0, // B=0,G=1,R=0 + 0, .5, .25, // B=1,G=1,R=0 + + 1, 0, 0, // B=0,G=0,R=1 + 1, 0, .25, // B=1,G=0,R=1 + + 1, .5, 0, // B=0,G=1,R=1 + 1, .5, .25 // B=1,G=1,R=1 + + }; + + p = _cmsComputeInterpParams(DbgThread(), 2, 3, 3, FloatTable, CMS_LERP_FLAGS_FLOAT|CMS_LERP_FLAGS_TRILINEAR); + + MaxErr = 0.0; + for (r=0; r < 0xff; r++) + for (g=0; g < 0xff; g++) + for (b=0; b < 0xff; b++) + { + + In[0] = (cmsFloat32Number) r / 255.0F; + In[1] = (cmsFloat32Number) g / 255.0F; + In[2] = (cmsFloat32Number) b / 255.0F; + + + p ->Interpolation.LerpFloat(In, Out, p); + + if (!IsGoodFixed15_16("Channel 1", Out[0], In[0])) goto Error; + if (!IsGoodFixed15_16("Channel 2", Out[1], (cmsFloat32Number) In[1] / 2.F)) goto Error; + if (!IsGoodFixed15_16("Channel 3", Out[2], (cmsFloat32Number) In[2] / 4.F)) goto Error; + } + + if (MaxErr > 0) printf("|Err|<%lf ", MaxErr); + _cmsFreeInterpParams(p); + return 1; + +Error: + _cmsFreeInterpParams(p); + return 0; + +} + +static +cmsInt32Number ExhaustiveCheck3DinterpolationTetrahedral16(void) +{ + cmsInterpParams* p; + cmsInt32Number r, g, b; + cmsUInt16Number In[3], Out[3]; + cmsUInt16Number Table[] = { + + 0, 0, 0, + 0, 0, 0xffff, + + 0, 0xffff, 0, + 0, 0xffff, 0xffff, + + 0xffff, 0, 0, + 0xffff, 0, 0xffff, + + 0xffff, 0xffff, 0, + 0xffff, 0xffff, 0xffff + }; + + p = _cmsComputeInterpParams(DbgThread(), 2, 3, 3, Table, CMS_LERP_FLAGS_16BITS); + + for (r=0; r < 0xff; r++) + for (g=0; g < 0xff; g++) + for (b=0; b < 0xff; b++) + { + In[0] = (cmsUInt16Number) r ; + In[1] = (cmsUInt16Number) g ; + In[2] = (cmsUInt16Number) b ; + + + p ->Interpolation.Lerp16(In, Out, p); + + if (!IsGoodWord("Channel 1", Out[0], In[0])) goto Error; + if (!IsGoodWord("Channel 2", Out[1], In[1])) goto Error; + if (!IsGoodWord("Channel 3", Out[2], In[2])) goto Error; + } + + _cmsFreeInterpParams(p); + return 1; + +Error: + _cmsFreeInterpParams(p); + return 0; +} + +static +cmsInt32Number ExhaustiveCheck3DinterpolationTrilinear16(void) +{ + cmsInterpParams* p; + cmsInt32Number r, g, b; + cmsUInt16Number In[3], Out[3]; + cmsUInt16Number Table[] = { + + 0, 0, 0, + 0, 0, 0xffff, + + 0, 0xffff, 0, + 0, 0xffff, 0xffff, + + 0xffff, 0, 0, + 0xffff, 0, 0xffff, + + 0xffff, 0xffff, 0, + 0xffff, 0xffff, 0xffff + }; + + p = _cmsComputeInterpParams(DbgThread(), 2, 3, 3, Table, CMS_LERP_FLAGS_TRILINEAR); + + for (r=0; r < 0xff; r++) + for (g=0; g < 0xff; g++) + for (b=0; b < 0xff; b++) + { + In[0] = (cmsUInt16Number) r ; + In[1] = (cmsUInt16Number)g ; + In[2] = (cmsUInt16Number)b ; + + + p ->Interpolation.Lerp16(In, Out, p); + + if (!IsGoodWord("Channel 1", Out[0], In[0])) goto Error; + if (!IsGoodWord("Channel 2", Out[1], In[1])) goto Error; + if (!IsGoodWord("Channel 3", Out[2], In[2])) goto Error; + } + + + _cmsFreeInterpParams(p); + return 1; + +Error: + _cmsFreeInterpParams(p); + return 0; +} + +// Check reverse interpolation on LUTS. This is right now exclusively used by K preservation algorithm +static +cmsInt32Number CheckReverseInterpolation3x3(void) +{ + cmsPipeline* Lut; + cmsStage* clut; + cmsFloat32Number Target[4], Result[4], Hint[4]; + cmsFloat32Number err, max; + cmsInt32Number i; + cmsUInt16Number Table[] = { + + 0, 0, 0, // 0 0 0 + 0, 0, 0xffff, // 0 0 1 + + 0, 0xffff, 0, // 0 1 0 + 0, 0xffff, 0xffff, // 0 1 1 + + 0xffff, 0, 0, // 1 0 0 + 0xffff, 0, 0xffff, // 1 0 1 + + 0xffff, 0xffff, 0, // 1 1 0 + 0xffff, 0xffff, 0xffff, // 1 1 1 + }; + + + + Lut = cmsPipelineAlloc(DbgThread(), 3, 3); + + clut = cmsStageAllocCLut16bit(DbgThread(), 2, 3, 3, Table); + cmsPipelineInsertStage(Lut, cmsAT_BEGIN, clut); + + Target[0] = 0; Target[1] = 0; Target[2] = 0; + Hint[0] = 0; Hint[1] = 0; Hint[2] = 0; + cmsPipelineEvalReverseFloat(Target, Result, NULL, Lut); + if (Result[0] != 0 || Result[1] != 0 || Result[2] != 0){ + + Fail("Reverse interpolation didn't find zero"); + goto Error; + } + + // Transverse identity + max = 0; + for (i=0; i <= 100; i++) { + + cmsFloat32Number in = i / 100.0F; + + Target[0] = in; Target[1] = 0; Target[2] = 0; + cmsPipelineEvalReverseFloat(Target, Result, Hint, Lut); + + err = fabsf(in - Result[0]); + if (err > max) max = err; + + memcpy(Hint, Result, sizeof(Hint)); + } + + cmsPipelineFree(Lut); + return (max <= FLOAT_PRECISSION); + +Error: + cmsPipelineFree(Lut); + return 0; +} + + +static +cmsInt32Number CheckReverseInterpolation4x3(void) +{ + cmsPipeline* Lut; + cmsStage* clut; + cmsFloat32Number Target[4], Result[4], Hint[4]; + cmsFloat32Number err, max; + cmsInt32Number i; + + // 4 -> 3, output gets 3 first channels copied + cmsUInt16Number Table[] = { + + 0, 0, 0, // 0 0 0 0 = ( 0, 0, 0) + 0, 0, 0, // 0 0 0 1 = ( 0, 0, 0) + + 0, 0, 0xffff, // 0 0 1 0 = ( 0, 0, 1) + 0, 0, 0xffff, // 0 0 1 1 = ( 0, 0, 1) + + 0, 0xffff, 0, // 0 1 0 0 = ( 0, 1, 0) + 0, 0xffff, 0, // 0 1 0 1 = ( 0, 1, 0) + + 0, 0xffff, 0xffff, // 0 1 1 0 = ( 0, 1, 1) + 0, 0xffff, 0xffff, // 0 1 1 1 = ( 0, 1, 1) + + 0xffff, 0, 0, // 1 0 0 0 = ( 1, 0, 0) + 0xffff, 0, 0, // 1 0 0 1 = ( 1, 0, 0) + + 0xffff, 0, 0xffff, // 1 0 1 0 = ( 1, 0, 1) + 0xffff, 0, 0xffff, // 1 0 1 1 = ( 1, 0, 1) + + 0xffff, 0xffff, 0, // 1 1 0 0 = ( 1, 1, 0) + 0xffff, 0xffff, 0, // 1 1 0 1 = ( 1, 1, 0) + + 0xffff, 0xffff, 0xffff, // 1 1 1 0 = ( 1, 1, 1) + 0xffff, 0xffff, 0xffff, // 1 1 1 1 = ( 1, 1, 1) + }; + + + Lut = cmsPipelineAlloc(DbgThread(), 4, 3); + + clut = cmsStageAllocCLut16bit(DbgThread(), 2, 4, 3, Table); + cmsPipelineInsertStage(Lut, cmsAT_BEGIN, clut); + + // Check if the LUT is behaving as expected + SubTest("4->3 feasibility"); + for (i=0; i <= 100; i++) { + + Target[0] = i / 100.0F; + Target[1] = Target[0]; + Target[2] = 0; + Target[3] = 12; + + cmsPipelineEvalFloat(Target, Result, Lut); + + if (!IsGoodFixed15_16("0", Target[0], Result[0])) goto Error; + if (!IsGoodFixed15_16("1", Target[1], Result[1])) goto Error; + if (!IsGoodFixed15_16("2", Target[2], Result[2])) goto Error; + } + + SubTest("4->3 zero"); + Target[0] = 0; + Target[1] = 0; + Target[2] = 0; + + // This one holds the fixed K + Target[3] = 0; + + // This is our hint (which is a big lie in this case) + Hint[0] = 0.1F; Hint[1] = 0.1F; Hint[2] = 0.1F; + + cmsPipelineEvalReverseFloat(Target, Result, Hint, Lut); + + if (Result[0] != 0 || Result[1] != 0 || Result[2] != 0 || Result[3] != 0){ + + Fail("Reverse interpolation didn't find zero"); + goto Error; + } + + SubTest("4->3 find CMY"); + max = 0; + for (i=0; i <= 100; i++) { + + cmsFloat32Number in = i / 100.0F; + + Target[0] = in; Target[1] = 0; Target[2] = 0; + cmsPipelineEvalReverseFloat(Target, Result, Hint, Lut); + + err = fabsf(in - Result[0]); + if (err > max) max = err; + + memcpy(Hint, Result, sizeof(Hint)); + } + + cmsPipelineFree(Lut); + return (max <= FLOAT_PRECISSION); + +Error: + cmsPipelineFree(Lut); + return 0; +} + + + +// Check all interpolation. + +static +cmsUInt16Number Fn8D1(cmsUInt16Number a1, cmsUInt16Number a2, cmsUInt16Number a3, cmsUInt16Number a4, + cmsUInt16Number a5, cmsUInt16Number a6, cmsUInt16Number a7, cmsUInt16Number a8, + cmsUInt32Number m) +{ + return (cmsUInt16Number) ((a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8) / m); +} + + +static +cmsUInt16Number Fn8D2(cmsUInt16Number a1, cmsUInt16Number a2, cmsUInt16Number a3, cmsUInt16Number a4, + cmsUInt16Number a5, cmsUInt16Number a6, cmsUInt16Number a7, cmsUInt16Number a8, + cmsUInt32Number m) +{ + return (cmsUInt16Number) ((a1 + 3* a2 + 3* a3 + a4 + a5 + a6 + a7 + a8 ) / (m + 4)); +} + + +static +cmsUInt16Number Fn8D3(cmsUInt16Number a1, cmsUInt16Number a2, cmsUInt16Number a3, cmsUInt16Number a4, + cmsUInt16Number a5, cmsUInt16Number a6, cmsUInt16Number a7, cmsUInt16Number a8, + cmsUInt32Number m) +{ + return (cmsUInt16Number) ((3*a1 + 2*a2 + 3*a3 + a4 + a5 + a6 + a7 + a8) / (m + 5)); +} + + + + +static +cmsInt32Number Sampler3D(CMSREGISTER const cmsUInt16Number In[], + CMSREGISTER cmsUInt16Number Out[], + CMSREGISTER void * Cargo) +{ + + Out[0] = Fn8D1(In[0], In[1], In[2], 0, 0, 0, 0, 0, 3); + Out[1] = Fn8D2(In[0], In[1], In[2], 0, 0, 0, 0, 0, 3); + Out[2] = Fn8D3(In[0], In[1], In[2], 0, 0, 0, 0, 0, 3); + + return 1; + + cmsUNUSED_PARAMETER(Cargo); + +} + +static +cmsInt32Number Sampler4D(CMSREGISTER const cmsUInt16Number In[], + CMSREGISTER cmsUInt16Number Out[], + CMSREGISTER void * Cargo) +{ + + Out[0] = Fn8D1(In[0], In[1], In[2], In[3], 0, 0, 0, 0, 4); + Out[1] = Fn8D2(In[0], In[1], In[2], In[3], 0, 0, 0, 0, 4); + Out[2] = Fn8D3(In[0], In[1], In[2], In[3], 0, 0, 0, 0, 4); + + return 1; + + cmsUNUSED_PARAMETER(Cargo); +} + +static +cmsInt32Number Sampler5D(CMSREGISTER const cmsUInt16Number In[], + CMSREGISTER cmsUInt16Number Out[], + CMSREGISTER void * Cargo) +{ + + Out[0] = Fn8D1(In[0], In[1], In[2], In[3], In[4], 0, 0, 0, 5); + Out[1] = Fn8D2(In[0], In[1], In[2], In[3], In[4], 0, 0, 0, 5); + Out[2] = Fn8D3(In[0], In[1], In[2], In[3], In[4], 0, 0, 0, 5); + + return 1; + + cmsUNUSED_PARAMETER(Cargo); +} + +static +cmsInt32Number Sampler6D(CMSREGISTER const cmsUInt16Number In[], + CMSREGISTER cmsUInt16Number Out[], + CMSREGISTER void * Cargo) +{ + + Out[0] = Fn8D1(In[0], In[1], In[2], In[3], In[4], In[5], 0, 0, 6); + Out[1] = Fn8D2(In[0], In[1], In[2], In[3], In[4], In[5], 0, 0, 6); + Out[2] = Fn8D3(In[0], In[1], In[2], In[3], In[4], In[5], 0, 0, 6); + + return 1; + + cmsUNUSED_PARAMETER(Cargo); +} + +static +cmsInt32Number Sampler7D(CMSREGISTER const cmsUInt16Number In[], + CMSREGISTER cmsUInt16Number Out[], + CMSREGISTER void * Cargo) +{ + + Out[0] = Fn8D1(In[0], In[1], In[2], In[3], In[4], In[5], In[6], 0, 7); + Out[1] = Fn8D2(In[0], In[1], In[2], In[3], In[4], In[5], In[6], 0, 7); + Out[2] = Fn8D3(In[0], In[1], In[2], In[3], In[4], In[5], In[6], 0, 7); + + return 1; + + cmsUNUSED_PARAMETER(Cargo); +} + +static +cmsInt32Number Sampler8D(CMSREGISTER const cmsUInt16Number In[], + CMSREGISTER cmsUInt16Number Out[], + CMSREGISTER void * Cargo) +{ + + Out[0] = Fn8D1(In[0], In[1], In[2], In[3], In[4], In[5], In[6], In[7], 8); + Out[1] = Fn8D2(In[0], In[1], In[2], In[3], In[4], In[5], In[6], In[7], 8); + Out[2] = Fn8D3(In[0], In[1], In[2], In[3], In[4], In[5], In[6], In[7], 8); + + return 1; + + cmsUNUSED_PARAMETER(Cargo); +} + +static +cmsBool CheckOne3D(cmsPipeline* lut, cmsUInt16Number a1, cmsUInt16Number a2, cmsUInt16Number a3) +{ + cmsUInt16Number In[3], Out1[3], Out2[3]; + + In[0] = a1; In[1] = a2; In[2] = a3; + + // This is the interpolated value + cmsPipelineEval16(In, Out1, lut); + + // This is the real value + Sampler3D(In, Out2, NULL); + + // Let's see the difference + + if (!IsGoodWordPrec("Channel 1", Out1[0], Out2[0], 2)) return FALSE; + if (!IsGoodWordPrec("Channel 2", Out1[1], Out2[1], 2)) return FALSE; + if (!IsGoodWordPrec("Channel 3", Out1[2], Out2[2], 2)) return FALSE; + + return TRUE; +} + +static +cmsBool CheckOne4D(cmsPipeline* lut, cmsUInt16Number a1, cmsUInt16Number a2, cmsUInt16Number a3, cmsUInt16Number a4) +{ + cmsUInt16Number In[4], Out1[3], Out2[3]; + + In[0] = a1; In[1] = a2; In[2] = a3; In[3] = a4; + + // This is the interpolated value + cmsPipelineEval16(In, Out1, lut); + + // This is the real value + Sampler4D(In, Out2, NULL); + + // Let's see the difference + + if (!IsGoodWordPrec("Channel 1", Out1[0], Out2[0], 2)) return FALSE; + if (!IsGoodWordPrec("Channel 2", Out1[1], Out2[1], 2)) return FALSE; + if (!IsGoodWordPrec("Channel 3", Out1[2], Out2[2], 2)) return FALSE; + + return TRUE; +} + +static +cmsBool CheckOne5D(cmsPipeline* lut, cmsUInt16Number a1, cmsUInt16Number a2, + cmsUInt16Number a3, cmsUInt16Number a4, cmsUInt16Number a5) +{ + cmsUInt16Number In[5], Out1[3], Out2[3]; + + In[0] = a1; In[1] = a2; In[2] = a3; In[3] = a4; In[4] = a5; + + // This is the interpolated value + cmsPipelineEval16(In, Out1, lut); + + // This is the real value + Sampler5D(In, Out2, NULL); + + // Let's see the difference + + if (!IsGoodWordPrec("Channel 1", Out1[0], Out2[0], 2)) return FALSE; + if (!IsGoodWordPrec("Channel 2", Out1[1], Out2[1], 2)) return FALSE; + if (!IsGoodWordPrec("Channel 3", Out1[2], Out2[2], 2)) return FALSE; + + return TRUE; +} + +static +cmsBool CheckOne6D(cmsPipeline* lut, cmsUInt16Number a1, cmsUInt16Number a2, + cmsUInt16Number a3, cmsUInt16Number a4, + cmsUInt16Number a5, cmsUInt16Number a6) +{ + cmsUInt16Number In[6], Out1[3], Out2[3]; + + In[0] = a1; In[1] = a2; In[2] = a3; In[3] = a4; In[4] = a5; In[5] = a6; + + // This is the interpolated value + cmsPipelineEval16(In, Out1, lut); + + // This is the real value + Sampler6D(In, Out2, NULL); + + // Let's see the difference + + if (!IsGoodWordPrec("Channel 1", Out1[0], Out2[0], 2)) return FALSE; + if (!IsGoodWordPrec("Channel 2", Out1[1], Out2[1], 2)) return FALSE; + if (!IsGoodWordPrec("Channel 3", Out1[2], Out2[2], 2)) return FALSE; + + return TRUE; +} + + +static +cmsBool CheckOne7D(cmsPipeline* lut, cmsUInt16Number a1, cmsUInt16Number a2, + cmsUInt16Number a3, cmsUInt16Number a4, + cmsUInt16Number a5, cmsUInt16Number a6, + cmsUInt16Number a7) +{ + cmsUInt16Number In[7], Out1[3], Out2[3]; + + In[0] = a1; In[1] = a2; In[2] = a3; In[3] = a4; In[4] = a5; In[5] = a6; In[6] = a7; + + // This is the interpolated value + cmsPipelineEval16(In, Out1, lut); + + // This is the real value + Sampler7D(In, Out2, NULL); + + // Let's see the difference + + if (!IsGoodWordPrec("Channel 1", Out1[0], Out2[0], 2)) return FALSE; + if (!IsGoodWordPrec("Channel 2", Out1[1], Out2[1], 2)) return FALSE; + if (!IsGoodWordPrec("Channel 3", Out1[2], Out2[2], 2)) return FALSE; + + return TRUE; +} + + +static +cmsBool CheckOne8D(cmsPipeline* lut, cmsUInt16Number a1, cmsUInt16Number a2, + cmsUInt16Number a3, cmsUInt16Number a4, + cmsUInt16Number a5, cmsUInt16Number a6, + cmsUInt16Number a7, cmsUInt16Number a8) +{ + cmsUInt16Number In[8], Out1[3], Out2[3]; + + In[0] = a1; In[1] = a2; In[2] = a3; In[3] = a4; In[4] = a5; In[5] = a6; In[6] = a7; In[7] = a8; + + // This is the interpolated value + cmsPipelineEval16(In, Out1, lut); + + // This is the real value + Sampler8D(In, Out2, NULL); + + // Let's see the difference + + if (!IsGoodWordPrec("Channel 1", Out1[0], Out2[0], 2)) return FALSE; + if (!IsGoodWordPrec("Channel 2", Out1[1], Out2[1], 2)) return FALSE; + if (!IsGoodWordPrec("Channel 3", Out1[2], Out2[2], 2)) return FALSE; + + return TRUE; +} + + +static +cmsInt32Number Check3Dinterp(void) +{ + cmsPipeline* lut; + cmsStage* mpe; + + lut = cmsPipelineAlloc(DbgThread(), 3, 3); + mpe = cmsStageAllocCLut16bit(DbgThread(), 9, 3, 3, NULL); + cmsStageSampleCLut16bit(mpe, Sampler3D, NULL, 0); + cmsPipelineInsertStage(lut, cmsAT_BEGIN, mpe); + + // Check accuracy + + if (!CheckOne3D(lut, 0, 0, 0)) return 0; + if (!CheckOne3D(lut, 0xffff, 0xffff, 0xffff)) return 0; + + if (!CheckOne3D(lut, 0x8080, 0x8080, 0x8080)) return 0; + if (!CheckOne3D(lut, 0x0000, 0xFE00, 0x80FF)) return 0; + if (!CheckOne3D(lut, 0x1111, 0x2222, 0x3333)) return 0; + if (!CheckOne3D(lut, 0x0000, 0x0012, 0x0013)) return 0; + if (!CheckOne3D(lut, 0x3141, 0x1415, 0x1592)) return 0; + if (!CheckOne3D(lut, 0xFF00, 0xFF01, 0xFF12)) return 0; + + cmsPipelineFree(lut); + + return 1; +} + +static +cmsInt32Number Check3DinterpGranular(void) +{ + cmsPipeline* lut; + cmsStage* mpe; + cmsUInt32Number Dimensions[] = { 7, 8, 9 }; + + lut = cmsPipelineAlloc(DbgThread(), 3, 3); + mpe = cmsStageAllocCLut16bitGranular(DbgThread(), Dimensions, 3, 3, NULL); + cmsStageSampleCLut16bit(mpe, Sampler3D, NULL, 0); + cmsPipelineInsertStage(lut, cmsAT_BEGIN, mpe); + + // Check accuracy + + if (!CheckOne3D(lut, 0, 0, 0)) return 0; + if (!CheckOne3D(lut, 0xffff, 0xffff, 0xffff)) return 0; + + if (!CheckOne3D(lut, 0x8080, 0x8080, 0x8080)) return 0; + if (!CheckOne3D(lut, 0x0000, 0xFE00, 0x80FF)) return 0; + if (!CheckOne3D(lut, 0x1111, 0x2222, 0x3333)) return 0; + if (!CheckOne3D(lut, 0x0000, 0x0012, 0x0013)) return 0; + if (!CheckOne3D(lut, 0x3141, 0x1415, 0x1592)) return 0; + if (!CheckOne3D(lut, 0xFF00, 0xFF01, 0xFF12)) return 0; + + cmsPipelineFree(lut); + + return 1; +} + + +static +cmsInt32Number Check4Dinterp(void) +{ + cmsPipeline* lut; + cmsStage* mpe; + + lut = cmsPipelineAlloc(DbgThread(), 4, 3); + mpe = cmsStageAllocCLut16bit(DbgThread(), 9, 4, 3, NULL); + cmsStageSampleCLut16bit(mpe, Sampler4D, NULL, 0); + cmsPipelineInsertStage(lut, cmsAT_BEGIN, mpe); + + // Check accuracy + + if (!CheckOne4D(lut, 0, 0, 0, 0)) return 0; + if (!CheckOne4D(lut, 0xffff, 0xffff, 0xffff, 0xffff)) return 0; + + if (!CheckOne4D(lut, 0x8080, 0x8080, 0x8080, 0x8080)) return 0; + if (!CheckOne4D(lut, 0x0000, 0xFE00, 0x80FF, 0x8888)) return 0; + if (!CheckOne4D(lut, 0x1111, 0x2222, 0x3333, 0x4444)) return 0; + if (!CheckOne4D(lut, 0x0000, 0x0012, 0x0013, 0x0014)) return 0; + if (!CheckOne4D(lut, 0x3141, 0x1415, 0x1592, 0x9261)) return 0; + if (!CheckOne4D(lut, 0xFF00, 0xFF01, 0xFF12, 0xFF13)) return 0; + + cmsPipelineFree(lut); + + return 1; +} + + + +static +cmsInt32Number Check4DinterpGranular(void) +{ + cmsPipeline* lut; + cmsStage* mpe; + cmsUInt32Number Dimensions[] = { 9, 8, 7, 6 }; + + lut = cmsPipelineAlloc(DbgThread(), 4, 3); + mpe = cmsStageAllocCLut16bitGranular(DbgThread(), Dimensions, 4, 3, NULL); + cmsStageSampleCLut16bit(mpe, Sampler4D, NULL, 0); + cmsPipelineInsertStage(lut, cmsAT_BEGIN, mpe); + + // Check accuracy + + if (!CheckOne4D(lut, 0, 0, 0, 0)) return 0; + if (!CheckOne4D(lut, 0xffff, 0xffff, 0xffff, 0xffff)) return 0; + + if (!CheckOne4D(lut, 0x8080, 0x8080, 0x8080, 0x8080)) return 0; + if (!CheckOne4D(lut, 0x0000, 0xFE00, 0x80FF, 0x8888)) return 0; + if (!CheckOne4D(lut, 0x1111, 0x2222, 0x3333, 0x4444)) return 0; + if (!CheckOne4D(lut, 0x0000, 0x0012, 0x0013, 0x0014)) return 0; + if (!CheckOne4D(lut, 0x3141, 0x1415, 0x1592, 0x9261)) return 0; + if (!CheckOne4D(lut, 0xFF00, 0xFF01, 0xFF12, 0xFF13)) return 0; + + cmsPipelineFree(lut); + + return 1; +} + + +static +cmsInt32Number Check5DinterpGranular(void) +{ + cmsPipeline* lut; + cmsStage* mpe; + cmsUInt32Number Dimensions[] = { 3, 2, 2, 2, 2 }; + + lut = cmsPipelineAlloc(DbgThread(), 5, 3); + mpe = cmsStageAllocCLut16bitGranular(DbgThread(), Dimensions, 5, 3, NULL); + cmsStageSampleCLut16bit(mpe, Sampler5D, NULL, 0); + cmsPipelineInsertStage(lut, cmsAT_BEGIN, mpe); + + // Check accuracy + + if (!CheckOne5D(lut, 0, 0, 0, 0, 0)) return 0; + if (!CheckOne5D(lut, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff)) return 0; + + if (!CheckOne5D(lut, 0x8080, 0x8080, 0x8080, 0x8080, 0x1234)) return 0; + if (!CheckOne5D(lut, 0x0000, 0xFE00, 0x80FF, 0x8888, 0x8078)) return 0; + if (!CheckOne5D(lut, 0x1111, 0x2222, 0x3333, 0x4444, 0x1455)) return 0; + if (!CheckOne5D(lut, 0x0000, 0x0012, 0x0013, 0x0014, 0x2333)) return 0; + if (!CheckOne5D(lut, 0x3141, 0x1415, 0x1592, 0x9261, 0x4567)) return 0; + if (!CheckOne5D(lut, 0xFF00, 0xFF01, 0xFF12, 0xFF13, 0xF344)) return 0; + + cmsPipelineFree(lut); + + return 1; +} + +static +cmsInt32Number Check6DinterpGranular(void) +{ + cmsPipeline* lut; + cmsStage* mpe; + cmsUInt32Number Dimensions[] = { 4, 3, 3, 2, 2, 2 }; + + lut = cmsPipelineAlloc(DbgThread(), 6, 3); + mpe = cmsStageAllocCLut16bitGranular(DbgThread(), Dimensions, 6, 3, NULL); + cmsStageSampleCLut16bit(mpe, Sampler6D, NULL, 0); + cmsPipelineInsertStage(lut, cmsAT_BEGIN, mpe); + + // Check accuracy + + if (!CheckOne6D(lut, 0, 0, 0, 0, 0, 0)) return 0; + if (!CheckOne6D(lut, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff)) return 0; + + if (!CheckOne6D(lut, 0x8080, 0x8080, 0x8080, 0x8080, 0x1234, 0x1122)) return 0; + if (!CheckOne6D(lut, 0x0000, 0xFE00, 0x80FF, 0x8888, 0x8078, 0x2233)) return 0; + if (!CheckOne6D(lut, 0x1111, 0x2222, 0x3333, 0x4444, 0x1455, 0x3344)) return 0; + if (!CheckOne6D(lut, 0x0000, 0x0012, 0x0013, 0x0014, 0x2333, 0x4455)) return 0; + if (!CheckOne6D(lut, 0x3141, 0x1415, 0x1592, 0x9261, 0x4567, 0x5566)) return 0; + if (!CheckOne6D(lut, 0xFF00, 0xFF01, 0xFF12, 0xFF13, 0xF344, 0x6677)) return 0; + + cmsPipelineFree(lut); + + return 1; +} + +static +cmsInt32Number Check7DinterpGranular(void) +{ + cmsPipeline* lut; + cmsStage* mpe; + cmsUInt32Number Dimensions[] = { 4, 3, 3, 2, 2, 2, 2 }; + + lut = cmsPipelineAlloc(DbgThread(), 7, 3); + mpe = cmsStageAllocCLut16bitGranular(DbgThread(), Dimensions, 7, 3, NULL); + cmsStageSampleCLut16bit(mpe, Sampler7D, NULL, 0); + cmsPipelineInsertStage(lut, cmsAT_BEGIN, mpe); + + // Check accuracy + + if (!CheckOne7D(lut, 0, 0, 0, 0, 0, 0, 0)) return 0; + if (!CheckOne7D(lut, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff)) return 0; + + if (!CheckOne7D(lut, 0x8080, 0x8080, 0x8080, 0x8080, 0x1234, 0x1122, 0x0056)) return 0; + if (!CheckOne7D(lut, 0x0000, 0xFE00, 0x80FF, 0x8888, 0x8078, 0x2233, 0x0088)) return 0; + if (!CheckOne7D(lut, 0x1111, 0x2222, 0x3333, 0x4444, 0x1455, 0x3344, 0x1987)) return 0; + if (!CheckOne7D(lut, 0x0000, 0x0012, 0x0013, 0x0014, 0x2333, 0x4455, 0x9988)) return 0; + if (!CheckOne7D(lut, 0x3141, 0x1415, 0x1592, 0x9261, 0x4567, 0x5566, 0xfe56)) return 0; + if (!CheckOne7D(lut, 0xFF00, 0xFF01, 0xFF12, 0xFF13, 0xF344, 0x6677, 0xbabe)) return 0; + + cmsPipelineFree(lut); + + return 1; +} + + +static +cmsInt32Number Check8DinterpGranular(void) +{ + cmsPipeline* lut; + cmsStage* mpe; + cmsUInt32Number Dimensions[] = { 4, 3, 3, 2, 2, 2, 2, 2 }; + + lut = cmsPipelineAlloc(DbgThread(), 8, 3); + mpe = cmsStageAllocCLut16bitGranular(DbgThread(), Dimensions, 8, 3, NULL); + cmsStageSampleCLut16bit(mpe, Sampler8D, NULL, 0); + cmsPipelineInsertStage(lut, cmsAT_BEGIN, mpe); + + // Check accuracy + + if (!CheckOne8D(lut, 0, 0, 0, 0, 0, 0, 0, 0)) return 0; + if (!CheckOne8D(lut, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff)) return 0; + + if (!CheckOne8D(lut, 0x8080, 0x8080, 0x8080, 0x8080, 0x1234, 0x1122, 0x0056, 0x0011)) return 0; + if (!CheckOne8D(lut, 0x0000, 0xFE00, 0x80FF, 0x8888, 0x8078, 0x2233, 0x0088, 0x2020)) return 0; + if (!CheckOne8D(lut, 0x1111, 0x2222, 0x3333, 0x4444, 0x1455, 0x3344, 0x1987, 0x4532)) return 0; + if (!CheckOne8D(lut, 0x0000, 0x0012, 0x0013, 0x0014, 0x2333, 0x4455, 0x9988, 0x1200)) return 0; + if (!CheckOne8D(lut, 0x3141, 0x1415, 0x1592, 0x9261, 0x4567, 0x5566, 0xfe56, 0x6666)) return 0; + if (!CheckOne8D(lut, 0xFF00, 0xFF01, 0xFF12, 0xFF13, 0xF344, 0x6677, 0xbabe, 0xface)) return 0; + + cmsPipelineFree(lut); + + return 1; +} + +// Colorimetric conversions ------------------------------------------------------------------------------------------------- + +// Lab to LCh and back should be performed at 1E-12 accuracy at least +static +cmsInt32Number CheckLab2LCh(void) +{ + cmsInt32Number l, a, b; + cmsFloat64Number dist, Max = 0; + cmsCIELab Lab, Lab2; + cmsCIELCh LCh; + + for (l=0; l <= 100; l += 10) { + + for (a=-128; a <= +128; a += 8) { + + for (b=-128; b <= 128; b += 8) { + + Lab.L = l; + Lab.a = a; + Lab.b = b; + + cmsLab2LCh(&LCh, &Lab); + cmsLCh2Lab(&Lab2, &LCh); + + dist = cmsDeltaE(&Lab, &Lab2); + if (dist > Max) Max = dist; + } + } + } + + return Max < 1E-12; +} + +// Lab to LCh and back should be performed at 1E-12 accuracy at least +static +cmsInt32Number CheckLab2XYZ(void) +{ + cmsInt32Number l, a, b; + cmsFloat64Number dist, Max = 0; + cmsCIELab Lab, Lab2; + cmsCIEXYZ XYZ; + + for (l=0; l <= 100; l += 10) { + + for (a=-128; a <= +128; a += 8) { + + for (b=-128; b <= 128; b += 8) { + + Lab.L = l; + Lab.a = a; + Lab.b = b; + + cmsLab2XYZ(NULL, &XYZ, &Lab); + cmsXYZ2Lab(NULL, &Lab2, &XYZ); + + dist = cmsDeltaE(&Lab, &Lab2); + if (dist > Max) Max = dist; + + } + } + } + + return Max < 1E-12; +} + +// Lab to xyY and back should be performed at 1E-12 accuracy at least +static +cmsInt32Number CheckLab2xyY(void) +{ + cmsInt32Number l, a, b; + cmsFloat64Number dist, Max = 0; + cmsCIELab Lab, Lab2; + cmsCIEXYZ XYZ; + cmsCIExyY xyY; + + for (l=0; l <= 100; l += 10) { + + for (a=-128; a <= +128; a += 8) { + + for (b=-128; b <= 128; b += 8) { + + Lab.L = l; + Lab.a = a; + Lab.b = b; + + cmsLab2XYZ(NULL, &XYZ, &Lab); + cmsXYZ2xyY(&xyY, &XYZ); + cmsxyY2XYZ(&XYZ, &xyY); + cmsXYZ2Lab(NULL, &Lab2, &XYZ); + + dist = cmsDeltaE(&Lab, &Lab2); + if (dist > Max) Max = dist; + + } + } + } + + return Max < 1E-12; +} + + +static +cmsInt32Number CheckLabV2encoding(void) +{ + cmsInt32Number n2, i, j; + cmsUInt16Number Inw[3], aw[3]; + cmsCIELab Lab; + + n2=0; + + for (j=0; j < 65535; j++) { + + Inw[0] = Inw[1] = Inw[2] = (cmsUInt16Number) j; + + cmsLabEncoded2FloatV2(&Lab, Inw); + cmsFloat2LabEncodedV2(aw, &Lab); + + for (i=0; i < 3; i++) { + + if (aw[i] != j) { + n2++; + } + } + + } + + return (n2 == 0); +} + +static +cmsInt32Number CheckLabV4encoding(void) +{ + cmsInt32Number n2, i, j; + cmsUInt16Number Inw[3], aw[3]; + cmsCIELab Lab; + + n2=0; + + for (j=0; j < 65535; j++) { + + Inw[0] = Inw[1] = Inw[2] = (cmsUInt16Number) j; + + cmsLabEncoded2Float(&Lab, Inw); + cmsFloat2LabEncoded(aw, &Lab); + + for (i=0; i < 3; i++) { + + if (aw[i] != j) { + n2++; + } + } + + } + + return (n2 == 0); +} + + +// BlackBody ----------------------------------------------------------------------------------------------------- + +static +cmsInt32Number CheckTemp2CHRM(void) +{ + cmsInt32Number j; + cmsFloat64Number d, v, Max = 0; + cmsCIExyY White; + + for (j=4000; j < 25000; j++) { + + cmsWhitePointFromTemp(&White, j); + if (!cmsTempFromWhitePoint(&v, &White)) return 0; + + d = fabs(v - j); + if (d > Max) Max = d; + } + + // 100 degree is the actual resolution + return (Max < 100); +} + + + +// Tone curves ----------------------------------------------------------------------------------------------------- + +static +cmsInt32Number CheckGammaEstimation(cmsToneCurve* c, cmsFloat64Number g) +{ + cmsFloat64Number est = cmsEstimateGamma(c, 0.001); + + SubTest("Gamma estimation"); + if (fabs(est - g) > 0.001) return 0; + return 1; +} + +static +cmsInt32Number CheckGammaCreation16(void) +{ + cmsToneCurve* LinGamma = cmsBuildGamma(DbgThread(), 1.0); + cmsInt32Number i; + cmsUInt16Number in, out; + + for (i=0; i < 0xffff; i++) { + + in = (cmsUInt16Number) i; + out = cmsEvalToneCurve16(LinGamma, in); + if (in != out) { + Fail("(lin gamma): Must be %x, But is %x : ", in, out); + cmsFreeToneCurve(LinGamma); + return 0; + } + } + + if (!CheckGammaEstimation(LinGamma, 1.0)) return 0; + + cmsFreeToneCurve(LinGamma); + return 1; + +} + +static +cmsInt32Number CheckGammaCreationFlt(void) +{ + cmsToneCurve* LinGamma = cmsBuildGamma(DbgThread(), 1.0); + cmsInt32Number i; + cmsFloat32Number in, out; + + for (i=0; i < 0xffff; i++) { + + in = (cmsFloat32Number) (i / 65535.0); + out = cmsEvalToneCurveFloat(LinGamma, in); + if (fabs(in - out) > (1/65535.0)) { + Fail("(lin gamma): Must be %f, But is %f : ", in, out); + cmsFreeToneCurve(LinGamma); + return 0; + } + } + + if (!CheckGammaEstimation(LinGamma, 1.0)) return 0; + cmsFreeToneCurve(LinGamma); + return 1; +} + +// Curve curves using a single power function +// Error is given in 0..ffff counts +static +cmsInt32Number CheckGammaFloat(cmsFloat64Number g) +{ + cmsToneCurve* Curve = cmsBuildGamma(DbgThread(), g); + cmsInt32Number i; + cmsFloat32Number in, out; + cmsFloat64Number val, Err; + + MaxErr = 0.0; + for (i=0; i < 0xffff; i++) { + + in = (cmsFloat32Number) (i / 65535.0); + out = cmsEvalToneCurveFloat(Curve, in); + val = pow((cmsFloat64Number) in, g); + + Err = fabs( val - out); + if (Err > MaxErr) MaxErr = Err; + } + + if (MaxErr > 0) printf("|Err|<%lf ", MaxErr * 65535.0); + + if (!CheckGammaEstimation(Curve, g)) return 0; + + cmsFreeToneCurve(Curve); + return 1; +} + +static cmsInt32Number CheckGamma18(void) +{ + return CheckGammaFloat(1.8); +} + +static cmsInt32Number CheckGamma22(void) +{ + return CheckGammaFloat(2.2); +} + +static cmsInt32Number CheckGamma30(void) +{ + return CheckGammaFloat(3.0); +} + + +// Check table-based gamma functions +static +cmsInt32Number CheckGammaFloatTable(cmsFloat64Number g) +{ + cmsFloat32Number Values[1025]; + cmsToneCurve* Curve; + cmsInt32Number i; + cmsFloat32Number in, out; + cmsFloat64Number val, Err; + + for (i=0; i <= 1024; i++) { + + in = (cmsFloat32Number) (i / 1024.0); + Values[i] = powf(in, (float) g); + } + + Curve = cmsBuildTabulatedToneCurveFloat(DbgThread(), 1025, Values); + + MaxErr = 0.0; + for (i=0; i <= 0xffff; i++) { + + in = (cmsFloat32Number) (i / 65535.0); + out = cmsEvalToneCurveFloat(Curve, in); + val = pow(in, g); + + Err = fabs(val - out); + if (Err > MaxErr) MaxErr = Err; + } + + if (MaxErr > 0) printf("|Err|<%lf ", MaxErr * 65535.0); + + if (!CheckGammaEstimation(Curve, g)) return 0; + + cmsFreeToneCurve(Curve); + return 1; +} + + +static cmsInt32Number CheckGamma18Table(void) +{ + return CheckGammaFloatTable(1.8); +} + +static cmsInt32Number CheckGamma22Table(void) +{ + return CheckGammaFloatTable(2.2); +} + +static cmsInt32Number CheckGamma30Table(void) +{ + return CheckGammaFloatTable(3.0); +} + +// Create a curve from a table (which is a pure gamma function) and check it against the pow function. +static +cmsInt32Number CheckGammaWordTable(cmsFloat64Number g) +{ + cmsUInt16Number Values[1025]; + cmsToneCurve* Curve; + cmsInt32Number i; + cmsFloat32Number in, out; + cmsFloat64Number val, Err; + + for (i=0; i <= 1024; i++) { + + in = (cmsFloat32Number) (i / 1024.0); + Values[i] = (cmsUInt16Number) floor(pow(in, g) * 65535.0 + 0.5); + } + + Curve = cmsBuildTabulatedToneCurve16(DbgThread(), 1025, Values); + + MaxErr = 0.0; + for (i=0; i <= 0xffff; i++) { + + in = (cmsFloat32Number) (i / 65535.0); + out = cmsEvalToneCurveFloat(Curve, in); + val = pow(in, g); + + Err = fabs(val - out); + if (Err > MaxErr) MaxErr = Err; + } + + if (MaxErr > 0) printf("|Err|<%lf ", MaxErr * 65535.0); + + if (!CheckGammaEstimation(Curve, g)) return 0; + + cmsFreeToneCurve(Curve); + return 1; +} + +static cmsInt32Number CheckGamma18TableWord(void) +{ + return CheckGammaWordTable(1.8); +} + +static cmsInt32Number CheckGamma22TableWord(void) +{ + return CheckGammaWordTable(2.2); +} + +static cmsInt32Number CheckGamma30TableWord(void) +{ + return CheckGammaWordTable(3.0); +} + + +// Curve joining test. Joining two high-gamma of 3.0 curves should +// give something like linear +static +cmsInt32Number CheckJointCurves(void) +{ + cmsToneCurve *Forward, *Reverse, *Result; + cmsBool rc; + + Forward = cmsBuildGamma(DbgThread(), 3.0); + Reverse = cmsBuildGamma(DbgThread(), 3.0); + + Result = cmsJoinToneCurve(DbgThread(), Forward, Reverse, 256); + + cmsFreeToneCurve(Forward); cmsFreeToneCurve(Reverse); + + rc = cmsIsToneCurveLinear(Result); + cmsFreeToneCurve(Result); + + if (!rc) + Fail("Joining same curve twice does not result in a linear ramp"); + + return rc; +} + + +#if 0 +// Create a gamma curve by cheating the table +static +cmsToneCurve* GammaTableLinear(cmsInt32Number nEntries, cmsBool Dir) +{ + cmsInt32Number i; + cmsToneCurve* g = cmsBuildTabulatedToneCurve16(DbgThread(), nEntries, NULL); + + for (i=0; i < nEntries; i++) { + + cmsInt32Number v = _cmsQuantizeVal(i, nEntries); + + if (Dir) + g->Table16[i] = (cmsUInt16Number) v; + else + g->Table16[i] = (cmsUInt16Number) (0xFFFF - v); + } + + return g; +} +#endif + + +static +cmsInt32Number CheckJointCurvesDescending(void) +{ + cmsToneCurve *Forward, *Reverse, *Result; + cmsInt32Number i, rc; + + Forward = cmsBuildGamma(DbgThread(), 2.2); + + // Fake the curve to be table-based + + for (i=0; i < 4096; i++) + Forward ->Table16[i] = 0xffff - Forward->Table16[i]; + Forward ->Segments[0].Type = 0; + + Reverse = cmsReverseToneCurve(Forward); + + Result = cmsJoinToneCurve(DbgThread(), Reverse, Reverse, 256); + + cmsFreeToneCurve(Forward); + cmsFreeToneCurve(Reverse); + + rc = cmsIsToneCurveLinear(Result); + cmsFreeToneCurve(Result); + + return rc; +} + + +static +cmsInt32Number CheckFToneCurvePoint(cmsToneCurve* c, cmsUInt16Number Point, cmsInt32Number Value) +{ + cmsInt32Number Result; + + Result = cmsEvalToneCurve16(c, Point); + + return (abs(Value - Result) < 2); +} + +static +cmsInt32Number CheckReverseDegenerated(void) +{ + cmsToneCurve* p, *g; + cmsUInt16Number Tab[16]; + + Tab[0] = 0; + Tab[1] = 0; + Tab[2] = 0; + Tab[3] = 0; + Tab[4] = 0; + Tab[5] = 0x5555; + Tab[6] = 0x6666; + Tab[7] = 0x7777; + Tab[8] = 0x8888; + Tab[9] = 0x9999; + Tab[10]= 0xffff; + Tab[11]= 0xffff; + Tab[12]= 0xffff; + Tab[13]= 0xffff; + Tab[14]= 0xffff; + Tab[15]= 0xffff; + + p = cmsBuildTabulatedToneCurve16(DbgThread(), 16, Tab); + g = cmsReverseToneCurve(p); + + // Now let's check some points + if (!CheckFToneCurvePoint(g, 0x5555, 0x5555)) return 0; + if (!CheckFToneCurvePoint(g, 0x7777, 0x7777)) return 0; + + // First point for zero + if (!CheckFToneCurvePoint(g, 0x0000, 0x4444)) return 0; + + // Last point + if (!CheckFToneCurvePoint(g, 0xFFFF, 0xFFFF)) return 0; + + cmsFreeToneCurve(p); + cmsFreeToneCurve(g); + + return 1; +} + + +// Build a parametric sRGB-like curve +static +cmsToneCurve* Build_sRGBGamma(void) +{ + cmsFloat64Number Parameters[5]; + + Parameters[0] = 2.4; + Parameters[1] = 1. / 1.055; + Parameters[2] = 0.055 / 1.055; + Parameters[3] = 1. / 12.92; + Parameters[4] = 0.04045; // d + + return cmsBuildParametricToneCurve(DbgThread(), 4, Parameters); +} + + + +// Join two gamma tables in floating point format. Result should be a straight line +static +cmsToneCurve* CombineGammaFloat(cmsToneCurve* g1, cmsToneCurve* g2) +{ + cmsUInt16Number Tab[256]; + cmsFloat32Number f; + cmsInt32Number i; + + for (i=0; i < 256; i++) { + + f = (cmsFloat32Number) i / 255.0F; + f = cmsEvalToneCurveFloat(g2, cmsEvalToneCurveFloat(g1, f)); + + Tab[i] = (cmsUInt16Number) floor(f * 65535.0 + 0.5); + } + + return cmsBuildTabulatedToneCurve16(DbgThread(), 256, Tab); +} + +// Same of anterior, but using quantized tables +static +cmsToneCurve* CombineGamma16(cmsToneCurve* g1, cmsToneCurve* g2) +{ + cmsUInt16Number Tab[256]; + + cmsInt32Number i; + + for (i=0; i < 256; i++) { + + cmsUInt16Number wValIn; + + wValIn = _cmsQuantizeVal(i, 256); + Tab[i] = cmsEvalToneCurve16(g2, cmsEvalToneCurve16(g1, wValIn)); + } + + return cmsBuildTabulatedToneCurve16(DbgThread(), 256, Tab); +} + +static +cmsInt32Number CheckJointFloatCurves_sRGB(void) +{ + cmsToneCurve *Forward, *Reverse, *Result; + cmsBool rc; + + Forward = Build_sRGBGamma(); + Reverse = cmsReverseToneCurve(Forward); + Result = CombineGammaFloat(Forward, Reverse); + cmsFreeToneCurve(Forward); cmsFreeToneCurve(Reverse); + + rc = cmsIsToneCurveLinear(Result); + cmsFreeToneCurve(Result); + + return rc; +} + +static +cmsInt32Number CheckJoint16Curves_sRGB(void) +{ + cmsToneCurve *Forward, *Reverse, *Result; + cmsBool rc; + + Forward = Build_sRGBGamma(); + Reverse = cmsReverseToneCurve(Forward); + Result = CombineGamma16(Forward, Reverse); + cmsFreeToneCurve(Forward); cmsFreeToneCurve(Reverse); + + rc = cmsIsToneCurveLinear(Result); + cmsFreeToneCurve(Result); + + return rc; +} + +// sigmoidal curve f(x) = (1-x^g) ^(1/g) + +static +cmsInt32Number CheckJointCurvesSShaped(void) +{ + cmsFloat64Number p = 3.2; + cmsToneCurve *Forward, *Reverse, *Result; + cmsInt32Number rc; + + Forward = cmsBuildParametricToneCurve(DbgThread(), 108, &p); + Reverse = cmsReverseToneCurve(Forward); + Result = cmsJoinToneCurve(DbgThread(), Forward, Forward, 4096); + + cmsFreeToneCurve(Forward); + cmsFreeToneCurve(Reverse); + + rc = cmsIsToneCurveLinear(Result); + cmsFreeToneCurve(Result); + return rc; +} + + +// -------------------------------------------------------------------------------------------------------- + +// Implementation of some tone curve functions +static +cmsFloat32Number Gamma(cmsFloat32Number x, const cmsFloat64Number Params[]) +{ + return (cmsFloat32Number) pow(x, Params[0]); +} + +static +cmsFloat32Number CIE122(cmsFloat32Number x, const cmsFloat64Number Params[]) + +{ + cmsFloat64Number e, Val; + + if (x >= -Params[2] / Params[1]) { + + e = Params[1]*x + Params[2]; + + if (e > 0) + Val = pow(e, Params[0]); + else + Val = 0; + } + else + Val = 0; + + return (cmsFloat32Number) Val; +} + +static +cmsFloat32Number IEC61966_3(cmsFloat32Number x, const cmsFloat64Number Params[]) +{ + cmsFloat64Number e, Val; + + if (x >= -Params[2] / Params[1]) { + + e = Params[1]*x + Params[2]; + + if (e > 0) + Val = pow(e, Params[0]) + Params[3]; + else + Val = 0; + } + else + Val = Params[3]; + + return (cmsFloat32Number) Val; +} + +static +cmsFloat32Number IEC61966_21(cmsFloat32Number x, const cmsFloat64Number Params[]) +{ + cmsFloat64Number e, Val; + + if (x >= Params[4]) { + + e = Params[1]*x + Params[2]; + + if (e > 0) + Val = pow(e, Params[0]); + else + Val = 0; + } + else + Val = x * Params[3]; + + return (cmsFloat32Number) Val; +} + +static +cmsFloat32Number param_5(cmsFloat32Number x, const cmsFloat64Number Params[]) +{ + cmsFloat64Number e, Val; + // Y = (aX + b)^Gamma + e | X >= d + // Y = cX + f | else + if (x >= Params[4]) { + + e = Params[1]*x + Params[2]; + if (e > 0) + Val = pow(e, Params[0]) + Params[5]; + else + Val = 0; + } + else + Val = x*Params[3] + Params[6]; + + return (cmsFloat32Number) Val; +} + +static +cmsFloat32Number param_6(cmsFloat32Number x, const cmsFloat64Number Params[]) +{ + cmsFloat64Number e, Val; + + e = Params[1]*x + Params[2]; + if (e > 0) + Val = pow(e, Params[0]) + Params[3]; + else + Val = 0; + + return (cmsFloat32Number) Val; +} + +static +cmsFloat32Number param_7(cmsFloat32Number x, const cmsFloat64Number Params[]) +{ + cmsFloat64Number Val; + + + Val = Params[1]*log10(Params[2] * pow(x, Params[0]) + Params[3]) + Params[4]; + + return (cmsFloat32Number) Val; +} + + +static +cmsFloat32Number param_8(cmsFloat32Number x, const cmsFloat64Number Params[]) +{ + cmsFloat64Number Val; + + Val = (Params[0] * pow(Params[1], Params[2] * x + Params[3]) + Params[4]); + + return (cmsFloat32Number) Val; +} + + +static +cmsFloat32Number sigmoidal(cmsFloat32Number x, const cmsFloat64Number Params[]) +{ + cmsFloat64Number Val; + + Val = pow(1.0 - pow(1 - x, 1/Params[0]), 1/Params[0]); + + return (cmsFloat32Number) Val; +} + + +static +cmsBool CheckSingleParametric(const char* Name, dblfnptr fn, cmsInt32Number Type, const cmsFloat64Number Params[]) +{ + cmsInt32Number i; + cmsToneCurve* tc; + cmsToneCurve* tc_1; + char InverseText[256]; + + tc = cmsBuildParametricToneCurve(DbgThread(), Type, Params); + tc_1 = cmsBuildParametricToneCurve(DbgThread(), -Type, Params); + + for (i=0; i <= 1000; i++) { + + cmsFloat32Number x = (cmsFloat32Number) i / 1000; + cmsFloat32Number y_fn, y_param, x_param, y_param2; + + y_fn = fn(x, Params); + y_param = cmsEvalToneCurveFloat(tc, x); + x_param = cmsEvalToneCurveFloat(tc_1, y_param); + + y_param2 = fn(x_param, Params); + + if (!IsGoodVal(Name, y_fn, y_param, FIXED_PRECISION_15_16)) + goto Error; + + sprintf(InverseText, "Inverse %s", Name); + if (!IsGoodVal(InverseText, y_fn, y_param2, FIXED_PRECISION_15_16)) + goto Error; + } + + cmsFreeToneCurve(tc); + cmsFreeToneCurve(tc_1); + return TRUE; + +Error: + cmsFreeToneCurve(tc); + cmsFreeToneCurve(tc_1); + return FALSE; +} + +// Check against some known values +static +cmsInt32Number CheckParametricToneCurves(void) +{ + cmsFloat64Number Params[10]; + + // 1) X = Y ^ Gamma + + Params[0] = 2.2; + + if (!CheckSingleParametric("Gamma", Gamma, 1, Params)) return 0; + + // 2) CIE 122-1966 + // Y = (aX + b)^Gamma | X >= -b/a + // Y = 0 | else + + Params[0] = 2.2; + Params[1] = 1.5; + Params[2] = -0.5; + + if (!CheckSingleParametric("CIE122-1966", CIE122, 2, Params)) return 0; + + // 3) IEC 61966-3 + // Y = (aX + b)^Gamma | X <= -b/a + // Y = c | else + + Params[0] = 2.2; + Params[1] = 1.5; + Params[2] = -0.5; + Params[3] = 0.3; + + + if (!CheckSingleParametric("IEC 61966-3", IEC61966_3, 3, Params)) return 0; + + // 4) IEC 61966-2.1 (sRGB) + // Y = (aX + b)^Gamma | X >= d + // Y = cX | X < d + + Params[0] = 2.4; + Params[1] = 1. / 1.055; + Params[2] = 0.055 / 1.055; + Params[3] = 1. / 12.92; + Params[4] = 0.04045; + + if (!CheckSingleParametric("IEC 61966-2.1", IEC61966_21, 4, Params)) return 0; + + + // 5) Y = (aX + b)^Gamma + e | X >= d + // Y = cX + f | else + + Params[0] = 2.2; + Params[1] = 0.7; + Params[2] = 0.2; + Params[3] = 0.3; + Params[4] = 0.1; + Params[5] = 0.5; + Params[6] = 0.2; + + if (!CheckSingleParametric("param_5", param_5, 5, Params)) return 0; + + // 6) Y = (aX + b) ^ Gamma + c + + Params[0] = 2.2; + Params[1] = 0.7; + Params[2] = 0.2; + Params[3] = 0.3; + + if (!CheckSingleParametric("param_6", param_6, 6, Params)) return 0; + + // 7) Y = a * log (b * X^Gamma + c) + d + + Params[0] = 2.2; + Params[1] = 0.9; + Params[2] = 0.9; + Params[3] = 0.02; + Params[4] = 0.1; + + if (!CheckSingleParametric("param_7", param_7, 7, Params)) return 0; + + // 8) Y = a * b ^ (c*X+d) + e + + Params[0] = 0.9; + Params[1] = 0.9; + Params[2] = 1.02; + Params[3] = 0.1; + Params[4] = 0.2; + + if (!CheckSingleParametric("param_8", param_8, 8, Params)) return 0; + + // 108: S-Shaped: (1 - (1-x)^1/g)^1/g + + Params[0] = 1.9; + if (!CheckSingleParametric("sigmoidal", sigmoidal, 108, Params)) return 0; + + // All OK + + return 1; +} + +// LUT checks ------------------------------------------------------------------------------ + +static +cmsInt32Number CheckLUTcreation(void) +{ + cmsPipeline* lut; + cmsPipeline* lut2; + cmsInt32Number n1, n2; + + lut = cmsPipelineAlloc(DbgThread(), 1, 1); + n1 = cmsPipelineStageCount(lut); + lut2 = cmsPipelineDup(lut); + n2 = cmsPipelineStageCount(lut2); + + cmsPipelineFree(lut); + cmsPipelineFree(lut2); + + return (n1 == 0) && (n2 == 0); +} + +// Create a MPE for a identity matrix +static +void AddIdentityMatrix(cmsPipeline* lut) +{ + const cmsFloat64Number Identity[] = { 1, 0, 0, + 0, 1, 0, + 0, 0, 1, + 0, 0, 0 }; + + cmsPipelineInsertStage(lut, cmsAT_END, cmsStageAllocMatrix(DbgThread(), 3, 3, Identity, NULL)); +} + +// Create a MPE for identity cmsFloat32Number CLUT +static +void AddIdentityCLUTfloat(cmsPipeline* lut) +{ + const cmsFloat32Number Table[] = { + + 0, 0, 0, + 0, 0, 1.0, + + 0, 1.0, 0, + 0, 1.0, 1.0, + + 1.0, 0, 0, + 1.0, 0, 1.0, + + 1.0, 1.0, 0, + 1.0, 1.0, 1.0 + }; + + cmsPipelineInsertStage(lut, cmsAT_END, cmsStageAllocCLutFloat(DbgThread(), 2, 3, 3, Table)); +} + +// Create a MPE for identity cmsFloat32Number CLUT +static +void AddIdentityCLUT16(cmsPipeline* lut) +{ + const cmsUInt16Number Table[] = { + + 0, 0, 0, + 0, 0, 0xffff, + + 0, 0xffff, 0, + 0, 0xffff, 0xffff, + + 0xffff, 0, 0, + 0xffff, 0, 0xffff, + + 0xffff, 0xffff, 0, + 0xffff, 0xffff, 0xffff + }; + + + cmsPipelineInsertStage(lut, cmsAT_END, cmsStageAllocCLut16bit(DbgThread(), 2, 3, 3, Table)); +} + + +// Create a 3 fn identity curves + +static +void Add3GammaCurves(cmsPipeline* lut, cmsFloat64Number Curve) +{ + cmsToneCurve* id = cmsBuildGamma(DbgThread(), Curve); + cmsToneCurve* id3[3]; + + id3[0] = id; + id3[1] = id; + id3[2] = id; + + cmsPipelineInsertStage(lut, cmsAT_END, cmsStageAllocToneCurves(DbgThread(), 3, id3)); + + cmsFreeToneCurve(id); +} + + +static +cmsInt32Number CheckFloatLUT(cmsPipeline* lut) +{ + cmsInt32Number n1, i, j; + cmsFloat32Number Inf[3], Outf[3]; + + n1=0; + + for (j=0; j < 65535; j++) { + + cmsInt32Number af[3]; + + Inf[0] = Inf[1] = Inf[2] = (cmsFloat32Number) j / 65535.0F; + cmsPipelineEvalFloat(Inf, Outf, lut); + + af[0] = (cmsInt32Number) floor(Outf[0]*65535.0 + 0.5); + af[1] = (cmsInt32Number) floor(Outf[1]*65535.0 + 0.5); + af[2] = (cmsInt32Number) floor(Outf[2]*65535.0 + 0.5); + + for (i=0; i < 3; i++) { + + if (af[i] != j) { + n1++; + } + } + + } + + return (n1 == 0); +} + + +static +cmsInt32Number Check16LUT(cmsPipeline* lut) +{ + cmsInt32Number n2, i, j; + cmsUInt16Number Inw[3], Outw[3]; + + n2=0; + + for (j=0; j < 65535; j++) { + + cmsInt32Number aw[3]; + + Inw[0] = Inw[1] = Inw[2] = (cmsUInt16Number) j; + cmsPipelineEval16(Inw, Outw, lut); + aw[0] = Outw[0]; + aw[1] = Outw[1]; + aw[2] = Outw[2]; + + for (i=0; i < 3; i++) { + + if (aw[i] != j) { + n2++; + } + } + + } + + return (n2 == 0); +} + + +// Check any LUT that is linear +static +cmsInt32Number CheckStagesLUT(cmsPipeline* lut, cmsInt32Number ExpectedStages) +{ + + cmsInt32Number nInpChans, nOutpChans, nStages; + + nInpChans = cmsPipelineInputChannels(lut); + nOutpChans = cmsPipelineOutputChannels(lut); + nStages = cmsPipelineStageCount(lut); + + return (nInpChans == 3) && (nOutpChans == 3) && (nStages == ExpectedStages); +} + + +static +cmsInt32Number CheckFullLUT(cmsPipeline* lut, cmsInt32Number ExpectedStages) +{ + cmsInt32Number rc = CheckStagesLUT(lut, ExpectedStages) && Check16LUT(lut) && CheckFloatLUT(lut); + + cmsPipelineFree(lut); + return rc; +} + + +static +cmsInt32Number Check1StageLUT(void) +{ + cmsPipeline* lut = cmsPipelineAlloc(DbgThread(), 3, 3); + + AddIdentityMatrix(lut); + return CheckFullLUT(lut, 1); +} + + + +static +cmsInt32Number Check2StageLUT(void) +{ + cmsPipeline* lut = cmsPipelineAlloc(DbgThread(), 3, 3); + + AddIdentityMatrix(lut); + AddIdentityCLUTfloat(lut); + + return CheckFullLUT(lut, 2); +} + +static +cmsInt32Number Check2Stage16LUT(void) +{ + cmsPipeline* lut = cmsPipelineAlloc(DbgThread(), 3, 3); + + AddIdentityMatrix(lut); + AddIdentityCLUT16(lut); + + return CheckFullLUT(lut, 2); +} + + + +static +cmsInt32Number Check3StageLUT(void) +{ + cmsPipeline* lut = cmsPipelineAlloc(DbgThread(), 3, 3); + + AddIdentityMatrix(lut); + AddIdentityCLUTfloat(lut); + Add3GammaCurves(lut, 1.0); + + return CheckFullLUT(lut, 3); +} + +static +cmsInt32Number Check3Stage16LUT(void) +{ + cmsPipeline* lut = cmsPipelineAlloc(DbgThread(), 3, 3); + + AddIdentityMatrix(lut); + AddIdentityCLUT16(lut); + Add3GammaCurves(lut, 1.0); + + return CheckFullLUT(lut, 3); +} + + + +static +cmsInt32Number Check4StageLUT(void) +{ + cmsPipeline* lut = cmsPipelineAlloc(DbgThread(), 3, 3); + + AddIdentityMatrix(lut); + AddIdentityCLUTfloat(lut); + Add3GammaCurves(lut, 1.0); + AddIdentityMatrix(lut); + + return CheckFullLUT(lut, 4); +} + +static +cmsInt32Number Check4Stage16LUT(void) +{ + cmsPipeline* lut = cmsPipelineAlloc(DbgThread(), 3, 3); + + AddIdentityMatrix(lut); + AddIdentityCLUT16(lut); + Add3GammaCurves(lut, 1.0); + AddIdentityMatrix(lut); + + return CheckFullLUT(lut, 4); +} + +static +cmsInt32Number Check5StageLUT(void) +{ + cmsPipeline* lut = cmsPipelineAlloc(DbgThread(), 3, 3); + + AddIdentityMatrix(lut); + AddIdentityCLUTfloat(lut); + Add3GammaCurves(lut, 1.0); + AddIdentityMatrix(lut); + Add3GammaCurves(lut, 1.0); + + return CheckFullLUT(lut, 5); +} + + +static +cmsInt32Number Check5Stage16LUT(void) +{ + cmsPipeline* lut = cmsPipelineAlloc(DbgThread(), 3, 3); + + AddIdentityMatrix(lut); + AddIdentityCLUT16(lut); + Add3GammaCurves(lut, 1.0); + AddIdentityMatrix(lut); + Add3GammaCurves(lut, 1.0); + + return CheckFullLUT(lut, 5); +} + +static +cmsInt32Number Check6StageLUT(void) +{ + cmsPipeline* lut = cmsPipelineAlloc(DbgThread(), 3, 3); + + AddIdentityMatrix(lut); + Add3GammaCurves(lut, 1.0); + AddIdentityCLUTfloat(lut); + Add3GammaCurves(lut, 1.0); + AddIdentityMatrix(lut); + Add3GammaCurves(lut, 1.0); + + return CheckFullLUT(lut, 6); +} + +static +cmsInt32Number Check6Stage16LUT(void) +{ + cmsPipeline* lut = cmsPipelineAlloc(DbgThread(), 3, 3); + + AddIdentityMatrix(lut); + Add3GammaCurves(lut, 1.0); + AddIdentityCLUT16(lut); + Add3GammaCurves(lut, 1.0); + AddIdentityMatrix(lut); + Add3GammaCurves(lut, 1.0); + + return CheckFullLUT(lut, 6); +} + + +static +cmsInt32Number CheckLab2LabLUT(void) +{ + cmsPipeline* lut = cmsPipelineAlloc(DbgThread(), 3, 3); + cmsInt32Number rc; + + cmsPipelineInsertStage(lut, cmsAT_END, _cmsStageAllocLab2XYZ(DbgThread())); + cmsPipelineInsertStage(lut, cmsAT_END, _cmsStageAllocXYZ2Lab(DbgThread())); + + rc = CheckFloatLUT(lut) && CheckStagesLUT(lut, 2); + + cmsPipelineFree(lut); + + return rc; +} + + +static +cmsInt32Number CheckXYZ2XYZLUT(void) +{ + cmsPipeline* lut = cmsPipelineAlloc(DbgThread(), 3, 3); + cmsInt32Number rc; + + cmsPipelineInsertStage(lut, cmsAT_END, _cmsStageAllocXYZ2Lab(DbgThread())); + cmsPipelineInsertStage(lut, cmsAT_END, _cmsStageAllocLab2XYZ(DbgThread())); + + rc = CheckFloatLUT(lut) && CheckStagesLUT(lut, 2); + + cmsPipelineFree(lut); + + return rc; +} + + + +static +cmsInt32Number CheckLab2LabMatLUT(void) +{ + cmsPipeline* lut = cmsPipelineAlloc(DbgThread(), 3, 3); + cmsInt32Number rc; + + cmsPipelineInsertStage(lut, cmsAT_END, _cmsStageAllocLab2XYZ(DbgThread())); + AddIdentityMatrix(lut); + cmsPipelineInsertStage(lut, cmsAT_END, _cmsStageAllocXYZ2Lab(DbgThread())); + + rc = CheckFloatLUT(lut) && CheckStagesLUT(lut, 3); + + cmsPipelineFree(lut); + + return rc; +} + +static +cmsInt32Number CheckNamedColorLUT(void) +{ + cmsPipeline* lut = cmsPipelineAlloc(DbgThread(), 3, 3); + cmsNAMEDCOLORLIST* nc; + cmsInt32Number i,j, rc = 1, n2; + cmsUInt16Number PCS[3]; + cmsUInt16Number Colorant[cmsMAXCHANNELS]; + char Name[255]; + cmsUInt16Number Inw[3], Outw[3]; + + + + nc = cmsAllocNamedColorList(DbgThread(), 256, 3, "pre", "post"); + if (nc == NULL) return 0; + + for (i=0; i < 256; i++) { + + PCS[0] = PCS[1] = PCS[2] = (cmsUInt16Number) i; + Colorant[0] = Colorant[1] = Colorant[2] = Colorant[3] = (cmsUInt16Number) i; + + sprintf(Name, "#%d", i); + if (!cmsAppendNamedColor(nc, Name, PCS, Colorant)) { rc = 0; break; } + } + + cmsPipelineInsertStage(lut, cmsAT_END, _cmsStageAllocNamedColor(nc, FALSE)); + + cmsFreeNamedColorList(nc); + if (rc == 0) return 0; + + n2=0; + + for (j=0; j < 256; j++) { + + Inw[0] = (cmsUInt16Number) j; + + cmsPipelineEval16(Inw, Outw, lut); + for (i=0; i < 3; i++) { + + if (Outw[i] != j) { + n2++; + } + } + + } + + cmsPipelineFree(lut); + return (n2 == 0); +} + + + +// -------------------------------------------------------------------------------------------- + +// A lightweight test of multilocalized unicode structures. + +static +cmsInt32Number CheckMLU(void) +{ + cmsMLU* mlu, *mlu2, *mlu3; + char Buffer[256], Buffer2[256]; + cmsInt32Number rc = 1; + cmsInt32Number i; + cmsHPROFILE h= NULL; + + // Allocate a MLU structure, no preferred size + mlu = cmsMLUalloc(DbgThread(), 0); + + // Add some localizations + cmsMLUsetWide(mlu, "en", "US", L"Hello, world"); + cmsMLUsetWide(mlu, "es", "ES", L"Hola, mundo"); + cmsMLUsetWide(mlu, "fr", "FR", L"Bonjour, le monde"); + cmsMLUsetWide(mlu, "ca", "CA", L"Hola, mon"); + + + // Check the returned string for each language + + cmsMLUgetASCII(mlu, "en", "US", Buffer, 256); + if (strcmp(Buffer, "Hello, world") != 0) rc = 0; + + + cmsMLUgetASCII(mlu, "es", "ES", Buffer, 256); + if (strcmp(Buffer, "Hola, mundo") != 0) rc = 0; + + + cmsMLUgetASCII(mlu, "fr", "FR", Buffer, 256); + if (strcmp(Buffer, "Bonjour, le monde") != 0) rc = 0; + + + cmsMLUgetASCII(mlu, "ca", "CA", Buffer, 256); + if (strcmp(Buffer, "Hola, mon") != 0) rc = 0; + + if (rc == 0) + Fail("Unexpected string '%s'", Buffer); + + // So far, so good. + cmsMLUfree(mlu); + + // Now for performance, allocate an empty struct + mlu = cmsMLUalloc(DbgThread(), 0); + + // Fill it with several thousands of different languages + for (i=0; i < 4096; i++) { + + char Lang[3]; + + Lang[0] = (char) (i % 255); + Lang[1] = (char) (i / 255); + Lang[2] = 0; + + sprintf(Buffer, "String #%i", i); + cmsMLUsetASCII(mlu, Lang, Lang, Buffer); + } + + // Duplicate it + mlu2 = cmsMLUdup(mlu); + + // Get rid of original + cmsMLUfree(mlu); + + // Check all is still in place + for (i=0; i < 4096; i++) { + + char Lang[3]; + + Lang[0] = (char)(i % 255); + Lang[1] = (char)(i / 255); + Lang[2] = 0; + + cmsMLUgetASCII(mlu2, Lang, Lang, Buffer2, 256); + sprintf(Buffer, "String #%i", i); + + if (strcmp(Buffer, Buffer2) != 0) { rc = 0; break; } + } + + if (rc == 0) + Fail("Unexpected string '%s'", Buffer2); + + // Check profile IO + + h = cmsOpenProfileFromFileTHR(DbgThread(), "mlucheck.icc", "w"); + + cmsSetProfileVersion(h, 4.3); + + cmsWriteTag(h, cmsSigProfileDescriptionTag, mlu2); + cmsCloseProfile(h); + cmsMLUfree(mlu2); + + + h = cmsOpenProfileFromFileTHR(DbgThread(), "mlucheck.icc", "r"); + + mlu3 = (cmsMLU *) cmsReadTag(h, cmsSigProfileDescriptionTag); + if (mlu3 == NULL) { Fail("Profile didn't get the MLU\n"); rc = 0; goto Error; } + + // Check all is still in place + for (i=0; i < 4096; i++) { + + char Lang[3]; + + Lang[0] = (char) (i % 255); + Lang[1] = (char) (i / 255); + Lang[2] = 0; + + cmsMLUgetASCII(mlu3, Lang, Lang, Buffer2, 256); + sprintf(Buffer, "String #%i", i); + + if (strcmp(Buffer, Buffer2) != 0) { rc = 0; break; } + } + + if (rc == 0) Fail("Unexpected string '%s'", Buffer2); + +Error: + + if (h != NULL) cmsCloseProfile(h); + remove("mlucheck.icc"); + + return rc; +} + + +// Check UTF8 encoding +static +cmsInt32Number CheckMLU_UTF8(void) +{ + cmsMLU* mlu; + char Buffer[256]; + cmsInt32Number rc = 1; + + mlu = cmsMLUalloc(DbgThread(), 0); + + cmsMLUsetWide(mlu, "en", "US", L"\x3b2\x14b"); + + cmsMLUgetUTF8(mlu, "en", "US", Buffer, 256); + if (strcmp(Buffer, "\xce\xb2\xc5\x8b") != 0) rc = 0; + + if (rc == 0) + Fail("Unexpected string '%s'", Buffer); + + cmsMLUfree(mlu); + return rc; +} + + + +// A lightweight test of named color structures. +static +cmsInt32Number CheckNamedColorList(void) +{ + cmsNAMEDCOLORLIST* nc = NULL, *nc2; + cmsInt32Number i, j, rc=1; + char Name[cmsMAX_PATH]; + cmsUInt16Number PCS[3]; + cmsUInt16Number Colorant[cmsMAXCHANNELS]; + char CheckName[cmsMAX_PATH]; + cmsUInt16Number CheckPCS[3]; + cmsUInt16Number CheckColorant[cmsMAXCHANNELS]; + cmsHPROFILE h; + + nc = cmsAllocNamedColorList(DbgThread(), 0, 4, "prefix", "suffix"); + if (nc == NULL) return 0; + + for (i=0; i < 4096; i++) { + + + PCS[0] = PCS[1] = PCS[2] = (cmsUInt16Number) i; + Colorant[0] = Colorant[1] = Colorant[2] = Colorant[3] = (cmsUInt16Number) (4096 - i); + + sprintf(Name, "#%d", i); + if (!cmsAppendNamedColor(nc, Name, PCS, Colorant)) { rc = 0; break; } + } + + for (i=0; i < 4096; i++) { + + CheckPCS[0] = CheckPCS[1] = CheckPCS[2] = (cmsUInt16Number) i; + CheckColorant[0] = CheckColorant[1] = CheckColorant[2] = CheckColorant[3] = (cmsUInt16Number) (4096 - i); + + sprintf(CheckName, "#%d", i); + if (!cmsNamedColorInfo(nc, i, Name, NULL, NULL, PCS, Colorant)) { rc = 0; goto Error; } + + + for (j=0; j < 3; j++) { + if (CheckPCS[j] != PCS[j]) { rc = 0; Fail("Invalid PCS"); goto Error; } + } + + for (j=0; j < 4; j++) { + if (CheckColorant[j] != Colorant[j]) { rc = 0; Fail("Invalid Colorant"); goto Error; }; + } + + if (strcmp(Name, CheckName) != 0) {rc = 0; Fail("Invalid Name"); goto Error; }; + } + + h = cmsOpenProfileFromFileTHR(DbgThread(), "namedcol.icc", "w"); + if (h == NULL) return 0; + if (!cmsWriteTag(h, cmsSigNamedColor2Tag, nc)) return 0; + cmsCloseProfile(h); + cmsFreeNamedColorList(nc); + nc = NULL; + + h = cmsOpenProfileFromFileTHR(DbgThread(), "namedcol.icc", "r"); + nc2 = (cmsNAMEDCOLORLIST *) cmsReadTag(h, cmsSigNamedColor2Tag); + + if (cmsNamedColorCount(nc2) != 4096) { rc = 0; Fail("Invalid count"); goto Error; } + + i = cmsNamedColorIndex(nc2, "#123"); + if (i != 123) { rc = 0; Fail("Invalid index"); goto Error; } + + + for (i=0; i < 4096; i++) { + + CheckPCS[0] = CheckPCS[1] = CheckPCS[2] = (cmsUInt16Number) i; + CheckColorant[0] = CheckColorant[1] = CheckColorant[2] = CheckColorant[3] = (cmsUInt16Number) (4096 - i); + + sprintf(CheckName, "#%d", i); + if (!cmsNamedColorInfo(nc2, i, Name, NULL, NULL, PCS, Colorant)) { rc = 0; goto Error; } + + + for (j=0; j < 3; j++) { + if (CheckPCS[j] != PCS[j]) { rc = 0; Fail("Invalid PCS"); goto Error; } + } + + for (j=0; j < 4; j++) { + if (CheckColorant[j] != Colorant[j]) { rc = 0; Fail("Invalid Colorant"); goto Error; }; + } + + if (strcmp(Name, CheckName) != 0) {rc = 0; Fail("Invalid Name"); goto Error; }; + } + + cmsCloseProfile(h); + remove("namedcol.icc"); + +Error: + if (nc != NULL) cmsFreeNamedColorList(nc); + return rc; +} + + + +// For educational purposes ONLY. No error checking is performed! +static +cmsInt32Number CreateNamedColorProfile(void) +{ + // Color list database + cmsNAMEDCOLORLIST* colors = cmsAllocNamedColorList(0, 10, 4, "PANTONE", "TCX"); + + // Containers for names + cmsMLU* DescriptionMLU, *CopyrightMLU; + + // Create n empty profile + cmsHPROFILE hProfile = cmsOpenProfileFromFile("named.icc", "w"); + + // Values + cmsCIELab Lab; + cmsUInt16Number PCS[3], Colorant[cmsMAXCHANNELS]; + + // Set profile class + cmsSetProfileVersion(hProfile, 4.3); + cmsSetDeviceClass(hProfile, cmsSigNamedColorClass); + cmsSetColorSpace(hProfile, cmsSigCmykData); + cmsSetPCS(hProfile, cmsSigLabData); + cmsSetHeaderRenderingIntent(hProfile, INTENT_PERCEPTUAL); + + // Add description and copyright only in english/US + DescriptionMLU = cmsMLUalloc(0, 1); + CopyrightMLU = cmsMLUalloc(0, 1); + + cmsMLUsetWide(DescriptionMLU, "en", "US", L"Profile description"); + cmsMLUsetWide(CopyrightMLU, "en", "US", L"Profile copyright"); + + cmsWriteTag(hProfile, cmsSigProfileDescriptionTag, DescriptionMLU); + cmsWriteTag(hProfile, cmsSigCopyrightTag, CopyrightMLU); + + // Set the media white point + cmsWriteTag(hProfile, cmsSigMediaWhitePointTag, cmsD50_XYZ()); + + + // Populate one value, Colorant = CMYK values in 16 bits, PCS[] = Encoded Lab values (in V2 format!!) + Lab.L = 50; Lab.a = 10; Lab.b = -10; + cmsFloat2LabEncodedV2(PCS, &Lab); + Colorant[0] = 10 * 257; Colorant[1] = 20 * 257; Colorant[2] = 30 * 257; Colorant[3] = 40 * 257; + cmsAppendNamedColor(colors, "Hazelnut 14-1315", PCS, Colorant); + + // Another one. Consider to write a routine for that + Lab.L = 40; Lab.a = -5; Lab.b = 8; + cmsFloat2LabEncodedV2(PCS, &Lab); + Colorant[0] = 10 * 257; Colorant[1] = 20 * 257; Colorant[2] = 30 * 257; Colorant[3] = 40 * 257; + cmsAppendNamedColor(colors, "Kale 18-0107", PCS, Colorant); + + // Write the colors database + cmsWriteTag(hProfile, cmsSigNamedColor2Tag, colors); + + // That will create the file + cmsCloseProfile(hProfile); + + // Free resources + cmsFreeNamedColorList(colors); + cmsMLUfree(DescriptionMLU); + cmsMLUfree(CopyrightMLU); + + remove("named.icc"); + + return 1; +} + + +// ---------------------------------------------------------------------------------------------------------- + +// Formatters + +static cmsBool FormatterFailed; + +static +void CheckSingleFormatter16(cmsContext id, cmsUInt32Number Type, const char* Text) +{ + cmsUInt16Number Values[cmsMAXCHANNELS]; + cmsUInt8Number Buffer[1024]; + cmsFormatter f, b; + cmsInt32Number i, j, nChannels, bytes; + _cmsTRANSFORM info; + + // Already failed? + if (FormatterFailed) return; + + memset(&info, 0, sizeof(info)); + info.OutputFormat = info.InputFormat = Type; + + // Go forth and back + f = _cmsGetFormatter(id, Type, cmsFormatterInput, CMS_PACK_FLAGS_16BITS); + b = _cmsGetFormatter(id, Type, cmsFormatterOutput, CMS_PACK_FLAGS_16BITS); + + if (f.Fmt16 == NULL || b.Fmt16 == NULL) { + Fail("no formatter for %s", Text); + FormatterFailed = TRUE; + + // Useful for debug + f = _cmsGetFormatter(id, Type, cmsFormatterInput, CMS_PACK_FLAGS_16BITS); + b = _cmsGetFormatter(id, Type, cmsFormatterOutput, CMS_PACK_FLAGS_16BITS); + return; + } + + nChannels = T_CHANNELS(Type); + bytes = T_BYTES(Type); + + for (j=0; j < 5; j++) { + + for (i=0; i < nChannels; i++) { + Values[i] = (cmsUInt16Number) (i+j); + // For 8-bit + if (bytes == 1) + Values[i] <<= 8; + } + + b.Fmt16(&info, Values, Buffer, 2); + memset(Values, 0, sizeof(Values)); + f.Fmt16(&info, Values, Buffer, 2); + + for (i=0; i < nChannels; i++) { + if (bytes == 1) + Values[i] >>= 8; + + if (Values[i] != i+j) { + + Fail("%s failed", Text); + FormatterFailed = TRUE; + + // Useful for debug + for (i=0; i < nChannels; i++) { + Values[i] = (cmsUInt16Number) (i+j); + // For 8-bit + if (bytes == 1) + Values[i] <<= 8; + } + + b.Fmt16(&info, Values, Buffer, 1); + f.Fmt16(&info, Values, Buffer, 1); + return; + } + } + } +} + +#define C(a) CheckSingleFormatter16(0, a, #a) + + +// Check all formatters +static +cmsInt32Number CheckFormatters16(void) +{ + FormatterFailed = FALSE; + + C( TYPE_GRAY_8 ); + C( TYPE_GRAY_8_REV ); + C( TYPE_GRAY_16 ); + C( TYPE_GRAY_16_REV ); + C( TYPE_GRAY_16_SE ); + C( TYPE_GRAYA_8 ); + C( TYPE_GRAYA_16 ); + C( TYPE_GRAYA_16_SE ); + C( TYPE_GRAYA_8_PLANAR ); + C( TYPE_GRAYA_16_PLANAR ); + C( TYPE_RGB_8 ); + C( TYPE_RGB_8_PLANAR ); + C( TYPE_BGR_8 ); + C( TYPE_BGR_8_PLANAR ); + C( TYPE_RGB_16 ); + C( TYPE_RGB_16_PLANAR ); + C( TYPE_RGB_16_SE ); + C( TYPE_BGR_16 ); + C( TYPE_BGR_16_PLANAR ); + C( TYPE_BGR_16_SE ); + C( TYPE_RGBA_8 ); + C( TYPE_RGBA_8_PLANAR ); + C( TYPE_RGBA_16 ); + C( TYPE_RGBA_16_PLANAR ); + C( TYPE_RGBA_16_SE ); + C( TYPE_ARGB_8 ); + C( TYPE_ARGB_8_PLANAR ); + C( TYPE_ARGB_16 ); + C( TYPE_ABGR_8 ); + C( TYPE_ABGR_8_PLANAR ); + C( TYPE_ABGR_16 ); + C( TYPE_ABGR_16_PLANAR ); + C( TYPE_ABGR_16_SE ); + C( TYPE_BGRA_8 ); + C( TYPE_BGRA_8_PLANAR ); + C( TYPE_BGRA_16 ); + C( TYPE_BGRA_16_SE ); + C( TYPE_CMY_8 ); + C( TYPE_CMY_8_PLANAR ); + C( TYPE_CMY_16 ); + C( TYPE_CMY_16_PLANAR ); + C( TYPE_CMY_16_SE ); + C( TYPE_CMYK_8 ); + C( TYPE_CMYKA_8 ); + C( TYPE_CMYK_8_REV ); + C( TYPE_YUVK_8 ); + C( TYPE_CMYK_8_PLANAR ); + C( TYPE_CMYK_16 ); + C( TYPE_CMYK_16_REV ); + C( TYPE_YUVK_16 ); + C( TYPE_CMYK_16_PLANAR ); + C( TYPE_CMYK_16_SE ); + C( TYPE_KYMC_8 ); + C( TYPE_KYMC_16 ); + C( TYPE_KYMC_16_SE ); + C( TYPE_KCMY_8 ); + C( TYPE_KCMY_8_REV ); + C( TYPE_KCMY_16 ); + C( TYPE_KCMY_16_REV ); + C( TYPE_KCMY_16_SE ); + C( TYPE_CMYK5_8 ); + C( TYPE_CMYK5_16 ); + C( TYPE_CMYK5_16_SE ); + C( TYPE_KYMC5_8 ); + C( TYPE_KYMC5_16 ); + C( TYPE_KYMC5_16_SE ); + C( TYPE_CMYK6_8 ); + C( TYPE_CMYK6_8_PLANAR ); + C( TYPE_CMYK6_16 ); + C( TYPE_CMYK6_16_PLANAR ); + C( TYPE_CMYK6_16_SE ); + C( TYPE_CMYK7_8 ); + C( TYPE_CMYK7_16 ); + C( TYPE_CMYK7_16_SE ); + C( TYPE_KYMC7_8 ); + C( TYPE_KYMC7_16 ); + C( TYPE_KYMC7_16_SE ); + C( TYPE_CMYK8_8 ); + C( TYPE_CMYK8_16 ); + C( TYPE_CMYK8_16_SE ); + C( TYPE_KYMC8_8 ); + C( TYPE_KYMC8_16 ); + C( TYPE_KYMC8_16_SE ); + C( TYPE_CMYK9_8 ); + C( TYPE_CMYK9_16 ); + C( TYPE_CMYK9_16_SE ); + C( TYPE_KYMC9_8 ); + C( TYPE_KYMC9_16 ); + C( TYPE_KYMC9_16_SE ); + C( TYPE_CMYK10_8 ); + C( TYPE_CMYK10_16 ); + C( TYPE_CMYK10_16_SE ); + C( TYPE_KYMC10_8 ); + C( TYPE_KYMC10_16 ); + C( TYPE_KYMC10_16_SE ); + C( TYPE_CMYK11_8 ); + C( TYPE_CMYK11_16 ); + C( TYPE_CMYK11_16_SE ); + C( TYPE_KYMC11_8 ); + C( TYPE_KYMC11_16 ); + C( TYPE_KYMC11_16_SE ); + C( TYPE_CMYK12_8 ); + C( TYPE_CMYK12_16 ); + C( TYPE_CMYK12_16_SE ); + C( TYPE_KYMC12_8 ); + C( TYPE_KYMC12_16 ); + C( TYPE_KYMC12_16_SE ); + C( TYPE_XYZ_16 ); + C( TYPE_Lab_8 ); + C( TYPE_ALab_8 ); + C( TYPE_Lab_16 ); + C( TYPE_Yxy_16 ); + C( TYPE_YCbCr_8 ); + C( TYPE_YCbCr_8_PLANAR ); + C( TYPE_YCbCr_16 ); + C( TYPE_YCbCr_16_PLANAR ); + C( TYPE_YCbCr_16_SE ); + C( TYPE_YUV_8 ); + C( TYPE_YUV_8_PLANAR ); + C( TYPE_YUV_16 ); + C( TYPE_YUV_16_PLANAR ); + C( TYPE_YUV_16_SE ); + C( TYPE_HLS_8 ); + C( TYPE_HLS_8_PLANAR ); + C( TYPE_HLS_16 ); + C( TYPE_HLS_16_PLANAR ); + C( TYPE_HLS_16_SE ); + C( TYPE_HSV_8 ); + C( TYPE_HSV_8_PLANAR ); + C( TYPE_HSV_16 ); + C( TYPE_HSV_16_PLANAR ); + C( TYPE_HSV_16_SE ); + + C( TYPE_XYZ_FLT ); + C( TYPE_Lab_FLT ); + C( TYPE_GRAY_FLT ); + C( TYPE_RGB_FLT ); + C( TYPE_BGR_FLT ); + C( TYPE_CMYK_FLT ); + C( TYPE_LabA_FLT ); + C( TYPE_RGBA_FLT ); + C( TYPE_ARGB_FLT ); + C( TYPE_BGRA_FLT ); + C( TYPE_ABGR_FLT ); + + + C( TYPE_XYZ_DBL ); + C( TYPE_Lab_DBL ); + C( TYPE_GRAY_DBL ); + C( TYPE_RGB_DBL ); + C( TYPE_BGR_DBL ); + C( TYPE_CMYK_DBL ); + + C( TYPE_LabV2_8 ); + C( TYPE_ALabV2_8 ); + C( TYPE_LabV2_16 ); + +#ifndef CMS_NO_HALF_SUPPORT + + C( TYPE_GRAY_HALF_FLT ); + C( TYPE_RGB_HALF_FLT ); + C( TYPE_CMYK_HALF_FLT ); + C( TYPE_RGBA_HALF_FLT ); + + C( TYPE_RGBA_HALF_FLT ); + C( TYPE_ARGB_HALF_FLT ); + C( TYPE_BGR_HALF_FLT ); + C( TYPE_BGRA_HALF_FLT ); + C( TYPE_ABGR_HALF_FLT ); + +#endif + + return FormatterFailed == 0 ? 1 : 0; +} +#undef C + +static +void CheckSingleFormatterFloat(cmsUInt32Number Type, const char* Text) +{ + cmsFloat32Number Values[cmsMAXCHANNELS]; + cmsUInt8Number Buffer[1024]; + cmsFormatter f, b; + cmsInt32Number i, j, nChannels; + _cmsTRANSFORM info; + + // Already failed? + if (FormatterFailed) return; + + memset(&info, 0, sizeof(info)); + info.OutputFormat = info.InputFormat = Type; + + // Go forth and back + f = _cmsGetFormatter(0, Type, cmsFormatterInput, CMS_PACK_FLAGS_FLOAT); + b = _cmsGetFormatter(0, Type, cmsFormatterOutput, CMS_PACK_FLAGS_FLOAT); + + if (f.FmtFloat == NULL || b.FmtFloat == NULL) { + Fail("no formatter for %s", Text); + FormatterFailed = TRUE; + + // Useful for debug + f = _cmsGetFormatter(0, Type, cmsFormatterInput, CMS_PACK_FLAGS_FLOAT); + b = _cmsGetFormatter(0, Type, cmsFormatterOutput, CMS_PACK_FLAGS_FLOAT); + return; + } + + nChannels = T_CHANNELS(Type); + + for (j=0; j < 5; j++) { + + for (i=0; i < nChannels; i++) { + Values[i] = (cmsFloat32Number) (i+j); + } + + b.FmtFloat(&info, Values, Buffer, 1); + memset(Values, 0, sizeof(Values)); + f.FmtFloat(&info, Values, Buffer, 1); + + for (i=0; i < nChannels; i++) { + + cmsFloat64Number delta = fabs(Values[i] - ( i+j)); + + if (delta > 0.000000001) { + + Fail("%s failed", Text); + FormatterFailed = TRUE; + + // Useful for debug + for (i=0; i < nChannels; i++) { + Values[i] = (cmsFloat32Number) (i+j); + } + + b.FmtFloat(&info, Values, Buffer, 1); + f.FmtFloat(&info, Values, Buffer, 1); + return; + } + } + } +} + +#define C(a) CheckSingleFormatterFloat(a, #a) + +static +cmsInt32Number CheckFormattersFloat(void) +{ + FormatterFailed = FALSE; + + C( TYPE_XYZ_FLT ); + C( TYPE_Lab_FLT ); + C( TYPE_GRAY_FLT ); + C( TYPE_RGB_FLT ); + C( TYPE_BGR_FLT ); + C( TYPE_CMYK_FLT ); + + C( TYPE_LabA_FLT ); + C( TYPE_RGBA_FLT ); + + C( TYPE_ARGB_FLT ); + C( TYPE_BGRA_FLT ); + C( TYPE_ABGR_FLT ); + + C( TYPE_XYZ_DBL ); + C( TYPE_Lab_DBL ); + C( TYPE_GRAY_DBL ); + C( TYPE_RGB_DBL ); + C( TYPE_BGR_DBL ); + C( TYPE_CMYK_DBL ); + C( TYPE_XYZ_FLT ); + +#ifndef CMS_NO_HALF_SUPPORT + C( TYPE_GRAY_HALF_FLT ); + C( TYPE_RGB_HALF_FLT ); + C( TYPE_CMYK_HALF_FLT ); + C( TYPE_RGBA_HALF_FLT ); + + C( TYPE_RGBA_HALF_FLT ); + C( TYPE_ARGB_HALF_FLT ); + C( TYPE_BGR_HALF_FLT ); + C( TYPE_BGRA_HALF_FLT ); + C( TYPE_ABGR_HALF_FLT ); +#endif + + + + + return FormatterFailed == 0 ? 1 : 0; +} +#undef C + +#ifndef CMS_NO_HALF_SUPPORT + +// Check half float +#define my_isfinite(x) ((x) != (x)) +static +cmsInt32Number CheckFormattersHalf(void) +{ + int i, j; + + + for (i=0; i < 0xffff; i++) { + + cmsFloat32Number f = _cmsHalf2Float((cmsUInt16Number) i); + + if (!my_isfinite(f)) { + + j = _cmsFloat2Half(f); + + if (i != j) { + Fail("%d != %d in Half float support!\n", i, j); + return 0; + } + } + } + + return 1; +} + +#endif + +static +cmsInt32Number CheckOneRGB(cmsHTRANSFORM xform, cmsUInt16Number R, cmsUInt16Number G, cmsUInt16Number B, cmsUInt16Number Ro, cmsUInt16Number Go, cmsUInt16Number Bo) +{ + cmsUInt16Number RGB[3]; + cmsUInt16Number Out[3]; + + RGB[0] = R; + RGB[1] = G; + RGB[2] = B; + + cmsDoTransform(xform, RGB, Out, 1); + + return IsGoodWord("R", Ro , Out[0]) && + IsGoodWord("G", Go , Out[1]) && + IsGoodWord("B", Bo , Out[2]); +} + +// Check known values going from sRGB to XYZ +static +cmsInt32Number CheckOneRGB_double(cmsHTRANSFORM xform, cmsFloat64Number R, cmsFloat64Number G, cmsFloat64Number B, cmsFloat64Number Ro, cmsFloat64Number Go, cmsFloat64Number Bo) +{ + cmsFloat64Number RGB[3]; + cmsFloat64Number Out[3]; + + RGB[0] = R; + RGB[1] = G; + RGB[2] = B; + + cmsDoTransform(xform, RGB, Out, 1); + + return IsGoodVal("R", Ro , Out[0], 0.01) && + IsGoodVal("G", Go , Out[1], 0.01) && + IsGoodVal("B", Bo , Out[2], 0.01); +} + + +static +cmsInt32Number CheckChangeBufferFormat(void) +{ + cmsHPROFILE hsRGB = cmsCreate_sRGBProfile(); + cmsHTRANSFORM xform; + + + xform = cmsCreateTransform(hsRGB, TYPE_RGB_16, hsRGB, TYPE_RGB_16, INTENT_PERCEPTUAL, 0); + cmsCloseProfile(hsRGB); + if (xform == NULL) return 0; + + + if (!CheckOneRGB(xform, 0, 0, 0, 0, 0, 0)) return 0; + if (!CheckOneRGB(xform, 120, 0, 0, 120, 0, 0)) return 0; + if (!CheckOneRGB(xform, 0, 222, 255, 0, 222, 255)) return 0; + + + if (!cmsChangeBuffersFormat(xform, TYPE_BGR_16, TYPE_RGB_16)) return 0; + + if (!CheckOneRGB(xform, 0, 0, 123, 123, 0, 0)) return 0; + if (!CheckOneRGB(xform, 154, 234, 0, 0, 234, 154)) return 0; + + if (!cmsChangeBuffersFormat(xform, TYPE_RGB_DBL, TYPE_RGB_DBL)) return 0; + + if (!CheckOneRGB_double(xform, 0.20, 0, 0, 0.20, 0, 0)) return 0; + if (!CheckOneRGB_double(xform, 0, 0.9, 1, 0, 0.9, 1)) return 0; + + cmsDeleteTransform(xform); + +return 1; +} + + +// Write tag testbed ---------------------------------------------------------------------------------------- + +static +cmsInt32Number CheckXYZ(cmsInt32Number Pass, cmsHPROFILE hProfile, cmsTagSignature tag) +{ + cmsCIEXYZ XYZ, *Pt; + + + switch (Pass) { + + case 1: + + XYZ.X = 1.0; XYZ.Y = 1.1; XYZ.Z = 1.2; + return cmsWriteTag(hProfile, tag, &XYZ); + + case 2: + Pt = (cmsCIEXYZ *) cmsReadTag(hProfile, tag); + if (Pt == NULL) return 0; + return IsGoodFixed15_16("X", 1.0, Pt ->X) && + IsGoodFixed15_16("Y", 1.1, Pt->Y) && + IsGoodFixed15_16("Z", 1.2, Pt -> Z); + + default: + return 0; + } +} + + +static +cmsInt32Number CheckGamma(cmsInt32Number Pass, cmsHPROFILE hProfile, cmsTagSignature tag) +{ + cmsToneCurve *g, *Pt; + cmsInt32Number rc; + + switch (Pass) { + + case 1: + + g = cmsBuildGamma(DbgThread(), 1.0); + rc = cmsWriteTag(hProfile, tag, g); + cmsFreeToneCurve(g); + return rc; + + case 2: + Pt = (cmsToneCurve *) cmsReadTag(hProfile, tag); + if (Pt == NULL) return 0; + return cmsIsToneCurveLinear(Pt); + + default: + return 0; + } +} + +static +cmsInt32Number CheckTextSingle(cmsInt32Number Pass, cmsHPROFILE hProfile, cmsTagSignature tag) +{ + cmsMLU *m, *Pt; + cmsInt32Number rc; + char Buffer[256]; + + + switch (Pass) { + + case 1: + m = cmsMLUalloc(DbgThread(), 0); + cmsMLUsetASCII(m, cmsNoLanguage, cmsNoCountry, "Test test"); + rc = cmsWriteTag(hProfile, tag, m); + cmsMLUfree(m); + return rc; + + case 2: + Pt = (cmsMLU *) cmsReadTag(hProfile, tag); + if (Pt == NULL) return 0; + cmsMLUgetASCII(Pt, cmsNoLanguage, cmsNoCountry, Buffer, 256); + if (strcmp(Buffer, "Test test") != 0) return FALSE; + return TRUE; + + default: + return 0; + } +} + + +static +cmsInt32Number CheckText(cmsInt32Number Pass, cmsHPROFILE hProfile, cmsTagSignature tag) +{ + cmsMLU *m, *Pt; + cmsInt32Number rc; + char Buffer[256]; + + + switch (Pass) { + + case 1: + m = cmsMLUalloc(DbgThread(), 0); + cmsMLUsetASCII(m, cmsNoLanguage, cmsNoCountry, "Test test"); + cmsMLUsetASCII(m, "en", "US", "1 1 1 1"); + cmsMLUsetASCII(m, "es", "ES", "2 2 2 2"); + cmsMLUsetASCII(m, "ct", "ES", "3 3 3 3"); + cmsMLUsetASCII(m, "en", "GB", "444444444"); + rc = cmsWriteTag(hProfile, tag, m); + cmsMLUfree(m); + return rc; + + case 2: + Pt = (cmsMLU *) cmsReadTag(hProfile, tag); + if (Pt == NULL) return 0; + cmsMLUgetASCII(Pt, cmsNoLanguage, cmsNoCountry, Buffer, 256); + if (strcmp(Buffer, "Test test") != 0) return FALSE; + cmsMLUgetASCII(Pt, "en", "US", Buffer, 256); + if (strcmp(Buffer, "1 1 1 1") != 0) return FALSE; + cmsMLUgetASCII(Pt, "es", "ES", Buffer, 256); + if (strcmp(Buffer, "2 2 2 2") != 0) return FALSE; + cmsMLUgetASCII(Pt, "ct", "ES", Buffer, 256); + if (strcmp(Buffer, "3 3 3 3") != 0) return FALSE; + cmsMLUgetASCII(Pt, "en", "GB", Buffer, 256); + if (strcmp(Buffer, "444444444") != 0) return FALSE; + return TRUE; + + default: + return 0; + } +} + +static +cmsInt32Number CheckData(cmsInt32Number Pass, cmsHPROFILE hProfile, cmsTagSignature tag) +{ + cmsICCData *Pt; + cmsICCData d = { 1, 0, { '?' }}; + cmsInt32Number rc; + + + switch (Pass) { + + case 1: + rc = cmsWriteTag(hProfile, tag, &d); + return rc; + + case 2: + Pt = (cmsICCData *) cmsReadTag(hProfile, tag); + if (Pt == NULL) return 0; + return (Pt ->data[0] == '?') && (Pt ->flag == 0) && (Pt ->len == 1); + + default: + return 0; + } +} + + +static +cmsInt32Number CheckSignature(cmsInt32Number Pass, cmsHPROFILE hProfile, cmsTagSignature tag) +{ + cmsTagSignature *Pt, Holder; + + switch (Pass) { + + case 1: + Holder = (cmsTagSignature) cmsSigPerceptualReferenceMediumGamut; + return cmsWriteTag(hProfile, tag, &Holder); + + case 2: + Pt = (cmsTagSignature *) cmsReadTag(hProfile, tag); + if (Pt == NULL) return 0; + return *Pt == cmsSigPerceptualReferenceMediumGamut; + + default: + return 0; + } +} + + +static +cmsInt32Number CheckDateTime(cmsInt32Number Pass, cmsHPROFILE hProfile, cmsTagSignature tag) +{ + struct tm *Pt, Holder; + + switch (Pass) { + + case 1: + + Holder.tm_hour = 1; + Holder.tm_min = 2; + Holder.tm_sec = 3; + Holder.tm_mday = 4; + Holder.tm_mon = 5; + Holder.tm_year = 2009 - 1900; + return cmsWriteTag(hProfile, tag, &Holder); + + case 2: + Pt = (struct tm *) cmsReadTag(hProfile, tag); + if (Pt == NULL) return 0; + + return (Pt ->tm_hour == 1 && + Pt ->tm_min == 2 && + Pt ->tm_sec == 3 && + Pt ->tm_mday == 4 && + Pt ->tm_mon == 5 && + Pt ->tm_year == 2009 - 1900); + + default: + return 0; + } + +} + + +static +cmsInt32Number CheckNamedColor(cmsInt32Number Pass, cmsHPROFILE hProfile, cmsTagSignature tag, cmsInt32Number max_check, cmsBool colorant_check) +{ + cmsNAMEDCOLORLIST* nc; + cmsInt32Number i, j, rc; + char Name[255]; + cmsUInt16Number PCS[3]; + cmsUInt16Number Colorant[cmsMAXCHANNELS]; + char CheckName[255]; + cmsUInt16Number CheckPCS[3]; + cmsUInt16Number CheckColorant[cmsMAXCHANNELS]; + + switch (Pass) { + + case 1: + + nc = cmsAllocNamedColorList(DbgThread(), 0, 4, "prefix", "suffix"); + if (nc == NULL) return 0; + + for (i=0; i < max_check; i++) { + + PCS[0] = PCS[1] = PCS[2] = (cmsUInt16Number) i; + Colorant[0] = Colorant[1] = Colorant[2] = Colorant[3] = (cmsUInt16Number) (max_check - i); + + sprintf(Name, "#%d", i); + if (!cmsAppendNamedColor(nc, Name, PCS, Colorant)) { Fail("Couldn't append named color"); return 0; } + } + + rc = cmsWriteTag(hProfile, tag, nc); + cmsFreeNamedColorList(nc); + return rc; + + case 2: + + nc = (cmsNAMEDCOLORLIST *) cmsReadTag(hProfile, tag); + if (nc == NULL) return 0; + + for (i=0; i < max_check; i++) { + + CheckPCS[0] = CheckPCS[1] = CheckPCS[2] = (cmsUInt16Number) i; + CheckColorant[0] = CheckColorant[1] = CheckColorant[2] = CheckColorant[3] = (cmsUInt16Number) (max_check - i); + + sprintf(CheckName, "#%d", i); + if (!cmsNamedColorInfo(nc, i, Name, NULL, NULL, PCS, Colorant)) { Fail("Invalid string"); return 0; } + + + for (j=0; j < 3; j++) { + if (CheckPCS[j] != PCS[j]) { Fail("Invalid PCS"); return 0; } + } + + // This is only used on named color list + if (colorant_check) { + + for (j=0; j < 4; j++) { + if (CheckColorant[j] != Colorant[j]) { Fail("Invalid Colorant"); return 0; }; + } + } + + if (strcmp(Name, CheckName) != 0) { Fail("Invalid Name"); return 0; }; + } + return 1; + + + default: return 0; + } +} + + +static +cmsInt32Number CheckLUT(cmsInt32Number Pass, cmsHPROFILE hProfile, cmsTagSignature tag) +{ + cmsPipeline* Lut, *Pt; + cmsInt32Number rc; + + + switch (Pass) { + + case 1: + + Lut = cmsPipelineAlloc(DbgThread(), 3, 3); + if (Lut == NULL) return 0; + + // Create an identity LUT + cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocIdentityCurves(DbgThread(), 3)); + cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocIdentityCLut(DbgThread(), 3)); + cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocIdentityCurves(DbgThread(), 3)); + + rc = cmsWriteTag(hProfile, tag, Lut); + cmsPipelineFree(Lut); + return rc; + + case 2: + Pt = (cmsPipeline *) cmsReadTag(hProfile, tag); + if (Pt == NULL) return 0; + + // Transform values, check for identity + return Check16LUT(Pt); + + default: + return 0; + } +} + +static +cmsInt32Number CheckCHAD(cmsInt32Number Pass, cmsHPROFILE hProfile, cmsTagSignature tag) +{ + cmsFloat64Number *Pt; + cmsFloat64Number CHAD[] = { 0, .1, .2, .3, .4, .5, .6, .7, .8 }; + cmsInt32Number i; + + switch (Pass) { + + case 1: + return cmsWriteTag(hProfile, tag, CHAD); + + + case 2: + Pt = (cmsFloat64Number *) cmsReadTag(hProfile, tag); + if (Pt == NULL) return 0; + + for (i=0; i < 9; i++) { + if (!IsGoodFixed15_16("CHAD", Pt[i], CHAD[i])) return 0; + } + + return 1; + + default: + return 0; + } +} + +static +cmsInt32Number CheckChromaticity(cmsInt32Number Pass, cmsHPROFILE hProfile, cmsTagSignature tag) +{ + cmsCIExyYTRIPLE *Pt, c = { {0, .1, 1 }, { .3, .4, 1 }, { .6, .7, 1 }}; + + switch (Pass) { + + case 1: + return cmsWriteTag(hProfile, tag, &c); + + + case 2: + Pt = (cmsCIExyYTRIPLE *) cmsReadTag(hProfile, tag); + if (Pt == NULL) return 0; + + if (!IsGoodFixed15_16("xyY", Pt ->Red.x, c.Red.x)) return 0; + if (!IsGoodFixed15_16("xyY", Pt ->Red.y, c.Red.y)) return 0; + if (!IsGoodFixed15_16("xyY", Pt ->Green.x, c.Green.x)) return 0; + if (!IsGoodFixed15_16("xyY", Pt ->Green.y, c.Green.y)) return 0; + if (!IsGoodFixed15_16("xyY", Pt ->Blue.x, c.Blue.x)) return 0; + if (!IsGoodFixed15_16("xyY", Pt ->Blue.y, c.Blue.y)) return 0; + return 1; + + default: + return 0; + } +} + + +static +cmsInt32Number CheckColorantOrder(cmsInt32Number Pass, cmsHPROFILE hProfile, cmsTagSignature tag) +{ + cmsUInt8Number *Pt, c[cmsMAXCHANNELS]; + cmsInt32Number i; + + switch (Pass) { + + case 1: + for (i=0; i < cmsMAXCHANNELS; i++) c[i] = (cmsUInt8Number) (cmsMAXCHANNELS - i - 1); + return cmsWriteTag(hProfile, tag, c); + + + case 2: + Pt = (cmsUInt8Number *) cmsReadTag(hProfile, tag); + if (Pt == NULL) return 0; + + for (i=0; i < cmsMAXCHANNELS; i++) { + if (Pt[i] != ( cmsMAXCHANNELS - i - 1 )) return 0; + } + return 1; + + default: + return 0; + } +} + +static +cmsInt32Number CheckMeasurement(cmsInt32Number Pass, cmsHPROFILE hProfile, cmsTagSignature tag) +{ + cmsICCMeasurementConditions *Pt, m; + + switch (Pass) { + + case 1: + m.Backing.X = 0.1; + m.Backing.Y = 0.2; + m.Backing.Z = 0.3; + m.Flare = 1.0; + m.Geometry = 1; + m.IlluminantType = cmsILLUMINANT_TYPE_D50; + m.Observer = 1; + return cmsWriteTag(hProfile, tag, &m); + + + case 2: + Pt = (cmsICCMeasurementConditions *) cmsReadTag(hProfile, tag); + if (Pt == NULL) return 0; + + if (!IsGoodFixed15_16("Backing", Pt ->Backing.X, 0.1)) return 0; + if (!IsGoodFixed15_16("Backing", Pt ->Backing.Y, 0.2)) return 0; + if (!IsGoodFixed15_16("Backing", Pt ->Backing.Z, 0.3)) return 0; + if (!IsGoodFixed15_16("Flare", Pt ->Flare, 1.0)) return 0; + + if (Pt ->Geometry != 1) return 0; + if (Pt ->IlluminantType != cmsILLUMINANT_TYPE_D50) return 0; + if (Pt ->Observer != 1) return 0; + return 1; + + default: + return 0; + } +} + + +static +cmsInt32Number CheckUcrBg(cmsInt32Number Pass, cmsHPROFILE hProfile, cmsTagSignature tag) +{ + cmsUcrBg *Pt, m; + cmsInt32Number rc; + char Buffer[256]; + + switch (Pass) { + + case 1: + m.Ucr = cmsBuildGamma(DbgThread(), 2.4); + m.Bg = cmsBuildGamma(DbgThread(), -2.2); + m.Desc = cmsMLUalloc(DbgThread(), 1); + cmsMLUsetASCII(m.Desc, cmsNoLanguage, cmsNoCountry, "test UCR/BG"); + rc = cmsWriteTag(hProfile, tag, &m); + cmsMLUfree(m.Desc); + cmsFreeToneCurve(m.Bg); + cmsFreeToneCurve(m.Ucr); + return rc; + + + case 2: + Pt = (cmsUcrBg *) cmsReadTag(hProfile, tag); + if (Pt == NULL) return 0; + + cmsMLUgetASCII(Pt ->Desc, cmsNoLanguage, cmsNoCountry, Buffer, 256); + if (strcmp(Buffer, "test UCR/BG") != 0) return 0; + return 1; + + default: + return 0; + } +} + + +static +cmsInt32Number CheckCRDinfo(cmsInt32Number Pass, cmsHPROFILE hProfile, cmsTagSignature tag) +{ + cmsMLU *mlu; + char Buffer[256]; + cmsInt32Number rc; + + switch (Pass) { + + case 1: + mlu = cmsMLUalloc(DbgThread(), 5); + + cmsMLUsetWide(mlu, "PS", "nm", L"test postscript"); + cmsMLUsetWide(mlu, "PS", "#0", L"perceptual"); + cmsMLUsetWide(mlu, "PS", "#1", L"relative_colorimetric"); + cmsMLUsetWide(mlu, "PS", "#2", L"saturation"); + cmsMLUsetWide(mlu, "PS", "#3", L"absolute_colorimetric"); + rc = cmsWriteTag(hProfile, tag, mlu); + cmsMLUfree(mlu); + return rc; + + + case 2: + mlu = (cmsMLU*) cmsReadTag(hProfile, tag); + if (mlu == NULL) return 0; + + + + cmsMLUgetASCII(mlu, "PS", "nm", Buffer, 256); + if (strcmp(Buffer, "test postscript") != 0) return 0; + + + cmsMLUgetASCII(mlu, "PS", "#0", Buffer, 256); + if (strcmp(Buffer, "perceptual") != 0) return 0; + + + cmsMLUgetASCII(mlu, "PS", "#1", Buffer, 256); + if (strcmp(Buffer, "relative_colorimetric") != 0) return 0; + + + cmsMLUgetASCII(mlu, "PS", "#2", Buffer, 256); + if (strcmp(Buffer, "saturation") != 0) return 0; + + + cmsMLUgetASCII(mlu, "PS", "#3", Buffer, 256); + if (strcmp(Buffer, "absolute_colorimetric") != 0) return 0; + return 1; + + default: + return 0; + } +} + + +static +cmsToneCurve *CreateSegmentedCurve(void) +{ + cmsCurveSegment Seg[3]; + cmsFloat32Number Sampled[2] = { 0, 1}; + + Seg[0].Type = 6; + Seg[0].Params[0] = 1; + Seg[0].Params[1] = 0; + Seg[0].Params[2] = 0; + Seg[0].Params[3] = 0; + Seg[0].x0 = -1E22F; + Seg[0].x1 = 0; + + Seg[1].Type = 0; + Seg[1].nGridPoints = 2; + Seg[1].SampledPoints = Sampled; + Seg[1].x0 = 0; + Seg[1].x1 = 1; + + Seg[2].Type = 6; + Seg[2].Params[0] = 1; + Seg[2].Params[1] = 0; + Seg[2].Params[2] = 0; + Seg[2].Params[3] = 0; + Seg[2].x0 = 1; + Seg[2].x1 = 1E22F; + + return cmsBuildSegmentedToneCurve(DbgThread(), 3, Seg); +} + + +static +cmsInt32Number CheckMPE(cmsInt32Number Pass, cmsHPROFILE hProfile, cmsTagSignature tag) +{ + cmsPipeline* Lut, *Pt; + cmsToneCurve* G[3]; + cmsInt32Number rc; + + switch (Pass) { + + case 1: + + Lut = cmsPipelineAlloc(DbgThread(), 3, 3); + + cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocLabV2ToV4(DbgThread())); + cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLabV4ToV2(DbgThread())); + AddIdentityCLUTfloat(Lut); + + G[0] = G[1] = G[2] = CreateSegmentedCurve(); + cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocToneCurves(DbgThread(), 3, G)); + cmsFreeToneCurve(G[0]); + + rc = cmsWriteTag(hProfile, tag, Lut); + cmsPipelineFree(Lut); + return rc; + + case 2: + Pt = (cmsPipeline *) cmsReadTag(hProfile, tag); + if (Pt == NULL) return 0; + return CheckFloatLUT(Pt); + + default: + return 0; + } +} + + +static +cmsInt32Number CheckScreening(cmsInt32Number Pass, cmsHPROFILE hProfile, cmsTagSignature tag) +{ + cmsScreening *Pt, sc; + cmsInt32Number rc; + + switch (Pass) { + + case 1: + + sc.Flag = 0; + sc.nChannels = 1; + sc.Channels[0].Frequency = 2.0; + sc.Channels[0].ScreenAngle = 3.0; + sc.Channels[0].SpotShape = cmsSPOT_ELLIPSE; + + rc = cmsWriteTag(hProfile, tag, &sc); + return rc; + + + case 2: + Pt = (cmsScreening *) cmsReadTag(hProfile, tag); + if (Pt == NULL) return 0; + + if (Pt ->nChannels != 1) return 0; + if (Pt ->Flag != 0) return 0; + if (!IsGoodFixed15_16("Freq", Pt ->Channels[0].Frequency, 2.0)) return 0; + if (!IsGoodFixed15_16("Angle", Pt ->Channels[0].ScreenAngle, 3.0)) return 0; + if (Pt ->Channels[0].SpotShape != cmsSPOT_ELLIPSE) return 0; + return 1; + + default: + return 0; + } +} + + +static +cmsBool CheckOneStr(cmsMLU* mlu, cmsInt32Number n) +{ + char Buffer[256], Buffer2[256]; + + + cmsMLUgetASCII(mlu, "en", "US", Buffer, 255); + sprintf(Buffer2, "Hello, world %d", n); + if (strcmp(Buffer, Buffer2) != 0) return FALSE; + + + cmsMLUgetASCII(mlu, "es", "ES", Buffer, 255); + sprintf(Buffer2, "Hola, mundo %d", n); + if (strcmp(Buffer, Buffer2) != 0) return FALSE; + + return TRUE; +} + + +static +void SetOneStr(cmsMLU** mlu, const wchar_t* s1, const wchar_t* s2) +{ + *mlu = cmsMLUalloc(DbgThread(), 0); + cmsMLUsetWide(*mlu, "en", "US", s1); + cmsMLUsetWide(*mlu, "es", "ES", s2); +} + + +static +cmsInt32Number CheckProfileSequenceTag(cmsInt32Number Pass, cmsHPROFILE hProfile) +{ + cmsSEQ* s; + cmsInt32Number i; + + switch (Pass) { + + case 1: + + s = cmsAllocProfileSequenceDescription(DbgThread(), 3); + if (s == NULL) return 0; + + SetOneStr(&s -> seq[0].Manufacturer, L"Hello, world 0", L"Hola, mundo 0"); + SetOneStr(&s -> seq[0].Model, L"Hello, world 0", L"Hola, mundo 0"); + SetOneStr(&s -> seq[1].Manufacturer, L"Hello, world 1", L"Hola, mundo 1"); + SetOneStr(&s -> seq[1].Model, L"Hello, world 1", L"Hola, mundo 1"); + SetOneStr(&s -> seq[2].Manufacturer, L"Hello, world 2", L"Hola, mundo 2"); + SetOneStr(&s -> seq[2].Model, L"Hello, world 2", L"Hola, mundo 2"); + + +#ifdef CMS_DONT_USE_INT64 + s ->seq[0].attributes[0] = cmsTransparency|cmsMatte; + s ->seq[0].attributes[1] = 0; +#else + s ->seq[0].attributes = cmsTransparency|cmsMatte; +#endif + +#ifdef CMS_DONT_USE_INT64 + s ->seq[1].attributes[0] = cmsReflective|cmsMatte; + s ->seq[1].attributes[1] = 0; +#else + s ->seq[1].attributes = cmsReflective|cmsMatte; +#endif + +#ifdef CMS_DONT_USE_INT64 + s ->seq[2].attributes[0] = cmsTransparency|cmsGlossy; + s ->seq[2].attributes[1] = 0; +#else + s ->seq[2].attributes = cmsTransparency|cmsGlossy; +#endif + + if (!cmsWriteTag(hProfile, cmsSigProfileSequenceDescTag, s)) return 0; + cmsFreeProfileSequenceDescription(s); + return 1; + + case 2: + + s = (cmsSEQ *) cmsReadTag(hProfile, cmsSigProfileSequenceDescTag); + if (s == NULL) return 0; + + if (s ->n != 3) return 0; + +#ifdef CMS_DONT_USE_INT64 + if (s ->seq[0].attributes[0] != (cmsTransparency|cmsMatte)) return 0; + if (s ->seq[0].attributes[1] != 0) return 0; +#else + if (s ->seq[0].attributes != (cmsTransparency|cmsMatte)) return 0; +#endif + +#ifdef CMS_DONT_USE_INT64 + if (s ->seq[1].attributes[0] != (cmsReflective|cmsMatte)) return 0; + if (s ->seq[1].attributes[1] != 0) return 0; +#else + if (s ->seq[1].attributes != (cmsReflective|cmsMatte)) return 0; +#endif + +#ifdef CMS_DONT_USE_INT64 + if (s ->seq[2].attributes[0] != (cmsTransparency|cmsGlossy)) return 0; + if (s ->seq[2].attributes[1] != 0) return 0; +#else + if (s ->seq[2].attributes != (cmsTransparency|cmsGlossy)) return 0; +#endif + + // Check MLU + for (i=0; i < 3; i++) { + + if (!CheckOneStr(s -> seq[i].Manufacturer, i)) return 0; + if (!CheckOneStr(s -> seq[i].Model, i)) return 0; + } + return 1; + + default: + return 0; + } +} + + +static +cmsInt32Number CheckProfileSequenceIDTag(cmsInt32Number Pass, cmsHPROFILE hProfile) +{ + cmsSEQ* s; + cmsInt32Number i; + + switch (Pass) { + + case 1: + + s = cmsAllocProfileSequenceDescription(DbgThread(), 3); + if (s == NULL) return 0; + + memcpy(s ->seq[0].ProfileID.ID8, "0123456789ABCDEF", 16); + memcpy(s ->seq[1].ProfileID.ID8, "1111111111111111", 16); + memcpy(s ->seq[2].ProfileID.ID8, "2222222222222222", 16); + + + SetOneStr(&s -> seq[0].Description, L"Hello, world 0", L"Hola, mundo 0"); + SetOneStr(&s -> seq[1].Description, L"Hello, world 1", L"Hola, mundo 1"); + SetOneStr(&s -> seq[2].Description, L"Hello, world 2", L"Hola, mundo 2"); + + if (!cmsWriteTag(hProfile, cmsSigProfileSequenceIdTag, s)) return 0; + cmsFreeProfileSequenceDescription(s); + return 1; + + case 2: + + s = (cmsSEQ *) cmsReadTag(hProfile, cmsSigProfileSequenceIdTag); + if (s == NULL) return 0; + + if (s ->n != 3) return 0; + + if (memcmp(s ->seq[0].ProfileID.ID8, "0123456789ABCDEF", 16) != 0) return 0; + if (memcmp(s ->seq[1].ProfileID.ID8, "1111111111111111", 16) != 0) return 0; + if (memcmp(s ->seq[2].ProfileID.ID8, "2222222222222222", 16) != 0) return 0; + + for (i=0; i < 3; i++) { + + if (!CheckOneStr(s -> seq[i].Description, i)) return 0; + } + + return 1; + + default: + return 0; + } +} + + +static +cmsInt32Number CheckICCViewingConditions(cmsInt32Number Pass, cmsHPROFILE hProfile) +{ + cmsICCViewingConditions* v; + cmsICCViewingConditions s; + + switch (Pass) { + + case 1: + s.IlluminantType = 1; + s.IlluminantXYZ.X = 0.1; + s.IlluminantXYZ.Y = 0.2; + s.IlluminantXYZ.Z = 0.3; + s.SurroundXYZ.X = 0.4; + s.SurroundXYZ.Y = 0.5; + s.SurroundXYZ.Z = 0.6; + + if (!cmsWriteTag(hProfile, cmsSigViewingConditionsTag, &s)) return 0; + return 1; + + case 2: + v = (cmsICCViewingConditions *) cmsReadTag(hProfile, cmsSigViewingConditionsTag); + if (v == NULL) return 0; + + if (v ->IlluminantType != 1) return 0; + if (!IsGoodVal("IlluminantXYZ.X", v ->IlluminantXYZ.X, 0.1, 0.001)) return 0; + if (!IsGoodVal("IlluminantXYZ.Y", v ->IlluminantXYZ.Y, 0.2, 0.001)) return 0; + if (!IsGoodVal("IlluminantXYZ.Z", v ->IlluminantXYZ.Z, 0.3, 0.001)) return 0; + + if (!IsGoodVal("SurroundXYZ.X", v ->SurroundXYZ.X, 0.4, 0.001)) return 0; + if (!IsGoodVal("SurroundXYZ.Y", v ->SurroundXYZ.Y, 0.5, 0.001)) return 0; + if (!IsGoodVal("SurroundXYZ.Z", v ->SurroundXYZ.Z, 0.6, 0.001)) return 0; + + return 1; + + default: + return 0; + } + +} + + +static +cmsInt32Number CheckVCGT(cmsInt32Number Pass, cmsHPROFILE hProfile) +{ + cmsToneCurve* Curves[3]; + cmsToneCurve** PtrCurve; + + switch (Pass) { + + case 1: + Curves[0] = cmsBuildGamma(DbgThread(), 1.1); + Curves[1] = cmsBuildGamma(DbgThread(), 2.2); + Curves[2] = cmsBuildGamma(DbgThread(), 3.4); + + if (!cmsWriteTag(hProfile, cmsSigVcgtTag, Curves)) return 0; + + cmsFreeToneCurveTriple(Curves); + return 1; + + + case 2: + + PtrCurve = (cmsToneCurve **) cmsReadTag(hProfile, cmsSigVcgtTag); + if (PtrCurve == NULL) return 0; + if (!IsGoodVal("VCGT R", cmsEstimateGamma(PtrCurve[0], 0.01), 1.1, 0.001)) return 0; + if (!IsGoodVal("VCGT G", cmsEstimateGamma(PtrCurve[1], 0.01), 2.2, 0.001)) return 0; + if (!IsGoodVal("VCGT B", cmsEstimateGamma(PtrCurve[2], 0.01), 3.4, 0.001)) return 0; + return 1; + + default:; + } + + return 0; +} + + +// Only one of the two following may be used, as they share the same tag +cmsInt32Number CheckDictionary16(cmsInt32Number Pass, cmsHPROFILE hProfile) +{ + cmsHANDLE hDict; + const cmsDICTentry* e; + switch (Pass) { + + case 1: + hDict = cmsDictAlloc(DbgThread()); + cmsDictAddEntry(hDict, L"Name0", NULL, NULL, NULL); + cmsDictAddEntry(hDict, L"Name1", L"", NULL, NULL); + cmsDictAddEntry(hDict, L"Name", L"String", NULL, NULL); + cmsDictAddEntry(hDict, L"Name2", L"12", NULL, NULL); + if (!cmsWriteTag(hProfile, cmsSigMetaTag, hDict)) return 0; + cmsDictFree(hDict); + return 1; + + + case 2: + + hDict = cmsReadTag(hProfile, cmsSigMetaTag); + if (hDict == NULL) return 0; + e = cmsDictGetEntryList(hDict); + if (memcmp(e ->Name, L"Name2", sizeof(wchar_t) * 5) != 0) return 0; + if (memcmp(e ->Value, L"12", sizeof(wchar_t) * 2) != 0) return 0; + e = cmsDictNextEntry(e); + if (memcmp(e ->Name, L"Name", sizeof(wchar_t) * 4) != 0) return 0; + if (memcmp(e ->Value, L"String", sizeof(wchar_t) * 6) != 0) return 0; + e = cmsDictNextEntry(e); + if (memcmp(e ->Name, L"Name1", sizeof(wchar_t) *5) != 0) return 0; + if (e ->Value == NULL) return 0; + if (*e->Value != 0) return 0; + e = cmsDictNextEntry(e); + if (memcmp(e ->Name, L"Name0", sizeof(wchar_t) * 5) != 0) return 0; + if (e ->Value != NULL) return 0; + return 1; + + + default:; + } + + return 0; +} + +cmsInt32Number CheckDictionary24(cmsInt32Number Pass, cmsHPROFILE hProfile) +{ + cmsHANDLE hDict; + const cmsDICTentry* e; + cmsMLU* DisplayName; + char Buffer[256]; + cmsInt32Number rc = 1; + + switch (Pass) { + + case 1: + hDict = cmsDictAlloc(DbgThread()); + + DisplayName = cmsMLUalloc(DbgThread(), 0); + + cmsMLUsetWide(DisplayName, "en", "US", L"Hello, world"); + cmsMLUsetWide(DisplayName, "es", "ES", L"Hola, mundo"); + cmsMLUsetWide(DisplayName, "fr", "FR", L"Bonjour, le monde"); + cmsMLUsetWide(DisplayName, "ca", "CA", L"Hola, mon"); + + cmsDictAddEntry(hDict, L"Name", L"String", DisplayName, NULL); + cmsMLUfree(DisplayName); + + cmsDictAddEntry(hDict, L"Name2", L"12", NULL, NULL); + if (!cmsWriteTag(hProfile, cmsSigMetaTag, hDict)) return 0; + cmsDictFree(hDict); + + return 1; + + + case 2: + + hDict = cmsReadTag(hProfile, cmsSigMetaTag); + if (hDict == NULL) return 0; + + e = cmsDictGetEntryList(hDict); + if (memcmp(e ->Name, L"Name2", sizeof(wchar_t) * 5) != 0) return 0; + if (memcmp(e ->Value, L"12", sizeof(wchar_t) * 2) != 0) return 0; + e = cmsDictNextEntry(e); + if (memcmp(e ->Name, L"Name", sizeof(wchar_t) * 4) != 0) return 0; + if (memcmp(e ->Value, L"String", sizeof(wchar_t) * 6) != 0) return 0; + + cmsMLUgetASCII(e->DisplayName, "en", "US", Buffer, 256); + if (strcmp(Buffer, "Hello, world") != 0) rc = 0; + + + cmsMLUgetASCII(e->DisplayName, "es", "ES", Buffer, 256); + if (strcmp(Buffer, "Hola, mundo") != 0) rc = 0; + + + cmsMLUgetASCII(e->DisplayName, "fr", "FR", Buffer, 256); + if (strcmp(Buffer, "Bonjour, le monde") != 0) rc = 0; + + + cmsMLUgetASCII(e->DisplayName, "ca", "CA", Buffer, 256); + if (strcmp(Buffer, "Hola, mon") != 0) rc = 0; + + if (rc == 0) + Fail("Unexpected string '%s'", Buffer); + return 1; + + default:; + } + + return 0; +} + +static +cmsInt32Number CheckRAWtags(cmsInt32Number Pass, cmsHPROFILE hProfile) +{ + char Buffer[7]; + + switch (Pass) { + + case 1: + return cmsWriteRawTag(hProfile, (cmsTagSignature) 0x31323334, "data123", 7); + + case 2: + if (!cmsReadRawTag(hProfile, (cmsTagSignature) 0x31323334, Buffer, 7)) return 0; + + if (memcmp(Buffer, "data123", 7) != 0) return 0; + return 1; + + default: + return 0; + } +} + + + + + +static +cmsInt32Number Check_cicp(cmsInt32Number Pass, cmsHPROFILE hProfile) +{ + cmsVideoSignalType* v; + cmsVideoSignalType s; + + switch (Pass) { + + case 1: + s.ColourPrimaries = 1; + s.TransferCharacteristics = 13; + s.MatrixCoefficients = 0; + s.VideoFullRangeFlag = 1; + + if (!cmsWriteTag(hProfile, cmsSigcicpTag, &s)) return 0; + return 1; + + case 2: + v = (cmsVideoSignalType*)cmsReadTag(hProfile, cmsSigcicpTag); + if (v == NULL) return 0; + + if (v->ColourPrimaries != 1) return 0; + if (v->TransferCharacteristics != 13) return 0; + if (v->MatrixCoefficients != 0) return 0; + if (v->VideoFullRangeFlag != 1) return 0; + return 1; + + default: + return 0; + } + +} + + +static +void SetMHC2Matrix(cmsFloat64Number XYZ2XYZmatrix[3][4]) +{ + XYZ2XYZmatrix[0][0] = 0.5; XYZ2XYZmatrix[0][1] = 0.1; XYZ2XYZmatrix[0][2] = 0.1; XYZ2XYZmatrix[0][3] = 0.0; + XYZ2XYZmatrix[1][0] = 0.0; XYZ2XYZmatrix[1][1] = 1.0; XYZ2XYZmatrix[1][2] = 0.0; XYZ2XYZmatrix[1][3] = 0.0; + XYZ2XYZmatrix[2][0] = 0.3; XYZ2XYZmatrix[2][1] = 0.2; XYZ2XYZmatrix[2][2] = 0.4; XYZ2XYZmatrix[2][3] = 0.0; +} + +static +cmsBool CloseEnough(cmsFloat64Number a, cmsFloat64Number b) +{ + return fabs(b - a) < (1.0 / 65535.0); +} + +cmsBool IsOriginalMHC2Matrix(cmsFloat64Number XYZ2XYZmatrix[3][4]) +{ + cmsFloat64Number m[3][4]; + int i, j; + + SetMHC2Matrix(m); + + for (i = 0; i < 3; i++) + for (j = 0; j < 4; j++) + if (!CloseEnough(XYZ2XYZmatrix[i][j], m[i][j])) return FALSE; + + return TRUE; +} + + +static +cmsInt32Number Check_MHC2(cmsInt32Number Pass, cmsHPROFILE hProfile) +{ + cmsMHC2Type* v; + cmsMHC2Type s; + double curve[] = { 0, 0.5, 1.0 }; + + switch (Pass) { + + case 1: + SetMHC2Matrix(s.XYZ2XYZmatrix); + s.CurveEntries = 3; + s.GreenCurve = curve; + s.RedCurve = curve; + s.BlueCurve = curve; + s.MinLuminance = 0.1; + s.PeakLuminance = 100.0; + + if (!cmsWriteTag(hProfile, cmsSigMHC2Tag, &s)) return 0; + return 1; + + case 2: + v = (cmsMHC2Type*)cmsReadTag(hProfile, cmsSigMHC2Tag); + if (v == NULL) return 0; + + if (!IsOriginalMHC2Matrix(v->XYZ2XYZmatrix)) return 0; + if (v->CurveEntries != 3) return 0; + return 1; + + default: + return 0; + } + +} + + +// This is a very big test that checks every single tag +static +cmsInt32Number CheckProfileCreation(void) +{ + cmsHPROFILE h; + cmsInt32Number Pass; + + h = cmsCreateProfilePlaceholder(DbgThread()); + if (h == NULL) return 0; + + cmsSetProfileVersion(h, 4.3); + if (cmsGetTagCount(h) != 0) { Fail("Empty profile with nonzero number of tags"); goto Error; } + if (cmsIsTag(h, cmsSigAToB0Tag)) { Fail("Found a tag in an empty profile"); goto Error; } + + cmsSetColorSpace(h, cmsSigRgbData); + if (cmsGetColorSpace(h) != cmsSigRgbData) { Fail("Unable to set colorspace"); goto Error; } + + cmsSetPCS(h, cmsSigLabData); + if (cmsGetPCS(h) != cmsSigLabData) { Fail("Unable to set colorspace"); goto Error; } + + cmsSetDeviceClass(h, cmsSigDisplayClass); + if (cmsGetDeviceClass(h) != cmsSigDisplayClass) { Fail("Unable to set deviceclass"); goto Error; } + + cmsSetHeaderRenderingIntent(h, INTENT_SATURATION); + if (cmsGetHeaderRenderingIntent(h) != INTENT_SATURATION) { Fail("Unable to set rendering intent"); goto Error; } + + for (Pass = 1; Pass <= 2; Pass++) { + + SubTest("Tags holding XYZ"); + + if (!CheckXYZ(Pass, h, cmsSigBlueColorantTag)) goto Error; + if (!CheckXYZ(Pass, h, cmsSigGreenColorantTag)) goto Error; + if (!CheckXYZ(Pass, h, cmsSigRedColorantTag)) goto Error; + if (!CheckXYZ(Pass, h, cmsSigMediaBlackPointTag)) goto Error; + if (!CheckXYZ(Pass, h, cmsSigMediaWhitePointTag)) goto Error; + if (!CheckXYZ(Pass, h, cmsSigLuminanceTag)) goto Error; + + SubTest("Tags holding curves"); + + if (!CheckGamma(Pass, h, cmsSigBlueTRCTag)) goto Error; + if (!CheckGamma(Pass, h, cmsSigGrayTRCTag)) goto Error; + if (!CheckGamma(Pass, h, cmsSigGreenTRCTag)) goto Error; + if (!CheckGamma(Pass, h, cmsSigRedTRCTag)) goto Error; + + SubTest("Tags holding text"); + + if (!CheckTextSingle(Pass, h, cmsSigCharTargetTag)) goto Error; + if (!CheckTextSingle(Pass, h, cmsSigScreeningDescTag)) goto Error; + + if (!CheckText(Pass, h, cmsSigCopyrightTag)) goto Error; + if (!CheckText(Pass, h, cmsSigProfileDescriptionTag)) goto Error; + if (!CheckText(Pass, h, cmsSigDeviceMfgDescTag)) goto Error; + if (!CheckText(Pass, h, cmsSigDeviceModelDescTag)) goto Error; + if (!CheckText(Pass, h, cmsSigViewingCondDescTag)) goto Error; + + + + SubTest("Tags holding cmsICCData"); + + if (!CheckData(Pass, h, cmsSigPs2CRD0Tag)) goto Error; + if (!CheckData(Pass, h, cmsSigPs2CRD1Tag)) goto Error; + if (!CheckData(Pass, h, cmsSigPs2CRD2Tag)) goto Error; + if (!CheckData(Pass, h, cmsSigPs2CRD3Tag)) goto Error; + if (!CheckData(Pass, h, cmsSigPs2CSATag)) goto Error; + if (!CheckData(Pass, h, cmsSigPs2RenderingIntentTag)) goto Error; + + SubTest("Tags holding signatures"); + + if (!CheckSignature(Pass, h, cmsSigColorimetricIntentImageStateTag)) goto Error; + if (!CheckSignature(Pass, h, cmsSigPerceptualRenderingIntentGamutTag)) goto Error; + if (!CheckSignature(Pass, h, cmsSigSaturationRenderingIntentGamutTag)) goto Error; + if (!CheckSignature(Pass, h, cmsSigTechnologyTag)) goto Error; + + SubTest("Tags holding date_time"); + + if (!CheckDateTime(Pass, h, cmsSigCalibrationDateTimeTag)) goto Error; + if (!CheckDateTime(Pass, h, cmsSigDateTimeTag)) goto Error; + + SubTest("Tags holding named color lists"); + + if (!CheckNamedColor(Pass, h, cmsSigColorantTableTag, 15, FALSE)) goto Error; + if (!CheckNamedColor(Pass, h, cmsSigColorantTableOutTag, 15, FALSE)) goto Error; + if (!CheckNamedColor(Pass, h, cmsSigNamedColor2Tag, 4096, TRUE)) goto Error; + + SubTest("Tags holding LUTs"); + + if (!CheckLUT(Pass, h, cmsSigAToB0Tag)) goto Error; + if (!CheckLUT(Pass, h, cmsSigAToB1Tag)) goto Error; + if (!CheckLUT(Pass, h, cmsSigAToB2Tag)) goto Error; + if (!CheckLUT(Pass, h, cmsSigBToA0Tag)) goto Error; + if (!CheckLUT(Pass, h, cmsSigBToA1Tag)) goto Error; + if (!CheckLUT(Pass, h, cmsSigBToA2Tag)) goto Error; + if (!CheckLUT(Pass, h, cmsSigPreview0Tag)) goto Error; + if (!CheckLUT(Pass, h, cmsSigPreview1Tag)) goto Error; + if (!CheckLUT(Pass, h, cmsSigPreview2Tag)) goto Error; + if (!CheckLUT(Pass, h, cmsSigGamutTag)) goto Error; + + SubTest("Tags holding CHAD"); + if (!CheckCHAD(Pass, h, cmsSigChromaticAdaptationTag)) goto Error; + + SubTest("Tags holding Chromaticity"); + if (!CheckChromaticity(Pass, h, cmsSigChromaticityTag)) goto Error; + + SubTest("Tags holding colorant order"); + if (!CheckColorantOrder(Pass, h, cmsSigColorantOrderTag)) goto Error; + + SubTest("Tags holding measurement"); + if (!CheckMeasurement(Pass, h, cmsSigMeasurementTag)) goto Error; + + SubTest("Tags holding CRD info"); + if (!CheckCRDinfo(Pass, h, cmsSigCrdInfoTag)) goto Error; + + SubTest("Tags holding UCR/BG"); + if (!CheckUcrBg(Pass, h, cmsSigUcrBgTag)) goto Error; + + SubTest("Tags holding MPE"); + if (!CheckMPE(Pass, h, cmsSigDToB0Tag)) goto Error; + if (!CheckMPE(Pass, h, cmsSigDToB1Tag)) goto Error; + if (!CheckMPE(Pass, h, cmsSigDToB2Tag)) goto Error; + if (!CheckMPE(Pass, h, cmsSigDToB3Tag)) goto Error; + if (!CheckMPE(Pass, h, cmsSigBToD0Tag)) goto Error; + if (!CheckMPE(Pass, h, cmsSigBToD1Tag)) goto Error; + if (!CheckMPE(Pass, h, cmsSigBToD2Tag)) goto Error; + if (!CheckMPE(Pass, h, cmsSigBToD3Tag)) goto Error; + + SubTest("Tags using screening"); + if (!CheckScreening(Pass, h, cmsSigScreeningTag)) goto Error; + + SubTest("Tags holding profile sequence description"); + if (!CheckProfileSequenceTag(Pass, h)) goto Error; + if (!CheckProfileSequenceIDTag(Pass, h)) goto Error; + + SubTest("Tags holding ICC viewing conditions"); + if (!CheckICCViewingConditions(Pass, h)) goto Error; + + SubTest("VCGT tags"); + if (!CheckVCGT(Pass, h)) goto Error; + + SubTest("RAW tags"); + if (!CheckRAWtags(Pass, h)) goto Error; + + SubTest("Dictionary meta tags"); + // if (!CheckDictionary16(Pass, h)) goto Error; + if (!CheckDictionary24(Pass, h)) goto Error; + + SubTest("cicp Video Signal Type"); + if (!Check_cicp(Pass, h)) goto Error; + + SubTest("Microsoft MHC2 tag"); + if (!Check_MHC2(Pass, h)) goto Error; + + + if (Pass == 1) { + cmsSaveProfileToFile(h, "alltags.icc"); + cmsCloseProfile(h); + h = cmsOpenProfileFromFileTHR(DbgThread(), "alltags.icc", "r"); + } + + } + + /* + Not implemented (by design): + + cmsSigDataTag = 0x64617461, // 'data' -- Unused + cmsSigDeviceSettingsTag = 0x64657673, // 'devs' -- Unused + cmsSigNamedColorTag = 0x6E636f6C, // 'ncol' -- Don't use this one, deprecated by ICC + cmsSigOutputResponseTag = 0x72657370, // 'resp' -- Possible patent on this + */ + + cmsCloseProfile(h); + remove("alltags.icc"); + return 1; + +Error: + cmsCloseProfile(h); + remove("alltags.icc"); + return 0; +} + + +// Thanks to Christopher James Halse Rogers for the bugfixing and providing this test +static +cmsInt32Number CheckVersionHeaderWriting(void) +{ + cmsHPROFILE h; + int index; + float test_versions[] = { + 2.3f, + 4.08f, + 4.09f, + 4.3f + }; + + for (index = 0; index < sizeof(test_versions)/sizeof(test_versions[0]); index++) { + + h = cmsCreateProfilePlaceholder(DbgThread()); + if (h == NULL) return 0; + + cmsSetProfileVersion(h, test_versions[index]); + + cmsSaveProfileToFile(h, "versions.icc"); + cmsCloseProfile(h); + + h = cmsOpenProfileFromFileTHR(DbgThread(), "versions.icc", "r"); + + // Only the first 3 digits are significant + if (fabs(cmsGetProfileVersion(h) - test_versions[index]) > 0.005) { + Fail("Version failed to round-trip: wrote %.2f, read %.2f", + test_versions[index], cmsGetProfileVersion(h)); + return 0; + } + + cmsCloseProfile(h); + remove("versions.icc"); + } + return 1; +} + + +// Test on Richard Hughes "crayons.icc" +static +cmsInt32Number CheckMultilocalizedProfile(void) +{ + cmsHPROFILE hProfile; + cmsMLU *Pt; + char Buffer[256]; + + hProfile = cmsOpenProfileFromFile("crayons.icc", "r"); + + Pt = (cmsMLU *) cmsReadTag(hProfile, cmsSigProfileDescriptionTag); + cmsMLUgetASCII(Pt, "en", "GB", Buffer, 256); + if (strcmp(Buffer, "Crayon Colours") != 0) return FALSE; + cmsMLUgetASCII(Pt, "en", "US", Buffer, 256); + if (strcmp(Buffer, "Crayon Colors") != 0) return FALSE; + + cmsCloseProfile(hProfile); + + return TRUE; +} + + +// Error reporting ------------------------------------------------------------------------------------------------------- + + +static +void ErrorReportingFunction(cmsContext ContextID, cmsUInt32Number ErrorCode, const char *Text) +{ + TrappedError = TRUE; + SimultaneousErrors++; + strncpy(ReasonToFailBuffer, Text, TEXT_ERROR_BUFFER_SIZE-1); + + cmsUNUSED_PARAMETER(ContextID); + cmsUNUSED_PARAMETER(ErrorCode); +} + + +static +cmsInt32Number CheckBadProfiles(void) +{ + cmsHPROFILE h; + + h = cmsOpenProfileFromFileTHR(DbgThread(), "IDoNotExist.icc", "r"); + if (h != NULL) { + cmsCloseProfile(h); + return 0; + } + + h = cmsOpenProfileFromFileTHR(DbgThread(), "IAmIllFormed*.icc", "r"); + if (h != NULL) { + cmsCloseProfile(h); + return 0; + } + + // No profile name given + h = cmsOpenProfileFromFileTHR(DbgThread(), "", "r"); + if (h != NULL) { + cmsCloseProfile(h); + return 0; + } + + h = cmsOpenProfileFromFileTHR(DbgThread(), "..", "r"); + if (h != NULL) { + cmsCloseProfile(h); + return 0; + } + + h = cmsOpenProfileFromFileTHR(DbgThread(), "IHaveBadAccessMode.icc", "@"); + if (h != NULL) { + cmsCloseProfile(h); + return 0; + } + + h = cmsOpenProfileFromFileTHR(DbgThread(), "bad.icc", "r"); + if (h != NULL) { + cmsCloseProfile(h); + return 0; + } + + h = cmsOpenProfileFromFileTHR(DbgThread(), "toosmall.icc", "r"); + if (h != NULL) { + cmsCloseProfile(h); + return 0; + } + + h = cmsOpenProfileFromMemTHR(DbgThread(), NULL, 3); + if (h != NULL) { + cmsCloseProfile(h); + return 0; + } + + h = cmsOpenProfileFromMemTHR(DbgThread(), "123", 3); + if (h != NULL) { + cmsCloseProfile(h); + return 0; + } + + if (SimultaneousErrors != 9) return 0; + + return 1; +} + + +static +cmsInt32Number CheckErrReportingOnBadProfiles(void) +{ + cmsInt32Number rc; + + cmsSetLogErrorHandler(ErrorReportingFunction); + rc = CheckBadProfiles(); + cmsSetLogErrorHandler(FatalErrorQuit); + + // Reset the error state + TrappedError = FALSE; + return rc; +} + + +static +cmsInt32Number CheckBadTransforms(void) +{ + cmsHPROFILE h1 = cmsCreate_sRGBProfile(); + cmsHTRANSFORM x1; + + x1 = cmsCreateTransform(NULL, 0, NULL, 0, 0, 0); + if (x1 != NULL) { + cmsDeleteTransform(x1); + return 0; + } + + + + x1 = cmsCreateTransform(h1, TYPE_RGB_8, h1, TYPE_RGB_8, 12345, 0); + if (x1 != NULL) { + cmsDeleteTransform(x1); + return 0; + } + + x1 = cmsCreateTransform(h1, TYPE_CMYK_8, h1, TYPE_RGB_8, 0, 0); + if (x1 != NULL) { + cmsDeleteTransform(x1); + return 0; + } + + x1 = cmsCreateTransform(h1, TYPE_RGB_8, h1, TYPE_CMYK_8, 1, 0); + if (x1 != NULL) { + cmsDeleteTransform(x1); + return 0; + } + + // sRGB does its output as XYZ! + x1 = cmsCreateTransform(h1, TYPE_RGB_8, NULL, TYPE_Lab_8, 1, 0); + if (x1 != NULL) { + cmsDeleteTransform(x1); + return 0; + } + + cmsCloseProfile(h1); + + + { + + cmsHPROFILE hp1 = cmsOpenProfileFromFile("test1.icc", "r"); + cmsHPROFILE hp2 = cmsCreate_sRGBProfile(); + + x1 = cmsCreateTransform(hp1, TYPE_BGR_8, hp2, TYPE_BGR_8, INTENT_PERCEPTUAL, 0); + + cmsCloseProfile(hp1); cmsCloseProfile(hp2); + if (x1 != NULL) { + cmsDeleteTransform(x1); + return 0; + } + } + + return 1; + +} + +static +cmsInt32Number CheckErrReportingOnBadTransforms(void) +{ + cmsInt32Number rc; + + cmsSetLogErrorHandler(ErrorReportingFunction); + rc = CheckBadTransforms(); + cmsSetLogErrorHandler(FatalErrorQuit); + + // Reset the error state + TrappedError = FALSE; + return rc; +} + + + + +// --------------------------------------------------------------------------------------------------------- + +// Check a linear xform +static +cmsInt32Number Check8linearXFORM(cmsHTRANSFORM xform, cmsInt32Number nChan) +{ + cmsInt32Number n2, i, j; + cmsUInt8Number Inw[cmsMAXCHANNELS], Outw[cmsMAXCHANNELS]; + + n2=0; + + for (j=0; j < 0xFF; j++) { + + memset(Inw, j, sizeof(Inw)); + cmsDoTransform(xform, Inw, Outw, 1); + + for (i=0; i < nChan; i++) { + + cmsInt32Number dif = abs(Outw[i] - j); + if (dif > n2) n2 = dif; + + } + } + + // We allow 2 contone of difference on 8 bits + if (n2 > 2) { + + Fail("Differences too big (%x)", n2); + return 0; + } + + return 1; +} + +static +cmsInt32Number Compare8bitXFORM(cmsHTRANSFORM xform1, cmsHTRANSFORM xform2, cmsInt32Number nChan) +{ + cmsInt32Number n2, i, j; + cmsUInt8Number Inw[cmsMAXCHANNELS], Outw1[cmsMAXCHANNELS], Outw2[cmsMAXCHANNELS];; + + n2=0; + + for (j=0; j < 0xFF; j++) { + + memset(Inw, j, sizeof(Inw)); + cmsDoTransform(xform1, Inw, Outw1, 1); + cmsDoTransform(xform2, Inw, Outw2, 1); + + for (i=0; i < nChan; i++) { + + cmsInt32Number dif = abs(Outw2[i] - Outw1[i]); + if (dif > n2) n2 = dif; + + } + } + + // We allow 2 contone of difference on 8 bits + if (n2 > 2) { + + Fail("Differences too big (%x)", n2); + return 0; + } + + + return 1; +} + + +// Check a linear xform +static +cmsInt32Number Check16linearXFORM(cmsHTRANSFORM xform, cmsInt32Number nChan) +{ + cmsInt32Number n2, i, j; + cmsUInt16Number Inw[cmsMAXCHANNELS], Outw[cmsMAXCHANNELS]; + + n2=0; + for (j=0; j < 0xFFFF; j++) { + + for (i=0; i < nChan; i++) Inw[i] = (cmsUInt16Number) j; + + cmsDoTransform(xform, Inw, Outw, 1); + + for (i=0; i < nChan; i++) { + + cmsInt32Number dif = abs(Outw[i] - j); + if (dif > n2) n2 = dif; + + } + + + // We allow 2 contone of difference on 16 bits + if (n2 > 0x200) { + + Fail("Differences too big (%x)", n2); + return 0; + } + } + + return 1; +} + +static +cmsInt32Number Compare16bitXFORM(cmsHTRANSFORM xform1, cmsHTRANSFORM xform2, cmsInt32Number nChan) +{ + cmsInt32Number n2, i, j; + cmsUInt16Number Inw[cmsMAXCHANNELS], Outw1[cmsMAXCHANNELS], Outw2[cmsMAXCHANNELS];; + + n2=0; + + for (j=0; j < 0xFFFF; j++) { + + for (i=0; i < nChan; i++) Inw[i] = (cmsUInt16Number) j; + + cmsDoTransform(xform1, Inw, Outw1, 1); + cmsDoTransform(xform2, Inw, Outw2, 1); + + for (i=0; i < nChan; i++) { + + cmsInt32Number dif = abs(Outw2[i] - Outw1[i]); + if (dif > n2) n2 = dif; + + } + } + + // We allow 2 contone of difference on 16 bits + if (n2 > 0x200) { + + Fail("Differences too big (%x)", n2); + return 0; + } + + + return 1; +} + + +// Check a linear xform +static +cmsInt32Number CheckFloatlinearXFORM(cmsHTRANSFORM xform, cmsInt32Number nChan) +{ + cmsInt32Number i, j; + cmsFloat32Number In[cmsMAXCHANNELS], Out[cmsMAXCHANNELS]; + + for (j=0; j < 0xFFFF; j++) { + + for (i=0; i < nChan; i++) In[i] = (cmsFloat32Number) (j / 65535.0);; + + cmsDoTransform(xform, In, Out, 1); + + for (i=0; i < nChan; i++) { + + // We allow no difference in floating point + if (!IsGoodFixed15_16("linear xform cmsFloat32Number", Out[i], (cmsFloat32Number) (j / 65535.0))) + return 0; + } + } + + return 1; +} + + +// Check a linear xform +static +cmsInt32Number CompareFloatXFORM(cmsHTRANSFORM xform1, cmsHTRANSFORM xform2, cmsInt32Number nChan) +{ + cmsInt32Number i, j; + cmsFloat32Number In[cmsMAXCHANNELS], Out1[cmsMAXCHANNELS], Out2[cmsMAXCHANNELS]; + + for (j=0; j < 0xFFFF; j++) { + + for (i=0; i < nChan; i++) In[i] = (cmsFloat32Number) (j / 65535.0);; + + cmsDoTransform(xform1, In, Out1, 1); + cmsDoTransform(xform2, In, Out2, 1); + + for (i=0; i < nChan; i++) { + + // We allow no difference in floating point + if (!IsGoodFixed15_16("linear xform cmsFloat32Number", Out1[i], Out2[i])) + return 0; + } + + } + + return 1; +} + + +// Curves only transforms ---------------------------------------------------------------------------------------- + +static +cmsInt32Number CheckCurvesOnlyTransforms(void) +{ + + cmsHTRANSFORM xform1, xform2; + cmsHPROFILE h1, h2, h3; + cmsToneCurve* c1, *c2, *c3; + cmsInt32Number rc = 1; + + + c1 = cmsBuildGamma(DbgThread(), 2.2); + c2 = cmsBuildGamma(DbgThread(), 1/2.2); + c3 = cmsBuildGamma(DbgThread(), 4.84); + + h1 = cmsCreateLinearizationDeviceLinkTHR(DbgThread(), cmsSigGrayData, &c1); + h2 = cmsCreateLinearizationDeviceLinkTHR(DbgThread(), cmsSigGrayData, &c2); + h3 = cmsCreateLinearizationDeviceLinkTHR(DbgThread(), cmsSigGrayData, &c3); + + SubTest("Gray float optimizeable transform"); + xform1 = cmsCreateTransform(h1, TYPE_GRAY_FLT, h2, TYPE_GRAY_FLT, INTENT_PERCEPTUAL, 0); + rc &= CheckFloatlinearXFORM(xform1, 1); + cmsDeleteTransform(xform1); + if (rc == 0) goto Error; + + SubTest("Gray 8 optimizeable transform"); + xform1 = cmsCreateTransform(h1, TYPE_GRAY_8, h2, TYPE_GRAY_8, INTENT_PERCEPTUAL, 0); + rc &= Check8linearXFORM(xform1, 1); + cmsDeleteTransform(xform1); + if (rc == 0) goto Error; + + SubTest("Gray 16 optimizeable transform"); + xform1 = cmsCreateTransform(h1, TYPE_GRAY_16, h2, TYPE_GRAY_16, INTENT_PERCEPTUAL, 0); + rc &= Check16linearXFORM(xform1, 1); + cmsDeleteTransform(xform1); + if (rc == 0) goto Error; + + SubTest("Gray float non-optimizeable transform"); + xform1 = cmsCreateTransform(h1, TYPE_GRAY_FLT, h1, TYPE_GRAY_FLT, INTENT_PERCEPTUAL, 0); + xform2 = cmsCreateTransform(h3, TYPE_GRAY_FLT, NULL, TYPE_GRAY_FLT, INTENT_PERCEPTUAL, 0); + + rc &= CompareFloatXFORM(xform1, xform2, 1); + cmsDeleteTransform(xform1); + cmsDeleteTransform(xform2); + if (rc == 0) goto Error; + + SubTest("Gray 8 non-optimizeable transform"); + xform1 = cmsCreateTransform(h1, TYPE_GRAY_8, h1, TYPE_GRAY_8, INTENT_PERCEPTUAL, 0); + xform2 = cmsCreateTransform(h3, TYPE_GRAY_8, NULL, TYPE_GRAY_8, INTENT_PERCEPTUAL, 0); + + rc &= Compare8bitXFORM(xform1, xform2, 1); + cmsDeleteTransform(xform1); + cmsDeleteTransform(xform2); + if (rc == 0) goto Error; + + + SubTest("Gray 16 non-optimizeable transform"); + xform1 = cmsCreateTransform(h1, TYPE_GRAY_16, h1, TYPE_GRAY_16, INTENT_PERCEPTUAL, 0); + xform2 = cmsCreateTransform(h3, TYPE_GRAY_16, NULL, TYPE_GRAY_16, INTENT_PERCEPTUAL, 0); + + rc &= Compare16bitXFORM(xform1, xform2, 1); + cmsDeleteTransform(xform1); + cmsDeleteTransform(xform2); + if (rc == 0) goto Error; + +Error: + + cmsCloseProfile(h1); cmsCloseProfile(h2); cmsCloseProfile(h3); + cmsFreeToneCurve(c1); cmsFreeToneCurve(c2); cmsFreeToneCurve(c3); + + return rc; +} + + + +// Lab to Lab trivial transforms ---------------------------------------------------------------------------------------- + +static cmsFloat64Number MaxDE; + +static +cmsInt32Number CheckOneLab(cmsHTRANSFORM xform, cmsFloat64Number L, cmsFloat64Number a, cmsFloat64Number b) +{ + cmsCIELab In, Out; + cmsFloat64Number dE; + + In.L = L; In.a = a; In.b = b; + cmsDoTransform(xform, &In, &Out, 1); + + dE = cmsDeltaE(&In, &Out); + + if (dE > MaxDE) MaxDE = dE; + + if (MaxDE > 0.003) { + Fail("dE=%f Lab1=(%f, %f, %f)\n\tLab2=(%f %f %f)", MaxDE, In.L, In.a, In.b, Out.L, Out.a, Out.b); + cmsDoTransform(xform, &In, &Out, 1); + return 0; + } + + return 1; +} + +// Check several Lab, slicing at non-exact values. Precision should be 16 bits. 50x50x50 checks aprox. +static +cmsInt32Number CheckSeveralLab(cmsHTRANSFORM xform) +{ + cmsInt32Number L, a, b; + + MaxDE = 0; + for (L=0; L < 65536; L += 1311) { + + for (a = 0; a < 65536; a += 1232) { + + for (b = 0; b < 65536; b += 1111) { + + if (!CheckOneLab(xform, (L * 100.0) / 65535.0, + (a / 257.0) - 128, (b / 257.0) - 128)) + return 0; + } + + } + + } + return 1; +} + + +static +cmsInt32Number OneTrivialLab(cmsHPROFILE hLab1, cmsHPROFILE hLab2, const char* txt) +{ + cmsHTRANSFORM xform; + cmsInt32Number rc; + + SubTest(txt); + xform = cmsCreateTransformTHR(DbgThread(), hLab1, TYPE_Lab_DBL, hLab2, TYPE_Lab_DBL, INTENT_RELATIVE_COLORIMETRIC, 0); + cmsCloseProfile(hLab1); cmsCloseProfile(hLab2); + + rc = CheckSeveralLab(xform); + cmsDeleteTransform(xform); + return rc; +} + + +static +cmsInt32Number CheckFloatLabTransforms(void) +{ + return OneTrivialLab(cmsCreateLab4ProfileTHR(DbgThread(), NULL), cmsCreateLab4ProfileTHR(DbgThread(), NULL), "Lab4/Lab4") && + OneTrivialLab(cmsCreateLab2ProfileTHR(DbgThread(), NULL), cmsCreateLab2ProfileTHR(DbgThread(), NULL), "Lab2/Lab2") && + OneTrivialLab(cmsCreateLab4ProfileTHR(DbgThread(), NULL), cmsCreateLab2ProfileTHR(DbgThread(), NULL), "Lab4/Lab2") && + OneTrivialLab(cmsCreateLab2ProfileTHR(DbgThread(), NULL), cmsCreateLab4ProfileTHR(DbgThread(), NULL), "Lab2/Lab4"); +} + + +static +cmsInt32Number CheckEncodedLabTransforms(void) +{ + cmsHTRANSFORM xform; + cmsUInt16Number In[3]; + cmsUInt16Number wLab[3]; + cmsCIELab Lab; + cmsCIELab White = { 100, 0, 0 }; + cmsCIELab Color = { 7.11070, -76, 26 }; + cmsHPROFILE hLab1 = cmsCreateLab4ProfileTHR(DbgThread(), NULL); + cmsHPROFILE hLab2 = cmsCreateLab4ProfileTHR(DbgThread(), NULL); + + + xform = cmsCreateTransformTHR(DbgThread(), hLab1, TYPE_Lab_16, hLab2, TYPE_Lab_DBL, INTENT_RELATIVE_COLORIMETRIC, 0); + cmsCloseProfile(hLab1); cmsCloseProfile(hLab2); + + In[0] = 0xFFFF; + In[1] = 0x8080; + In[2] = 0x8080; + + cmsDoTransform(xform, In, &Lab, 1); + + if (cmsDeltaE(&Lab, &White) > 0.0001) return 0; + + + In[0] = 0x1234; + In[1] = 0x3434; + In[2] = 0x9A9A; + + cmsDoTransform(xform, In, &Lab, 1); + cmsFloat2LabEncoded(wLab, &Lab); + if (memcmp(In, wLab, sizeof(wLab)) != 0) return 0; + if (cmsDeltaE(&Lab, &Color) > 0.0001) return 0; + + + cmsDeleteTransform(xform); + + hLab1 = cmsCreateLab2ProfileTHR(DbgThread(), NULL); + hLab2 = cmsCreateLab4ProfileTHR(DbgThread(), NULL); + + xform = cmsCreateTransformTHR(DbgThread(), hLab1, TYPE_LabV2_16, hLab2, TYPE_Lab_DBL, INTENT_RELATIVE_COLORIMETRIC, 0); + cmsCloseProfile(hLab1); cmsCloseProfile(hLab2); + + In[0] = 0xFF00; + In[1] = 0x8000; + In[2] = 0x8000; + + cmsDoTransform(xform, In, &Lab, 1); + + if (cmsDeltaE(&Lab, &White) > 0.0001) return 0; + + cmsDeleteTransform(xform); + + hLab2 = cmsCreateLab2ProfileTHR(DbgThread(), NULL); + hLab1 = cmsCreateLab4ProfileTHR(DbgThread(), NULL); + + xform = cmsCreateTransformTHR(DbgThread(), hLab1, TYPE_Lab_DBL, hLab2, TYPE_LabV2_16, INTENT_RELATIVE_COLORIMETRIC, 0); + cmsCloseProfile(hLab1); cmsCloseProfile(hLab2); + + Lab.L = 100; + Lab.a = 0; + Lab.b = 0; + + cmsDoTransform(xform, &Lab, In, 1); + if (In[0] != 0xFF00 || + In[1] != 0x8000 || + In[2] != 0x8000) return 0; + + cmsDeleteTransform(xform); + + hLab1 = cmsCreateLab4ProfileTHR(DbgThread(), NULL); + hLab2 = cmsCreateLab4ProfileTHR(DbgThread(), NULL); + + xform = cmsCreateTransformTHR(DbgThread(), hLab1, TYPE_Lab_DBL, hLab2, TYPE_Lab_16, INTENT_RELATIVE_COLORIMETRIC, 0); + cmsCloseProfile(hLab1); cmsCloseProfile(hLab2); + + Lab.L = 100; + Lab.a = 0; + Lab.b = 0; + + cmsDoTransform(xform, &Lab, In, 1); + + if (In[0] != 0xFFFF || + In[1] != 0x8080 || + In[2] != 0x8080) return 0; + + cmsDeleteTransform(xform); + + return 1; +} + +static +cmsInt32Number CheckStoredIdentities(void) +{ + cmsHPROFILE hLab, hLink, h4, h2; + cmsHTRANSFORM xform; + cmsInt32Number rc = 1; + + hLab = cmsCreateLab4ProfileTHR(DbgThread(), NULL); + xform = cmsCreateTransformTHR(DbgThread(), hLab, TYPE_Lab_8, hLab, TYPE_Lab_8, 0, 0); + + hLink = cmsTransform2DeviceLink(xform, 3.4, 0); + cmsSaveProfileToFile(hLink, "abstractv2.icc"); + cmsCloseProfile(hLink); + + hLink = cmsTransform2DeviceLink(xform, 4.3, 0); + cmsSaveProfileToFile(hLink, "abstractv4.icc"); + cmsCloseProfile(hLink); + + cmsDeleteTransform(xform); + cmsCloseProfile(hLab); + + h4 = cmsOpenProfileFromFileTHR(DbgThread(), "abstractv4.icc", "r"); + + xform = cmsCreateTransformTHR(DbgThread(), h4, TYPE_Lab_DBL, h4, TYPE_Lab_DBL, INTENT_RELATIVE_COLORIMETRIC, 0); + + SubTest("V4"); + rc &= CheckSeveralLab(xform); + + cmsDeleteTransform(xform); + cmsCloseProfile(h4); + if (!rc) goto Error; + + + SubTest("V2"); + h2 = cmsOpenProfileFromFileTHR(DbgThread(), "abstractv2.icc", "r"); + + xform = cmsCreateTransformTHR(DbgThread(), h2, TYPE_Lab_DBL, h2, TYPE_Lab_DBL, INTENT_RELATIVE_COLORIMETRIC, 0); + rc &= CheckSeveralLab(xform); + cmsDeleteTransform(xform); + cmsCloseProfile(h2); + if (!rc) goto Error; + + + SubTest("V2 -> V4"); + h2 = cmsOpenProfileFromFileTHR(DbgThread(), "abstractv2.icc", "r"); + h4 = cmsOpenProfileFromFileTHR(DbgThread(), "abstractv4.icc", "r"); + + xform = cmsCreateTransformTHR(DbgThread(), h4, TYPE_Lab_DBL, h2, TYPE_Lab_DBL, INTENT_RELATIVE_COLORIMETRIC, 0); + rc &= CheckSeveralLab(xform); + cmsDeleteTransform(xform); + cmsCloseProfile(h2); + cmsCloseProfile(h4); + + SubTest("V4 -> V2"); + h2 = cmsOpenProfileFromFileTHR(DbgThread(), "abstractv2.icc", "r"); + h4 = cmsOpenProfileFromFileTHR(DbgThread(), "abstractv4.icc", "r"); + + xform = cmsCreateTransformTHR(DbgThread(), h2, TYPE_Lab_DBL, h4, TYPE_Lab_DBL, INTENT_RELATIVE_COLORIMETRIC, 0); + rc &= CheckSeveralLab(xform); + cmsDeleteTransform(xform); + cmsCloseProfile(h2); + cmsCloseProfile(h4); + +Error: + remove("abstractv2.icc"); + remove("abstractv4.icc"); + return rc; + +} + + + +// Check a simple xform from a matrix profile to itself. Test floating point accuracy. +static +cmsInt32Number CheckMatrixShaperXFORMFloat(void) +{ + cmsHPROFILE hAbove, hSRGB; + cmsHTRANSFORM xform; + cmsInt32Number rc1, rc2; + + hAbove = Create_AboveRGB(); + xform = cmsCreateTransformTHR(DbgThread(), hAbove, TYPE_RGB_FLT, hAbove, TYPE_RGB_FLT, INTENT_RELATIVE_COLORIMETRIC, 0); + cmsCloseProfile(hAbove); + rc1 = CheckFloatlinearXFORM(xform, 3); + cmsDeleteTransform(xform); + + hSRGB = cmsCreate_sRGBProfileTHR(DbgThread()); + xform = cmsCreateTransformTHR(DbgThread(), hSRGB, TYPE_RGB_FLT, hSRGB, TYPE_RGB_FLT, INTENT_RELATIVE_COLORIMETRIC, 0); + cmsCloseProfile(hSRGB); + rc2 = CheckFloatlinearXFORM(xform, 3); + cmsDeleteTransform(xform); + + + return rc1 && rc2; +} + +// Check a simple xform from a matrix profile to itself. Test 16 bits accuracy. +static +cmsInt32Number CheckMatrixShaperXFORM16(void) +{ + cmsHPROFILE hAbove, hSRGB; + cmsHTRANSFORM xform; + cmsInt32Number rc1, rc2; + + hAbove = Create_AboveRGB(); + xform = cmsCreateTransformTHR(DbgThread(), hAbove, TYPE_RGB_16, hAbove, TYPE_RGB_16, INTENT_RELATIVE_COLORIMETRIC, 0); + cmsCloseProfile(hAbove); + + rc1 = Check16linearXFORM(xform, 3); + cmsDeleteTransform(xform); + + hSRGB = cmsCreate_sRGBProfileTHR(DbgThread()); + xform = cmsCreateTransformTHR(DbgThread(), hSRGB, TYPE_RGB_16, hSRGB, TYPE_RGB_16, INTENT_RELATIVE_COLORIMETRIC, 0); + cmsCloseProfile(hSRGB); + rc2 = Check16linearXFORM(xform, 3); + cmsDeleteTransform(xform); + + return rc1 && rc2; + +} + + +// Check a simple xform from a matrix profile to itself. Test 8 bits accuracy. +static +cmsInt32Number CheckMatrixShaperXFORM8(void) +{ + cmsHPROFILE hAbove, hSRGB; + cmsHTRANSFORM xform; + cmsInt32Number rc1, rc2; + + hAbove = Create_AboveRGB(); + xform = cmsCreateTransformTHR(DbgThread(), hAbove, TYPE_RGB_8, hAbove, TYPE_RGB_8, INTENT_RELATIVE_COLORIMETRIC, 0); + cmsCloseProfile(hAbove); + rc1 = Check8linearXFORM(xform, 3); + cmsDeleteTransform(xform); + + hSRGB = cmsCreate_sRGBProfileTHR(DbgThread()); + xform = cmsCreateTransformTHR(DbgThread(), hSRGB, TYPE_RGB_8, hSRGB, TYPE_RGB_8, INTENT_RELATIVE_COLORIMETRIC, 0); + cmsCloseProfile(hSRGB); + rc2 = Check8linearXFORM(xform, 3); + cmsDeleteTransform(xform); + + + return rc1 && rc2; +} + + +// TODO: Check LUT based to LUT based transforms for CMYK + + + + + + +// ----------------------------------------------------------------------------------------------------------------- + + +// Check known values going from sRGB to XYZ +static +cmsInt32Number CheckOneRGB_f(cmsHTRANSFORM xform, cmsInt32Number R, cmsInt32Number G, cmsInt32Number B, cmsFloat64Number X, cmsFloat64Number Y, cmsFloat64Number Z, cmsFloat64Number err) +{ + cmsFloat32Number RGB[3]; + cmsFloat64Number Out[3]; + + RGB[0] = (cmsFloat32Number) (R / 255.0); + RGB[1] = (cmsFloat32Number) (G / 255.0); + RGB[2] = (cmsFloat32Number) (B / 255.0); + + cmsDoTransform(xform, RGB, Out, 1); + + return IsGoodVal("X", X , Out[0], err) && + IsGoodVal("Y", Y , Out[1], err) && + IsGoodVal("Z", Z , Out[2], err); +} + +static +cmsInt32Number Chack_sRGB_Float(void) +{ + cmsHPROFILE hsRGB, hXYZ, hLab; + cmsHTRANSFORM xform1, xform2; + cmsInt32Number rc; + + + hsRGB = cmsCreate_sRGBProfileTHR(DbgThread()); + hXYZ = cmsCreateXYZProfileTHR(DbgThread()); + hLab = cmsCreateLab4ProfileTHR(DbgThread(), NULL); + + xform1 = cmsCreateTransformTHR(DbgThread(), hsRGB, TYPE_RGB_FLT, hXYZ, TYPE_XYZ_DBL, + INTENT_RELATIVE_COLORIMETRIC, 0); + + xform2 = cmsCreateTransformTHR(DbgThread(), hsRGB, TYPE_RGB_FLT, hLab, TYPE_Lab_DBL, + INTENT_RELATIVE_COLORIMETRIC, 0); + cmsCloseProfile(hsRGB); + cmsCloseProfile(hXYZ); + cmsCloseProfile(hLab); + + MaxErr = 0; + + // Xform 1 goes from 8 bits to XYZ, + rc = CheckOneRGB_f(xform1, 1, 1, 1, 0.0002927, 0.0003035, 0.000250, 0.0001); + rc &= CheckOneRGB_f(xform1, 127, 127, 127, 0.2046329, 0.212230, 0.175069, 0.0001); + rc &= CheckOneRGB_f(xform1, 12, 13, 15, 0.0038364, 0.0039928, 0.003853, 0.0001); + rc &= CheckOneRGB_f(xform1, 128, 0, 0, 0.0941240, 0.0480256, 0.003005, 0.0001); + rc &= CheckOneRGB_f(xform1, 190, 25, 210, 0.3204592, 0.1605926, 0.468213, 0.0001); + + // Xform 2 goes from 8 bits to Lab, we allow 0.01 error max + rc &= CheckOneRGB_f(xform2, 1, 1, 1, 0.2741748, 0, 0, 0.01); + rc &= CheckOneRGB_f(xform2, 127, 127, 127, 53.192776, 0, 0, 0.01); + rc &= CheckOneRGB_f(xform2, 190, 25, 210, 47.052136, 74.565610, -56.883274, 0.01); + rc &= CheckOneRGB_f(xform2, 128, 0, 0, 26.164701, 48.478171, 39.4384713, 0.01); + + cmsDeleteTransform(xform1); + cmsDeleteTransform(xform2); + return rc; +} + + +// --------------------------------------------------- + +static +cmsBool GetProfileRGBPrimaries(cmsHPROFILE hProfile, + cmsCIEXYZTRIPLE *result, + cmsUInt32Number intent) +{ + cmsHPROFILE hXYZ; + cmsHTRANSFORM hTransform; + cmsFloat64Number rgb[3][3] = {{1., 0., 0.}, + {0., 1., 0.}, + {0., 0., 1.}}; + + hXYZ = cmsCreateXYZProfile(); + if (hXYZ == NULL) return FALSE; + + hTransform = cmsCreateTransform(hProfile, TYPE_RGB_DBL, hXYZ, TYPE_XYZ_DBL, + intent, cmsFLAGS_NOCACHE | cmsFLAGS_NOOPTIMIZE); + cmsCloseProfile(hXYZ); + if (hTransform == NULL) return FALSE; + + cmsDoTransform(hTransform, rgb, result, 3); + cmsDeleteTransform(hTransform); + return TRUE; +} + + +static +int CheckRGBPrimaries(void) +{ + cmsHPROFILE hsRGB; + cmsCIEXYZTRIPLE tripXYZ; + cmsCIExyYTRIPLE tripxyY; + cmsBool result; + + cmsSetAdaptationState(0); + hsRGB = cmsCreate_sRGBProfileTHR(DbgThread()); + if (!hsRGB) return 0; + + result = GetProfileRGBPrimaries(hsRGB, &tripXYZ, + INTENT_ABSOLUTE_COLORIMETRIC); + + cmsCloseProfile(hsRGB); + if (!result) return 0; + + cmsXYZ2xyY(&tripxyY.Red, &tripXYZ.Red); + cmsXYZ2xyY(&tripxyY.Green, &tripXYZ.Green); + cmsXYZ2xyY(&tripxyY.Blue, &tripXYZ.Blue); + + /* values were taken from + http://en.wikipedia.org/wiki/RGB_color_spaces#Specifications */ + + if (!IsGoodFixed15_16("xRed", tripxyY.Red.x, 0.64) || + !IsGoodFixed15_16("yRed", tripxyY.Red.y, 0.33) || + !IsGoodFixed15_16("xGreen", tripxyY.Green.x, 0.30) || + !IsGoodFixed15_16("yGreen", tripxyY.Green.y, 0.60) || + !IsGoodFixed15_16("xBlue", tripxyY.Blue.x, 0.15) || + !IsGoodFixed15_16("yBlue", tripxyY.Blue.y, 0.06)) { + Fail("One or more primaries are wrong."); + return FALSE; + } + + return TRUE; +} + + +// ----------------------------------------------------------------------------------------------------------------- + +// This function will check CMYK -> CMYK transforms. It uses FOGRA29 and SWOP ICC profiles + +static +cmsInt32Number CheckCMYK(cmsInt32Number Intent, const char *Profile1, const char* Profile2) +{ + cmsHPROFILE hSWOP = cmsOpenProfileFromFileTHR(DbgThread(), Profile1, "r"); + cmsHPROFILE hFOGRA = cmsOpenProfileFromFileTHR(DbgThread(), Profile2, "r"); + cmsHTRANSFORM xform, swop_lab, fogra_lab; + cmsFloat32Number CMYK1[4], CMYK2[4]; + cmsCIELab Lab1, Lab2; + cmsHPROFILE hLab; + cmsFloat64Number DeltaL, Max; + cmsInt32Number i; + + hLab = cmsCreateLab4ProfileTHR(DbgThread(), NULL); + + xform = cmsCreateTransformTHR(DbgThread(), hSWOP, TYPE_CMYK_FLT, hFOGRA, TYPE_CMYK_FLT, Intent, 0); + + swop_lab = cmsCreateTransformTHR(DbgThread(), hSWOP, TYPE_CMYK_FLT, hLab, TYPE_Lab_DBL, Intent, 0); + fogra_lab = cmsCreateTransformTHR(DbgThread(), hFOGRA, TYPE_CMYK_FLT, hLab, TYPE_Lab_DBL, Intent, 0); + + Max = 0; + for (i=0; i <= 100; i++) { + + CMYK1[0] = 10; + CMYK1[1] = 20; + CMYK1[2] = 30; + CMYK1[3] = (cmsFloat32Number) i; + + cmsDoTransform(swop_lab, CMYK1, &Lab1, 1); + cmsDoTransform(xform, CMYK1, CMYK2, 1); + cmsDoTransform(fogra_lab, CMYK2, &Lab2, 1); + + DeltaL = fabs(Lab1.L - Lab2.L); + + if (DeltaL > Max) Max = DeltaL; + } + + + cmsDeleteTransform(xform); + + + xform = cmsCreateTransformTHR(DbgThread(), hFOGRA, TYPE_CMYK_FLT, hSWOP, TYPE_CMYK_FLT, Intent, 0); + + for (i=0; i <= 100; i++) { + CMYK1[0] = 10; + CMYK1[1] = 20; + CMYK1[2] = 30; + CMYK1[3] = (cmsFloat32Number) i; + + cmsDoTransform(fogra_lab, CMYK1, &Lab1, 1); + cmsDoTransform(xform, CMYK1, CMYK2, 1); + cmsDoTransform(swop_lab, CMYK2, &Lab2, 1); + + DeltaL = fabs(Lab1.L - Lab2.L); + + if (DeltaL > Max) Max = DeltaL; + } + + + cmsCloseProfile(hSWOP); + cmsCloseProfile(hFOGRA); + cmsCloseProfile(hLab); + + cmsDeleteTransform(xform); + cmsDeleteTransform(swop_lab); + cmsDeleteTransform(fogra_lab); + + return Max < 3.0; +} + +static +cmsInt32Number CheckCMYKRoundtrip(void) +{ + return CheckCMYK(INTENT_RELATIVE_COLORIMETRIC, "test1.icc", "test1.icc"); +} + + +static +cmsInt32Number CheckCMYKPerceptual(void) +{ + return CheckCMYK(INTENT_PERCEPTUAL, "test1.icc", "test2.icc"); +} + + +#if 0 +static +cmsInt32Number CheckCMYKRelCol(void) +{ + return CheckCMYK(INTENT_RELATIVE_COLORIMETRIC, "test1.icc", "test2.icc"); +} +#endif + + +static +cmsInt32Number CheckKOnlyBlackPreserving(void) +{ + cmsHPROFILE hSWOP = cmsOpenProfileFromFileTHR(DbgThread(), "test1.icc", "r"); + cmsHPROFILE hFOGRA = cmsOpenProfileFromFileTHR(DbgThread(), "test2.icc", "r"); + cmsHTRANSFORM xform, swop_lab, fogra_lab; + cmsFloat32Number CMYK1[4], CMYK2[4]; + cmsCIELab Lab1, Lab2; + cmsHPROFILE hLab; + cmsFloat64Number DeltaL, Max; + cmsInt32Number i; + + hLab = cmsCreateLab4ProfileTHR(DbgThread(), NULL); + + xform = cmsCreateTransformTHR(DbgThread(), hSWOP, TYPE_CMYK_FLT, hFOGRA, TYPE_CMYK_FLT, INTENT_PRESERVE_K_ONLY_PERCEPTUAL, 0); + + swop_lab = cmsCreateTransformTHR(DbgThread(), hSWOP, TYPE_CMYK_FLT, hLab, TYPE_Lab_DBL, INTENT_PERCEPTUAL, 0); + fogra_lab = cmsCreateTransformTHR(DbgThread(), hFOGRA, TYPE_CMYK_FLT, hLab, TYPE_Lab_DBL, INTENT_PERCEPTUAL, 0); + + Max = 0; + + for (i=0; i <= 100; i++) { + CMYK1[0] = 0; + CMYK1[1] = 0; + CMYK1[2] = 0; + CMYK1[3] = (cmsFloat32Number) i; + + // SWOP CMYK to Lab1 + cmsDoTransform(swop_lab, CMYK1, &Lab1, 1); + + // SWOP To FOGRA using black preservation + cmsDoTransform(xform, CMYK1, CMYK2, 1); + + // Obtained FOGRA CMYK to Lab2 + cmsDoTransform(fogra_lab, CMYK2, &Lab2, 1); + + // We care only on L* + DeltaL = fabs(Lab1.L - Lab2.L); + + if (DeltaL > Max) Max = DeltaL; + } + + + cmsDeleteTransform(xform); + + // dL should be below 3.0 + + + // Same, but FOGRA to SWOP + xform = cmsCreateTransformTHR(DbgThread(), hFOGRA, TYPE_CMYK_FLT, hSWOP, TYPE_CMYK_FLT, INTENT_PRESERVE_K_ONLY_PERCEPTUAL, 0); + + for (i=0; i <= 100; i++) { + CMYK1[0] = 0; + CMYK1[1] = 0; + CMYK1[2] = 0; + CMYK1[3] = (cmsFloat32Number) i; + + cmsDoTransform(fogra_lab, CMYK1, &Lab1, 1); + cmsDoTransform(xform, CMYK1, CMYK2, 1); + cmsDoTransform(swop_lab, CMYK2, &Lab2, 1); + + DeltaL = fabs(Lab1.L - Lab2.L); + + if (DeltaL > Max) Max = DeltaL; + } + + + cmsCloseProfile(hSWOP); + cmsCloseProfile(hFOGRA); + cmsCloseProfile(hLab); + + cmsDeleteTransform(xform); + cmsDeleteTransform(swop_lab); + cmsDeleteTransform(fogra_lab); + + return Max < 3.0; +} + +static +cmsInt32Number CheckKPlaneBlackPreserving(void) +{ + cmsHPROFILE hSWOP = cmsOpenProfileFromFileTHR(DbgThread(), "test1.icc", "r"); + cmsHPROFILE hFOGRA = cmsOpenProfileFromFileTHR(DbgThread(), "test2.icc", "r"); + cmsHTRANSFORM xform, swop_lab, fogra_lab; + cmsFloat32Number CMYK1[4], CMYK2[4]; + cmsCIELab Lab1, Lab2; + cmsHPROFILE hLab; + cmsFloat64Number DeltaE, Max; + cmsInt32Number i; + + hLab = cmsCreateLab4ProfileTHR(DbgThread(), NULL); + + xform = cmsCreateTransformTHR(DbgThread(), hSWOP, TYPE_CMYK_FLT, hFOGRA, TYPE_CMYK_FLT, INTENT_PERCEPTUAL, 0); + + swop_lab = cmsCreateTransformTHR(DbgThread(), hSWOP, TYPE_CMYK_FLT, hLab, TYPE_Lab_DBL, INTENT_PERCEPTUAL, 0); + fogra_lab = cmsCreateTransformTHR(DbgThread(), hFOGRA, TYPE_CMYK_FLT, hLab, TYPE_Lab_DBL, INTENT_PERCEPTUAL, 0); + + Max = 0; + + for (i=0; i <= 100; i++) { + CMYK1[0] = 0; + CMYK1[1] = 0; + CMYK1[2] = 0; + CMYK1[3] = (cmsFloat32Number) i; + + cmsDoTransform(swop_lab, CMYK1, &Lab1, 1); + cmsDoTransform(xform, CMYK1, CMYK2, 1); + cmsDoTransform(fogra_lab, CMYK2, &Lab2, 1); + + DeltaE = cmsDeltaE(&Lab1, &Lab2); + + if (DeltaE > Max) Max = DeltaE; + } + + + cmsDeleteTransform(xform); + + xform = cmsCreateTransformTHR(DbgThread(), hFOGRA, TYPE_CMYK_FLT, hSWOP, TYPE_CMYK_FLT, INTENT_PRESERVE_K_PLANE_PERCEPTUAL, 0); + + for (i=0; i <= 100; i++) { + CMYK1[0] = 30; + CMYK1[1] = 20; + CMYK1[2] = 10; + CMYK1[3] = (cmsFloat32Number) i; + + cmsDoTransform(fogra_lab, CMYK1, &Lab1, 1); + cmsDoTransform(xform, CMYK1, CMYK2, 1); + cmsDoTransform(swop_lab, CMYK2, &Lab2, 1); + + DeltaE = cmsDeltaE(&Lab1, &Lab2); + + if (DeltaE > Max) Max = DeltaE; + } + + cmsDeleteTransform(xform); + + + + cmsCloseProfile(hSWOP); + cmsCloseProfile(hFOGRA); + cmsCloseProfile(hLab); + + + cmsDeleteTransform(swop_lab); + cmsDeleteTransform(fogra_lab); + + return Max < 30.0; +} + + +// ------------------------------------------------------------------------------------------------------ + + +static +cmsInt32Number CheckProofingXFORMFloat(void) +{ + cmsHPROFILE hAbove; + cmsHTRANSFORM xform; + cmsInt32Number rc; + + hAbove = Create_AboveRGB(); + xform = cmsCreateProofingTransformTHR(DbgThread(), hAbove, TYPE_RGB_FLT, hAbove, TYPE_RGB_FLT, hAbove, + INTENT_RELATIVE_COLORIMETRIC, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_SOFTPROOFING); + cmsCloseProfile(hAbove); + rc = CheckFloatlinearXFORM(xform, 3); + cmsDeleteTransform(xform); + return rc; +} + +static +cmsInt32Number CheckProofingXFORM16(void) +{ + cmsHPROFILE hAbove; + cmsHTRANSFORM xform; + cmsInt32Number rc; + + hAbove = Create_AboveRGB(); + xform = cmsCreateProofingTransformTHR(DbgThread(), hAbove, TYPE_RGB_16, hAbove, TYPE_RGB_16, hAbove, + INTENT_RELATIVE_COLORIMETRIC, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_SOFTPROOFING|cmsFLAGS_NOCACHE); + cmsCloseProfile(hAbove); + rc = Check16linearXFORM(xform, 3); + cmsDeleteTransform(xform); + return rc; +} + + +static +cmsInt32Number CheckGamutCheck(void) +{ + cmsHPROFILE hSRGB, hAbove; + cmsHTRANSFORM xform; + cmsInt32Number rc; + cmsUInt16Number Alarm[16] = { 0xDEAD, 0xBABE, 0xFACE }; + + // Set alarm codes to fancy values so we could check the out of gamut condition + cmsSetAlarmCodes(Alarm); + + // Create the profiles + hSRGB = cmsCreate_sRGBProfileTHR(DbgThread()); + hAbove = Create_AboveRGB(); + + if (hSRGB == NULL || hAbove == NULL) return 0; // Failed + + SubTest("Gamut check on floating point"); + + // Create a gamut checker in the same space. No value should be out of gamut + xform = cmsCreateProofingTransformTHR(DbgThread(), hAbove, TYPE_RGB_FLT, hAbove, TYPE_RGB_FLT, hAbove, + INTENT_RELATIVE_COLORIMETRIC, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_GAMUTCHECK); + + + if (!CheckFloatlinearXFORM(xform, 3)) { + cmsCloseProfile(hSRGB); + cmsCloseProfile(hAbove); + cmsDeleteTransform(xform); + Fail("Gamut check on same profile failed"); + return 0; + } + + cmsDeleteTransform(xform); + + SubTest("Gamut check on 16 bits"); + + xform = cmsCreateProofingTransformTHR(DbgThread(), hAbove, TYPE_RGB_16, hAbove, TYPE_RGB_16, hSRGB, + INTENT_RELATIVE_COLORIMETRIC, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_GAMUTCHECK); + + cmsCloseProfile(hSRGB); + cmsCloseProfile(hAbove); + + rc = Check16linearXFORM(xform, 3); + + cmsDeleteTransform(xform); + + return rc; +} + + + +// ------------------------------------------------------------------------------------------------------------------- + +static +cmsInt32Number CheckBlackPoint(void) +{ + cmsHPROFILE hProfile; + cmsCIEXYZ Black; + cmsCIELab Lab; + + hProfile = cmsOpenProfileFromFileTHR(DbgThread(), "test5.icc", "r"); + cmsDetectDestinationBlackPoint(&Black, hProfile, INTENT_RELATIVE_COLORIMETRIC, 0); + cmsCloseProfile(hProfile); + + + hProfile = cmsOpenProfileFromFileTHR(DbgThread(), "test1.icc", "r"); + cmsDetectDestinationBlackPoint(&Black, hProfile, INTENT_RELATIVE_COLORIMETRIC, 0); + cmsXYZ2Lab(NULL, &Lab, &Black); + cmsCloseProfile(hProfile); + + hProfile = cmsOpenProfileFromFileTHR(DbgThread(), "lcms2cmyk.icc", "r"); + cmsDetectDestinationBlackPoint(&Black, hProfile, INTENT_RELATIVE_COLORIMETRIC, 0); + cmsXYZ2Lab(NULL, &Lab, &Black); + cmsCloseProfile(hProfile); + + hProfile = cmsOpenProfileFromFileTHR(DbgThread(), "test2.icc", "r"); + cmsDetectDestinationBlackPoint(&Black, hProfile, INTENT_RELATIVE_COLORIMETRIC, 0); + cmsXYZ2Lab(NULL, &Lab, &Black); + cmsCloseProfile(hProfile); + + hProfile = cmsOpenProfileFromFileTHR(DbgThread(), "test1.icc", "r"); + cmsDetectDestinationBlackPoint(&Black, hProfile, INTENT_PERCEPTUAL, 0); + cmsXYZ2Lab(NULL, &Lab, &Black); + cmsCloseProfile(hProfile); + + return 1; +} + + +static +cmsInt32Number CheckOneTAC(cmsFloat64Number InkLimit) +{ + cmsHPROFILE h; + cmsFloat64Number d; + + h =CreateFakeCMYK(InkLimit, TRUE); + cmsSaveProfileToFile(h, "lcmstac.icc"); + cmsCloseProfile(h); + + h = cmsOpenProfileFromFile("lcmstac.icc", "r"); + d = cmsDetectTAC(h); + cmsCloseProfile(h); + + remove("lcmstac.icc"); + + if (fabs(d - InkLimit) > 5) return 0; + + return 1; +} + + +static +cmsInt32Number CheckTAC(void) +{ + if (!CheckOneTAC(180)) return 0; + if (!CheckOneTAC(220)) return 0; + if (!CheckOneTAC(286)) return 0; + if (!CheckOneTAC(310)) return 0; + if (!CheckOneTAC(330)) return 0; + + return 1; +} + +// ------------------------------------------------------------------------------------------------------- + + +#define NPOINTS_IT8 10 // (17*17*17*17) + +static +cmsInt32Number CheckCGATS(void) +{ + cmsHANDLE it8; + cmsInt32Number i; + + SubTest("IT8 creation"); + it8 = cmsIT8Alloc(DbgThread()); + if (it8 == NULL) return 0; + + cmsIT8SetSheetType(it8, "LCMS/TESTING"); + cmsIT8SetPropertyStr(it8, "ORIGINATOR", "1 2 3 4"); + cmsIT8SetPropertyUncooked(it8, "DESCRIPTOR", "1234"); + cmsIT8SetPropertyStr(it8, "MANUFACTURER", "3"); + cmsIT8SetPropertyDbl(it8, "CREATED", 4); + cmsIT8SetPropertyDbl(it8, "SERIAL", 5); + cmsIT8SetPropertyHex(it8, "MATERIAL", 0x123); + + cmsIT8SetPropertyDbl(it8, "NUMBER_OF_SETS", NPOINTS_IT8); + cmsIT8SetPropertyDbl(it8, "NUMBER_OF_FIELDS", 4); + + cmsIT8SetDataFormat(it8, 0, "SAMPLE_ID"); + cmsIT8SetDataFormat(it8, 1, "RGB_R"); + cmsIT8SetDataFormat(it8, 2, "RGB_G"); + cmsIT8SetDataFormat(it8, 3, "RGB_B"); + + SubTest("Table creation"); + for (i=0; i < NPOINTS_IT8; i++) { + + char Patch[20]; + + sprintf(Patch, "P%d", i); + + cmsIT8SetDataRowCol(it8, i, 0, Patch); + cmsIT8SetDataRowColDbl(it8, i, 1, i); + cmsIT8SetDataRowColDbl(it8, i, 2, i); + cmsIT8SetDataRowColDbl(it8, i, 3, i); + } + + SubTest("Save to file"); + cmsIT8SaveToFile(it8, "TEST.IT8"); + cmsIT8Free(it8); + + SubTest("Load from file"); + it8 = cmsIT8LoadFromFile(DbgThread(), "TEST.IT8"); + if (it8 == NULL) return 0; + + SubTest("Save again file"); + cmsIT8SaveToFile(it8, "TEST.IT8"); + cmsIT8Free(it8); + + + SubTest("Load from file (II)"); + it8 = cmsIT8LoadFromFile(DbgThread(), "TEST.IT8"); + if (it8 == NULL) return 0; + + + SubTest("Change prop value"); + if (cmsIT8GetPropertyDbl(it8, "DESCRIPTOR") != 1234) { + + return 0; + } + + + cmsIT8SetPropertyDbl(it8, "DESCRIPTOR", 5678); + if (cmsIT8GetPropertyDbl(it8, "DESCRIPTOR") != 5678) { + + return 0; + } + + SubTest("Positive numbers"); + if (cmsIT8GetDataDbl(it8, "P3", "RGB_G") != 3) { + + return 0; + } + + + SubTest("Positive exponent numbers"); + cmsIT8SetPropertyDbl(it8, "DBL_PROP", 123E+12); + if ((cmsIT8GetPropertyDbl(it8, "DBL_PROP") - 123E+12) > 1 ) { + + return 0; + } + + SubTest("Negative exponent numbers"); + cmsIT8SetPropertyDbl(it8, "DBL_PROP_NEG", 123E-45); + if ((cmsIT8GetPropertyDbl(it8, "DBL_PROP_NEG") - 123E-45) > 1E-45 ) { + + return 0; + } + + + SubTest("Negative numbers"); + cmsIT8SetPropertyDbl(it8, "DBL_NEG_VAL", -123); + if ((cmsIT8GetPropertyDbl(it8, "DBL_NEG_VAL")) != -123 ) { + + return 0; + } + + cmsIT8Free(it8); + + remove("TEST.IT8"); + return 1; + +} + + +static +cmsInt32Number CheckCGATS2(void) +{ + cmsHANDLE handle; + const cmsUInt8Number junk[] = { 0x0, 0xd, 0xd, 0xa, 0x20, 0xd, 0x20, 0x20, 0x20, 0x3a, 0x31, 0x3d, 0x3d, 0x3d, 0x3d }; + + handle = cmsIT8LoadFromMem(0, (const void*)junk, sizeof(junk)); + if (handle) + cmsIT8Free(handle); + + return 1; +} + + +static +cmsInt32Number CheckCGATS_Overflow(void) +{ + cmsHANDLE handle; + const cmsUInt8Number junk[] = { "@\nA 1.e2147483648\n" }; + + handle = cmsIT8LoadFromMem(0, (const void*)junk, sizeof(junk)); + if (handle) + cmsIT8Free(handle); + + return 1; +} + +// Create CSA/CRD + +static +void GenerateCSA(const char* cInProf, const char* FileName) +{ + cmsHPROFILE hProfile; + cmsUInt32Number n; + char* Buffer; + cmsContext BuffThread = DbgThread(); + FILE* o; + + + if (cInProf == NULL) + hProfile = cmsCreateLab4Profile(NULL); + else + hProfile = cmsOpenProfileFromFile(cInProf, "r"); + + n = cmsGetPostScriptCSA(DbgThread(), hProfile, 0, 0, NULL, 0); + if (n == 0) return; + + Buffer = (char*) _cmsMalloc(BuffThread, n + 1); + cmsGetPostScriptCSA(DbgThread(), hProfile, 0, 0, Buffer, n); + Buffer[n] = 0; + + if (FileName != NULL) { + o = fopen(FileName, "wb"); + fwrite(Buffer, n, 1, o); + fclose(o); + } + + _cmsFree(BuffThread, Buffer); + cmsCloseProfile(hProfile); + if (FileName != NULL) + remove(FileName); +} + + +static +void GenerateCRD(const char* cOutProf, const char* FileName) +{ + cmsHPROFILE hProfile; + cmsUInt32Number n; + char* Buffer; + cmsUInt32Number dwFlags = 0; + cmsContext BuffThread = DbgThread(); + + + if (cOutProf == NULL) + hProfile = cmsCreateLab4Profile(NULL); + else + hProfile = cmsOpenProfileFromFile(cOutProf, "r"); + + n = cmsGetPostScriptCRD(DbgThread(), hProfile, 0, dwFlags, NULL, 0); + if (n == 0) return; + + Buffer = (char*) _cmsMalloc(BuffThread, n + 1); + cmsGetPostScriptCRD(DbgThread(), hProfile, 0, dwFlags, Buffer, n); + Buffer[n] = 0; + + if (FileName != NULL) { + FILE* o = fopen(FileName, "wb"); + fwrite(Buffer, n, 1, o); + fclose(o); + } + + _cmsFree(BuffThread, Buffer); + cmsCloseProfile(hProfile); + if (FileName != NULL) + remove(FileName); +} + +static +cmsInt32Number CheckPostScript(void) +{ + GenerateCSA("test5.icc", "sRGB_CSA.ps"); + GenerateCSA("aRGBlcms2.icc", "aRGB_CSA.ps"); + GenerateCSA("test4.icc", "sRGBV4_CSA.ps"); + GenerateCSA("test1.icc", "SWOP_CSA.ps"); + GenerateCSA(NULL, "Lab_CSA.ps"); + GenerateCSA("graylcms2.icc", "gray_CSA.ps"); + + GenerateCRD("test5.icc", "sRGB_CRD.ps"); + GenerateCRD("aRGBlcms2.icc", "aRGB_CRD.ps"); + GenerateCRD(NULL, "Lab_CRD.ps"); + GenerateCRD("test1.icc", "SWOP_CRD.ps"); + GenerateCRD("test4.icc", "sRGBV4_CRD.ps"); + GenerateCRD("graylcms2.icc", "gray_CRD.ps"); + + return 1; +} + + +static +cmsInt32Number CheckGray(cmsHTRANSFORM xform, cmsUInt8Number g, double L) +{ + cmsCIELab Lab; + + cmsDoTransform(xform, &g, &Lab, 1); + + if (!IsGoodVal("a axis on gray", 0, Lab.a, 0.001)) return 0; + if (!IsGoodVal("b axis on gray", 0, Lab.b, 0.001)) return 0; + + return IsGoodVal("Gray value", L, Lab.L, 0.01); +} + +static +cmsInt32Number CheckInputGray(void) +{ + cmsHPROFILE hGray = Create_Gray22(); + cmsHPROFILE hLab = cmsCreateLab4Profile(NULL); + cmsHTRANSFORM xform; + + if (hGray == NULL || hLab == NULL) return 0; + + xform = cmsCreateTransform(hGray, TYPE_GRAY_8, hLab, TYPE_Lab_DBL, INTENT_RELATIVE_COLORIMETRIC, 0); + cmsCloseProfile(hGray); cmsCloseProfile(hLab); + + if (!CheckGray(xform, 0, 0)) return 0; + if (!CheckGray(xform, 125, 52.768)) return 0; + if (!CheckGray(xform, 200, 81.069)) return 0; + if (!CheckGray(xform, 255, 100.0)) return 0; + + cmsDeleteTransform(xform); + return 1; +} + +static +cmsInt32Number CheckLabInputGray(void) +{ + cmsHPROFILE hGray = Create_GrayLab(); + cmsHPROFILE hLab = cmsCreateLab4Profile(NULL); + cmsHTRANSFORM xform; + + if (hGray == NULL || hLab == NULL) return 0; + + xform = cmsCreateTransform(hGray, TYPE_GRAY_8, hLab, TYPE_Lab_DBL, INTENT_RELATIVE_COLORIMETRIC, 0); + cmsCloseProfile(hGray); cmsCloseProfile(hLab); + + if (!CheckGray(xform, 0, 0)) return 0; + if (!CheckGray(xform, 125, 49.019)) return 0; + if (!CheckGray(xform, 200, 78.431)) return 0; + if (!CheckGray(xform, 255, 100.0)) return 0; + + cmsDeleteTransform(xform); + return 1; +} + + +static +cmsInt32Number CheckOutGray(cmsHTRANSFORM xform, double L, cmsUInt8Number g) +{ + cmsCIELab Lab; + cmsUInt8Number g_out; + + Lab.L = L; + Lab.a = 0; + Lab.b = 0; + + cmsDoTransform(xform, &Lab, &g_out, 1); + + return IsGoodVal("Gray value", g, (double) g_out, 1); +} + +static +cmsInt32Number CheckOutputGray(void) +{ + cmsHPROFILE hGray = Create_Gray22(); + cmsHPROFILE hLab = cmsCreateLab4Profile(NULL); + cmsHTRANSFORM xform; + + if (hGray == NULL || hLab == NULL) return 0; + + xform = cmsCreateTransform( hLab, TYPE_Lab_DBL, hGray, TYPE_GRAY_8, INTENT_RELATIVE_COLORIMETRIC, 0); + cmsCloseProfile(hGray); cmsCloseProfile(hLab); + + if (!CheckOutGray(xform, 0, 0)) return 0; + if (!CheckOutGray(xform, 100, 255)) return 0; + + if (!CheckOutGray(xform, 20, 52)) return 0; + if (!CheckOutGray(xform, 50, 118)) return 0; + + + cmsDeleteTransform(xform); + return 1; +} + + +static +cmsInt32Number CheckLabOutputGray(void) +{ + cmsHPROFILE hGray = Create_GrayLab(); + cmsHPROFILE hLab = cmsCreateLab4Profile(NULL); + cmsHTRANSFORM xform; + cmsInt32Number i; + + if (hGray == NULL || hLab == NULL) return 0; + + xform = cmsCreateTransform( hLab, TYPE_Lab_DBL, hGray, TYPE_GRAY_8, INTENT_RELATIVE_COLORIMETRIC, 0); + cmsCloseProfile(hGray); cmsCloseProfile(hLab); + + if (!CheckOutGray(xform, 0, 0)) return 0; + if (!CheckOutGray(xform, 100, 255)) return 0; + + for (i=0; i < 100; i++) { + + cmsUInt8Number g; + + g = (cmsUInt8Number) floor(i * 255.0 / 100.0 + 0.5); + + if (!CheckOutGray(xform, i, g)) return 0; + } + + + cmsDeleteTransform(xform); + return 1; +} + + +static +cmsInt32Number CheckV4gamma(void) +{ + cmsHPROFILE h; + cmsUInt16Number Lin[] = {0, 0xffff}; + cmsToneCurve*g = cmsBuildTabulatedToneCurve16(DbgThread(), 2, Lin); + + h = cmsOpenProfileFromFileTHR(DbgThread(), "v4gamma.icc", "w"); + if (h == NULL) return 0; + + + cmsSetProfileVersion(h, 4.3); + + if (!cmsWriteTag(h, cmsSigGrayTRCTag, g)) return 0; + cmsCloseProfile(h); + + cmsFreeToneCurve(g); + remove("v4gamma.icc"); + return 1; +} + +// cmsBool cmsGBDdumpVRML(cmsHANDLE hGBD, const char* fname); + +// Gamut descriptor routines +static +cmsInt32Number CheckGBD(void) +{ + cmsCIELab Lab; + cmsHANDLE h; + cmsInt32Number L, a, b; + cmsUInt32Number r1, g1, b1; + cmsHPROFILE hLab, hsRGB; + cmsHTRANSFORM xform; + + h = cmsGBDAlloc(DbgThread()); + if (h == NULL) return 0; + + // Fill all Lab gamut as valid + SubTest("Filling RAW gamut"); + + for (L=0; L <= 100; L += 10) + for (a = -128; a <= 128; a += 5) + for (b = -128; b <= 128; b += 5) { + + Lab.L = L; + Lab.a = a; + Lab.b = b; + if (!cmsGDBAddPoint(h, &Lab)) return 0; + } + + // Complete boundaries + SubTest("computing Lab gamut"); + if (!cmsGDBCompute(h, 0)) return 0; + + + // All points should be inside gamut + SubTest("checking Lab gamut"); + for (L=10; L <= 90; L += 25) + for (a = -120; a <= 120; a += 25) + for (b = -120; b <= 120; b += 25) { + + Lab.L = L; + Lab.a = a; + Lab.b = b; + if (!cmsGDBCheckPoint(h, &Lab)) { + return 0; + } + } + cmsGBDFree(h); + + + // Now for sRGB + SubTest("checking sRGB gamut"); + h = cmsGBDAlloc(DbgThread()); + hsRGB = cmsCreate_sRGBProfile(); + hLab = cmsCreateLab4Profile(NULL); + + xform = cmsCreateTransform(hsRGB, TYPE_RGB_8, hLab, TYPE_Lab_DBL, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_NOCACHE); + cmsCloseProfile(hsRGB); cmsCloseProfile(hLab); + + + for (r1=0; r1 < 256; r1 += 5) { + for (g1=0; g1 < 256; g1 += 5) + for (b1=0; b1 < 256; b1 += 5) { + + + cmsUInt8Number rgb[3]; + + rgb[0] = (cmsUInt8Number) r1; + rgb[1] = (cmsUInt8Number) g1; + rgb[2] = (cmsUInt8Number) b1; + + cmsDoTransform(xform, rgb, &Lab, 1); + + // if (fabs(Lab.b) < 20 && Lab.a > 0) continue; + + if (!cmsGDBAddPoint(h, &Lab)) { + cmsGBDFree(h); + return 0; + } + + + } + } + + + if (!cmsGDBCompute(h, 0)) return 0; + // cmsGBDdumpVRML(h, "c:\\colormaps\\lab.wrl"); + + for (r1=10; r1 < 200; r1 += 10) { + for (g1=10; g1 < 200; g1 += 10) + for (b1=10; b1 < 200; b1 += 10) { + + + cmsUInt8Number rgb[3]; + + rgb[0] = (cmsUInt8Number) r1; + rgb[1] = (cmsUInt8Number) g1; + rgb[2] = (cmsUInt8Number) b1; + + cmsDoTransform(xform, rgb, &Lab, 1); + if (!cmsGDBCheckPoint(h, &Lab)) { + + cmsDeleteTransform(xform); + cmsGBDFree(h); + return 0; + } + } + } + + + cmsDeleteTransform(xform); + cmsGBDFree(h); + + SubTest("checking LCh chroma ring"); + h = cmsGBDAlloc(DbgThread()); + + + for (r1=0; r1 < 360; r1++) { + + cmsCIELCh LCh; + + LCh.L = 70; + LCh.C = 60; + LCh.h = r1; + + cmsLCh2Lab(&Lab, &LCh); + if (!cmsGDBAddPoint(h, &Lab)) { + cmsGBDFree(h); + return 0; + } + } + + + if (!cmsGDBCompute(h, 0)) return 0; + + cmsGBDFree(h); + + return 1; +} + + +static +int CheckMD5(void) +{ + cmsHPROFILE pProfile = cmsOpenProfileFromFile("sRGBlcms2.icc", "r"); + cmsProfileID ProfileID1, ProfileID2, ProfileID3, ProfileID4; + + if (cmsMD5computeID(pProfile)) cmsGetHeaderProfileID(pProfile, ProfileID1.ID8); + if (cmsMD5computeID(pProfile)) cmsGetHeaderProfileID(pProfile, ProfileID2.ID8); + + cmsCloseProfile(pProfile); + + pProfile = cmsOpenProfileFromFile("sRGBlcms2.icc", "r"); + + if (cmsMD5computeID(pProfile)) cmsGetHeaderProfileID(pProfile,ProfileID3.ID8); + if (cmsMD5computeID(pProfile)) cmsGetHeaderProfileID(pProfile,ProfileID4.ID8); + + cmsCloseProfile(pProfile); + + return ((memcmp(ProfileID1.ID8, ProfileID3.ID8, sizeof(ProfileID1)) == 0) && + (memcmp(ProfileID2.ID8, ProfileID4.ID8, sizeof(ProfileID2)) == 0)); +} + + + +static +int CheckLinking(void) +{ + cmsHPROFILE h; + cmsPipeline * pipeline; + cmsStage *stageBegin, *stageEnd; + + // Create a CLUT based profile + h = cmsCreateInkLimitingDeviceLinkTHR(DbgThread(), cmsSigCmykData, 150); + + // link a second tag + cmsLinkTag(h, cmsSigAToB1Tag, cmsSigAToB0Tag); + + // Save the linked devicelink + if (!cmsSaveProfileToFile(h, "lcms2link.icc")) return 0; + cmsCloseProfile(h); + + // Now open the profile and read the pipeline + h = cmsOpenProfileFromFile("lcms2link.icc", "r"); + if (h == NULL) return 0; + + pipeline = (cmsPipeline*) cmsReadTag(h, cmsSigAToB1Tag); + if (pipeline == NULL) + { + return 0; + } + + pipeline = cmsPipelineDup(pipeline); + + // extract stage from pipe line + cmsPipelineUnlinkStage(pipeline, cmsAT_BEGIN, &stageBegin); + cmsPipelineUnlinkStage(pipeline, cmsAT_END, &stageEnd); + cmsPipelineInsertStage(pipeline, cmsAT_END, stageEnd); + cmsPipelineInsertStage(pipeline, cmsAT_BEGIN, stageBegin); + + if (cmsTagLinkedTo(h, cmsSigAToB1Tag) != cmsSigAToB0Tag) return 0; + + cmsWriteTag(h, cmsSigAToB0Tag, pipeline); + cmsPipelineFree(pipeline); + + if (!cmsSaveProfileToFile(h, "lcms2link2.icc")) return 0; + cmsCloseProfile(h); + + + return 1; + +} + +// TestMPE +// +// Created by Paul Miller on 30/08/2016. +// +static +cmsHPROFILE IdentityMatrixProfile( cmsColorSpaceSignature dataSpace) +{ + cmsContext ctx = 0; + cmsVEC3 zero = {{0,0,0}}; + cmsMAT3 identity; + cmsPipeline* forward; + cmsPipeline* reverse; + cmsHPROFILE identityProfile = cmsCreateProfilePlaceholder( ctx); + + + cmsSetProfileVersion(identityProfile, 4.3); + + cmsSetDeviceClass( identityProfile, cmsSigColorSpaceClass); + cmsSetColorSpace(identityProfile, dataSpace); + cmsSetPCS(identityProfile, cmsSigXYZData); + + cmsSetHeaderRenderingIntent(identityProfile, INTENT_RELATIVE_COLORIMETRIC); + + cmsWriteTag(identityProfile, cmsSigMediaWhitePointTag, cmsD50_XYZ()); + + + + _cmsMAT3identity( &identity); + + // build forward transform.... (RGB to PCS) + forward = cmsPipelineAlloc( 0, 3, 3); + cmsPipelineInsertStage( forward, cmsAT_END, cmsStageAllocMatrix( ctx, 3, 3, (cmsFloat64Number*)&identity, (cmsFloat64Number*)&zero)); + cmsWriteTag( identityProfile, cmsSigDToB1Tag, forward); + + cmsPipelineFree( forward); + + reverse = cmsPipelineAlloc( 0, 3, 3); + cmsPipelineInsertStage( reverse, cmsAT_END, cmsStageAllocMatrix( ctx, 3, 3, (cmsFloat64Number*)&identity, (cmsFloat64Number*)&zero)); + cmsWriteTag( identityProfile, cmsSigBToD1Tag, reverse); + + cmsPipelineFree( reverse); + + return identityProfile; +} + +static +cmsInt32Number CheckFloatXYZ(void) +{ + cmsHPROFILE input; + cmsHPROFILE xyzProfile = cmsCreateXYZProfile(); + cmsHTRANSFORM xform; + cmsFloat32Number in[4]; + cmsFloat32Number out[4]; + + in[0] = 1.0; + in[1] = 1.0; + in[2] = 1.0; + in[3] = 0.5; + + // RGB to XYZ + input = IdentityMatrixProfile( cmsSigRgbData); + + xform = cmsCreateTransform( input, TYPE_RGB_FLT, xyzProfile, TYPE_XYZ_FLT, INTENT_RELATIVE_COLORIMETRIC, 0); + cmsCloseProfile(input); + + cmsDoTransform( xform, in, out, 1); + cmsDeleteTransform( xform); + + if (!IsGoodVal("Float RGB->XYZ", in[0], out[0], FLOAT_PRECISSION) || + !IsGoodVal("Float RGB->XYZ", in[1], out[1], FLOAT_PRECISSION) || + !IsGoodVal("Float RGB->XYZ", in[2], out[2], FLOAT_PRECISSION)) + return 0; + + + // XYZ to XYZ + input = IdentityMatrixProfile( cmsSigXYZData); + + xform = cmsCreateTransform( input, TYPE_XYZ_FLT, xyzProfile, TYPE_XYZ_FLT, INTENT_RELATIVE_COLORIMETRIC, 0); + cmsCloseProfile(input); + + cmsDoTransform( xform, in, out, 1); + + + cmsDeleteTransform( xform); + + if (!IsGoodVal("Float XYZ->XYZ", in[0], out[0], FLOAT_PRECISSION) || + !IsGoodVal("Float XYZ->XYZ", in[1], out[1], FLOAT_PRECISSION) || + !IsGoodVal("Float XYZ->XYZ", in[2], out[2], FLOAT_PRECISSION)) + return 0; + + + input = IdentityMatrixProfile( cmsSigXYZData); + +# define TYPE_XYZA_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_XYZ)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(4)) + + xform = cmsCreateTransform( input, TYPE_XYZA_FLT, xyzProfile, TYPE_XYZA_FLT, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_COPY_ALPHA); + cmsCloseProfile(input); + + cmsDoTransform( xform, in, out, 1); + + + cmsDeleteTransform( xform); + + if (!IsGoodVal("Float XYZA->XYZA", in[0], out[0], FLOAT_PRECISSION) || + !IsGoodVal("Float XYZA->XYZA", in[1], out[1], FLOAT_PRECISSION) || + !IsGoodVal("Float XYZA->XYZA", in[2], out[2], FLOAT_PRECISSION) || + !IsGoodVal("Float XYZA->XYZA", in[3], out[3], FLOAT_PRECISSION)) + return 0; + + + // XYZ to RGB + input = IdentityMatrixProfile( cmsSigRgbData); + + xform = cmsCreateTransform( xyzProfile, TYPE_XYZ_FLT, input, TYPE_RGB_FLT, INTENT_RELATIVE_COLORIMETRIC, 0); + cmsCloseProfile(input); + + cmsDoTransform( xform, in, out, 1); + + cmsDeleteTransform( xform); + + if (!IsGoodVal("Float XYZ->RGB", in[0], out[0], FLOAT_PRECISSION) || + !IsGoodVal("Float XYZ->RGB", in[1], out[1], FLOAT_PRECISSION) || + !IsGoodVal("Float XYZ->RGB", in[2], out[2], FLOAT_PRECISSION)) + return 0; + + + // Now the optimizer should remove a stage + + // XYZ to RGB + input = IdentityMatrixProfile( cmsSigRgbData); + + xform = cmsCreateTransform( input, TYPE_RGB_FLT, input, TYPE_RGB_FLT, INTENT_RELATIVE_COLORIMETRIC, 0); + cmsCloseProfile(input); + + cmsDoTransform( xform, in, out, 1); + + cmsDeleteTransform( xform); + + if (!IsGoodVal("Float RGB->RGB", in[0], out[0], FLOAT_PRECISSION) || + !IsGoodVal("Float RGB->RGB", in[1], out[1], FLOAT_PRECISSION) || + !IsGoodVal("Float RGB->RGB", in[2], out[2], FLOAT_PRECISSION)) + return 0; + + cmsCloseProfile(xyzProfile); + + + return 1; +} + + +/* +Bug reported + + 1) + sRGB built-in V4.3 -> Lab identity built-in V4.3 + Flags: "cmsFLAGS_NOCACHE", "cmsFLAGS_NOOPTIMIZE" + Input format: TYPE_RGBA_FLT + Output format: TYPE_LabA_FLT + + 2) and back + Lab identity built-in V4.3 -> sRGB built-in V4.3 + Flags: "cmsFLAGS_NOCACHE", "cmsFLAGS_NOOPTIMIZE" + Input format: TYPE_LabA_FLT + Output format: TYPE_RGBA_FLT + +*/ +static +cmsInt32Number ChecksRGB2LabFLT(void) +{ + cmsHPROFILE hSRGB = cmsCreate_sRGBProfile(); + cmsHPROFILE hLab = cmsCreateLab4Profile(NULL); + + cmsHTRANSFORM xform1 = cmsCreateTransform(hSRGB, TYPE_RGBA_FLT, hLab, TYPE_LabA_FLT, 0, cmsFLAGS_NOCACHE|cmsFLAGS_NOOPTIMIZE); + cmsHTRANSFORM xform2 = cmsCreateTransform(hLab, TYPE_LabA_FLT, hSRGB, TYPE_RGBA_FLT, 0, cmsFLAGS_NOCACHE|cmsFLAGS_NOOPTIMIZE); + + cmsFloat32Number RGBA1[4], RGBA2[4], LabA[4]; + int i; + + + for (i = 0; i <= 100; i++) + { + RGBA1[0] = i / 100.0F; + RGBA1[1] = i / 100.0F; + RGBA1[2] = i / 100.0F; + RGBA1[3] = 0; + + cmsDoTransform(xform1, RGBA1, LabA, 1); + cmsDoTransform(xform2, LabA, RGBA2, 1); + + if (!IsGoodVal("Float RGB->RGB", RGBA1[0], RGBA2[0], FLOAT_PRECISSION) || + !IsGoodVal("Float RGB->RGB", RGBA1[1], RGBA2[1], FLOAT_PRECISSION) || + !IsGoodVal("Float RGB->RGB", RGBA1[2], RGBA2[2], FLOAT_PRECISSION)) + return 0; + } + + + cmsDeleteTransform(xform1); + cmsDeleteTransform(xform2); + cmsCloseProfile(hSRGB); + cmsCloseProfile(hLab); + + return 1; +} + +/* + * parametric curve for Rec709 + */ +static +double Rec709(double L) +{ + if (L <0.018) return 4.5*L; + else + { + double a = 1.099* pow(L, 0.45); + + a = a - 0.099; + return a; + } +} + + +static +cmsInt32Number CheckParametricRec709(void) +{ + cmsFloat64Number params[7]; + cmsToneCurve* t; + int i; + + params[0] = 0.45; /* y */ + params[1] = pow(1.099, 1.0 / 0.45); /* a */ + params[2] = 0.0; /* b */ + params[3] = 4.5; /* c */ + params[4] = 0.018; /* d */ + params[5] = -0.099; /* e */ + params[6] = 0.0; /* f */ + + t = cmsBuildParametricToneCurve (NULL, 5, params); + + + for (i=0; i < 256; i++) + { + cmsFloat32Number n = (cmsFloat32Number) i / 255.0F; + cmsUInt16Number f1 = (cmsUInt16Number) floor(255.0 * cmsEvalToneCurveFloat(t, n) + 0.5); + cmsUInt16Number f2 = (cmsUInt16Number) floor(255.0*Rec709((double) i / 255.0) + 0.5); + + if (f1 != f2) + { + cmsFreeToneCurve(t); + return 0; + } + } + + cmsFreeToneCurve(t); + return 1; +} + + +#define kNumPoints 10 + +typedef cmsFloat32Number(*Function)(cmsFloat32Number x); + +static cmsFloat32Number StraightLine( cmsFloat32Number x) +{ + return (cmsFloat32Number) (0.1 + 0.9 * x); +} + +static cmsInt32Number TestCurve( const char* label, cmsToneCurve* curve, Function fn) +{ + cmsInt32Number ok = 1; + int i; + for (i = 0; i < kNumPoints*3; i++) { + + cmsFloat32Number x = (cmsFloat32Number)i / (kNumPoints*3 - 1); + cmsFloat32Number expectedY = fn(x); + cmsFloat32Number out = cmsEvalToneCurveFloat( curve, x); + + if (!IsGoodVal(label, expectedY, out, FLOAT_PRECISSION)) { + ok = 0; + } + } + return ok; +} + +static +cmsInt32Number CheckFloatSamples(void) +{ + cmsFloat32Number y[kNumPoints]; + int i; + cmsToneCurve *curve; + cmsInt32Number ok; + + for (i = 0; i < kNumPoints; i++) { + cmsFloat32Number x = (cmsFloat32Number)i / (kNumPoints-1); + + y[i] = StraightLine(x); + } + + curve = cmsBuildTabulatedToneCurveFloat(NULL, kNumPoints, y); + ok = TestCurve( "Float Samples", curve, StraightLine); + cmsFreeToneCurve(curve); + + return ok; +} + +static +cmsInt32Number CheckFloatSegments(void) +{ + cmsInt32Number ok = 1; + int i; + cmsToneCurve *curve; + + cmsFloat32Number y[ kNumPoints]; + + // build a segmented curve with a sampled section... + cmsCurveSegment Seg[3]; + + // Initialize segmented curve part up to 0.1 + Seg[0].x0 = -1e22f; // -infinity + Seg[0].x1 = 0.1f; + Seg[0].Type = 6; // Y = (a * X + b) ^ Gamma + c + Seg[0].Params[0] = 1.0f; // gamma + Seg[0].Params[1] = 0.9f; // a + Seg[0].Params[2] = 0.0f; // b + Seg[0].Params[3] = 0.1f; // c + Seg[0].Params[4] = 0.0f; + + // From zero to 1 + Seg[1].x0 = 0.1f; + Seg[1].x1 = 0.9f; + Seg[1].Type = 0; + + Seg[1].nGridPoints = kNumPoints; + Seg[1].SampledPoints = y; + + for (i = 0; i < kNumPoints; i++) { + cmsFloat32Number x = (cmsFloat32Number) (0.1 + ((cmsFloat32Number)i / (kNumPoints-1)) * (0.9 - 0.1)); + y[i] = StraightLine(x); + } + + // from 1 to +infinity + Seg[2].x0 = 0.9f; + Seg[2].x1 = 1e22f; // +infinity + Seg[2].Type = 6; + + Seg[2].Params[0] = 1.0f; + Seg[2].Params[1] = 0.9f; + Seg[2].Params[2] = 0.0f; + Seg[2].Params[3] = 0.1f; + Seg[2].Params[4] = 0.0f; + + curve = cmsBuildSegmentedToneCurve(0, 3, Seg); + + ok = TestCurve( "Float Segmented Curve", curve, StraightLine); + + cmsFreeToneCurve( curve); + + return ok; +} + + +static +cmsInt32Number CheckReadRAW(void) +{ + cmsInt32Number tag_size, tag_size1; + char buffer[37009]; + cmsHPROFILE hProfile; + + + SubTest("RAW read on on-disk"); + hProfile = cmsOpenProfileFromFile("test1.icc", "r"); + + if (hProfile == NULL) + return 0; + tag_size1 = cmsReadRawTag(hProfile, cmsSigGamutTag, NULL, 0); + tag_size = cmsReadRawTag(hProfile, cmsSigGamutTag, buffer, 37009); + + + cmsCloseProfile(hProfile); + + if (tag_size != 37009) + return 0; + + if (tag_size1 != 37009) + return 0; + + SubTest("RAW read on in-memory created profiles"); + hProfile = cmsCreate_sRGBProfile(); + tag_size1 = cmsReadRawTag(hProfile, cmsSigGreenColorantTag, NULL, 0); + tag_size = cmsReadRawTag(hProfile, cmsSigGreenColorantTag, buffer, 20); + + cmsCloseProfile(hProfile); + + if (tag_size != 20) + return 0; + if (tag_size1 != 20) + return 0; + + return 1; +} + + +static +cmsInt32Number CheckMeta(void) +{ + char *data; + cmsHANDLE dict; + cmsHPROFILE p; + cmsUInt32Number clen; + FILE *fp; + int rc; + + /* open file */ + p = cmsOpenProfileFromFile("ibm-t61.icc", "r"); + if (p == NULL) return 0; + + /* read dictionary, but don't do anything with the value */ + //COMMENT OUT THE NEXT TWO LINES AND IT WORKS FINE!!! + dict = cmsReadTag(p, cmsSigMetaTag); + if (dict == NULL) return 0; + + /* serialize profile to memory */ + rc = cmsSaveProfileToMem(p, NULL, &clen); + if (!rc) return 0; + + data = (char*) chknull(malloc(clen)); + rc = cmsSaveProfileToMem(p, data, &clen); + if (!rc) return 0; + + /* write the memory blob to a file */ + //NOTE: The crash does not happen if cmsSaveProfileToFile() is used */ + fp = fopen("new.icc", "wb"); + fwrite(data, 1, clen, fp); + fclose(fp); + free(data); + + cmsCloseProfile(p); + + /* open newly created file and read metadata */ + p = cmsOpenProfileFromFile("new.icc", "r"); + //ERROR: Bad dictionary Name/Value + //ERROR: Corrupted tag 'meta' + //test: test.c:59: main: Assertion `dict' failed. + dict = cmsReadTag(p, cmsSigMetaTag); + if (dict == NULL) return 0; + + cmsCloseProfile(p); + return 1; +} + + +// Bug on applying null transforms on floating point buffers +static +cmsInt32Number CheckFloatNULLxform(void) +{ + int i; + cmsFloat32Number in[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; + cmsFloat32Number out[10]; + + cmsHTRANSFORM xform = cmsCreateTransform(NULL, TYPE_GRAY_FLT, NULL, TYPE_GRAY_FLT, INTENT_PERCEPTUAL, cmsFLAGS_NULLTRANSFORM); + + if (xform == NULL) { + Fail("Unable to create float null transform"); + return 0; + } + + cmsDoTransform(xform, in, out, 10); + + cmsDeleteTransform(xform); + for (i=0; i < 10; i++) { + + if (!IsGoodVal("float nullxform", in[i], out[i], 0.001)) { + + return 0; + } + } + + return 1; +} + +static +cmsInt32Number CheckRemoveTag(void) +{ + cmsHPROFILE p; + cmsMLU *mlu; + int ret; + + p = cmsCreate_sRGBProfileTHR(NULL); + + /* set value */ + mlu = cmsMLUalloc (NULL, 1); + ret = cmsMLUsetASCII (mlu, "en", "US", "bar"); + if (!ret) return 0; + + ret = cmsWriteTag (p, cmsSigDeviceMfgDescTag, mlu); + if (!ret) return 0; + + cmsMLUfree (mlu); + + /* remove the tag */ + ret = cmsWriteTag (p, cmsSigDeviceMfgDescTag, NULL); + if (!ret) return 0; + + /* THIS EXPLODES */ + cmsCloseProfile(p); + return 1; +} + + +static +cmsInt32Number CheckMatrixSimplify(void) +{ + + cmsHPROFILE pIn; + cmsHPROFILE pOut; + cmsHTRANSFORM t; + unsigned char buf[3] = { 127, 32, 64 }; + + + pIn = cmsCreate_sRGBProfile(); + pOut = cmsOpenProfileFromFile("ibm-t61.icc", "r"); + if (pIn == NULL || pOut == NULL) + return 0; + + t = cmsCreateTransform(pIn, TYPE_RGB_8, pOut, TYPE_RGB_8, INTENT_PERCEPTUAL, 0); + cmsDoTransformStride(t, buf, buf, 1, 1); + cmsDeleteTransform(t); + cmsCloseProfile(pIn); + cmsCloseProfile(pOut); + + + return buf[0] == 144 && buf[1] == 0 && buf[2] == 69; +} + + + +static +cmsInt32Number CheckTransformLineStride(void) +{ + + cmsHPROFILE pIn; + cmsHPROFILE pOut; + cmsHTRANSFORM t; + + // Our buffer is formed by 4 RGB8 lines, each line is 2 pixels wide plus a padding of one byte + + cmsUInt8Number buf1[]= { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0, }; + + // Our buffer2 is formed by 4 RGBA lines, each line is 2 pixels wide plus a padding of one byte + + cmsUInt8Number buf2[] = { 0xff, 0xff, 0xff, 1, 0xff, 0xff, 0xff, 1, 0, + 0xff, 0xff, 0xff, 1, 0xff, 0xff, 0xff, 1, 0, + 0xff, 0xff, 0xff, 1, 0xff, 0xff, 0xff, 1, 0, + 0xff, 0xff, 0xff, 1, 0xff, 0xff, 0xff, 1, 0}; + + // Our buffer3 is formed by 4 RGBA16 lines, each line is 2 pixels wide plus a padding of two bytes + + cmsUInt16Number buf3[] = { 0xffff, 0xffff, 0xffff, 0x0101, 0xffff, 0xffff, 0xffff, 0x0101, 0, + 0xffff, 0xffff, 0xffff, 0x0101, 0xffff, 0xffff, 0xffff, 0x0101, 0, + 0xffff, 0xffff, 0xffff, 0x0101, 0xffff, 0xffff, 0xffff, 0x0101, 0, + 0xffff, 0xffff, 0xffff, 0x0101, 0xffff, 0xffff, 0xffff, 0x0101, 0 }; + + cmsUInt8Number out[1024]; + + + memset(out, 0, sizeof(out)); + pIn = cmsCreate_sRGBProfile(); + pOut = cmsOpenProfileFromFile("ibm-t61.icc", "r"); + if (pIn == NULL || pOut == NULL) + return 0; + + t = cmsCreateTransform(pIn, TYPE_RGB_8, pOut, TYPE_RGB_8, INTENT_PERCEPTUAL, cmsFLAGS_COPY_ALPHA); + + cmsDoTransformLineStride(t, buf1, out, 2, 4, 7, 7, 0, 0); + cmsDeleteTransform(t); + + if (memcmp(out, buf1, sizeof(buf1)) != 0) { + Fail("Failed transform line stride on RGB8"); + cmsCloseProfile(pIn); + cmsCloseProfile(pOut); + return 0; + } + + memset(out, 0, sizeof(out)); + + t = cmsCreateTransform(pIn, TYPE_RGBA_8, pOut, TYPE_RGBA_8, INTENT_PERCEPTUAL, cmsFLAGS_COPY_ALPHA); + + cmsDoTransformLineStride(t, buf2, out, 2, 4, 9, 9, 0, 0); + + cmsDeleteTransform(t); + + + if (memcmp(out, buf2, sizeof(buf2)) != 0) { + cmsCloseProfile(pIn); + cmsCloseProfile(pOut); + Fail("Failed transform line stride on RGBA8"); + return 0; + } + + memset(out, 0, sizeof(out)); + + t = cmsCreateTransform(pIn, TYPE_RGBA_16, pOut, TYPE_RGBA_16, INTENT_PERCEPTUAL, cmsFLAGS_COPY_ALPHA); + + cmsDoTransformLineStride(t, buf3, out, 2, 4, 18, 18, 0, 0); + + cmsDeleteTransform(t); + + if (memcmp(out, buf3, sizeof(buf3)) != 0) { + cmsCloseProfile(pIn); + cmsCloseProfile(pOut); + Fail("Failed transform line stride on RGBA16"); + return 0; + } + + + memset(out, 0, sizeof(out)); + + + // From 8 to 16 + t = cmsCreateTransform(pIn, TYPE_RGBA_8, pOut, TYPE_RGBA_16, INTENT_PERCEPTUAL, cmsFLAGS_COPY_ALPHA); + + cmsDoTransformLineStride(t, buf2, out, 2, 4, 9, 18, 0, 0); + + cmsDeleteTransform(t); + + if (memcmp(out, buf3, sizeof(buf3)) != 0) { + cmsCloseProfile(pIn); + cmsCloseProfile(pOut); + Fail("Failed transform line stride on RGBA16"); + return 0; + } + + + + cmsCloseProfile(pIn); + cmsCloseProfile(pOut); + + return 1; +} + + +static +int CheckPlanar8opt(void) +{ + cmsHPROFILE aboveRGB = Create_AboveRGB(); + cmsHPROFILE sRGB = cmsCreate_sRGBProfile(); + + cmsHTRANSFORM transform = cmsCreateTransform(sRGB, TYPE_RGB_8_PLANAR, + aboveRGB, TYPE_RGB_8_PLANAR, + INTENT_PERCEPTUAL, 0); + + cmsDeleteTransform(transform); + cmsCloseProfile(aboveRGB); + cmsCloseProfile(sRGB); + + return 1; +} + +/** +* Bug reported from float32 to uint16 planar +*/ +#define TYPE_RGB_FLT_PLANAR (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(4)|PLANAR_SH(1)) + +static +int CheckPlanarFloat2int(void) +{ + cmsHPROFILE sRGB = cmsCreate_sRGBProfile(); + + cmsHTRANSFORM transform = cmsCreateTransform(sRGB, TYPE_RGB_FLT_PLANAR, + sRGB, TYPE_RGB_16_PLANAR,INTENT_PERCEPTUAL, 0); + + const cmsFloat32Number input[] = { 0.0f, 0.4f, 0.8f, 0.1f, 0.5f, 0.9f, 0.2f, 0.6f, 1.0f, 0.3f, 0.7f, 1.0f }; + cmsUInt16Number output[3*4] = { 0 }; + + cmsDoTransform(transform, input, output, 4); + + cmsDeleteTransform(transform); + cmsCloseProfile(sRGB); + + return 1; +} + + + + + +/** +* Bug reported & fixed. Thanks to Kornel Lesinski for spotting this. +*/ +static +int CheckSE(void) +{ + cmsHPROFILE input_profile = Create_AboveRGB(); + cmsHPROFILE output_profile = cmsCreate_sRGBProfile(); + + cmsHTRANSFORM tr = cmsCreateTransform(input_profile, TYPE_RGBA_8, output_profile, TYPE_RGBA_16_SE, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_COPY_ALPHA); + + cmsUInt8Number rgba[4] = { 40, 41, 41, 0xfa }; + cmsUInt16Number out[4]; + + cmsDoTransform(tr, rgba, out, 1); + cmsCloseProfile(input_profile); + cmsCloseProfile(output_profile); + cmsDeleteTransform(tr); + + if (out[0] != 0xf622 || out[1] != 0x7f24 || out[2] != 0x7f24) + return 0; + + return 1; +} + +/** +* Bug reported. +*/ +static +int CheckForgedMPE(void) +{ + cmsUInt32Number i; + cmsHPROFILE srcProfile; + cmsHPROFILE dstProfile; + cmsColorSpaceSignature srcCS; + cmsUInt32Number nSrcComponents; + cmsUInt32Number srcFormat; + cmsUInt32Number intent = 0; + cmsUInt32Number flags = 0; + cmsHTRANSFORM hTransform; + cmsUInt8Number output[4]; + + srcProfile = cmsOpenProfileFromFile("bad_mpe.icc", "r"); + if (!srcProfile) + return 0; + + dstProfile = cmsCreate_sRGBProfile(); + if (!dstProfile) { + cmsCloseProfile(srcProfile); + return 0; + } + + srcCS = cmsGetColorSpace(srcProfile); + nSrcComponents = cmsChannelsOfColorSpace(srcCS); + + if (srcCS == cmsSigLabData) { + srcFormat = + COLORSPACE_SH(PT_Lab) | CHANNELS_SH(nSrcComponents) | BYTES_SH(0); + } + else { + srcFormat = + COLORSPACE_SH(PT_ANY) | CHANNELS_SH(nSrcComponents) | BYTES_SH(1); + } + + cmsSetLogErrorHandler(ErrorReportingFunction); + + hTransform = cmsCreateTransform(srcProfile, srcFormat, dstProfile, + TYPE_BGR_8, intent, flags); + cmsCloseProfile(srcProfile); + cmsCloseProfile(dstProfile); + + cmsSetLogErrorHandler(FatalErrorQuit); + + // Should report error + if (!TrappedError) return 0; + + TrappedError = FALSE; + + // Transform should NOT be created + if (!hTransform) return 1; + + // Never should reach here + if (T_BYTES(srcFormat) == 0) { // 0 means double + double input[128]; + for (i = 0; i < nSrcComponents; i++) + input[i] = 0.5f; + cmsDoTransform(hTransform, input, output, 1); + } + else { + cmsUInt8Number input[128]; + for (i = 0; i < nSrcComponents; i++) + input[i] = 128; + cmsDoTransform(hTransform, input, output, 1); + } + cmsDeleteTransform(hTransform); + + return 0; +} + +/** +* What the self test is trying to do is creating a proofing transform +* with gamut check, so we can getting the coverage of one profile of +* another, i.e. to approximate the gamut intersection. e.g. +* Thanks to Richard Hughes for providing the test +*/ +static +int CheckProofingIntersection(void) +{ + cmsHPROFILE profile_null, hnd1, hnd2; + cmsHTRANSFORM transform; + + hnd1 = cmsCreate_sRGBProfile(); + hnd2 = Create_AboveRGB(); + + profile_null = cmsCreateNULLProfileTHR(DbgThread()); + transform = cmsCreateProofingTransformTHR(DbgThread(), + hnd1, + TYPE_RGB_FLT, + profile_null, + TYPE_GRAY_FLT, + hnd2, + INTENT_ABSOLUTE_COLORIMETRIC, + INTENT_ABSOLUTE_COLORIMETRIC, + cmsFLAGS_GAMUTCHECK | + cmsFLAGS_SOFTPROOFING); + + cmsCloseProfile(hnd1); + cmsCloseProfile(hnd2); + cmsCloseProfile(profile_null); + + // Failed? + if (transform == NULL) return 0; + + cmsDeleteTransform(transform); + return 1; +} + +/** +* In 2.11: When I create a RGB profile, set the copyright data with an empty string, +* then call cmsMD5computeID on said profile, the program crashes. +*/ +static +int CheckEmptyMLUC(void) +{ + cmsContext context = cmsCreateContext(NULL, NULL); + cmsCIExyY white = { 0.31271, 0.32902, 1.0 }; + cmsCIExyYTRIPLE primaries = + { + .Red = { 0.640, 0.330, 1.0 }, + .Green = { 0.300, 0.600, 1.0 }, + .Blue = { 0.150, 0.060, 1.0 } + }; + + cmsFloat64Number parameters[10] = { 2.6, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }; + cmsToneCurve* toneCurve = cmsBuildParametricToneCurve(context, 1, parameters); + cmsToneCurve* toneCurves[3] = { toneCurve, toneCurve, toneCurve }; + + cmsHPROFILE profile = cmsCreateRGBProfileTHR(context, &white, &primaries, toneCurves); + + cmsSetLogErrorHandlerTHR(context, FatalErrorQuit); + + cmsFreeToneCurve(toneCurve); + + // Set an empty copyright tag. This should log an error. + cmsMLU* mlu = cmsMLUalloc(context, 1); + + cmsMLUsetASCII(mlu, "en", "AU", ""); + cmsMLUsetWide(mlu, "en", "EN", L""); + cmsWriteTag(profile, cmsSigCopyrightTag, mlu); + cmsMLUfree(mlu); + + // This will cause a crash after setting an empty copyright tag. + cmsMD5computeID(profile); + + // Cleanup + cmsCloseProfile(profile); + DebugMemDontCheckThis(context); + cmsDeleteContext(context); + + return 1; +} + +static +double distance(const cmsUInt16Number* a, const cmsUInt16Number* b) +{ + double d1 = a[0] - b[0]; + double d2 = a[1] - b[1]; + double d3 = a[2] - b[2]; + + return sqrt(d1 * d1 + d2 * d2 + d3 * d3); +} + +/** +* In 2.12, a report suggest that the built-in sRGB has roundtrip errors that makes color to move +* when roundtripping again and again +*/ +static +int Check_sRGB_Rountrips(void) +{ + cmsUInt16Number rgb[3], seed[3]; + cmsCIELab Lab; + int i, r, g, b; + double err, maxErr; + cmsHPROFILE hsRGB = cmsCreate_sRGBProfile(); + cmsHPROFILE hLab = cmsCreateLab4Profile(NULL); + + cmsHTRANSFORM hBack = cmsCreateTransform(hLab, TYPE_Lab_DBL, hsRGB, TYPE_RGB_16, INTENT_RELATIVE_COLORIMETRIC, 0); + cmsHTRANSFORM hForth = cmsCreateTransform(hsRGB, TYPE_RGB_16, hLab, TYPE_Lab_DBL, INTENT_RELATIVE_COLORIMETRIC, 0); + + cmsCloseProfile(hLab); + cmsCloseProfile(hsRGB); + + maxErr = 0.0; + for (r = 0; r <= 255; r += 16) + for (g = 0; g <= 255; g += 16) + for (b = 0; b <= 255; b += 16) + { + seed[0] = rgb[0] = (cmsUInt16Number) ((r << 8) | r); + seed[1] = rgb[1] = (cmsUInt16Number) ((g << 8) | g); + seed[2] = rgb[2] = (cmsUInt16Number) ((b << 8) | b); + + for (i = 0; i < 50; i++) + { + cmsDoTransform(hForth, rgb, &Lab, 1); + cmsDoTransform(hBack, &Lab, rgb, 1); + } + + err = distance(seed, rgb); + + if (err > maxErr) + maxErr = err; + } + + + cmsDeleteTransform(hBack); + cmsDeleteTransform(hForth); + + if (maxErr > 20.0) + { + printf("Maximum sRGB roundtrip error %f!\n", maxErr); + return 0; + } + + return 1; +} + + +static +int CheckCenteringOfLab(void) +{ + cmsHPROFILE hProPhoto = cmsOpenProfileFromFile("test4.icc", "r"); + cmsHPROFILE hLab = cmsCreateLab4Profile(NULL); + + cmsHTRANSFORM xform1 = cmsCreateTransform(hProPhoto, TYPE_BGR_16, hLab, TYPE_Lab_16, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_HIGHRESPRECALC); + cmsHTRANSFORM xform2 = cmsCreateTransform(hLab, TYPE_Lab_16, hProPhoto, TYPE_BGR_16, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_HIGHRESPRECALC); + + cmsUInt16Number bgr[3] = { 0xffff, 0xffff, 0xffff }; + cmsUInt16Number bgr2[3]; + cmsUInt16Number lab[3]; + + cmsDoTransform(xform1, bgr, lab, 1); + cmsDoTransform(xform2, lab, bgr2, 1); + + if ((0xffff - bgr2[0]) > 5 || + (0xffff - bgr2[1]) > 5 || + (0xffff - bgr2[2]) > 5) + { + printf("Centering of Lab16 failed. Got %x %x %x\n", bgr2[0], bgr2[1], bgr2[2]); + return 0; + } + + + cmsCloseProfile(hLab); + cmsCloseProfile(hProPhoto); + cmsDeleteTransform(xform1); + cmsDeleteTransform(xform2); + + return 1; +} + + +/** +* Check OKLab colorspace +*/ +static +int Check_OkLab(void) +{ + cmsHPROFILE hOkLab = cmsCreate_OkLabProfile(NULL); + cmsHPROFILE hXYZ = cmsCreateXYZProfile(); + cmsCIEXYZ xyz, xyz2; + cmsCIELab okLab; + +#define TYPE_OKLAB_DBL (FLOAT_SH(1)|COLORSPACE_SH(PT_MCH3)|CHANNELS_SH(3)|BYTES_SH(0)) + + cmsHTRANSFORM xform = cmsCreateTransform(hXYZ, TYPE_XYZ_DBL, hOkLab, TYPE_OKLAB_DBL, INTENT_RELATIVE_COLORIMETRIC, 0); + cmsHTRANSFORM xform2 = cmsCreateTransform(hOkLab, TYPE_OKLAB_DBL, hXYZ, TYPE_XYZ_DBL, INTENT_RELATIVE_COLORIMETRIC, 0); + + /** + * D50 should be converted to white by PCS definition + */ + xyz.X = 0.9642; xyz.Y = 1.0000; xyz.Z = 0.8249; + cmsDoTransform(xform, &xyz, &okLab, 1); + cmsDoTransform(xform2, &okLab, &xyz2, 1); + + + xyz.X = 1.0; xyz.Y = 0.0; xyz.Z = 0.0; + cmsDoTransform(xform, &xyz, &okLab, 1); + cmsDoTransform(xform2, &okLab, &xyz2, 1); + + + xyz.X = 0.0; xyz.Y = 1.0; xyz.Z = 0.0; + cmsDoTransform(xform, &xyz, &okLab, 1); + cmsDoTransform(xform2, &okLab, &xyz2, 1); + + xyz.X = 0.0; xyz.Y = 0.0; xyz.Z = 1.0; + cmsDoTransform(xform, &xyz, &okLab, 1); + cmsDoTransform(xform2, &okLab, &xyz2, 1); + + xyz.X = 0.143046; xyz.Y = 0.060610; xyz.Z = 0.713913; + cmsDoTransform(xform, &xyz, &okLab, 1); + cmsDoTransform(xform2, &okLab, &xyz2, 1); + + cmsDeleteTransform(xform); + cmsDeleteTransform(xform2); + cmsCloseProfile(hOkLab); + cmsCloseProfile(hXYZ); + + return 1; +} + + +static +int Check_OkLab2(void) +{ +#define TYPE_LABA_F32 (FLOAT_SH(1)|COLORSPACE_SH(PT_MCH3)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(4)) + + cmsUInt16Number rgb[3]; + cmsFloat32Number lab[4]; + + cmsHPROFILE labProfile = cmsCreate_OkLabProfile(NULL); + cmsHPROFILE rgbProfile = cmsCreate_sRGBProfile(); + + cmsHTRANSFORM hBack = cmsCreateTransform(labProfile, TYPE_LABA_F32, rgbProfile, TYPE_RGB_16, INTENT_RELATIVE_COLORIMETRIC, 0); + cmsHTRANSFORM hForth = cmsCreateTransform(rgbProfile, TYPE_RGB_16, labProfile, TYPE_LABA_F32, INTENT_RELATIVE_COLORIMETRIC, 0); + + cmsCloseProfile(labProfile); + cmsCloseProfile(rgbProfile); + + rgb[0] = 0; + rgb[1] = 0; + rgb[2] = 65535; + + cmsDoTransform(hForth, rgb, &lab, 1); + cmsDoTransform(hBack, lab, &rgb, 1); + + cmsDeleteTransform(hBack); + cmsDeleteTransform(hForth); + + if (rgb[0] != 0 || rgb[1] != 0 || rgb[2] != 65535) return 0; + + return 1; +} + + +static +cmsHPROFILE createRgbGamma(cmsFloat64Number g) +{ + cmsCIExyY D65 = { 0.3127, 0.3290, 1.0 }; + cmsCIExyYTRIPLE Rec709Primaries = { + {0.6400, 0.3300, 1.0}, + {0.3000, 0.6000, 1.0}, + {0.1500, 0.0600, 1.0} + }; + cmsToneCurve* Gamma[3]; + cmsHPROFILE hRGB; + + Gamma[0] = Gamma[1] = Gamma[2] = cmsBuildGamma(0, g); + if (Gamma[0] == NULL) return NULL; + + hRGB = cmsCreateRGBProfile(&D65, &Rec709Primaries, Gamma); + cmsFreeToneCurve(Gamma[0]); + return hRGB; +} + + +static +int CheckGammaSpaceDetection(void) +{ + cmsFloat64Number i; + + for (i = 0.5; i < 3; i += 0.1) + { + cmsHPROFILE hProfile = createRgbGamma(i); + + cmsFloat64Number gamma = cmsDetectRGBProfileGamma(hProfile, 0.01); + + cmsCloseProfile(hProfile); + + if (fabs(gamma - i) > 0.1) + { + Fail("Failed profile gamma detection of %f (got %f)", i, gamma); + return 0; + } + } + + return 1; +} + +// Per issue #308. A built-in is corrupted by using write raw tag was causing a segfault +static +int CheckInducedCorruption(void) +{ + cmsHTRANSFORM xform0; + char garbage[] = "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b"; + cmsHPROFILE hsrgb = cmsCreate_sRGBProfile(); + cmsHPROFILE hLab = cmsCreateLab4Profile(NULL); + + cmsSetLogErrorHandler(NULL); + cmsWriteRawTag(hsrgb, cmsSigBlueColorantTag, &garbage, sizeof(garbage)); + + xform0 = cmsCreateTransform(hsrgb, TYPE_RGB_16, hLab, TYPE_Lab_16, INTENT_RELATIVE_COLORIMETRIC, 0); + + if (xform0) cmsDeleteTransform(xform0); + + cmsCloseProfile(hsrgb); + cmsCloseProfile(hLab); + + ResetFatalError(); + return 1; +} + +#if 0 + +// You need to download following profiles to execute this test: sRGB-elle-V4-srgbtrc.icc, sRGB-elle-V4-g10.icc +// The include this line in the checks list: Check("KInear spaces detection", CheckLinearSpacesOptimization); +static +void uint16toFloat(cmsUInt16Number* src, cmsFloat32Number* dst) +{ + for (int i = 0; i < 3; i++) { + dst[i] = src[i] / 65535.f; + } +} + +static +int CheckLinearSpacesOptimization(void) +{ + cmsHPROFILE lcms_sRGB = cmsCreate_sRGBProfile(); + cmsHPROFILE elle_sRGB = cmsOpenProfileFromFile("sRGB-elle-V4-srgbtrc.icc", "r"); + cmsHPROFILE elle_linear = cmsOpenProfileFromFile("sRGB-elle-V4-g10.icc", "r"); + cmsHTRANSFORM transform1 = cmsCreateTransform(elle_sRGB, TYPE_RGB_16, elle_linear, TYPE_RGB_16, INTENT_RELATIVE_COLORIMETRIC, 0); + cmsHTRANSFORM transform2 = cmsCreateTransform(elle_linear, TYPE_RGB_16, lcms_sRGB, TYPE_RGB_16, INTENT_RELATIVE_COLORIMETRIC, 0); + cmsHTRANSFORM transform2a = cmsCreateTransform(elle_linear, TYPE_RGB_FLT, lcms_sRGB, TYPE_RGB_16, INTENT_RELATIVE_COLORIMETRIC, 0); + + cmsUInt16Number sourceCol[3] = { 43 * 257, 27 * 257, 6 * 257 }; + cmsUInt16Number linearCol[3] = { 0 }; + float linearColF[3] = { 0 }; + cmsUInt16Number finalCol[3] = { 0 }; + int difR, difG, difB; + int difR2, difG2, difB2; + + cmsDoTransform(transform1, sourceCol, linearCol, 1); + cmsDoTransform(transform2, linearCol, finalCol, 1); + + cmsCloseProfile(lcms_sRGB); cmsCloseProfile(elle_sRGB); cmsCloseProfile(elle_linear); + + + difR = (int)sourceCol[0] - finalCol[0]; + difG = (int)sourceCol[1] - finalCol[1]; + difB = (int)sourceCol[2] - finalCol[2]; + + + uint16toFloat(linearCol, linearColF); + cmsDoTransform(transform2a, linearColF, finalCol, 1); + + difR2 = (int)sourceCol[0] - finalCol[0]; + difG2 = (int)sourceCol[1] - finalCol[1]; + difB2 = (int)sourceCol[2] - finalCol[2]; + + cmsDeleteTransform(transform1); + cmsDeleteTransform(transform2); + cmsDeleteTransform(transform2a); + + if (abs(difR2 - difR) > 5 || abs(difG2 - difG) > 5 || abs(difB2 - difB) > 5) + { + Fail("Linear detection failed"); + return 0; + } + + return 1; +} +#endif + + + +static +int CheckBadCGATS(void) +{ + const char* bad_it8 = + " \"\"\n" + "NUMBER_OF_FIELDS 4\n" + "BEGIN_DATA_FORMAT\n" + "I R G G\n" + "END_DATA_FORMAT\n" + "NUMBER_OF_FIELDS 9\n" + "NUMBER_OF_SETS 2\n" + "BEGIN_DATA\n" + "d\n" + "0 0Bd\n" + "0Ba $ $ t ."; + + cmsHANDLE hIT8; + + cmsSetLogErrorHandler(NULL); + + hIT8 = cmsIT8LoadFromMem(0, bad_it8, (cmsUInt32Number) strlen(bad_it8)); + + ResetFatalError(); + + if (hIT8 != NULL) + { + Fail("Wrong IT8 accepted as ok"); + cmsIT8Free(hIT8); + } + + return 1; +} + +static +int CheckIntToFloatTransform(void) +{ + cmsHPROFILE hAbove = Create_AboveRGB(); + cmsHPROFILE hsRGB = cmsCreate_sRGBProfile(); + + cmsHTRANSFORM xform = cmsCreateTransform(hAbove, TYPE_RGB_8, hsRGB, TYPE_RGB_DBL, INTENT_PERCEPTUAL, 0); + + cmsUInt8Number rgb8[3] = { 12, 253, 21 }; + cmsFloat64Number rgbDBL[3] = { 0 }; + + cmsCloseProfile(hAbove); cmsCloseProfile(hsRGB); + + cmsDoTransform(xform, rgb8, rgbDBL, 1); + + + cmsDeleteTransform(xform); + + if (rgbDBL[0] < 0 && rgbDBL[2] < 0) return 1; + + Fail("Unbounded transforms with integer input failed"); + + return 0; +} + +static +int CheckSaveLinearizationDevicelink(void) +{ + const cmsFloat32Number table[] = { 0, 0.5f, 1.0f }; + + cmsToneCurve* tone = cmsBuildTabulatedToneCurveFloat(NULL, 3, table); + + cmsToneCurve* rgb_curves[3] = { tone, tone, tone }; + + cmsHPROFILE hDeviceLink = cmsCreateLinearizationDeviceLink(cmsSigRgbData, rgb_curves); + + cmsBool result; + cmsHTRANSFORM xform; + int i; + + cmsFreeToneCurve(tone); + + result = cmsSaveProfileToFile(hDeviceLink, "lin_rgb.icc"); + + cmsCloseProfile(hDeviceLink); + + if (!result) + { + remove("lin_rgb.icc"); + Fail("Couldn't save linearization devicelink"); + } + + + hDeviceLink = cmsOpenProfileFromFile("lin_rgb.icc", "r"); + + if (hDeviceLink == NULL) + { + remove("lin_rgb.icc"); + Fail("Couldn't open devicelink"); + } + + xform = cmsCreateTransform(hDeviceLink, TYPE_RGB_8, NULL, TYPE_RGB_8, INTENT_PERCEPTUAL, 0); + cmsCloseProfile(hDeviceLink); + + for (i = 0; i < 256; i++) + { + cmsUInt8Number rgb_in[3] = { i, i, i }; + cmsUInt8Number rgb_out[3]; + + cmsDoTransform(xform, rgb_in, rgb_out, 1); + + if (rgb_in[0] != rgb_out[0] || + rgb_in[1] != rgb_out[1] || + rgb_in[2] != rgb_out[2]) + { + remove("lin_rgb.icc"); + Fail("Saved devicelink was not working"); + } + } + + + cmsDeleteTransform(xform); + remove("lin_rgb.icc"); + + return 1; +} + +static +int CheckGamutCheckFloats(void) +{ + + cmsUInt16Number alarms[16] = { 0x0f0f,3,4,5,6,7,8,9,10 }; + + + cmsHPROFILE hLab = cmsCreateLab4Profile(NULL); + cmsHPROFILE hNull = cmsCreateNULLProfile(); + cmsHPROFILE hsRGB = cmsCreate_sRGBProfile(); + + cmsHTRANSFORM xfrm = cmsCreateProofingTransform(hLab, + TYPE_Lab_DBL, hNull, TYPE_GRAY_8, hsRGB, + INTENT_RELATIVE_COLORIMETRIC, INTENT_ABSOLUTE_COLORIMETRIC, + cmsFLAGS_GAMUTCHECK); + + cmsCloseProfile(hLab); + cmsCloseProfile(hNull); + cmsCloseProfile(hsRGB); + + cmsCIELab Lab = { 50, -125, 125 }; + cmsCIELab Lab2 = { 50, -10, 12 }; + + cmsUInt8Number gamut; + + cmsSetAlarmCodes(alarms); + + cmsDoTransform(xfrm, &Lab, &gamut, 1); // Gives the alarm != 0 + if (gamut != 0x0f) + Fail("Gamut check not good"); + + cmsDoTransform(xfrm, &Lab2, &gamut, 1); + if (gamut != 0) + Fail("Gamut check zero"); + + cmsDeleteTransform(xfrm); + return 1; +} + +static +int CheckMixedRawAndCooked(void) +{ + const cmsUInt32Number data = cmsSigFilmScanner; + const cmsUInt32Number* pdata; + cmsBool is_ok = FALSE; + + // This is the internal representation of cmsSigTechnologyTag tag type + struct _cooked_st + { + _cmsTagBase base; + cmsUInt32Number data; + + } buffer = { { (cmsTagTypeSignature) cmsSigTechnologyTag, {0} }, cmsSigFilmScanner }; + + cmsHPROFILE hProfile = cmsCreateProfilePlaceholder(0); + cmsWriteRawTag(hProfile, cmsSigTechnologyTag, &buffer, sizeof buffer); + cmsWriteTag(hProfile, cmsSigTechnologyTag, &data); + cmsWriteRawTag(hProfile, cmsSigTechnologyTag, &buffer, sizeof buffer); + cmsWriteRawTag(hProfile, cmsSigTechnologyTag, &buffer, sizeof buffer); + cmsWriteTag(hProfile, cmsSigTechnologyTag, &data); + cmsWriteTag(hProfile, cmsSigTechnologyTag, &data); + memset(&buffer, 0, sizeof(buffer)); + + cmsReadRawTag(hProfile, cmsSigTechnologyTag, &buffer, sizeof buffer ); + pdata = cmsReadTag(hProfile, cmsSigTechnologyTag); + + is_ok = (*pdata == cmsSigFilmScanner) && (_cmsAdjustEndianess32(buffer.data) == cmsSigFilmScanner); + + cmsCloseProfile(hProfile); + return is_ok; +} + +// -------------------------------------------------------------------------------------------------- +// P E R F O R M A N C E C H E C K S +// -------------------------------------------------------------------------------------------------- + + +typedef struct {cmsUInt8Number r, g, b, a;} Scanline_rgba8; +typedef struct {cmsUInt16Number r, g, b, a;} Scanline_rgba16; +typedef struct {cmsFloat32Number r, g, b, a;} Scanline_rgba32; +typedef struct {cmsUInt8Number r, g, b;} Scanline_rgb8; +typedef struct {cmsUInt16Number r, g, b;} Scanline_rgb16; +typedef struct {cmsFloat32Number r, g, b;} Scanline_rgb32; + + +static +void TitlePerformance(const char* Txt) +{ + printf("%-45s: ", Txt); fflush(stdout); +} + +static +void PrintPerformance(cmsUInt32Number Bytes, cmsUInt32Number SizeOfPixel, cmsFloat64Number diff) +{ + cmsFloat64Number seconds = (cmsFloat64Number) diff / CLOCKS_PER_SEC; + cmsFloat64Number mpix_sec = Bytes / (1024.0*1024.0*seconds*SizeOfPixel); + + printf("%#4.3g MPixel/sec.\n", mpix_sec); + fflush(stdout); +} + + +static +void SpeedTest32bits(const char * Title, cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut, cmsInt32Number Intent) +{ + cmsInt32Number r, g, b, j; + clock_t atime; + cmsFloat64Number diff; + cmsHTRANSFORM hlcmsxform; + Scanline_rgba32 *In; + cmsUInt32Number Mb; + cmsUInt32Number Interval = 4; // Power of 2 number to increment r,g,b values by in the loops to keep the test duration practically short + cmsUInt32Number NumPixels; + + if (hlcmsProfileIn == NULL || hlcmsProfileOut == NULL) + Die("Unable to open profiles"); + + hlcmsxform = cmsCreateTransformTHR(DbgThread(), hlcmsProfileIn, TYPE_RGBA_FLT, + hlcmsProfileOut, TYPE_RGBA_FLT, Intent, cmsFLAGS_NOCACHE); + cmsCloseProfile(hlcmsProfileIn); + cmsCloseProfile(hlcmsProfileOut); + + NumPixels = 256 / Interval * 256 / Interval * 256 / Interval; + Mb = NumPixels * sizeof(Scanline_rgba32); + + In = (Scanline_rgba32 *) chknull(malloc(Mb)); + + j = 0; + for (r=0; r < 256; r += Interval) + for (g=0; g < 256; g += Interval) + for (b=0; b < 256; b += Interval) { + + In[j].r = r / 256.0f; + In[j].g = g / 256.0f; + In[j].b = b / 256.0f; + In[j].a = (In[j].r + In[j].g + In[j].b) / 3; + + j++; + } + + + TitlePerformance(Title); + + atime = clock(); + + cmsDoTransform(hlcmsxform, In, In, NumPixels); + + diff = clock() - atime; + free(In); + + PrintPerformance(Mb, sizeof(Scanline_rgba32), diff); + cmsDeleteTransform(hlcmsxform); + +} + + +static +void SpeedTest16bits(const char * Title, cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut, cmsInt32Number Intent) +{ + cmsInt32Number r, g, b, j; + clock_t atime; + cmsFloat64Number diff; + cmsHTRANSFORM hlcmsxform; + Scanline_rgb16 *In; + cmsUInt32Number Mb; + + if (hlcmsProfileIn == NULL || hlcmsProfileOut == NULL) + Die("Unable to open profiles"); + + hlcmsxform = cmsCreateTransformTHR(DbgThread(), hlcmsProfileIn, TYPE_RGB_16, + hlcmsProfileOut, TYPE_RGB_16, Intent, cmsFLAGS_NOCACHE); + cmsCloseProfile(hlcmsProfileIn); + cmsCloseProfile(hlcmsProfileOut); + + Mb = 256*256*256 * sizeof(Scanline_rgb16); + + In = (Scanline_rgb16*) chknull(malloc(Mb)); + + j = 0; + for (r=0; r < 256; r++) + for (g=0; g < 256; g++) + for (b=0; b < 256; b++) { + + In[j].r = (cmsUInt16Number) ((r << 8) | r); + In[j].g = (cmsUInt16Number) ((g << 8) | g); + In[j].b = (cmsUInt16Number) ((b << 8) | b); + + j++; + } + + + TitlePerformance(Title); + + atime = clock(); + + cmsDoTransform(hlcmsxform, In, In, 256*256*256); + + diff = clock() - atime; + free(In); + + PrintPerformance(Mb, sizeof(Scanline_rgb16), diff); + cmsDeleteTransform(hlcmsxform); + +} + + +static +void SpeedTest32bitsCMYK(const char * Title, cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut) +{ + cmsInt32Number r, g, b, j; + clock_t atime; + cmsFloat64Number diff; + cmsHTRANSFORM hlcmsxform; + Scanline_rgba32 *In; + cmsUInt32Number Mb; + cmsUInt32Number Interval = 4; // Power of 2 number to increment r,g,b values by in the loops to keep the test duration practically short + cmsUInt32Number NumPixels; + + if (hlcmsProfileIn == NULL || hlcmsProfileOut == NULL) + Die("Unable to open profiles"); + + hlcmsxform = cmsCreateTransformTHR(DbgThread(), hlcmsProfileIn, TYPE_CMYK_FLT, + hlcmsProfileOut, TYPE_CMYK_FLT, INTENT_PERCEPTUAL, cmsFLAGS_NOCACHE); + cmsCloseProfile(hlcmsProfileIn); + cmsCloseProfile(hlcmsProfileOut); + + NumPixels = 256 / Interval * 256 / Interval * 256 / Interval; + Mb = NumPixels * sizeof(Scanline_rgba32); + + In = (Scanline_rgba32 *) chknull(malloc(Mb)); + + j = 0; + for (r=0; r < 256; r += Interval) + for (g=0; g < 256; g += Interval) + for (b=0; b < 256; b += Interval) { + + In[j].r = r / 256.0f; + In[j].g = g / 256.0f; + In[j].b = b / 256.0f; + In[j].a = (In[j].r + In[j].g + In[j].b) / 3; + + j++; + } + + + TitlePerformance(Title); + + atime = clock(); + + cmsDoTransform(hlcmsxform, In, In, NumPixels); + + diff = clock() - atime; + + free(In); + + PrintPerformance(Mb, sizeof(Scanline_rgba32), diff); + + cmsDeleteTransform(hlcmsxform); + +} + + +static +void SpeedTest16bitsCMYK(const char * Title, cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut) +{ + cmsInt32Number r, g, b, j; + clock_t atime; + cmsFloat64Number diff; + cmsHTRANSFORM hlcmsxform; + Scanline_rgba16 *In; + cmsUInt32Number Mb; + + if (hlcmsProfileIn == NULL || hlcmsProfileOut == NULL) + Die("Unable to open profiles"); + + hlcmsxform = cmsCreateTransformTHR(DbgThread(), hlcmsProfileIn, TYPE_CMYK_16, + hlcmsProfileOut, TYPE_CMYK_16, INTENT_PERCEPTUAL, cmsFLAGS_NOCACHE); + cmsCloseProfile(hlcmsProfileIn); + cmsCloseProfile(hlcmsProfileOut); + + Mb = 256*256*256*sizeof(Scanline_rgba16); + + In = (Scanline_rgba16*) chknull(malloc(Mb)); + + j = 0; + for (r=0; r < 256; r++) + for (g=0; g < 256; g++) + for (b=0; b < 256; b++) { + + In[j].r = (cmsUInt16Number) ((r << 8) | r); + In[j].g = (cmsUInt16Number) ((g << 8) | g); + In[j].b = (cmsUInt16Number) ((b << 8) | b); + In[j].a = 0; + + j++; + } + + + TitlePerformance(Title); + + atime = clock(); + + cmsDoTransform(hlcmsxform, In, In, 256*256*256); + + diff = clock() - atime; + + free(In); + + PrintPerformance(Mb, sizeof(Scanline_rgba16), diff); + + cmsDeleteTransform(hlcmsxform); + +} + + +static +void SpeedTest8bits(const char * Title, cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut, cmsInt32Number Intent) +{ + cmsInt32Number r, g, b, j; + clock_t atime; + cmsFloat64Number diff; + cmsHTRANSFORM hlcmsxform; + Scanline_rgb8 *In; + cmsUInt32Number Mb; + + if (hlcmsProfileIn == NULL || hlcmsProfileOut == NULL) + Die("Unable to open profiles"); + + hlcmsxform = cmsCreateTransformTHR(DbgThread(), hlcmsProfileIn, TYPE_RGB_8, + hlcmsProfileOut, TYPE_RGB_8, Intent, cmsFLAGS_NOCACHE); + cmsCloseProfile(hlcmsProfileIn); + cmsCloseProfile(hlcmsProfileOut); + + Mb = 256*256*256*sizeof(Scanline_rgb8); + + In = (Scanline_rgb8*) chknull(malloc(Mb)); + + j = 0; + for (r=0; r < 256; r++) + for (g=0; g < 256; g++) + for (b=0; b < 256; b++) { + + In[j].r = (cmsUInt8Number) r; + In[j].g = (cmsUInt8Number) g; + In[j].b = (cmsUInt8Number) b; + + j++; + } + + TitlePerformance(Title); + + atime = clock(); + + cmsDoTransform(hlcmsxform, In, In, 256*256*256); + + diff = clock() - atime; + + free(In); + + PrintPerformance(Mb, sizeof(Scanline_rgb8), diff); + + cmsDeleteTransform(hlcmsxform); + +} + + +static +void SpeedTest8bitsCMYK(const char * Title, cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut) +{ + cmsInt32Number r, g, b, j; + clock_t atime; + cmsFloat64Number diff; + cmsHTRANSFORM hlcmsxform; + Scanline_rgba8 *In; + cmsUInt32Number Mb; + + if (hlcmsProfileIn == NULL || hlcmsProfileOut == NULL) + Die("Unable to open profiles"); + + hlcmsxform = cmsCreateTransformTHR(DbgThread(), hlcmsProfileIn, TYPE_CMYK_8, + hlcmsProfileOut, TYPE_CMYK_8, INTENT_PERCEPTUAL, cmsFLAGS_NOCACHE); + cmsCloseProfile(hlcmsProfileIn); + cmsCloseProfile(hlcmsProfileOut); + + Mb = 256*256*256*sizeof(Scanline_rgba8); + + In = (Scanline_rgba8*) chknull(malloc(Mb)); + + j = 0; + for (r=0; r < 256; r++) + for (g=0; g < 256; g++) + for (b=0; b < 256; b++) { + + In[j].r = (cmsUInt8Number) r; + In[j].g = (cmsUInt8Number) g; + In[j].b = (cmsUInt8Number) b; + In[j].a = (cmsUInt8Number) 0; + + j++; + } + + TitlePerformance(Title); + + atime = clock(); + + cmsDoTransform(hlcmsxform, In, In, 256*256*256); + + diff = clock() - atime; + + free(In); + + PrintPerformance(Mb, sizeof(Scanline_rgba8), diff); + + + cmsDeleteTransform(hlcmsxform); + +} + + +static +void SpeedTest32bitsGray(const char * Title, cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut, cmsInt32Number Intent) +{ + cmsInt32Number r, g, b, j; + clock_t atime; + cmsFloat64Number diff; + cmsHTRANSFORM hlcmsxform; + cmsFloat32Number *In; + cmsUInt32Number Mb; + cmsUInt32Number Interval = 4; // Power of 2 number to increment r,g,b values by in the loops to keep the test duration practically short + cmsUInt32Number NumPixels; + + if (hlcmsProfileIn == NULL || hlcmsProfileOut == NULL) + Die("Unable to open profiles"); + + hlcmsxform = cmsCreateTransformTHR(DbgThread(), hlcmsProfileIn, + TYPE_GRAY_FLT, hlcmsProfileOut, TYPE_GRAY_FLT, Intent, cmsFLAGS_NOCACHE); + cmsCloseProfile(hlcmsProfileIn); + cmsCloseProfile(hlcmsProfileOut); + + NumPixels = 256 / Interval * 256 / Interval * 256 / Interval; + Mb = NumPixels * sizeof(cmsFloat32Number); + + In = (cmsFloat32Number*) chknull(malloc(Mb)); + + j = 0; + for (r = 0; r < 256; r += Interval) + for (g = 0; g < 256; g += Interval) + for (b = 0; b < 256; b += Interval) { + + In[j] = ((r + g + b) / 768.0f); + + j++; + } + + TitlePerformance(Title); + + atime = clock(); + + cmsDoTransform(hlcmsxform, In, In, NumPixels); + + diff = clock() - atime; + free(In); + + PrintPerformance(Mb, sizeof(cmsFloat32Number), diff); + cmsDeleteTransform(hlcmsxform); +} + + +static +void SpeedTest16bitsGray(const char * Title, cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut, cmsInt32Number Intent) +{ + cmsInt32Number r, g, b, j; + clock_t atime; + cmsFloat64Number diff; + cmsHTRANSFORM hlcmsxform; + cmsUInt16Number *In; + cmsUInt32Number Mb; + + if (hlcmsProfileIn == NULL || hlcmsProfileOut == NULL) + Die("Unable to open profiles"); + + hlcmsxform = cmsCreateTransformTHR(DbgThread(), hlcmsProfileIn, + TYPE_GRAY_16, hlcmsProfileOut, TYPE_GRAY_16, Intent, cmsFLAGS_NOCACHE); + cmsCloseProfile(hlcmsProfileIn); + cmsCloseProfile(hlcmsProfileOut); + Mb = 256*256*256 * sizeof(cmsUInt16Number); + + In = (cmsUInt16Number *) chknull(malloc(Mb)); + + j = 0; + for (r=0; r < 256; r++) + for (g=0; g < 256; g++) + for (b=0; b < 256; b++) { + + In[j] = (cmsUInt16Number) ((r + g + b) / 3); + + j++; + } + + TitlePerformance(Title); + + atime = clock(); + + cmsDoTransform(hlcmsxform, In, In, 256*256*256); + + diff = clock() - atime; + free(In); + + PrintPerformance(Mb, sizeof(cmsUInt16Number), diff); + cmsDeleteTransform(hlcmsxform); +} + + +static +void SpeedTest8bitsGray(const char * Title, cmsHPROFILE hlcmsProfileIn, cmsHPROFILE hlcmsProfileOut, cmsInt32Number Intent) +{ + cmsInt32Number r, g, b, j; + clock_t atime; + cmsFloat64Number diff; + cmsHTRANSFORM hlcmsxform; + cmsUInt8Number *In; + cmsUInt32Number Mb; + + + if (hlcmsProfileIn == NULL || hlcmsProfileOut == NULL) + Die("Unable to open profiles"); + + hlcmsxform = cmsCreateTransformTHR(DbgThread(), hlcmsProfileIn, + TYPE_GRAY_8, hlcmsProfileOut, TYPE_GRAY_8, Intent, cmsFLAGS_NOCACHE); + cmsCloseProfile(hlcmsProfileIn); + cmsCloseProfile(hlcmsProfileOut); + Mb = 256*256*256; + + In = (cmsUInt8Number*) chknull(malloc(Mb)); + + j = 0; + for (r=0; r < 256; r++) + for (g=0; g < 256; g++) + for (b=0; b < 256; b++) { + + In[j] = (cmsUInt8Number) r; + + j++; + } + + TitlePerformance(Title); + + atime = clock(); + + cmsDoTransform(hlcmsxform, In, In, 256*256*256); + + diff = clock() - atime; + free(In); + + PrintPerformance(Mb, sizeof(cmsUInt8Number), diff); + cmsDeleteTransform(hlcmsxform); +} + + +static +cmsHPROFILE CreateCurves(void) +{ + cmsToneCurve* Gamma = cmsBuildGamma(DbgThread(), 1.1); + cmsToneCurve* Transfer[3]; + cmsHPROFILE h; + + Transfer[0] = Transfer[1] = Transfer[2] = Gamma; + h = cmsCreateLinearizationDeviceLink(cmsSigRgbData, Transfer); + + cmsFreeToneCurve(Gamma); + + return h; +} + + +static +void SpeedTest(void) +{ + printf("\n\nP E R F O R M A N C E T E S T S\n"); + printf( "=================================\n\n"); + fflush(stdout); + + SpeedTest8bits("8 bits on CLUT profiles", + cmsOpenProfileFromFile("test5.icc", "r"), + cmsOpenProfileFromFile("test3.icc", "r"), + INTENT_PERCEPTUAL); + + SpeedTest16bits("16 bits on CLUT profiles", + cmsOpenProfileFromFile("test5.icc", "r"), + cmsOpenProfileFromFile("test3.icc", "r"), INTENT_PERCEPTUAL); + + SpeedTest32bits("32 bits on CLUT profiles", + cmsOpenProfileFromFile("test5.icc", "r"), + cmsOpenProfileFromFile("test3.icc", "r"), INTENT_PERCEPTUAL); + + printf("\n"); + + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + SpeedTest8bits("8 bits on Matrix-Shaper profiles", + cmsOpenProfileFromFile("test5.icc", "r"), + cmsOpenProfileFromFile("aRGBlcms2.icc", "r"), + INTENT_PERCEPTUAL); + + SpeedTest16bits("16 bits on Matrix-Shaper profiles", + cmsOpenProfileFromFile("test5.icc", "r"), + cmsOpenProfileFromFile("aRGBlcms2.icc", "r"), + INTENT_PERCEPTUAL); + + SpeedTest32bits("32 bits on Matrix-Shaper profiles", + cmsOpenProfileFromFile("test5.icc", "r"), + cmsOpenProfileFromFile("aRGBlcms2.icc", "r"), + INTENT_PERCEPTUAL); + + printf("\n"); + + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + SpeedTest8bits("8 bits on SAME Matrix-Shaper profiles", + cmsOpenProfileFromFile("test5.icc", "r"), + cmsOpenProfileFromFile("test5.icc", "r"), + INTENT_PERCEPTUAL); + + SpeedTest16bits("16 bits on SAME Matrix-Shaper profiles", + cmsOpenProfileFromFile("aRGBlcms2.icc", "r"), + cmsOpenProfileFromFile("aRGBlcms2.icc", "r"), + INTENT_PERCEPTUAL); + + SpeedTest32bits("32 bits on SAME Matrix-Shaper profiles", + cmsOpenProfileFromFile("aRGBlcms2.icc", "r"), + cmsOpenProfileFromFile("aRGBlcms2.icc", "r"), + INTENT_PERCEPTUAL); + + printf("\n"); + + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + SpeedTest8bits("8 bits on Matrix-Shaper profiles (AbsCol)", + cmsOpenProfileFromFile("test5.icc", "r"), + cmsOpenProfileFromFile("aRGBlcms2.icc", "r"), + INTENT_ABSOLUTE_COLORIMETRIC); + + SpeedTest16bits("16 bits on Matrix-Shaper profiles (AbsCol)", + cmsOpenProfileFromFile("test5.icc", "r"), + cmsOpenProfileFromFile("aRGBlcms2.icc", "r"), + INTENT_ABSOLUTE_COLORIMETRIC); + + SpeedTest32bits("32 bits on Matrix-Shaper profiles (AbsCol)", + cmsOpenProfileFromFile("test5.icc", "r"), + cmsOpenProfileFromFile("aRGBlcms2.icc", "r"), + INTENT_ABSOLUTE_COLORIMETRIC); + + printf("\n"); + + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + SpeedTest8bits("8 bits on curves", + CreateCurves(), + CreateCurves(), + INTENT_PERCEPTUAL); + + SpeedTest16bits("16 bits on curves", + CreateCurves(), + CreateCurves(), + INTENT_PERCEPTUAL); + + SpeedTest32bits("32 bits on curves", + CreateCurves(), + CreateCurves(), + INTENT_PERCEPTUAL); + + printf("\n"); + + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + SpeedTest8bitsCMYK("8 bits on CMYK profiles", + cmsOpenProfileFromFile("test1.icc", "r"), + cmsOpenProfileFromFile("test2.icc", "r")); + + SpeedTest16bitsCMYK("16 bits on CMYK profiles", + cmsOpenProfileFromFile("test1.icc", "r"), + cmsOpenProfileFromFile("test2.icc", "r")); + + SpeedTest32bitsCMYK("32 bits on CMYK profiles", + cmsOpenProfileFromFile("test1.icc", "r"), + cmsOpenProfileFromFile("test2.icc", "r")); + + printf("\n"); + + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + SpeedTest8bitsGray("8 bits on gray-to gray", + cmsOpenProfileFromFile("gray3lcms2.icc", "r"), + cmsOpenProfileFromFile("graylcms2.icc", "r"), INTENT_RELATIVE_COLORIMETRIC); + + SpeedTest16bitsGray("16 bits on gray-to gray", + cmsOpenProfileFromFile("gray3lcms2.icc", "r"), + cmsOpenProfileFromFile("graylcms2.icc", "r"), INTENT_RELATIVE_COLORIMETRIC); + + SpeedTest32bitsGray("32 bits on gray-to gray", + cmsOpenProfileFromFile("gray3lcms2.icc", "r"), + cmsOpenProfileFromFile("graylcms2.icc", "r"), INTENT_RELATIVE_COLORIMETRIC); + + printf("\n"); + + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + SpeedTest8bitsGray("8 bits on gray-to-lab gray", + cmsOpenProfileFromFile("graylcms2.icc", "r"), + cmsOpenProfileFromFile("glablcms2.icc", "r"), INTENT_RELATIVE_COLORIMETRIC); + + SpeedTest16bitsGray("16 bits on gray-to-lab gray", + cmsOpenProfileFromFile("graylcms2.icc", "r"), + cmsOpenProfileFromFile("glablcms2.icc", "r"), INTENT_RELATIVE_COLORIMETRIC); + + SpeedTest32bitsGray("32 bits on gray-to-lab gray", + cmsOpenProfileFromFile("graylcms2.icc", "r"), + cmsOpenProfileFromFile("glablcms2.icc", "r"), INTENT_RELATIVE_COLORIMETRIC); + + printf("\n"); + + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + SpeedTest8bitsGray("8 bits on SAME gray-to-gray", + cmsOpenProfileFromFile("graylcms2.icc", "r"), + cmsOpenProfileFromFile("graylcms2.icc", "r"), INTENT_PERCEPTUAL); + + SpeedTest16bitsGray("16 bits on SAME gray-to-gray", + cmsOpenProfileFromFile("graylcms2.icc", "r"), + cmsOpenProfileFromFile("graylcms2.icc", "r"), INTENT_PERCEPTUAL); + + SpeedTest32bitsGray("32 bits on SAME gray-to-gray", + cmsOpenProfileFromFile("graylcms2.icc", "r"), + cmsOpenProfileFromFile("graylcms2.icc", "r"), INTENT_PERCEPTUAL); + + printf("\n"); +} + + +// ----------------------------------------------------------------------------------------------------- + + +// Print the supported intents +static +void PrintSupportedIntents(void) +{ + cmsUInt32Number n, i; + cmsUInt32Number Codes[200]; + char* Descriptions[200]; + + n = cmsGetSupportedIntents(200, Codes, Descriptions); + + printf("Supported intents:\n"); + for (i=0; i < n; i++) { + printf("\t%u - %s\n", Codes[i], Descriptions[i]); + } + printf("\n"); +} + +// --------------------------------------------------------------------------------------- + + +int main(int argc, char* argv[]) +{ + cmsInt32Number Exhaustive = 0; + cmsInt32Number DoSpeedTests = 1; + cmsInt32Number DoCheckTests = 1; + cmsInt32Number DoPluginTests = 1; + +#ifdef CMS_IS_WINDOWS_ + cmsInt32Number DoZooTests = 0; +#endif + +#ifdef _MSC_VER + _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF ); +#endif + + // First of all, check for the right header + if (cmsGetEncodedCMMversion() != LCMS_VERSION) { + Die("Oops, you are mixing header and shared lib!\nHeader version reports to be '%d' and shared lib '%d'\n", LCMS_VERSION, cmsGetEncodedCMMversion()); + } + + printf("LittleCMS %2.2f test bed %s %s\n\n", cmsGetEncodedCMMversion() / 1000.0, __DATE__, __TIME__); + + if ((argc == 2) && strcmp(argv[1], "--exhaustive") == 0) { + + Exhaustive = 1; + printf("Running exhaustive tests (will take a while...)\n\n"); + } + else + if ((argc == 3) && strcmp(argv[1], "--chdir") == 0) { + CHDIR(argv[2]); + } + + printf("Installing debug memory plug-in ... "); + cmsPlugin(&DebugMemHandler); + printf("done.\n"); + + printf("Installing error logger ... "); + cmsSetLogErrorHandler(FatalErrorQuit); + printf("done.\n"); + + PrintSupportedIntents(); + + Check("Base types", CheckBaseTypes); + Check("endianness", CheckEndianness); + Check("quick floor", CheckQuickFloor); + Check("quick floor word", CheckQuickFloorWord); + Check("Fixed point 15.16 representation", CheckFixedPoint15_16); + Check("Fixed point 8.8 representation", CheckFixedPoint8_8); + Check("D50 roundtrip", CheckD50Roundtrip); + + // Create utility profiles + if (DoCheckTests || DoSpeedTests) + Check("Creation of test profiles", CreateTestProfiles); + + if (DoCheckTests) { + + // Forward 1D interpolation + Check("1D interpolation in 2pt tables", Check1DLERP2); + Check("1D interpolation in 3pt tables", Check1DLERP3); + Check("1D interpolation in 4pt tables", Check1DLERP4); + Check("1D interpolation in 6pt tables", Check1DLERP6); + Check("1D interpolation in 18pt tables", Check1DLERP18); + Check("1D interpolation in descending 2pt tables", Check1DLERP2Down); + Check("1D interpolation in descending 3pt tables", Check1DLERP3Down); + Check("1D interpolation in descending 6pt tables", Check1DLERP6Down); + Check("1D interpolation in descending 18pt tables", Check1DLERP18Down); + + if (Exhaustive) { + + Check("1D interpolation in n tables", ExhaustiveCheck1DLERP); + Check("1D interpolation in descending tables", ExhaustiveCheck1DLERPDown); + } + + // Forward 3D interpolation + Check("3D interpolation Tetrahedral (float) ", Check3DinterpolationFloatTetrahedral); + Check("3D interpolation Trilinear (float) ", Check3DinterpolationFloatTrilinear); + Check("3D interpolation Tetrahedral (16) ", Check3DinterpolationTetrahedral16); + Check("3D interpolation Trilinear (16) ", Check3DinterpolationTrilinear16); + + if (Exhaustive) { + + Check("Exhaustive 3D interpolation Tetrahedral (float) ", ExaustiveCheck3DinterpolationFloatTetrahedral); + Check("Exhaustive 3D interpolation Trilinear (float) ", ExaustiveCheck3DinterpolationFloatTrilinear); + Check("Exhaustive 3D interpolation Tetrahedral (16) ", ExhaustiveCheck3DinterpolationTetrahedral16); + Check("Exhaustive 3D interpolation Trilinear (16) ", ExhaustiveCheck3DinterpolationTrilinear16); + } + + Check("Reverse interpolation 3 -> 3", CheckReverseInterpolation3x3); + Check("Reverse interpolation 4 -> 3", CheckReverseInterpolation4x3); + + + // High dimensionality interpolation + + Check("3D interpolation", Check3Dinterp); + Check("3D interpolation with granularity", Check3DinterpGranular); + Check("4D interpolation", Check4Dinterp); + Check("4D interpolation with granularity", Check4DinterpGranular); + Check("5D interpolation with granularity", Check5DinterpGranular); + Check("6D interpolation with granularity", Check6DinterpGranular); + Check("7D interpolation with granularity", Check7DinterpGranular); + Check("8D interpolation with granularity", Check8DinterpGranular); + + // Encoding of colorspaces + Check("Lab to LCh and back (float only) ", CheckLab2LCh); + Check("Lab to XYZ and back (float only) ", CheckLab2XYZ); + Check("Lab to xyY and back (float only) ", CheckLab2xyY); + Check("Lab V2 encoding", CheckLabV2encoding); + Check("Lab V4 encoding", CheckLabV4encoding); + + // BlackBody + Check("Blackbody radiator", CheckTemp2CHRM); + + // Tone curves + Check("Linear gamma curves (16 bits)", CheckGammaCreation16); + Check("Linear gamma curves (float)", CheckGammaCreationFlt); + + Check("Curve 1.8 (float)", CheckGamma18); + Check("Curve 2.2 (float)", CheckGamma22); + Check("Curve 3.0 (float)", CheckGamma30); + + Check("Curve 1.8 (table)", CheckGamma18Table); + Check("Curve 2.2 (table)", CheckGamma22Table); + Check("Curve 3.0 (table)", CheckGamma30Table); + + Check("Curve 1.8 (word table)", CheckGamma18TableWord); + Check("Curve 2.2 (word table)", CheckGamma22TableWord); + Check("Curve 3.0 (word table)", CheckGamma30TableWord); + + Check("Parametric curves", CheckParametricToneCurves); + + Check("Join curves", CheckJointCurves); + Check("Join curves descending", CheckJointCurvesDescending); + Check("Join curves degenerated", CheckReverseDegenerated); + Check("Join curves sRGB (Float)", CheckJointFloatCurves_sRGB); + Check("Join curves sRGB (16 bits)", CheckJoint16Curves_sRGB); + Check("Join curves sigmoidal", CheckJointCurvesSShaped); + + // LUT basics + Check("LUT creation & dup", CheckLUTcreation); + Check("1 Stage LUT ", Check1StageLUT); + Check("2 Stage LUT ", Check2StageLUT); + Check("2 Stage LUT (16 bits)", Check2Stage16LUT); + Check("3 Stage LUT ", Check3StageLUT); + Check("3 Stage LUT (16 bits)", Check3Stage16LUT); + Check("4 Stage LUT ", Check4StageLUT); + Check("4 Stage LUT (16 bits)", Check4Stage16LUT); + Check("5 Stage LUT ", Check5StageLUT); + Check("5 Stage LUT (16 bits) ", Check5Stage16LUT); + Check("6 Stage LUT ", Check6StageLUT); + Check("6 Stage LUT (16 bits) ", Check6Stage16LUT); + + // LUT operation + Check("Lab to Lab LUT (float only) ", CheckLab2LabLUT); + Check("XYZ to XYZ LUT (float only) ", CheckXYZ2XYZLUT); + Check("Lab to Lab MAT LUT (float only) ", CheckLab2LabMatLUT); + Check("Named Color LUT", CheckNamedColorLUT); + Check("Usual formatters", CheckFormatters16); + Check("Floating point formatters", CheckFormattersFloat); + +#ifndef CMS_NO_HALF_SUPPORT + Check("HALF formatters", CheckFormattersHalf); +#endif + // ChangeBuffersFormat + Check("ChangeBuffersFormat", CheckChangeBufferFormat); + + // MLU + Check("Multilocalized Unicode", CheckMLU); + Check("Multilocalized Unicode (II)", CheckMLU_UTF8); + + // Named color + Check("Named color lists", CheckNamedColorList); + Check("Create named color profile", CreateNamedColorProfile); + + + // Profile I/O (this one is huge!) + Check("Profile creation", CheckProfileCreation); + Check("Header version", CheckVersionHeaderWriting); + Check("Multilocalized profile", CheckMultilocalizedProfile); + + // Error reporting + Check("Error reporting on bad profiles", CheckErrReportingOnBadProfiles); + Check("Error reporting on bad transforms", CheckErrReportingOnBadTransforms); + + // Transforms + Check("Curves only transforms", CheckCurvesOnlyTransforms); + Check("Float Lab->Lab transforms", CheckFloatLabTransforms); + Check("Encoded Lab->Lab transforms", CheckEncodedLabTransforms); + Check("Stored identities", CheckStoredIdentities); + + Check("Matrix-shaper transform (float)", CheckMatrixShaperXFORMFloat); + Check("Matrix-shaper transform (16 bits)", CheckMatrixShaperXFORM16); + Check("Matrix-shaper transform (8 bits)", CheckMatrixShaperXFORM8); + + Check("Primaries of sRGB", CheckRGBPrimaries); + + // Known values + Check("Known values across matrix-shaper", Chack_sRGB_Float); + Check("Gray input profile", CheckInputGray); + Check("Gray Lab input profile", CheckLabInputGray); + Check("Gray output profile", CheckOutputGray); + Check("Gray Lab output profile", CheckLabOutputGray); + + Check("Matrix-shaper proofing transform (float)", CheckProofingXFORMFloat); + Check("Matrix-shaper proofing transform (16 bits)", CheckProofingXFORM16); + + Check("Gamut check", CheckGamutCheck); + + Check("CMYK roundtrip on perceptual transform", CheckCMYKRoundtrip); + + Check("CMYK perceptual transform", CheckCMYKPerceptual); + // Check("CMYK rel.col. transform", CheckCMYKRelCol); + + Check("Black ink only preservation", CheckKOnlyBlackPreserving); + Check("Black plane preservation", CheckKPlaneBlackPreserving); + + + Check("Deciding curve types", CheckV4gamma); + + Check("Black point detection", CheckBlackPoint); + Check("TAC detection", CheckTAC); + + Check("CGATS parser", CheckCGATS); + Check("CGATS parser on junk", CheckCGATS2); + Check("CGATS parser on overflow", CheckCGATS_Overflow); + Check("PostScript generator", CheckPostScript); + Check("Segment maxima GBD", CheckGBD); + Check("MD5 digest", CheckMD5); + Check("Linking", CheckLinking); + Check("floating point tags on XYZ", CheckFloatXYZ); + Check("RGB->Lab->RGB with alpha on FLT", ChecksRGB2LabFLT); + Check("Parametric curve on Rec709", CheckParametricRec709); + Check("Floating Point sampled curve with non-zero start", CheckFloatSamples); + Check("Floating Point segmented curve with short sampled segment", CheckFloatSegments); + Check("Read RAW tags", CheckReadRAW); + Check("Check MetaTag", CheckMeta); + Check("Null transform on floats", CheckFloatNULLxform); + Check("Set free a tag", CheckRemoveTag); + Check("Matrix simplification", CheckMatrixSimplify); + Check("Planar 8 optimization", CheckPlanar8opt); + Check("Planar float to int16", CheckPlanarFloat2int); + Check("Swap endian feature", CheckSE); + Check("Transform line stride RGB", CheckTransformLineStride); + Check("Forged MPE profile", CheckForgedMPE); + Check("Proofing intersection", CheckProofingIntersection); + Check("Empty MLUC", CheckEmptyMLUC); + Check("sRGB round-trips", Check_sRGB_Rountrips); + Check("OkLab color space", Check_OkLab); + Check("OkLab color space (2)", Check_OkLab2); + Check("centering of Lab16", CheckCenteringOfLab); + Check("Gamma space detection", CheckGammaSpaceDetection); + Check("Unbounded mode w/ integer output", CheckIntToFloatTransform); + Check("Corrupted built-in by using cmsWriteRawTag", CheckInducedCorruption); + Check("Bad CGATS file", CheckBadCGATS); + Check("Saving linearization devicelink", CheckSaveLinearizationDevicelink); + Check("Gamut check on floats", CheckGamutCheckFloats); + Check("Mixing RAW and Cooked tags", CheckMixedRawAndCooked); + } + + if (DoPluginTests) + { + + Check("Context memory handling", CheckAllocContext); + Check("Simple context functionality", CheckSimpleContext); + Check("Alarm codes context", CheckAlarmColorsContext); + Check("Adaptation state context", CheckAdaptationStateContext); + Check("1D interpolation plugin", CheckInterp1DPlugin); + Check("3D interpolation plugin", CheckInterp3DPlugin); + Check("Parametric curve plugin", CheckParametricCurvePlugin); + Check("Formatters plugin", CheckFormattersPlugin); + Check("Tag type plugin", CheckTagTypePlugin); + Check("MPE type plugin", CheckMPEPlugin); + Check("Optimization plugin", CheckOptimizationPlugin); + Check("Rendering intent plugin", CheckIntentPlugin); + Check("Full transform plugin", CheckTransformPlugin); + Check("Mutex plugin", CheckMutexPlugin); + Check("Double from float", CheckMethodPackDoublesFromFloat); + } + + + if (DoSpeedTests) + SpeedTest(); + + +#ifdef CMS_IS_WINDOWS_ + if (DoZooTests) + CheckProfileZOO(); +#endif + + DebugMemPrintTotals(); + + cmsUnregisterPlugins(); + + // Cleanup + if (DoCheckTests || DoSpeedTests) + RemoveTestProfiles(); + + return TotalFail; +} + + + + diff --git a/local/recipes/libs/lcms2/source/testbed/testcms2.h b/local/recipes/libs/lcms2/source/testbed/testcms2.h new file mode 100755 index 0000000000..9b9b9f86b1 --- /dev/null +++ b/local/recipes/libs/lcms2/source/testbed/testcms2.h @@ -0,0 +1,91 @@ +//--------------------------------------------------------------------------------- +// +// Little Color Management System +// Copyright (c) 1998-2022 Marti Maria Saguer +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//--------------------------------------------------------------------------------- +// + +#ifndef TESTCMS2_H +#define TESTCMS2_H + +#include "lcms2_internal.h" + +// On Visual Studio, use debug CRT +#ifdef _MSC_VER +# include "crtdbg.h" +#endif + +#ifdef CMS_IS_WINDOWS_ +# include +# include +# define CHDIR(a) (void)_chdir(a) +#else +# include +# define CHDIR(a) (void)chdir(a) +#endif + +#define cmsmin(a, b) (((a) < (b)) ? (a) : (b)) + +// Used to mark special pointers +void DebugMemDontCheckThis(void *Ptr); + + +cmsBool IsGoodVal(const char *title, cmsFloat64Number in, cmsFloat64Number out, cmsFloat64Number max); +cmsBool IsGoodFixed15_16(const char *title, cmsFloat64Number in, cmsFloat64Number out); +cmsBool IsGoodFixed8_8(const char *title, cmsFloat64Number in, cmsFloat64Number out); +cmsBool IsGoodWord(const char *title, cmsUInt16Number in, cmsUInt16Number out); +cmsBool IsGoodWordPrec(const char *title, cmsUInt16Number in, cmsUInt16Number out, cmsUInt16Number maxErr); + +void* PluginMemHandler(void); +cmsContext WatchDogContext(void* usr); + +void ResetFatalError(void); +void Die(const char* Reason, ...); +void Dot(void); +void Fail(const char* frm, ...); +void SubTest(const char* frm, ...); +void TestMemoryLeaks(cmsBool ok); +void Say(const char* str); + +// Plug-in tests +cmsInt32Number CheckSimpleContext(void); +cmsInt32Number CheckAllocContext(void); +cmsInt32Number CheckAlarmColorsContext(void); +cmsInt32Number CheckAdaptationStateContext(void); +cmsInt32Number CheckInterp1DPlugin(void); +cmsInt32Number CheckInterp3DPlugin(void); +cmsInt32Number CheckParametricCurvePlugin(void); +cmsInt32Number CheckFormattersPlugin(void); +cmsInt32Number CheckTagTypePlugin(void); +cmsInt32Number CheckMPEPlugin(void); +cmsInt32Number CheckOptimizationPlugin(void); +cmsInt32Number CheckIntentPlugin(void); +cmsInt32Number CheckTransformPlugin(void); +cmsInt32Number CheckMutexPlugin(void); +cmsInt32Number CheckMethodPackDoublesFromFloat(void); + + +// Zoo +void CheckProfileZOO(void); + +#endif + diff --git a/local/recipes/libs/lcms2/source/testbed/testplugin.c b/local/recipes/libs/lcms2/source/testbed/testplugin.c new file mode 100755 index 0000000000..22588ef196 --- /dev/null +++ b/local/recipes/libs/lcms2/source/testbed/testplugin.c @@ -0,0 +1,1583 @@ +//--------------------------------------------------------------------------------- +// +// Little Color Management System +// Copyright (c) 1998-2026 Marti Maria Saguer +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//--------------------------------------------------------------------------------- +// + +#include "testcms2.h" + +// -------------------------------------------------------------------------------------------------- +// Auxiliary, duplicate a context and mark the block as non-debug because in this case the allocator +// and deallocator have different context owners +// -------------------------------------------------------------------------------------------------- + +static +cmsContext DupContext(cmsContext src, void* Data) +{ + cmsContext cpy = cmsDupContext(src, Data); + + DebugMemDontCheckThis(cpy); + + return cpy; +} + +// -------------------------------------------------------------------------------------------------- +// Simple context functions +// -------------------------------------------------------------------------------------------------- + +// Allocation order +cmsInt32Number CheckAllocContext(void) +{ + cmsContext c1, c2, c3, c4; + + + c1 = cmsCreateContext(NULL, NULL); // This creates a context by using the normal malloc + DebugMemDontCheckThis(c1); + cmsDeleteContext(c1); + + c2 = cmsCreateContext(PluginMemHandler(), NULL); // This creates a context by using the debug malloc + DebugMemDontCheckThis(c2); + cmsDeleteContext(c2); + + c1 = cmsCreateContext(NULL, NULL); + DebugMemDontCheckThis(c1); + + c2 = cmsCreateContext(PluginMemHandler(), NULL); + DebugMemDontCheckThis(c2); + + cmsPluginTHR(c1, PluginMemHandler()); // Now the context have custom allocators + + c3 = DupContext(c1, NULL); + c4 = DupContext(c2, NULL); + + + + cmsDeleteContext(c1); // Should be deleted by using normal malloc + cmsDeleteContext(c2); // Should be deleted by using debug malloc + cmsDeleteContext(c3); // Should be deleted by using normal malloc + cmsDeleteContext(c4); // Should be deleted by using debug malloc + + return 1; +} + +// Test the very basic context capabilities +cmsInt32Number CheckSimpleContext(void) +{ + int a = 1; + int b = 32; + cmsInt32Number rc = 0; + + cmsContext c1, c2, c3; + + // This function creates a context with a special + // memory manager that check allocation + c1 = WatchDogContext(&a); + cmsDeleteContext(c1); + + c1 = WatchDogContext(&a); + + // Let's check duplication + c2 = DupContext(c1, NULL); + c3 = DupContext(c2, NULL); + + // User data should have been propagated + rc = (*(int*) cmsGetContextUserData(c3)) == 1 ; + + // Free resources + cmsDeleteContext(c1); + cmsDeleteContext(c2); + cmsDeleteContext(c3); + + if (!rc) { + Fail("Creation of user data failed"); + return 0; + } + + // Back to create 3 levels of inherance + c1 = cmsCreateContext(NULL, &a); + DebugMemDontCheckThis(c1); + + c2 = DupContext(c1, NULL); + c3 = DupContext(c2, &b); + + rc = (*(int*) cmsGetContextUserData(c3)) == 32 ; + + cmsDeleteContext(c1); + cmsDeleteContext(c2); + cmsDeleteContext(c3); + + if (!rc) { + Fail("Modification of user data failed"); + return 0; + } + + // All seems ok + return rc; +} + + + + +// -------------------------------------------------------------------------------------------------- +//Alarm color functions +// -------------------------------------------------------------------------------------------------- + +// This function tests the alarm codes across contexts +cmsInt32Number CheckAlarmColorsContext(void) +{ + cmsInt32Number rc = 0; + const cmsUInt16Number codes[] = {0x0000, 0x1111, 0x2222, 0x3333, 0x4444, 0x5555, 0x6666, 0x7777, 0x8888, 0x9999, 0xaaaa, 0xbbbb, 0xcccc, 0xdddd, 0xeeee, 0xffff}; + cmsUInt16Number out[16]; + cmsContext c1, c2, c3; + int i; + + c1 = WatchDogContext(NULL); + + cmsSetAlarmCodesTHR(c1, codes); + c2 = DupContext(c1, NULL); + c3 = DupContext(c2, NULL); + + cmsGetAlarmCodesTHR(c3, out); + + rc = 1; + for (i=0; i < 16; i++) { + if (out[i] != codes[i]) { + Fail("Bad alarm code %x != %x", out[i], codes[i]); + rc = 0; + break; + } + } + + cmsDeleteContext(c1); + cmsDeleteContext(c2); + cmsDeleteContext(c3); + + return rc; +} + + +// -------------------------------------------------------------------------------------------------- +//Adaptation state functions +// -------------------------------------------------------------------------------------------------- + +// Similar to the previous, but for adaptation state +cmsInt32Number CheckAdaptationStateContext(void) +{ + cmsInt32Number rc = 0; + cmsContext c1, c2, c3; + cmsFloat64Number old1, old2; + + old1 = cmsSetAdaptationStateTHR(NULL, -1); + + c1 = WatchDogContext(NULL); + + cmsSetAdaptationStateTHR(c1, 0.7); + + c2 = DupContext(c1, NULL); + c3 = DupContext(c2, NULL); + + rc = IsGoodVal("Adaptation state", cmsSetAdaptationStateTHR(c3, -1), 0.7, 0.001); + + cmsDeleteContext(c1); + cmsDeleteContext(c2); + cmsDeleteContext(c3); + + old2 = cmsSetAdaptationStateTHR(NULL, -1); + + if (old1 != old2) { + Fail("Adaptation state has changed"); + return 0; + } + + return rc; +} + +// -------------------------------------------------------------------------------------------------- +// Interpolation plugin check: A fake 1D and 3D interpolation will be used to test the functionality. +// -------------------------------------------------------------------------------------------------- + +// This fake interpolation takes always the closest lower node in the interpolation table for 1D +static +void Fake1Dfloat(const cmsFloat32Number Value[], + cmsFloat32Number Output[], + const cmsInterpParams* p) +{ + cmsFloat32Number val2; + int cell; + const cmsFloat32Number* LutTable = (const cmsFloat32Number*) p ->Table; + + // Clip upper values + if (Value[0] >= 1.0) { + Output[0] = LutTable[p -> Domain[0]]; + return; + } + + val2 = p -> Domain[0] * Value[0]; + cell = (int) floor(val2); + Output[0] = LutTable[cell] ; +} + +// This fake interpolation just uses scrambled negated indexes for output +static +void Fake3D16(CMSREGISTER const cmsUInt16Number Input[], + CMSREGISTER cmsUInt16Number Output[], + CMSREGISTER const struct _cms_interp_struc* p) +{ + Output[0] = 0xFFFF - Input[2]; + Output[1] = 0xFFFF - Input[1]; + Output[2] = 0xFFFF - Input[0]; +} + +// The factory chooses interpolation routines on depending on certain conditions. +cmsInterpFunction my_Interpolators_Factory(cmsUInt32Number nInputChannels, + cmsUInt32Number nOutputChannels, + cmsUInt32Number dwFlags) +{ + cmsInterpFunction Interpolation; + cmsBool IsFloat = (dwFlags & CMS_LERP_FLAGS_FLOAT); + + // Initialize the return to zero as a non-supported mark + memset(&Interpolation, 0, sizeof(Interpolation)); + + // For 1D to 1D and floating point + if (nInputChannels == 1 && nOutputChannels == 1 && IsFloat) { + + Interpolation.LerpFloat = Fake1Dfloat; + } + else + if (nInputChannels == 3 && nOutputChannels == 3 && !IsFloat) { + + // For 3D to 3D and 16 bits + Interpolation.Lerp16 = Fake3D16; + } + + // Here is the interpolation + return Interpolation; +} + +// Interpolation plug-in +static +cmsPluginInterpolation InterpPluginSample = { + + { cmsPluginMagicNumber, 2060, cmsPluginInterpolationSig, NULL }, + my_Interpolators_Factory +}; + + +// This is the check code for 1D interpolation plug-in +cmsInt32Number CheckInterp1DPlugin(void) +{ + cmsToneCurve* Sampled1D = NULL; + cmsContext ctx = NULL; + cmsContext cpy = NULL; + const cmsFloat32Number tab[] = { 0.0f, 0.10f, 0.20f, 0.30f, 0.40f, 0.50f, 0.60f, 0.70f, 0.80f, 0.90f, 1.00f }; // A straight line + + // 1st level context + ctx = WatchDogContext(NULL); + if (ctx == NULL) { + Fail("Cannot create context"); + goto Error; + } + + cmsPluginTHR(ctx, &InterpPluginSample); + + cpy = DupContext(ctx, NULL); + if (cpy == NULL) { + Fail("Cannot create context (2)"); + goto Error; + } + + Sampled1D = cmsBuildTabulatedToneCurveFloat(cpy, 11, tab); + if (Sampled1D == NULL) { + Fail("Cannot create tone curve (1)"); + goto Error; + } + + // Do some interpolations with the plugin + if (!IsGoodVal("0.10", cmsEvalToneCurveFloat(Sampled1D, 0.10f), 0.10, 0.01)) goto Error; + if (!IsGoodVal("0.13", cmsEvalToneCurveFloat(Sampled1D, 0.13f), 0.10, 0.01)) goto Error; + if (!IsGoodVal("0.55", cmsEvalToneCurveFloat(Sampled1D, 0.55f), 0.50, 0.01)) goto Error; + if (!IsGoodVal("0.9999", cmsEvalToneCurveFloat(Sampled1D, 0.9999f), 0.90, 0.01)) goto Error; + + cmsFreeToneCurve(Sampled1D); + cmsDeleteContext(ctx); + cmsDeleteContext(cpy); + + // Now in global context + Sampled1D = cmsBuildTabulatedToneCurveFloat(NULL, 11, tab); + if (Sampled1D == NULL) { + Fail("Cannot create tone curve (2)"); + goto Error; + } + + // Now without the plug-in + if (!IsGoodVal("0.10", cmsEvalToneCurveFloat(Sampled1D, 0.10f), 0.10, 0.001)) goto Error; + if (!IsGoodVal("0.13", cmsEvalToneCurveFloat(Sampled1D, 0.13f), 0.13, 0.001)) goto Error; + if (!IsGoodVal("0.55", cmsEvalToneCurveFloat(Sampled1D, 0.55f), 0.55, 0.001)) goto Error; + if (!IsGoodVal("0.9999", cmsEvalToneCurveFloat(Sampled1D, 0.9999f), 0.9999, 0.001)) goto Error; + + cmsFreeToneCurve(Sampled1D); + return 1; + +Error: + if (ctx != NULL) cmsDeleteContext(ctx); + if (cpy != NULL) cmsDeleteContext(ctx); + if (Sampled1D != NULL) cmsFreeToneCurve(Sampled1D); + return 0; + +} + +// Checks the 3D interpolation +cmsInt32Number CheckInterp3DPlugin(void) +{ + + cmsPipeline* p; + cmsStage* clut; + cmsContext ctx; + cmsUInt16Number In[3], Out[3]; + cmsUInt16Number identity[] = { + + 0, 0, 0, + 0, 0, 0xffff, + 0, 0xffff, 0, + 0, 0xffff, 0xffff, + 0xffff, 0, 0, + 0xffff, 0, 0xffff, + 0xffff, 0xffff, 0, + 0xffff, 0xffff, 0xffff + }; + + + ctx = WatchDogContext(NULL); + if (ctx == NULL) { + Fail("Cannot create context"); + return 0; + } + + + cmsPluginTHR(ctx, &InterpPluginSample); + + + p = cmsPipelineAlloc(ctx, 3, 3); + clut = cmsStageAllocCLut16bit(ctx, 2, 3, 3, identity); + cmsPipelineInsertStage(p, cmsAT_BEGIN, clut); + + // Do some interpolations with the plugin + + In[0] = 0; In[1] = 0; In[2] = 0; + cmsPipelineEval16(In, Out, p); + + if (!IsGoodWord("0", Out[0], 0xFFFF - 0)) goto Error; + if (!IsGoodWord("1", Out[1], 0xFFFF - 0)) goto Error; + if (!IsGoodWord("2", Out[2], 0xFFFF - 0)) goto Error; + + In[0] = 0x1234; In[1] = 0x5678; In[2] = 0x9ABC; + cmsPipelineEval16(In, Out, p); + + if (!IsGoodWord("0", 0xFFFF - 0x9ABC, Out[0])) goto Error; + if (!IsGoodWord("1", 0xFFFF - 0x5678, Out[1])) goto Error; + if (!IsGoodWord("2", 0xFFFF - 0x1234, Out[2])) goto Error; + + cmsPipelineFree(p); + cmsDeleteContext(ctx); + + // Now without the plug-in + + p = cmsPipelineAlloc(NULL, 3, 3); + clut = cmsStageAllocCLut16bit(NULL, 2, 3, 3, identity); + cmsPipelineInsertStage(p, cmsAT_BEGIN, clut); + + In[0] = 0; In[1] = 0; In[2] = 0; + cmsPipelineEval16(In, Out, p); + + if (!IsGoodWord("0", 0, Out[0])) goto Error; + if (!IsGoodWord("1", 0, Out[1])) goto Error; + if (!IsGoodWord("2", 0, Out[2])) goto Error; + + In[0] = 0x1234; In[1] = 0x5678; In[2] = 0x9ABC; + cmsPipelineEval16(In, Out, p); + + if (!IsGoodWord("0", 0x1234, Out[0])) goto Error; + if (!IsGoodWord("1", 0x5678, Out[1])) goto Error; + if (!IsGoodWord("2", 0x9ABC, Out[2])) goto Error; + + cmsPipelineFree(p); + return 1; + +Error: + cmsPipelineFree(p); + return 0; + +} + +// -------------------------------------------------------------------------------------------------- +// Parametric curve plugin check: sin(x)/cos(x) function will be used to test the functionality. +// -------------------------------------------------------------------------------------------------- + +#define TYPE_SIN 1000 +#define TYPE_COS 1010 +#define TYPE_TAN 1020 +#define TYPE_709 709 + +static cmsFloat64Number my_fns(cmsInt32Number Type, + const cmsFloat64Number Params[], + cmsFloat64Number R) +{ + cmsFloat64Number Val; + switch (Type) { + + case TYPE_SIN: + Val = Params[0]* sin(R * M_PI); + break; + + case -TYPE_SIN: + Val = asin(R) / (M_PI * Params[0]); + break; + + case TYPE_COS: + Val = Params[0]* cos(R * M_PI); + break; + + case -TYPE_COS: + Val = acos(R) / (M_PI * Params[0]); + break; + + default: return -1.0; + + } + + return Val; +} + +static +cmsFloat64Number my_fns2(cmsInt32Number Type, + const cmsFloat64Number Params[], + cmsFloat64Number R) +{ + cmsFloat64Number Val; + switch (Type) { + + case TYPE_TAN: + Val = Params[0]* tan(R * M_PI); + break; + + case -TYPE_TAN: + Val = atan(R) / (M_PI * Params[0]); + break; + + default: return -1.0; + } + + return Val; +} + + +static double Rec709Math(int Type, const double Params[], double R) +{ + double Fun = 0; + + switch (Type) + { + case 709: + + if (R <= (Params[3]*Params[4])) Fun = R / Params[3]; + else Fun = pow(((R - Params[2])/Params[1]), Params[0]); + break; + + case -709: + + if (R <= Params[4]) Fun = R * Params[3]; + else Fun = Params[1] * pow(R, (1/Params[0])) + Params[2]; + break; + } + return Fun; +} + + +// Add nonstandard TRC curves -> Rec709 + +cmsPluginParametricCurves Rec709Plugin = { + + { cmsPluginMagicNumber, 2060, cmsPluginParametricCurveSig, NULL }, + + 1, {TYPE_709}, {5}, Rec709Math + +}; + + +static +cmsPluginParametricCurves CurvePluginSample = { + { cmsPluginMagicNumber, 2060, cmsPluginParametricCurveSig, NULL }, + + 2, // nFunctions + { TYPE_SIN, TYPE_COS }, // Function Types + { 1, 1 }, // ParameterCount + my_fns // Evaluator +}; + +static +cmsPluginParametricCurves CurvePluginSample2 = { + { cmsPluginMagicNumber, 2060, cmsPluginParametricCurveSig, NULL }, + + 1, // nFunctions + { TYPE_TAN}, // Function Types + { 1 }, // ParameterCount + my_fns2 // Evaluator +}; + +// -------------------------------------------------------------------------------------------------- +// In this test, the DupContext function will be checked as well +// -------------------------------------------------------------------------------------------------- +cmsInt32Number CheckParametricCurvePlugin(void) +{ + cmsContext ctx = NULL; + cmsContext cpy = NULL; + cmsContext cpy2 = NULL; + cmsToneCurve* sinus; + cmsToneCurve* cosinus; + cmsToneCurve* tangent; + cmsToneCurve* reverse_sinus; + cmsToneCurve* reverse_cosinus; + cmsFloat64Number scale = 1.0; + + + ctx = WatchDogContext(NULL); + + cmsPluginTHR(ctx, &CurvePluginSample); + + cpy = DupContext(ctx, NULL); + + cmsPluginTHR(cpy, &CurvePluginSample2); + + cpy2 = DupContext(cpy, NULL); + + cmsPluginTHR(cpy2, &Rec709Plugin); + + + sinus = cmsBuildParametricToneCurve(cpy, TYPE_SIN, &scale); + cosinus = cmsBuildParametricToneCurve(cpy, TYPE_COS, &scale); + tangent = cmsBuildParametricToneCurve(cpy, TYPE_TAN, &scale); + reverse_sinus = cmsReverseToneCurve(sinus); + reverse_cosinus = cmsReverseToneCurve(cosinus); + + + if (!IsGoodVal("0.10", cmsEvalToneCurveFloat(sinus, 0.10f), sin(0.10 * M_PI) , 0.001)) goto Error; + if (!IsGoodVal("0.60", cmsEvalToneCurveFloat(sinus, 0.60f), sin(0.60* M_PI), 0.001)) goto Error; + if (!IsGoodVal("0.90", cmsEvalToneCurveFloat(sinus, 0.90f), sin(0.90* M_PI), 0.001)) goto Error; + + if (!IsGoodVal("0.10", cmsEvalToneCurveFloat(cosinus, 0.10f), cos(0.10* M_PI), 0.001)) goto Error; + if (!IsGoodVal("0.60", cmsEvalToneCurveFloat(cosinus, 0.60f), cos(0.60* M_PI), 0.001)) goto Error; + if (!IsGoodVal("0.90", cmsEvalToneCurveFloat(cosinus, 0.90f), cos(0.90* M_PI), 0.001)) goto Error; + + if (!IsGoodVal("0.10", cmsEvalToneCurveFloat(tangent, 0.10f), tan(0.10* M_PI), 0.001)) goto Error; + if (!IsGoodVal("0.60", cmsEvalToneCurveFloat(tangent, 0.60f), tan(0.60* M_PI), 0.001)) goto Error; + if (!IsGoodVal("0.90", cmsEvalToneCurveFloat(tangent, 0.90f), tan(0.90* M_PI), 0.001)) goto Error; + + + if (!IsGoodVal("0.10", cmsEvalToneCurveFloat(reverse_sinus, 0.10f), asin(0.10)/M_PI, 0.001)) goto Error; + if (!IsGoodVal("0.60", cmsEvalToneCurveFloat(reverse_sinus, 0.60f), asin(0.60)/M_PI, 0.001)) goto Error; + if (!IsGoodVal("0.90", cmsEvalToneCurveFloat(reverse_sinus, 0.90f), asin(0.90)/M_PI, 0.001)) goto Error; + + if (!IsGoodVal("0.10", cmsEvalToneCurveFloat(reverse_cosinus, 0.10f), acos(0.10)/M_PI, 0.001)) goto Error; + if (!IsGoodVal("0.60", cmsEvalToneCurveFloat(reverse_cosinus, 0.60f), acos(0.60)/M_PI, 0.001)) goto Error; + if (!IsGoodVal("0.90", cmsEvalToneCurveFloat(reverse_cosinus, 0.90f), acos(0.90)/M_PI, 0.001)) goto Error; + + cmsFreeToneCurve(sinus); + cmsFreeToneCurve(cosinus); + cmsFreeToneCurve(tangent); + cmsFreeToneCurve(reverse_sinus); + cmsFreeToneCurve(reverse_cosinus); + + cmsDeleteContext(ctx); + cmsDeleteContext(cpy); + cmsDeleteContext(cpy2); + + return 1; + +Error: + + cmsFreeToneCurve(sinus); + cmsFreeToneCurve(reverse_sinus); + cmsFreeToneCurve(cosinus); + cmsFreeToneCurve(reverse_cosinus); + + if (ctx != NULL) cmsDeleteContext(ctx); + if (cpy != NULL) cmsDeleteContext(cpy); + if (cpy2 != NULL) cmsDeleteContext(cpy2); + return 0; +} + +// -------------------------------------------------------------------------------------------------- +// formatters plugin check: 5-6-5 RGB format +// -------------------------------------------------------------------------------------------------- + +// We define this special type as 0 bytes not float, and set the upper bit + +#define TYPE_RGB_565 (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(0) | (1 << 23)) + +cmsUInt8Number* my_Unroll565(CMSREGISTER struct _cmstransform_struct* nfo, + CMSREGISTER cmsUInt16Number wIn[], + CMSREGISTER cmsUInt8Number* accum, + CMSREGISTER cmsUInt32Number Stride) +{ + cmsUInt16Number pixel = *(cmsUInt16Number*) accum; // Take whole pixel + + double r = floor(((double) (pixel & 31) * 65535.0) / 31.0 + 0.5); + double g = floor((((pixel >> 5) & 63) * 65535.0) / 63.0 + 0.5); + double b = floor((((pixel >> 11) & 31) * 65535.0) / 31.0 + 0.5); + + wIn[2] = (cmsUInt16Number) r; + wIn[1] = (cmsUInt16Number) g; + wIn[0] = (cmsUInt16Number) b; + + return accum + 2; +} + +cmsUInt8Number* my_Pack565(CMSREGISTER _cmsTRANSFORM* info, + CMSREGISTER cmsUInt16Number wOut[], + CMSREGISTER cmsUInt8Number* output, + CMSREGISTER cmsUInt32Number Stride) +{ + + CMSREGISTER cmsUInt16Number pixel; + int r, g, b; + + r = (int) floor(( wOut[2] * 31) / 65535.0 + 0.5); + g = (int) floor(( wOut[1] * 63) / 65535.0 + 0.5); + b = (int) floor(( wOut[0] * 31) / 65535.0 + 0.5); + + + pixel = (r & 31) | (( g & 63) << 5) | ((b & 31) << 11); + + + *(cmsUInt16Number*) output = pixel; + return output + 2; +} + + +cmsFormatter my_FormatterFactory(cmsUInt32Number Type, + cmsFormatterDirection Dir, + cmsUInt32Number dwFlags) +{ + cmsFormatter Result = { NULL }; + + if ((Type == TYPE_RGB_565) && + !(dwFlags & CMS_PACK_FLAGS_FLOAT) && + (Dir == cmsFormatterInput)) { + Result.Fmt16 = my_Unroll565; + } + return Result; +} + + +cmsFormatter my_FormatterFactory2(cmsUInt32Number Type, + cmsFormatterDirection Dir, + cmsUInt32Number dwFlags) +{ + cmsFormatter Result = { NULL }; + + if ((Type == TYPE_RGB_565) && + !(dwFlags & CMS_PACK_FLAGS_FLOAT) && + (Dir == cmsFormatterOutput)) { + Result.Fmt16 = my_Pack565; + } + return Result; +} + +static +cmsPluginFormatters FormattersPluginSample = { {cmsPluginMagicNumber, + 2060, + cmsPluginFormattersSig, + NULL}, + my_FormatterFactory }; + + + +static +cmsPluginFormatters FormattersPluginSample2 = { {cmsPluginMagicNumber, + 2060, + cmsPluginFormattersSig, + NULL}, + my_FormatterFactory2 }; + + +cmsInt32Number CheckFormattersPlugin(void) +{ + cmsContext ctx = WatchDogContext(NULL); + cmsContext cpy; + cmsContext cpy2; + cmsHTRANSFORM xform; + cmsUInt16Number stream[]= { 0xffffU, 0x1234U, 0x0000U, 0x33ddU }; + cmsUInt16Number result[4]; + int i; + + + cmsPluginTHR(ctx, &FormattersPluginSample); + + cpy = DupContext(ctx, NULL); + + cmsPluginTHR(cpy, &FormattersPluginSample2); + + cpy2 = DupContext(cpy, NULL); + + xform = cmsCreateTransformTHR(cpy2, NULL, TYPE_RGB_565, NULL, TYPE_RGB_565, INTENT_PERCEPTUAL, cmsFLAGS_NULLTRANSFORM); + + cmsDoTransform(xform, stream, result, 4); + + cmsDeleteTransform(xform); + cmsDeleteContext(ctx); + cmsDeleteContext(cpy); + cmsDeleteContext(cpy2); + + for (i=0; i < 4; i++) + if (stream[i] != result[i]) return 0; + + return 1; +} + +// -------------------------------------------------------------------------------------------------- +// TagTypePlugin plugin check +// -------------------------------------------------------------------------------------------------- + +#define SigIntType ((cmsTagTypeSignature) 0x74747448) // 'tttH' +#define SigInt ((cmsTagSignature) 0x74747448) // 'tttH' + +#define SigInt32 ((cmsTagSignature) 0x74747449) // 'tttI' + +static +void *Type_int_Read(struct _cms_typehandler_struct* self, + cmsIOHANDLER* io, + cmsUInt32Number* nItems, + cmsUInt32Number SizeOfTag) +{ + cmsUInt32Number* Ptr = (cmsUInt32Number*) _cmsMalloc(self ->ContextID, sizeof(cmsUInt32Number)); + if (Ptr == NULL) return NULL; + if (!_cmsReadUInt32Number(io, Ptr)) return NULL; + *nItems = 1; + return Ptr; +} + +static +cmsBool Type_int_Write(struct _cms_typehandler_struct* self, + cmsIOHANDLER* io, + void* Ptr, cmsUInt32Number nItems) +{ + return _cmsWriteUInt32Number(io, *(cmsUInt32Number*) Ptr); +} + +static +void* Type_int_Dup(struct _cms_typehandler_struct* self, + const void *Ptr, cmsUInt32Number n) +{ + return _cmsDupMem(self ->ContextID, Ptr, n * sizeof(cmsUInt32Number)); +} + +void Type_int_Free(struct _cms_typehandler_struct* self, + void* Ptr) +{ + _cmsFree(self ->ContextID, Ptr); +} + + +static cmsPluginTag HiddenTagPluginSample = { + + { cmsPluginMagicNumber, 2060, cmsPluginTagSig, NULL}, + SigInt, { 1, 1, { SigIntType }, NULL } +}; + +static cmsPluginTag HiddenTagPluginSample2 = { + + { cmsPluginMagicNumber, 2060, cmsPluginTagSig, (cmsPluginBase*) &HiddenTagPluginSample}, + SigInt32, { 1, 1, { cmsSigUInt32ArrayType }, NULL } +}; + + +static cmsPluginTagType TagTypePluginSample = { + + { cmsPluginMagicNumber, 2060, cmsPluginTagTypeSig, (cmsPluginBase*) &HiddenTagPluginSample2}, + { SigIntType, Type_int_Read, Type_int_Write, Type_int_Dup, Type_int_Free, NULL } +}; + + +cmsInt32Number CheckTagTypePlugin(void) +{ + cmsContext ctx = NULL; + cmsContext cpy = NULL; + cmsContext cpy2 = NULL; + cmsHPROFILE h = NULL; + cmsUInt32Number myTag = 1234; + cmsUInt32Number myTag32 = 5678; + cmsUInt32Number rc = 0; + char* data = NULL; + cmsUInt32Number *ptr = NULL; + cmsUInt32Number clen = 0; + + + ctx = WatchDogContext(NULL); + cmsPluginTHR(ctx, &TagTypePluginSample); + + cpy = DupContext(ctx, NULL); + cpy2 = DupContext(cpy, NULL); + + cmsDeleteContext(ctx); + cmsDeleteContext(cpy); + + h = cmsCreateProfilePlaceholder(cpy2); + if (h == NULL) { + Fail("Create placeholder failed"); + goto Error; + } + + + if (!cmsWriteTag(h, SigInt, &myTag)) { + Fail("Plug-in failed"); + goto Error; + } + + if (!cmsWriteTag(h, SigInt32, &myTag32)) { + Fail("Plug-in failed"); + goto Error; + } + + + rc = cmsSaveProfileToMem(h, NULL, &clen); + if (!rc) { + Fail("Fetch mem size failed"); + goto Error; + } + + + data = (char*) malloc(clen); + if (data == NULL) { + Fail("malloc failed ?!?"); + goto Error; + } + + + rc = cmsSaveProfileToMem(h, data, &clen); + if (!rc) { + Fail("Save to mem failed"); + goto Error; + } + + cmsCloseProfile(h); + + cmsSetLogErrorHandler(NULL); + h = cmsOpenProfileFromMem(data, clen); + if (h == NULL) { + Fail("Open profile failed"); + goto Error; + } + + ptr = (cmsUInt32Number*) cmsReadTag(h, SigInt); + if (ptr != NULL) { + + Fail("read tag/context switching failed"); + goto Error; + } + + ptr = (cmsUInt32Number*)cmsReadTag(h, SigInt32); + if (ptr != NULL) { + + Fail("read tag/context switching failed"); + goto Error; + } + + + cmsCloseProfile(h); + ResetFatalError(); + + h = cmsOpenProfileFromMemTHR(cpy2, data, clen); + if (h == NULL) { + Fail("Open profile from mem failed"); + goto Error; + } + + // Get rid of data + free(data); data = NULL; + + ptr = (cmsUInt32Number*) cmsReadTag(h, SigInt); + if (ptr == NULL) { + Fail("Read tag/context switching failed (2)"); + return 0; + } + + rc = (*ptr == 1234); + + ptr = (cmsUInt32Number*)cmsReadTag(h, SigInt32); + if (ptr == NULL) { + + Fail("read tag/context switching failed (2)"); + goto Error; + } + + rc &= (*ptr == 5678); + + cmsCloseProfile(h); + + cmsDeleteContext(cpy2); + + return rc; + +Error: + + if (h != NULL) cmsCloseProfile(h); + if (ctx != NULL) cmsDeleteContext(ctx); + if (cpy != NULL) cmsDeleteContext(cpy); + if (cpy2 != NULL) cmsDeleteContext(cpy2); + if (data) free(data); + + return 0; +} + +// -------------------------------------------------------------------------------------------------- +// MPE plugin check: +// -------------------------------------------------------------------------------------------------- +#define SigNegateType ((cmsStageSignature)0x6E202020) + +static +void EvaluateNegate(const cmsFloat32Number In[], + cmsFloat32Number Out[], + const cmsStage *mpe) +{ + Out[0] = 1.0f - In[0]; + Out[1] = 1.0f - In[1]; + Out[2] = 1.0f - In[2]; +} + +static +cmsStage* StageAllocNegate(cmsContext ContextID) +{ + return _cmsStageAllocPlaceholder(ContextID, + SigNegateType, 3, 3, EvaluateNegate, + NULL, NULL, NULL); +} + +static +void *Type_negate_Read(struct _cms_typehandler_struct* self, + cmsIOHANDLER* io, + cmsUInt32Number* nItems, + cmsUInt32Number SizeOfTag) +{ + cmsUInt16Number Chans; + if (!_cmsReadUInt16Number(io, &Chans)) return NULL; + if (Chans != 3) return NULL; + + *nItems = 1; + return StageAllocNegate(self -> ContextID); +} + +static +cmsBool Type_negate_Write(struct _cms_typehandler_struct* self, + cmsIOHANDLER* io, + void* Ptr, cmsUInt32Number nItems) +{ + + if (!_cmsWriteUInt16Number(io, 3)) return FALSE; + return TRUE; +} + +static +cmsPluginMultiProcessElement MPEPluginSample = { + + {cmsPluginMagicNumber, 2060, cmsPluginMultiProcessElementSig, NULL}, + + { (cmsTagTypeSignature) SigNegateType, Type_negate_Read, Type_negate_Write, NULL, NULL, NULL } +}; + + +cmsInt32Number CheckMPEPlugin(void) +{ + cmsContext ctx = NULL; + cmsContext cpy = NULL; + cmsContext cpy2 = NULL; + cmsHPROFILE h = NULL; + cmsUInt32Number rc = 0; + char* data = NULL; + cmsUInt32Number clen = 0; + cmsFloat32Number In[3], Out[3]; + cmsPipeline* pipe; + + ctx = WatchDogContext(NULL); + cmsPluginTHR(ctx, &MPEPluginSample); + + cpy = DupContext(ctx, NULL); + cpy2 = DupContext(cpy, NULL); + + cmsDeleteContext(ctx); + cmsDeleteContext(cpy); + + h = cmsCreateProfilePlaceholder(cpy2); + if (h == NULL) { + Fail("Create placeholder failed"); + goto Error; + } + + pipe = cmsPipelineAlloc(cpy2, 3, 3); + cmsPipelineInsertStage(pipe, cmsAT_BEGIN, StageAllocNegate(cpy2)); + + + In[0] = 0.3f; In[1] = 0.2f; In[2] = 0.9f; + cmsPipelineEvalFloat(In, Out, pipe); + + rc = (IsGoodVal("0", Out[0], 1.0-In[0], 0.001) && + IsGoodVal("1", Out[1], 1.0-In[1], 0.001) && + IsGoodVal("2", Out[2], 1.0-In[2], 0.001)); + + if (!rc) { + Fail("Pipeline failed"); + goto Error; + } + + if (!cmsWriteTag(h, cmsSigDToB3Tag, pipe)) { + Fail("Plug-in failed"); + goto Error; + } + + // This cleans the stage as well + cmsPipelineFree(pipe); + + rc = cmsSaveProfileToMem(h, NULL, &clen); + if (!rc) { + Fail("Fetch mem size failed"); + goto Error; + } + + + data = (char*) malloc(clen); + if (data == NULL) { + Fail("malloc failed ?!?"); + goto Error; + } + + + rc = cmsSaveProfileToMem(h, data, &clen); + if (!rc) { + Fail("Save to mem failed"); + goto Error; + } + + cmsCloseProfile(h); + + + cmsSetLogErrorHandler(NULL); + h = cmsOpenProfileFromMem(data, clen); + if (h == NULL) { + Fail("Open profile failed"); + goto Error; + } + + pipe = (cmsPipeline*) cmsReadTag(h, cmsSigDToB3Tag); + if (pipe != NULL) { + + // Unsupported stage, should fail + Fail("read tag/context switching failed"); + goto Error; + } + + cmsCloseProfile(h); + + ResetFatalError(); + + h = cmsOpenProfileFromMemTHR(cpy2, data, clen); + if (h == NULL) { + Fail("Open profile from mem failed"); + goto Error; + } + + // Get rid of data + free(data); data = NULL; + + pipe = (cmsPipeline*) cmsReadTag(h, cmsSigDToB3Tag); + if (pipe == NULL) { + Fail("Read tag/context switching failed (2)"); + return 0; + } + + // Evaluate for negation + In[0] = 0.3f; In[1] = 0.2f; In[2] = 0.9f; + cmsPipelineEvalFloat(In, Out, pipe); + + rc = (IsGoodVal("0", Out[0], 1.0-In[0], 0.001) && + IsGoodVal("1", Out[1], 1.0-In[1], 0.001) && + IsGoodVal("2", Out[2], 1.0-In[2], 0.001)); + + cmsCloseProfile(h); + + cmsDeleteContext(cpy2); + + return rc; + +Error: + + if (h != NULL) cmsCloseProfile(h); + if (ctx != NULL) cmsDeleteContext(ctx); + if (cpy != NULL) cmsDeleteContext(cpy); + if (cpy2 != NULL) cmsDeleteContext(cpy2); + if (data) free(data); + + return 0; +} + + +// -------------------------------------------------------------------------------------------------- +// Optimization plugin check: +// -------------------------------------------------------------------------------------------------- + +static +void FastEvaluateCurves(CMSREGISTER const cmsUInt16Number In[], + CMSREGISTER cmsUInt16Number Out[], + CMSREGISTER const void* Data) +{ + Out[0] = In[0]; +} + +static +cmsBool MyOptimize(cmsPipeline** Lut, + cmsUInt32Number Intent, + cmsUInt32Number* InputFormat, + cmsUInt32Number* OutputFormat, + cmsUInt32Number* dwFlags) +{ + cmsStage* mpe; + _cmsStageToneCurvesData* Data; + + // Only curves in this LUT? All are identities? + for (mpe = cmsPipelineGetPtrToFirstStage(*Lut); + mpe != NULL; + mpe = cmsStageNext(mpe)) { + + if (cmsStageType(mpe) != cmsSigCurveSetElemType) return FALSE; + + // Check for identity + Data = (_cmsStageToneCurvesData*) cmsStageData(mpe); + if (Data ->nCurves != 1) return FALSE; + if (cmsEstimateGamma(Data->TheCurves[0], 0.1) > 1.0) return FALSE; + + } + + *dwFlags |= cmsFLAGS_NOCACHE; + _cmsPipelineSetOptimizationParameters(*Lut, FastEvaluateCurves, NULL, NULL, NULL); + + return TRUE; +} + +cmsPluginOptimization OptimizationPluginSample = { + + {cmsPluginMagicNumber, 2060, cmsPluginOptimizationSig, NULL}, + MyOptimize +}; + + +cmsInt32Number CheckOptimizationPlugin(void) +{ + cmsContext ctx = WatchDogContext(NULL); + cmsContext cpy; + cmsContext cpy2; + cmsHTRANSFORM xform; + cmsUInt8Number In[]= { 10, 20, 30, 40 }; + cmsUInt8Number Out[4]; + cmsToneCurve* Linear[1]; + cmsHPROFILE h; + int i; + + cmsPluginTHR(ctx, &OptimizationPluginSample); + + cpy = DupContext(ctx, NULL); + cpy2 = DupContext(cpy, NULL); + + Linear[0] = cmsBuildGamma(cpy2, 1.0); + h = cmsCreateLinearizationDeviceLinkTHR(cpy2, cmsSigGrayData, Linear); + cmsFreeToneCurve(Linear[0]); + + xform = cmsCreateTransformTHR(cpy2, h, TYPE_GRAY_8, h, TYPE_GRAY_8, INTENT_PERCEPTUAL, 0); + cmsCloseProfile(h); + + cmsDoTransform(xform, In, Out, 4); + + cmsDeleteTransform(xform); + cmsDeleteContext(ctx); + cmsDeleteContext(cpy); + cmsDeleteContext(cpy2); + + for (i=0; i < 4; i++) + if (In[i] != Out[i]) return 0; + + return 1; +} + + +// -------------------------------------------------------------------------------------------------- +// Check the intent plug-in +// -------------------------------------------------------------------------------------------------- + +/* + This example creates a new rendering intent, at intent number 300, that is identical to perceptual + intent for all color spaces but gray to gray transforms, in this case it bypasses the data. + Note that it has to clear all occurrences of intent 300 in the intents array to avoid + infinite recursion. +*/ + +#define INTENT_DECEPTIVE 300 + +static +cmsPipeline* MyNewIntent(cmsContext ContextID, + cmsUInt32Number nProfiles, + cmsUInt32Number TheIntents[], + cmsHPROFILE hProfiles[], + cmsBool BPC[], + cmsFloat64Number AdaptationStates[], + cmsUInt32Number dwFlags) +{ + cmsPipeline* Result; + cmsUInt32Number ICCIntents[256]; + cmsUInt32Number i; + + for (i=0; i < nProfiles; i++) + ICCIntents[i] = (TheIntents[i] == INTENT_DECEPTIVE) ? INTENT_PERCEPTUAL : + TheIntents[i]; + + if (cmsGetColorSpace(hProfiles[0]) != cmsSigGrayData || + cmsGetColorSpace(hProfiles[nProfiles-1]) != cmsSigGrayData) + return _cmsDefaultICCintents(ContextID, nProfiles, + ICCIntents, hProfiles, + BPC, AdaptationStates, + dwFlags); + + Result = cmsPipelineAlloc(ContextID, 1, 1); + if (Result == NULL) return NULL; + + cmsPipelineInsertStage(Result, cmsAT_BEGIN, + cmsStageAllocIdentity(ContextID, 1)); + + return Result; +} + +static cmsPluginRenderingIntent IntentPluginSample = { + + {cmsPluginMagicNumber, 2060, cmsPluginRenderingIntentSig, NULL}, + + INTENT_DECEPTIVE, MyNewIntent, "bypass gray to gray rendering intent" +}; + +cmsInt32Number CheckIntentPlugin(void) +{ + cmsContext ctx = WatchDogContext(NULL); + cmsContext cpy; + cmsContext cpy2; + cmsHTRANSFORM xform; + cmsHPROFILE h1, h2; + cmsToneCurve* Linear1; + cmsToneCurve* Linear2; + cmsUInt8Number In[]= { 10, 20, 30, 40 }; + cmsUInt8Number Out[4]; + int i; + + cmsPluginTHR(ctx, &IntentPluginSample); + + cpy = DupContext(ctx, NULL); + cpy2 = DupContext(cpy, NULL); + + Linear1 = cmsBuildGamma(cpy2, 3.0); + Linear2 = cmsBuildGamma(cpy2, 0.1); + h1 = cmsCreateLinearizationDeviceLinkTHR(cpy2, cmsSigGrayData, &Linear1); + h2 = cmsCreateLinearizationDeviceLinkTHR(cpy2, cmsSigGrayData, &Linear2); + + cmsFreeToneCurve(Linear1); + cmsFreeToneCurve(Linear2); + + xform = cmsCreateTransformTHR(cpy2, h1, TYPE_GRAY_8, h2, TYPE_GRAY_8, INTENT_DECEPTIVE, 0); + cmsCloseProfile(h1); cmsCloseProfile(h2); + + cmsDoTransform(xform, In, Out, 4); + + cmsDeleteTransform(xform); + cmsDeleteContext(ctx); + cmsDeleteContext(cpy); + cmsDeleteContext(cpy2); + + for (i=0; i < 4; i++) + if (Out[i] != In[i]) return 0; + + return 1; +} + + +// -------------------------------------------------------------------------------------------------- +// Check the full transform plug-in +// -------------------------------------------------------------------------------------------------- + +// This is a sample intent that only works for gray8 as output, and always returns '42' +static +void TrancendentalTransform(struct _cmstransform_struct * CMM, + const void* InputBuffer, + void* OutputBuffer, + cmsUInt32Number Size, + cmsUInt32Number Stride) +{ + cmsUInt32Number i; + + for (i=0; i < Size; i++) + { + ((cmsUInt8Number*) OutputBuffer)[i] = 0x42; + } + +} + + +cmsBool TransformFactory(_cmsTransformFn* xformPtr, + void** UserData, + _cmsFreeUserDataFn* FreePrivateDataFn, + cmsPipeline** Lut, + cmsUInt32Number* InputFormat, + cmsUInt32Number* OutputFormat, + cmsUInt32Number* dwFlags) + +{ + if (*OutputFormat == TYPE_GRAY_8) + { + // *Lut holds the pipeline to be applied + *xformPtr = TrancendentalTransform; + return TRUE; + } + + return FALSE; +} + + +// The Plug-in entry point +static cmsPluginTransform FullTransformPluginSample = { + + { cmsPluginMagicNumber, 2060, cmsPluginTransformSig, NULL}, + + { TransformFactory } +}; + +cmsInt32Number CheckTransformPlugin(void) +{ + cmsContext ctx = WatchDogContext(NULL); + cmsContext cpy; + cmsContext cpy2; + cmsHTRANSFORM xform; + cmsUInt8Number In[]= { 10, 20, 30, 40 }; + cmsUInt8Number Out[4]; + cmsToneCurve* Linear; + cmsHPROFILE h; + int i; + + + cmsPluginTHR(ctx, &FullTransformPluginSample); + + cpy = DupContext(ctx, NULL); + cpy2 = DupContext(cpy, NULL); + + Linear = cmsBuildGamma(cpy2, 1.0); + h = cmsCreateLinearizationDeviceLinkTHR(cpy2, cmsSigGrayData, &Linear); + cmsFreeToneCurve(Linear); + + xform = cmsCreateTransformTHR(cpy2, h, TYPE_GRAY_8, h, TYPE_GRAY_8, INTENT_PERCEPTUAL, 0); + cmsCloseProfile(h); + + cmsDoTransform(xform, In, Out, 4); + + + cmsDeleteTransform(xform); + cmsDeleteContext(ctx); + cmsDeleteContext(cpy); + cmsDeleteContext(cpy2); + + for (i=0; i < 4; i++) + if (Out[i] != 0x42) return 0; + + return 1; +} + + +// -------------------------------------------------------------------------------------------------- +// Check the mutex plug-in +// -------------------------------------------------------------------------------------------------- + +typedef struct { + int nlocks; +} MyMtx; + + +static +void* MyMtxCreate(cmsContext id) +{ + MyMtx* mtx = (MyMtx*) _cmsMalloc(id, sizeof(MyMtx)); + mtx ->nlocks = 0; + return mtx; +} + +static +void MyMtxDestroy(cmsContext id, void* mtx) +{ + MyMtx* mtx_ = (MyMtx*) mtx; + + if (mtx_->nlocks != 0) + Die("Locks != 0 when setting free a mutex"); + + _cmsFree(id, mtx); + +} + +static +cmsBool MyMtxLock(cmsContext id, void* mtx) +{ + MyMtx* mtx_ = (MyMtx*) mtx; + mtx_->nlocks++; + + return TRUE; +} + +static +void MyMtxUnlock(cmsContext id, void* mtx) +{ + MyMtx* mtx_ = (MyMtx*) mtx; + mtx_->nlocks--; + +} + + +static cmsPluginMutex MutexPluginSample = { + + { cmsPluginMagicNumber, 2060, cmsPluginMutexSig, NULL}, + + MyMtxCreate, MyMtxDestroy, MyMtxLock, MyMtxUnlock +}; + + +cmsInt32Number CheckMutexPlugin(void) +{ + cmsContext ctx = WatchDogContext(NULL); + cmsContext cpy; + cmsContext cpy2; + cmsHTRANSFORM xform; + cmsUInt8Number In[]= { 10, 20, 30, 40 }; + cmsUInt8Number Out[4]; + cmsToneCurve* Linear; + cmsHPROFILE h; + int i; + + + cmsPluginTHR(ctx, &MutexPluginSample); + + cpy = DupContext(ctx, NULL); + cpy2 = DupContext(cpy, NULL); + + Linear = cmsBuildGamma(cpy2, 1.0); + h = cmsCreateLinearizationDeviceLinkTHR(cpy2, cmsSigGrayData, &Linear); + cmsFreeToneCurve(Linear); + + xform = cmsCreateTransformTHR(cpy2, h, TYPE_GRAY_8, h, TYPE_GRAY_8, INTENT_PERCEPTUAL, 0); + cmsCloseProfile(h); + + cmsDoTransform(xform, In, Out, 4); + + + cmsDeleteTransform(xform); + cmsDeleteContext(ctx); + cmsDeleteContext(cpy); + cmsDeleteContext(cpy2); + + for (i=0; i < 4; i++) + if (Out[i] != In[i]) return 0; + + return 1; +} + + +cmsInt32Number CheckMethodPackDoublesFromFloat(void) +{ + + cmsContext ctx = WatchDogContext(NULL); + + cmsHTRANSFORM xform; + cmsHTRANSFORM l_pFakeProfileLAB; + + cmsFloat64Number l_D_OutputColorArrayBlack[8]; + cmsFloat64Number l_D_OutputColorArrayBlue[8]; + + cmsCIELab LabInBlack; + cmsCIELab LabInBlue; + + cmsUInt16Number Lab_UI16_Black[3]; + cmsUInt16Number Lab_UI16_Blue[3]; + + cmsHPROFILE OutputCMYKProfile; + cmsUInt32Number l_UI32_OutputFormat; + + + cmsPluginTHR(ctx, &FullTransformPluginSample); + + + l_pFakeProfileLAB = cmsCreateLab2ProfileTHR(ctx, NULL); + + if (l_pFakeProfileLAB == NULL) + return 0; + + OutputCMYKProfile = cmsOpenProfileFromFileTHR(ctx, "test2.icc", "r"); + + if (OutputCMYKProfile == NULL) + return 0; + + l_UI32_OutputFormat = 0; + l_UI32_OutputFormat |= COLORSPACE_SH(PT_CMYK); + l_UI32_OutputFormat |= PLANAR_SH(1); + l_UI32_OutputFormat |= CHANNELS_SH(4); + l_UI32_OutputFormat |= BYTES_SH(0); + l_UI32_OutputFormat |= FLOAT_SH(1); + + + xform = cmsCreateTransformTHR(ctx, l_pFakeProfileLAB, TYPE_Lab_DBL, OutputCMYKProfile, l_UI32_OutputFormat, INTENT_PERCEPTUAL, 0); + cmsCloseProfile(OutputCMYKProfile); + cmsCloseProfile(l_pFakeProfileLAB); + + Lab_UI16_Black[0] = 0; + Lab_UI16_Black[1] = 32768; + Lab_UI16_Black[2] = 32768; + + Lab_UI16_Blue[0] = 0; + Lab_UI16_Blue[1] = 8192; + Lab_UI16_Blue[2] = 8192; + + cmsLabEncoded2Float(&LabInBlack, Lab_UI16_Black); + cmsLabEncoded2Float(&LabInBlue, Lab_UI16_Blue); + + memset(l_D_OutputColorArrayBlack, 0, sizeof(l_D_OutputColorArrayBlack)); + memset(l_D_OutputColorArrayBlue, 0, sizeof(l_D_OutputColorArrayBlue)); + + cmsDoTransform(xform, &LabInBlack, l_D_OutputColorArrayBlack, 1); + cmsDoTransform(xform, &LabInBlue, l_D_OutputColorArrayBlue, 1); + + cmsDeleteTransform(xform); + cmsDeleteContext(ctx); + + if (l_D_OutputColorArrayBlack[0] < 85 || + l_D_OutputColorArrayBlue[0] < 90) + Fail("Ink amount is not right"); + + return 1; +} + diff --git a/local/recipes/libs/lcms2/source/testbed/testthread.cpp b/local/recipes/libs/lcms2/source/testbed/testthread.cpp new file mode 100644 index 0000000000..b932761202 --- /dev/null +++ b/local/recipes/libs/lcms2/source/testbed/testthread.cpp @@ -0,0 +1,120 @@ + +#include +#include "lcms2_plugin.h" + +static cmsContext ctx; +static cmsHPROFILE prof_cmyk, prof_rgb; +static volatile int rc = 0; + + +static +void* MyMtxCreate(cmsContext id) +{ + return (void*) CreateMutex( NULL, FALSE, NULL); +} + +static +void MyMtxDestroy(cmsContext id, void* mtx) +{ + CloseHandle((HANDLE) mtx); +} + +static +cmsBool MyMtxLock(cmsContext id, void* mtx) +{ + WaitForSingleObject((HANDLE) mtx, INFINITE); + return TRUE; +} + +static +void MyMtxUnlock(cmsContext id, void* mtx) +{ + ReleaseMutex((HANDLE) mtx); +} + + +static cmsPluginMutex MutexPluginSample = { + + { cmsPluginMagicNumber, 2060, cmsPluginMutexSig, NULL}, + + MyMtxCreate, MyMtxDestroy, MyMtxLock, MyMtxUnlock +}; + + +static DWORD WINAPI one_thread(LPVOID lpParameter) +{ + int i, j; + cmsUInt8Number rgb[3*1000]; + cmsUInt8Number cmyk[4*1000]; + + Sleep(rand() % 500 ); + cmsHTRANSFORM xform = cmsCreateTransformTHR(ctx, prof_rgb, TYPE_RGB_8, prof_cmyk, TYPE_CMYK_8, 0, 0); + + for (i=0; i < 100000; i++) { + + for (j=0; j < 1000; j++) + { + rgb[j * 3 ] = 189; + rgb[j * 3 + 1] = 100; + rgb[j * 3 + 2] = 75; + } + cmsDoTransform(xform, rgb, cmyk, 1000); + for (j=0; j < 1000; j++) + { + if (cmyk[j * 4 ] != 37 || + cmyk[j * 4 + 1 ] != 188 || + cmyk[j * 4 + 2 ] != 195 || + cmyk[j * 4 + 3 ] != 7) + { + OutputDebugString(L"ERROR\n"); + rc = 1; + } + + } + + } + + cmsDeleteTransform(xform); + + return 0; +} + +int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) +{ + int i; + cmsContext ctx; + + OutputDebugString(L"Test in progress...\n"); + + ctx = cmsCreateContext(NULL, 0); + + prof_cmyk = cmsOpenProfileFromFileTHR(ctx, "USWebCoatedSWOP.icc", "r"); + prof_rgb = cmsOpenProfileFromFileTHR(ctx, "AdobeRGB1998.icc","r"); + + +#define NWORKERS 10 + + HANDLE workers[NWORKERS]; + + + for (int i=0; i= 1400) +# ifndef _CRT_SECURE_NO_DEPRECATE +# define _CRT_SECURE_NO_DEPRECATE +# endif +# ifndef _CRT_SECURE_NO_WARNINGS +# define _CRT_SECURE_NO_WARNINGS +# endif +# endif +#endif + +#include "lcms2.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +// Avoid warnings + +#define UTILS_UNUSED_PARAMETER(x) ((void)x) + +// Init the utility functions + +void InitUtils(const char* PName); + +// Fatal Error (print the message and exit(1))--------------------------------------------- + +extern int Verbose; + +void FatalError(const char *frm, ...); + +// xgetopt() interface ------------------------------------------------------------- + +extern int xoptind; +extern char *xoptarg; + +int xgetopt(int argc, char *argv[], char *optionS); + +// The stock profile utility ------------------------------------------------------- + +cmsHPROFILE OpenStockProfile(cmsContext ContextID, const char* File); + +// The print info utility ---------------------------------------------------------- + +void PrintProfileInformation(cmsHPROFILE h); + +// --------------------------------------------------------------------------------- + +void PrintRenderingIntents(void); +void PrintBuiltins(void); + +// --------------------------------------------------------------------------------- + +cmsBool SaveMemoryBlock(const cmsUInt8Number* Buffer, cmsUInt32Number dwLen, const char* Filename); + +// --------------------------------------------------------------------------------- + +// Return a pixel type on depending on the number of channels +int PixelTypeFromChanCount(int ColorChannels); + +// ------------------------------------------------------------------------------ + +// Return number of channels of pixel type +int ChanCountFromPixelType(int ColorChannels); + +#define _lcms_utils_h +#endif diff --git a/local/recipes/libs/lcms2/source/utils/common/vprf.c b/local/recipes/libs/lcms2/source/utils/common/vprf.c new file mode 100644 index 0000000000..2080897b97 --- /dev/null +++ b/local/recipes/libs/lcms2/source/utils/common/vprf.c @@ -0,0 +1,338 @@ +//--------------------------------------------------------------------------------- +// +// Little Color Management System +// Copyright (c) 1998-2026 Marti Maria Saguer +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//--------------------------------------------------------------------------------- +// + +#include "utils.h" + + +int Verbose = 0; + +static char ProgramName[256] = ""; + +void FatalError(const char *frm, ...) +{ + va_list args; + + va_start(args, frm); + fprintf(stderr, "[%s fatal error]: ", ProgramName); + vfprintf(stderr, frm, args); + fprintf(stderr, "\n"); + va_end(args); + + exit(1); +} + +// Show errors to the end user (unless quiet option) +static +void MyErrorLogHandler(cmsContext ContextID, cmsUInt32Number ErrorCode, const char *Text) +{ + if (Verbose >= 0) + fprintf(stderr, "[%s]: %s\n", ProgramName, Text); + + UTILS_UNUSED_PARAMETER(ErrorCode); + UTILS_UNUSED_PARAMETER(ContextID); +} + + +void InitUtils(const char* PName) +{ + strncpy(ProgramName, PName, sizeof(ProgramName)); + ProgramName[sizeof(ProgramName)-1] = 0; + + cmsSetLogErrorHandler(MyErrorLogHandler); +} + + +// Virtual profiles are handled here. +cmsHPROFILE OpenStockProfile(cmsContext ContextID, const char* File) +{ + if (!File) + return cmsCreate_sRGBProfileTHR(ContextID); + + if (cmsstrcasecmp(File, "*Lab2") == 0) + return cmsCreateLab2ProfileTHR(ContextID, NULL); + + if (cmsstrcasecmp(File, "*Lab4") == 0) + return cmsCreateLab4ProfileTHR(ContextID, NULL); + + if (cmsstrcasecmp(File, "*Lab") == 0) + return cmsCreateLab4ProfileTHR(ContextID, NULL); + + if (cmsstrcasecmp(File, "*LabD65") == 0) { + + cmsCIExyY D65xyY; + + cmsWhitePointFromTemp( &D65xyY, 6504); + return cmsCreateLab4ProfileTHR(ContextID, &D65xyY); + } + + if (cmsstrcasecmp(File, "*XYZ") == 0) + return cmsCreateXYZProfileTHR(ContextID); + + if (cmsstrcasecmp(File, "*Gray22") == 0) { + + cmsToneCurve* Curve = cmsBuildGamma(ContextID, 2.2); + cmsHPROFILE hProfile = cmsCreateGrayProfileTHR(ContextID, cmsD50_xyY(), Curve); + cmsFreeToneCurve(Curve); + return hProfile; + } + + if (cmsstrcasecmp(File, "*Gray30") == 0) { + + cmsToneCurve* Curve = cmsBuildGamma(ContextID, 3.0); + cmsHPROFILE hProfile = cmsCreateGrayProfileTHR(ContextID, cmsD50_xyY(), Curve); + cmsFreeToneCurve(Curve); + return hProfile; + } + + if (cmsstrcasecmp(File, "*srgb") == 0) + return cmsCreate_sRGBProfileTHR(ContextID); + + if (cmsstrcasecmp(File, "*null") == 0) + return cmsCreateNULLProfileTHR(ContextID); + + if (cmsstrcasecmp(File, "*oklab") == 0) + return cmsCreate_OkLabProfile(ContextID); + + if (cmsstrcasecmp(File, "*Lin2222") == 0) { + + cmsToneCurve* Gamma = cmsBuildGamma(0, 2.2); + cmsToneCurve* Gamma4[4]; + cmsHPROFILE hProfile; + + Gamma4[0] = Gamma4[1] = Gamma4[2] = Gamma4[3] = Gamma; + hProfile = cmsCreateLinearizationDeviceLink(cmsSigCmykData, Gamma4); + cmsFreeToneCurve(Gamma); + return hProfile; + } + + + return cmsOpenProfileFromFileTHR(ContextID, File, "r"); +} + +// Help on available built-ins +void PrintBuiltins(void) +{ + fprintf(stderr, "\nBuilt-in profiles:\n\n"); + fprintf(stderr, "\t*Lab2 -- D50-based v2 CIEL*a*b\n" + "\t*Lab4 -- D50-based v4 CIEL*a*b\n" + "\t*Lab -- D50-based v4 CIEL*a*b\n" + "\t*XYZ -- CIE XYZ (PCS)\n" + "\t*sRGB -- sRGB color space\n" + "\t*Gray22 - Monochrome of Gamma 2.2\n" + "\t*Gray30 - Monochrome of Gamma 3.0\n" + "\t*null - Monochrome black for all input\n" + "\t*Lin2222- CMYK linearization of gamma 2.2 on each channel\n\n"); +} + + +// Auxiliary for printing information on profile +static +void PrintInfo(cmsHPROFILE h, cmsInfoType Info) +{ + char* text; + int len; + + len = cmsGetProfileInfoASCII(h, Info, "en", "US", NULL, 0); + if (len == 0) return; + + text = (char*) malloc(len * sizeof(char)); + if (text == NULL) return; + + cmsGetProfileInfoASCII(h, Info, "en", "US", text, len); + + if (strlen(text) > 0) + printf("%s\n", text); + + free(text); +} + + + +// Displays the colorant table +static +void PrintColorantTable(cmsHPROFILE hInput, cmsTagSignature Sig, const char* Title) +{ + cmsNAMEDCOLORLIST* list; + int i, n; + + if (cmsIsTag(hInput, Sig)) { + + printf("%s:\n", Title); + + list = (cmsNAMEDCOLORLIST*) cmsReadTag(hInput, Sig); + if (list == NULL) { + printf("(Unavailable)\n"); + return; + } + + n = cmsNamedColorCount(list); + for (i=0; i < n; i++) { + + char Name[cmsMAX_PATH]; + + cmsNamedColorInfo(list, i, Name, NULL, NULL, NULL, NULL); + printf("\t%s\n", Name); + } + + printf("\n"); + } + +} + + +void PrintProfileInformation(cmsHPROFILE hInput) +{ + if (hInput == NULL) { + fprintf(stderr, "*Wrong or corrupted profile*\n"); + return; + } + + PrintInfo(hInput, cmsInfoDescription); + PrintInfo(hInput, cmsInfoManufacturer); + PrintInfo(hInput, cmsInfoModel); + PrintInfo(hInput, cmsInfoCopyright); + + if (Verbose > 2) { + + PrintColorantTable(hInput, cmsSigColorantTableTag, "Input colorant table"); + PrintColorantTable(hInput, cmsSigColorantTableOutTag, "Input colorant out table"); + } + + printf("\n"); +} + +// ----------------------------------------------------------------------------- + + +void PrintRenderingIntents(void) +{ + cmsUInt32Number Codes[200]; + char* Descriptions[200]; + cmsUInt32Number n, i; + + fprintf(stderr, "-t rendering intent:\n\n"); + + n = cmsGetSupportedIntents(200, Codes, Descriptions); + + for (i=0; i < n; i++) { + fprintf(stderr, "\t%u - %s\n", Codes[i], Descriptions[i]); + } + fprintf(stderr, "\n"); +} + + + +// ------------------------------------------------------------------------------ + +cmsBool SaveMemoryBlock(const cmsUInt8Number* Buffer, cmsUInt32Number dwLen, const char* Filename) +{ + FILE* out = fopen(Filename, "wb"); + if (out == NULL) { + FatalError("Cannot create '%s'", Filename); + return FALSE; + } + + if (fwrite(Buffer, 1, dwLen, out) != dwLen) { + FatalError("Cannot write %ld bytes to %s", (long) dwLen, Filename); + return FALSE; + } + + if (fclose(out) != 0) { + FatalError("Error flushing file '%s'", Filename); + return FALSE; + } + + return TRUE; +} + +// ------------------------------------------------------------------------------ + +// Return a pixel type on depending on the number of channels +int PixelTypeFromChanCount(int ColorChannels) +{ + switch (ColorChannels) { + + case 1: return PT_GRAY; + case 2: return PT_MCH2; + case 3: return PT_MCH3; + case 4: return PT_CMYK; + case 5: return PT_MCH5; + case 6: return PT_MCH6; + case 7: return PT_MCH7; + case 8: return PT_MCH8; + case 9: return PT_MCH9; + case 10: return PT_MCH10; + case 11: return PT_MCH11; + case 12: return PT_MCH12; + case 13: return PT_MCH13; + case 14: return PT_MCH14; + case 15: return PT_MCH15; + + default: + + FatalError("What a weird separation of %d channels?!?!", ColorChannels); + return -1; + } +} + + +// ------------------------------------------------------------------------------ + +// Return number of channels of pixel type +int ChanCountFromPixelType(int ColorChannels) +{ + switch (ColorChannels) { + + case PT_GRAY: return 1; + + case PT_RGB: + case PT_CMY: + case PT_Lab: + case PT_YUV: + case PT_YCbCr: return 3; + + case PT_CMYK: return 4 ; + case PT_MCH2: return 2 ; + case PT_MCH3: return 3 ; + case PT_MCH4: return 4 ; + case PT_MCH5: return 5 ; + case PT_MCH6: return 6 ; + case PT_MCH7: return 7 ; + case PT_MCH8: return 8 ; + case PT_MCH9: return 9 ; + case PT_MCH10: return 10; + case PT_MCH11: return 11; + case PT_MCH12: return 12; + case PT_MCH13: return 12; + case PT_MCH14: return 14; + case PT_MCH15: return 15; + + default: + + FatalError("Unsupported color space of %d channels", ColorChannels); + return -1; + } +} diff --git a/local/recipes/libs/lcms2/source/utils/common/xgetopt.c b/local/recipes/libs/lcms2/source/utils/common/xgetopt.c new file mode 100644 index 0000000000..8be541afb4 --- /dev/null +++ b/local/recipes/libs/lcms2/source/utils/common/xgetopt.c @@ -0,0 +1,100 @@ + +//--------------------------------------------------------------------------------- +// +// Little Color Management System +// Copyright (c) 1998-2026 Marti Maria Saguer +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//--------------------------------------------------------------------------------- +// +// xgetopt.c -- loosely based on System V getopt() +// +// option ::= SW [optLetter]* [argLetter space* argument] +// + +#include +#include + +int xoptind = 1; +char *xoptarg; + +static char *nextArg = NULL; + +#define SW '-' + + +int xgetopt(int argc, char* argv[], char* optionS) +{ + unsigned char ch; + char* optP; + + if (argc > xoptind) + { + + if (nextArg == NULL) + { + if ((nextArg = argv[xoptind]) == NULL || *(nextArg++) != SW) goto end_eof; + } + + if ((ch = *(nextArg++)) == 0) + { + xoptind++; + goto end_eof; + } + + if (ch == ':' || (optP = strchr(optionS, ch)) == NULL) + goto end_error; + + if (*(++optP) == ':') + { + xoptind++; + + if (*nextArg == 0) + { + if (argc <= xoptind) goto end_error; + nextArg = argv[xoptind++]; + } + + xoptarg = nextArg; + nextArg = NULL; + + } + else + { + if (*nextArg == 0) + { + xoptind++; + nextArg = NULL; + } + + xoptarg = NULL; + } + + return ch; + } + +end_eof: + xoptarg = nextArg = NULL; + return EOF; + +end_error: + xoptarg = NULL; + return '?'; +} diff --git a/local/recipes/libs/lcms2/source/utils/delphi/delphidemo.dpr b/local/recipes/libs/lcms2/source/utils/delphi/delphidemo.dpr new file mode 100644 index 0000000000..9180c04fea --- /dev/null +++ b/local/recipes/libs/lcms2/source/utils/delphi/delphidemo.dpr @@ -0,0 +1,13 @@ +program delphidemo; + +uses + Forms, + demo1 in 'demo1.pas' {Form1}; + +{$R *.RES} + +begin + Application.Initialize; + Application.CreateForm(TForm1, Form1); + Application.Run; +end. diff --git a/local/recipes/libs/lcms2/source/utils/delphi/delphidemo.dproj b/local/recipes/libs/lcms2/source/utils/delphi/delphidemo.dproj new file mode 100644 index 0000000000..25b97d8282 --- /dev/null +++ b/local/recipes/libs/lcms2/source/utils/delphi/delphidemo.dproj @@ -0,0 +1,114 @@ + + + {E3F889E8-CB8A-49AE-8173-4DDA022466BE} + delphidemo.dpr + Debug + DCC32 + 12.0 + + + true + + + true + Base + true + + + true + Base + true + + + vcl;rtl;vclx;vclimg;vclactnband;dbrtl;vcldb;vcldbx;bdertl;vcltouch;xmlrtl;dsnap;dsnapcon;TeeUI;TeeDB;Tee;vclib;ibxpress;adortl;IndyCore;IndySystem;IndyProtocols;inet;intrawebdb_100_140;Intraweb_100_140;VclSmp;vclie;websnap;webdsnap;inetdb;inetdbbde;inetdbxpress;soaprtl;vclribbon;dbexpress;DbxCommonDriver;DataSnapIndy10ServerTransport;DataSnapProviderClient;DbxClientDriver;DataSnapServer;DBXInterBaseDriver;DBXMySQLDriver;dbxcds;DBXFirebirdDriver;DBXSybaseASEDriver;DBXSybaseASADriver;DBXOracleDriver;DBXMSSQLDriver;DBXInformixDriver;DBXDb2Driver;Rave77VCL + 00400000 + 1 + delphidemo.exe + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;WinTypes=Windows;WinProcs=Windows;$(DCC_UnitAlias) + x86 + true + false + false + false + false + + + false + RELEASE;$(DCC_Define) + 0 + false + + + DEBUG;$(DCC_Define) + + + + MainSource + + +
        Form1
        +
        + + Base + + + Cfg_2 + Base + + + Cfg_1 + Base + +
        + + + Delphi.Personality.12 + VCLApplication + + + + delphidemo.dpr + + + False + d:\lcms-1.13\delphi + True + False + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 3082 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components + + + False + + 12 + +
        diff --git a/local/recipes/libs/lcms2/source/utils/delphi/delphidemo.res b/local/recipes/libs/lcms2/source/utils/delphi/delphidemo.res new file mode 100755 index 0000000000000000000000000000000000000000..ca4824f8cbfff65bbd83189c6c7c788f672878ee GIT binary patch literal 876 zcmah|!D`z;6dY9sgdj-T zRtj03H%^aL5)>CVzoK4miXvSVl^*o#q)l&+)n?F@YIl|1upd`Ml&o)$$4c*+%elE~ zx4T_w^O5N4X1CpHeNUYiZ1Prb4kRNnOztww#)|Jz3N8ZuV>rz-O z!*!|G95%FBj51Li{iU!*q> zcJz_nGvf;*zcSy{jQhwp<~cCtC1jj3&OZV8LK^cCKkyab@ss?9CF2R_??PUKhuLgo JUxmCP53f)$4b=bu literal 0 HcmV?d00001 diff --git a/local/recipes/libs/lcms2/source/utils/delphi/demo1.dfm b/local/recipes/libs/lcms2/source/utils/delphi/demo1.dfm new file mode 100755 index 0000000000000000000000000000000000000000..c7722534bbca6bec413c034f42c1ce27685a1004 GIT binary patch literal 4400 zcmd5=J#X7a7^aREsqff995^Y^a;YO3fe<@EhqQ}6?8Jo?3lh5`;_jx}~e-<=* zXaAtHsohz&Ry57-?%Xl#9Ui!wS$SRBBS%92Rnu+m>tAYS3;Tj{&sf`|LNH=EZfI>; zZNmH!wFboHr52;a6AuX;j)Z;#71jKZ4#Y@*iLx!ucwpuo))d|jcF1ard!Yz0^+Z_j zP%r-BZ<*2#_e8xl!a+!cd8NI*)A(r5{J9j*O(vo!U#L~k z?|C_Ugk55kJ3Xt1z0m5BfF7ye_rw_^MXj>W2CaZ#LH2_I3G(GGoe&mwNwDiVBlM&Y zEgUbotQq#Mi-*LJ*G)+flKdbotIT|yF=8`vnNkM_L+XX~h)A?lOs2pmS}G^AgNQA( zR7vJdE(CYcQntb9&@&CpqMw^R5fI^w@}=#G&!|I%Toh^NF>NWQ9c3b?rJz1pG^iYA z%D0!p(!ESMfvISDk*OpPVtTq6P0QOoutf;qJsBuc^~dK7K!rt-YBtFUVPtTgM*VrF zn81s8L-Sy709eEBVvjIGUT1x;=Q6SLU!nx(%3_=kJS#a|n+p}i>L`Lkq*;5o4`#`0%zjm}ufK>zjUL2iq2X{Z;u zXU2{=4Bl0Ce4W^F_W&q{ zomf@e4=snYy2U+qR?{@oZjK>idZxO?gnf%-+4?MT{mo?8o3AI~6!R;n((Cp5GzjzN zz6Z(DIW|i%LOF}FUyHka-sF>VGLRBiv^`haO$^YhNe)MA3$h>%wTp(lI;lX;n4?@p z8!E_}6H8S8BlYt;i^Y41O3Hg253F^cI$|7&a3+;__f87R1!%_pMLI7<#X>+g8ZpttC^-#l+LXoYg4%C7E9kNG*D^y zK08awa5zP6%%_dbIBk^dZor2DSl+}zX=Z#*6RWW%zE8SAbmL9iG{tVt)|E85?aGR+ z;_h=vebP$kTPgFeSy!_1L}gZ-upMx}%}>2O8j7@D{%y6HV$bEEQjV}UBqsE`sx&I( z>gl|w3vfzvh%Z3M#_9oK5Ctc2ER7C^)FmK&$0+nLlmr3!%H_In z+KrA2XeOwOQ#UP7cU3L|Hm}Ux*+#wZ z`ck7PCtC^7a#1d(Rw+iSsNp7@WRCEdiS3Cnbn3Xtav#Y57?PN_svC9cIJd3n=GI^b lxV$g_KiN;h~8}!cA+r`z-<~BnYuz!l}K`6*I)OVUL literal 0 HcmV?d00001 diff --git a/local/recipes/libs/lcms2/source/utils/delphi/demo1.pas b/local/recipes/libs/lcms2/source/utils/delphi/demo1.pas new file mode 100644 index 0000000000..8b69c98e04 --- /dev/null +++ b/local/recipes/libs/lcms2/source/utils/delphi/demo1.pas @@ -0,0 +1,322 @@ +unit demo1; + +interface + +uses + Windows, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + ExtCtrls, StdCtrls, ExtDlgs, lcms2dll, ComCtrls; + +type + TForm1 = class(TForm) + + Image1: TImage; + Image2: TImage; + Panel1: TPanel; + Splitter1: TSplitter; + Button2: TButton; + ComboBoxInput: TComboBox; + ComboBoxOutput: TComboBox; + Label1: TLabel; + Label2: TLabel; + WBCompensation: TCheckBox; + NoTransform: TCheckBox; + RadioGroup1: TRadioGroup; + OpenPictureDialog1: TOpenPictureDialog; + Button1: TButton; + ProgressBar1: TProgressBar; + ComboBoxIntent: TComboBox; + Label3: TLabel; + Button3: TButton; + Button4: TButton; + OpenDialog1: TOpenDialog; + Label4: TLabel; + ScrollBar1: TScrollBar; + + procedure Button2Click(Sender: TObject); + procedure Button1Click(Sender: TObject); + procedure Button3Click(Sender: TObject); + procedure Button4Click(Sender: TObject); + procedure ComboBoxIntentChange(Sender: TObject); + procedure ScrollBar1Change(Sender: TObject); + private + { Private declarations } + function ComputeFlags: DWORD; + + public + constructor Create(Owner: TComponent); Override; + { Public declarations } + end; + +var + Form1: TForm1; + +implementation + +{$R *.DFM} + +CONST + IS_INPUT = $1; + IS_DISPLAY = $2; + IS_COLORSPACE = $4; + IS_OUTPUT = $8; + IS_ABSTRACT = $10; + +VAR + IntentCodes: array [0 .. 20] of cmsUInt32Number; + +FUNCTION InSignatures(Signature: cmsProfileClassSignature; dwFlags: DWORD): Boolean; +BEGIN + + if (((dwFlags AND IS_DISPLAY) <> 0) AND (Signature = cmsSigDisplayClass)) then + InSignatures := TRUE + else if (((dwFlags AND IS_OUTPUT) <> 0) AND (Signature = cmsSigOutputClass)) + then + InSignatures := TRUE + else if (((dwFlags AND IS_INPUT) <> 0) AND (Signature = cmsSigInputClass)) + then + InSignatures := TRUE + else if (((dwFlags AND IS_COLORSPACE) <> 0) AND + (Signature = cmsSigColorSpaceClass)) then + InSignatures := TRUE + else if (((dwFlags AND IS_ABSTRACT) <> 0) AND + (Signature = cmsSigAbstractClass)) then + InSignatures := TRUE + else + InSignatures := FALSE +END; + +PROCEDURE FillCombo(var Combo: TComboBox; Signatures: DWORD); +var + Files, Descriptions: TStringList; + Found: Integer; + SearchRec: TSearchRec; + Path, Profile: String; + Dir: ARRAY [0 .. 1024] OF Char; + hProfile: cmsHPROFILE; + Descrip: array [0 .. 256] of Char; +begin + Files := TStringList.Create; + Descriptions := TStringList.Create; + GetSystemDirectory(Dir, 1023); + Path := String(Dir) + '\SPOOL\DRIVERS\COLOR\'; + Found := FindFirst(Path + '*.ic?', faAnyFile, SearchRec); + while Found = 0 do + begin + Profile := Path + SearchRec.Name; + hProfile := cmsOpenProfileFromFile(PAnsiChar(AnsiString(Profile)), 'r'); + if (hProfile <> NIL) THEN + begin + + if ((cmsGetColorSpace(hProfile) = cmsSigRgbData) AND InSignatures + (cmsGetDeviceClass(hProfile), Signatures)) then + begin + cmsGetProfileInfo(hProfile, cmsInfoDescription, 'EN', 'us', Descrip, + 256); + Descriptions.Add(Descrip); + Files.Add(Profile); + end; + cmsCloseProfile(hProfile); + end; + + Found := FindNext(SearchRec); + + end; + FindClose(SearchRec); + Combo.Items := Descriptions; + Combo.Tag := Integer(Files); +end; + +// A rather simple Logger... note the "cdecl" convention +PROCEDURE ErrorLogger(ContextID: cmsContext; ErrorCode: cmsUInt32Number; + Text: PAnsiChar); Cdecl; +begin + MessageBox(0, PWideChar(WideString(Text)), 'Something is going wrong...', + MB_OK OR MB_ICONWARNING or MB_TASKMODAL); +end; + +constructor TForm1.Create(Owner: TComponent); +var + IntentNames: array [0 .. 20] of PAnsiChar; + i, n: Integer; +begin + inherited Create(Owner); + + // Set the logger + cmsSetLogErrorHandler(ErrorLogger); + + ScrollBar1.Min := 0; + ScrollBar1.Max := 100; + + FillCombo(ComboBoxInput, IS_INPUT OR IS_COLORSPACE OR IS_DISPLAY); + FillCombo(ComboBoxOutput, $FFFF ); + + + // Get the supported intents + n := cmsGetSupportedIntents(20, @IntentCodes, @IntentNames); + + + ComboBoxIntent.Items.BeginUpdate; + ComboBoxIntent.Items.Clear; + for i:= 0 TO n - 1 DO + ComboBoxIntent.Items.Add(String(IntentNames[i])); + + ComboBoxIntent.ItemIndex := 0; + ComboBoxIntent.Items.EndUpdate; +end; + + + +procedure TForm1.ScrollBar1Change(Sender: TObject); +var d: Integer; + s: String; +begin + d := ScrollBar1.Position; + Str(d, s); + Label4.Caption := 'Adaptation state '+s + '% (Abs. col only)'; +end; + +procedure TForm1.Button2Click(Sender: TObject); +begin + if OpenPictureDialog1.Execute then + begin + Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName); + Image1.Picture.Bitmap.PixelFormat := pf24bit; + + Image2.Picture.LoadFromFile(OpenPictureDialog1.FileName); + Image2.Picture.Bitmap.PixelFormat := pf24bit; + + end +end; + +function SelectedFile(var Combo: TComboBox): string; +var + List: TStringList; + n: Integer; +begin + + List := TStringList(Combo.Tag); + n := Combo.ItemIndex; + if (n >= 0) then + SelectedFile := List.Strings[n] + else + SelectedFile := Combo.Text; +end; + +procedure TForm1.ComboBoxIntentChange(Sender: TObject); +begin + ScrollBar1.Enabled := (ComboBoxIntent.itemIndex = 3); +end; + +function TForm1.ComputeFlags: DWORD; +var + dwFlags: DWORD; +begin + dwFlags := 0; + if (WBCompensation.Checked) then + begin + dwFlags := dwFlags OR cmsFLAGS_BLACKPOINTCOMPENSATION + end; + + if (NoTransform.Checked) then + begin + dwFlags := dwFlags OR cmsFLAGS_NULLTRANSFORM + end; + + case RadioGroup1.ItemIndex of + 0: + dwFlags := dwFlags OR cmsFLAGS_NOOPTIMIZE; + 1: + dwFlags := dwFlags OR cmsFLAGS_HIGHRESPRECALC; + 3: + dwFlags := dwFlags OR cmsFLAGS_LOWRESPRECALC; + end; + + ComputeFlags := dwFlags +end; + +procedure TForm1.Button1Click(Sender: TObject); +var + Source, Dest: String; + hSrc, hDest: cmsHPROFILE; + xform: cmsHTRANSFORM; + i, PicW, PicH: Integer; + Intent: Integer; + dwFlags: DWORD; +begin + + Source := SelectedFile(ComboBoxInput); + Dest := SelectedFile(ComboBoxOutput); + + dwFlags := ComputeFlags; + + Intent := IntentCodes[ComboBoxIntent.ItemIndex]; + + cmsSetAdaptationState( ScrollBar1.Position / 100.0 ); + + if (Source <> '') AND (Dest <> '') then + begin + hSrc := cmsOpenProfileFromFile(PAnsiChar(AnsiString(Source)), 'r'); + hDest := cmsOpenProfileFromFile(PAnsiChar(AnsiString(Dest)), 'r'); + + if (hSrc <> Nil) and (hDest <> Nil) then + begin + xform := cmsCreateTransform(hSrc, TYPE_BGR_8, hDest, TYPE_BGR_8, Intent, + dwFlags); + end + else + begin + xform := nil; + end; + + if hSrc <> nil then + begin + cmsCloseProfile(hSrc); + end; + + if hDest <> Nil then + begin + cmsCloseProfile(hDest); + end; + + if (xform <> nil) then + begin + + PicW := Image2.Picture.width; + PicH := Image2.Picture.height; + ProgressBar1.Min := 0; + ProgressBar1.Max := PicH; + ProgressBar1.Step := 1; + + for i := 0 TO (PicH - 1) do + begin + if ((i MOD 100) = 0) then + ProgressBar1.Position := i; + + cmsDoTransform(xform, Image1.Picture.Bitmap.Scanline[i], + Image2.Picture.Bitmap.Scanline[i], PicW); + + end; + ProgressBar1.Position := PicH; + + cmsDeleteTransform(xform); + + end; + + Image2.Repaint; + ProgressBar1.Position := 0; + end +end; + +procedure TForm1.Button3Click(Sender: TObject); +begin + if OpenDialog1.Execute then + ComboBoxInput.Text := OpenDialog1.FileName; +end; + +procedure TForm1.Button4Click(Sender: TObject); +begin + if OpenDialog1.Execute then + ComboBoxOutput.Text := OpenDialog1.FileName; +end; + +end. diff --git a/local/recipes/libs/lcms2/source/utils/delphi/lcms2dll.pas b/local/recipes/libs/lcms2/source/utils/delphi/lcms2dll.pas new file mode 100644 index 0000000000..f8346873b2 --- /dev/null +++ b/local/recipes/libs/lcms2/source/utils/delphi/lcms2dll.pas @@ -0,0 +1,2159 @@ +// +// Little cms DELPHI wrapper +//--------------------------------------------------------------------------------- +// +// Little Color Management System +// Copyright (c) 1998-2021 Marti Maria Saguer +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//--------------------------------------------------------------------------------- +// +// Version 2.13 - unmantained +// + +UNIT lcms2dll; + +{$IFDEF FPC} + {$MODE Delphi} +{$ENDIF} + +INTERFACE + +{$IFNDEF MSWINDOWS} + USES LCLType, types; + Type PWChar = PWideChar; +{$ELSE} + USES Windows; +{$ENDIF} + + CONST + + LCMS2_SO = {$IFDEF DARWIN} 'liblcms2.13.dylib'; {$ELSE} 'lcms2.dll'; {$ENDIF} + + TYPE + + Uint8 = Byte; + Int8 = Shortint; + UInt16 = Word; + Int16 = Smallint; + UInt32 = LongWord; + Int32 = Longint; + + TYPE + cmsUInt8Number = Uint8; + cmsInt8Number = Int8; + cmsUInt16Number = UInt16; + cmsInt16Number = Int16; + + cmsUInt32Number = UInt32; + cmsInt32Number = Int32; + cmsInt64Number = Int64; + cmsUInt64Number = UInt64; + + cmsFloat32Number = Single; + cmsFloat64Number = Double; + + LPcmsUInt8Number = ^cmsUInt8Number; + LPcmsInt8Number = ^cmsInt8Number; + LPcmsUInt16Number = ^cmsUInt16Number; + LPcmsInt16Number = ^cmsInt16Number; + + LPcmsUInt32Number = ^cmsUInt32Number; + LPcmsInt32Number = ^cmsInt32Number; + LPcmsInt64Number = ^cmsInt64Number; + LPcmsUInt64Number = ^cmsUInt64Number; + + LPcmsFloat32Number = ^cmsFloat32Number; + LPcmsFloat64Number = ^cmsFloat64Number; + + + // Derivative types + cmsSignature = cmsUInt32Number; + cmsU8Fixed8Number = cmsUInt16Number; + cmsS15Fixed16Number = cmsInt32Number; + cmsU16Fixed16Number = cmsUInt32Number; + + // Boolean type, which will be using the native integer + cmsBool = Boolean; + + CONST + + // Some common definitions + cmsMAX_PATH = 256; + + // D50 XYZ normalized to Y=1.0 + cmsD50X = 0.9642; + cmsD50Y = 1.0; + cmsD50Z = 0.8249; + + // V4 perceptual black + cmsPERCEPTUAL_BLACK_X = 0.00336; + cmsPERCEPTUAL_BLACK_Y = 0.0034731; + cmsPERCEPTUAL_BLACK_Z = 0.00287; + + // Definitions in ICC spec + cmsMagicNumber = $61637370; // 'acsp' + lcmsSignature = $6c636d73; // 'lcms' + + +TYPE + +// Base ICC type definitions +cmsTagTypeSignature = ( + cmsSigChromaticityType = $6368726D, // 'chrm' + cmsSigColorantOrderType = $636C726F, // 'clro' + cmsSigColorantTableType = $636C7274, // 'clrt' + cmsSigCrdInfoType = $63726469, // 'crdi' + cmsSigCurveType = $63757276, // 'curv' + cmsSigDataType = $64617461, // 'data' + cmsSigDictType = $64696374, // 'dict' + cmsSigDateTimeType = $6474696D, // 'dtim' + cmsSigDeviceSettingsType = $64657673, // 'devs' + cmsSigLut16Type = $6d667432, // 'mft2' + cmsSigLut8Type = $6d667431, // 'mft1' + cmsSigLutAtoBType = $6d414220, // 'mAB ' + cmsSigLutBtoAType = $6d424120, // 'mBA ' + cmsSigMeasurementType = $6D656173, // 'meas' + cmsSigMultiLocalizedUnicodeType = $6D6C7563, // 'mluc' + cmsSigMultiProcessElementType = $6D706574, // 'mpet' + cmsSigNamedColorType = $6E636f6C, // 'ncol' -- DEPRECATED! + cmsSigNamedColor2Type = $6E636C32, // 'ncl2' + cmsSigParametricCurveType = $70617261, // 'para' + cmsSigProfileSequenceDescType = $70736571, // 'pseq' + cmsSigProfileSequenceIdType = $70736964, // 'psid' + cmsSigResponseCurveSet16Type = $72637332, // 'rcs2' + cmsSigS15Fixed16ArrayType = $73663332, // 'sf32' + cmsSigScreeningType = $7363726E, // 'scrn' + cmsSigSignatureType = $73696720, // 'sig ' + cmsSigTextType = $74657874, // 'text' + cmsSigTextDescriptionType = $64657363, // 'desc' + cmsSigU16Fixed16ArrayType = $75663332, // 'uf32' + cmsSigUcrBgType = $62666420, // 'bfd ' + cmsSigUInt16ArrayType = $75693136, // 'ui16' + cmsSigUInt32ArrayType = $75693332, // 'ui32' + cmsSigUInt64ArrayType = $75693634, // 'ui64' + cmsSigUInt8ArrayType = $75693038, // 'ui08' + cmsSigViewingConditionsType = $76696577, // 'view' + cmsSigXYZType = $58595A20, // 'XYZ ' + cmsSigVcgtType = $76636774 // 'vcgt' + ); + +// Base ICC tag definitions +cmsTagSignature = ( + cmsSigAToB0Tag = $41324230, // 'A2B0' + cmsSigAToB1Tag = $41324231, // 'A2B1' + cmsSigAToB2Tag = $41324232, // 'A2B2' + cmsSigBlueColorantTag = $6258595A, // 'bXYZ' + cmsSigBlueMatrixColumnTag = $6258595A, // 'bXYZ' + cmsSigBlueTRCTag = $62545243, // 'bTRC' + cmsSigBToA0Tag = $42324130, // 'B2A0' + cmsSigBToA1Tag = $42324131, // 'B2A1' + cmsSigBToA2Tag = $42324132, // 'B2A2' + cmsSigCalibrationDateTimeTag = $63616C74, // 'calt' + cmsSigCharTargetTag = $74617267, // 'targ' + cmsSigChromaticAdaptationTag = $63686164, // 'chad' + cmsSigChromaticityTag = $6368726D, // 'chrm' + cmsSigColorantOrderTag = $636C726F, // 'clro' + cmsSigColorantTableTag = $636C7274, // 'clrt' + cmsSigColorantTableOutTag = $636C6F74, // 'clot' + cmsSigColorimetricIntentImageStateTag = $63696973, // 'ciis' + cmsSigCopyrightTag = $63707274, // 'cprt' + cmsSigCrdInfoTag = $63726469, // 'crdi' + cmsSigDataTag = $64617461, // 'data' + cmsSigDateTimeTag = $6474696D, // 'dtim' + cmsSigDeviceMfgDescTag = $646D6E64, // 'dmnd' + cmsSigDeviceModelDescTag = $646D6464, // 'dmdd' + cmsSigDeviceSettingsTag = $64657673, // 'devs' + cmsSigDToB0Tag = $44324230, // 'D2B0' + cmsSigDToB1Tag = $44324231, // 'D2B1' + cmsSigDToB2Tag = $44324232, // 'D2B2' + cmsSigDToB3Tag = $44324233, // 'D2B3' + cmsSigBToD0Tag = $42324430, // 'B2D0' + cmsSigBToD1Tag = $42324431, // 'B2D1' + cmsSigBToD2Tag = $42324432, // 'B2D2' + cmsSigBToD3Tag = $42324433, // 'B2D3' + cmsSigGamutTag = $67616D74, // 'gamt' + cmsSigGrayTRCTag = $6b545243, // 'kTRC' + cmsSigGreenColorantTag = $6758595A, // 'gXYZ' + cmsSigGreenMatrixColumnTag = $6758595A, // 'gXYZ' + cmsSigGreenTRCTag = $67545243, // 'gTRC' + cmsSigLuminanceTag = $6C756d69, // 'lumi' + cmsSigMeasurementTag = $6D656173, // 'meas' + cmsSigMediaBlackPointTag = $626B7074, // 'bkpt' + cmsSigMediaWhitePointTag = $77747074, // 'wtpt' + cmsSigNamedColorTag = $6E636f6C, // 'ncol' // Deprecated by the ICC + cmsSigNamedColor2Tag = $6E636C32, // 'ncl2' + cmsSigOutputResponseTag = $72657370, // 'resp' + cmsSigPerceptualRenderingIntentGamutTag = $72696730, // 'rig0' + cmsSigPreview0Tag = $70726530, // 'pre0' + cmsSigPreview1Tag = $70726531, // 'pre1' + cmsSigPreview2Tag = $70726532, // 'pre2' + cmsSigProfileDescriptionTag = $64657363, // 'desc' + cmsSigProfileSequenceDescTag = $70736571, // 'pseq' + cmsSigProfileSequenceIdTag = $70736964, // 'psid' + cmsSigPs2CRD0Tag = $70736430, // 'psd0' + cmsSigPs2CRD1Tag = $70736431, // 'psd1' + cmsSigPs2CRD2Tag = $70736432, // 'psd2' + cmsSigPs2CRD3Tag = $70736433, // 'psd3' + cmsSigPs2CSATag = $70733273, // 'ps2s' + cmsSigPs2RenderingIntentTag = $70733269, // 'ps2i' + cmsSigRedColorantTag = $7258595A, // 'rXYZ' + cmsSigRedMatrixColumnTag = $7258595A, // 'rXYZ' + cmsSigRedTRCTag = $72545243, // 'rTRC' + cmsSigSaturationRenderingIntentGamutTag = $72696732, // 'rig2' + cmsSigScreeningDescTag = $73637264, // 'scrd' + cmsSigScreeningTag = $7363726E, // 'scrn' + cmsSigTechnologyTag = $74656368, // 'tech' + cmsSigUcrBgTag = $62666420, // 'bfd ' + cmsSigViewingCondDescTag = $76756564, // 'vued' + cmsSigViewingConditionsTag = $76696577, // 'view' + cmsSigVcgtTag = $76636774, // 'vcgt' + cmsSigMetaTag = $6D657461 // 'meta' +); + +// ICC Technology tag +cmsTechnologySignature = ( + cmsSigDigitalCamera = $6463616D, // 'dcam' + cmsSigFilmScanner = $6673636E, // 'fscn' + cmsSigReflectiveScanner = $7273636E, // 'rscn' + cmsSigInkJetPrinter = $696A6574, // 'ijet' + cmsSigThermalWaxPrinter = $74776178, // 'twax' + cmsSigElectrophotographicPrinter = $6570686F, // 'epho' + cmsSigElectrostaticPrinter = $65737461, // 'esta' + cmsSigDyeSublimationPrinter = $64737562, // 'dsub' + cmsSigPhotographicPaperPrinter = $7270686F, // 'rpho' + cmsSigFilmWriter = $6670726E, // 'fprn' + cmsSigVideoMonitor = $7669646D, // 'vidm' + cmsSigVideoCamera = $76696463, // 'vidc' + cmsSigProjectionTelevision = $706A7476, // 'pjtv' + cmsSigCRTDisplay = $43525420, // 'CRT ' + cmsSigPMDisplay = $504D4420, // 'PMD ' + cmsSigAMDisplay = $414D4420, // 'AMD ' + cmsSigPhotoCD = $4B504344, // 'KPCD' + cmsSigPhotoImageSetter = $696D6773, // 'imgs' + cmsSigGravure = $67726176, // 'grav' + cmsSigOffsetLithography = $6F666673, // 'offs' + cmsSigSilkscreen = $73696C6B, // 'silk' + cmsSigFlexography = $666C6578, // 'flex' + cmsSigMotionPictureFilmScanner = $6D706673, // 'mpfs' + cmsSigMotionPictureFilmRecorder = $6D706672, // 'mpfr' + cmsSigDigitalMotionPictureCamera = $646D7063, // 'dmpc' + cmsSigDigitalCinemaProjector = $64636A70 // 'dcpj' +); + + +// ICC Color spaces +cmsColorSpaceSignature = ( + cmsSigXYZData = $58595A20, // 'XYZ ' + cmsSigLabData = $4C616220, // 'Lab ' + cmsSigLuvData = $4C757620, // 'Luv ' + cmsSigYCbCrData = $59436272, // 'YCbr' + cmsSigYxyData = $59787920, // 'Yxy ' + cmsSigRgbData = $52474220, // 'RGB ' + cmsSigGrayData = $47524159, // 'GRAY' + cmsSigHsvData = $48535620, // 'HSV ' + cmsSigHlsData = $484C5320, // 'HLS ' + cmsSigCmykData = $434D594B, // 'CMYK' + cmsSigCmyData = $434D5920, // 'CMY ' + cmsSigMCH1Data = $4D434831, // 'MCH1' + cmsSigMCH2Data = $4D434832, // 'MCH2' + cmsSigMCH3Data = $4D434833, // 'MCH3' + cmsSigMCH4Data = $4D434834, // 'MCH4' + cmsSigMCH5Data = $4D434835, // 'MCH5' + cmsSigMCH6Data = $4D434836, // 'MCH6' + cmsSigMCH7Data = $4D434837, // 'MCH7' + cmsSigMCH8Data = $4D434838, // 'MCH8' + cmsSigMCH9Data = $4D434839, // 'MCH9' + cmsSigMCHAData = $4D43483A, // 'MCHA' + cmsSigMCHBData = $4D43483B, // 'MCHB' + cmsSigMCHCData = $4D43483C, // 'MCHC' + cmsSigMCHDData = $4D43483D, // 'MCHD' + cmsSigMCHEData = $4D43483E, // 'MCHE' + cmsSigMCHFData = $4D43483F, // 'MCHF' + cmsSigNamedData = $6e6d636c, // 'nmcl' + cmsSig1colorData = $31434C52, // '1CLR' + cmsSig2colorData = $32434C52, // '2CLR' + cmsSig3colorData = $33434C52, // '3CLR' + cmsSig4colorData = $34434C52, // '4CLR' + cmsSig5colorData = $35434C52, // '5CLR' + cmsSig6colorData = $36434C52, // '6CLR' + cmsSig7colorData = $37434C52, // '7CLR' + cmsSig8colorData = $38434C52, // '8CLR' + cmsSig9colorData = $39434C52, // '9CLR' + cmsSig10colorData = $41434C52, // 'ACLR' + cmsSig11colorData = $42434C52, // 'BCLR' + cmsSig12colorData = $43434C52, // 'CCLR' + cmsSig13colorData = $44434C52, // 'DCLR' + cmsSig14colorData = $45434C52, // 'ECLR' + cmsSig15colorData = $46434C52, // 'FCLR' + cmsSigLuvKData = $4C75764B // 'LuvK' +); + +// ICC Profile Class +cmsProfileClassSignature = ( + cmsSigInputClass = $73636E72, // 'scnr' + cmsSigDisplayClass = $6D6E7472, // 'mntr' + cmsSigOutputClass = $70727472, // 'prtr' + cmsSigLinkClass = $6C696E6B, // 'link' + cmsSigAbstractClass = $61627374, // 'abst' + cmsSigColorSpaceClass = $73706163, // 'spac' + cmsSigNamedColorClass = $6e6d636c // 'nmcl' +); + + +// ICC Platforms +cmsPlatformSignature = ( + cmsSigMacintosh = $4150504C, // 'APPL' + cmsSigMicrosoft = $4D534654, // 'MSFT' + cmsSigSolaris = $53554E57, // 'SUNW' + cmsSigSGI = $53474920, // 'SGI ' + cmsSigTaligent = $54474E54, // 'TGNT' + cmsSigUnices = $2A6E6978 // '*nix' // From argyll -- Not official +); + +CONST + + // Reference gamut + cmsSigPerceptualReferenceMediumGamut = $70726d67; //'prmg' + + // For cmsSigColorimetricIntentImageStateTag + cmsSigSceneColorimetryEstimates = $73636F65; //'scoe' + cmsSigSceneAppearanceEstimates = $73617065; //'sape' + cmsSigFocalPlaneColorimetryEstimates = $66706365; //'fpce' + cmsSigReflectionHardcopyOriginalColorimetry = $72686F63; //'rhoc' + cmsSigReflectionPrintOutputColorimetry = $72706F63; //'rpoc' + +TYPE + +// Multi process elements types +cmsStageSignature = ( + cmsSigCurveSetElemType = $63767374, //'cvst' + cmsSigMatrixElemType = $6D617466, //'matf' + cmsSigCLutElemType = $636C7574, //'clut' + + cmsSigBAcsElemType = $62414353, // 'bACS' + cmsSigEAcsElemType = $65414353, // 'eACS' + + // Custom from here, not in the ICC Spec + cmsSigXYZ2LabElemType = $6C327820, // 'l2x ' + cmsSigLab2XYZElemType = $78326C20, // 'x2l ' + cmsSigNamedColorElemType = $6E636C20, // 'ncl ' + cmsSigLabV2toV4 = $32203420, // '2 4 ' + cmsSigLabV4toV2 = $34203220, // '4 2 ' + + // Identities + cmsSigIdentityElemType = $69646E20 // 'idn ' +); + +// Types of CurveElements +cmsCurveSegSignature = ( + + cmsSigFormulaCurveSeg = $70617266, // 'parf' + cmsSigSampledCurveSeg = $73616D66, // 'samf' + cmsSigSegmentedCurve = $63757266 // 'curf' +); + +CONST + + // Used in ResponseCurveType + cmsSigStatusA = $53746141; //'StaA' + cmsSigStatusE = $53746145; //'StaE' + cmsSigStatusI = $53746149; //'StaI' + cmsSigStatusT = $53746154; //'StaT' + cmsSigStatusM = $5374614D; //'StaM' + cmsSigDN = $444E2020; //'DN ' + cmsSigDNP = $444E2050; //'DN P' + cmsSigDNN = $444E4E20; //'DNN ' + cmsSigDNNP = $444E4E50; //'DNNP' + + // Device attributes, currently defined values correspond to the low 4 bytes + // of the 8 byte attribute quantity + cmsReflective = 0; + cmsTransparency = 1; + cmsGlossy = 0; + cmsMatte = 2; + +TYPE + +// Common structures in ICC tags +cmsICCData = PACKED RECORD + len : cmsUInt32Number; + flag : cmsUInt32Number; + data : Array [0..1] of cmsUInt8Number; + END; + +// ICC date time +cmsDateTimeNumber = PACKED RECORD + year: cmsUInt16Number; + month: cmsUInt16Number; + day: cmsUInt16Number; + hours: cmsUInt16Number; + minutes: cmsUInt16Number; + seconds: cmsUInt16Number; +END; + +// ICC XYZ + +cmsEncodedXYZNumber = PACKED RECORD + X: cmsS15Fixed16Number; + Y: cmsS15Fixed16Number; + Z: cmsS15Fixed16Number; +END; + + +// Profile ID as computed by MD5 algorithm +cmsProfileID = PACKED RECORD + CASE Integer OF + 1: (ID8: Array[0..15] OF cmsUInt8Number); + 2: (ID16: Array[0..7] OF cmsUInt16Number); + 3: (ID32: Array[0..3] OF cmsUInt32Number); +END; + + + +// ---------------------------------------------------------------------------------------------- +// ICC profile internal base types. Strictly, shouldn't be declared in this unit, but maybe +// somebody want to use this info for accessing profile header directly, so here it is. + +// Profile header -- it is 32-bit aligned, so no issues are expected on alignment +cmsICCHeader = PACKED RECORD + size: cmsUInt32Number; // Profile size in bytes + cmmId: cmsSignature; // CMM for this profile + version: cmsUInt32Number; // Format version number + deviceClass: cmsProfileClassSignature; // Type of profile + colorSpace: cmsColorSpaceSignature; // Color space of data + pcs: cmsColorSpaceSignature; // PCS, XYZ or Lab only + date: cmsDateTimeNumber; // Date profile was created + magic: cmsSignature; // Magic Number to identify an ICC profile + platform: cmsPlatformSignature; // Primary Platform + flags: cmsUInt32Number; // Various bit settings + manufacturer: cmsSignature; // Device manufacturer + model: cmsUInt32Number; // Device model number + attributes: cmsUInt64Number; // Device attributes + renderingIntent:cmsUInt32Number; // Rendering intent + illuminant: cmsEncodedXYZNumber; // Profile illuminant + creator: cmsSignature; // Profile creator + profileID: cmsProfileID; // Profile ID using MD5 + reserved: array [0..27] of cmsInt8Number; // Reserved for future use +END; + +// ICC base tag +cmsTagBase = PACKED RECORD + sig: cmsTagTypeSignature; + reserved: array[0..3] of cmsInt8Number; +END; + +// A tag entry in directory +cmsTagEntry = PACKED RECORD + sig: cmsTagSignature; // The tag signature + offset: cmsUInt32Number; // Start of tag + size: cmsUInt32Number; // Size in bytes +END; + + +cmsContext = Pointer; // Context identifier for multithreaded environments +cmsHANDLE = Pointer; // Generic handle +cmsHPROFILE = Pointer; // Opaque typedefs to hide internals +cmsHTRANSFORM = Pointer; + + +CONST + + cmsMAXCHANNELS = 16; // Maximum number of channels in ICC profiles + +// Format of pixel is defined by one cmsUInt32Number, using bit fields as follows +// +// A O TTTTT U Y F P X S EEE CCCC BBB +// +// A: Floating point -- With this flag we can differentiate 16 bits as float and as int +// O: Optimized -- previous optimization already returns the final 8-bit value +// T: Pixeltype +// F: Flavor 0=MinIsBlack(Chocolate) 1=MinIsWhite(Vanilla) +// P: Planar? 0=Chunky, 1=Planar +// X: swap 16 bps endianness? +// S: Do swap? ie, BGR, KYMC +// E: Extra samples +// C: Channels (Samples per pixel) +// B: bytes per sample +// Y: Swap first - changes ABGR to BGRA and KCMY to CMYK + + FUNCTION FLOAT_SH(a: cmsUInt32Number): cmsUInt32Number; + FUNCTION OPTIMIZED_SH(s: cmsUInt32Number): cmsUInt32Number; + FUNCTION COLORSPACE_SH(s: cmsUInt32Number):cmsUInt32Number; + FUNCTION SWAPFIRST_SH(s: cmsUInt32Number):cmsUInt32Number; + FUNCTION FLAVOR_SH(s: cmsUInt32Number):cmsUInt32Number; + FUNCTION PLANAR_SH(p: cmsUInt32Number):cmsUInt32Number; + FUNCTION ENDIAN16_SH(e: cmsUInt32Number):cmsUInt32Number; + FUNCTION DOSWAP_SH(e: cmsUInt32Number):cmsUInt32Number; + FUNCTION EXTRA_SH(e: cmsUInt32Number):cmsUInt32Number; + FUNCTION CHANNELS_SH(c: cmsUInt32Number):cmsUInt32Number; + FUNCTION BYTES_SH(b: cmsUInt32Number):cmsUInt32Number; + + + FUNCTION T_FLOAT(a: cmsUInt32Number): cmsUInt32Number; + FUNCTION T_OPTIMIZED(o: cmsUInt32Number): cmsUInt32Number; + FUNCTION T_COLORSPACE(s: cmsUInt32Number): cmsUInt32Number; + FUNCTION T_SWAPFIRST(s: cmsUInt32Number): cmsUInt32Number; + FUNCTION T_FLAVOR(s: cmsUInt32Number): cmsUInt32Number; + FUNCTION T_PLANAR(p: cmsUInt32Number): cmsUInt32Number; + FUNCTION T_ENDIAN16(e: cmsUInt32Number): cmsUInt32Number; + FUNCTION T_DOSWAP(e: cmsUInt32Number): cmsUInt32Number; + FUNCTION T_EXTRA(e: cmsUInt32Number): cmsUInt32Number; + FUNCTION T_CHANNELS(c: cmsUInt32Number): cmsUInt32Number; + FUNCTION T_BYTES(b: cmsUInt32Number): cmsUInt32Number; + +CONST + + +// Pixel types + + PT_ANY = 0; // Don't check colorspace + // 1 & 2 are reserved + PT_GRAY = 3; + PT_RGB = 4; + PT_CMY = 5; + PT_CMYK = 6; + PT_YCbCr = 7; + PT_YUV = 8; // Lu'v' + PT_XYZ = 9; + PT_Lab = 10; + PT_YUVK = 11; // Lu'v'K + PT_HSV = 12; + PT_HLS = 13; + PT_Yxy = 14; + + PT_MCH1 = 15; + PT_MCH2 = 16; + PT_MCH3 = 17; + PT_MCH4 = 18; + PT_MCH5 = 19; + PT_MCH6 = 20; + PT_MCH7 = 21; + PT_MCH8 = 22; + PT_MCH9 = 23; + PT_MCH10 = 24; + PT_MCH11 = 25; + PT_MCH12 = 26; + PT_MCH13 = 27; + PT_MCH14 = 28; + PT_MCH15 = 29; + + PT_LabV2 = 30; // Identical to PT_Lab, but using the V2 old encoding + + + // Format descriptors + TYPE_GRAY_8 = $030009; + TYPE_GRAY_8_REV = $032009; + TYPE_GRAY_16 = $03000a; + TYPE_GRAY_16_REV = $03200a; + TYPE_GRAY_16_SE = $03080a; + TYPE_GRAYA_8 = $030089; + TYPE_GRAYA_16 = $03008a; + TYPE_GRAYA_16_SE = $03088a; + TYPE_GRAYA_8_PLANAR = $031089; + TYPE_GRAYA_16_PLANAR = $03108a; + TYPE_RGB_8 = $040019; + TYPE_RGB_8_PLANAR = $041019; + TYPE_BGR_8 = $040419; + TYPE_BGR_8_PLANAR = $041419; + TYPE_RGB_16 = $04001a; + TYPE_RGB_16_PLANAR = $04101a; + TYPE_RGB_16_SE = $04081a; + TYPE_BGR_16 = $04041a; + TYPE_BGR_16_PLANAR = $04141a; + TYPE_BGR_16_SE = $040c1a; + TYPE_RGBA_8 = $040099; + TYPE_RGBA_8_PLANAR = $041099; + TYPE_ARGB_8_PLANAR = $045099; + TYPE_ABGR_8_PLANAR = $041499; + TYPE_BGRA_8_PLANAR = $045499; + TYPE_RGBA_16 = $04009a; + TYPE_RGBA_16_PLANAR = $04109a; + TYPE_RGBA_16_SE = $04089a; + TYPE_ARGB_8 = $044099; + TYPE_ARGB_16 = $04409a; + TYPE_ABGR_8 = $040499; + TYPE_ABGR_16 = $04049a; + TYPE_ABGR_16_PLANAR = $04149a; + TYPE_ABGR_16_SE = $040c9a; + TYPE_BGRA_8 = $044499; + TYPE_BGRA_16 = $04449a; + TYPE_BGRA_16_SE = $04489a; + TYPE_CMY_8 = $050019; + TYPE_CMY_8_PLANAR = $051019; + TYPE_CMY_16 = $05001a; + TYPE_CMY_16_PLANAR = $05101a; + TYPE_CMY_16_SE = $05081a; + TYPE_CMYK_8 = $060021; + TYPE_CMYKA_8 = $0600a1; + TYPE_CMYK_8_REV = $062021; + TYPE_YUVK_8 = $062021; + TYPE_CMYK_8_PLANAR = $061021; + TYPE_CMYK_16 = $060022; + TYPE_CMYK_16_REV = $062022; + TYPE_YUVK_16 = $062022; + TYPE_CMYK_16_PLANAR = $061022; + TYPE_CMYK_16_SE = $060822; + TYPE_KYMC_8 = $060421; + TYPE_KYMC_16 = $060422; + TYPE_KYMC_16_SE = $060c22; + TYPE_KCMY_8 = $064021; + TYPE_KCMY_8_REV = $066021; + TYPE_KCMY_16 = $064022; + TYPE_KCMY_16_REV = $066022; + TYPE_KCMY_16_SE = $064822; + TYPE_CMYK5_8 = $130029; + TYPE_CMYK5_16 = $13002a; + TYPE_CMYK5_16_SE = $13082a; + TYPE_KYMC5_8 = $130429; + TYPE_KYMC5_16 = $13042a; + TYPE_KYMC5_16_SE = $130c2a; + TYPE_CMYK6_8 = $140031; + TYPE_CMYK6_8_PLANAR = $141031; + TYPE_CMYK6_16 = $140032; + TYPE_CMYK6_16_PLANAR = $141032; + TYPE_CMYK6_16_SE = $140832; + TYPE_CMYK7_8 = $150039; + TYPE_CMYK7_16 = $15003a; + TYPE_CMYK7_16_SE = $15083a; + TYPE_KYMC7_8 = $150439; + TYPE_KYMC7_16 = $15043a; + TYPE_KYMC7_16_SE = $150c3a; + TYPE_CMYK8_8 = $160041; + TYPE_CMYK8_16 = $160042; + TYPE_CMYK8_16_SE = $160842; + TYPE_KYMC8_8 = $160441; + TYPE_KYMC8_16 = $160442; + TYPE_KYMC8_16_SE = $160c42; + TYPE_CMYK9_8 = $170049; + TYPE_CMYK9_16 = $17004a; + TYPE_CMYK9_16_SE = $17084a; + TYPE_KYMC9_8 = $170449; + TYPE_KYMC9_16 = $17044a; + TYPE_KYMC9_16_SE = $170c4a; + TYPE_CMYK10_8 = $180051; + TYPE_CMYK10_16 = $180052; + TYPE_CMYK10_16_SE = $180852; + TYPE_KYMC10_8 = $180451; + TYPE_KYMC10_16 = $180452; + TYPE_KYMC10_16_SE = $180c52; + TYPE_CMYK11_8 = $190059; + TYPE_CMYK11_16 = $19005a; + TYPE_CMYK11_16_SE = $19085a; + TYPE_KYMC11_8 = $190459; + TYPE_KYMC11_16 = $19045a; + TYPE_KYMC11_16_SE = $190c5a; + TYPE_CMYK12_8 = $1a0061; + TYPE_CMYK12_16 = $1a0062; + TYPE_CMYK12_16_SE = $1a0862; + TYPE_KYMC12_8 = $1a0461; + TYPE_KYMC12_16 = $1a0462; + TYPE_KYMC12_16_SE = $1a0c62; + TYPE_XYZ_16 = $09001a; + TYPE_Lab_8 = $0a0019; + TYPE_ALab_8 = $0a0499; + TYPE_Lab_16 = $0a001a; + TYPE_Yxy_16 = $0e001a; + TYPE_YCbCr_8 = $070019; + TYPE_YCbCr_8_PLANAR = $071019; + TYPE_YCbCr_16 = $07001a; + TYPE_YCbCr_16_PLANAR = $07101a; + TYPE_YCbCr_16_SE = $07081a; + TYPE_YUV_8 = $080019; + TYPE_YUV_8_PLANAR = $081019; + TYPE_YUV_16 = $08001a; + TYPE_YUV_16_PLANAR = $08101a; + TYPE_YUV_16_SE = $08081a; + TYPE_HLS_8 = $0d0019; + TYPE_HLS_8_PLANAR = $0d1019; + TYPE_HLS_16 = $0d001a; + TYPE_HLS_16_PLANAR = $0d101a; + TYPE_HLS_16_SE = $0d081a; + TYPE_HSV_8 = $0c0019; + TYPE_HSV_8_PLANAR = $0c1019; + TYPE_HSV_16 = $0c001a; + TYPE_HSV_16_PLANAR = $0c101a; + TYPE_HSV_16_SE = $0c081a; + + TYPE_NAMED_COLOR_INDEX = $000A; + + TYPE_XYZ_FLT = $49001c; + TYPE_Lab_FLT = $4a001c; + TYPE_GRAY_FLT = $43000c; + TYPE_RGB_FLT = $44001c; + TYPE_CMYK_FLT = $460024; + TYPE_XYZA_FLT = $49009c; + TYPE_LabA_FLT = $4a009c; + TYPE_RGBA_FLT = $44009c; + + TYPE_XYZ_DBL = $490018; + TYPE_Lab_DBL = $4a0018; + TYPE_GRAY_DBL = $430008; + TYPE_RGB_DBL = $440018; + TYPE_CMYK_DBL = $460020; + TYPE_LabV2_8 = $1e0019; + TYPE_ALabV2_8 = $1e0499; + TYPE_LabV2_16 = $1e001a; + + TYPE_GRAY_HALF_FLT = $43000a; + TYPE_RGB_HALF_FLT = $44001a; + TYPE_RGBA_HALF_FLT = $44009a; + TYPE_CMYK_HALF_FLT = $460022; + + TYPE_ARGB_HALF_FLT = $44409a; + TYPE_BGR_HALF_FLT = $44041a; + TYPE_BGRA_HALF_FLT = $44449a; + TYPE_ABGR_HALF_FLT = $44041a; + +TYPE + + + // Colorimetric spaces + + cmsCIEXYZ = PACKED RECORD + X, Y, Z : cmsFloat64Number; + END; + LPcmsCIEXYZ = ^cmsCIEXYZ; + + cmsCIExyY = PACKED RECORD + x, y, YY : cmsFloat64Number + END; + LPcmsCIExyY = ^cmsCIEXYY; + + cmsCIELab = PACKED RECORD + L, a, b: cmsFloat64Number + END; + LPcmsCIELab = ^cmsCIELab; + + cmsCIELCh = PACKED RECORD + L, C, h : cmsFloat64Number + END; + LPcmsCIELCh = ^cmsCIELCh; + + cmsJCh = PACKED RECORD + J, C, h : cmsFloat64Number + END; + LPcmsJCh = ^cmsJCH; + + + cmsCIEXYZTRIPLE = PACKED RECORD + Red, Green, Blue : cmsCIEXYZ + END; + LPcmsCIEXYZTRIPLE = ^cmsCIEXYZTRIPLE; + + + cmsCIExyYTRIPLE = PACKED RECORD + Red, Green, Blue : cmsCIExyY + END; + LPcmsCIExyYTRIPLE = ^cmsCIExyYTRIPLE; + + +CONST + + // Illuminant types for structs below + cmsILLUMINANT_TYPE_UNKNOWN = $0000000; + cmsILLUMINANT_TYPE_D50 = $0000001; + cmsILLUMINANT_TYPE_D65 = $0000002; + cmsILLUMINANT_TYPE_D93 = $0000003; + cmsILLUMINANT_TYPE_F2 = $0000004; + cmsILLUMINANT_TYPE_D55 = $0000005; + cmsILLUMINANT_TYPE_A = $0000006; + cmsILLUMINANT_TYPE_E = $0000007; + cmsILLUMINANT_TYPE_F8 = $0000008; + +TYPE + + cmsICCMeasurementConditions = PACKED RECORD + + Observer: cmsUInt32Number; // 0 = unknown, 1=CIE 1931, 2=CIE 1964 + Backing: cmsCIEXYZ; // Value of backing + Geometry: cmsUInt32Number; // 0=unknown, 1=45/0, 0/45 2=0d, d/0 + Flare: cmsFloat64Number; // 0..1.0 + IlluminantType: cmsUInt32Number; + + END; + + cmsICCViewingConditions = PACKED RECORD + IlluminantXYZ: cmsCIEXYZ; // Not the same struct as CAM02, + SurroundXYZ: cmsCIEXYZ; // This is for storing the tag + IlluminantType: cmsUInt32Number; // viewing condition + END; + + +// Context -------------------------------------------------------------------------------------------------------------- + +FUNCTION cmsCreateContext(Plugin : Pointer; UserData : Pointer) : cmsContext; StdCall; +PROCEDURE cmsDeleteContext(ContextID: cmsContext); StdCall; +FUNCTION cmsDupContext(ContextID: cmsContext; NewUserData: Pointer): cmsContext; StdCall; +FUNCTION cmsGetContextUserData(ContextID: cmsContext): Pointer; StdCall; + +// Plug-In registering --------------------------------------------------------------------------------------------------- + +FUNCTION cmsPlugin(Plugin: Pointer): cmsBool; StdCall; +PROCEDURE cmsUnregisterPlugins; StdCall; + +// Error logging ---------------------------------------------------------------------------------------------------------- + +// There is no error handling at all. When a function fails, it returns proper value. +// For example, all create functions does return NULL on failure. Other may return FALSE. +// It may be interesting, for the developer, to know why the function is failing. +// for that reason, lcms2 does offer a logging function. This function will get +// an ENGLISH string with some clues on what is going wrong. You can show this +// info to the end user if you wish, or just create some sort of log on disk. +// The logging function should NOT terminate the program, as this obviously can leave +// unfreed resources. It is the programmer's responsibility to check each function +// return code to make sure it didn't fail. + +CONST + + cmsERROR_UNDEFINED = 0; + cmsERROR_FILE = 1; + cmsERROR_RANGE = 2; + cmsERROR_INTERNAL = 3; + cmsERROR_NULL = 4; + cmsERROR_READ = 5; + cmsERROR_SEEK = 6; + cmsERROR_WRITE = 7; + cmsERROR_UNKNOWN_EXTENSION = 8; + cmsERROR_COLORSPACE_CHECK = 9; + cmsERROR_ALREADY_DEFINED = 10; + cmsERROR_BAD_SIGNATURE = 11; + cmsERROR_CORRUPTION_DETECTED = 12; + cmsERROR_NOT_SUITABLE = 13; + +// Error logger is called with the ContextID when a message is raised. This gives the +// chance to know which thread is responsible of the warning and any environment associated +// with it. Non-multithreading applications may safely ignore this parameter. +// Note that under certain special circumstances, ContextID may be NULL. + +TYPE + + cmsLogErrorHandlerFunction = PROCEDURE( ContextID: cmsContext; ErrorCode: cmsUInt32Number; Text: PAnsiChar); CDecl; + + // Allows user to set any specific logger + PROCEDURE cmsSetLogErrorHandler(Fn: cmsLogErrorHandlerFunction); StdCall; + + +// Conversions -------------------------------------------------------------------------------------------------------------- + + +// Returns pointers to constant structs +FUNCTION cmsD50_XYZ: LPcmsCIEXYZ; StdCall; +FUNCTION cmsD50_xyY: LPcmsCIExyY; StdCall; + +// Colorimetric space conversions +PROCEDURE cmsXYZ2xyY(Dest: LPcmsCIExyY; Source: LPcmsCIEXYZ); StdCall; +PROCEDURE cmsxyY2XYZ(Dest: LPcmsCIEXYZ; Source: LPcmsCIExyY); StdCall; +PROCEDURE cmsLab2XYZ(WhitePoint: LPcmsCIEXYZ; xyz: LPcmsCIEXYZ; Lab: LPcmsCIELab); StdCall; +PROCEDURE cmsXYZ2Lab(WhitePoint: LPcmsCIEXYZ; Lab: LPcmsCIELab; xyz: LPcmsCIEXYZ); StdCall; +PROCEDURE cmsLab2LCh(LCh: LPcmsCIELCh; Lab: LPcmsCIELab); StdCall; +PROCEDURE cmsLCh2Lab(Lab: LPcmsCIELab; LCh: LPcmsCIELCh); StdCall; + +// Encoding /Decoding on PCS +PROCEDURE cmsLabEncoded2Float(Lab: LPcmsCIELab; wLab: Pointer); StdCall; +PROCEDURE cmsLabEncoded2FloatV2(Lab: LPcmsCIELab; wLab: Pointer); StdCall; +PROCEDURE cmsFloat2LabEncoded(wLab: Pointer; Lab: LPcmsCIELab); StdCall; +PROCEDURE cmsFloat2LabEncodedV2(wLab: Pointer; Lab: LPcmsCIELab); StdCall; +PROCEDURE cmsXYZEncoded2Float(fxyz : LPcmsCIEXYZ; XYZ: Pointer); StdCall; +PROCEDURE cmsFloat2XYZEncoded(XYZ: Pointer; fXYZ: LPcmsCIEXYZ); StdCall; + + +// DeltaE metrics +FUNCTION cmsDeltaE(Lab1, Lab2: LPcmsCIELab): Double; StdCall; +FUNCTION cmsCIE94DeltaE(Lab1, Lab2: LPcmsCIELab): Double; StdCall; +FUNCTION cmsBFDdeltaE(Lab1, Lab2: LPcmsCIELab): Double; StdCall; +FUNCTION cmsCMCdeltaE(Lab1, Lab2: LPcmsCIELab): Double; StdCall; +FUNCTION cmsCIE2000DeltaE(Lab1, Lab2: LPcmsCIELab; Kl, Kc, Kh: Double): Double; StdCall; + + +// Temperature <-> Chromaticity (Black body) +FUNCTION cmsWhitePointFromTemp(var WhitePoint: cmsCIExyY; TempK: cmsFloat64Number) : cmsBool; StdCall; +FUNCTION cmsTempFromWhitePoint(var TeampK: cmsFloat64Number; var WhitePoint: cmsCIExyY) : cmsBool; StdCall; + + +// Chromatic adaptation +FUNCTION cmsAdaptToIlluminant(Result: LPcmsCIEXYZ; SourceWhitePt: LPcmsCIEXYZ; + Illuminant: LPcmsCIEXYZ; Value: LPcmsCIEXYZ): cmsBool; StdCall; + + +// CIECAM02 --------------------------------------------------------------------------------------------------- + +// Viewing conditions. Please note those are CAM model viewing conditions, and not the ICC tag viewing +// conditions, which I'm naming cmsICCViewingConditions to make differences evident. Unfortunately, the tag +// cannot deal with surround La, Yb and D value so is basically useless to store CAM02 viewing conditions. + + CONST + + AVG_SURROUND = 1; + DIM_SURROUND = 2; + DARK_SURROUND = 3; + CUTSHEET_SURROUND = 4; + + D_CALCULATE = -1; + + TYPE + + cmsViewingConditions = PACKED RECORD + + WhitePoint: cmsCIEXYZ; + Yb : cmsFloat64Number; + La : cmsFloat64Number; + surround : Integer; + D_value : cmsFloat64Number + END; + + + LPcmsViewingConditions = ^cmsViewingConditions; + +FUNCTION cmsCIECAM02Init(pVC : LPcmsViewingConditions ) : Pointer; StdCall; +PROCEDURE cmsCIECAM02Done(hModel : Pointer); StdCall; +PROCEDURE cmsCIECAM02Forward(hModel: Pointer; pIn: LPcmsCIEXYZ; pOut: LPcmsJCh ); StdCall; +PROCEDURE cmsCIECAM02Reverse(hModel: Pointer; pIn: LPcmsJCh; pOut: LPcmsCIEXYZ ); StdCall; + +// Tone curves ----------------------------------------------------------------------------------------- + +// This describes a curve segment. For a table of supported types, see the manual. User can increase the number of +// available types by using a proper plug-in. Parametric segments allow 10 parameters at most + +TYPE +cmsCurveSegment = PACKED RECORD + x0, x1: cmsFloat32Number; // Domain; for x0 < x <= x1 + PType: cmsInt32Number; // Parametric type, Type == 0 means sampled segment. Negative values are reserved + Params: array [0..9] of cmsFloat64Number; // Parameters if Type != 0 + nGridPoints: cmsUInt32Number; // Number of grid points if Type == 0 + SampledPoints: LPcmsFloat32Number; // Points to an array of floats if Type == 0 +END; + +LPcmsToneCurve = Pointer; +LPcmsCurveSegmentArray = ^cmsCurveSegmentArray; +cmsCurveSegmentArray = array[0..0] of cmsCurveSegment; + +LPcmsFloat64NumberArray = ^cmsFloat64NumberArray; +cmsFloat64NumberArray = array[0..0] of cmsFloat64Number; + +LPcmsUInt16NumberArray = ^cmsUInt16NumberArray; +cmsUInt16NumberArray = array[0..0] of cmsUInt16Number; + +LPcmsFloat32NumberArray = ^cmsFloat32NumberArray; +cmsFloat32NumberArray = array[0..0] of cmsFloat32Number; + +LPLPcmsToneCurveArray = ^LPcmsToneCurveArray; +LPcmsToneCurveArray = array[0..0] of LPcmsToneCurve; + +LPcmsUInt32NumberArray = ^cmsUInt32NumberArray; +cmsUInt32NumberArray = array[0..0] of cmsUInt32Number; + +FUNCTION cmsBuildSegmentedToneCurve(ContextID: cmsContext; nSegments: cmsInt32Number; Segments: LPcmsCurveSegmentArray): LPcmsToneCurve; StdCall; +FUNCTION cmsBuildParametricToneCurve(ContextID: cmsContext; CType: cmsInt32Number; Params: LPcmsFloat64NumberArray): LPcmsToneCurve; StdCall; +FUNCTION cmsBuildGamma(ContextID: cmsContext; Gamma: cmsFloat64Number): LPcmsToneCurve; StdCall; +FUNCTION cmsBuildTabulatedToneCurve16(ContextID: cmsContext; nEntries: cmsInt32Number; values: LPcmsUInt16NumberArray): LPcmsToneCurve; StdCall; +FUNCTION cmsBuildTabulatedToneCurveFloat(ContextID: cmsContext; nEntries: cmsUInt32Number; values: LPcmsFloat32NumberArray): LPcmsToneCurve; StdCall; +PROCEDURE cmsFreeToneCurve(Curve: LPcmsToneCurve); StdCall; +PROCEDURE cmsFreeToneCurveTriple(Curve: LPLPcmsToneCurveArray); StdCall; +FUNCTION cmsDupToneCurve(Src: LPcmsToneCurve): LPcmsToneCurve; StdCall; +FUNCTION cmsReverseToneCurve(InGamma: LPcmsToneCurve): LPcmsToneCurve; StdCall; +FUNCTION cmsReverseToneCurveEx(nResultSamples: cmsInt32Number; InGamma: LPcmsToneCurve): LPcmsToneCurve; StdCall; +FUNCTION cmsJoinToneCurve(ContextID: cmsContext; X, Y: LPcmsToneCurve; nPoints: cmsUInt32Number ): LPcmsToneCurve; StdCall; +FUNCTION cmsSmoothToneCurve(Tab: LPcmsToneCurve; lambda: cmsFloat64Number): cmsBool; StdCall; +FUNCTION cmsEvalToneCurveFloat(Curve: LPcmsToneCurve; v: cmsFloat32Number):cmsFloat32Number; StdCall; +FUNCTION cmsEvalToneCurve16(Curve: LPcmsToneCurve; v:cmsUInt16Number):cmsUInt16Number; StdCall; +FUNCTION cmsIsToneCurveMultisegment(InGamma: LPcmsToneCurve):cmsBool; StdCall; +FUNCTION cmsIsToneCurveLinear(Curve: LPcmsToneCurve):cmsBool; StdCall; +FUNCTION cmsIsToneCurveMonotonic(t: LPcmsToneCurve):cmsBool; StdCall; +FUNCTION cmsIsToneCurveDescending(t: LPcmsToneCurve):cmsBool; StdCall; +FUNCTION cmsGetToneCurveParametricType(t: LPcmsToneCurve):cmsInt32Number; StdCall; +FUNCTION cmsEstimateGamma(t: LPcmsToneCurve; Precision:cmsFloat64Number):cmsFloat64Number; StdCall; +FUNCTION cmsGetToneCurveEstimatedTableEntries(t: LPcmsToneCurve): cmsUInt32Number; StdCall; +FUNCTION cmsGetToneCurveEstimatedTable(t: LPcmsToneCurve): LPcmsUInt16Number; StdCall; + + +// Implements pipelines of multi-processing elements ------------------------------------------------------------- + +TYPE + LPcmsPipeline = Pointer; + LPcmsStage = Pointer; + LPLPcmsStage = ^LPcmsStage; + +// Those are hi-level pipelines +FUNCTION cmsPipelineAlloc(ContextID: cmsContext; InputChannels, OutputChannels: cmsUInt32Number): LPcmsPipeline; StdCall; +PROCEDURE cmsPipelineFree(lut: LPcmsPipeline); StdCall; +FUNCTION cmsPipelineDup(Orig: LPcmsPipeline): LPcmsPipeline; StdCall; +FUNCTION cmsGetPipelineContextID(lut: LPcmsPipeline) : cmsContext; StdCall; +FUNCTION cmsPipelineInputChannels(lut: LPcmsPipeline): cmsUInt32Number; StdCall; +FUNCTION cmsPipelineOutputChannels(lut: LPcmsPipeline): cmsUInt32Number; StdCall; + +FUNCTION cmsPipelineStageCount(lut: LPcmsPipeline): cmsUInt32Number; StdCall; +FUNCTION cmsPipelineGetPtrToFirstStage(lut: LPcmsPipeline): LPcmsStage; StdCall; +FUNCTION cmsPipelineGetPtrToLastStage(lut: LPcmsPipeline): LPcmsStage; StdCall; + +PROCEDURE cmsPipelineEval16(Inv, Outv: LPcmsUInt16NumberArray; lut: LPcmsPipeline); StdCall; +PROCEDURE cmsPipelineEvalFloat(Inv, Outv: LPcmsFloat32NumberArray; lut: LPcmsPipeline); StdCall; + +FUNCTION cmsPipelineEvalReverseFloat(Target, Result, Hint: LPcmsFloat32NumberArray; lut: LPcmsPipeline): cmsBool; StdCall; +FUNCTION cmsPipelineCat(l1, l2: LPcmsPipeline): cmsBool; StdCall; +FUNCTION cmsPipelineSetSaveAs8bitsFlag(lut: LPcmsPipeline; On: cmsBool): cmsBool; StdCall; + +// Where to place/locate the stages in the pipeline chain +TYPE + cmsStageLoc = (cmsAT_BEGIN = 0, cmsAT_END = 1 ); + +PROCEDURE cmsPipelineInsertStage(lut: LPcmsPipeline; loc: cmsStageLoc; mpe: LPcmsStage); StdCall; +PROCEDURE cmsPipelineUnlinkStage(lut: LPcmsPipeline; loc: cmsStageLoc; mpe: LPLPcmsStage); StdCall; + +// This function is quite useful to analyze the structure of a Pipeline and retrieve the Stage elements +// that conform the Pipeline. It should be called with the Pipeline, the number of expected elements and +// then a list of expected types followed with a list of double pointers to Stage elements. If +// the function founds a match with current pipeline, it fills the pointers and returns TRUE +// if not, returns FALSE without touching anything. +// FUNCTION cmsPipelineCheckAndRetreiveStages(const cmsPipeline* Lut, n: cmsUInt32Number, ...): cmsBool; StdCall; + +// Matrix has double precision and CLUT has only float precision. That is because an ICC profile can encode +// matrices with far more precision that CLUTS +FUNCTION cmsStageAllocIdentity(ContextID: cmsContext; nChannels: cmsUInt32Number): LPcmsStage; StdCall; +FUNCTION cmsStageAllocToneCurves(ContextID: cmsContext; nChannels: cmsUInt32Number; Curves: LPLPcmsToneCurveArray): LPcmsStage; StdCall; +FUNCTION cmsStageAllocMatrix(ContextID: cmsContext; Rows, Cols: cmsUInt32Number; Matrix, Offset: LPcmsFloat64NumberArray): LPcmsStage; StdCall; + +FUNCTION cmsStageAllocCLut16bit(ContextID: cmsContext; nGridPoints: cmsUInt32Number; inputChan, outputChan: cmsUInt32Number; Table: LPcmsUInt16NumberArray): LPcmsStage; StdCall; +FUNCTION cmsStageAllocCLutFloat(ContextID: cmsContext; nGridPoints: cmsUInt32Number; inputChan, outputChan: cmsUInt32Number; Table: LPcmsFloat32NumberArray): LPcmsStage; StdCall; + +FUNCTION cmsStageAllocCLut16bitGranular(ContextID: cmsContext; nGridPoints: LPcmsUInt32NumberArray; inputChan, outputChan: cmsUInt32Number; Table: LPcmsUInt16NumberArray): LPcmsStage; StdCall; +FUNCTION cmsStageAllocCLutFloatGranular(ContextID: cmsContext; nGridPoints: LPcmsUInt32NumberArray; inputChan, outputChan: cmsUInt32Number; Table: LPcmsFloat32NumberArray): LPcmsStage; StdCall; + + +FUNCTION cmsStageDup(mpe: LPcmsStage): LPcmsStage; StdCall; +PROCEDURE cmsStageFree(mpe: LPcmsStage); StdCall; +FUNCTION cmsStageNext(mpe: LPcmsStage): LPcmsStage; StdCall; + +FUNCTION cmsStageInputChannels(mpe: LPcmsStage): cmsUInt32Number; StdCall; +FUNCTION cmsStageOutputChannels(mpe: LPcmsStage): cmsUInt32Number; StdCall; +FUNCTION cmsStageType(mpe: LPcmsStage): cmsStageSignature; StdCall; +FUNCTION cmsStageData(mpe: LPcmsStage): Pointer; StdCall; + +// Sampling + +Type + cmsSAMPLER16 = FUNCTION (Inp, Outp: LPcmsUInt16NumberArray; Cargo: Pointer): cmsInt32Number; CDecl; + cmsSAMPLERFLOAT = FUNCTION (Inp, Outp: LPcmsFloat32NumberArray; Cargo: Pointer): cmsInt32Number; CDecl; + +// Use this flag to prevent changes being written to destination + +Const + +SAMPLER_INSPECT = $01000000; + + +// For CLUT only +FUNCTION cmsStageSampleCLut16bit(mpe: LPcmsStage; Sampler: cmsSAMPLER16; Cargo: Pointer; dwFlags: cmsUInt32Number): cmsBool; StdCall; +FUNCTION cmsStageSampleCLutFloat(mpe: LPcmsStage; Sampler: cmsSAMPLERFLOAT; Cargo: Pointer; dwFlags: cmsUInt32Number): cmsBool; StdCall; + + +// Slicers +FUNCTION cmsSliceSpace16(nInputs: cmsUInt32Number; clutPoints: LPcmsUInt32NumberArray; + Sampler: cmsSAMPLER16; Cargo: Pointer): cmsBool; StdCall; + +FUNCTION cmsSliceSpaceFloat(nInputs: cmsUInt32Number; clutPoints: LPcmsUInt32NumberArray; + Sampler: cmsSAMPLERFLOAT; Cargo: Pointer): cmsBool; StdCall; + +// Multilocalized Unicode management --------------------------------------------------------------------------------------- + +Type + LPcmsMLU = Pointer; + +Const + +cmsNoLanguage = #0#0#0; +cmsNoCountry = #0#0#0; + + +FUNCTION cmsMLUalloc(ContextID: cmsContext; nItems: cmsUInt32Number): LPcmsMLU; StdCall; +PROCEDURE cmsMLUfree(mlu: LPcmsMLU); StdCall; +FUNCTION cmsMLUdup(mlu: LPcmsMLU): LPcmsMLU; StdCall; + +FUNCTION cmsMLUsetASCII(mlu: LPcmsMLU; LanguageCode, CountryCode, ASCIIString: PAnsiChar): cmsBool; StdCall; +FUNCTION cmsMLUsetWide(mlu: LPcmsMLU; LanguageCode, CountryCode: PAnsiChar; WideString: PWChar): cmsBool; StdCall; + +FUNCTION cmsMLUgetASCII(mlu: LPcmsMLU; LanguageCode, CountryCode: PAnsiChar; Buffer: PAnsiChar; BufferSize: cmsUInt32Number): cmsUInt32Number; StdCall; + +FUNCTION cmsMLUgetWide(mlu: LPcmsMLU; LanguageCode, CountryCode: PAnsiChar; Buffer: PWChar; BufferSize: cmsUInt32Number): cmsUInt32Number; StdCall; + +FUNCTION cmsMLUgetTranslation(mlu: LPcmsMLU; LanguageCode, CountryCode, ObtainedLanguage, ObtainedCountry: PAnsiChar): cmsBool; StdCall; + +// Undercolorremoval & black generation ------------------------------------------------------------------------------------- + +Type + +cmsUcrBg = PACKED RECORD + Ucr, Bg: LPcmsToneCurve; + Desc: LPcmsMLU; + END; + + +// Screening ---------------------------------------------------------------------------------------------------------------- + +Const + + cmsPRINTER_DEFAULT_SCREENS = $0001; + cmsFREQUENCE_UNITS_LINES_CM = $0000; + cmsFREQUENCE_UNITS_LINES_INCH = $0002; + + cmsSPOT_UNKNOWN = 0; + cmsSPOT_PRINTER_DEFAULT = 1; + cmsSPOT_ROUND = 2; + cmsSPOT_DIAMOND = 3; + cmsSPOT_ELLIPSE = 4; + cmsSPOT_LINE = 5; + cmsSPOT_SQUARE = 6; + cmsSPOT_CROSS = 7; + + +Type + +cmsScreeningChannel = PACKED RECORD + + Frequency, + ScreenAngle: cmsFloat64Number; + SpotShape: cmsUInt32Number; + +END; + +cmsScreening = PACKED RECORD + + Flag, + nChannels : cmsUInt32Number; + Channels: Array [0..cmsMAXCHANNELS-1] OF cmsScreeningChannel; +END; + + +// Named color ----------------------------------------------------------------------------------------------------------------- + + +LPcmsNAMEDCOLORLIST = Pointer; + +FUNCTION cmsAllocNamedColorList(ContextID: cmsContext; n, ColorantCount :cmsUInt32Number; + Prefix, Suffix: PAnsiChar): LPcmsNAMEDCOLORLIST; StdCall; + +PROCEDURE cmsFreeNamedColorList(v: LPcmsNAMEDCOLORLIST); StdCall; +FUNCTION cmsDupNamedColorList(v: LPcmsNAMEDCOLORLIST): LPcmsNAMEDCOLORLIST; StdCall; +FUNCTION cmsAppendNamedColor(v: LPcmsNAMEDCOLORLIST; Name: PAnsiChar; + PCS, Colorant : LPcmsUInt16NumberArray): cmsBool; StdCall; + +FUNCTION cmsNamedColorCount(v: LPcmsNAMEDCOLORLIST): cmsUInt32Number; StdCall; +FUNCTION cmsNamedColorIndex(v: LPcmsNAMEDCOLORLIST; Name: PAnsiChar): cmsInt32Number; StdCall; + +FUNCTION cmsNamedColorInfo(v: LPcmsNAMEDCOLORLIST; nColor : cmsUInt32Number; + Name,Prefix, Suffix : PAnsiChar; + PCS, Colorant : LPcmsUInt16NumberArray): cmsBool; StdCall; + +// Retrieve named color list from transform +FUNCTION cmsGetNamedColorList(xform: cmsHTRANSFORM ): LPcmsNAMEDCOLORLIST; StdCall; + +// Profile sequence ----------------------------------------------------------------------------------------------------- + +Type + +// Profile sequence descriptor. Some fields come from profile sequence descriptor tag, others +// come from Profile Sequence Identifier Tag + +cmsPSEQDESC = PACKED RECORD + deviceMfg, deviceModel: cmsSignature; + + attributes: cmsUInt64Number; + technology: cmsTechnologySignature; + ProfileID: cmsProfileID; + Manufacturer, + Model, + Description : LPcmsMLU; + END; + + LPcmsSEQDESC = ^cmsPSEQDESC; + +cmsSEQ = PACKED RECORD + + n: cmsUInt32Number; + ContextID: cmsContext; + seq: LPcmsSEQDESC; +END; + +LPcmsSEQ = ^cmsSEQ; + +FUNCTION cmsAllocProfileSequenceDescription(ContextID: cmsContext; n: cmsUInt32Number):LPcmsSEQ; StdCall; +FUNCTION cmsDupProfileSequenceDescription(pseq: LPcmsSEQ):LPcmsSEQ; StdCall; +PROCEDURE cmsFreeProfileSequenceDescription(pseq: LPcmsSEQ); StdCall; + +// Dictionaries -------------------------------------------------------------------------------------------------------- + +TYPE + + LPcmsDICTentry = ^cmsDICTentry; + +cmsDICTentry = PACKED RECORD + + Next: LPcmsDICTentry; + + DisplayName, DisplayValue: LPcmsMLU; + Name, Value : PWChar; +END; + +FUNCTION cmsDictAlloc(ContextID: cmsContext): cmsHANDLE; StdCall; +PROCEDURE cmsDictFree(hDict: cmsHANDLE); StdCall; +FUNCTION cmsDictDup(hDict: cmsHANDLE): cmsHANDLE; StdCall; + +FUNCTION cmsDictAddEntry(hDict: cmsHANDLE; Name, Value: PWChar; DisplayName, DisplayValue : LPcmsMLU): cmsBool; StdCall; +FUNCTION cmsDictGetEntryList(hDict: cmsHANDLE): LPcmsDICTentry; StdCall; +FUNCTION cmsDictNextEntry(e : LPcmsDICTentry): LPcmsDICTentry; StdCall; + +// Access to Profile data ---------------------------------------------------------------------------------------------- +FUNCTION cmsCreateProfilePlaceholder(ContextID: cmsContext): cmsHPROFILE; StdCall; + +FUNCTION cmsGetProfileContextID(hProfile: cmsHPROFILE):cmsContext; StdCall; +FUNCTION cmsGetTagCount(hProfile: cmsHPROFILE): cmsInt32Number; StdCall; +FUNCTION cmsGetTagSignature(hProfile: cmsHPROFILE; n: cmsUInt32Number): cmsTagSignature; StdCall; +FUNCTION cmsIsTag(hProfile: cmsHPROFILE; sig: cmsTagSignature ): cmsBool; StdCall; + +// Read and write pre-formatted data +FUNCTION cmsReadTag(hProfile: cmsHPROFILE; sig: cmsTagSignature ): Pointer; StdCall; +FUNCTION cmsWriteTag(hProfile: cmsHPROFILE; sig: cmsTagSignature; data: Pointer): cmsBool; StdCall; +FUNCTION cmsLinkTag(hProfile: cmsHPROFILE; sig: cmsTagSignature; dest: cmsTagSignature): cmsBool; StdCall; +FUNCTION cmsTagLinkedTo(hProfile: cmsHPROFILE; sig: cmsTagSignature):cmsTagSignature; StdCall; + +// Read and write raw data +FUNCTION cmsReadRawTag(hProfile: cmsHPROFILE; sig: cmsTagSignature; Buffer: Pointer; BufferSize: cmsUInt32Number): cmsInt32Number; StdCall; +FUNCTION cmsWriteRawTag(hProfile: cmsHPROFILE; sig: cmsTagSignature; data: Pointer; Size: cmsUInt32Number): cmsBool; StdCall; + +// Access header data +Const + + cmsEmbeddedProfileFalse = $00000000; + cmsEmbeddedProfileTrue = $00000001; + cmsUseAnywhere = $00000000; + cmsUseWithEmbeddedDataOnly = $00000002; + +FUNCTION cmsGetHeaderFlags(hProfile: cmsHPROFILE): cmsUInt32Number; StdCall; +PROCEDURE cmsGetHeaderAttributes(hProfile: cmsHPROFILE; Flags: LPcmsUInt64Number); StdCall; +PROCEDURE cmsGetHeaderProfileID(hProfile: cmsHPROFILE; ProfileID: LPcmsUInt8Number); StdCall; + +// TODO: +// FUNCTION cmsGetHeaderCreationDateTime(hProfile: cmsHPROFILE; struct tm *Dest): cmsBool; StdCall; + +FUNCTION cmsGetHeaderRenderingIntent(hProfile: cmsHPROFILE): cmsUInt32Number; StdCall; +PROCEDURE cmsSetHeaderFlags(hProfile: cmsHPROFILE; Flags: cmsUInt32Number); StdCall; +FUNCTION cmsGetHeaderManufacturer(hProfile: cmsHPROFILE): cmsUInt32Number; StdCall; +PROCEDURE cmsSetHeaderManufacturer(hProfile: cmsHPROFILE; manufacturer: cmsUInt32Number ); StdCall; +FUNCTION cmsGetHeaderModel(hProfile: cmsHPROFILE): cmsUInt32Number; StdCall; +PROCEDURE cmsSetHeaderModel(hProfile: cmsHPROFILE; model: cmsUInt32Number ); StdCall; +PROCEDURE cmsSetHeaderAttributes(hProfile: cmsHPROFILE; Flags: cmsUInt64Number); StdCall; +PROCEDURE cmsSetHeaderProfileID(hProfile: cmsHPROFILE; ProfileID: LPcmsUInt8Number); StdCall; +PROCEDURE cmsSetHeaderRenderingIntent(hProfile: cmsHPROFILE; RenderingIntent: cmsUInt32Number ); StdCall; + +FUNCTION cmsGetPCS(hProfile: cmsHPROFILE):cmsColorSpaceSignature; StdCall; +PROCEDURE cmsSetPCS(hProfile: cmsHPROFILE; pcs: cmsColorSpaceSignature); StdCall; +FUNCTION cmsGetColorSpace(hProfile: cmsHPROFILE): cmsColorSpaceSignature; StdCall; +PROCEDURE cmsSetColorSpace(hProfile: cmsHPROFILE; sig: cmsColorSpaceSignature); StdCall; +FUNCTION cmsGetDeviceClass(hProfile: cmsHPROFILE): cmsProfileClassSignature; StdCall; +PROCEDURE cmsSetDeviceClass(hProfile: cmsHPROFILE; sig: cmsProfileClassSignature); StdCall; +PROCEDURE cmsSetProfileVersion(hProfile: cmsHPROFILE; Version: cmsFloat64Number); StdCall; +FUNCTION cmsGetProfileVersion(hProfile: cmsHPROFILE): cmsFloat64Number; StdCall; + +FUNCTION cmsGetEncodedICCversion(hProfile: cmsHPROFILE): cmsUInt32Number; StdCall; +PROCEDURE cmsSetEncodedICCversion(hProfile: cmsHPROFILE; Version: cmsUInt32Number); StdCall; + + +Const + + // How profiles may be used + LCMS_USED_AS_INPUT = 0; + LCMS_USED_AS_OUTPUT = 1; + LCMS_USED_AS_PROOF = 2; + +FUNCTION cmsIsIntentSupported(hProfile: cmsHPROFILE; Intent: cmsUInt32Number; UsedDirection: cmsUInt32Number): cmsBool; StdCall; +FUNCTION cmsIsMatrixShaper(hProfile: cmsHPROFILE): cmsBool; StdCall; +FUNCTION cmsIsCLUT(hProfile: cmsHPROFILE; Intent: cmsUInt32Number; UsedDirection: cmsUInt32Number): cmsBool; StdCall; + +// Translate form/to our notation to ICC +FUNCTION _cmsICCcolorSpace(OurNotation: Integer): cmsColorSpaceSignature; StdCall; +FUNCTION _cmsLCMScolorSpace(ProfileSpace: cmsColorSpaceSignature): Integer; StdCall; + +FUNCTION cmsChannelsOf( ColorSpace: cmsColorSpaceSignature): cmsUInt32Number; StdCall; + +// Build a suitable formatter for the colorspace of this profile +FUNCTION cmsFormatterForColorspaceOfProfile(hProfile: cmsHPROFILE; nBytes: cmsUInt32Number; lIsFloat: cmsBool): cmsUInt32Number; StdCall; +FUNCTION cmsFormatterForPCSOfProfile(hProfile: cmsHPROFILE; nBytes: cmsUInt32Number; lIsFloat: cmsBool): cmsUInt32Number; StdCall; + +Type + +// Localized info +cmsInfoType = ( + cmsInfoDescription = 0, + cmsInfoManufacturer = 1, + cmsInfoModel = 2, + cmsInfoCopyright = 3 +); + +FUNCTION cmsGetProfileInfo(hProfile: cmsHPROFILE; Info: cmsInfoType; LanguageCode, CountryCode: PAnsiChar; + Buffer: PWChar; BufferSize: cmsUInt32Number): cmsUInt32Number; StdCall; + +FUNCTION cmsGetProfileInfoASCII(hProfile: cmsHPROFILE; Info: cmsInfoType; LanguageCode, CountryCode: PAnsiChar; + Buffer: PAnsiChar; BufferSize: cmsUInt32Number): cmsUInt32Number; StdCall; + +// IO handlers ---------------------------------------------------------------------------------------------------------- + +Type + +LPcmsIOHANDLER = Pointer; + +FUNCTION cmsOpenIOhandlerFromFile(ContextID: cmsContext; FileName, AccessMode: PAnsiChar): LPcmsIOHANDLER; StdCall; +// FUNCTION cmsOpenIOhandlerFromStream(ContextID: cmsContext; FILE* Stream): LPcmsIOHANDLER; StdCall; +FUNCTION cmsOpenIOhandlerFromMem(ContextID: cmsContext; Buffer: Pointer; size: cmsUInt32Number; AccessMode: PAnsiChar): LPcmsIOHANDLER; StdCall; +FUNCTION cmsOpenIOhandlerFromNULL(ContextID: cmsContext): LPcmsIOHANDLER; StdCall; +FUNCTION cmsCloseIOhandler(io: LPcmsIOHANDLER): cmsBool; StdCall; + +// MD5 message digest -------------------------------------------------------------------------------------------------- + +FUNCTION cmsMD5computeID(hProfile: cmsHPROFILE): cmsBool; StdCall; + +// Profile high level functions ------------------------------------------------------------------------------------------ + +FUNCTION cmsOpenProfileFromFile(ICCProfile : PAnsiChar; sAccess: PAnsiChar): cmsHPROFILE; StdCall; +FUNCTION cmsOpenProfileFromFileTHR(ContextID: cmsContext; ICCProfile, sAccess: PAnsiChar): cmsHPROFILE; StdCall; +// FUNCTION CMSEXPORT cmsOpenProfileFromStream(FILE* ICCProfile, const char* sAccess): cmsHPROFILE; StdCall; +// FUNCTION CMSEXPORT cmsOpenProfileFromStreamTHR(ContextID: cmsContext; FILE* ICCProfile, const char* sAccess): cmsHPROFILE; StdCall; +FUNCTION cmsOpenProfileFromMem(MemPtr: Pointer; dwSize: cmsUInt32Number): cmsHPROFILE; StdCall; +FUNCTION cmsOpenProfileFromMemTHR(ContextID: cmsContext; MemPtr: Pointer; dwSize: cmsUInt32Number): cmsHPROFILE; StdCall; +FUNCTION cmsOpenProfileFromIOhandlerTHR(ContextID: cmsContext; io: LPcmsIOHANDLER): cmsHPROFILE; StdCall; +FUNCTION cmsCloseProfile(hProfile: cmsHPROFILE): cmsBool; StdCall; + +FUNCTION cmsSaveProfileToFile(hProfile: cmsHPROFILE; FileName: PAnsiChar): cmsBool; StdCall; +// FUNCTION CMSEXPORT cmsSaveProfileToStream(hProfile: cmsHPROFILE, FILE* Stream): cmsBool; StdCall; +FUNCTION cmsSaveProfileToMem(hProfile: cmsHPROFILE; MemPtr: Pointer; BytesNeeded: LPcmsUInt32Number): cmsBool; StdCall; +FUNCTION cmsSaveProfileToIOhandler(hProfile: cmsHPROFILE; io: LPcmsIOHANDLER):cmsUInt32Number; StdCall; + +// Predefined virtual profiles ------------------------------------------------------------------------------------------ + +FUNCTION cmsCreateRGBProfileTHR(ContextID: cmsContext; + WhitePoint: LPcmsCIExyY; + Primaries: LPcmsCIExyYTRIPLE; + TransferFunction: LPLPcmsToneCurveArray): cmsHPROFILE; StdCall; + +FUNCTION cmsCreateRGBProfile(WhitePoint: LPcmsCIExyY; + Primaries: LPcmsCIExyYTRIPLE; + TransferFunction: LPLPcmsToneCurveArray): cmsHPROFILE; StdCall; + +FUNCTION cmsCreateGrayProfileTHR(ContextID: cmsContext; + WhitePoint: LPcmsCIExyY; + TransferFunction: LPcmsToneCurve): cmsHPROFILE; StdCall; + +FUNCTION cmsCreateGrayProfile(WhitePoint: LPcmsCIExyY; + TransferFunction: LPcmsToneCurve): cmsHPROFILE; StdCall; + +FUNCTION cmsCreateLinearizationDeviceLinkTHR(ContextID: cmsContext; + ColorSpace: cmsColorSpaceSignature; + TransferFunctions: LPLPcmsToneCurveArray): cmsHPROFILE; StdCall; + +FUNCTION cmsCreateLinearizationDeviceLink(ColorSpace: cmsColorSpaceSignature; + TransferFunctions: LPLPcmsToneCurveArray): cmsHPROFILE; StdCall; + +FUNCTION cmsCreateInkLimitingDeviceLinkTHR(ContextID: cmsContext; + ColorSpace: cmsColorSpaceSignature; Limit: cmsFloat64Number): cmsHPROFILE; StdCall; + +FUNCTION cmsCreateInkLimitingDeviceLink(ColorSpace: cmsColorSpaceSignature; Limit: cmsFloat64Number): cmsHPROFILE; StdCall; + + +FUNCTION cmsCreateLab2ProfileTHR(ContextID: cmsContext; WhitePoint: LPcmsCIExyY): cmsHPROFILE; StdCall; +FUNCTION cmsCreateLab2Profile(WhitePoint: LPcmsCIExyY): cmsHPROFILE; StdCall; +FUNCTION cmsCreateLab4ProfileTHR(ContextID: cmsContext; WhitePoint: LPcmsCIExyY): cmsHPROFILE; StdCall; +FUNCTION cmsCreateLab4Profile(WhitePoint: LPcmsCIExyY): cmsHPROFILE; StdCall; + +FUNCTION cmsCreateXYZProfileTHR(ContextID: cmsContext): cmsHPROFILE; StdCall; +FUNCTION cmsCreateXYZProfile: cmsHPROFILE; StdCall; + +FUNCTION cmsCreate_sRGBProfileTHR(ContextID: cmsContext): cmsHPROFILE; StdCall; +FUNCTION cmsCreate_sRGBProfile: cmsHPROFILE; StdCall; + +FUNCTION cmsCreateBCHSWabstractProfileTHR(ContextID: cmsContext; + nLUTPoints: Integer; + Bright, + Contrast, + Hue, + Saturation: cmsFloat64Number; + TempSrc, + TempDest: Integer): cmsHPROFILE; StdCall; + +FUNCTION cmsCreateBCHSWabstractProfile( nLUTPoints: Integer; + Bright, + Contrast, + Hue, + Saturation: cmsFloat64Number; + TempSrc, + TempDest: Integer): cmsHPROFILE; StdCall; + +FUNCTION cmsCreateNULLProfileTHR(ContextID: cmsContext): cmsHPROFILE; StdCall; +FUNCTION cmsCreateNULLProfile: cmsHPROFILE; StdCall; + +// Converts a transform to a devicelink profile +FUNCTION cmsTransform2DeviceLink(hTransform: cmsHTRANSFORM; Version: cmsFloat64Number; dwFlags: cmsUInt32Number): cmsHPROFILE; StdCall; + +// Intents ---------------------------------------------------------------------------------------------- + +Const + +// ICC Intents +INTENT_PERCEPTUAL = 0; +INTENT_RELATIVE_COLORIMETRIC = 1; +INTENT_SATURATION = 2; +INTENT_ABSOLUTE_COLORIMETRIC = 3; + +// Non-ICC intents +INTENT_PRESERVE_K_ONLY_PERCEPTUAL = 10; +INTENT_PRESERVE_K_ONLY_RELATIVE_COLORIMETRIC = 11; +INTENT_PRESERVE_K_ONLY_SATURATION = 12; +INTENT_PRESERVE_K_PLANE_PERCEPTUAL = 13; +INTENT_PRESERVE_K_PLANE_RELATIVE_COLORIMETRIC = 14; +INTENT_PRESERVE_K_PLANE_SATURATION = 15; + +Type +LPPAnsiChar = ^PAnsiChar; + +// Call with NULL as parameters to get the intent count +FUNCTION cmsGetSupportedIntents(nMax: cmsUInt32Number; Codes: LPcmsUInt32Number; Descriptions: LPPAnsiChar): cmsUInt32Number; StdCall; + +Const + +// Flags + +cmsFLAGS_NOCACHE = $0040; // Inhibit 1-pixel cache +cmsFLAGS_NOOPTIMIZE = $0100; // Inhibit optimizations +cmsFLAGS_NULLTRANSFORM = $0200; // Don't transform anyway + +// Proofing flags +cmsFLAGS_GAMUTCHECK = $1000; // Out of Gamut alarm +cmsFLAGS_SOFTPROOFING = $4000; // Do softproofing + +// Misc +cmsFLAGS_BLACKPOINTCOMPENSATION = $2000; +cmsFLAGS_NOWHITEONWHITEFIXUP = $0004; // Don't fix scum dot +cmsFLAGS_HIGHRESPRECALC = $0400; // Use more memory to give better accuracy +cmsFLAGS_LOWRESPRECALC = $0800; // Use less memory to minimize resources + +// For devicelink creation +cmsFLAGS_8BITS_DEVICELINK = $0008; // Create 8 bits devicelinks +cmsFLAGS_GUESSDEVICECLASS = $0020; // Guess device class (for transform2devicelink) +cmsFLAGS_KEEP_SEQUENCE = $0080; // Keep profile sequence for devicelink creation + +// Specific to a particular optimizations +cmsFLAGS_FORCE_CLUT = $0002; // Force CLUT optimization +cmsFLAGS_CLUT_POST_LINEARIZATION = $0001; // create postlinearization tables if possible +cmsFLAGS_CLUT_PRE_LINEARIZATION = $0010; // create prelinearization tables if possible + +// CRD special +cmsFLAGS_NODEFAULTRESOURCEDEF = $01000000; + +// Fine-tune control over number of gridpoints +FUNCTION cmsFLAGS_GRIDPOINTS(n: Integer): Integer; + + +// Transforms --------------------------------------------------------------------------------------------------- + +type + LPcmsHPROFILEArray = ^cmsHPROFILEArray; + cmsHPROFILEArray = array[0..0] of cmsHPROFILE; + + LPcmsBoolArray = ^cmsBoolArray; + cmsBoolArray = array[0..0] of cmsBool; + +FUNCTION cmsCreateTransformTHR(ContextID: cmsContext; + Input: cmsHPROFILE; + InputFormat: cmsUInt32Number; + Output: cmsHPROFILE; + OutputFormat: cmsUInt32Number; + Intent: cmsUInt32Number; + dwFlags: cmsUInt32Number): cmsHTRANSFORM; StdCall; + +FUNCTION cmsCreateTransform(Input: cmsHPROFILE; + InputFormat: cmsUInt32Number; + Output: cmsHPROFILE; + OutputFormat: cmsUInt32Number; + Intent: cmsUInt32Number; + dwFlags: cmsUInt32Number): cmsHTRANSFORM; StdCall; + +FUNCTION cmsCreateProofingTransformTHR(ContextID: cmsContext; + Input: cmsHPROFILE; + InputFormat: cmsUInt32Number; + Output: cmsHPROFILE; + OutputFormat: cmsUInt32Number; + Proofing: cmsHPROFILE; + Intent: cmsUInt32Number; + ProofingIntent: cmsUInt32Number; + dwFlags: cmsUInt32Number): cmsHTRANSFORM; StdCall; + +FUNCTION cmsCreateProofingTransform(Input: cmsHPROFILE; + InputFormat: cmsUInt32Number; + Output: cmsHPROFILE; + OutputFormat: cmsUInt32Number; + Proofing: cmsHPROFILE; + Intent: cmsUInt32Number; + ProofingIntent: cmsUInt32Number; + dwFlags: cmsUInt32Number): cmsHTRANSFORM; StdCall; + +FUNCTION cmsCreateMultiprofileTransformTHR(ContextID: cmsContext; + hProfiles: LPcmsHPROFILEArray; + nProfiles: cmsUInt32Number; + InputFormat: cmsUInt32Number; + OutputFormat: cmsUInt32Number; + Intent: cmsUInt32Number; + dwFlags: cmsUInt32Number): cmsHTRANSFORM; StdCall; + + +FUNCTION cmsCreateMultiprofileTransform( hProfiles: LPcmsHPROFILEArray; + nProfiles: cmsUInt32Number; + InputFormat: cmsUInt32Number; + OutputFormat: cmsUInt32Number; + Intent: cmsUInt32Number; + dwFlags: cmsUInt32Number): cmsHTRANSFORM; StdCall; + + +FUNCTION cmsCreateExtendedTransform(ContextID: cmsContext; + nProfiles: cmsUInt32Number; + hProfiles: LPcmsHPROFILEArray; + BPC: LPcmsBoolArray; + Intents: LPcmsUInt32NumberArray; + AdaptationStates: LPcmsFloat64NumberArray; + hGamutProfile: cmsHPROFILE; + nGamutPCSposition: cmsUInt32Number; + InputFormat, + OutputFormat: cmsUInt32Number; + dwFlags: cmsUInt32Number): cmsHTRANSFORM; StdCall; + +PROCEDURE cmsDeleteTransform(hTransform: cmsHTRANSFORM); StdCall; + +PROCEDURE cmsDoTransform(Transform: cmsHTRANSFORM; InputBuffer, OutputBuffer: Pointer; size: cmsUInt32Number); StdCall; +PROCEDURE cmsDoTransformStride(Transform: cmsHTRANSFORM; InputBuffer, OutputBuffer: Pointer; size: cmsUInt32Number; stride: cmsUInt32Number); StdCall; + + +PROCEDURE cmsSetAlarmCodes( NewAlarm: LPcmsUInt16NumberArray); StdCall; +PROCEDURE cmsGetAlarmCodes(NewAlarm: LPcmsUInt16NumberArray); StdCall; + +// Adaptation state for absolute colorimetric intent +FUNCTION cmsSetAdaptationState(d: cmsFloat64Number):cmsFloat64Number; StdCall; + +// Grab the ContextID from an open transform. Returns NULL if a NULL transform is passed +FUNCTION cmsGetTransformContextID(hTransform: cmsHTRANSFORM):cmsContext; StdCall; + +// For backwards compatibility +FUNCTION cmsChangeBuffersFormat(hTransform: cmsHTRANSFORM; InputFormat, OutputFormat: cmsUInt32Number): cmsBool; StdCall; + + + +// PostScript ColorRenderingDictionary and ColorSpaceArray ---------------------------------------------------- + +Type + +cmsPSResourceType = (cmsPS_RESOURCE_CSA, cmsPS_RESOURCE_CRD ) ; + +// lcms2 unified method to access postscript color resources +FUNCTION cmsGetPostScriptColorResource(ContextID: cmsContext; RType: cmsPSResourceType; + hProfile: cmsHPROFILE; + Intent: cmsUInt32Number; + dwFlags: cmsUInt32Number; + io: LPcmsIOHANDLER): cmsUInt32Number; StdCall; + +FUNCTION cmsGetPostScriptCSA(ContextID: cmsContext; hProfile: cmsHPROFILE; Intent: cmsUInt32Number; dwFlags: cmsUInt32Number; Buffer: Pointer; dwBufferLen: cmsUInt32Number ): cmsUInt32Number; StdCall; +FUNCTION cmsGetPostScriptCRD(ContextID: cmsContext; hProfile: cmsHPROFILE; Intent: cmsUInt32Number; dwFlags: cmsUInt32Number; Buffer: Pointer; dwBufferLen: cmsUInt32Number): cmsUInt32Number; StdCall; + + +// IT8.7 / CGATS.17-20$ handling ----------------------------------------------------------------------------- + + +// CGATS.13 parser + +FUNCTION cmsIT8Alloc: cmsHANDLE; StdCall; +PROCEDURE cmsIT8Free(hIT8: cmsHANDLE); StdCall; + +// Tables + +FUNCTION cmsIT8TableCount(hIT8: cmsHANDLE): Integer; StdCall; +FUNCTION cmsIT8SetTable(hIT8: cmsHANDLE; nTable: Integer): Integer; StdCall; + +// Persistence +FUNCTION cmsIT8LoadFromFile(cFileName: PAnsiChar): cmsHANDLE; StdCall; +FUNCTION cmsIT8LoadFromMem(Ptr: Pointer; size :DWord): cmsHANDLE; StdCall; + +FUNCTION cmsIT8SaveToFile(hIT8: cmsHANDLE; cFileName: PAnsiChar): cmsBool; StdCall; +FUNCTION cmsIT8SaveToMem(hIT8: cmsHANDLE; MemPtr: Pointer; BytesNeeded: LPcmsUInt32Number): cmsBool; StdCall; +// Properties + +FUNCTION cmsIT8GetSheetType(hIT8: cmsHANDLE): PAnsiChar; StdCall; +FUNCTION cmsIT8SetSheetType(hIT8: cmsHANDLE; TheType: PAnsiChar): cmsBool; StdCall; + +FUNCTION cmsIT8SetComment(hIT8: cmsHANDLE; cComment: PAnsiChar): cmsBool; StdCall; + +FUNCTION cmsIT8SetPropertyStr(hIT8: cmsHANDLE; cProp, Str: PAnsiChar): cmsBool; StdCall; +FUNCTION cmsIT8SetPropertyDbl(hIT8: cmsHANDLE; cProp: PAnsiChar; Val: Double): cmsBool; StdCall; +FUNCTION cmsIT8SetPropertyHex(hIT8: cmsHANDLE; cProp: PAnsiChar; Val: Integer): cmsBool; StdCall; +FUNCTION cmsIT8SetPropertyUncooked(hIT8: cmsHANDLE; Key, Buffer: PAnsiChar): cmsBool; StdCall; + + +FUNCTION cmsIT8GetProperty(hIT8: cmsHANDLE; cProp: PAnsiChar): PAnsiChar; StdCall; +FUNCTION cmsIT8GetPropertyDbl(hIT8: cmsHANDLE; cProp: PAnsiChar): Double; StdCall; +FUNCTION cmsIT8EnumProperties(hIT8: cmsHANDLE; var PropertyNames: LPPAnsiChar): Integer; StdCall; + +// Datasets + +FUNCTION cmsIT8GetDataRowCol(hIT8: cmsHANDLE; row, col: Integer): PAnsiChar; StdCall; +FUNCTION cmsIT8GetDataRowColDbl(hIT8: cmsHANDLE; row, col: Integer): Double; StdCall; + +FUNCTION cmsIT8SetDataRowCol(hIT8: cmsHANDLE; row, col: Integer; Val: PAnsiChar): cmsBool; StdCall; +FUNCTION cmsIT8SetDataRowColDbl(hIT8: cmsHANDLE; row, col: Integer; Val: Double): cmsBool; StdCall; + +FUNCTION cmsIT8GetData(hIT8: cmsHANDLE; cPatch, cSample: PAnsiChar): PAnsiChar; StdCall; + +FUNCTION cmsIT8GetDataDbl(hIT8: cmsHANDLE;cPatch, cSample: PAnsiChar): Double; StdCall; + +FUNCTION cmsIT8SetData(hIT8: cmsHANDLE; cPatch, cSample, Val: PAnsiChar): cmsBool; StdCall; + +FUNCTION cmsIT8SetDataDbl(hIT8: cmsHANDLE; cPatch, cSample: PAnsiChar; Val: Double): cmsBool; StdCall; + +FUNCTION cmsIT8SetDataFormat(hIT8: cmsHANDLE; n: Integer; Sample: PAnsiChar): cmsBool; StdCall; +FUNCTION cmsIT8EnumDataFormat(hIT8: cmsHANDLE; var SampleNames: LPPAnsiChar): Integer; StdCall; +FUNCTION cmsIT8GetPatchName(hIT8: cmsHANDLE; nPatch: Integer; Buffer: PAnsiChar): PAnsiChar; StdCall; + +// The LABEL extension +FUNCTION cmsIT8SetTableByLabel(hIT8: cmsHANDLE; cSet, cField, ExpectedType: PAnsiChar): Integer; StdCall; + +FUNCTION cmsIT8FindDataFormat(hIT8: cmsHANDLE; cSample: PAnsiChar): Integer; StdCall; + +// Formatter for double +PROCEDURE cmsIT8DefineDblFormat(hIT8: cmsHANDLE; Formatter: PAnsiChar); StdCall; + +// Gamut boundary description routines ------------------------------------------------------------------------------ + +FUNCTION cmsGBDAlloc(ContextID: cmsContext):cmsHANDLE; StdCall; +PROCEDURE cmsGBDFree(hGBD: cmsHANDLE); StdCall; +FUNCTION cmsGDBAddPoint(hGBD: cmsHANDLE; Lab: LPcmsCIELab): cmsBool; StdCall; +FUNCTION cmsGDBCompute(hGDB: cmsHANDLE; dwFlags: cmsUInt32Number): cmsBool; StdCall; +FUNCTION cmsGDBCheckPoint(hGBD: cmsHANDLE; Lab: LPcmsCIELab): cmsBool; StdCall; + +// Feature detection ---------------------------------------------------------------------------------------------- + +// Estimate the black point +FUNCTION cmsDetectBlackPoint( BlackPoint: LPcmsCIEXYZ; hProfile: cmsHPROFILE; Intent: cmsUInt32Number; dwFlags: cmsUInt32Number): cmsBool; StdCall; +FUNCTION cmsDetectDestinationBlackPoint( BlackPoint: LPcmsCIEXYZ; hProfile: cmsHPROFILE; Intent: cmsUInt32Number; dwFlags: cmsUInt32Number): cmsBool; StdCall; + + +// Estimate total area coverage +FUNCTION cmsDetectTAC(hProfile: cmsHPROFILE): cmsFloat64Number; StdCall; + +// Estimate profile gamma +FUNCTION cmsDetectRGBProfileGamma(hProfile: cmsHPROFILE): cmsFloat64Number; StdCall; + + +// Poor man's gamut mapping +FUNCTION cmsDesaturateLab(Lab: LPcmsCIELab; amax, amin, bmax, bmin: cmsFloat64Number): cmsBool; StdCall; + + +IMPLEMENTATION + + + + FUNCTION FLOAT_SH(a: cmsUInt32Number): cmsUInt32Number; begin FLOAT_SH := ((a) shl 22) end; + FUNCTION OPTIMIZED_SH(s: cmsUInt32Number): cmsUInt32Number; begin OPTIMIZED_SH := ((s) shl 21) end; + FUNCTION COLORSPACE_SH(s: cmsUInt32Number):cmsUInt32Number; begin COLORSPACE_SH := ((s) shl 16) end; + FUNCTION SWAPFIRST_SH(s: cmsUInt32Number):cmsUInt32Number; begin SWAPFIRST_SH := ((s) shl 14) end; + FUNCTION FLAVOR_SH(s: cmsUInt32Number):cmsUInt32Number; begin FLAVOR_SH := ((s) shl 13) end; + FUNCTION PLANAR_SH(p: cmsUInt32Number):cmsUInt32Number; begin PLANAR_SH := ((p) shl 12) end; + FUNCTION ENDIAN16_SH(e: cmsUInt32Number):cmsUInt32Number; begin ENDIAN16_SH := ((e) shl 11) end; + FUNCTION DOSWAP_SH(e: cmsUInt32Number):cmsUInt32Number; begin DOSWAP_SH := ((e) shl 10) end; + FUNCTION EXTRA_SH(e: cmsUInt32Number):cmsUInt32Number; begin EXTRA_SH := ((e) shl 7) end; + FUNCTION CHANNELS_SH(c: cmsUInt32Number):cmsUInt32Number; begin CHANNELS_SH := ((c) shl 3) end; + FUNCTION BYTES_SH(b: cmsUInt32Number):cmsUInt32Number; begin BYTES_SH := (b) end; + + + FUNCTION T_FLOAT(a: cmsUInt32Number): cmsUInt32Number; begin T_FLOAT := (((a) shr 22) and 1) end; + FUNCTION T_OPTIMIZED(o: cmsUInt32Number): cmsUInt32Number; begin T_OPTIMIZED := (((o) shr 21) and 1) end; + FUNCTION T_COLORSPACE(s: cmsUInt32Number): cmsUInt32Number; begin T_COLORSPACE := (((s) shr 16) and 31) end; + FUNCTION T_SWAPFIRST(s: cmsUInt32Number): cmsUInt32Number; begin T_SWAPFIRST := (((s) shr 14) and 1) end; + FUNCTION T_FLAVOR(s: cmsUInt32Number): cmsUInt32Number; begin T_FLAVOR := (((s) shr 13) and 1) end; + FUNCTION T_PLANAR(p: cmsUInt32Number): cmsUInt32Number; begin T_PLANAR := (((p) shr 12) and 1) end; + FUNCTION T_ENDIAN16(e: cmsUInt32Number): cmsUInt32Number; begin T_ENDIAN16 := (((e) shr 11) and 1) end; + FUNCTION T_DOSWAP(e: cmsUInt32Number): cmsUInt32Number; begin T_DOSWAP := (((e) shr 10) and 1) end; + FUNCTION T_EXTRA(e: cmsUInt32Number): cmsUInt32Number; begin T_EXTRA := (((e) shr 7) and 7) end; + FUNCTION T_CHANNELS(c: cmsUInt32Number): cmsUInt32Number; begin T_CHANNELS := (((c) shr 3) and 15) end; + FUNCTION T_BYTES(b: cmsUInt32Number): cmsUInt32Number; begin T_BYTES := ((b) and 7) end; + + + +// + +FUNCTION cmsCreateContext(Plugin : Pointer; UserData : Pointer) : cmsContext; StdCall; external LCMS2_SO; +PROCEDURE cmsDeleteContext(ContextID: cmsContext); StdCall; external LCMS2_SO; +FUNCTION cmsDupContext(ContextID: cmsContext; NewUserData: Pointer): cmsContext; StdCall; external LCMS2_SO; +FUNCTION cmsGetContextUserData(ContextID: cmsContext): Pointer; StdCall; external LCMS2_SO; + +FUNCTION cmsPlugin(Plugin: Pointer): cmsBool; StdCall; external LCMS2_SO; +PROCEDURE cmsUnregisterPlugins; StdCall; external LCMS2_SO; +PROCEDURE cmsSetLogErrorHandler(Fn: cmsLogErrorHandlerFunction); StdCall; external LCMS2_SO; +FUNCTION cmsD50_XYZ: LPcmsCIEXYZ; StdCall; external LCMS2_SO; +FUNCTION cmsD50_xyY: LPcmsCIExyY; StdCall; external LCMS2_SO; +PROCEDURE cmsXYZ2xyY(Dest: LPcmsCIExyY; Source: LPcmsCIEXYZ); StdCall; external LCMS2_SO; +PROCEDURE cmsxyY2XYZ(Dest: LPcmsCIEXYZ; Source: LPcmsCIExyY); StdCall; external LCMS2_SO; +PROCEDURE cmsLab2XYZ(WhitePoint: LPcmsCIEXYZ; xyz: LPcmsCIEXYZ; Lab: LPcmsCIELab); StdCall; external LCMS2_SO; +PROCEDURE cmsXYZ2Lab(WhitePoint: LPcmsCIEXYZ; Lab: LPcmsCIELab; xyz: LPcmsCIEXYZ); StdCall; external LCMS2_SO; +PROCEDURE cmsLab2LCh(LCh: LPcmsCIELCh; Lab: LPcmsCIELab); StdCall; external LCMS2_SO; +PROCEDURE cmsLCh2Lab(Lab: LPcmsCIELab; LCh: LPcmsCIELCh); StdCall; external LCMS2_SO; +PROCEDURE cmsLabEncoded2Float(Lab: LPcmsCIELab; wLab: Pointer); StdCall; external LCMS2_SO; +PROCEDURE cmsLabEncoded2FloatV2(Lab: LPcmsCIELab; wLab: Pointer); StdCall; external LCMS2_SO; +PROCEDURE cmsFloat2LabEncoded(wLab: Pointer; Lab: LPcmsCIELab); StdCall; external LCMS2_SO; +PROCEDURE cmsFloat2LabEncodedV2(wLab: Pointer; Lab: LPcmsCIELab); StdCall; external LCMS2_SO; +PROCEDURE cmsXYZEncoded2Float(fxyz : LPcmsCIEXYZ; XYZ: Pointer); StdCall; external LCMS2_SO; +PROCEDURE cmsFloat2XYZEncoded(XYZ: Pointer; fXYZ: LPcmsCIEXYZ); StdCall; external LCMS2_SO; +FUNCTION cmsDeltaE(Lab1, Lab2: LPcmsCIELab): Double; StdCall; external LCMS2_SO; +FUNCTION cmsCIE94DeltaE(Lab1, Lab2: LPcmsCIELab): Double; StdCall; external LCMS2_SO; +FUNCTION cmsBFDdeltaE(Lab1, Lab2: LPcmsCIELab): Double; StdCall; external LCMS2_SO; +FUNCTION cmsCMCdeltaE(Lab1, Lab2: LPcmsCIELab): Double; StdCall; external LCMS2_SO; +FUNCTION cmsCIE2000DeltaE(Lab1, Lab2: LPcmsCIELab; Kl, Kc, Kh: Double): Double; StdCall; external LCMS2_SO; +FUNCTION cmsWhitePointFromTemp(var WhitePoint: cmsCIExyY; TempK: cmsFloat64Number) : cmsBool; StdCall; external LCMS2_SO; +FUNCTION cmsTempFromWhitePoint(var TeampK: cmsFloat64Number; var WhitePoint: cmsCIExyY) : cmsBool; StdCall; external LCMS2_SO; +FUNCTION cmsAdaptToIlluminant(Result: LPcmsCIEXYZ; SourceWhitePt: LPcmsCIEXYZ; + Illuminant: LPcmsCIEXYZ; Value: LPcmsCIEXYZ): cmsBool; StdCall; external LCMS2_SO; +FUNCTION cmsCIECAM02Init(pVC : LPcmsViewingConditions ) : Pointer; StdCall; external LCMS2_SO; +PROCEDURE cmsCIECAM02Done(hModel : Pointer); StdCall; external LCMS2_SO; +PROCEDURE cmsCIECAM02Forward(hModel: Pointer; pIn: LPcmsCIEXYZ; pOut: LPcmsJCh ); StdCall; external LCMS2_SO; +PROCEDURE cmsCIECAM02Reverse(hModel: Pointer; pIn: LPcmsJCh; pOut: LPcmsCIEXYZ ); StdCall; external LCMS2_SO; +FUNCTION cmsBuildSegmentedToneCurve(ContextID: cmsContext; nSegments: cmsInt32Number; Segments: LPcmsCurveSegmentArray): LPcmsToneCurve; StdCall; external LCMS2_SO; +FUNCTION cmsBuildParametricToneCurve(ContextID: cmsContext; CType: cmsInt32Number; Params: LPcmsFloat64NumberArray): LPcmsToneCurve; StdCall; external LCMS2_SO; +FUNCTION cmsBuildGamma(ContextID: cmsContext; Gamma: cmsFloat64Number): LPcmsToneCurve; StdCall; external LCMS2_SO; +FUNCTION cmsBuildTabulatedToneCurve16(ContextID: cmsContext; nEntries: cmsInt32Number; values: LPcmsUInt16NumberArray): LPcmsToneCurve; StdCall; external LCMS2_SO; +FUNCTION cmsBuildTabulatedToneCurveFloat(ContextID: cmsContext; nEntries: cmsUInt32Number; values: LPcmsFloat32NumberArray): LPcmsToneCurve; StdCall; external LCMS2_SO; +PROCEDURE cmsFreeToneCurve(Curve: LPcmsToneCurve); StdCall; external LCMS2_SO; +PROCEDURE cmsFreeToneCurveTriple(Curve: LPLPcmsToneCurveArray); StdCall; external LCMS2_SO; +FUNCTION cmsDupToneCurve(Src: LPcmsToneCurve): LPcmsToneCurve; StdCall; external LCMS2_SO; +FUNCTION cmsReverseToneCurve(InGamma: LPcmsToneCurve): LPcmsToneCurve; StdCall; external LCMS2_SO; +FUNCTION cmsReverseToneCurveEx(nResultSamples: cmsInt32Number; InGamma: LPcmsToneCurve): LPcmsToneCurve; StdCall; external LCMS2_SO; +FUNCTION cmsJoinToneCurve(ContextID: cmsContext; X, Y: LPcmsToneCurve; nPoints: cmsUInt32Number ): LPcmsToneCurve; StdCall; external LCMS2_SO; +FUNCTION cmsSmoothToneCurve(Tab: LPcmsToneCurve; lambda: cmsFloat64Number): cmsBool; StdCall; external LCMS2_SO; +FUNCTION cmsEvalToneCurveFloat(Curve: LPcmsToneCurve; v: cmsFloat32Number):cmsFloat32Number; StdCall; external LCMS2_SO; +FUNCTION cmsEvalToneCurve16(Curve: LPcmsToneCurve; v:cmsUInt16Number):cmsUInt16Number; StdCall; external LCMS2_SO; +FUNCTION cmsIsToneCurveMultisegment(InGamma: LPcmsToneCurve):cmsBool; StdCall; external LCMS2_SO; +FUNCTION cmsIsToneCurveLinear(Curve: LPcmsToneCurve):cmsBool; StdCall; external LCMS2_SO; +FUNCTION cmsIsToneCurveMonotonic(t: LPcmsToneCurve):cmsBool; StdCall; external LCMS2_SO; +FUNCTION cmsIsToneCurveDescending(t: LPcmsToneCurve):cmsBool; StdCall; external LCMS2_SO; +FUNCTION cmsGetToneCurveParametricType(t: LPcmsToneCurve):cmsInt32Number; StdCall; external LCMS2_SO; +FUNCTION cmsEstimateGamma(t: LPcmsToneCurve; Precision:cmsFloat64Number):cmsFloat64Number; StdCall; external LCMS2_SO; +FUNCTION cmsGetToneCurveEstimatedTableEntries(t: LPcmsToneCurve): cmsUInt32Number; StdCall; external LCMS2_SO; +FUNCTION cmsGetToneCurveEstimatedTable(t: LPcmsToneCurve): LPcmsUInt16Number; StdCall; external LCMS2_SO; +FUNCTION cmsPipelineAlloc(ContextID: cmsContext; InputChannels, OutputChannels: cmsUInt32Number): LPcmsPipeline; StdCall; external LCMS2_SO; +PROCEDURE cmsPipelineFree(lut: LPcmsPipeline); StdCall; external LCMS2_SO; +FUNCTION cmsPipelineDup(Orig: LPcmsPipeline): LPcmsPipeline; StdCall; external LCMS2_SO; +FUNCTION cmsGetPipelineContextID(lut: LPcmsPipeline) : cmsContext; StdCall; external LCMS2_SO; +FUNCTION cmsPipelineInputChannels(lut: LPcmsPipeline): cmsUInt32Number; StdCall; external LCMS2_SO; +FUNCTION cmsPipelineOutputChannels(lut: LPcmsPipeline): cmsUInt32Number; StdCall; external LCMS2_SO; +FUNCTION cmsPipelineStageCount(lut: LPcmsPipeline): cmsUInt32Number; StdCall; external LCMS2_SO; +FUNCTION cmsPipelineGetPtrToFirstStage(lut: LPcmsPipeline): LPcmsStage; StdCall; external LCMS2_SO; +FUNCTION cmsPipelineGetPtrToLastStage(lut: LPcmsPipeline): LPcmsStage; StdCall; external LCMS2_SO; + +PROCEDURE cmsPipelineEval16(Inv, Outv: LPcmsUInt16NumberArray; lut: LPcmsPipeline); StdCall; external LCMS2_SO; +PROCEDURE cmsPipelineEvalFloat(Inv, Outv: LPcmsFloat32NumberArray; lut: LPcmsPipeline); StdCall; external LCMS2_SO; + +FUNCTION cmsPipelineEvalReverseFloat(Target, Result, Hint: LPcmsFloat32NumberArray; lut: LPcmsPipeline): cmsBool; StdCall; external LCMS2_SO; +FUNCTION cmsPipelineCat(l1, l2: LPcmsPipeline): cmsBool; StdCall; external LCMS2_SO; +FUNCTION cmsPipelineSetSaveAs8bitsFlag(lut: LPcmsPipeline; On: cmsBool): cmsBool; StdCall; external LCMS2_SO; +PROCEDURE cmsPipelineInsertStage(lut: LPcmsPipeline; loc: cmsStageLoc; mpe: LPcmsStage); StdCall; external LCMS2_SO; +PROCEDURE cmsPipelineUnlinkStage(lut: LPcmsPipeline; loc: cmsStageLoc; mpe: LPLPcmsStage); StdCall; external LCMS2_SO; +FUNCTION cmsStageAllocIdentity(ContextID: cmsContext; nChannels: cmsUInt32Number): LPcmsStage; StdCall; external LCMS2_SO; +FUNCTION cmsStageAllocToneCurves(ContextID: cmsContext; nChannels: cmsUInt32Number; Curves: LPLPcmsToneCurveArray): LPcmsStage; StdCall; external LCMS2_SO; +FUNCTION cmsStageAllocMatrix(ContextID: cmsContext; Rows, Cols: cmsUInt32Number; Matrix, Offset: LPcmsFloat64NumberArray): LPcmsStage; StdCall; external LCMS2_SO; +FUNCTION cmsStageAllocCLut16bit(ContextID: cmsContext; nGridPoints: cmsUInt32Number; inputChan, outputChan: cmsUInt32Number; Table: LPcmsUInt16NumberArray): LPcmsStage; StdCall; external LCMS2_SO; +FUNCTION cmsStageAllocCLutFloat(ContextID: cmsContext; nGridPoints: cmsUInt32Number; inputChan, outputChan: cmsUInt32Number; Table: LPcmsFloat32NumberArray): LPcmsStage; StdCall; external LCMS2_SO; +FUNCTION cmsStageAllocCLut16bitGranular(ContextID: cmsContext; nGridPoints: LPcmsUInt32NumberArray; inputChan, outputChan: cmsUInt32Number; Table: LPcmsUInt16NumberArray): LPcmsStage; StdCall; external LCMS2_SO; +FUNCTION cmsStageAllocCLutFloatGranular(ContextID: cmsContext; nGridPoints: LPcmsUInt32NumberArray; inputChan, outputChan: cmsUInt32Number; Table: LPcmsFloat32NumberArray): LPcmsStage; StdCall; external LCMS2_SO; +FUNCTION cmsStageDup(mpe: LPcmsStage): LPcmsStage; StdCall; external LCMS2_SO; +PROCEDURE cmsStageFree(mpe: LPcmsStage); StdCall; external LCMS2_SO; +FUNCTION cmsStageNext(mpe: LPcmsStage): LPcmsStage; StdCall; external LCMS2_SO; +FUNCTION cmsStageInputChannels(mpe: LPcmsStage): cmsUInt32Number; StdCall; external LCMS2_SO; +FUNCTION cmsStageOutputChannels(mpe: LPcmsStage): cmsUInt32Number; StdCall; external LCMS2_SO; +FUNCTION cmsStageType(mpe: LPcmsStage): cmsStageSignature; StdCall; external LCMS2_SO; +FUNCTION cmsStageData(mpe: LPcmsStage): Pointer; StdCall; external LCMS2_SO; +FUNCTION cmsStageSampleCLut16bit(mpe: LPcmsStage; Sampler: cmsSAMPLER16; Cargo: Pointer; dwFlags: cmsUInt32Number): cmsBool; StdCall; external LCMS2_SO; +FUNCTION cmsStageSampleCLutFloat(mpe: LPcmsStage; Sampler: cmsSAMPLERFLOAT; Cargo: Pointer; dwFlags: cmsUInt32Number): cmsBool; StdCall; external LCMS2_SO; +FUNCTION cmsSliceSpace16(nInputs: cmsUInt32Number; clutPoints: LPcmsUInt32NumberArray; + Sampler: cmsSAMPLER16; Cargo: Pointer): cmsBool; StdCall; external LCMS2_SO; + +FUNCTION cmsSliceSpaceFloat(nInputs: cmsUInt32Number; clutPoints: LPcmsUInt32NumberArray; + Sampler: cmsSAMPLERFLOAT; Cargo: Pointer): cmsBool; StdCall; external LCMS2_SO; +FUNCTION cmsMLUalloc(ContextID: cmsContext; nItems: cmsUInt32Number): LPcmsMLU; StdCall; external LCMS2_SO; +PROCEDURE cmsMLUfree(mlu: LPcmsMLU); StdCall; external LCMS2_SO; +FUNCTION cmsMLUdup(mlu: LPcmsMLU): LPcmsMLU; StdCall; external LCMS2_SO; + +FUNCTION cmsMLUsetASCII(mlu: LPcmsMLU; LanguageCode, CountryCode, ASCIIString: PAnsiChar): cmsBool; StdCall; external LCMS2_SO; +FUNCTION cmsMLUsetWide(mlu: LPcmsMLU; LanguageCode, CountryCode: PAnsiChar; WideString: PWChar): cmsBool; StdCall; external LCMS2_SO; + +FUNCTION cmsMLUgetASCII(mlu: LPcmsMLU; LanguageCode, CountryCode: PAnsiChar; Buffer: PAnsiChar; BufferSize: cmsUInt32Number): cmsUInt32Number; StdCall; external LCMS2_SO; + +FUNCTION cmsMLUgetWide(mlu: LPcmsMLU; LanguageCode, CountryCode: PAnsiChar; Buffer: PWChar; BufferSize: cmsUInt32Number): cmsUInt32Number; StdCall; external LCMS2_SO; + +FUNCTION cmsMLUgetTranslation(mlu: LPcmsMLU; LanguageCode, CountryCode, ObtainedLanguage, ObtainedCountry: PAnsiChar): cmsBool; StdCall; external LCMS2_SO; + +FUNCTION cmsAllocNamedColorList(ContextID: cmsContext; n, ColorantCount :cmsUInt32Number; + Prefix, Suffix: PAnsiChar): LPcmsNAMEDCOLORLIST; StdCall; external LCMS2_SO; + +PROCEDURE cmsFreeNamedColorList(v: LPcmsNAMEDCOLORLIST); StdCall; external LCMS2_SO; +FUNCTION cmsDupNamedColorList(v: LPcmsNAMEDCOLORLIST): LPcmsNAMEDCOLORLIST; StdCall; external LCMS2_SO; +FUNCTION cmsAppendNamedColor(v: LPcmsNAMEDCOLORLIST; Name: PAnsiChar; + PCS, Colorant : LPcmsUInt16NumberArray): cmsBool; StdCall; external LCMS2_SO; + +FUNCTION cmsNamedColorCount(v: LPcmsNAMEDCOLORLIST): cmsUInt32Number; StdCall; external LCMS2_SO; +FUNCTION cmsNamedColorIndex(v: LPcmsNAMEDCOLORLIST; Name: PAnsiChar): cmsInt32Number; StdCall; external LCMS2_SO; + +FUNCTION cmsNamedColorInfo(v: LPcmsNAMEDCOLORLIST; nColor : cmsUInt32Number; + Name,Prefix, Suffix : PAnsiChar; + PCS, Colorant : LPcmsUInt16NumberArray): cmsBool; StdCall; external LCMS2_SO; + +FUNCTION cmsGetNamedColorList(xform: cmsHTRANSFORM ): LPcmsNAMEDCOLORLIST; StdCall; external LCMS2_SO; + +FUNCTION cmsAllocProfileSequenceDescription(ContextID: cmsContext; n: cmsUInt32Number):LPcmsSEQ; StdCall; external LCMS2_SO; +FUNCTION cmsDupProfileSequenceDescription(pseq: LPcmsSEQ):LPcmsSEQ; StdCall; external LCMS2_SO; +PROCEDURE cmsFreeProfileSequenceDescription(pseq: LPcmsSEQ); StdCall; external LCMS2_SO; + +FUNCTION cmsDictAlloc(ContextID: cmsContext): cmsHANDLE; StdCall; external LCMS2_SO; +PROCEDURE cmsDictFree(hDict: cmsHANDLE); StdCall; external LCMS2_SO; +FUNCTION cmsDictDup(hDict: cmsHANDLE): cmsHANDLE; StdCall; external LCMS2_SO; + +FUNCTION cmsDictAddEntry(hDict: cmsHANDLE; Name, Value: PWChar; DisplayName, DisplayValue : LPcmsMLU): cmsBool; StdCall; external LCMS2_SO; +FUNCTION cmsDictGetEntryList(hDict: cmsHANDLE): LPcmsDICTentry; StdCall; external LCMS2_SO; +FUNCTION cmsDictNextEntry(e : LPcmsDICTentry): LPcmsDICTentry; StdCall; external LCMS2_SO; + +FUNCTION cmsCreateProfilePlaceholder(ContextID: cmsContext): cmsHPROFILE; StdCall; external LCMS2_SO; + +FUNCTION cmsGetProfileContextID(hProfile: cmsHPROFILE):cmsContext; StdCall; external LCMS2_SO; +FUNCTION cmsGetTagCount(hProfile: cmsHPROFILE): cmsInt32Number; StdCall; external LCMS2_SO; +FUNCTION cmsGetTagSignature(hProfile: cmsHPROFILE; n: cmsUInt32Number): cmsTagSignature; StdCall; external LCMS2_SO; +FUNCTION cmsIsTag(hProfile: cmsHPROFILE; sig: cmsTagSignature ): cmsBool; StdCall; external LCMS2_SO; + +FUNCTION cmsReadTag(hProfile: cmsHPROFILE; sig: cmsTagSignature ): Pointer; StdCall; external LCMS2_SO; +FUNCTION cmsWriteTag(hProfile: cmsHPROFILE; sig: cmsTagSignature; data: Pointer): cmsBool; StdCall; external LCMS2_SO; +FUNCTION cmsLinkTag(hProfile: cmsHPROFILE; sig: cmsTagSignature; dest: cmsTagSignature): cmsBool; StdCall; external LCMS2_SO; +FUNCTION cmsTagLinkedTo(hProfile: cmsHPROFILE; sig: cmsTagSignature):cmsTagSignature; StdCall; external LCMS2_SO; + +FUNCTION cmsReadRawTag(hProfile: cmsHPROFILE; sig: cmsTagSignature; Buffer: Pointer; BufferSize: cmsUInt32Number): cmsInt32Number; StdCall; external LCMS2_SO; +FUNCTION cmsWriteRawTag(hProfile: cmsHPROFILE; sig: cmsTagSignature; data: Pointer; Size: cmsUInt32Number): cmsBool; StdCall; external LCMS2_SO; + +FUNCTION cmsGetHeaderFlags(hProfile: cmsHPROFILE): cmsUInt32Number; StdCall; external LCMS2_SO; +PROCEDURE cmsGetHeaderAttributes(hProfile: cmsHPROFILE; Flags: LPcmsUInt64Number); StdCall; external LCMS2_SO; +PROCEDURE cmsGetHeaderProfileID(hProfile: cmsHPROFILE; ProfileID: LPcmsUInt8Number); StdCall; external LCMS2_SO; + +FUNCTION cmsGetHeaderRenderingIntent(hProfile: cmsHPROFILE): cmsUInt32Number; StdCall; external LCMS2_SO; +PROCEDURE cmsSetHeaderFlags(hProfile: cmsHPROFILE; Flags: cmsUInt32Number); StdCall; external LCMS2_SO; +FUNCTION cmsGetHeaderManufacturer(hProfile: cmsHPROFILE): cmsUInt32Number; StdCall; external LCMS2_SO; +PROCEDURE cmsSetHeaderManufacturer(hProfile: cmsHPROFILE; manufacturer: cmsUInt32Number ); StdCall; external LCMS2_SO; +FUNCTION cmsGetHeaderModel(hProfile: cmsHPROFILE): cmsUInt32Number; StdCall; external LCMS2_SO; +PROCEDURE cmsSetHeaderModel(hProfile: cmsHPROFILE; model: cmsUInt32Number ); StdCall; external LCMS2_SO; +PROCEDURE cmsSetHeaderAttributes(hProfile: cmsHPROFILE; Flags: cmsUInt64Number); StdCall; external LCMS2_SO; +PROCEDURE cmsSetHeaderProfileID(hProfile: cmsHPROFILE; ProfileID: LPcmsUInt8Number); StdCall; external LCMS2_SO; +PROCEDURE cmsSetHeaderRenderingIntent(hProfile: cmsHPROFILE; RenderingIntent: cmsUInt32Number ); StdCall; external LCMS2_SO; + +FUNCTION cmsGetPCS(hProfile: cmsHPROFILE):cmsColorSpaceSignature; StdCall; external LCMS2_SO; +PROCEDURE cmsSetPCS(hProfile: cmsHPROFILE; pcs: cmsColorSpaceSignature); StdCall; external LCMS2_SO; +FUNCTION cmsGetColorSpace(hProfile: cmsHPROFILE): cmsColorSpaceSignature; StdCall; external LCMS2_SO; +PROCEDURE cmsSetColorSpace(hProfile: cmsHPROFILE; sig: cmsColorSpaceSignature); StdCall; external LCMS2_SO; +FUNCTION cmsGetDeviceClass(hProfile: cmsHPROFILE): cmsProfileClassSignature; StdCall; external LCMS2_SO; +PROCEDURE cmsSetDeviceClass(hProfile: cmsHPROFILE; sig: cmsProfileClassSignature); StdCall; external LCMS2_SO; +PROCEDURE cmsSetProfileVersion(hProfile: cmsHPROFILE; Version: cmsFloat64Number); StdCall; external LCMS2_SO; +FUNCTION cmsGetProfileVersion(hProfile: cmsHPROFILE): cmsFloat64Number; StdCall; external LCMS2_SO; + +FUNCTION cmsGetEncodedICCversion(hProfile: cmsHPROFILE): cmsUInt32Number; StdCall; external LCMS2_SO; +PROCEDURE cmsSetEncodedICCversion(hProfile: cmsHPROFILE; Version: cmsUInt32Number); StdCall; external LCMS2_SO; + + +FUNCTION cmsIsIntentSupported(hProfile: cmsHPROFILE; Intent: cmsUInt32Number; UsedDirection: cmsUInt32Number): cmsBool; StdCall; external LCMS2_SO; +FUNCTION cmsIsMatrixShaper(hProfile: cmsHPROFILE): cmsBool; StdCall; external LCMS2_SO; +FUNCTION cmsIsCLUT(hProfile: cmsHPROFILE; Intent: cmsUInt32Number; UsedDirection: cmsUInt32Number): cmsBool; StdCall; external LCMS2_SO; +FUNCTION _cmsICCcolorSpace(OurNotation: Integer): cmsColorSpaceSignature; StdCall; external LCMS2_SO; +FUNCTION _cmsLCMScolorSpace(ProfileSpace: cmsColorSpaceSignature): Integer; StdCall; external LCMS2_SO; + +FUNCTION cmsChannelsOf( ColorSpace: cmsColorSpaceSignature): cmsUInt32Number; StdCall; external LCMS2_SO; + +FUNCTION cmsFormatterForColorspaceOfProfile(hProfile: cmsHPROFILE; nBytes: cmsUInt32Number; lIsFloat: cmsBool): cmsUInt32Number; StdCall; external LCMS2_SO; +FUNCTION cmsFormatterForPCSOfProfile(hProfile: cmsHPROFILE; nBytes: cmsUInt32Number; lIsFloat: cmsBool): cmsUInt32Number; StdCall; external LCMS2_SO; + + +FUNCTION cmsGetProfileInfo(hProfile: cmsHPROFILE; Info: cmsInfoType; LanguageCode, CountryCode: PAnsiChar; + Buffer: PWChar; BufferSize: cmsUInt32Number): cmsUInt32Number; StdCall; external LCMS2_SO; + +FUNCTION cmsGetProfileInfoASCII(hProfile: cmsHPROFILE; Info: cmsInfoType; LanguageCode, CountryCode: PAnsiChar; + Buffer: PAnsiChar; BufferSize: cmsUInt32Number): cmsUInt32Number; StdCall; external LCMS2_SO; + + +FUNCTION cmsOpenIOhandlerFromFile(ContextID: cmsContext; FileName, AccessMode: PAnsiChar): LPcmsIOHANDLER; StdCall; external LCMS2_SO; +// FUNCTION cmsOpenIOhandlerFromStream(ContextID: cmsContext; FILE* Stream): LPcmsIOHANDLER; StdCall; external LCMS2_SO; +FUNCTION cmsOpenIOhandlerFromMem(ContextID: cmsContext; Buffer: Pointer; size: cmsUInt32Number; AccessMode: PAnsiChar): LPcmsIOHANDLER; StdCall; external LCMS2_SO; +FUNCTION cmsOpenIOhandlerFromNULL(ContextID: cmsContext): LPcmsIOHANDLER; StdCall; external LCMS2_SO; +FUNCTION cmsCloseIOhandler(io: LPcmsIOHANDLER): cmsBool; StdCall; external LCMS2_SO; + +FUNCTION cmsMD5computeID(hProfile: cmsHPROFILE): cmsBool; StdCall; external LCMS2_SO; + +FUNCTION cmsOpenProfileFromFile(ICCProfile : PAnsiChar; sAccess: PAnsiChar): cmsHPROFILE; StdCall; external LCMS2_SO; +FUNCTION cmsOpenProfileFromFileTHR(ContextID: cmsContext; ICCProfile, sAccess: PAnsiChar): cmsHPROFILE; StdCall; external LCMS2_SO; +// FUNCTION CMSEXPORT cmsOpenProfileFromStream(FILE* ICCProfile, const char* sAccess): cmsHPROFILE; StdCall; external LCMS2_SO; +// FUNCTION CMSEXPORT cmsOpenProfileFromStreamTHR(ContextID: cmsContext; FILE* ICCProfile, const char* sAccess): cmsHPROFILE; StdCall; external LCMS2_SO; +FUNCTION cmsOpenProfileFromMem(MemPtr: Pointer; dwSize: cmsUInt32Number): cmsHPROFILE; StdCall; external LCMS2_SO; +FUNCTION cmsOpenProfileFromMemTHR(ContextID: cmsContext; MemPtr: Pointer; dwSize: cmsUInt32Number): cmsHPROFILE; StdCall; external LCMS2_SO; +FUNCTION cmsOpenProfileFromIOhandlerTHR(ContextID: cmsContext; io: LPcmsIOHANDLER): cmsHPROFILE; StdCall; external LCMS2_SO; +FUNCTION cmsCloseProfile(hProfile: cmsHPROFILE): cmsBool; StdCall; external LCMS2_SO; + +FUNCTION cmsSaveProfileToFile(hProfile: cmsHPROFILE; FileName: PAnsiChar): cmsBool; StdCall; external LCMS2_SO; +// FUNCTION CMSEXPORT cmsSaveProfileToStream(hProfile: cmsHPROFILE, FILE* Stream): cmsBool; StdCall; external LCMS2_SO; +FUNCTION cmsSaveProfileToMem(hProfile: cmsHPROFILE; MemPtr: Pointer; BytesNeeded: LPcmsUInt32Number): cmsBool; StdCall; external LCMS2_SO; +FUNCTION cmsSaveProfileToIOhandler(hProfile: cmsHPROFILE; io: LPcmsIOHANDLER):cmsUInt32Number; StdCall; external LCMS2_SO; + +FUNCTION cmsCreateRGBProfileTHR(ContextID: cmsContext; + WhitePoint: LPcmsCIExyY; + Primaries: LPcmsCIExyYTRIPLE; + TransferFunction: LPLPcmsToneCurveArray): cmsHPROFILE; StdCall; external LCMS2_SO; + +FUNCTION cmsCreateRGBProfile(WhitePoint: LPcmsCIExyY; + Primaries: LPcmsCIExyYTRIPLE; + TransferFunction: LPLPcmsToneCurveArray): cmsHPROFILE; StdCall; external LCMS2_SO; + +FUNCTION cmsCreateGrayProfileTHR(ContextID: cmsContext; + WhitePoint: LPcmsCIExyY; + TransferFunction: LPcmsToneCurve): cmsHPROFILE; StdCall; external LCMS2_SO; + +FUNCTION cmsCreateGrayProfile(WhitePoint: LPcmsCIExyY; + TransferFunction: LPcmsToneCurve): cmsHPROFILE; StdCall; external LCMS2_SO; + +FUNCTION cmsCreateLinearizationDeviceLinkTHR(ContextID: cmsContext; + ColorSpace: cmsColorSpaceSignature; + TransferFunctions: LPLPcmsToneCurveArray): cmsHPROFILE; StdCall; external LCMS2_SO; + +FUNCTION cmsCreateLinearizationDeviceLink(ColorSpace: cmsColorSpaceSignature; + TransferFunctions: LPLPcmsToneCurveArray): cmsHPROFILE; StdCall; external LCMS2_SO; + +FUNCTION cmsCreateInkLimitingDeviceLinkTHR(ContextID: cmsContext; + ColorSpace: cmsColorSpaceSignature; Limit: cmsFloat64Number): cmsHPROFILE; StdCall; external LCMS2_SO; + +FUNCTION cmsCreateInkLimitingDeviceLink(ColorSpace: cmsColorSpaceSignature; Limit: cmsFloat64Number): cmsHPROFILE; StdCall; external LCMS2_SO; + + +FUNCTION cmsCreateLab2ProfileTHR(ContextID: cmsContext; WhitePoint: LPcmsCIExyY): cmsHPROFILE; StdCall; external LCMS2_SO; +FUNCTION cmsCreateLab2Profile(WhitePoint: LPcmsCIExyY): cmsHPROFILE; StdCall; external LCMS2_SO; +FUNCTION cmsCreateLab4ProfileTHR(ContextID: cmsContext; WhitePoint: LPcmsCIExyY): cmsHPROFILE; StdCall; external LCMS2_SO; +FUNCTION cmsCreateLab4Profile(WhitePoint: LPcmsCIExyY): cmsHPROFILE; StdCall; external LCMS2_SO; + +FUNCTION cmsCreateXYZProfileTHR(ContextID: cmsContext): cmsHPROFILE; StdCall; external LCMS2_SO; +FUNCTION cmsCreateXYZProfile: cmsHPROFILE; StdCall; external LCMS2_SO; + +FUNCTION cmsCreate_sRGBProfileTHR(ContextID: cmsContext): cmsHPROFILE; StdCall; external LCMS2_SO; +FUNCTION cmsCreate_sRGBProfile: cmsHPROFILE; StdCall; external LCMS2_SO; + +FUNCTION cmsCreateBCHSWabstractProfileTHR(ContextID: cmsContext; + nLUTPoints: Integer; + Bright, + Contrast, + Hue, + Saturation: cmsFloat64Number; + TempSrc, + TempDest: Integer): cmsHPROFILE; StdCall; external LCMS2_SO; + +FUNCTION cmsCreateBCHSWabstractProfile( nLUTPoints: Integer; + Bright, + Contrast, + Hue, + Saturation: cmsFloat64Number; + TempSrc, + TempDest: Integer): cmsHPROFILE; StdCall; external LCMS2_SO; + +FUNCTION cmsCreateNULLProfileTHR(ContextID: cmsContext): cmsHPROFILE; StdCall; external LCMS2_SO; +FUNCTION cmsCreateNULLProfile: cmsHPROFILE; StdCall; external LCMS2_SO; + +// Converts a transform to a devicelink profile +FUNCTION cmsTransform2DeviceLink(hTransform: cmsHTRANSFORM; Version: cmsFloat64Number; dwFlags: cmsUInt32Number): cmsHPROFILE; StdCall; external LCMS2_SO; + +// Call with NULL as parameters to get the intent count +FUNCTION cmsGetSupportedIntents(nMax: cmsUInt32Number; Codes: LPcmsUInt32Number; Descriptions: LPPAnsiChar): cmsUInt32Number; StdCall; external LCMS2_SO; + +FUNCTION cmsFLAGS_GRIDPOINTS(n: Integer): Integer; begin cmsFLAGS_GRIDPOINTS := (((n) and $FF) shl 16) end; + + +FUNCTION cmsCreateTransformTHR(ContextID: cmsContext; + Input: cmsHPROFILE; + InputFormat: cmsUInt32Number; + Output: cmsHPROFILE; + OutputFormat: cmsUInt32Number; + Intent: cmsUInt32Number; + dwFlags: cmsUInt32Number): cmsHTRANSFORM; StdCall; external LCMS2_SO; + +FUNCTION cmsCreateTransform(Input: cmsHPROFILE; + InputFormat: cmsUInt32Number; + Output: cmsHPROFILE; + OutputFormat: cmsUInt32Number; + Intent: cmsUInt32Number; + dwFlags: cmsUInt32Number): cmsHTRANSFORM; StdCall; external LCMS2_SO; + +FUNCTION cmsCreateProofingTransformTHR(ContextID: cmsContext; + Input: cmsHPROFILE; + InputFormat: cmsUInt32Number; + Output: cmsHPROFILE; + OutputFormat: cmsUInt32Number; + Proofing: cmsHPROFILE; + Intent: cmsUInt32Number; + ProofingIntent: cmsUInt32Number; + dwFlags: cmsUInt32Number): cmsHTRANSFORM; StdCall; external LCMS2_SO; + +FUNCTION cmsCreateProofingTransform(Input: cmsHPROFILE; + InputFormat: cmsUInt32Number; + Output: cmsHPROFILE; + OutputFormat: cmsUInt32Number; + Proofing: cmsHPROFILE; + Intent: cmsUInt32Number; + ProofingIntent: cmsUInt32Number; + dwFlags: cmsUInt32Number): cmsHTRANSFORM; StdCall; external LCMS2_SO; + +FUNCTION cmsCreateMultiprofileTransformTHR(ContextID: cmsContext; + hProfiles: LPcmsHPROFILEArray; + nProfiles: cmsUInt32Number; + InputFormat: cmsUInt32Number; + OutputFormat: cmsUInt32Number; + Intent: cmsUInt32Number; + dwFlags: cmsUInt32Number): cmsHTRANSFORM; StdCall; external LCMS2_SO; + + +FUNCTION cmsCreateMultiprofileTransform( hProfiles: LPcmsHPROFILEArray; + nProfiles: cmsUInt32Number; + InputFormat: cmsUInt32Number; + OutputFormat: cmsUInt32Number; + Intent: cmsUInt32Number; + dwFlags: cmsUInt32Number): cmsHTRANSFORM; StdCall; external LCMS2_SO; + + +FUNCTION cmsCreateExtendedTransform(ContextID: cmsContext; + nProfiles: cmsUInt32Number; + hProfiles: LPcmsHPROFILEArray; + BPC: LPcmsBoolArray; + Intents: LPcmsUInt32NumberArray; + AdaptationStates: LPcmsFloat64NumberArray; + hGamutProfile: cmsHPROFILE; + nGamutPCSposition: cmsUInt32Number; + InputFormat, + OutputFormat: cmsUInt32Number; + dwFlags: cmsUInt32Number): cmsHTRANSFORM; StdCall; external LCMS2_SO; + +PROCEDURE cmsDeleteTransform(hTransform: cmsHTRANSFORM); StdCall; external LCMS2_SO; + +PROCEDURE cmsDoTransform(Transform: cmsHTRANSFORM; InputBuffer, OutputBuffer: Pointer; size: cmsUInt32Number); StdCall; external LCMS2_SO; +PROCEDURE cmsDoTransformStride(Transform: cmsHTRANSFORM; InputBuffer, OutputBuffer: Pointer; size: cmsUInt32Number; stride: cmsUInt32Number); StdCall; external LCMS2_SO; +PROCEDURE cmsSetAlarmCodes( NewAlarm: LPcmsUInt16NumberArray); StdCall; external LCMS2_SO; +PROCEDURE cmsGetAlarmCodes(NewAlarm: LPcmsUInt16NumberArray); StdCall; external LCMS2_SO; + +// Adaptation state for absolute colorimetric intent +FUNCTION cmsSetAdaptationState(d: cmsFloat64Number):cmsFloat64Number; StdCall; external LCMS2_SO; + +// Grab the ContextID from an open transform. Returns NULL if a NULL transform is passed +FUNCTION cmsGetTransformContextID(hTransform: cmsHTRANSFORM):cmsContext; StdCall; external LCMS2_SO; + +// For backwards compatibility +FUNCTION cmsChangeBuffersFormat(hTransform: cmsHTRANSFORM; InputFormat, OutputFormat: cmsUInt32Number): cmsBool; StdCall; external LCMS2_SO; + + +// lcms2 unified method to access postscript color resources +FUNCTION cmsGetPostScriptColorResource(ContextID: cmsContext; RType: cmsPSResourceType; + hProfile: cmsHPROFILE; + Intent: cmsUInt32Number; + dwFlags: cmsUInt32Number; + io: LPcmsIOHANDLER): cmsUInt32Number; StdCall; external LCMS2_SO; + +FUNCTION cmsGetPostScriptCSA(ContextID: cmsContext; hProfile: cmsHPROFILE; Intent: cmsUInt32Number; dwFlags: cmsUInt32Number; Buffer: Pointer; dwBufferLen: cmsUInt32Number ): cmsUInt32Number; StdCall; external LCMS2_SO; +FUNCTION cmsGetPostScriptCRD(ContextID: cmsContext; hProfile: cmsHPROFILE; Intent: cmsUInt32Number; dwFlags: cmsUInt32Number; Buffer: Pointer; dwBufferLen: cmsUInt32Number): cmsUInt32Number; StdCall; external LCMS2_SO; + + +// CGATS.13 parser + +FUNCTION cmsIT8Alloc: cmsHANDLE; StdCall; external LCMS2_SO; +PROCEDURE cmsIT8Free(hIT8: cmsHANDLE); StdCall; external LCMS2_SO; + +// Tables + +FUNCTION cmsIT8TableCount(hIT8: cmsHANDLE): Integer; StdCall; external LCMS2_SO; +FUNCTION cmsIT8SetTable(hIT8: cmsHANDLE; nTable: Integer): Integer; StdCall; external LCMS2_SO; + +// Persistence +FUNCTION cmsIT8LoadFromFile(cFileName: PAnsiChar): cmsHANDLE; StdCall; external LCMS2_SO; +FUNCTION cmsIT8LoadFromMem(Ptr: Pointer; size :DWord): cmsHANDLE; StdCall; external LCMS2_SO; + +FUNCTION cmsIT8SaveToFile(hIT8: cmsHANDLE; cFileName: PAnsiChar): cmsBool; StdCall; external LCMS2_SO; +FUNCTION cmsIT8SaveToMem(hIT8: cmsHANDLE; MemPtr: Pointer; BytesNeeded: LPcmsUInt32Number): cmsBool; StdCall; external LCMS2_SO; +// Properties + +FUNCTION cmsIT8GetSheetType(hIT8: cmsHANDLE): PAnsiChar; StdCall; external LCMS2_SO; +FUNCTION cmsIT8SetSheetType(hIT8: cmsHANDLE; TheType: PAnsiChar): cmsBool; StdCall; external LCMS2_SO; + +FUNCTION cmsIT8SetComment(hIT8: cmsHANDLE; cComment: PAnsiChar): cmsBool; StdCall; external LCMS2_SO; + +FUNCTION cmsIT8SetPropertyStr(hIT8: cmsHANDLE; cProp, Str: PAnsiChar): cmsBool; StdCall; external LCMS2_SO; +FUNCTION cmsIT8SetPropertyDbl(hIT8: cmsHANDLE; cProp: PAnsiChar; Val: Double): cmsBool; StdCall; external LCMS2_SO; +FUNCTION cmsIT8SetPropertyHex(hIT8: cmsHANDLE; cProp: PAnsiChar; Val: Integer): cmsBool; StdCall; external LCMS2_SO; +FUNCTION cmsIT8SetPropertyUncooked(hIT8: cmsHANDLE; Key, Buffer: PAnsiChar): cmsBool; StdCall; external LCMS2_SO; + + +FUNCTION cmsIT8GetProperty(hIT8: cmsHANDLE; cProp: PAnsiChar): PAnsiChar; StdCall; external LCMS2_SO; +FUNCTION cmsIT8GetPropertyDbl(hIT8: cmsHANDLE; cProp: PAnsiChar): Double; StdCall; external LCMS2_SO; +FUNCTION cmsIT8EnumProperties(hIT8: cmsHANDLE; var PropertyNames: LPPAnsiChar): Integer; StdCall; external LCMS2_SO; + +// Datasets + +FUNCTION cmsIT8GetDataRowCol(hIT8: cmsHANDLE; row, col: Integer): PAnsiChar; StdCall; external LCMS2_SO; +FUNCTION cmsIT8GetDataRowColDbl(hIT8: cmsHANDLE; row, col: Integer): Double; StdCall; external LCMS2_SO; + +FUNCTION cmsIT8SetDataRowCol(hIT8: cmsHANDLE; row, col: Integer; Val: PAnsiChar): cmsBool; StdCall; external LCMS2_SO; +FUNCTION cmsIT8SetDataRowColDbl(hIT8: cmsHANDLE; row, col: Integer; Val: Double): cmsBool; StdCall; external LCMS2_SO; + +FUNCTION cmsIT8GetData(hIT8: cmsHANDLE; cPatch, cSample: PAnsiChar): PAnsiChar; StdCall; external LCMS2_SO; + +FUNCTION cmsIT8GetDataDbl(hIT8: cmsHANDLE;cPatch, cSample: PAnsiChar): Double; StdCall; external LCMS2_SO; + +FUNCTION cmsIT8SetData(hIT8: cmsHANDLE; cPatch, cSample, Val: PAnsiChar): cmsBool; StdCall; external LCMS2_SO; + +FUNCTION cmsIT8SetDataDbl(hIT8: cmsHANDLE; cPatch, cSample: PAnsiChar; Val: Double): cmsBool; StdCall; external LCMS2_SO; + +FUNCTION cmsIT8SetDataFormat(hIT8: cmsHANDLE; n: Integer; Sample: PAnsiChar): cmsBool; StdCall; external LCMS2_SO; +FUNCTION cmsIT8EnumDataFormat(hIT8: cmsHANDLE; var SampleNames: LPPAnsiChar): Integer; StdCall; external LCMS2_SO; +FUNCTION cmsIT8GetPatchName(hIT8: cmsHANDLE; nPatch: Integer; Buffer: PAnsiChar): PAnsiChar; StdCall; external LCMS2_SO; + +// The LABEL extension + +FUNCTION cmsIT8SetTableByLabel(hIT8: cmsHANDLE; cSet, cField, ExpectedType: PAnsiChar): Integer; StdCall; external LCMS2_SO; + +FUNCTION cmsIT8FindDataFormat(hIT8: cmsHANDLE; cSample: PAnsiChar): Integer; StdCall; external LCMS2_SO; + +// Formatter for double +PROCEDURE cmsIT8DefineDblFormat(hIT8: cmsHANDLE; Formatter: PAnsiChar); StdCall; external LCMS2_SO; + +FUNCTION cmsGBDAlloc(ContextID: cmsContext):cmsHANDLE; StdCall; external LCMS2_SO; +PROCEDURE cmsGBDFree(hGBD: cmsHANDLE); StdCall; external LCMS2_SO; +FUNCTION cmsGDBAddPoint(hGBD: cmsHANDLE; Lab: LPcmsCIELab): cmsBool; StdCall; external LCMS2_SO; +FUNCTION cmsGDBCompute(hGDB: cmsHANDLE; dwFlags: cmsUInt32Number): cmsBool; StdCall; external LCMS2_SO; +FUNCTION cmsGDBCheckPoint(hGBD: cmsHANDLE; Lab: LPcmsCIELab): cmsBool; StdCall; external LCMS2_SO; + +FUNCTION cmsDetectBlackPoint( BlackPoint: LPcmsCIEXYZ; hProfile: cmsHPROFILE; Intent: cmsUInt32Number; dwFlags: cmsUInt32Number): cmsBool; StdCall; external LCMS2_SO; +FUNCTION cmsDetectDestinationBlackPoint( BlackPoint: LPcmsCIEXYZ; hProfile: cmsHPROFILE; Intent: cmsUInt32Number; dwFlags: cmsUInt32Number): cmsBool; StdCall; external LCMS2_SO; + +FUNCTION cmsDetectTAC(hProfile: cmsHPROFILE): cmsFloat64Number; StdCall; external LCMS2_SO; + +FUNCTION cmsDesaturateLab(Lab: LPcmsCIELab; amax, amin, bmax, bmin: cmsFloat64Number): cmsBool; StdCall; external LCMS2_SO; + +END. diff --git a/local/recipes/libs/lcms2/source/utils/jpgicc/LICENSE_iccjpeg b/local/recipes/libs/lcms2/source/utils/jpgicc/LICENSE_iccjpeg new file mode 100755 index 0000000000..dffd80b51e --- /dev/null +++ b/local/recipes/libs/lcms2/source/utils/jpgicc/LICENSE_iccjpeg @@ -0,0 +1,67 @@ + +THIS LICENSE APPLIES ONLY TO iccjpeg.c file +----- +In plain English: + +1. We don't promise that this software works. (But if you find any bugs, + please let us know!) +2. You can use this software for whatever you want. You don't have to pay us. +3. You may not pretend that you wrote this software. If you use it in a + program, you must acknowledge somewhere in your documentation that + you've used the IJG code. + +In legalese: + +The authors make NO WARRANTY or representation, either express or implied, +with respect to this software, its quality, accuracy, merchantability, or +fitness for a particular purpose. This software is provided "AS IS", and you, +its user, assume the entire risk as to its quality and accuracy. + +This software is copyright (C) 1991-2013, Thomas G. Lane, Guido Vollbeding. +All Rights Reserved except as specified below. + +Permission is hereby granted to use, copy, modify, and distribute this +software (or portions thereof) for any purpose, without fee, subject to these +conditions: +(1) If any part of the source code for this software is distributed, then this +README file must be included, with this copyright and no-warranty notice +unaltered; and any additions, deletions, or changes to the original files +must be clearly indicated in accompanying documentation. +(2) If only executable code is distributed, then the accompanying +documentation must state that "this software is based in part on the work of +the Independent JPEG Group". +(3) Permission for use of this software is granted only if the user accepts +full responsibility for any undesirable consequences; the authors accept +NO LIABILITY for damages of any kind. + +These conditions apply to any software derived from or based on the IJG code, +not just to the unmodified library. If you use our work, you ought to +acknowledge us. + +Permission is NOT granted for the use of any IJG author's name or company name +in advertising or publicity relating to this software or products derived from +it. This software may be referred to only as "the Independent JPEG Group's +software". + +We specifically permit and encourage the use of this software as the basis of +commercial products, provided that all warranty or liability claims are +assumed by the product vendor. + + +The Unix configuration script "configure" was produced with GNU Autoconf. +It is copyright by the Free Software Foundation but is freely distributable. +The same holds for its supporting scripts (config.guess, config.sub, +ltmain.sh). Another support script, install-sh, is copyright by X Consortium +but is also freely distributable. + +The IJG distribution formerly included code to read and write GIF files. +To avoid entanglement with the Unisys LZW patent, GIF reading support has +been removed altogether, and the GIF writer has been simplified to produce +"uncompressed GIFs". This technique does not use the LZW algorithm; the +resulting GIF files are larger than usual, but are readable by all standard +GIF decoders. + +We are required to state that + "The Graphics Interchange Format(c) is the Copyright property of + CompuServe Incorporated. GIF(sm) is a Service Mark property of + CompuServe Incorporated." diff --git a/local/recipes/libs/lcms2/source/utils/jpgicc/Makefile.am b/local/recipes/libs/lcms2/source/utils/jpgicc/Makefile.am new file mode 100644 index 0000000000..d0a0897f3d --- /dev/null +++ b/local/recipes/libs/lcms2/source/utils/jpgicc/Makefile.am @@ -0,0 +1,22 @@ +# +# Makefile for building jpegicc +# Written by Bob Friesenhahn, June 2003 +# Bugs introduced by Marti Maria on October 2004 + +# Don't require all the GNU mandated files +AUTOMAKE_OPTIONS = 1.7 foreign no-dependencies + +AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include \ + -I$(top_srcdir)/utils/common -I$(top_builddir)/utils/common +if HasJPEG +bin_PROGRAMS = jpgicc +else +bin_PROGRAMS = +endif + +jpgicc_LDADD = $(top_builddir)/src/liblcms2.la @JPEGICC_DEPLIBS@ +jpgicc_LDFLAGS = @LDFLAGS@ +jpgicc_SOURCES = jpgicc.c iccjpeg.c ../common/xgetopt.c ../common/vprf.c ../common/utils.h +man_MANS = jpgicc.1 + +EXTRA_DIST = iccjpeg.h $(man_MANS) diff --git a/local/recipes/libs/lcms2/source/utils/jpgicc/Makefile.in b/local/recipes/libs/lcms2/source/utils/jpgicc/Makefile.in new file mode 100644 index 0000000000..10b118390c --- /dev/null +++ b/local/recipes/libs/lcms2/source/utils/jpgicc/Makefile.in @@ -0,0 +1,751 @@ +# Makefile.in generated by automake 1.18.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2025 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# +# Makefile for building jpegicc +# Written by Bob Friesenhahn, June 2003 +# Bugs introduced by Marti Maria on October 2004 + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +am__rm_f = rm -f $(am__rm_f_notfound) +am__rm_rf = rm -rf $(am__rm_f_notfound) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +@HasJPEG_TRUE@bin_PROGRAMS = jpgicc$(EXEEXT) +subdir = utils/jpgicc +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_append_compile_flags.m4 \ + $(top_srcdir)/m4/ax_append_flag.m4 \ + $(top_srcdir)/m4/ax_check_compile_flag.m4 \ + $(top_srcdir)/m4/ax_gcc_func_attribute.m4 \ + $(top_srcdir)/m4/ax_pthread.m4 \ + $(top_srcdir)/m4/ax_require_defined.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" +PROGRAMS = $(bin_PROGRAMS) +am__dirstamp = $(am__leading_dot)dirstamp +am_jpgicc_OBJECTS = jpgicc.$(OBJEXT) iccjpeg.$(OBJEXT) \ + ../common/xgetopt.$(OBJEXT) ../common/vprf.$(OBJEXT) +jpgicc_OBJECTS = $(am_jpgicc_OBJECTS) +jpgicc_DEPENDENCIES = $(top_builddir)/src/liblcms2.la +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +jpgicc_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(jpgicc_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ +depcomp = +am__maybe_remake_depfiles = +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(jpgicc_SOURCES) +DIST_SOURCES = $(jpgicc_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && echo $$files | $(am__xargs_n) 40 $(am__rm_f); }; \ + } +man1dir = $(mandir)/man1 +NROFF = nroff +MANS = $(man_MANS) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +am__DIST_COMMON = $(srcdir)/Makefile.in +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ETAGS = @ETAGS@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FILECMD = @FILECMD@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +JPEGICC_DEPLIBS = @JPEGICC_DEPLIBS@ +LCMS_LIB_DEPLIBS = @LCMS_LIB_DEPLIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBRARY_AGE = @LIBRARY_AGE@ +LIBRARY_CURRENT = @LIBRARY_CURRENT@ +LIBRARY_REVISION = @LIBRARY_REVISION@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_DEPS = @LIBTOOL_DEPS@ +LIB_JPEG = @LIB_JPEG@ +LIB_MATH = @LIB_MATH@ +LIB_PLUGINS = @LIB_PLUGINS@ +LIB_THREAD = @LIB_THREAD@ +LIB_TIFF = @LIB_TIFF@ +LIB_ZLIB = @LIB_ZLIB@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_CXX = @PTHREAD_CXX@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +TIFFICC_DEPLIBS = @TIFFICC_DEPLIBS@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__rm_f_notfound = @am__rm_f_notfound@ +am__tar = @am__tar@ +am__untar = @am__untar@ +am__xargs_n = @am__xargs_n@ +ax_pthread_config = @ax_pthread_config@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +inline = @inline@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +# Don't require all the GNU mandated files +AUTOMAKE_OPTIONS = 1.7 foreign no-dependencies +AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include \ + -I$(top_srcdir)/utils/common -I$(top_builddir)/utils/common + +jpgicc_LDADD = $(top_builddir)/src/liblcms2.la @JPEGICC_DEPLIBS@ +jpgicc_LDFLAGS = @LDFLAGS@ +jpgicc_SOURCES = jpgicc.c iccjpeg.c ../common/xgetopt.c ../common/vprf.c ../common/utils.h +man_MANS = jpgicc.1 +EXTRA_DIST = iccjpeg.h $(man_MANS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign utils/jpgicc/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign utils/jpgicc/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ + fi; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p \ + || test -f $$p1 \ + ; then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' \ + -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' \ + `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && $(am__rm_f) $$files + +clean-binPROGRAMS: + $(am__rm_f) $(bin_PROGRAMS) + test -z "$(EXEEXT)" || $(am__rm_f) $(bin_PROGRAMS:$(EXEEXT)=) +../common/$(am__dirstamp): + @$(MKDIR_P) ../common + @: >>../common/$(am__dirstamp) +../common/xgetopt.$(OBJEXT): ../common/$(am__dirstamp) +../common/vprf.$(OBJEXT): ../common/$(am__dirstamp) + +jpgicc$(EXEEXT): $(jpgicc_OBJECTS) $(jpgicc_DEPENDENCIES) $(EXTRA_jpgicc_DEPENDENCIES) + @rm -f jpgicc$(EXEEXT) + $(AM_V_CCLD)$(jpgicc_LINK) $(jpgicc_OBJECTS) $(jpgicc_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + -rm -f ../common/*.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +.c.o: + $(AM_V_CC)$(COMPILE) -c -o $@ $< + +.c.obj: + $(AM_V_CC)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: + $(AM_V_CC)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-man1: $(man_MANS) + @$(NORMAL_INSTALL) + @list1=''; \ + list2='$(man_MANS)'; \ + test -n "$(man1dir)" \ + && test -n "`echo $$list1$$list2`" \ + || exit 0; \ + echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ + { for i in $$list1; do echo "$$i"; done; \ + if test -n "$$list2"; then \ + for i in $$list2; do echo "$$i"; done \ + | sed -n '/\.1[a-z]*$$/p'; \ + fi; \ + } | while read p; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; echo "$$p"; \ + done | \ + sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ + sed 'N;N;s,\n, ,g' | { \ + list=; while read file base inst; do \ + if test "$$base" = "$$inst"; then list="$$list $$file"; else \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ + fi; \ + done; \ + for i in $$list; do echo "$$i"; done | $(am__base_list) | \ + while read files; do \ + test -z "$$files" || { \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ + done; } + +uninstall-man1: + @$(NORMAL_UNINSTALL) + @list=''; test -n "$(man1dir)" || exit 0; \ + files=`{ for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ + dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) $(MANS) +installdirs: + for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -$(am__rm_f) $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || $(am__rm_f) $(CONFIG_CLEAN_VPATH_FILES) + -$(am__rm_f) ../common/$(am__dirstamp) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-man + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-binPROGRAMS + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: install-man1 + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-binPROGRAMS uninstall-man + +uninstall-man: uninstall-man1 + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ + clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \ + ctags ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-binPROGRAMS \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man install-man1 \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \ + uninstall-binPROGRAMS uninstall-man uninstall-man1 + +.PRECIOUS: Makefile + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: + +# Tell GNU make to disable its built-in pattern rules. +%:: %,v +%:: RCS/%,v +%:: RCS/% +%:: s.% +%:: SCCS/s.% diff --git a/local/recipes/libs/lcms2/source/utils/jpgicc/iccjpeg.c b/local/recipes/libs/lcms2/source/utils/jpgicc/iccjpeg.c new file mode 100644 index 0000000000..d08b4bd081 --- /dev/null +++ b/local/recipes/libs/lcms2/source/utils/jpgicc/iccjpeg.c @@ -0,0 +1,248 @@ +/* + * iccprofile.c + * + * This file provides code to read and write International Color Consortium + * (ICC) device profiles embedded in JFIF JPEG image files. The ICC has + * defined a standard format for including such data in JPEG "APP2" markers. + * The code given here does not know anything about the internal structure + * of the ICC profile data; it just knows how to put the profile data into + * a JPEG file being written, or get it back out when reading. + * + * This code depends on new features added to the IJG JPEG library as of + * IJG release 6b; it will not compile or work with older IJG versions. + * + * NOTE: this code would need surgery to work on 16-bit-int machines + * with ICC profiles exceeding 64K bytes in size. If you need to do that, + * change all the "unsigned int" variables to "INT32". You'll also need + * to find a malloc() replacement that can allocate more than 64K. + */ + +#include "iccjpeg.h" +#include /* define malloc() */ + + +/* + * Since an ICC profile can be larger than the maximum size of a JPEG marker + * (64K), we need provisions to split it into multiple markers. The format + * defined by the ICC specifies one or more APP2 markers containing the + * following data: + * Identifying string ASCII "ICC_PROFILE\0" (12 bytes) + * Marker sequence number 1 for first APP2, 2 for next, etc (1 byte) + * Number of markers Total number of APP2's used (1 byte) + * Profile data (remainder of APP2 data) + * Decoders should use the marker sequence numbers to reassemble the profile, + * rather than assuming that the APP2 markers appear in the correct sequence. + */ + +#define ICC_MARKER (JPEG_APP0 + 2) /* JPEG marker code for ICC */ +#define ICC_OVERHEAD_LEN 14 /* size of non-profile data in APP2 */ +#define MAX_BYTES_IN_MARKER 65533 /* maximum data len of a JPEG marker */ +#define MAX_DATA_BYTES_IN_MARKER (MAX_BYTES_IN_MARKER - ICC_OVERHEAD_LEN) + + +/* + * This routine writes the given ICC profile data into a JPEG file. + * It *must* be called AFTER calling jpeg_start_compress() and BEFORE + * the first call to jpeg_write_scanlines(). + * (This ordering ensures that the APP2 marker(s) will appear after the + * SOI and JFIF or Adobe markers, but before all else.) + */ + +void +write_icc_profile (j_compress_ptr cinfo, + const JOCTET *icc_data_ptr, + unsigned int icc_data_len) +{ + unsigned int num_markers; /* total number of markers we'll write */ + int cur_marker = 1; /* per spec, counting starts at 1 */ + unsigned int length; /* number of bytes to write in this marker */ + + /* Calculate the number of markers we'll need, rounding up of course */ + num_markers = icc_data_len / MAX_DATA_BYTES_IN_MARKER; + if (num_markers * MAX_DATA_BYTES_IN_MARKER != icc_data_len) + num_markers++; + + while (icc_data_len > 0) { + /* length of profile to put in this marker */ + length = icc_data_len; + if (length > MAX_DATA_BYTES_IN_MARKER) + length = MAX_DATA_BYTES_IN_MARKER; + icc_data_len -= length; + + /* Write the JPEG marker header (APP2 code and marker length) */ + jpeg_write_m_header(cinfo, ICC_MARKER, + (unsigned int) (length + ICC_OVERHEAD_LEN)); + + /* Write the marker identifying string "ICC_PROFILE" (null-terminated). + * We code it in this less-than-transparent way so that the code works + * even if the local character set is not ASCII. + */ + jpeg_write_m_byte(cinfo, 0x49); + jpeg_write_m_byte(cinfo, 0x43); + jpeg_write_m_byte(cinfo, 0x43); + jpeg_write_m_byte(cinfo, 0x5F); + jpeg_write_m_byte(cinfo, 0x50); + jpeg_write_m_byte(cinfo, 0x52); + jpeg_write_m_byte(cinfo, 0x4F); + jpeg_write_m_byte(cinfo, 0x46); + jpeg_write_m_byte(cinfo, 0x49); + jpeg_write_m_byte(cinfo, 0x4C); + jpeg_write_m_byte(cinfo, 0x45); + jpeg_write_m_byte(cinfo, 0x0); + + /* Add the sequencing info */ + jpeg_write_m_byte(cinfo, cur_marker); + jpeg_write_m_byte(cinfo, (int) num_markers); + + /* Add the profile data */ + while (length--) { + jpeg_write_m_byte(cinfo, *icc_data_ptr); + icc_data_ptr++; + } + cur_marker++; + } +} + + +/* + * Prepare for reading an ICC profile + */ + +void +setup_read_icc_profile (j_decompress_ptr cinfo) +{ + /* Tell the library to keep any APP2 data it may find */ + jpeg_save_markers(cinfo, ICC_MARKER, 0xFFFF); +} + + +/* + * Handy subroutine to test whether a saved marker is an ICC profile marker. + */ + +static boolean +marker_is_icc (jpeg_saved_marker_ptr marker) +{ + return + marker->marker == ICC_MARKER && + marker->data_length >= ICC_OVERHEAD_LEN && + /* verify the identifying string */ + GETJOCTET(marker->data[0]) == 0x49 && + GETJOCTET(marker->data[1]) == 0x43 && + GETJOCTET(marker->data[2]) == 0x43 && + GETJOCTET(marker->data[3]) == 0x5F && + GETJOCTET(marker->data[4]) == 0x50 && + GETJOCTET(marker->data[5]) == 0x52 && + GETJOCTET(marker->data[6]) == 0x4F && + GETJOCTET(marker->data[7]) == 0x46 && + GETJOCTET(marker->data[8]) == 0x49 && + GETJOCTET(marker->data[9]) == 0x4C && + GETJOCTET(marker->data[10]) == 0x45 && + GETJOCTET(marker->data[11]) == 0x0; +} + + +/* + * See if there was an ICC profile in the JPEG file being read; + * if so, reassemble and return the profile data. + * + * TRUE is returned if an ICC profile was found, FALSE if not. + * If TRUE is returned, *icc_data_ptr is set to point to the + * returned data, and *icc_data_len is set to its length. + * + * IMPORTANT: the data at **icc_data_ptr has been allocated with malloc() + * and must be freed by the caller with free() when the caller no longer + * needs it. (Alternatively, we could write this routine to use the + * IJG library's memory allocator, so that the data would be freed implicitly + * at jpeg_finish_decompress() time. But it seems likely that many apps + * will prefer to have the data stick around after decompression finishes.) + * + * NOTE: if the file contains invalid ICC APP2 markers, we just silently + * return FALSE. You might want to issue an error message instead. + */ + +boolean +read_icc_profile (j_decompress_ptr cinfo, + JOCTET **icc_data_ptr, + unsigned int *icc_data_len) +{ + jpeg_saved_marker_ptr marker; + int num_markers = 0; + int seq_no; + JOCTET *icc_data; + unsigned int total_length; +#define MAX_SEQ_NO 255 /* sufficient since marker numbers are bytes */ + char marker_present[MAX_SEQ_NO+1]; /* 1 if marker found */ + unsigned int data_length[MAX_SEQ_NO+1]; /* size of profile data in marker */ + unsigned int data_offset[MAX_SEQ_NO+1]; /* offset for data in marker */ + + *icc_data_ptr = NULL; /* avoid confusion if FALSE return */ + *icc_data_len = 0; + + /* This first pass over the saved markers discovers whether there are + * any ICC markers and verifies the consistency of the marker numbering. + */ + + for (seq_no = 1; seq_no <= MAX_SEQ_NO; seq_no++) + marker_present[seq_no] = 0; + + for (marker = cinfo->marker_list; marker != NULL; marker = marker->next) { + if (marker_is_icc(marker)) { + if (num_markers == 0) + num_markers = GETJOCTET(marker->data[13]); + else if (num_markers != GETJOCTET(marker->data[13])) + return FALSE; /* inconsistent num_markers fields */ + seq_no = GETJOCTET(marker->data[12]); + if (seq_no <= 0 || seq_no > num_markers) + return FALSE; /* bogus sequence number */ + if (marker_present[seq_no]) + return FALSE; /* duplicate sequence numbers */ + marker_present[seq_no] = 1; + data_length[seq_no] = marker->data_length - ICC_OVERHEAD_LEN; + } + } + + if (num_markers == 0) + return FALSE; + + /* Check for missing markers, count total space needed, + * compute offset of each marker's part of the data. + */ + + total_length = 0; + for (seq_no = 1; seq_no <= num_markers; seq_no++) { + if (marker_present[seq_no] == 0) + return FALSE; /* missing sequence number */ + data_offset[seq_no] = total_length; + total_length += data_length[seq_no]; + } + + if (total_length == 0) + return FALSE; /* found only empty markers? */ + + /* Allocate space for assembled data */ + icc_data = (JOCTET *) malloc(total_length * sizeof(JOCTET)); + if (icc_data == NULL) + return FALSE; /* oops, out of memory */ + + /* and fill it in */ + for (marker = cinfo->marker_list; marker != NULL; marker = marker->next) { + if (marker_is_icc(marker)) { + JOCTET FAR *src_ptr; + JOCTET *dst_ptr; + unsigned int length; + seq_no = GETJOCTET(marker->data[12]); + dst_ptr = icc_data + data_offset[seq_no]; + src_ptr = marker->data + ICC_OVERHEAD_LEN; + length = data_length[seq_no]; + while (length--) { + *dst_ptr++ = *src_ptr++; + } + } + } + + *icc_data_ptr = icc_data; + *icc_data_len = total_length; + + return TRUE; +} diff --git a/local/recipes/libs/lcms2/source/utils/jpgicc/iccjpeg.h b/local/recipes/libs/lcms2/source/utils/jpgicc/iccjpeg.h new file mode 100644 index 0000000000..5e1888d9ef --- /dev/null +++ b/local/recipes/libs/lcms2/source/utils/jpgicc/iccjpeg.h @@ -0,0 +1,73 @@ +/* + * iccprofile.h + * + * This file provides code to read and write International Color Consortium + * (ICC) device profiles embedded in JFIF JPEG image files. The ICC has + * defined a standard format for including such data in JPEG "APP2" markers. + * The code given here does not know anything about the internal structure + * of the ICC profile data; it just knows how to put the profile data into + * a JPEG file being written, or get it back out when reading. + * + * This code depends on new features added to the IJG JPEG library as of + * IJG release 6b; it will not compile or work with older IJG versions. + * + * NOTE: this code would need surgery to work on 16-bit-int machines + * with ICC profiles exceeding 64K bytes in size. See iccprofile.c + * for details. + */ + +#include /* needed to define "FILE", "NULL" */ +#include "jpeglib.h" + + +/* + * This routine writes the given ICC profile data into a JPEG file. + * It *must* be called AFTER calling jpeg_start_compress() and BEFORE + * the first call to jpeg_write_scanlines(). + * (This ordering ensures that the APP2 marker(s) will appear after the + * SOI and JFIF or Adobe markers, but before all else.) + */ + +extern void write_icc_profile JPP((j_compress_ptr cinfo, + const JOCTET *icc_data_ptr, + unsigned int icc_data_len)); + + +/* + * Reading a JPEG file that may contain an ICC profile requires two steps: + * + * 1. After jpeg_create_decompress() but before jpeg_read_header(), + * call setup_read_icc_profile(). This routine tells the IJG library + * to save in memory any APP2 markers it may find in the file. + * + * 2. After jpeg_read_header(), call read_icc_profile() to find out + * whether there was a profile and obtain it if so. + */ + + +/* + * Prepare for reading an ICC profile + */ + +extern void setup_read_icc_profile JPP((j_decompress_ptr cinfo)); + + +/* + * See if there was an ICC profile in the JPEG file being read; + * if so, reassemble and return the profile data. + * + * TRUE is returned if an ICC profile was found, FALSE if not. + * If TRUE is returned, *icc_data_ptr is set to point to the + * returned data, and *icc_data_len is set to its length. + * + * IMPORTANT: the data at **icc_data_ptr has been allocated with malloc() + * and must be freed by the caller with free() when the caller no longer + * needs it. (Alternatively, we could write this routine to use the + * IJG library's memory allocator, so that the data would be freed implicitly + * at jpeg_finish_decompress() time. But it seems likely that many apps + * will prefer to have the data stick around after decompression finishes.) + */ + +extern boolean read_icc_profile JPP((j_decompress_ptr cinfo, + JOCTET **icc_data_ptr, + unsigned int *icc_data_len)); diff --git a/local/recipes/libs/lcms2/source/utils/jpgicc/jpgicc.1 b/local/recipes/libs/lcms2/source/utils/jpgicc/jpgicc.1 new file mode 100644 index 0000000000..44795a38eb --- /dev/null +++ b/local/recipes/libs/lcms2/source/utils/jpgicc/jpgicc.1 @@ -0,0 +1,122 @@ +.\"Shiju P. Nair September 30, 2004 +.\"Thomas Weber April 23, 2014 +.TH JPGICC 1 "September 30, 2004" +.SH NAME +jpgicc - little cms ICC profile applier for JPEG. +.SH SYNOPSIS +.B jpgicc +.RI [ options ] " input.jpg output.jpg" +.SH DESCRIPTION +lcms is a standalone CMM engine, which deals with the color management. +It implements a fast transformation between ICC profiles. +.B jpgicc +is a little cms ICC profile applier for JPEG. +.SH OPTIONS +.TP +.B \-b +Black point compensation. +.TP +.BI \-c\ NUM +Precalculates transform (0=Off, 1=Normal, 2=Hi-res, 3=LoRes) [defaults to 1]. +.TP +.BI \-d\ NUM +Observer adaptation state (abs.col. only), (0..1.0, float value) [defaults to 0.0]. +.TP +.B \-e +Embed destination profile. +.TP +.B \-g +Marks out-of-gamut colors on softproof. +.TP +.BI \-h\ NUM +Show summary of options and examples (0=help, 1=Examples, 2=Built-in profiles, 3=Contact information) +.TP +.BI \-i\ profile +Input profile (defaults to sRGB). +.TP +.BI \-l\ link +TODO: explain this option. +.TP +.BI \-m\ NUM +SoftProof intent (0,1,2,3) [defaults to 0]. +.TP +.B \-n +Ignore embedded profile. +.TP +.BI \-o\ profile +Output profile (defaults to sRGB). +.TP +.BI \-p\ profile +Soft proof profile. +.TP +.BI \-q\ NUM +Output JPEG quality, (0..100) [defaults to 75]. +.TP +.BI \-s\ newprofile +Save embedded profile as \fInewprofile\fR. +.TP +.BI \-t\ NUM +Rendering intent +.nf +.RS +0=Perceptual [default] +1=Relative colorimetric +2=Saturation +3=Absolute colorimetric +10=Perceptual preserving black ink +11=Relative colorimetric preserving black ink +12=Saturation preserving black ink +13=Perceptual preserving black plane +14=Relative colorimetric preserving black plane +15=Saturation preserving black plane +.RE +.fi +.TP +.B \-v +Verbose. +.TP +.BI \-!\ NUM,NUM,NUM +Out-of-gamut marker channel values (r,g,b) [defaults: 128,128,128]. +.SH BUILT-IN PROFILES +.nf + *Lab2 -- D50-based v2 CIEL*a*b + *Lab4 -- D50-based v4 CIEL*a*b + *Lab -- D50-based v4 CIEL*a*b + *XYZ -- CIE XYZ (PCS) + *sRGB -- sRGB color space + *Gray22 - Monochrome of Gamma 2.2 + *Gray30 - Monochrome of Gamma 3.0 + *null - Monochrome black for all input + *Lin2222- CMYK linearization of gamma 2.2 on each channel +.fi +.SH EXAMPLES +.nf +To color correct from scanner to sRGB: + jpgicc -iscanner.icm in.jpg out.jpg + +To convert from monitor1 to monitor2: + jpgicc -imon1.icm -omon2.icm in.jpg out.jpg + +To make a CMYK separation: + jpgicc -oprinter.icm inrgb.jpg outcmyk.jpg + +To recover sRGB from a CMYK separation: + jpgicc -iprinter.icm incmyk.jpg outrgb.jpg + +To convert from CIELab ITU/Fax JPEG to sRGB + jpgicc -iitufax.icm in.jpg out.jpg + +To convert from CIELab ITU/Fax JPEG to sRGB + jpgicc in.jpg out.jpg +.fi +.SH NOTES +For suggestions, comments, bug reports etc. send mail to +info@littlecms.com. +.SH SEE ALSO +.BR linkicc (1), +.BR psicc (1), +.BR tificc (1), +.BR transicc (1) +.SH AUTHOR +This manual page was written by Shiju p. Nair , +for the Debian project. diff --git a/local/recipes/libs/lcms2/source/utils/jpgicc/jpgicc.c b/local/recipes/libs/lcms2/source/utils/jpgicc/jpgicc.c new file mode 100644 index 0000000000..65fb9bbdb3 --- /dev/null +++ b/local/recipes/libs/lcms2/source/utils/jpgicc/jpgicc.c @@ -0,0 +1,1275 @@ +//--------------------------------------------------------------------------------- +// +// Little Color Management System +// Copyright (c) 1998-2026 Marti Maria Saguer +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +// This program does apply profiles to (some) JPEG files + + +#include "utils.h" + +#include "jpeglib.h" +#include "iccjpeg.h" + +// Flags +static cmsBool BlackPointCompensation = FALSE; +static cmsBool IgnoreEmbedded = FALSE; +static cmsBool GamutCheck = FALSE; +static cmsBool lIsITUFax = FALSE; +static cmsBool lIsPhotoshopApp13 = FALSE; +static cmsBool lIsEXIF; +static cmsBool lIsDeviceLink = FALSE; +static cmsBool EmbedProfile = FALSE; + +static const char* SaveEmbedded = NULL; + +static int Intent = INTENT_PERCEPTUAL; +static int ProofingIntent = INTENT_PERCEPTUAL; +static int PrecalcMode = 1; + +static int jpegQuality = 75; + +static cmsFloat64Number ObserverAdaptationState = 0; + + +static char *cInpProf = NULL; +static char *cOutProf = NULL; +static char *cProofing = NULL; + +static FILE * InFile; +static FILE * OutFile; + +static struct jpeg_decompress_struct Decompressor; +static struct jpeg_compress_struct Compressor; + + +static struct my_error_mgr { + + struct jpeg_error_mgr pub; // "public" fields + void* Cargo; // "private" fields + +} ErrorHandler; + + +cmsUInt16Number Alarm[cmsMAXCHANNELS] = {128,128,128,0}; + + +static +void my_error_exit (j_common_ptr cinfo) +{ + char buffer[JMSG_LENGTH_MAX]; + + (*cinfo->err->format_message) (cinfo, buffer); + FatalError(buffer); +} + +/* +Definition of the APPn Markers Defined for continuous-tone G3FAX + +The application code APP1 initiates identification of the image as +a G3FAX application and defines the spatial resolution and subsampling. +This marker directly follows the SOI marker. The data format will be as follows: + +X'FFE1' (APP1), length, FAX identifier, version, spatial resolution. + +The above terms are defined as follows: + +Length: (Two octets) Total APP1 field octet count including the octet count itself, but excluding the APP1 +marker. + +FAX identifier: (Six octets) X'47', X'33', X'46', X'41', X'58', X'00'. This X'00'-terminated string "G3FAX" +uniquely identifies this APP1 marker. + +Version: (Two octets) X'07CA'. This string specifies the year of approval of the standard, for identification +in the case of future revision (for example, 1994). + +Spatial Resolution: (Two octets) Lightness pixel density in pels/25.4 mm. The basic value is 200. Allowed values are +100, 200, 300, 400, 600 and 1200 pels/25.4 mm, with square (or equivalent) pels. + +NOTE - The functional equivalence of inch-based and mm-based resolutions is maintained. For example, the 200 x 200 +*/ + +static +cmsBool IsITUFax(jpeg_saved_marker_ptr ptr) +{ + while (ptr) + { + if (ptr -> marker == (JPEG_APP0 + 1) && ptr -> data_length > 5) { + + const char* data = (const char*) ptr -> data; + + if (strcmp(data, "G3FAX") == 0) return TRUE; + } + + ptr = ptr -> next; + } + + return FALSE; +} + +// Save a ITU T.42/Fax marker with defaults on boundaries. This is the only mode we support right now. +static +void SetITUFax(j_compress_ptr cinfo) +{ + unsigned char Marker[] = "G3FAX\x00\0x07\xCA\x00\xC8"; + + jpeg_write_marker(cinfo, (JPEG_APP0 + 1), Marker, 10); +} + + +// Build a profile for decoding ITU T.42/Fax JPEG streams. +// The profile has an additional ability in the input direction of +// gamut compress values between 85 < a < -85 and -75 < b < 125. This conforms +// the default range for ITU/T.42 -- See RFC 2301, section 6.2.3 for details + +// L* = [0, 100] +// a* = [-85, 85] +// b* = [-75, 125] + + +// These functions does convert the encoding of ITUFAX to floating point +// and vice-versa. No gamut mapping is performed yet. + +static +void ITU2Lab(const cmsUInt16Number In[3], cmsCIELab* Lab) +{ + Lab -> L = (double) In[0] / 655.35; + Lab -> a = (double) 170.* (In[1] - 32768.) / 65535.; + Lab -> b = (double) 200.* (In[2] - 24576.) / 65535.; +} + +static +void Lab2ITU(const cmsCIELab* Lab, cmsUInt16Number Out[3]) +{ + Out[0] = (cmsUInt16Number) floor((double) (Lab -> L / 100.)* 65535. ); + Out[1] = (cmsUInt16Number) floor((double) (Lab -> a / 170.)* 65535. + 32768. ); + Out[2] = (cmsUInt16Number) floor((double) (Lab -> b / 200.)* 65535. + 24576. ); +} + +// These are the samplers-- They are passed as callbacks to cmsStageSampleCLut16bit() +// then, cmsSample3DGrid() will sweel whole Lab gamut calling these functions +// once for each node. In[] will contain the Lab PCS value to convert to ITUFAX +// on PCS2ITU, or the ITUFAX value to convert to Lab in ITU2PCS +// You can change the number of sample points if desired, the algorithm will +// remain same. 33 points gives good accuracy, but you can reduce to 22 or less +// is space is critical + +#define GRID_POINTS 33 + +static +int PCS2ITU(register const cmsUInt16Number In[], register cmsUInt16Number Out[], register void* Cargo) +{ + cmsCIELab Lab; + + cmsLabEncoded2Float(&Lab, In); + cmsDesaturateLab(&Lab, 85, -85, 125, -75); // This function does the necessary gamut remapping + Lab2ITU(&Lab, Out); + return TRUE; + + UTILS_UNUSED_PARAMETER(Cargo); +} + + +static +int ITU2PCS( register const cmsUInt16Number In[], register cmsUInt16Number Out[], register void* Cargo) +{ + cmsCIELab Lab; + + ITU2Lab(In, &Lab); + cmsFloat2LabEncoded(Out, &Lab); + return TRUE; + + UTILS_UNUSED_PARAMETER(Cargo); +} + +// This function does create the virtual input profile, which decodes ITU to the profile connection space +static +cmsHPROFILE CreateITU2PCS_ICC(void) +{ + cmsHPROFILE hProfile; + cmsPipeline* AToB0; + cmsStage* ColorMap; + + AToB0 = cmsPipelineAlloc(0, 3, 3); + if (AToB0 == NULL) return NULL; + + ColorMap = cmsStageAllocCLut16bit(0, GRID_POINTS, 3, 3, NULL); + if (ColorMap == NULL) return NULL; + + cmsPipelineInsertStage(AToB0, cmsAT_BEGIN, ColorMap); + cmsStageSampleCLut16bit(ColorMap, ITU2PCS, NULL, 0); + + hProfile = cmsCreateProfilePlaceholder(0); + if (hProfile == NULL) { + cmsPipelineFree(AToB0); + return NULL; + } + + cmsWriteTag(hProfile, cmsSigAToB0Tag, AToB0); + cmsSetColorSpace(hProfile, cmsSigLabData); + cmsSetPCS(hProfile, cmsSigLabData); + cmsSetDeviceClass(hProfile, cmsSigColorSpaceClass); + cmsPipelineFree(AToB0); + + return hProfile; +} + + +// This function does create the virtual output profile, with the necessary gamut mapping +static +cmsHPROFILE CreatePCS2ITU_ICC(void) +{ + cmsHPROFILE hProfile; + cmsPipeline* BToA0; + cmsStage* ColorMap; + + BToA0 = cmsPipelineAlloc(0, 3, 3); + if (BToA0 == NULL) return NULL; + + ColorMap = cmsStageAllocCLut16bit(0, GRID_POINTS, 3, 3, NULL); + if (ColorMap == NULL) return NULL; + + cmsPipelineInsertStage(BToA0, cmsAT_BEGIN, ColorMap); + cmsStageSampleCLut16bit(ColorMap, PCS2ITU, NULL, 0); + + hProfile = cmsCreateProfilePlaceholder(0); + if (hProfile == NULL) { + cmsPipelineFree(BToA0); + return NULL; + } + + cmsWriteTag(hProfile, cmsSigBToA0Tag, BToA0); + cmsSetColorSpace(hProfile, cmsSigLabData); + cmsSetPCS(hProfile, cmsSigLabData); + cmsSetDeviceClass(hProfile, cmsSigColorSpaceClass); + + cmsPipelineFree(BToA0); + + return hProfile; +} + + + +#define PS_FIXED_TO_FLOAT(h, l) ((float) (h) + ((float) (l)/(1<<16))) + +static +cmsBool ProcessPhotoshopAPP13(JOCTET *data, int datalen) +{ + int i; + + for (i = 14; i < datalen; ) + { + long len; + unsigned int type; + + if (!(GETJOCTET(data[i] ) == 0x38 && + GETJOCTET(data[i+1]) == 0x42 && + GETJOCTET(data[i+2]) == 0x49 && + GETJOCTET(data[i+3]) == 0x4D)) break; // Not recognized + + i += 4; // identifying string + + type = (unsigned int) (GETJOCTET(data[i]<<8) + GETJOCTET(data[i+1])); + + i += 2; // resource type + + i += GETJOCTET(data[i]) + ((GETJOCTET(data[i]) & 1) ? 1 : 2); // resource name + + len = ((((GETJOCTET(data[i]<<8) + GETJOCTET(data[i+1]))<<8) + + GETJOCTET(data[i+2]))<<8) + GETJOCTET(data[i+3]); + + if (len < 0) return FALSE; // Keep bug hunters away + + i += 4; // Size + + if (type == 0x03ED && len >= 16) { + + Decompressor.X_density = (UINT16) PS_FIXED_TO_FLOAT(GETJOCTET(data[i]<<8) + GETJOCTET(data[i+1]), + GETJOCTET(data[i+2]<<8) + GETJOCTET(data[i+3])); + Decompressor.Y_density = (UINT16) PS_FIXED_TO_FLOAT(GETJOCTET(data[i+8]<<8) + GETJOCTET(data[i+9]), + GETJOCTET(data[i+10]<<8) + GETJOCTET(data[i+11])); + + // Set the density unit to 1 since the + // Vertical and Horizontal resolutions + // are specified in Pixels per inch + + Decompressor.density_unit = 0x01; + return TRUE; + + } + + i += len + ((len & 1) ? 1 : 0); // Alignment + } + return FALSE; +} + + +static +cmsBool HandlePhotoshopAPP13(jpeg_saved_marker_ptr ptr) +{ + while (ptr) { + + if (ptr -> marker == (JPEG_APP0 + 13) && ptr -> data_length > 9) + { + JOCTET* data = ptr -> data; + + if(GETJOCTET(data[0]) == 0x50 && + GETJOCTET(data[1]) == 0x68 && + GETJOCTET(data[2]) == 0x6F && + GETJOCTET(data[3]) == 0x74 && + GETJOCTET(data[4]) == 0x6F && + GETJOCTET(data[5]) == 0x73 && + GETJOCTET(data[6]) == 0x68 && + GETJOCTET(data[7]) == 0x6F && + GETJOCTET(data[8]) == 0x70) { + + ProcessPhotoshopAPP13(data, ptr -> data_length); + return TRUE; + } + } + + ptr = ptr -> next; + } + + return FALSE; +} + + +typedef unsigned short uint16_t; +typedef unsigned char uint8_t; +typedef unsigned int uint32_t; + +#define INTEL_BYTE_ORDER 0x4949 +#define XRESOLUTION 0x011a +#define YRESOLUTION 0x011b +#define RESOLUTION_UNIT 0x128 + +// Abort if crafted file +static +void craftedFile(void) +{ + FatalError("Corrupted EXIF data"); +} + +// Read a 16-bit word +static +uint16_t read16(uint8_t* arr, size_t pos, int swapBytes, size_t max) +{ + if (pos + 2 >= max) + { + craftedFile(); + return 0; + } + else + { + uint8_t b1 = arr[pos]; + uint8_t b2 = arr[pos + 1]; + + return (swapBytes) ? ((b2 << 8) | b1) : ((b1 << 8) | b2); + } +} + + +// Read a 32-bit word +static +uint32_t read32(uint8_t* arr, size_t pos, int swapBytes, size_t max) +{ + + if (pos + 4 >= max) + { + craftedFile(); + return 0; + } + else + { + if (!swapBytes) { + + return (arr[pos] << 24) | (arr[pos + 1] << 16) | (arr[pos + 2] << 8) | arr[pos + 3]; + } + + return arr[pos] | (arr[pos + 1] << 8) | (arr[pos + 2] << 16) | (arr[pos + 3] << 24); + } +} + + + +static +int read_tag(uint8_t* arr, int pos, int swapBytes, void* dest, size_t max) +{ + // Format should be 5 over here (rational) + uint32_t format = read16(arr, pos + 2, swapBytes, max); + // Components should be 1 + uint32_t components = read32(arr, pos + 4, swapBytes, max); + // Points to the value + uint32_t offset; + + // sanity + if (components != 1) return 0; + + if (format == 3) + offset = pos + 8; + else + offset = read32(arr, pos + 8, swapBytes, max); + + switch (format) { + + case 5: // Rational + { + double num = read32(arr, offset, swapBytes, max); + double den = read32(arr, offset + 4, swapBytes, max); + *(double *) dest = num / den; + } + break; + + case 3: // uint 16 + *(int*) dest = read16(arr, offset, swapBytes, max); + break; + + default: return 0; + } + + return 1; +} + + + +// Handler for EXIF data +static +cmsBool HandleEXIF(struct jpeg_decompress_struct* cinfo) +{ + jpeg_saved_marker_ptr ptr; + uint32_t ifd_ofs; + int pos = 0, swapBytes = 0; + uint32_t i, numEntries; + double XRes = -1, YRes = -1; + int Unit = 2; // Inches + + + for (ptr = cinfo ->marker_list; ptr; ptr = ptr ->next) { + + if ((ptr ->marker == JPEG_APP0+1) && ptr ->data_length > 6) { + + JOCTET* data = ptr -> data; + size_t max = ptr->data_length; + + if (memcmp(data, "Exif\0\0", 6) == 0) { + + data += 6; // Skip EXIF marker + + // 8 byte TIFF header + // first two determine byte order + pos = 0; + if (read16(data, pos, 0, max) == INTEL_BYTE_ORDER) { + swapBytes = 1; + } + + pos += 2; + + // next two bytes are always 0x002A (TIFF version) + pos += 2; + + // offset to Image File Directory (includes the previous 8 bytes) + ifd_ofs = read32(data, pos, swapBytes, max); + + // Search the directory for resolution tags + numEntries = read16(data, ifd_ofs, swapBytes, max); + + for (i=0; i < numEntries; i++) { + + uint32_t entryOffset = ifd_ofs + 2 + (12 * i); + uint32_t tag = read16(data, entryOffset, swapBytes, max); + + switch (tag) { + + case RESOLUTION_UNIT: + if (!read_tag(data, entryOffset, swapBytes, &Unit, max)) return FALSE; + break; + + case XRESOLUTION: + if (!read_tag(data, entryOffset, swapBytes, &XRes, max)) return FALSE; + break; + + case YRESOLUTION: + if (!read_tag(data, entryOffset, swapBytes, &YRes, max)) return FALSE; + break; + + default:; + } + + } + + // Proceed if all found + + if (XRes != -1 && YRes != -1) + { + + // 1 = None + // 2 = inches + // 3 = cm + + switch (Unit) { + + case 2: + + cinfo ->X_density = (UINT16) floor(XRes + 0.5); + cinfo ->Y_density = (UINT16) floor(YRes + 0.5); + break; + + case 1: + + cinfo ->X_density = (UINT16) floor(XRes * 2.54 + 0.5); + cinfo ->Y_density = (UINT16) floor(YRes * 2.54 + 0.5); + break; + + default: return FALSE; + } + + cinfo ->density_unit = 1; /* 1 for dots/inch, or 2 for dots/cm.*/ + + } + + + } + } + } + return FALSE; +} + + +static +cmsBool OpenInput(const char* FileName) +{ + int m; + + lIsITUFax = FALSE; + InFile = fopen(FileName, "rb"); + if (InFile == NULL) { + FatalError("Cannot open '%s'", FileName); + } + + // Now we can initialize the JPEG decompression object. + Decompressor.err = jpeg_std_error(&ErrorHandler.pub); + ErrorHandler.pub.error_exit = my_error_exit; + ErrorHandler.pub.output_message = my_error_exit; + + jpeg_create_decompress(&Decompressor); + jpeg_stdio_src(&Decompressor, InFile); + + for (m = 0; m < 16; m++) + jpeg_save_markers(&Decompressor, JPEG_APP0 + m, 0xFFFF); + + // setup_read_icc_profile(&Decompressor); + + fseek(InFile, 0, SEEK_SET); + jpeg_read_header(&Decompressor, TRUE); + + return TRUE; +} + + +static +cmsBool OpenOutput(const char* FileName) +{ + + OutFile = fopen(FileName, "wb"); + if (OutFile == NULL) { + FatalError("Cannot create '%s'", FileName); + + } + + Compressor.err = jpeg_std_error(&ErrorHandler.pub); + ErrorHandler.pub.error_exit = my_error_exit; + ErrorHandler.pub.output_message = my_error_exit; + + Compressor.input_components = Compressor.num_components = 4; + + jpeg_create_compress(&Compressor); + jpeg_stdio_dest(&Compressor, OutFile); + return TRUE; +} + +static +cmsBool Done(void) +{ + jpeg_destroy_decompress(&Decompressor); + jpeg_destroy_compress(&Compressor); + return fclose(InFile) + fclose(OutFile); + +} + + +// Build up the pixeltype descriptor + +static +cmsUInt32Number GetInputPixelType(void) +{ + int space, bps, extra, ColorChannels, Flavor; + + lIsITUFax = IsITUFax(Decompressor.marker_list); + lIsPhotoshopApp13 = HandlePhotoshopAPP13(Decompressor.marker_list); + lIsEXIF = HandleEXIF(&Decompressor); + + ColorChannels = Decompressor.num_components; + extra = 0; // Alpha = None + bps = 1; // 8 bits + Flavor = 0; // Vanilla + + if (lIsITUFax) { + + space = PT_Lab; + Decompressor.out_color_space = JCS_YCbCr; // Fake to don't touch + } + else + switch (Decompressor.jpeg_color_space) { + + case JCS_GRAYSCALE: // monochrome + space = PT_GRAY; + Decompressor.out_color_space = JCS_GRAYSCALE; + break; + + case JCS_RGB: // red/green/blue + space = PT_RGB; + Decompressor.out_color_space = JCS_RGB; + break; + + case JCS_YCbCr: // Y/Cb/Cr (also known as YUV) + space = PT_RGB; // Let IJG code to do the conversion + Decompressor.out_color_space = JCS_RGB; + break; + + case JCS_CMYK: // C/M/Y/K + space = PT_CMYK; + Decompressor.out_color_space = JCS_CMYK; + if (Decompressor.saw_Adobe_marker) // Adobe keeps CMYK inverted, so change flavor + Flavor = 1; // from vanilla to chocolate + break; + + case JCS_YCCK: // Y/Cb/Cr/K + space = PT_CMYK; + Decompressor.out_color_space = JCS_CMYK; + if (Decompressor.saw_Adobe_marker) // ditto + Flavor = 1; + break; + + default: + FatalError("Unsupported color space (0x%x)", Decompressor.jpeg_color_space); + return 0; + } + + return (EXTRA_SH(extra)|CHANNELS_SH(ColorChannels)|BYTES_SH(bps)|COLORSPACE_SH(space)|FLAVOR_SH(Flavor)); +} + + +// Rearrange pixel type to build output descriptor +static +cmsUInt32Number ComputeOutputFormatDescriptor(cmsUInt32Number dwInput, int OutColorSpace) +{ + int IsPlanar = T_PLANAR(dwInput); + int Channels = 0; + int Flavor = 0; + + switch (OutColorSpace) { + + case PT_GRAY: + Channels = 1; + break; + case PT_RGB: + case PT_CMY: + case PT_Lab: + case PT_YUV: + case PT_YCbCr: + Channels = 3; + break; + + case PT_CMYK: + if (Compressor.write_Adobe_marker) // Adobe keeps CMYK inverted, so change flavor to chocolate + Flavor = 1; + Channels = 4; + break; + default: + FatalError("Unsupported output color space"); + } + + return (COLORSPACE_SH(OutColorSpace)|PLANAR_SH(IsPlanar)|CHANNELS_SH(Channels)|BYTES_SH(1)|FLAVOR_SH(Flavor)); +} + + +// Equivalence between ICC color spaces and lcms color spaces +static +int GetProfileColorSpace(cmsHPROFILE hProfile) +{ + cmsColorSpaceSignature ProfileSpace = cmsGetColorSpace(hProfile); + + return _cmsLCMScolorSpace(ProfileSpace); +} + +static +int GetDevicelinkColorSpace(cmsHPROFILE hProfile) +{ + cmsColorSpaceSignature ProfileSpace = cmsGetPCS(hProfile); + + return _cmsLCMScolorSpace(ProfileSpace); +} + + +// From TRANSUPP + +static +void jcopy_markers_execute(j_decompress_ptr srcinfo, j_compress_ptr dstinfo) +{ + jpeg_saved_marker_ptr marker; + + /* In the current implementation, we don't actually need to examine the + * option flag here; we just copy everything that got saved. + * But to avoid confusion, we do not output JFIF and Adobe APP14 markers + * if the encoder library already wrote one. + */ + for (marker = srcinfo->marker_list; marker != NULL; marker = marker->next) { + + if (dstinfo->write_JFIF_header && + marker->marker == JPEG_APP0 && + marker->data_length >= 5 && + GETJOCTET(marker->data[0]) == 0x4A && + GETJOCTET(marker->data[1]) == 0x46 && + GETJOCTET(marker->data[2]) == 0x49 && + GETJOCTET(marker->data[3]) == 0x46 && + GETJOCTET(marker->data[4]) == 0) + continue; /* reject duplicate JFIF */ + + if (dstinfo->write_Adobe_marker && + marker->marker == JPEG_APP0+14 && + marker->data_length >= 5 && + GETJOCTET(marker->data[0]) == 0x41 && + GETJOCTET(marker->data[1]) == 0x64 && + GETJOCTET(marker->data[2]) == 0x6F && + GETJOCTET(marker->data[3]) == 0x62 && + GETJOCTET(marker->data[4]) == 0x65) + continue; /* reject duplicate Adobe */ + + jpeg_write_marker(dstinfo, marker->marker, + marker->data, marker->data_length); + } +} + +static +void WriteOutputFields(int OutputColorSpace) +{ + J_COLOR_SPACE in_space, jpeg_space; + int components; + + switch (OutputColorSpace) { + + case PT_GRAY: in_space = jpeg_space = JCS_GRAYSCALE; + components = 1; + break; + + case PT_RGB: in_space = JCS_RGB; + jpeg_space = JCS_YCbCr; + components = 3; + break; // red/green/blue + + case PT_YCbCr: in_space = jpeg_space = JCS_YCbCr; + components = 3; + break; // Y/Cb/Cr (also known as YUV) + + case PT_CMYK: in_space = JCS_CMYK; + jpeg_space = JCS_YCCK; + components = 4; + break; // C/M/Y/components + + case PT_Lab: in_space = jpeg_space = JCS_YCbCr; + components = 3; + break; // Fake to don't touch + default: + FatalError("Unsupported output color space"); + return; + } + + + if (jpegQuality >= 100) { + + // avoid destructive conversion when asking for lossless compression + jpeg_space = in_space; + } + + Compressor.in_color_space = in_space; + Compressor.jpeg_color_space = jpeg_space; + Compressor.input_components = Compressor.num_components = components; + jpeg_set_defaults(&Compressor); + jpeg_set_colorspace(&Compressor, jpeg_space); + + + // Make sure to pass resolution through + if (OutputColorSpace == PT_CMYK) + Compressor.write_JFIF_header = 1; + + // Avoid subsampling on high quality factor + jpeg_set_quality(&Compressor, jpegQuality, 1); + if (jpegQuality >= 70) { + + int i; + for(i=0; i < Compressor.num_components; i++) { + + Compressor.comp_info[i].h_samp_factor = 1; + Compressor.comp_info[i].v_samp_factor = 1; + } + + } + +} + + +static +void DoEmbedProfile(const char* ProfileFile) +{ + FILE* f; + size_t size, EmbedLen; + cmsUInt8Number* EmbedBuffer; + + f = fopen(ProfileFile, "rb"); + if (f == NULL) return; + + size = cmsfilelength(f); + EmbedBuffer = (cmsUInt8Number*) malloc(size + 1); + EmbedLen = fread(EmbedBuffer, 1, size, f); + fclose(f); + EmbedBuffer[EmbedLen] = 0; + + write_icc_profile (&Compressor, EmbedBuffer, (unsigned int) EmbedLen); + free(EmbedBuffer); +} + + + +static +int DoTransform(cmsHTRANSFORM hXForm, int OutputColorSpace) +{ + JSAMPROW ScanLineIn; + JSAMPROW ScanLineOut; + + + //Preserve resolution values from the original + // (Thanks to Robert Bergs for finding out this bug) + Compressor.density_unit = Decompressor.density_unit; + Compressor.X_density = Decompressor.X_density; + Compressor.Y_density = Decompressor.Y_density; + + // Compressor.write_JFIF_header = 1; + + jpeg_start_decompress(&Decompressor); + jpeg_start_compress(&Compressor, TRUE); + + if (OutputColorSpace == PT_Lab) + SetITUFax(&Compressor); + + // Embed the profile if needed + if (EmbedProfile && cOutProf) + DoEmbedProfile(cOutProf); + + ScanLineIn = (JSAMPROW) malloc((size_t) Decompressor.output_width * Decompressor.num_components); + ScanLineOut = (JSAMPROW) malloc((size_t) Compressor.image_width * Compressor.num_components); + + while (Decompressor.output_scanline < + Decompressor.output_height) { + + jpeg_read_scanlines(&Decompressor, &ScanLineIn, 1); + + cmsDoTransform(hXForm, ScanLineIn, ScanLineOut, Decompressor.output_width); + + jpeg_write_scanlines(&Compressor, &ScanLineOut, 1); + } + + free(ScanLineIn); + free(ScanLineOut); + + jpeg_finish_decompress(&Decompressor); + jpeg_finish_compress(&Compressor); + + return TRUE; +} + + + +// Transform one image + +static +int TransformImage(char *cDefInpProf, char *cOutputProf) +{ + cmsHPROFILE hIn, hOut, hProof; + cmsHTRANSFORM xform; + cmsUInt32Number wInput, wOutput; + int OutputColorSpace; + cmsUInt32Number dwFlags = 0; + cmsUInt32Number EmbedLen; + cmsUInt8Number* EmbedBuffer; + + + cmsSetAdaptationState(ObserverAdaptationState); + + if (BlackPointCompensation) { + + dwFlags |= cmsFLAGS_BLACKPOINTCOMPENSATION; + } + + + switch (PrecalcMode) { + + case 0: dwFlags |= cmsFLAGS_NOOPTIMIZE; break; + case 2: dwFlags |= cmsFLAGS_HIGHRESPRECALC; break; + case 3: dwFlags |= cmsFLAGS_LOWRESPRECALC; break; + default:; + } + + + if (GamutCheck) { + dwFlags |= cmsFLAGS_GAMUTCHECK; + cmsSetAlarmCodes(Alarm); + } + + // Take input color space + wInput = GetInputPixelType(); + + if (lIsDeviceLink) { + + hIn = cmsOpenProfileFromFile(cDefInpProf, "r"); + hOut = NULL; + hProof = NULL; + } + else { + + if (!IgnoreEmbedded && read_icc_profile(&Decompressor, &EmbedBuffer, &EmbedLen)) + { + hIn = cmsOpenProfileFromMem(EmbedBuffer, EmbedLen); + + if (Verbose) { + + fprintf(stdout, " (Embedded profile found)\n"); + PrintProfileInformation(hIn); + fflush(stdout); + } + + if (hIn != NULL && SaveEmbedded != NULL) + SaveMemoryBlock(EmbedBuffer, EmbedLen, SaveEmbedded); + + free(EmbedBuffer); + } + else + { + // Default for ITU/Fax + if (cDefInpProf == NULL && T_COLORSPACE(wInput) == PT_Lab) + cDefInpProf = "*Lab"; + + if (cDefInpProf != NULL && cmsstrcasecmp(cDefInpProf, "*lab") == 0) + hIn = CreateITU2PCS_ICC(); + else + hIn = OpenStockProfile(0, cDefInpProf); + } + + if (cOutputProf != NULL && cmsstrcasecmp(cOutputProf, "*lab") == 0) + hOut = CreatePCS2ITU_ICC(); + else + hOut = OpenStockProfile(0, cOutputProf); + + hProof = NULL; + if (cProofing != NULL) { + + hProof = OpenStockProfile(0, cProofing); + if (hProof == NULL) { + FatalError("Proofing profile couldn't be read."); + } + dwFlags |= cmsFLAGS_SOFTPROOFING; + } + } + + if (!hIn) + FatalError("Input profile couldn't be read."); + if (!lIsDeviceLink && !hOut) + FatalError("Output profile couldn't be read."); + + // Assure both, input profile and input JPEG are on same colorspace + if (cmsGetColorSpace(hIn) != _cmsICCcolorSpace(T_COLORSPACE(wInput))) + FatalError("Input profile is not operating in proper color space"); + + + // Output colorspace is given by output profile + + if (lIsDeviceLink) { + OutputColorSpace = GetDevicelinkColorSpace(hIn); + } + else { + OutputColorSpace = GetProfileColorSpace(hOut); + } + + jpeg_copy_critical_parameters(&Decompressor, &Compressor); + + WriteOutputFields(OutputColorSpace); + + wOutput = ComputeOutputFormatDescriptor(wInput, OutputColorSpace); + + + xform = cmsCreateProofingTransform(hIn, wInput, + hOut, wOutput, + hProof, Intent, + ProofingIntent, dwFlags); + if (xform == NULL) + FatalError("Cannot transform by using the profiles"); + + DoTransform(xform, OutputColorSpace); + + + jcopy_markers_execute(&Decompressor, &Compressor); + + cmsDeleteTransform(xform); + cmsCloseProfile(hIn); + cmsCloseProfile(hOut); + if (hProof) cmsCloseProfile(hProof); + + return 1; +} + + +static +void Help(int level) +{ + UTILS_UNUSED_PARAMETER(level); + + fprintf(stderr, "Little CMS ICC profile applier for JPEG - v3.5 [LittleCMS %2.2f]\n\n", cmsGetEncodedCMMversion() / 1000.0); + fprintf(stderr, "Copyright (c) 1998-2026 Marti Maria Saguer. See COPYING file for details.\n"); + + fprintf(stderr, "usage: jpgicc [flags] input.jpg output.jpg\n"); + + fprintf(stderr, "\nflags:\n\n"); + fprintf(stderr, "-v - Verbose\n"); + fprintf(stderr, "-i - Input profile (defaults to sRGB)\n"); + fprintf(stderr, "-o - Output profile (defaults to sRGB)\n"); + + PrintBuiltins(); + + PrintRenderingIntents(); + + + fprintf(stderr, "-b - Black point compensation\n"); + fprintf(stderr, "-d<0..1> - Observer adaptation state (abs.col. only)\n"); + fprintf(stderr, "-n - Ignore embedded profile\n"); + fprintf(stderr, "-e - Embed destination profile\n"); + fprintf(stderr, "-s - Save embedded profile as \n"); + + fprintf(stderr, "\n"); + + fprintf(stderr, "-c<0,1,2,3> - Precalculates transform (0=Off, 1=Normal, 2=Hi-res, 3=LoRes) [defaults to 1]\n"); + fprintf(stderr, "\n"); + + fprintf(stderr, "-p - Soft proof profile\n"); + fprintf(stderr, "-m<0,1,2,3> - SoftProof intent\n"); + fprintf(stderr, "-g - Marks out-of-gamut colors on softproof\n"); + fprintf(stderr, "-!,, - Out-of-gamut marker channel values\n"); + + fprintf(stderr, "\n"); + fprintf(stderr, "-q<0..100> - Output JPEG quality\n"); + + fprintf(stderr, "Examples:\n\n" + "To color correct from scanner to sRGB:\n" + "\tjpgicc -iscanner.icm in.jpg out.jpg\n" + "To convert from monitor1 to monitor2:\n" + "\tjpgicc -imon1.icm -omon2.icm in.jpg out.jpg\n" + "To make a CMYK separation:\n" + "\tjpgicc -oprinter.icm inrgb.jpg outcmyk.jpg\n" + "To recover sRGB from a CMYK separation:\n" + "\tjpgicc -iprinter.icm incmyk.jpg outrgb.jpg\n" + "To convert from CIELab ITU/Fax JPEG to sRGB\n" + "\tjpgicc in.jpg out.jpg\n\n"); + + + fprintf(stderr, "This program is intended to be a demo of the Little CMS\n" + "color engine. Both lcms and this program are open source.\n" + "You can obtain both in source code at https://www.littlecms.com\n" + "For suggestions, comments, bug reports etc. send mail to\n" + "info@littlecms.com\n\n"); + + exit(0); +} + + +// The toggles stuff + +static +void HandleSwitches(int argc, char *argv[]) +{ + int s; + + while ((s=xgetopt(argc,argv,"bBnNvVGgh:H:i:I:o:O:P:p:t:T:c:C:Q:q:M:m:L:l:eEs:S:!:D:d:-:")) != EOF) { + + switch (s) + { + + case '-': + if (strcmp(xoptarg, "help") == 0) + { + Help(0); + } + else + { + FatalError("Unknown option - run without args to see valid ones.\n"); + } + break; + + case 'b': + case 'B': + BlackPointCompensation = TRUE; + break; + + case 'd': + case 'D': ObserverAdaptationState = atof(xoptarg); + if (ObserverAdaptationState < 0 || + ObserverAdaptationState > 1.0) + FatalError("Adaptation state should be 0..1"); + break; + + case 'v': + case 'V': + Verbose = TRUE; + break; + + case 'i': + case 'I': + if (lIsDeviceLink) + FatalError("Device-link already specified"); + + cInpProf = xoptarg; + break; + + case 'o': + case 'O': + if (lIsDeviceLink) + FatalError("Device-link already specified"); + + cOutProf = xoptarg; + break; + + case 'l': + case 'L': + if (cInpProf != NULL || cOutProf != NULL) + FatalError("input/output profiles already specified"); + + cInpProf = xoptarg; + lIsDeviceLink = TRUE; + break; + + case 'p': + case 'P': + cProofing = xoptarg; + break; + + case 't': + case 'T': + Intent = atoi(xoptarg); + break; + + case 'N': + case 'n': + IgnoreEmbedded = TRUE; + break; + + case 'e': + case 'E': + EmbedProfile = TRUE; + break; + + + case 'g': + case 'G': + GamutCheck = TRUE; + break; + + case 'c': + case 'C': + PrecalcMode = atoi(xoptarg); + if (PrecalcMode < 0 || PrecalcMode > 2) + FatalError("Unknown precalc mode '%d'", PrecalcMode); + break; + + case 'H': + case 'h': { + + int a = atoi(xoptarg); + Help(a); + } + break; + + case 'q': + case 'Q': + jpegQuality = atoi(xoptarg); + if (jpegQuality > 100) jpegQuality = 100; + if (jpegQuality < 0) jpegQuality = 0; + break; + + case 'm': + case 'M': + ProofingIntent = atoi(xoptarg); + break; + + case 's': + case 'S': SaveEmbedded = xoptarg; + break; + + case '!': + if (sscanf(xoptarg, "%hu,%hu,%hu", &Alarm[0], &Alarm[1], &Alarm[2]) == 3) { + int i; + for (i=0; i < 3; i++) { + Alarm[i] = (Alarm[i] << 8) | Alarm[i]; + } + } + break; + + default: + + FatalError("Unknown option - run without args to see valid ones"); + } + + } +} + + +int main(int argc, char* argv[]) +{ + InitUtils("jpgicc"); + + HandleSwitches(argc, argv); + + if ((argc - xoptind) != 2) { + Help(0); + } + + OpenInput(argv[xoptind]); + OpenOutput(argv[xoptind+1]); + + TransformImage(cInpProf, cOutProf); + + if (Verbose) { fprintf(stdout, "\n"); fflush(stdout); } + + Done(); + + return 0; +} + + + diff --git a/local/recipes/libs/lcms2/source/utils/jpgicc/meson.build b/local/recipes/libs/lcms2/source/utils/jpgicc/meson.build new file mode 100644 index 0000000000..b9fc5eeab5 --- /dev/null +++ b/local/recipes/libs/lcms2/source/utils/jpgicc/meson.build @@ -0,0 +1,17 @@ +jpgicc_sources = files( + 'iccjpeg.c', + 'jpgicc.c', +) + +jpgicc_exe = executable( + 'jpgicc', + jpgicc_sources, + dependencies: [liblcms2_dep, jpeg_dep, common_dep, m_dep], + install: true, +) + +jpgicc_man = files( + 'jpgicc.1', +) + +install_man(jpgicc_man) diff --git a/local/recipes/libs/lcms2/source/utils/linkicc/Makefile.am b/local/recipes/libs/lcms2/source/utils/linkicc/Makefile.am new file mode 100644 index 0000000000..1fac9713ed --- /dev/null +++ b/local/recipes/libs/lcms2/source/utils/linkicc/Makefile.am @@ -0,0 +1,19 @@ +# +# Makefile for building lcms sample programs +# Originally Written by Bob Friesenhahn, June 2003 +# Additions and bugs by Marti Maria + +# Don't require all the GNU mandated files +AUTOMAKE_OPTIONS = 1.7 foreign no-dependencies + +AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include \ + -I$(top_srcdir)/utils/common -I$(top_builddir)/utils/common + +bin_PROGRAMS = linkicc + +linkicc_LDADD = $(top_builddir)/src/liblcms2.la +linkicc_LDFLAGS = @LDFLAGS@ +linkicc_SOURCES = linkicc.c ../common/xgetopt.c ../common/vprf.c ../common/utils.h +man_MANS = linkicc.1 + +EXTRA_DIST = $(man_MANS) diff --git a/local/recipes/libs/lcms2/source/utils/linkicc/Makefile.in b/local/recipes/libs/lcms2/source/utils/linkicc/Makefile.in new file mode 100644 index 0000000000..322e943753 --- /dev/null +++ b/local/recipes/libs/lcms2/source/utils/linkicc/Makefile.in @@ -0,0 +1,751 @@ +# Makefile.in generated by automake 1.18.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2025 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# +# Makefile for building lcms sample programs +# Originally Written by Bob Friesenhahn, June 2003 +# Additions and bugs by Marti Maria + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +am__rm_f = rm -f $(am__rm_f_notfound) +am__rm_rf = rm -rf $(am__rm_f_notfound) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +bin_PROGRAMS = linkicc$(EXEEXT) +subdir = utils/linkicc +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_append_compile_flags.m4 \ + $(top_srcdir)/m4/ax_append_flag.m4 \ + $(top_srcdir)/m4/ax_check_compile_flag.m4 \ + $(top_srcdir)/m4/ax_gcc_func_attribute.m4 \ + $(top_srcdir)/m4/ax_pthread.m4 \ + $(top_srcdir)/m4/ax_require_defined.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" +PROGRAMS = $(bin_PROGRAMS) +am__dirstamp = $(am__leading_dot)dirstamp +am_linkicc_OBJECTS = linkicc.$(OBJEXT) ../common/xgetopt.$(OBJEXT) \ + ../common/vprf.$(OBJEXT) +linkicc_OBJECTS = $(am_linkicc_OBJECTS) +linkicc_DEPENDENCIES = $(top_builddir)/src/liblcms2.la +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +linkicc_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(linkicc_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ +depcomp = +am__maybe_remake_depfiles = +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(linkicc_SOURCES) +DIST_SOURCES = $(linkicc_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && echo $$files | $(am__xargs_n) 40 $(am__rm_f); }; \ + } +man1dir = $(mandir)/man1 +NROFF = nroff +MANS = $(man_MANS) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +am__DIST_COMMON = $(srcdir)/Makefile.in +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ETAGS = @ETAGS@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FILECMD = @FILECMD@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +JPEGICC_DEPLIBS = @JPEGICC_DEPLIBS@ +LCMS_LIB_DEPLIBS = @LCMS_LIB_DEPLIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBRARY_AGE = @LIBRARY_AGE@ +LIBRARY_CURRENT = @LIBRARY_CURRENT@ +LIBRARY_REVISION = @LIBRARY_REVISION@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_DEPS = @LIBTOOL_DEPS@ +LIB_JPEG = @LIB_JPEG@ +LIB_MATH = @LIB_MATH@ +LIB_PLUGINS = @LIB_PLUGINS@ +LIB_THREAD = @LIB_THREAD@ +LIB_TIFF = @LIB_TIFF@ +LIB_ZLIB = @LIB_ZLIB@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_CXX = @PTHREAD_CXX@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +TIFFICC_DEPLIBS = @TIFFICC_DEPLIBS@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__rm_f_notfound = @am__rm_f_notfound@ +am__tar = @am__tar@ +am__untar = @am__untar@ +am__xargs_n = @am__xargs_n@ +ax_pthread_config = @ax_pthread_config@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +inline = @inline@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +# Don't require all the GNU mandated files +AUTOMAKE_OPTIONS = 1.7 foreign no-dependencies +AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include \ + -I$(top_srcdir)/utils/common -I$(top_builddir)/utils/common + +linkicc_LDADD = $(top_builddir)/src/liblcms2.la +linkicc_LDFLAGS = @LDFLAGS@ +linkicc_SOURCES = linkicc.c ../common/xgetopt.c ../common/vprf.c ../common/utils.h +man_MANS = linkicc.1 +EXTRA_DIST = $(man_MANS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign utils/linkicc/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign utils/linkicc/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ + fi; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p \ + || test -f $$p1 \ + ; then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' \ + -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' \ + `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && $(am__rm_f) $$files + +clean-binPROGRAMS: + $(am__rm_f) $(bin_PROGRAMS) + test -z "$(EXEEXT)" || $(am__rm_f) $(bin_PROGRAMS:$(EXEEXT)=) +../common/$(am__dirstamp): + @$(MKDIR_P) ../common + @: >>../common/$(am__dirstamp) +../common/xgetopt.$(OBJEXT): ../common/$(am__dirstamp) +../common/vprf.$(OBJEXT): ../common/$(am__dirstamp) + +linkicc$(EXEEXT): $(linkicc_OBJECTS) $(linkicc_DEPENDENCIES) $(EXTRA_linkicc_DEPENDENCIES) + @rm -f linkicc$(EXEEXT) + $(AM_V_CCLD)$(linkicc_LINK) $(linkicc_OBJECTS) $(linkicc_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + -rm -f ../common/*.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +.c.o: + $(AM_V_CC)$(COMPILE) -c -o $@ $< + +.c.obj: + $(AM_V_CC)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: + $(AM_V_CC)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-man1: $(man_MANS) + @$(NORMAL_INSTALL) + @list1=''; \ + list2='$(man_MANS)'; \ + test -n "$(man1dir)" \ + && test -n "`echo $$list1$$list2`" \ + || exit 0; \ + echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ + { for i in $$list1; do echo "$$i"; done; \ + if test -n "$$list2"; then \ + for i in $$list2; do echo "$$i"; done \ + | sed -n '/\.1[a-z]*$$/p'; \ + fi; \ + } | while read p; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; echo "$$p"; \ + done | \ + sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ + sed 'N;N;s,\n, ,g' | { \ + list=; while read file base inst; do \ + if test "$$base" = "$$inst"; then list="$$list $$file"; else \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ + fi; \ + done; \ + for i in $$list; do echo "$$i"; done | $(am__base_list) | \ + while read files; do \ + test -z "$$files" || { \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ + done; } + +uninstall-man1: + @$(NORMAL_UNINSTALL) + @list=''; test -n "$(man1dir)" || exit 0; \ + files=`{ for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ + dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) $(MANS) +installdirs: + for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -$(am__rm_f) $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || $(am__rm_f) $(CONFIG_CLEAN_VPATH_FILES) + -$(am__rm_f) ../common/$(am__dirstamp) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-man + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-binPROGRAMS + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: install-man1 + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-binPROGRAMS uninstall-man + +uninstall-man: uninstall-man1 + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ + clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \ + ctags ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-binPROGRAMS \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man install-man1 \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \ + uninstall-binPROGRAMS uninstall-man uninstall-man1 + +.PRECIOUS: Makefile + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: + +# Tell GNU make to disable its built-in pattern rules. +%:: %,v +%:: RCS/%,v +%:: RCS/% +%:: s.% +%:: SCCS/s.% diff --git a/local/recipes/libs/lcms2/source/utils/linkicc/linkicc.1 b/local/recipes/libs/lcms2/source/utils/linkicc/linkicc.1 new file mode 100644 index 0000000000..56f73bb9a1 --- /dev/null +++ b/local/recipes/libs/lcms2/source/utils/linkicc/linkicc.1 @@ -0,0 +1,123 @@ +.\"Shiju P. Nair September 30, 2004 +.\"Thomas Weber April 23, 2014 +.TH LINKICC 1 "September 30, 2004" +.SH NAME +linkicc - little cms device link generator. +.SH SYNOPSIS +.B linkicc +.RI [ options ] " profiles" +.SH DESCRIPTION +lcms is a standalone CMM engine, which deals with the color management. +It implements a fast transformation between ICC profiles. +.B linkicc +is a little cms device link generator. +.P +Links two or more profiles into a single devicelink profile. +Colorspaces must be paired except Lab/XYZ, that can be interchanged. +.SH OPTIONS +.TP +.BR \-a\ NUM +Observer adaptation state (abs.col. only), (0..1.0, float value) [defaults to 1.0]. +.TP +.B \-b +Black point compensation. +.TP +.BI \-c\ precision +Precision (0=LowRes, 1=Normal, 2=Hi-res) [defaults to 1]. +.TP +.BI \-d\ description +Description text (quotes can be used). +.TP +.BI \-h\ NUM +Show summary of options and examples (0=help, 1=Built-in profiles, 2=Examples, 3=Contact information) +.TP +.BI \-k\ inklimit +Ink-limiting in % (CMYK only), (0..400.0, float value) [default 400.0]. +.TP +.B \-l +Use linearization curves (may affect accuracy). +.TP +.BI \-n\ gridpoints +Alternate way to set precision, number of CLUT points. +.TP +.BI \-o\ profile +Output devicelink profile [defaults to 'devicelink.icm']. +.TP +.BI \-r\ profileversion +Profile version. (CAUTION: may change the profile implementation), (2.0..4.3, float value) [defaults to 4.3]. +.TP +.BI \-t\ NUM +Rendering intent +.nf +.RS +0=Perceptual [default] +1=Relative colorimetric +2=Saturation +3=Absolute colorimetric +10=Perceptual preserving black ink +11=Relative colorimetric preserving black ink +12=Saturation preserving black ink +13=Perceptual preserving black plane +14=Relative colorimetric preserving black plane +15=Saturation preserving black plane +.RE +.fi +.TP +.BI \-v\ verbosity +Verbosity level, (0=None, 1=Normal, 2=High, 3=Very High) [defaults to 0]. +.TP +.B \-x +Creatively, guess deviceclass of resulting profile. +.TP +.BI \-y\ copyright +Copyright notice (quotes can be used) ["No copyright, use freely"]. +.TP +.B \-8 +Creates 8-bit devicelink. +.SH BUILT-IN PROFILES +.nf + *Lab2 -- D50-based v2 CIEL*a*b + *Lab4 -- D50-based v4 CIEL*a*b + *Lab -- D50-based v4 CIEL*a*b + *XYZ -- CIE XYZ (PCS) + *sRGB -- sRGB color space + *Gray22 - Monochrome of Gamma 2.2 + *Gray30 - Monochrome of Gamma 3.0 + *null - Monochrome black for all input + *Lin2222- CMYK linearization of gamma 2.2 on each channel +.fi +.SH EXAMPLES +.nf +To create 'devicelink.icm' from a.icc to b.icc: + linkicc a.icc b.icc + +To create 'out.icc' from sRGB to cmyk.icc: + linkicc -o out.icc *sRGB cmyk.icc + +To create a sRGB input profile working in Lab: + linkicc -x -o sRGBLab.icc *sRGB *Lab + +To create a XYZ -> sRGB output profile: + linkicc -x -o sRGBLab.icc *XYZ *sRGB + +To create a abstract profile doing softproof for cmyk.icc: + linkicc -t1 -x -o softproof.icc *Lab cmyk.icc cmyk.icc *Lab + +To create a 'grayer' sRGB input profile: + linkicc -x -o grayer.icc *sRGB gray.icc gray.icc *Lab + +To embed ink limiting into a cmyk output profile: + linkicc -x -o cmyklimited.icc -k 250 cmyk.icc *Lab + +.fi +.SH NOTES +For suggestions, comments, bug reports etc. send mail to +info@littlecms.com. +.SH SEE ALSO +.BR jpgicc (1), +.BR psicc (1), +.BR tificc (1), +.BR transicc (1) +.SH AUTHOR +This manual page was written by Shiju p. Nair , +for the Debian project. diff --git a/local/recipes/libs/lcms2/source/utils/linkicc/linkicc.c b/local/recipes/libs/lcms2/source/utils/linkicc/linkicc.c new file mode 100644 index 0000000000..7deed17556 --- /dev/null +++ b/local/recipes/libs/lcms2/source/utils/linkicc/linkicc.c @@ -0,0 +1,378 @@ +//--------------------------------------------------------------------------------- +// +// Little Color Management System +// Copyright (c) 1998-2026 Marti Maria Saguer +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//--------------------------------------------------------------------------------- + +#include "utils.h" + +// --------------------------------------------------------------------------------- + +static char* Description = "Devicelink profile"; +static char* Copyright = "No copyright, use freely"; +static int Intent = INTENT_PERCEPTUAL; +static char* cOutProf = "devicelink.icc"; +static int PrecalcMode = 1; +static int NumOfGridPoints = 0; + +static cmsFloat64Number ObserverAdaptationState = 1.0; // According ICC 4.2 this is the default + +static cmsBool BlackPointCompensation = FALSE; + +static cmsFloat64Number InkLimit = 400; +static cmsBool lUse8bits = FALSE; +static cmsBool TagResult = FALSE; +static cmsBool KeepLinearization = FALSE; +static cmsFloat64Number Version = 4.3; + + +// The manual +static +int Help(int level) +{ + UTILS_UNUSED_PARAMETER(level); + + fprintf(stderr, "Little CMS ICC device link generator - v3.3 [LittleCMS %2.2f]\n", cmsGetEncodedCMMversion() / 1000.0); + fprintf(stderr, "Copyright (c) 1998-2026 Marti Maria Saguer. See COPYING file for details.\n\n"); + + fprintf(stderr, "\nlinkicc: Links profiles into a single devicelink.\n"); + + fprintf(stderr, "\n"); + fprintf(stderr, "usage: linkicc [flags] \n\n"); + fprintf(stderr, "flags:\n\n"); + fprintf(stderr, "-o - Output devicelink profile. [defaults to 'devicelink.icc']\n"); + + PrintRenderingIntents(); + + fprintf(stderr, "-c<0,1,2> - Precision (0=LowRes, 1=Normal, 2=Hi-res) [defaults to 1]\n"); + fprintf(stderr, "-n - Alternate way to set precision, number of CLUT points\n"); + fprintf(stderr, "-d - description text (quotes can be used)\n"); + fprintf(stderr, "-y - copyright notice (quotes can be used)\n"); + + fprintf(stderr, "\n-k<0..400> - Ink-limiting in %% (CMYK only)\n"); + fprintf(stderr, "-8 - Creates 8-bit devicelink\n"); + fprintf(stderr, "-x - Creatively, guess deviceclass of resulting profile.\n"); + fprintf(stderr, "-b - Black point compensation\n"); + fprintf(stderr, "-a<0..1> - Observer adaptation state (abs.col. only)\n\n"); + fprintf(stderr, "-l - Use linearization curves (may affect accuracy)\n"); + fprintf(stderr, "-r - Profile version. (CAUTION: may change the profile implementation)\n"); + fprintf(stderr, "\n"); + fprintf(stderr, "Colorspaces must be paired except Lab/XYZ, that can be interchanged.\n\n"); + + PrintBuiltins(); + + fprintf(stderr, "\nExamples:\n\n" + "To create 'devicelink.icm' from a.icc to b.icc:\n" + "\tlinkicc a.icc b.icc\n\n" + "To create 'out.icc' from sRGB to cmyk.icc:\n" + "\tlinkicc -o out.icc *sRGB cmyk.icc\n\n" + "To create a sRGB input profile working in Lab:\n" + "\tlinkicc -x -o sRGBLab.icc *sRGB *Lab\n\n" + "To create a XYZ -> sRGB output profile:\n" + "\tlinkicc -x -o sRGBLab.icc *XYZ *sRGB\n\n" + "To create a abstract profile doing softproof for cmyk.icc:\n" + "\tlinkicc -t1 -x -o softproof.icc *Lab cmyk.icc cmyk.icc *Lab\n\n" + "To create a 'grayer' sRGB input profile:\n" + "\tlinkicc -x -o grayer.icc *sRGB gray.icc gray.icc *Lab\n\n" + "To embed ink limiting into a cmyk output profile:\n" + "\tlinkicc -x -o cmyklimited.icc -k 250 cmyk.icc *Lab\n\n"); + + fprintf(stderr, "This program is intended to be a demo of the Little CMS\n" + "color engine. Both lcms and this program are open source.\n" + "You can obtain both in source code at https://www.littlecms.com\n" + "For suggestions, comments, bug reports etc. send mail to\n" + "info@littlecms.com\n\n"); + + exit(0); +} + +// The toggles stuff +static +void HandleSwitches(int argc, char *argv[]) +{ + int s; + + while ((s = xgetopt(argc,argv,"a:A:BbC:c:D:d:h:H:k:K:lLn:N:O:o:r:R:T:t:V:v:xX8y:Y:-:")) != EOF) { + + switch (s) { + + case '-': + if (strcmp(xoptarg, "help") == 0) + { + Help(0); + } + else + { + FatalError("Unknown option - run without args to see valid ones.\n"); + } + break; + + case 'a': + case 'A': + ObserverAdaptationState = atof(xoptarg); + if (ObserverAdaptationState < 0 || + ObserverAdaptationState > 1.0) + FatalError("Adaptation state should be 0..1"); + break; + + case 'b': + case 'B': + BlackPointCompensation = TRUE; + break; + + case 'c': + case 'C': + PrecalcMode = atoi(xoptarg); + if (PrecalcMode < 0 || PrecalcMode > 2) { + FatalError("Unknown precalc mode '%d'", PrecalcMode); + } + break; + + case 'd': + case 'D': + // Doing that is correct and safe: Description points to memory allocated in the command line. + // same for Copyright and output devicelink. + Description = xoptarg; + break; + + case 'h': + case 'H': + Help(atoi(xoptarg)); + return; + + case 'k': + case 'K': + InkLimit = atof(xoptarg); + if (InkLimit < 0.0 || InkLimit > 400.0) { + FatalError("Ink limit must be 0%%..400%%"); + } + break; + + + case 'l': + case 'L': KeepLinearization = TRUE; + break; + + case 'n': + case 'N': + if (PrecalcMode != 1) { + FatalError("Precalc mode already specified"); + } + NumOfGridPoints = atoi(xoptarg); + break; + + case 'o': + case 'O': + cOutProf = xoptarg; + break; + + + case 'r': + case 'R': + Version = atof(xoptarg); + if (Version < 2.0 || Version > 4.3) { + fprintf(stderr, "WARNING: lcms was not aware of this version, tag types may be wrong!\n"); + } + break; + + case 't': + case 'T': + Intent = atoi(xoptarg); // Will be validated latter on + break; + + case 'V': + case 'v': + Verbose = atoi(xoptarg); + if (Verbose < 0 || Verbose > 3) { + FatalError("Unknown verbosity level '%d'", Verbose); + } + break; + + case '8': + lUse8bits = TRUE; + break; + + + + case 'y': + case 'Y': + Copyright = xoptarg; + break; + + + + case 'x': + case 'X': TagResult = TRUE; + break; + + + default: + + FatalError("Unknown option - run without args to see valid ones.\n"); + } + } +} + +// Set the copyright and description +static +cmsBool SetTextTags(cmsHPROFILE hProfile) +{ + cmsMLU *DescriptionMLU, *CopyrightMLU; + cmsBool rc = FALSE; + cmsContext ContextID = cmsGetProfileContextID(hProfile); + + DescriptionMLU = cmsMLUalloc(ContextID, 1); + CopyrightMLU = cmsMLUalloc(ContextID, 1); + + if (DescriptionMLU == NULL || CopyrightMLU == NULL) goto Error; + + if (!cmsMLUsetASCII(DescriptionMLU, "en", "US", Description)) goto Error; + if (!cmsMLUsetASCII(CopyrightMLU, "en", "US", Copyright)) goto Error; + + if (!cmsWriteTag(hProfile, cmsSigProfileDescriptionTag, DescriptionMLU)) goto Error; + if (!cmsWriteTag(hProfile, cmsSigCopyrightTag, CopyrightMLU)) goto Error; + + rc = TRUE; + +Error: + + if (DescriptionMLU) + cmsMLUfree(DescriptionMLU); + if (CopyrightMLU) + cmsMLUfree(CopyrightMLU); + return rc; +} + + + +int main(int argc, char *argv[]) +{ + int i, nargs, rc; + cmsHPROFILE Profiles[257]; + cmsHPROFILE hProfile; + cmsUInt32Number dwFlags; + cmsHTRANSFORM hTransform = NULL; + + // Initialize + InitUtils("linkicc"); + rc = 0; + + // Get the options + HandleSwitches(argc, argv); + + // How many profiles to link? + nargs = (argc - xoptind); + if (nargs < 1) + return Help(0); + + if (nargs > 255) { + FatalError("Holy profile! what are you trying to do with so many profiles!?"); + goto Cleanup; + } + + // Open all profiles + memset(Profiles, 0, sizeof(Profiles)); + for (i=0; i < nargs; i++) { + + Profiles[i] = OpenStockProfile(0, argv[i + xoptind]); + if (Profiles[i] == NULL) goto Cleanup; + + if (Verbose >= 1) { + PrintProfileInformation(Profiles[i]); + } + } + + // Ink limiting + if (InkLimit != 400.0) { + cmsColorSpaceSignature EndingColorSpace = cmsGetColorSpace(Profiles[nargs-1]); + Profiles[nargs++] = cmsCreateInkLimitingDeviceLink(EndingColorSpace, InkLimit); + } + + // Set the flags + dwFlags = cmsFLAGS_KEEP_SEQUENCE; + switch (PrecalcMode) { + + case 0: dwFlags |= cmsFLAGS_LOWRESPRECALC; break; + case 2: dwFlags |= cmsFLAGS_HIGHRESPRECALC; break; + case 1: + if (NumOfGridPoints > 0) + dwFlags |= cmsFLAGS_GRIDPOINTS(NumOfGridPoints); + break; + + default: + { + FatalError("Unknown precalculation mode '%d'", PrecalcMode); + goto Cleanup; + } + } + + if (BlackPointCompensation) + dwFlags |= cmsFLAGS_BLACKPOINTCOMPENSATION; + + if (TagResult) + dwFlags |= cmsFLAGS_GUESSDEVICECLASS; + + if (KeepLinearization) + dwFlags |= cmsFLAGS_CLUT_PRE_LINEARIZATION|cmsFLAGS_CLUT_POST_LINEARIZATION; + + if (lUse8bits) dwFlags |= cmsFLAGS_8BITS_DEVICELINK; + + cmsSetAdaptationState(ObserverAdaptationState); + + // Create the color transform. Specify 0 for the format is safe as the transform + // is intended to be used only for the devicelink. + hTransform = cmsCreateMultiprofileTransform(Profiles, nargs, 0, 0, Intent, dwFlags|cmsFLAGS_NOOPTIMIZE); + if (hTransform == NULL) { + FatalError("Transform creation failed"); + goto Cleanup; + } + + hProfile = cmsTransform2DeviceLink(hTransform, Version, dwFlags); + if (hProfile == NULL) { + FatalError("Devicelink creation failed"); + goto Cleanup; + } + + SetTextTags(hProfile); + cmsSetHeaderRenderingIntent(hProfile, Intent); + + if (cmsSaveProfileToFile(hProfile, cOutProf)) { + + if (Verbose > 0) + fprintf(stderr, "Ok"); + } + else + FatalError("Error saving file!"); + + cmsCloseProfile(hProfile); + + +Cleanup: + + if (hTransform != NULL) cmsDeleteTransform(hTransform); + for (i=0; i < nargs; i++) { + + if (Profiles[i] != NULL) cmsCloseProfile(Profiles[i]); + } + + return rc; +} diff --git a/local/recipes/libs/lcms2/source/utils/linkicc/meson.build b/local/recipes/libs/lcms2/source/utils/linkicc/meson.build new file mode 100644 index 0000000000..c2384275dd --- /dev/null +++ b/local/recipes/libs/lcms2/source/utils/linkicc/meson.build @@ -0,0 +1,16 @@ +linkicc_sources = files( + 'linkicc.c', +) + +linkicc_exe = executable( + 'linkicc', + linkicc_sources, + dependencies: [liblcms2_dep, common_dep], + install: true, +) + +linkicc_man = files( + 'linkicc.1', +) + +install_man(linkicc_man) diff --git a/local/recipes/libs/lcms2/source/utils/matlab/howto.txt b/local/recipes/libs/lcms2/source/utils/matlab/howto.txt new file mode 100644 index 0000000000..2490d3df4b --- /dev/null +++ b/local/recipes/libs/lcms2/source/utils/matlab/howto.txt @@ -0,0 +1,4 @@ + +To compile for matlab use: + +mex @lcms_rsp diff --git a/local/recipes/libs/lcms2/source/utils/matlab/icctrans.c b/local/recipes/libs/lcms2/source/utils/matlab/icctrans.c new file mode 100644 index 0000000000..2125f94526 --- /dev/null +++ b/local/recipes/libs/lcms2/source/utils/matlab/icctrans.c @@ -0,0 +1,724 @@ +// +// Little cms +// Copyright (C) 1998-2010 Marti Maria, Ignacio Ruiz de Conejo +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +#include "mex.h" + +#include "lcms2.h" +#include "string.h" +#include "stdarg.h" + +// xgetopt() interface ----------------------------------------------------- + +static int xoptind; +static char *xoptarg; +static int xopterr; +static char *letP; +static char SW = '-'; + +// ------------------------------------------------------------------------ + + +static int Verbose ; // Print some statistics +static char *cInProf; // Input profile +static char *cOutProf; // Output profile +static char *cProofing; // Softproofing profile + + +static int Intent; // Rendering Intent +static int ProofingIntent; // RI for proof + +static int PrecalcMode; // 0 = Not, 1=Normal, 2=Accurate, 3=Fast + +static cmsBool BlackPointCompensation; +static cmsBool lIsDeviceLink; +static cmsBool lMultiProfileChain; // Multiple profile chain + +static cmsHPROFILE hInput, hOutput, hProof; +static cmsHTRANSFORM hColorTransform; +static cmsHPROFILE hProfiles[255]; +static int nProfiles; + +static cmsColorSpaceSignature InputColorSpace, OutputColorSpace; +static int OutputChannels, InputChannels, nBytesDepth; + + +// Error. Print error message and abort + +static +cmsBool FatalError(const char *frm, ...) +{ + va_list args; + char Buffer[1024]; + + va_start(args, frm); + vsprintf(Buffer, frm, args); + mexErrMsgTxt(Buffer); + va_end(args); + + return FALSE; +} + +// This is the handler passed to lcms + +static +void MatLabErrorHandler(cmsContext ContextID, cmsUInt32Number ErrorCode, + const char *Text) +{ + mexErrMsgTxt(Text); +} +// +// Parse the command line options, System V style. +// + +static +void xoptinit() +{ + xoptind = 1; + xopterr = 0; + letP = NULL; +} + + +static +int xgetopt(int argc, char *argv[], char *optionS) +{ + unsigned char ch; + char *optP; + + if (SW == 0) { + SW = '/'; + } + + if (argc > xoptind) { + if (letP == NULL) { + if ((letP = argv[xoptind]) == NULL || + *(letP++) != SW) goto gopEOF; + if (*letP == SW) { + xoptind++; goto gopEOF; + } + } + if (0 == (ch = *(letP++))) { + xoptind++; goto gopEOF; + } + if (':' == ch || (optP = strchr(optionS, ch)) == NULL) + goto gopError; + if (':' == *(++optP)) { + xoptind++; + if (0 == *letP) { + if (argc <= xoptind) goto gopError; + letP = argv[xoptind++]; + } + xoptarg = letP; + letP = NULL; + } else { + if (0 == *letP) { + xoptind++; + letP = NULL; + } + xoptarg = NULL; + } + return ch; + } +gopEOF: + xoptarg = letP = NULL; + return EOF; + +gopError: + xoptarg = NULL; + if (xopterr) + FatalError ("get command line option"); + return ('?'); +} + + +// Return Mathlab type by depth + +static +size_t SizeOfArrayType(const mxArray *Array) +{ + + switch (mxGetClassID(Array)) { + + case mxINT8_CLASS: return 1; + case mxUINT8_CLASS: return 1; + case mxINT16_CLASS: return 2; + case mxUINT16_CLASS: return 2; + case mxSINGLE_CLASS: return 4; + case mxDOUBLE_CLASS: return 0; // Special case -- lcms handles double as size=0 + + + default: + FatalError("Unsupported data type"); + return 0; + } +} + + +// Get number of pixels of input array. Supported arrays are +// organized as NxMxD, being N and M the size of image and D the +// number of components. + +static +size_t GetNumberOfPixels(const mxArray* In) +{ + int nDimensions = mxGetNumberOfDimensions(In); + const int *Dimensions = mxGetDimensions(In); + + switch (nDimensions) { + + case 1: return 1; // It is just a spot color + case 2: return Dimensions[0]; // A scanline + case 3: return Dimensions[0]*Dimensions[1]; // A image + + default: + FatalError("Unsupported array of %d dimensions", nDimensions); + return 0; + } +} + + +// Allocates the output array. Copies the input array modifying the pixel +// definition to match "OutputChannels". + +static +mxArray* AllocateOutputArray(const mxArray* In, int OutputChannels) +{ + + mxArray* Out = mxDuplicateArray(In); // Make a "deep copy" of Input array + int nDimensions = mxGetNumberOfDimensions(In); + const int* Dimensions = mxGetDimensions(In); + int InputChannels = Dimensions[nDimensions-1]; + + + // Modify pixel size only if needed + + if (InputChannels != OutputChannels) { + + + int i, NewSize; + int *ModifiedDimensions = (int*) mxMalloc(nDimensions * sizeof(int)); + + + memmove(ModifiedDimensions, Dimensions, nDimensions * sizeof(int)); + ModifiedDimensions[nDimensions - 1] = OutputChannels; + + switch (mxGetClassID(In)) { + + case mxINT8_CLASS: NewSize = sizeof(char); break; + case mxUINT8_CLASS: NewSize = sizeof(unsigned char); break; + case mxINT16_CLASS: NewSize = sizeof(short); break; + case mxUINT16_CLASS: NewSize = sizeof(unsigned short); break; + + default: + case mxDOUBLE_CLASS: NewSize = sizeof(double); break; + } + + + // NewSize = 1; + for (i=0; i < nDimensions; i++) + NewSize *= ModifiedDimensions[i]; + + + mxSetDimensions(Out, ModifiedDimensions, nDimensions); + mxFree(ModifiedDimensions); + + mxSetPr(Out, mxRealloc(mxGetPr(Out), NewSize)); + + } + + + return Out; +} + + + +// Does create a format descriptor. "Bytes" is the sizeof type in bytes +// +// Bytes Meaning +// ------ -------- +// 0 Floating point (double) +// 1 8-bit samples +// 2 16-bit samples + +static +cmsUInt32Number MakeFormatDescriptor(cmsColorSpaceSignature ColorSpace, int Bytes) +{ + int IsFloat = (Bytes == 0 || Bytes == 4) ? 1 : 0; + int Channels = cmsChannelsOf(ColorSpace); + return FLOAT_SH(IsFloat)|COLORSPACE_SH(_cmsLCMScolorSpace(ColorSpace))|BYTES_SH(Bytes)|CHANNELS_SH(Channels)|PLANAR_SH(1); +} + + +// Opens a profile or proper built-in + +static +cmsHPROFILE OpenProfile(const char* File) +{ + + cmsContext ContextID = 0; + + if (!File) + return cmsCreate_sRGBProfileTHR(ContextID); + + if (cmsstrcasecmp(File, "*Lab2") == 0) + return cmsCreateLab2ProfileTHR(ContextID, NULL); + + if (cmsstrcasecmp(File, "*Lab4") == 0) + return cmsCreateLab4ProfileTHR(ContextID, NULL); + + if (cmsstrcasecmp(File, "*Lab") == 0) + return cmsCreateLab4ProfileTHR(ContextID, NULL); + + if (cmsstrcasecmp(File, "*LabD65") == 0) { + + cmsCIExyY D65xyY; + + cmsWhitePointFromTemp( &D65xyY, 6504); + return cmsCreateLab4ProfileTHR(ContextID, &D65xyY); + } + + if (cmsstrcasecmp(File, "*XYZ") == 0) + return cmsCreateXYZProfileTHR(ContextID); + + if (cmsstrcasecmp(File, "*Gray22") == 0) { + + cmsToneCurve* Curve = cmsBuildGamma(ContextID, 2.2); + cmsHPROFILE hProfile = cmsCreateGrayProfileTHR(ContextID, cmsD50_xyY(), Curve); + cmsFreeToneCurve(Curve); + return hProfile; + } + + if (cmsstrcasecmp(File, "*Gray30") == 0) { + + cmsToneCurve* Curve = cmsBuildGamma(ContextID, 3.0); + cmsHPROFILE hProfile = cmsCreateGrayProfileTHR(ContextID, cmsD50_xyY(), Curve); + cmsFreeToneCurve(Curve); + return hProfile; + } + + if (cmsstrcasecmp(File, "*srgb") == 0) + return cmsCreate_sRGBProfileTHR(ContextID); + + if (cmsstrcasecmp(File, "*null") == 0) + return cmsCreateNULLProfileTHR(ContextID); + + + if (cmsstrcasecmp(File, "*Lin2222") == 0) { + + cmsToneCurve* Gamma = cmsBuildGamma(0, 2.2); + cmsToneCurve* Gamma4[4]; + cmsHPROFILE hProfile; + + Gamma4[0] = Gamma4[1] = Gamma4[2] = Gamma4[3] = Gamma; + hProfile = cmsCreateLinearizationDeviceLink(cmsSigCmykData, Gamma4); + cmsFreeToneCurve(Gamma); + return hProfile; + } + + + return cmsOpenProfileFromFileTHR(ContextID, File, "r"); +} + + +static +cmsUInt32Number GetFlags() +{ + cmsUInt32Number dwFlags = 0; + + switch (PrecalcMode) { + + case 0: dwFlags = cmsFLAGS_NOOPTIMIZE; break; + case 2: dwFlags = cmsFLAGS_HIGHRESPRECALC; break; + case 3: dwFlags = cmsFLAGS_LOWRESPRECALC; break; + case 1: break; + + default: FatalError("Unknown precalculation mode '%d'", PrecalcMode); + } + + if (BlackPointCompensation) + dwFlags |= cmsFLAGS_BLACKPOINTCOMPENSATION; + + return dwFlags; +} + +// Create transforms + +static +void OpenTransforms(int argc, char *argv[]) +{ + + cmsUInt32Number dwIn, dwOut, dwFlags; + + + if (lMultiProfileChain) { + + int i; + cmsHTRANSFORM hTmp; + + + nProfiles = argc - xoptind; + for (i=0; i < nProfiles; i++) { + + hProfiles[i] = OpenProfile(argv[i+xoptind]); + } + + + // Create a temporary devicelink + + hTmp = cmsCreateMultiprofileTransform(hProfiles, nProfiles, + 0, 0, Intent, GetFlags()); + + hInput = cmsTransform2DeviceLink(hTmp, 4.2, 0); + hOutput = NULL; + cmsDeleteTransform(hTmp); + + InputColorSpace = cmsGetColorSpace(hInput); + OutputColorSpace = cmsGetPCS(hInput); + lIsDeviceLink = TRUE; + + } + else + if (lIsDeviceLink) { + + hInput = cmsOpenProfileFromFile(cInProf, "r"); + hOutput = NULL; + InputColorSpace = cmsGetColorSpace(hInput); + OutputColorSpace = cmsGetPCS(hInput); + + + } + else { + + hInput = OpenProfile(cInProf); + hOutput = OpenProfile(cOutProf); + + InputColorSpace = cmsGetColorSpace(hInput); + OutputColorSpace = cmsGetColorSpace(hOutput); + + if (cmsGetDeviceClass(hInput) == cmsSigLinkClass || + cmsGetDeviceClass(hOutput) == cmsSigLinkClass) + FatalError("Use %cl flag for devicelink profiles!\n", SW); + + } + + + /* + + if (Verbose) { + + mexPrintf("From: %s\n", cmsTakeProductName(hInput)); + if (hOutput) mexPrintf("To : %s\n\n", cmsTakeProductName(hOutput)); + + } + */ + + + OutputChannels = cmsChannelsOf(OutputColorSpace); + InputChannels = cmsChannelsOf(InputColorSpace); + + + dwIn = MakeFormatDescriptor(InputColorSpace, nBytesDepth); + dwOut = MakeFormatDescriptor(OutputColorSpace, nBytesDepth); + + + dwFlags = GetFlags(); + + if (cProofing != NULL) { + + hProof = OpenProfile(cProofing); + dwFlags |= cmsFLAGS_SOFTPROOFING; + } + + + + + hColorTransform = cmsCreateProofingTransform(hInput, dwIn, + hOutput, dwOut, + hProof, Intent, + ProofingIntent, + dwFlags); + +} + + + +static +void ApplyTransforms(const mxArray *In, mxArray *Out) +{ + double *Input = mxGetPr(In); + double *Output = mxGetPr(Out); + size_t nPixels = GetNumberOfPixels(In);; + + cmsDoTransform(hColorTransform, Input, Output, nPixels ); + +} + + +static +void CloseTransforms(void) +{ + int i; + + if (hColorTransform) cmsDeleteTransform(hColorTransform); + if (hInput) cmsCloseProfile(hInput); + if (hOutput) cmsCloseProfile(hOutput); + if (hProof) cmsCloseProfile(hProof); + + for (i=0; i < nProfiles; i++) + cmsCloseProfile(hProfiles[i]); + + hColorTransform = NULL; hInput = NULL; hOutput = NULL; hProof = NULL; +} + + +static +void HandleSwitches(int argc, char *argv[]) +{ + int s; + + xoptinit(); + + while ((s = xgetopt(argc, argv,"C:c:VvbBI:i:O:o:T:t:L:l:r:r:P:p:Mm")) != EOF) { + + + switch (s){ + + case 'b': + case 'B': + BlackPointCompensation = TRUE; + break; + + case 'c': + case 'C': + PrecalcMode = atoi(xoptarg); + if (PrecalcMode < 0 || PrecalcMode > 3) + FatalError("Unknown precalc mode '%d'", PrecalcMode); + break; + + case 'v': + case 'V': + Verbose = TRUE; + break; + + case 'i': + case 'I': + if (lIsDeviceLink) + FatalError("Device-link already specified"); + cInProf = xoptarg; + break; + + case 'o': + case 'O': + if (lIsDeviceLink) + FatalError("Device-link already specified"); + cOutProf = xoptarg; + break; + + case 't': + case 'T': + Intent = atoi(xoptarg); + // if (Intent > 3) Intent = 3; + if (Intent < 0) Intent = 0; + break; + + + case 'l': + case 'L': + cInProf = xoptarg; + lIsDeviceLink = TRUE; + break; + + case 'p': + case 'P': + cProofing = xoptarg; + break; + + + + case 'r': + case 'R': + ProofingIntent = atoi(xoptarg); + // if (ProofingIntent > 3) ProofingIntent = 3; + if (ProofingIntent < 0) ProofingIntent = 0; + break; + + + case 'm': + case 'M': + lMultiProfileChain = TRUE; + break; + + default: + FatalError("Unknown option."); + } + } + + // For multiprofile, need to specify -m + + if (xoptind < argc) { + + if (!lMultiProfileChain) + FatalError("Use %cm for multiprofile transforms", SW); + } + +} + + + +// -------------------------------------------------- Print some fancy help +static +void PrintHelp(void) +{ + mexPrintf("(MX) little cms ColorSpace conversion tool - v2.0\n\n"); + + mexPrintf("usage: icctrans (mVar, flags)\n\n"); + + mexPrintf("mVar : Matlab array.\n"); + mexPrintf("flags: a string containing one or more of following options.\n\n"); + mexPrintf("\t%cv - Verbose\n", SW); + mexPrintf("\t%ci - Input profile (defaults to sRGB)\n", SW); + mexPrintf("\t%co - Output profile (defaults to sRGB)\n", SW); + mexPrintf("\t%cl - Transform by device-link profile\n", SW); + mexPrintf("\t%cm - Apply multiprofile chain\n", SW); + + mexPrintf("\t%ct - Rendering intent\n", SW); + + mexPrintf("\t%cb - Black point compensation\n", SW); + mexPrintf("\t%cc<0,1,2,3> - Optimize transform (0=Off, 1=Normal, 2=Hi-res, 3=Lo-Res) [defaults to 1]\n", SW); + + mexPrintf("\t%cp - Soft proof profile\n", SW); + mexPrintf("\t%cr<0,1,2,3> - Soft proof intent\n", SW); + + mexPrintf("\nYou can use following built-ins as profiles:\n\n"); + + mexPrintf("\t*Lab2 -- D50-based v2 CIEL*a*b\n" + "\t*Lab4 -- D50-based v4 CIEL*a*b\n" + "\t*Lab -- D50-based v4 CIEL*a*b\n" + "\t*XYZ -- CIE XYZ (PCS)\n" + "\t*sRGB -- IEC6 1996-2.1 sRGB color space\n" + "\t*Gray22 - Monochrome of Gamma 2.2\n" + "\t*Gray30 - Monochrome of Gamma 3.0\n" + "\t*null - Monochrome black for all input\n" + "\t*Lin2222- CMYK linearization of gamma 2.2 on each channel\n\n"); + + mexPrintf("For suggestions, comments, bug reports etc. send mail to info@littlecms.com\n\n"); + +} + + + +// Main entry point + +void mexFunction( + int nlhs, // Number of left hand side (output) arguments + mxArray *plhs[], // Array of left hand side arguments + int nrhs, // Number of right hand side (input) arguments + const mxArray *prhs[] // Array of right hand side arguments +) +{ + + char CommandLine[4096+1]; + char *pt, *argv[128]; + int argc = 1; + + + if (nrhs != 2) { + + PrintHelp(); + return; + } + + + if(nlhs > 1) { + FatalError("Too many output arguments."); + } + + + // Setup error handler + + cmsSetLogErrorHandler(MatLabErrorHandler); + + // Defaults + + Verbose = 0; + cInProf = NULL; + cOutProf = NULL; + cProofing = NULL; + + lMultiProfileChain = FALSE; + nProfiles = 0; + + Intent = INTENT_PERCEPTUAL; + ProofingIntent = INTENT_ABSOLUTE_COLORIMETRIC; + PrecalcMode = 1; + BlackPointCompensation = FALSE; + lIsDeviceLink = FALSE; + + // Check types. Fist parameter is array of values, second parameter is command line + + if (!mxIsNumeric(prhs[0])) + FatalError("Type mismatch on argument 1 -- Must be numeric"); + + if (!mxIsChar(prhs[1])) + FatalError("Type mismatch on argument 2 -- Must be string"); + + + + + // Unpack string to command line buffer + + if (mxGetString(prhs[1], CommandLine, 4096)) + FatalError("Cannot unpack command string"); + + // Separate to argv[] convention + + argv[0] = NULL; + for (pt = strtok(CommandLine, " "); + pt; + pt = strtok(NULL, " ")) { + + argv[argc++] = pt; + } + + + + // Parse arguments + HandleSwitches(argc, argv); + + + nBytesDepth = SizeOfArrayType(prhs[0]); + + OpenTransforms(argc, argv); + + + plhs[0] = AllocateOutputArray(prhs[0], OutputChannels); + + + ApplyTransforms(prhs[0], plhs[0]); + + CloseTransforms(); + + // Done! +} + + diff --git a/local/recipes/libs/lcms2/source/utils/matlab/lcms_rsp b/local/recipes/libs/lcms2/source/utils/matlab/lcms_rsp new file mode 100644 index 0000000000..06c4a96e2b --- /dev/null +++ b/local/recipes/libs/lcms2/source/utils/matlab/lcms_rsp @@ -0,0 +1,30 @@ +-v -compatibleArrayDims +-O +-I../../include +icctrans.c +../../src/cmscam02.c +../../src/cmscgats.c +../../src/cmscnvrt.c +../../src/cmserr.c +../../src/cmsgamma.c +../../src/cmsgmt.c +../../src/cmsintrp.c +../../src/cmsio0.c +../../src/cmsio1.c +../../src/cmslut.c +../../src/cmsmd5.c +../../src/cmsmtrx.c +../../src/cmsnamed.c +../../src/cmsopt.c +../../src/cmspack.c +../../src/cmspcs.c +../../src/cmsplugin.c +../../src/cmsps2.c +../../src/cmssamp.c +../../src/cmssm.c +../../src/cmstypes.c +../../src/cmsvirt.c +../../src/cmswtpnt.c +../../src/cmsxform.c +../../src/cmshalf.c +../../src/cmsalpha.c diff --git a/local/recipes/libs/lcms2/source/utils/meson.build b/local/recipes/libs/lcms2/source/utils/meson.build new file mode 100644 index 0000000000..49316b13fc --- /dev/null +++ b/local/recipes/libs/lcms2/source/utils/meson.build @@ -0,0 +1,10 @@ +subdir('common') +if jpeg_dep.found() + subdir('jpgicc') +endif +subdir('linkicc') +subdir('psicc') +if tiff_dep.found() + subdir('tificc') +endif +subdir('transicc') diff --git a/local/recipes/libs/lcms2/source/utils/psicc/Makefile.am b/local/recipes/libs/lcms2/source/utils/psicc/Makefile.am new file mode 100644 index 0000000000..2e9d17c939 --- /dev/null +++ b/local/recipes/libs/lcms2/source/utils/psicc/Makefile.am @@ -0,0 +1,19 @@ +# +# Makefile for building psicc +# Originally Written by Bob Friesenhahn, June 2003 +# Additions and bugs by Marti Maria + +# Don't require all the GNU mandated files +AUTOMAKE_OPTIONS = 1.7 foreign no-dependencies + +AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include \ + -I$(top_srcdir)/utils/common -I$(top_builddir)/utils/common + +bin_PROGRAMS = psicc + +psicc_LDADD = $(top_builddir)/src/liblcms2.la @LCMS_LIB_DEPLIBS@ +psicc_LDFLAGS = @LDFLAGS@ +psicc_SOURCES = psicc.c ../common/xgetopt.c ../common/vprf.c ../common/utils.h +man_MANS = psicc.1 + +EXTRA_DIST = $(man_MANS) diff --git a/local/recipes/libs/lcms2/source/utils/psicc/Makefile.in b/local/recipes/libs/lcms2/source/utils/psicc/Makefile.in new file mode 100644 index 0000000000..feb08939c9 --- /dev/null +++ b/local/recipes/libs/lcms2/source/utils/psicc/Makefile.in @@ -0,0 +1,751 @@ +# Makefile.in generated by automake 1.18.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2025 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# +# Makefile for building psicc +# Originally Written by Bob Friesenhahn, June 2003 +# Additions and bugs by Marti Maria + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +am__rm_f = rm -f $(am__rm_f_notfound) +am__rm_rf = rm -rf $(am__rm_f_notfound) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +bin_PROGRAMS = psicc$(EXEEXT) +subdir = utils/psicc +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_append_compile_flags.m4 \ + $(top_srcdir)/m4/ax_append_flag.m4 \ + $(top_srcdir)/m4/ax_check_compile_flag.m4 \ + $(top_srcdir)/m4/ax_gcc_func_attribute.m4 \ + $(top_srcdir)/m4/ax_pthread.m4 \ + $(top_srcdir)/m4/ax_require_defined.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" +PROGRAMS = $(bin_PROGRAMS) +am__dirstamp = $(am__leading_dot)dirstamp +am_psicc_OBJECTS = psicc.$(OBJEXT) ../common/xgetopt.$(OBJEXT) \ + ../common/vprf.$(OBJEXT) +psicc_OBJECTS = $(am_psicc_OBJECTS) +psicc_DEPENDENCIES = $(top_builddir)/src/liblcms2.la +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +psicc_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(psicc_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ +depcomp = +am__maybe_remake_depfiles = +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(psicc_SOURCES) +DIST_SOURCES = $(psicc_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && echo $$files | $(am__xargs_n) 40 $(am__rm_f); }; \ + } +man1dir = $(mandir)/man1 +NROFF = nroff +MANS = $(man_MANS) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +am__DIST_COMMON = $(srcdir)/Makefile.in +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ETAGS = @ETAGS@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FILECMD = @FILECMD@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +JPEGICC_DEPLIBS = @JPEGICC_DEPLIBS@ +LCMS_LIB_DEPLIBS = @LCMS_LIB_DEPLIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBRARY_AGE = @LIBRARY_AGE@ +LIBRARY_CURRENT = @LIBRARY_CURRENT@ +LIBRARY_REVISION = @LIBRARY_REVISION@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_DEPS = @LIBTOOL_DEPS@ +LIB_JPEG = @LIB_JPEG@ +LIB_MATH = @LIB_MATH@ +LIB_PLUGINS = @LIB_PLUGINS@ +LIB_THREAD = @LIB_THREAD@ +LIB_TIFF = @LIB_TIFF@ +LIB_ZLIB = @LIB_ZLIB@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_CXX = @PTHREAD_CXX@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +TIFFICC_DEPLIBS = @TIFFICC_DEPLIBS@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__rm_f_notfound = @am__rm_f_notfound@ +am__tar = @am__tar@ +am__untar = @am__untar@ +am__xargs_n = @am__xargs_n@ +ax_pthread_config = @ax_pthread_config@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +inline = @inline@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +# Don't require all the GNU mandated files +AUTOMAKE_OPTIONS = 1.7 foreign no-dependencies +AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include \ + -I$(top_srcdir)/utils/common -I$(top_builddir)/utils/common + +psicc_LDADD = $(top_builddir)/src/liblcms2.la @LCMS_LIB_DEPLIBS@ +psicc_LDFLAGS = @LDFLAGS@ +psicc_SOURCES = psicc.c ../common/xgetopt.c ../common/vprf.c ../common/utils.h +man_MANS = psicc.1 +EXTRA_DIST = $(man_MANS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign utils/psicc/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign utils/psicc/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ + fi; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p \ + || test -f $$p1 \ + ; then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' \ + -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' \ + `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && $(am__rm_f) $$files + +clean-binPROGRAMS: + $(am__rm_f) $(bin_PROGRAMS) + test -z "$(EXEEXT)" || $(am__rm_f) $(bin_PROGRAMS:$(EXEEXT)=) +../common/$(am__dirstamp): + @$(MKDIR_P) ../common + @: >>../common/$(am__dirstamp) +../common/xgetopt.$(OBJEXT): ../common/$(am__dirstamp) +../common/vprf.$(OBJEXT): ../common/$(am__dirstamp) + +psicc$(EXEEXT): $(psicc_OBJECTS) $(psicc_DEPENDENCIES) $(EXTRA_psicc_DEPENDENCIES) + @rm -f psicc$(EXEEXT) + $(AM_V_CCLD)$(psicc_LINK) $(psicc_OBJECTS) $(psicc_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + -rm -f ../common/*.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +.c.o: + $(AM_V_CC)$(COMPILE) -c -o $@ $< + +.c.obj: + $(AM_V_CC)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: + $(AM_V_CC)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-man1: $(man_MANS) + @$(NORMAL_INSTALL) + @list1=''; \ + list2='$(man_MANS)'; \ + test -n "$(man1dir)" \ + && test -n "`echo $$list1$$list2`" \ + || exit 0; \ + echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ + { for i in $$list1; do echo "$$i"; done; \ + if test -n "$$list2"; then \ + for i in $$list2; do echo "$$i"; done \ + | sed -n '/\.1[a-z]*$$/p'; \ + fi; \ + } | while read p; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; echo "$$p"; \ + done | \ + sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ + sed 'N;N;s,\n, ,g' | { \ + list=; while read file base inst; do \ + if test "$$base" = "$$inst"; then list="$$list $$file"; else \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ + fi; \ + done; \ + for i in $$list; do echo "$$i"; done | $(am__base_list) | \ + while read files; do \ + test -z "$$files" || { \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ + done; } + +uninstall-man1: + @$(NORMAL_UNINSTALL) + @list=''; test -n "$(man1dir)" || exit 0; \ + files=`{ for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ + dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) $(MANS) +installdirs: + for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -$(am__rm_f) $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || $(am__rm_f) $(CONFIG_CLEAN_VPATH_FILES) + -$(am__rm_f) ../common/$(am__dirstamp) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-man + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-binPROGRAMS + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: install-man1 + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-binPROGRAMS uninstall-man + +uninstall-man: uninstall-man1 + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ + clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \ + ctags ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-binPROGRAMS \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man install-man1 \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \ + uninstall-binPROGRAMS uninstall-man uninstall-man1 + +.PRECIOUS: Makefile + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: + +# Tell GNU make to disable its built-in pattern rules. +%:: %,v +%:: RCS/%,v +%:: RCS/% +%:: s.% +%:: SCCS/s.% diff --git a/local/recipes/libs/lcms2/source/utils/psicc/meson.build b/local/recipes/libs/lcms2/source/utils/psicc/meson.build new file mode 100644 index 0000000000..6ea2178082 --- /dev/null +++ b/local/recipes/libs/lcms2/source/utils/psicc/meson.build @@ -0,0 +1,16 @@ +psicc_sources = files( + 'psicc.c', +) + +psicc_exe = executable( + 'psicc', + psicc_sources, + dependencies: [liblcms2_dep, common_dep], + install: true, +) + +psicc_man = files( + 'psicc.1', +) + +install_man(psicc_man) diff --git a/local/recipes/libs/lcms2/source/utils/psicc/psicc.1 b/local/recipes/libs/lcms2/source/utils/psicc/psicc.1 new file mode 100644 index 0000000000..816139eed2 --- /dev/null +++ b/local/recipes/libs/lcms2/source/utils/psicc/psicc.1 @@ -0,0 +1,46 @@ +.\"Shiju P. Nair September 30, 2004 +.\"Thomas Weber April 23, 2014 +.TH PSICC 1 "September 30, 2004" +.SH NAME +psicc - little cms PostScript converter. +.SH SYNOPSIS +.B psicc +.RI [ options ] +.SH DESCRIPTION +lcms is a standalone CMM engine, which deals with the color management. +It implements a fast transformation between ICC profiles. +.B psicc +is a little cms PostScript converter. +.SH OPTIONS +.TP +.B \-b +Black point compensation (CRD only). +.TP +.BI \-c\ precision +Precision (0=LowRes, 1=Normal, 2=Hi-res) (CRD only) [defaults to 1]. +.TP +.BI \-i\ profile +Input profile: Generates Color Space Array (CSA). +.TP +.BI \-n\ gridpoints +Alternate way to set precision, number of CLUT points (CRD only). +.TP +.BI \-o\ profile +Output profile: Generates Color Rendering Dictionary(CRD). +.TP +.BI \-t\ intent +Intent (0=Perceptual, 1=Colorimetric, 2=Saturation, 3=Absolute) [defaults to 0]. +.TP +.B \-u +Do NOT generate resource name on CRD. +.SH NOTES +For suggestions, comments, bug reports etc. send mail to +info@littlecms.com. +.SH SEE ALSO +.BR jpgicc (1), +.BR linkicc (1), +.BR tificc (1), +.BR transicc (1) +.SH AUTHOR +This manual page was written by Shiju p. Nair , +for the Debian project. diff --git a/local/recipes/libs/lcms2/source/utils/psicc/psicc.c b/local/recipes/libs/lcms2/source/utils/psicc/psicc.c new file mode 100644 index 0000000000..9146a9a6ed --- /dev/null +++ b/local/recipes/libs/lcms2/source/utils/psicc/psicc.c @@ -0,0 +1,248 @@ +//--------------------------------------------------------------------------------- +// +// Little Color Management System +// Copyright (c) 1998-2026 Marti Maria Saguer +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//--------------------------------------------------------------------------------- + +#include "utils.h" + +// ------------------------------------------------------------------------ + +static char *cInProf = NULL; +static char *cOutProf = NULL; +static int Intent = INTENT_PERCEPTUAL; +static FILE* OutFile; +static int BlackPointCompensation = FALSE; +static int Undecorated = FALSE; +static int PrecalcMode = 1; +static int NumOfGridPoints = 0; + + + +static +void Help(void) +{ + fprintf(stderr, "Little CMS ICC PostScript generator - v2.1 [LittleCMS %2.2f]\n", cmsGetEncodedCMMversion() / 1000.0); + fprintf(stderr, "Copyright (c) 1998-2026 Marti Maria Saguer. See COPYING file for details.\n\n"); + + fprintf(stderr, "usage: psicc [flags] []\n\n"); + + fprintf(stderr, "flags:\n\n"); + + fprintf(stderr, "-i - Input profile: Generates Color Space Array (CSA)\n"); + fprintf(stderr, "-o - Output profile: Generates Color Rendering Dictionary(CRD)\n"); + + fprintf(stderr, "-t<0,1,2,3> - Intent (0=Perceptual, 1=Colorimetric, 2=Saturation, 3=Absolute)\n"); + + fprintf(stderr, "-b - Black point compensation (CRD only)\n"); + fprintf(stderr, "-u - Do NOT generate resource name on CRD\n"); + fprintf(stderr, "-c<0,1,2> - Precision (0=LowRes, 1=Normal (default), 2=Hi-res) (CRD only)\n"); + fprintf(stderr, "-n - Alternate way to set precision, number of CLUT points (CRD only)\n"); + + fprintf(stderr, "\n"); + fprintf(stderr, "If no output file is specified, output goes to stdout.\n\n"); + fprintf(stderr, "This program is intended to be a demo of the little cms\n" + "engine. Both lcms and this program are freeware. You can\n" + "obtain both in source code at https://www.littlecms.com\n" + "For suggestions, comments, bug reports etc. send mail to\n" + "info@littlecms.com\n\n"); + + exit(0); +} + +// The toggles stuff + +static +void HandleSwitches(int argc, char *argv[]) +{ + int s; + + while ((s = xgetopt(argc,argv,"uUbBI:i:O:o:T:t:c:C:n:N:-:")) != EOF) { + + switch (s) + { + + case '-': + if (strcmp(xoptarg, "help") == 0) + { + Help(); + } + else + { + FatalError("Unknown option - run without args to see valid ones.\n"); + } + break; + + case 'i': + case 'I': + cInProf = xoptarg; + break; + + case 'o': + case 'O': + cOutProf = xoptarg; + break; + + case 'b': + case 'B': BlackPointCompensation =TRUE; + break; + + + case 't': + case 'T': + Intent = atoi(xoptarg); + if (Intent > 3) Intent = 3; + if (Intent < 0) Intent = 0; + break; + + case 'U': + case 'u': + Undecorated = TRUE; + break; + + case 'c': + case 'C': + PrecalcMode = atoi(xoptarg); + if (PrecalcMode < 0 || PrecalcMode > 2) + FatalError("ERROR: Unknown precalc mode '%d'", PrecalcMode); + break; + + + case 'n': + case 'N': + if (PrecalcMode != 1) + FatalError("Precalc mode already specified"); + NumOfGridPoints = atoi(xoptarg); + break; + + + default: + + FatalError("Unknown option - run without args to see valid ones.\n"); + } + } +} + + + + +static +void GenerateCSA(void) +{ + cmsHPROFILE hProfile = OpenStockProfile(0, cInProf); + size_t n; + char* Buffer; + + if (hProfile == NULL) return; + + n = cmsGetPostScriptCSA(0, hProfile, Intent, 0, NULL, 0); + if (n == 0) return; + + Buffer = (char*) malloc(n + 1); + if (Buffer != NULL) { + + cmsGetPostScriptCSA(0, hProfile, Intent, 0, Buffer, (cmsUInt32Number) n); + Buffer[n] = 0; + + fprintf(OutFile, "%s", Buffer); + + free(Buffer); + } + + cmsCloseProfile(hProfile); +} + + +static +void GenerateCRD(void) +{ + cmsHPROFILE hProfile = OpenStockProfile(0, cOutProf); + size_t n; + char* Buffer; + cmsUInt32Number dwFlags = 0; + + if (hProfile == NULL) return; + + if (BlackPointCompensation) dwFlags |= cmsFLAGS_BLACKPOINTCOMPENSATION; + if (Undecorated) dwFlags |= cmsFLAGS_NODEFAULTRESOURCEDEF; + + switch (PrecalcMode) { + + case 0: dwFlags |= cmsFLAGS_LOWRESPRECALC; break; + case 2: dwFlags |= cmsFLAGS_HIGHRESPRECALC; break; + case 1: + if (NumOfGridPoints > 0) + dwFlags |= cmsFLAGS_GRIDPOINTS(NumOfGridPoints); + break; + + default: FatalError("ERROR: Unknown precalculation mode '%d'", PrecalcMode); + } + + n = cmsGetPostScriptCRD(0, hProfile, Intent, dwFlags, NULL, 0); + if (n == 0) return; + + Buffer = (char*) malloc(n + 1); + if (Buffer == NULL) return; + cmsGetPostScriptCRD(0, hProfile, Intent, dwFlags, Buffer, (cmsUInt32Number) n); + Buffer[n] = 0; + + fprintf(OutFile, "%s", Buffer); + free(Buffer); + cmsCloseProfile(hProfile); +} + + +int main(int argc, char *argv[]) +{ + int nargs; + + // Initialize + InitUtils("psicc"); + + HandleSwitches(argc, argv); + + nargs = (argc - xoptind); + if (nargs != 0 && nargs != 1) + Help(); + + if (cInProf == NULL && cOutProf == NULL) + Help(); + + if (nargs == 0) + OutFile = stdout; + else + OutFile = fopen(argv[xoptind], "wt"); + + if (cInProf != NULL) + GenerateCSA(); + + if (cOutProf != NULL) + GenerateCRD(); + + if (nargs == 1) { + fclose(OutFile); + } + + return 0; +} + + diff --git a/local/recipes/libs/lcms2/source/utils/samples/Makefile.am b/local/recipes/libs/lcms2/source/utils/samples/Makefile.am new file mode 100644 index 0000000000..282e304494 --- /dev/null +++ b/local/recipes/libs/lcms2/source/utils/samples/Makefile.am @@ -0,0 +1,19 @@ +# +# Makefile for building lcms sample programs +# Originally Written by Bob Friesenhahn, June 2003 +# Additions and bugs by Marti Maria + +# Don't require all the GNU mandated files +AUTOMAKE_OPTIONS = 1.7 foreign no-dependencies + +AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include \ + -I$(top_srcdir)/utils/common -I$(top_builddir)/utils/common + +bin_PROGRAMS = wtpt + +wtpt_LDADD = $(top_builddir)/src/liblcms2.la +wtpt_LDFLAGS = @LDFLAGS@ +wtpt_SOURCES = wtpt.c ../common/xgetopt.c ../common/vprf.c ../common/utils.h +man_MANS = wtpt.1 + +EXTRA_DIST = $(man_MANS) roundtrip.c mktiff8.c mkgrayer.c mkcmy.c itufax.c diff --git a/local/recipes/libs/lcms2/source/utils/samples/Makefile.in b/local/recipes/libs/lcms2/source/utils/samples/Makefile.in new file mode 100644 index 0000000000..da52ca57b7 --- /dev/null +++ b/local/recipes/libs/lcms2/source/utils/samples/Makefile.in @@ -0,0 +1,611 @@ +# Makefile.in generated by automake 1.10 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# +# Makefile for building lcms sample programs +# Originally Written by Bob Friesenhahn, June 2003 +# Additions and bugs by Marti Maria Oct 2004 + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +bin_PROGRAMS = icctrans$(EXEEXT) wtpt$(EXEEXT) icc2ps$(EXEEXT) \ + icclink$(EXEEXT) +subdir = samples +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_CLEAN_FILES = +am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" +binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) +PROGRAMS = $(bin_PROGRAMS) +am_icc2ps_OBJECTS = icc2ps.$(OBJEXT) xgetopt.$(OBJEXT) +icc2ps_OBJECTS = $(am_icc2ps_OBJECTS) +icc2ps_DEPENDENCIES = $(top_builddir)/src/liblcms.la +icc2ps_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(icc2ps_LDFLAGS) \ + $(LDFLAGS) -o $@ +am_icclink_OBJECTS = icclink.$(OBJEXT) xgetopt.$(OBJEXT) \ + vprf.$(OBJEXT) +icclink_OBJECTS = $(am_icclink_OBJECTS) +icclink_DEPENDENCIES = $(top_builddir)/src/liblcms.la +icclink_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(icclink_LDFLAGS) \ + $(LDFLAGS) -o $@ +am_icctrans_OBJECTS = icctrans.$(OBJEXT) xgetopt.$(OBJEXT) \ + vprf.$(OBJEXT) +icctrans_OBJECTS = $(am_icctrans_OBJECTS) +icctrans_DEPENDENCIES = $(top_builddir)/src/liblcms.la +icctrans_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(icctrans_LDFLAGS) \ + $(LDFLAGS) -o $@ +am_wtpt_OBJECTS = wtpt.$(OBJEXT) xgetopt.$(OBJEXT) +wtpt_OBJECTS = $(am_wtpt_OBJECTS) +wtpt_DEPENDENCIES = $(top_builddir)/src/liblcms.la +wtpt_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(wtpt_LDFLAGS) \ + $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(icc2ps_SOURCES) $(icclink_SOURCES) $(icctrans_SOURCES) \ + $(wtpt_SOURCES) +DIST_SOURCES = $(icc2ps_SOURCES) $(icclink_SOURCES) \ + $(icctrans_SOURCES) $(wtpt_SOURCES) +man1dir = $(mandir)/man1 +NROFF = nroff +MANS = $(man_MANS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INT16_T = @INT16_T@ +INT32_T = @INT32_T@ +INT64_T = @INT64_T@ +INT8_T = @INT8_T@ +JPEGICC_DEPLIBS = @JPEGICC_DEPLIBS@ +LCMS_LIB_DEPLIBS = @LCMS_LIB_DEPLIBS@ +LCMS_PYEXECDIR = @LCMS_PYEXECDIR@ +LCMS_PYINCLUDE = @LCMS_PYINCLUDE@ +LCMS_PYLIB = @LCMS_PYLIB@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBRARY_AGE = @LIBRARY_AGE@ +LIBRARY_CURRENT = @LIBRARY_CURRENT@ +LIBRARY_REVISION = @LIBRARY_REVISION@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_DEPS = @LIBTOOL_DEPS@ +LIB_JPEG = @LIB_JPEG@ +LIB_MATH = @LIB_MATH@ +LIB_TIFF = @LIB_TIFF@ +LIB_ZLIB = @LIB_ZLIB@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +TIFFICC_DEPLIBS = @TIFFICC_DEPLIBS@ +UINT16_T = @UINT16_T@ +UINT32_T = @UINT32_T@ +UINT64_T = @UINT64_T@ +UINT8_T = @UINT8_T@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +inline = @inline@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +# Don't require all the GNU mandated files +AUTOMAKE_OPTIONS = 1.7 foreign +AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include +icctrans_LDADD = $(top_builddir)/src/liblcms.la +icctrans_LDFLAGS = @LDFLAGS@ +icctrans_SOURCES = icctrans.c xgetopt.c vprf.c +icctrans_MANS = icctrans.1 +wtpt_LDADD = $(top_builddir)/src/liblcms.la +wtpt_LDFLAGS = @LDFLAGS@ +wtpt_SOURCES = wtpt.c xgetopt.c +icc2ps_LDADD = $(top_builddir)/src/liblcms.la +icc2ps_LDFLAGS = @LDFLAGS@ +icc2ps_SOURCES = icc2ps.c xgetopt.c +icclink_LDADD = $(top_builddir)/src/liblcms.la +icclink_LDFLAGS = @LDFLAGS@ +icclink_SOURCES = icclink.c xgetopt.c vprf.c +man_MANS = wtpt.1 icc2ps.1 icclink.1 +EXTRA_DIST = $(man_MANS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign samples/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign samples/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" + @list='$(bin_PROGRAMS)'; for p in $$list; do \ + p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ + if test -f $$p \ + || test -f $$p1 \ + ; then \ + f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \ + else :; fi; \ + done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; for p in $$list; do \ + f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ + echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \ + rm -f "$(DESTDIR)$(bindir)/$$f"; \ + done + +clean-binPROGRAMS: + @list='$(bin_PROGRAMS)'; for p in $$list; do \ + f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f $$p $$f"; \ + rm -f $$p $$f ; \ + done +icc2ps$(EXEEXT): $(icc2ps_OBJECTS) $(icc2ps_DEPENDENCIES) + @rm -f icc2ps$(EXEEXT) + $(icc2ps_LINK) $(icc2ps_OBJECTS) $(icc2ps_LDADD) $(LIBS) +icclink$(EXEEXT): $(icclink_OBJECTS) $(icclink_DEPENDENCIES) + @rm -f icclink$(EXEEXT) + $(icclink_LINK) $(icclink_OBJECTS) $(icclink_LDADD) $(LIBS) +icctrans$(EXEEXT): $(icctrans_OBJECTS) $(icctrans_DEPENDENCIES) + @rm -f icctrans$(EXEEXT) + $(icctrans_LINK) $(icctrans_OBJECTS) $(icctrans_LDADD) $(LIBS) +wtpt$(EXEEXT): $(wtpt_OBJECTS) $(wtpt_DEPENDENCIES) + @rm -f wtpt$(EXEEXT) + $(wtpt_LINK) $(wtpt_OBJECTS) $(wtpt_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/icc2ps.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/icclink.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/icctrans.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vprf.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wtpt.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xgetopt.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-man1: $(man1_MANS) $(man_MANS) + @$(NORMAL_INSTALL) + test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" + @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ + l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ + for i in $$l2; do \ + case "$$i" in \ + *.1*) list="$$list $$i" ;; \ + esac; \ + done; \ + for i in $$list; do \ + if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ + else file=$$i; fi; \ + ext=`echo $$i | sed -e 's/^.*\\.//'`; \ + case "$$ext" in \ + 1*) ;; \ + *) ext='1' ;; \ + esac; \ + inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ + inst=`echo $$inst | sed -e 's/^.*\///'`; \ + inst=`echo $$inst | sed '$(transform)'`.$$ext; \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst"; \ + done +uninstall-man1: + @$(NORMAL_UNINSTALL) + @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ + l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ + for i in $$l2; do \ + case "$$i" in \ + *.1*) list="$$list $$i" ;; \ + esac; \ + done; \ + for i in $$list; do \ + ext=`echo $$i | sed -e 's/^.*\\.//'`; \ + case "$$ext" in \ + 1*) ;; \ + *) ext='1' ;; \ + esac; \ + inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ + inst=`echo $$inst | sed -e 's/^.*\///'`; \ + inst=`echo $$inst | sed '$(transform)'`.$$ext; \ + echo " rm -f '$(DESTDIR)$(man1dir)/$$inst'"; \ + rm -f "$(DESTDIR)$(man1dir)/$$inst"; \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) $(MANS) +installdirs: + for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: install-man + +install-dvi: install-dvi-am + +install-exec-am: install-binPROGRAMS + +install-html: install-html-am + +install-info: install-info-am + +install-man: install-man1 + +install-pdf: install-pdf-am + +install-ps: install-ps-am + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-binPROGRAMS uninstall-man + +uninstall-man: uninstall-man1 + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ + clean-generic clean-libtool ctags distclean distclean-compile \ + distclean-generic distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-binPROGRAMS install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-man1 install-pdf install-pdf-am install-ps \ + install-ps-am install-strip installcheck installcheck-am \ + installdirs maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \ + uninstall-am uninstall-binPROGRAMS uninstall-man \ + uninstall-man1 + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/local/recipes/libs/lcms2/source/utils/samples/itufax.c b/local/recipes/libs/lcms2/source/utils/samples/itufax.c new file mode 100644 index 0000000000..6bad87ea88 --- /dev/null +++ b/local/recipes/libs/lcms2/source/utils/samples/itufax.c @@ -0,0 +1,138 @@ +// +// Little cms +// Copyright (C) 1998-2003 Marti Maria +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +#include "lcms.h" + +// This is a sample on how to build a profile for decoding ITU T.42/Fax JPEG +// streams. The profile has an additional ability in the input direction of +// gamut compress values between 85 < a < -85 and -75 < b < 125. This conforms +// the default range for ITU/T.42 -- See RFC 2301, section 6.2.3 for details + + +// L* = [0, 100] +// a* = [-85, 85] +// b* = [-75, 125] + + +// These functions does convert the encoding of ITUFAX to floating point + +static +void ITU2Lab(WORD In[3], LPcmsCIELab Lab) +{ + Lab -> L = (double) In[0] / 655.35; + Lab -> a = (double) 170.* (In[1] - 32768.) / 65535.; + Lab -> b = (double) 200.* (In[2] - 24576.) / 65535.; +} + + +static +void Lab2ITU(LPcmsCIELab Lab, WORD Out[3]) +{ + Out[0] = (WORD) floor((double) (Lab -> L / 100.)* 65535. + 0.5); + Out[1] = (WORD) floor((double) (Lab -> a / 170.)* 65535. + 32768. + 0.5); + Out[2] = (WORD) floor((double) (Lab -> b / 200.)* 65535. + 24576. + 0.5); +} + + +// These are the samplers-- They are passed as callbacks to cmsSample3DGrid() +// then, cmsSample3DGrid() will sweel whole Lab gamut calling these functions +// once for each node. In[] will contain the Lab PCS value to convert to ITUFAX +// on InputDirection, or the ITUFAX value to convert to Lab in OutputDirection +// You can change the number of sample points if desired, the algorithm will +// remain same. 33 points gives good accuracy, but you can reduce to 22 or less +// is space is critical + +#define GRID_POINTS 33 + +static +int InputDirection(register WORD In[], register WORD Out[], register LPVOID Cargo) +{ + cmsCIELab Lab; + + cmsLabEncoded2Float(&Lab, In); + cmsClampLab(&Lab, 85, -85, 125, -75); // This function does the necessary gamut remapping + Lab2ITU(&Lab, Out); + + return TRUE; +} + + +static +int OutputDirection(register WORD In[], register WORD Out[], register LPVOID Cargo) +{ + + cmsCIELab Lab; + + ITU2Lab(In, &Lab); + cmsFloat2LabEncoded(Out, &Lab); + + return TRUE; +} + + +// The main entry point. Just create a profile an populate it with required tags. +// note that cmsOpenProfileFromFile("itufax.icm", "w") will NOT delete the file +// if already exists. This is for obvious safety reasons. + + +int main(int argc, char *argv[]) +{ + LPLUT AToB0, BToA0; + cmsHPROFILE hProfile; + + fprintf(stderr, "Creating itufax.icm..."); + + unlink("itufax.icm"); + hProfile = cmsOpenProfileFromFile("itufax.icm", "w"); + + AToB0 = cmsAllocLUT(); + BToA0 = cmsAllocLUT(); + + cmsAlloc3DGrid(AToB0, GRID_POINTS, 3, 3); + cmsAlloc3DGrid(BToA0, GRID_POINTS, 3, 3); + + cmsSample3DGrid(AToB0, InputDirection, NULL, 0); + cmsSample3DGrid(BToA0, OutputDirection, NULL, 0); + + cmsAddTag(hProfile, icSigAToB0Tag, AToB0); + cmsAddTag(hProfile, icSigBToA0Tag, BToA0); + + + cmsSetColorSpace(hProfile, icSigLabData); + cmsSetPCS(hProfile, icSigLabData); + cmsSetDeviceClass(hProfile, icSigColorSpaceClass); + + cmsAddTag(hProfile, icSigProfileDescriptionTag, "ITU T.42/Fax JPEG CIEL*a*b*"); + cmsAddTag(hProfile, icSigCopyrightTag, "No Copyright, use freely."); + cmsAddTag(hProfile, icSigDeviceMfgDescTag, "Little cms"); + cmsAddTag(hProfile, icSigDeviceModelDescTag, "ITU T.42/Fax JPEG CIEL*a*b*"); + + cmsCloseProfile(hProfile); + + cmsFreeLUT(AToB0); + cmsFreeLUT(BToA0); + + fprintf(stderr, "Done.\n"); + + return 0; +} diff --git a/local/recipes/libs/lcms2/source/utils/samples/mkcmy.c b/local/recipes/libs/lcms2/source/utils/samples/mkcmy.c new file mode 100644 index 0000000000..1b0755f17b --- /dev/null +++ b/local/recipes/libs/lcms2/source/utils/samples/mkcmy.c @@ -0,0 +1,170 @@ +// +// Little cms +// Copyright (C) 1998-2003 Marti Maria +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THIS SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, +// EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY +// WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. +// +// IN NO EVENT SHALL MARTI MARIA BE LIABLE FOR ANY SPECIAL, INCIDENTAL, +// INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, +// OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +// WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF +// LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE +// OF THIS SOFTWARE. +// +// Version 1.12 + + +#include "lcms.h" + + +typedef struct { + cmsHPROFILE hLab; + cmsHPROFILE hRGB; + cmsHTRANSFORM Lab2RGB; + cmsHTRANSFORM RGB2Lab; + + } CARGO, FAR* LPCARGO; + + + + + +// Our space will be CIE primaries plus a gamma of 4.5 + +static +int Forward(register WORD In[], register WORD Out[], register LPVOID Cargo) +{ + LPCARGO C = (LPCARGO) Cargo; + WORD RGB[3]; + cmsCIELab Lab; + + cmsLabEncoded2Float(&Lab, In); + + printf("%g %g %g\n", Lab.L, Lab.a, Lab.b); + + cmsDoTransform(C ->Lab2RGB, In, &RGB, 1); + + + Out[0] = 0xFFFF - RGB[0]; // Our CMY is negative of RGB + Out[1] = 0xFFFF - RGB[1]; + Out[2] = 0xFFFF - RGB[2]; + + + return TRUE; + +} + + +static +int Reverse(register WORD In[], register WORD Out[], register LPVOID Cargo) +{ + + LPCARGO C = (LPCARGO) Cargo; + WORD RGB[3]; + + RGB[0] = 0xFFFF - In[0]; + RGB[1] = 0xFFFF - In[1]; + RGB[2] = 0xFFFF - In[2]; + + cmsDoTransform(C ->RGB2Lab, &RGB, Out, 1); + + return TRUE; + +} + + + +static +void InitCargo(LPCARGO Cargo) +{ + + + Cargo -> hLab = cmsCreateLabProfile(NULL); + Cargo -> hRGB = cmsCreate_sRGBProfile(); + + Cargo->Lab2RGB = cmsCreateTransform(Cargo->hLab, TYPE_Lab_16, + Cargo ->hRGB, TYPE_RGB_16, + INTENT_RELATIVE_COLORIMETRIC, + cmsFLAGS_NOTPRECALC); + + Cargo->RGB2Lab = cmsCreateTransform(Cargo ->hRGB, TYPE_RGB_16, + Cargo ->hLab, TYPE_Lab_16, + INTENT_RELATIVE_COLORIMETRIC, + cmsFLAGS_NOTPRECALC); +} + + + + +static +void FreeCargo(LPCARGO Cargo) +{ + cmsDeleteTransform(Cargo ->Lab2RGB); + cmsDeleteTransform(Cargo ->RGB2Lab); + cmsCloseProfile(Cargo ->hLab); + cmsCloseProfile(Cargo ->hRGB); +} + + + + +int main(void) +{ + LPLUT AToB0, BToA0; + CARGO Cargo; + cmsHPROFILE hProfile; + + fprintf(stderr, "Creating lcmscmy.icm..."); + + InitCargo(&Cargo); + + hProfile = cmsCreateLabProfile(NULL); + + + AToB0 = cmsAllocLUT(); + BToA0 = cmsAllocLUT(); + + cmsAlloc3DGrid(AToB0, 25, 3, 3); + cmsAlloc3DGrid(BToA0, 25, 3, 3); + + + cmsSample3DGrid(AToB0, Reverse, &Cargo, 0); + cmsSample3DGrid(BToA0, Forward, &Cargo, 0); + + + cmsAddTag(hProfile, icSigAToB0Tag, AToB0); + cmsAddTag(hProfile, icSigBToA0Tag, BToA0); + + cmsSetColorSpace(hProfile, icSigCmyData); + cmsSetDeviceClass(hProfile, icSigOutputClass); + + cmsAddTag(hProfile, icSigProfileDescriptionTag, "CMY "); + cmsAddTag(hProfile, icSigCopyrightTag, "Copyright (c) HP, 2007. All rights reserved."); + cmsAddTag(hProfile, icSigDeviceMfgDescTag, "Little cms"); + cmsAddTag(hProfile, icSigDeviceModelDescTag, "CMY space"); + + _cmsSaveProfile(hProfile, "lcmscmy.icm"); + + + cmsFreeLUT(AToB0); + cmsFreeLUT(BToA0); + cmsCloseProfile(hProfile); + FreeCargo(&Cargo); + fprintf(stderr, "Done.\n"); + + + + return 0; +} diff --git a/local/recipes/libs/lcms2/source/utils/samples/mkgrayer.c b/local/recipes/libs/lcms2/source/utils/samples/mkgrayer.c new file mode 100644 index 0000000000..46e9286189 --- /dev/null +++ b/local/recipes/libs/lcms2/source/utils/samples/mkgrayer.c @@ -0,0 +1,93 @@ +// +// Little cms +// Copyright (C) 1998-2003 Marti Maria +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +#include "lcms.h" + + + +static +int Forward(register WORD In[], register WORD Out[], register LPVOID Cargo) +{ + cmsCIELab Lab; + + + cmsLabEncoded2Float(&Lab, In); + + if (fabs(Lab.a) < 3 && fabs(Lab.b) < 3) { + + double L_01 = Lab.L / 100.0; + WORD K; + + if (L_01 > 1) L_01 = 1; + K = (WORD) floor(L_01* 65535.0 + 0.5); + + Out[0] = Out[1] = Out[2] = K; + } + else { + Out[0] = 0xFFFF; Out[1] = 0; Out[2] = 0; + } + + return TRUE; +} + + + + + +int main(int argc, char *argv[]) +{ + LPLUT BToA0; + cmsHPROFILE hProfile; + + fprintf(stderr, "Creating interpol2.icc..."); + + unlink("interpol2.icc"); + hProfile = cmsOpenProfileFromFile("interpol2.icc", "w8"); + + + BToA0 = cmsAllocLUT(); + + cmsAlloc3DGrid(BToA0, 17, 3, 3); + + cmsSample3DGrid(BToA0, Forward, NULL, 0); + + cmsAddTag(hProfile, icSigBToA0Tag, BToA0); + + cmsSetColorSpace(hProfile, icSigRgbData); + cmsSetPCS(hProfile, icSigLabData); + cmsSetDeviceClass(hProfile, icSigOutputClass); + + cmsAddTag(hProfile, icSigProfileDescriptionTag, "Interpolation test"); + cmsAddTag(hProfile, icSigCopyrightTag, "Copyright (c) HP 2007. All rights reserved."); + cmsAddTag(hProfile, icSigDeviceMfgDescTag, "Little cms"); + cmsAddTag(hProfile, icSigDeviceModelDescTag, "Interpolation test profile"); + + + cmsCloseProfile(hProfile); + + cmsFreeLUT(BToA0); + + fprintf(stderr, "Done.\n"); + + return 0; +} diff --git a/local/recipes/libs/lcms2/source/utils/samples/mktiff8.c b/local/recipes/libs/lcms2/source/utils/samples/mktiff8.c new file mode 100644 index 0000000000..ab0b66b8a0 --- /dev/null +++ b/local/recipes/libs/lcms2/source/utils/samples/mktiff8.c @@ -0,0 +1,150 @@ +// +// Little cms +// Copyright (C) 1998-2010 Marti Maria +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +// Creates a devicelink that decodes TIFF8 Lab files + +#include "lcms2.h" +#include +#include + +static +double DecodeAbTIFF(double ab) +{ + if (ab <= 128.) + ab += 127.; + else + ab -= 127.; + + return ab; +} + +static +cmsToneCurve* CreateStep(void) +{ + cmsToneCurve* Gamma; + cmsUInt16Number* Table; + int i; + double a; + + Table = calloc(4096, sizeof(cmsUInt16Number)); + if (Table == NULL) return NULL; + + for (i=0; i < 4096; i++) { + + a = (double) i * 255. / 4095.; + + a = DecodeAbTIFF(a); + + Table[i] = (cmsUInt16Number) floor(a * 257. + 0.5); + } + + Gamma = cmsBuildTabulatedToneCurve16(0, 4096, Table); + free(Table); + + return Gamma; +} + + +static +cmsToneCurve* CreateLinear(void) +{ + cmsUInt16Number Linear[2] = { 0, 0xffff }; + + return cmsBuildTabulatedToneCurve16(0, 2, Linear); +} + + + +// Set the copyright and description +static +cmsBool SetTextTags(cmsHPROFILE hProfile) +{ + cmsMLU *DescriptionMLU, *CopyrightMLU; + cmsBool rc = FALSE; + + DescriptionMLU = cmsMLUalloc(0, 1); + CopyrightMLU = cmsMLUalloc(0, 1); + + if (DescriptionMLU == NULL || CopyrightMLU == NULL) goto Error; + + if (!cmsMLUsetASCII(DescriptionMLU, "en", "US", "Little cms Tiff8 CIELab")) goto Error; + if (!cmsMLUsetASCII(CopyrightMLU, "en", "US", "Copyright (c) Marti Maria, 2010. All rights reserved.")) goto Error; + + if (!cmsWriteTag(hProfile, cmsSigProfileDescriptionTag, DescriptionMLU)) goto Error; + if (!cmsWriteTag(hProfile, cmsSigCopyrightTag, CopyrightMLU)) goto Error; + + rc = TRUE; + +Error: + + if (DescriptionMLU) + cmsMLUfree(DescriptionMLU); + if (CopyrightMLU) + cmsMLUfree(CopyrightMLU); + return rc; +} + + +int main(int argc, char *argv[]) +{ + cmsHPROFILE hProfile; + cmsPipeline *AToB0; + cmsToneCurve* PreLinear[3]; + cmsToneCurve *Lin, *Step; + + fprintf(stderr, "Creating lcmstiff8.icm..."); + + remove("lcmstiff8.icm"); + hProfile = cmsOpenProfileFromFile("lcmstiff8.icm", "w"); + + // Create linearization + Lin = CreateLinear(); + Step = CreateStep(); + + PreLinear[0] = Lin; + PreLinear[1] = Step; + PreLinear[2] = Step; + + AToB0 = cmsPipelineAlloc(0, 3, 3); + + cmsPipelineInsertStage(AToB0, + cmsAT_BEGIN, cmsStageAllocToneCurves(0, 3, PreLinear)); + + cmsSetColorSpace(hProfile, cmsSigLabData); + cmsSetPCS(hProfile, cmsSigLabData); + cmsSetDeviceClass(hProfile, cmsSigLinkClass); + cmsSetProfileVersion(hProfile, 4.2); + + cmsWriteTag(hProfile, cmsSigAToB0Tag, AToB0); + + SetTextTags(hProfile); + + cmsCloseProfile(hProfile); + + cmsFreeToneCurve(Lin); + cmsFreeToneCurve(Step); + cmsPipelineFree(AToB0); + + fprintf(stderr, "Done.\n"); + + return 0; +} diff --git a/local/recipes/libs/lcms2/source/utils/samples/roundtrip.c b/local/recipes/libs/lcms2/source/utils/samples/roundtrip.c new file mode 100644 index 0000000000..94c8bdc140 --- /dev/null +++ b/local/recipes/libs/lcms2/source/utils/samples/roundtrip.c @@ -0,0 +1,99 @@ +// +// Little cms +// Copyright (C) 1998-2011 Marti Maria +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + +#include "lcms2.h" +#include + + + +static +double VecDist(cmsUInt8Number bin[3], cmsUInt8Number bout[3]) +{ + double rdist, gdist, bdist; + + rdist = fabs((double) bout[0] - bin[0]); + gdist = fabs((double) bout[1] - bin[1]); + bdist = fabs((double) bout[2] - bin[2]); + + return (sqrt((rdist*rdist + gdist*gdist + bdist*bdist))); +} + + +int main(int argc, char* argv[]) +{ + + int r, g, b; + cmsUInt8Number RGB[3], RGB_OUT[3]; + cmsHTRANSFORM xform; + cmsHPROFILE hProfile; + double err, SumX=0, SumX2=0, Peak = 0, n = 0; + + + if (argc != 2) { + printf("roundtrip \n"); + return 1; + } + + hProfile = cmsOpenProfileFromFile(argv[1], "r"); + if (hProfile == NULL) + { + printf("invalid profile\n"); + return 1; + } + + xform = cmsCreateTransform(hProfile,TYPE_RGB_8, hProfile, TYPE_RGB_8, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_NOOPTIMIZE); + if (xform == NULL) + { + printf("Not a valid RGB profile\n"); + return 1; + } + + for (r=0; r< 256; r++) { + printf("%d \r", r); + for (g=0; g < 256; g++) { + for (b=0; b < 256; b++) { + + RGB[0] = r; + RGB[1] = g; + RGB[2] = b; + + cmsDoTransform(xform, RGB, RGB_OUT, 1); + + err = VecDist(RGB, RGB_OUT); + + SumX += err; + SumX2 += err * err; + n += 1.0; + if (err > Peak) + Peak = err; + + } + } + } + + printf("Average %g\n", SumX / n); + printf("Max %g\n", Peak); + printf("Std %g\n", sqrt((n*SumX2 - SumX * SumX) / (n*(n-1)))); + cmsCloseProfile(hProfile); + cmsDeleteTransform(xform); + + return 0; +} \ No newline at end of file diff --git a/local/recipes/libs/lcms2/source/utils/samples/vericc.c b/local/recipes/libs/lcms2/source/utils/samples/vericc.c new file mode 100644 index 0000000000..9ac94a76c1 --- /dev/null +++ b/local/recipes/libs/lcms2/source/utils/samples/vericc.c @@ -0,0 +1,65 @@ +//--------------------------------------------------------------------------------- +// +// Little Color Management System +// Copyright (c) 1998-2010 Marti Maria Saguer +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//--------------------------------------------------------------------------------- +// + +#include "lcms2.h" +#include +#include + +static +int PrintUsage(void) +{ + fprintf(stderr, "Sets profile version\n\nUsage: vericc --r iccprofile.icc\n"); + return 0; +} + +int main(int argc, char *argv[]) +{ + cmsHPROFILE hProfile; + char* ptr; + cmsFloat64Number Version; + + if (argc != 3) return PrintUsage(); + + ptr = argv[1]; + if (strncmp(ptr, "--r", 3) != 0) return PrintUsage(); + ptr += 3; + if (!*ptr) { fprintf(stderr, "Wrong version number\n"); return 1; } + + Version = atof(ptr); + + hProfile = cmsOpenProfileFromFile(argv[2], "r"); + if (hProfile == NULL) { fprintf(stderr, "'%s': cannot open\n", argv[2]); return 1; } + + cmsSetProfileVersion(hProfile, Version); + cmsSaveProfileToFile(hProfile, "$$tmp.icc"); + cmsCloseProfile(hProfile); + + remove(argv[2]); + rename("$$tmp.icc", argv[2]); + return 0; + + +} diff --git a/local/recipes/libs/lcms2/source/utils/samples/wtpt.1 b/local/recipes/libs/lcms2/source/utils/samples/wtpt.1 new file mode 100644 index 0000000000..fbd37ac2b1 --- /dev/null +++ b/local/recipes/libs/lcms2/source/utils/samples/wtpt.1 @@ -0,0 +1,28 @@ +.\"Shiju P. Nair September 30, 2004 +.TH WTPT 1 "September 30, 2004" +.SH NAME +wtpt - Show media white of profiles, identifying black body locus. +.SH SYNOPSIS +.B wtpt +.RI [ profile ] +.SH DESCRIPTION +lcms is a standalone CMM engine, which deals with the color management. +It implements a fast transformation between ICC profiles. +.B wtpt +shows media white of profiles, identifying black body locus. +.P +If no parameters are given, then this program will +ask for XYZ value of media white. If parameter given, it must be +the profile to inspect. +.SH NOTES +For suggestions, comments, bug reports etc. send mail to +info@littlecms.com +.SH SEE ALSO +.BR jpegicc (1), +.BR tifficc (1), +.BR icc2ps (1), +.BR icclink (1), +.BR icctrans (1) +.SH AUTHOR +This manual page was written by Shiju p. Nair , +for the Debian project. diff --git a/local/recipes/libs/lcms2/source/utils/samples/wtpt.c b/local/recipes/libs/lcms2/source/utils/samples/wtpt.c new file mode 100644 index 0000000000..e19e0ff979 --- /dev/null +++ b/local/recipes/libs/lcms2/source/utils/samples/wtpt.c @@ -0,0 +1,146 @@ +// +// Little cms +// Copyright (C) 1998-2015 Marti Maria +// +//--------------------------------------------------------------------------------- +// +// Little Color Management System +// Copyright (c) 1998-2014 Marti Maria Saguer +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//--------------------------------------------------------------------------------- + +#include "utils.h" + + +// The toggles stuff + +static cmsBool lShowXYZ = TRUE; +static cmsBool lShowLab = FALSE; +static cmsBool lShowLCh = FALSE; + +#define SW '-' + +static +void HandleSwitches(int argc, char *argv[]) +{ + int s; + + while ((s = xgetopt(argc, argv, "lcx")) != EOF) { + + switch (s){ + + + case 'l': + lShowLab = TRUE; + break; + + case 'c': + lShowLCh = TRUE; + break; + + case 'x': + lShowXYZ = FALSE; + break; + + default: + + FatalError("Unknown option - run without args to see valid ones.\n"); + } + } +} + +static +void Help(void) +{ + fprintf(stderr, "little CMS ICC white point utility - v3 [LittleCMS %2.2f]\n", LCMS_VERSION / 1000.0); + + fprintf(stderr, "usage: wtpt [flags] []\n\n"); + + fprintf(stderr, "flags:\n\n"); + + fprintf(stderr, "%cl - CIE Lab\n", SW); + fprintf(stderr, "%cc - CIE LCh\n", SW); + fprintf(stderr, "%cx - Don't show XYZ\n", SW); + + fprintf(stderr, "\nIf no parameters are given, then this program will\n"); + fprintf(stderr, "ask for XYZ value of media white. If parameter given, it must be\n"); + fprintf(stderr, "the profile to inspect.\n\n"); + + fprintf(stderr, "This program is intended to be a demo of the little cms\n" + "engine. Both lcms and this program are freeware. You can\n" + "obtain both in source code at http://www.littlecms.com\n" + "For suggestions, comments, bug reports etc. send mail to\n" + "info@littlecms.com\n\n"); + exit(0); +} + + + +static +void ShowWhitePoint(cmsCIEXYZ* WtPt) +{ + cmsCIELab Lab; + cmsCIELCh LCh; + cmsCIExyY xyY; + + + cmsXYZ2Lab(NULL, &Lab, WtPt); + cmsLab2LCh(&LCh, &Lab); + cmsXYZ2xyY(&xyY, WtPt); + + + if (lShowXYZ) printf("XYZ=(%3.1f, %3.1f, %3.1f)\n", WtPt->X, WtPt->Y, WtPt->Z); + if (lShowLab) printf("Lab=(%3.3f, %3.3f, %3.3f)\n", Lab.L, Lab.a, Lab.b); + if (lShowLCh) printf("LCh=(%3.3f, %3.3f, %3.3f)\n", LCh.L, LCh.C, LCh.h); + { + double Ssens = (LCh.C * 100.0 )/ sqrt(LCh.C*LCh.C + LCh.L * LCh.L) ; + printf("Sens = %f\n", Ssens); + } + +} + + +int main(int argc, char *argv[]) +{ + int nargs; + + InitUtils("wtpt"); + + HandleSwitches(argc, argv); + + nargs = (argc - xoptind); + + if (nargs != 1) + Help(); + + else { + cmsCIEXYZ* WtPt; + cmsHPROFILE hProfile = cmsOpenProfileFromFile(argv[xoptind], "r"); + if (hProfile == NULL) return 1; + + WtPt = cmsReadTag(hProfile, cmsSigMediaWhitePointTag); + ShowWhitePoint(WtPt); + cmsCloseProfile(hProfile); + } + + return 0; +} + diff --git a/local/recipes/libs/lcms2/source/utils/tificc/Makefile.am b/local/recipes/libs/lcms2/source/utils/tificc/Makefile.am new file mode 100644 index 0000000000..50f5dc441e --- /dev/null +++ b/local/recipes/libs/lcms2/source/utils/tificc/Makefile.am @@ -0,0 +1,25 @@ +# +# Makefile for building tificc +# Originally written by Bob Friesenhahn, June 2003 +# bugs introduced by Marti Maria + +# Don't require all the GNU mandated files +AUTOMAKE_OPTIONS = 1.7 foreign no-dependencies + +AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include \ + -I$(top_srcdir)/utils/common -I$(top_builddir)/utils/common + + +if HasTIFF +bin_PROGRAMS = tificc +else +bin_PROGRAMS = +endif + +tificc_LDADD = $(top_builddir)/src/liblcms2.la @TIFFICC_DEPLIBS@ +tificc_LDFLAGS = @LDFLAGS@ +tificc_SOURCES = tificc.c ../common/xgetopt.c ../common/vprf.c ../common/utils.h +man_MANS = tificc.1 + + +EXTRA_DIST = $(man_MANS) diff --git a/local/recipes/libs/lcms2/source/utils/tificc/Makefile.in b/local/recipes/libs/lcms2/source/utils/tificc/Makefile.in new file mode 100644 index 0000000000..94044aaa09 --- /dev/null +++ b/local/recipes/libs/lcms2/source/utils/tificc/Makefile.in @@ -0,0 +1,751 @@ +# Makefile.in generated by automake 1.18.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2025 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# +# Makefile for building tificc +# Originally written by Bob Friesenhahn, June 2003 +# bugs introduced by Marti Maria + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +am__rm_f = rm -f $(am__rm_f_notfound) +am__rm_rf = rm -rf $(am__rm_f_notfound) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +@HasTIFF_TRUE@bin_PROGRAMS = tificc$(EXEEXT) +subdir = utils/tificc +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_append_compile_flags.m4 \ + $(top_srcdir)/m4/ax_append_flag.m4 \ + $(top_srcdir)/m4/ax_check_compile_flag.m4 \ + $(top_srcdir)/m4/ax_gcc_func_attribute.m4 \ + $(top_srcdir)/m4/ax_pthread.m4 \ + $(top_srcdir)/m4/ax_require_defined.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" +PROGRAMS = $(bin_PROGRAMS) +am__dirstamp = $(am__leading_dot)dirstamp +am_tificc_OBJECTS = tificc.$(OBJEXT) ../common/xgetopt.$(OBJEXT) \ + ../common/vprf.$(OBJEXT) +tificc_OBJECTS = $(am_tificc_OBJECTS) +tificc_DEPENDENCIES = $(top_builddir)/src/liblcms2.la +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +tificc_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(tificc_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ +depcomp = +am__maybe_remake_depfiles = +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(tificc_SOURCES) +DIST_SOURCES = $(tificc_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && echo $$files | $(am__xargs_n) 40 $(am__rm_f); }; \ + } +man1dir = $(mandir)/man1 +NROFF = nroff +MANS = $(man_MANS) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +am__DIST_COMMON = $(srcdir)/Makefile.in +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ETAGS = @ETAGS@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FILECMD = @FILECMD@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +JPEGICC_DEPLIBS = @JPEGICC_DEPLIBS@ +LCMS_LIB_DEPLIBS = @LCMS_LIB_DEPLIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBRARY_AGE = @LIBRARY_AGE@ +LIBRARY_CURRENT = @LIBRARY_CURRENT@ +LIBRARY_REVISION = @LIBRARY_REVISION@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_DEPS = @LIBTOOL_DEPS@ +LIB_JPEG = @LIB_JPEG@ +LIB_MATH = @LIB_MATH@ +LIB_PLUGINS = @LIB_PLUGINS@ +LIB_THREAD = @LIB_THREAD@ +LIB_TIFF = @LIB_TIFF@ +LIB_ZLIB = @LIB_ZLIB@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_CXX = @PTHREAD_CXX@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +TIFFICC_DEPLIBS = @TIFFICC_DEPLIBS@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__rm_f_notfound = @am__rm_f_notfound@ +am__tar = @am__tar@ +am__untar = @am__untar@ +am__xargs_n = @am__xargs_n@ +ax_pthread_config = @ax_pthread_config@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +inline = @inline@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +# Don't require all the GNU mandated files +AUTOMAKE_OPTIONS = 1.7 foreign no-dependencies +AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include \ + -I$(top_srcdir)/utils/common -I$(top_builddir)/utils/common + +tificc_LDADD = $(top_builddir)/src/liblcms2.la @TIFFICC_DEPLIBS@ +tificc_LDFLAGS = @LDFLAGS@ +tificc_SOURCES = tificc.c ../common/xgetopt.c ../common/vprf.c ../common/utils.h +man_MANS = tificc.1 +EXTRA_DIST = $(man_MANS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign utils/tificc/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign utils/tificc/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ + fi; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p \ + || test -f $$p1 \ + ; then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' \ + -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' \ + `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && $(am__rm_f) $$files + +clean-binPROGRAMS: + $(am__rm_f) $(bin_PROGRAMS) + test -z "$(EXEEXT)" || $(am__rm_f) $(bin_PROGRAMS:$(EXEEXT)=) +../common/$(am__dirstamp): + @$(MKDIR_P) ../common + @: >>../common/$(am__dirstamp) +../common/xgetopt.$(OBJEXT): ../common/$(am__dirstamp) +../common/vprf.$(OBJEXT): ../common/$(am__dirstamp) + +tificc$(EXEEXT): $(tificc_OBJECTS) $(tificc_DEPENDENCIES) $(EXTRA_tificc_DEPENDENCIES) + @rm -f tificc$(EXEEXT) + $(AM_V_CCLD)$(tificc_LINK) $(tificc_OBJECTS) $(tificc_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + -rm -f ../common/*.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +.c.o: + $(AM_V_CC)$(COMPILE) -c -o $@ $< + +.c.obj: + $(AM_V_CC)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: + $(AM_V_CC)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-man1: $(man_MANS) + @$(NORMAL_INSTALL) + @list1=''; \ + list2='$(man_MANS)'; \ + test -n "$(man1dir)" \ + && test -n "`echo $$list1$$list2`" \ + || exit 0; \ + echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ + { for i in $$list1; do echo "$$i"; done; \ + if test -n "$$list2"; then \ + for i in $$list2; do echo "$$i"; done \ + | sed -n '/\.1[a-z]*$$/p'; \ + fi; \ + } | while read p; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; echo "$$p"; \ + done | \ + sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ + sed 'N;N;s,\n, ,g' | { \ + list=; while read file base inst; do \ + if test "$$base" = "$$inst"; then list="$$list $$file"; else \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ + fi; \ + done; \ + for i in $$list; do echo "$$i"; done | $(am__base_list) | \ + while read files; do \ + test -z "$$files" || { \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ + done; } + +uninstall-man1: + @$(NORMAL_UNINSTALL) + @list=''; test -n "$(man1dir)" || exit 0; \ + files=`{ for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ + dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) $(MANS) +installdirs: + for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -$(am__rm_f) $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || $(am__rm_f) $(CONFIG_CLEAN_VPATH_FILES) + -$(am__rm_f) ../common/$(am__dirstamp) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-man + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-binPROGRAMS + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: install-man1 + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-binPROGRAMS uninstall-man + +uninstall-man: uninstall-man1 + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ + clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \ + ctags ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-binPROGRAMS \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man install-man1 \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \ + uninstall-binPROGRAMS uninstall-man uninstall-man1 + +.PRECIOUS: Makefile + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: + +# Tell GNU make to disable its built-in pattern rules. +%:: %,v +%:: RCS/%,v +%:: RCS/% +%:: s.% +%:: SCCS/s.% diff --git a/local/recipes/libs/lcms2/source/utils/tificc/meson.build b/local/recipes/libs/lcms2/source/utils/tificc/meson.build new file mode 100644 index 0000000000..c9bda3543a --- /dev/null +++ b/local/recipes/libs/lcms2/source/utils/tificc/meson.build @@ -0,0 +1,27 @@ +tificc_sources = files( + 'tificc.c', +) + +tificc_exe = executable( + 'tificc', + tificc_sources, + dependencies: [liblcms2_dep, common_dep, tiff_dep], + install: true, +) + +tificc_man = files( + 'tificc.1', +) + +install_man(tificc_man) + +tifdiff_sources = files( + 'tifdiff.c', +) + +tifdiff_exe = executable( + 'tifdiff', + tifdiff_sources, + dependencies: [liblcms2_dep, common_dep, tiff_dep], + install: true, +) diff --git a/local/recipes/libs/lcms2/source/utils/tificc/tifdiff.c b/local/recipes/libs/lcms2/source/utils/tificc/tifdiff.c new file mode 100644 index 0000000000..016d6ab643 --- /dev/null +++ b/local/recipes/libs/lcms2/source/utils/tificc/tifdiff.c @@ -0,0 +1,708 @@ +//--------------------------------------------------------------------------------- +// +// Little Color Management System +// Copyright (c) 1998-2026 Marti Maria Saguer +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//--------------------------------------------------------------------------------- +// + +#include "utils.h" +#include "tiffio.h" + + +// ------------------------------------------------------------------------ + +static TIFF *Tiff1, *Tiff2, *TiffDiff; +static const char* TiffDiffFilename; +static const char* CGATSout; + +typedef struct { + double n, x, x2; + double Min, Peak; + + } STAT, *LPSTAT; + + +static STAT ColorantStat[4]; +static STAT EuclideanStat; +static STAT ColorimetricStat; + +static uint16_t Channels; + +static cmsHPROFILE hLab; + + +static +void ConsoleWarningHandler(const char* module, const char* fmt, va_list ap) +{ + char e[512] = { '\0' }; + if (module != NULL) + strcat(strcpy(e, module), ": "); + + vsprintf(e+strlen(e), fmt, ap); + strcat(e, "."); + if (Verbose) { + + fprintf(stderr, "\nWarning"); + fprintf(stderr, " %s\n", e); + fflush(stderr); + } +} + +static +void ConsoleErrorHandler(const char* module, const char* fmt, va_list ap) +{ + char e[512] = { '\0' }; + + if (module != NULL) + strcat(strcpy(e, module), ": "); + + vsprintf(e+strlen(e), fmt, ap); + strcat(e, "."); + fprintf(stderr, "\nError"); + fprintf(stderr, " %s\n", e); + fflush(stderr); +} + + + +static +void Help() +{ + fprintf(stderr, "Little CMS TIFF compare utility. v1.1\n\n"); + + fprintf(stderr, "usage: tiffdiff [flags] input.tif output.tif\n"); + + fprintf(stderr, "\nflags:\n\n"); + + + fprintf(stderr, "-o - Output TIFF file\n"); + fprintf(stderr, "-g - Output results in CGATS file\n"); + + fprintf(stderr, "\n"); + + fprintf(stderr, "-v - Verbose (show warnings)\n"); + fprintf(stderr, "-h - This help\n"); + + + fflush(stderr); + exit(0); +} + + + +// The toggles stuff + +static +void HandleSwitches(int argc, char *argv[]) +{ + int s; + + while ((s=xgetopt(argc,argv,"o:O:hHvVg:G:")) != EOF) { + + switch (s) { + + + case 'v': + case 'V': + Verbose = TRUE; + break; + + case 'o': + case 'O': + TiffDiffFilename = xoptarg; + break; + + + case 'H': + case 'h': + Help(); + break; + + case 'g': + case 'G': + CGATSout = xoptarg; + break; + + default: + + FatalError("Unknown option - run without args to see valid ones"); + } + } +} + + +static +void ClearStatistics(LPSTAT st) +{ + + st ->n = st ->x = st->x2 = st->Peak = 0; + st ->Min = 1E10; + +} + + +static +void AddOnePixel(LPSTAT st, double dE) +{ + + st-> x += dE; st ->x2 += (dE * dE); st->n += 1.0; + if (dE > st ->Peak) st ->Peak = dE; + if (dE < st ->Min) st ->Min= dE; +} + +static +double Std(LPSTAT st) +{ + return sqrt((st->n * st->x2 - st->x * st->x) / (st->n*(st->n-1))); +} + +static +double Mean(LPSTAT st) +{ + return st ->x/st ->n; +} + + +// Build up the pixeltype descriptor + +static +cmsUInt32Number GetInputPixelType(TIFF *Bank) +{ + uint16_t Photometric, bps, spp, extra, PlanarConfig, *info; + uint16_t Compression, reverse = 0; + int ColorChannels, IsPlanar = 0, pt = 0; + + TIFFGetField(Bank, TIFFTAG_PHOTOMETRIC, &Photometric); + TIFFGetFieldDefaulted(Bank, TIFFTAG_BITSPERSAMPLE, &bps); + + if (bps == 1) + FatalError("Sorry, bilevel TIFFs has nothig to do with ICC profiles"); + + if (bps != 8 && bps != 16) + FatalError("Sorry, 8 or 16 bits per sample only"); + + TIFFGetFieldDefaulted(Bank, TIFFTAG_SAMPLESPERPIXEL, &spp); + TIFFGetFieldDefaulted(Bank, TIFFTAG_PLANARCONFIG, &PlanarConfig); + + switch (PlanarConfig) + { + case PLANARCONFIG_CONTIG: IsPlanar = 0; break; + case PLANARCONFIG_SEPARATE: FatalError("Planar TIFF are not supported"); + default: + + FatalError("Unsupported planar configuration (=%d) ", (int) PlanarConfig); + } + + // If Samples per pixel == 1, PlanarConfiguration is irrelevant and need + // not to be included. + + if (spp == 1) IsPlanar = 0; + + + // Any alpha? + + TIFFGetFieldDefaulted(Bank, TIFFTAG_EXTRASAMPLES, &extra, &info); + + + ColorChannels = spp - extra; + + switch (Photometric) { + + case PHOTOMETRIC_MINISWHITE: + + reverse = 1; + + case PHOTOMETRIC_MINISBLACK: + + pt = PT_GRAY; + break; + + case PHOTOMETRIC_RGB: + + pt = PT_RGB; + break; + + + case PHOTOMETRIC_PALETTE: + + FatalError("Sorry, palette images not supported (at least on this version)"); + + case PHOTOMETRIC_SEPARATED: + pt = PixelTypeFromChanCount(ColorChannels); + break; + + case PHOTOMETRIC_YCBCR: + TIFFGetField(Bank, TIFFTAG_COMPRESSION, &Compression); + { + uint16_t subx, suby; + + pt = PT_YCbCr; + TIFFGetFieldDefaulted(Bank, TIFFTAG_YCBCRSUBSAMPLING, &subx, &suby); + if (subx != 1 || suby != 1) + FatalError("Sorry, subsampled images not supported"); + + } + break; + + case 9: + case PHOTOMETRIC_CIELAB: + pt = PT_Lab; + break; + + + case PHOTOMETRIC_LOGLUV: /* CIE Log2(L) (u',v') */ + + TIFFSetField(Bank, TIFFTAG_SGILOGDATAFMT, SGILOGDATAFMT_16BIT); + pt = PT_YUV; // *ICCSpace = icSigLuvData; + bps = 16; // 16 bits forced by LibTiff + break; + + default: + FatalError("Unsupported TIFF color space (Photometric %d)", Photometric); + } + + // Convert bits per sample to bytes per sample + + bps >>= 3; + + return (COLORSPACE_SH(pt)|PLANAR_SH(IsPlanar)|EXTRA_SH(extra)|CHANNELS_SH(ColorChannels)|BYTES_SH(bps)|FLAVOR_SH(reverse)); +} + + + +static +cmsUInt32Number OpenEmbedded(TIFF* tiff, cmsHPROFILE* PtrProfile, cmsHTRANSFORM* PtrXform) +{ + + cmsUInt32Number EmbedLen, dwFormat = 0; + cmsUInt8Number* EmbedBuffer; + + *PtrProfile = NULL; + *PtrXform = NULL; + + if (TIFFGetField(tiff, TIFFTAG_ICCPROFILE, &EmbedLen, &EmbedBuffer)) { + + *PtrProfile = cmsOpenProfileFromMem(EmbedBuffer, EmbedLen); + + if (Verbose) { + + fprintf(stdout, "Embedded profile found:\n"); + PrintProfileInformation(*PtrProfile); + + } + + dwFormat = GetInputPixelType(tiff); + *PtrXform = cmsCreateTransform(*PtrProfile, dwFormat, + hLab, TYPE_Lab_DBL, INTENT_RELATIVE_COLORIMETRIC, 0); + + } + + return dwFormat; +} + + +static +size_t PixelSize(cmsUInt32Number dwFormat) +{ + return T_BYTES(dwFormat) * (T_CHANNELS(dwFormat) + T_EXTRA(dwFormat)); +} + + +static +int CmpImages(TIFF* tiff1, TIFF* tiff2, TIFF* diff) +{ + cmsUInt8Number* buf1, *buf2, *buf3=NULL; + int row, cols, imagewidth = 0, imagelength = 0; + uint16_t Photometric; + double dE = 0; + double dR, dG, dB, dC, dM, dY, dK; + int rc = 0; + cmsHPROFILE hProfile1 = 0, hProfile2 = 0; + cmsHTRANSFORM xform1 = 0, xform2 = 0; + cmsUInt32Number dwFormat1, dwFormat2; + + + + TIFFGetField(tiff1, TIFFTAG_PHOTOMETRIC, &Photometric); + TIFFGetField(tiff1, TIFFTAG_IMAGEWIDTH, &imagewidth); + TIFFGetField(tiff1, TIFFTAG_IMAGELENGTH, &imagelength); + TIFFGetField(tiff1, TIFFTAG_SAMPLESPERPIXEL, &Channels); + + dwFormat1 = OpenEmbedded(tiff1, &hProfile1, &xform1); + dwFormat2 = OpenEmbedded(tiff2, &hProfile2, &xform2); + + + + buf1 = (cmsUInt8Number*)_TIFFmalloc(TIFFScanlineSize(tiff1)); + buf2 = (cmsUInt8Number*)_TIFFmalloc(TIFFScanlineSize(tiff2)); + + if (diff) { + + TIFFSetField(diff, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK); + TIFFSetField(diff, TIFFTAG_COMPRESSION, COMPRESSION_NONE); + TIFFSetField(diff, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); + + TIFFSetField(diff, TIFFTAG_IMAGEWIDTH, imagewidth); + TIFFSetField(diff, TIFFTAG_IMAGELENGTH, imagelength); + + TIFFSetField(diff, TIFFTAG_SAMPLESPERPIXEL, 1); + TIFFSetField(diff, TIFFTAG_BITSPERSAMPLE, 8); + + buf3 = (cmsUInt8Number*)_TIFFmalloc(TIFFScanlineSize(diff)); + } + + + + for (row = 0; row < imagelength; row++) { + + if (TIFFReadScanline(tiff1, buf1, row, 0) < 0) goto Error; + if (TIFFReadScanline(tiff2, buf2, row, 0) < 0) goto Error; + + + for (cols = 0; cols < imagewidth; cols++) { + + + switch (Photometric) { + + case PHOTOMETRIC_MINISWHITE: + case PHOTOMETRIC_MINISBLACK: + + dE = fabs(buf2[cols] - buf1[cols]); + + AddOnePixel(&ColorantStat[0], dE); + AddOnePixel(&EuclideanStat, dE); + break; + + case PHOTOMETRIC_RGB: + + { + int index = 3 * cols; + + dR = fabs(buf2[index+0] - buf1[index+0]); + dG = fabs(buf2[index+1] - buf1[index+1]); + dB = fabs(buf2[index+2] - buf1[index+2]); + + dE = sqrt(dR * dR + dG * dG + dB * dB) / sqrt(3.); + } + + AddOnePixel(&ColorantStat[0], dR); + AddOnePixel(&ColorantStat[1], dG); + AddOnePixel(&ColorantStat[2], dB); + AddOnePixel(&EuclideanStat, dE); + break; + + case PHOTOMETRIC_SEPARATED: + + { + int index = 4 * cols; + + dC = fabs(buf2[index+0] - buf1[index+0]); + dM = fabs(buf2[index+1] - buf1[index+1]); + dY = fabs(buf2[index+2] - buf1[index+2]); + dK = fabs(buf2[index+3] - buf1[index+3]); + + dE = sqrt(dC * dC + dM * dM + dY * dY + dK * dK) / 2.; + } + AddOnePixel(&ColorantStat[0], dC); + AddOnePixel(&ColorantStat[1], dM); + AddOnePixel(&ColorantStat[2], dY); + AddOnePixel(&ColorantStat[3], dK); + AddOnePixel(&EuclideanStat, dE); + break; + + default: + FatalError("Unsupported channels: %d", Channels); + } + + + if (xform1 && xform2) { + + + cmsCIELab Lab1, Lab2; + size_t index1 = cols * PixelSize(dwFormat1); + size_t index2 = cols * PixelSize(dwFormat2); + + cmsDoTransform(xform1, &buf1[index1], &Lab1, 1); + cmsDoTransform(xform2, &buf2[index2], &Lab2, 1); + + dE = cmsDeltaE(&Lab1, &Lab2); + AddOnePixel(&ColorimetricStat, dE); + } + + + if (diff) { + buf3[cols] = (cmsUInt8Number) floor(dE + 0.5); + } + + } + + if (diff) { + + if (TIFFWriteScanline(diff, buf3, row, 0) < 0) goto Error; + } + + + } + + rc = 1; + +Error: + + if (hProfile1) cmsCloseProfile(hProfile1); + if (hProfile2) cmsCloseProfile(hProfile2); + if (xform1) cmsDeleteTransform(xform1); + if (xform2) cmsDeleteTransform(xform2); + _TIFFfree(buf1); _TIFFfree(buf2); + if (diff) { + TIFFWriteDirectory(diff); + if (buf3 != NULL) _TIFFfree(buf3); + } + return rc; +} + + +static +void AssureShortTagIs(TIFF* tif1, TIFF* tiff2, int tag, int Val, const char* Error) +{ + uint16_t v1; + + + if (!TIFFGetField(tif1, tag, &v1)) goto Err; + if (v1 != Val) goto Err; + + if (!TIFFGetField(tiff2, tag, &v1)) goto Err; + if (v1 != Val) goto Err; + + return; +Err: + FatalError("%s is not proper", Error); +} + + +static +int CmpShortTag(TIFF* tif1, TIFF* tif2, int tag) +{ + uint16_t v1, v2; + + if (!TIFFGetField(tif1, tag, &v1)) return 0; + if (!TIFFGetField(tif2, tag, &v2)) return 0; + + return v1 == v2; +} + +static +int CmpLongTag(TIFF* tif1, TIFF* tif2, int tag) +{ + uint32_t v1, v2; + + if (!TIFFGetField(tif1, tag, &v1)) return 0; + if (!TIFFGetField(tif2, tag, &v2)) return 0; + + return v1 == v2; +} + + +static +void EqualShortTag(TIFF* tif1, TIFF* tif2, int tag, const char* Error) +{ + if (!CmpShortTag(tif1, tif2, tag)) + FatalError("%s is different", Error); +} + + + +static +void EqualLongTag(TIFF* tif1, TIFF* tif2, int tag, const char* Error) +{ + if (!CmpLongTag(tif1, tif2, tag)) + FatalError("%s is different", Error); +} + + + +static +void AddOneCGATSRow(cmsHANDLE hIT8, char *Name, LPSTAT st) +{ + + double Per100 = 100.0 * ((255.0 - Mean(st)) / 255.0); + + cmsIT8SetData(hIT8, Name, "SAMPLE_ID", Name); + cmsIT8SetDataDbl(hIT8, Name, "PER100_EQUAL", Per100); + cmsIT8SetDataDbl(hIT8, Name, "MEAN_DE", Mean(st)); + cmsIT8SetDataDbl(hIT8, Name, "STDEV_DE", Std(st)); + cmsIT8SetDataDbl(hIT8, Name, "MIN_DE", st ->Min); + cmsIT8SetDataDbl(hIT8, Name, "MAX_DE", st ->Peak); + +} + + +static +void CreateCGATS(const char* TiffName1, const char* TiffName2) +{ + cmsHANDLE hIT8 = cmsIT8Alloc(0); + time_t ltime; + char Buffer[256]; + + cmsIT8SetSheetType(hIT8, "TIFFDIFF"); + + + sprintf(Buffer, "Differences between %s and %s", TiffName1, TiffName2); + + cmsIT8SetComment(hIT8, Buffer); + + cmsIT8SetPropertyStr(hIT8, "ORIGINATOR", "TIFFDIFF"); + time( <ime ); + strcpy(Buffer, ctime(<ime)); + Buffer[strlen(Buffer)-1] = 0; // Remove the nasty "\n" + + cmsIT8SetPropertyStr(hIT8, "CREATED", Buffer); + + cmsIT8SetComment(hIT8, " "); + + cmsIT8SetPropertyDbl(hIT8, "NUMBER_OF_FIELDS", 6); + + + cmsIT8SetDataFormat(hIT8, 0, "SAMPLE_ID"); + cmsIT8SetDataFormat(hIT8, 1, "PER100_EQUAL"); + cmsIT8SetDataFormat(hIT8, 2, "MEAN_DE"); + cmsIT8SetDataFormat(hIT8, 3, "STDEV_DE"); + cmsIT8SetDataFormat(hIT8, 4, "MIN_DE"); + cmsIT8SetDataFormat(hIT8, 5, "MAX_DE"); + + + switch (Channels) { + + case 1: + cmsIT8SetPropertyDbl(hIT8, "NUMBER_OF_SETS", 3); + AddOneCGATSRow(hIT8, "GRAY_PLANE", &ColorantStat[0]); + break; + + case 3: + cmsIT8SetPropertyDbl(hIT8, "NUMBER_OF_SETS", 5); + AddOneCGATSRow(hIT8, "R_PLANE", &ColorantStat[0]); + AddOneCGATSRow(hIT8, "G_PLANE", &ColorantStat[1]); + AddOneCGATSRow(hIT8, "B_PLANE", &ColorantStat[2]); + break; + + + case 4: + cmsIT8SetPropertyDbl(hIT8, "NUMBER_OF_SETS", 6); + AddOneCGATSRow(hIT8, "C_PLANE", &ColorantStat[0]); + AddOneCGATSRow(hIT8, "M_PLANE", &ColorantStat[1]); + AddOneCGATSRow(hIT8, "Y_PLANE", &ColorantStat[2]); + AddOneCGATSRow(hIT8, "K_PLANE", &ColorantStat[3]); + break; + + default: FatalError("Internal error: Bad ColorSpace"); + + } + + AddOneCGATSRow(hIT8, "EUCLIDEAN", &EuclideanStat); + AddOneCGATSRow(hIT8, "COLORIMETRIC", &ColorimetricStat); + + cmsIT8SaveToFile(hIT8, CGATSout); + cmsIT8Free(hIT8); +} + +int main(int argc, char* argv[]) +{ + int i; + + Tiff1 = Tiff2 = TiffDiff = NULL; + + InitUtils("tiffdiff"); + + HandleSwitches(argc, argv); + + if ((argc - xoptind) != 2) { + + Help(); + } + + TIFFSetErrorHandler(ConsoleErrorHandler); + TIFFSetWarningHandler(ConsoleWarningHandler); + + Tiff1 = TIFFOpen(argv[xoptind], "r"); + if (Tiff1 == NULL) FatalError("Unable to open '%s'", argv[xoptind]); + + Tiff2 = TIFFOpen(argv[xoptind+1], "r"); + if (Tiff2 == NULL) FatalError("Unable to open '%s'", argv[xoptind+1]); + + if (TiffDiffFilename) { + + TiffDiff = TIFFOpen(TiffDiffFilename, "w"); + if (TiffDiff == NULL) FatalError("Unable to create '%s'", TiffDiffFilename); + + } + + + AssureShortTagIs(Tiff1, Tiff2, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG, "Planar Config"); + AssureShortTagIs(Tiff1, Tiff2, TIFFTAG_BITSPERSAMPLE, 8, "8 bit per sample"); + + EqualLongTag(Tiff1, Tiff2, TIFFTAG_IMAGEWIDTH, "Image width"); + EqualLongTag(Tiff1, Tiff2, TIFFTAG_IMAGELENGTH, "Image length"); + + EqualShortTag(Tiff1, Tiff2, TIFFTAG_SAMPLESPERPIXEL, "Samples per pixel"); + + + hLab = cmsCreateLab4Profile(NULL); + + ClearStatistics(&EuclideanStat); + for (i=0; i < 4; i++) + ClearStatistics(&ColorantStat[i]); + + if (!CmpImages(Tiff1, Tiff2, TiffDiff)) + FatalError("Error comparing images"); + + if (CGATSout) { + CreateCGATS(argv[xoptind], argv[xoptind+1]); + } + else { + + double Per100 = 100.0 * ((255.0 - Mean(&EuclideanStat)) / 255.0); + + printf("Digital counts %g%% equal. mean %g, min %g, max %g, Std %g\n", Per100, Mean(&EuclideanStat), + EuclideanStat.Min, + EuclideanStat.Peak, + Std(&EuclideanStat)); + + if (ColorimetricStat.n > 0) { + + Per100 = 100.0 * ((255.0 - Mean(&ColorimetricStat)) / 255.0); + + printf("dE Colorimetric %g%% equal. mean %g, min %g, max %g, Std %g\n", Per100, Mean(&ColorimetricStat), + ColorimetricStat.Min, + ColorimetricStat.Peak, + Std(&ColorimetricStat)); + } + + } + + if (hLab) cmsCloseProfile(hLab); + if (Tiff1) TIFFClose(Tiff1); + if (Tiff2) TIFFClose(Tiff2); + if (TiffDiff) TIFFClose(TiffDiff); + + return 0; +} + + diff --git a/local/recipes/libs/lcms2/source/utils/tificc/tificc.1 b/local/recipes/libs/lcms2/source/utils/tificc/tificc.1 new file mode 100644 index 0000000000..9af0d8688c --- /dev/null +++ b/local/recipes/libs/lcms2/source/utils/tificc/tificc.1 @@ -0,0 +1,117 @@ +.\"Shiju P. Nair September 30, 2004 +.\"Thomas Weber April 23, 2014 +.TH TIFICC 1 "October 23, 2004" +.SH NAME +tificc - little cms ICC profile applier for TIFF. +.SH SYNOPSIS +.B tificc +.RI [ options ] " input.tif output.tif" +.SH DESCRIPTION +lcms is a standalone CMM engine, which deals with the color management. +It implements a fast transformation between ICC profiles. +.B tificc +is a little cms ICC profile applier for TIFF. +.SH OPTIONS +.TP +.B \-a +Handle channels > 4 as alpha. +.TP +.B \-b +Black point compensation. +.TP +.BI \-c\ NUM +Precalculates transform (0=Off, 1=Normal, 2=Hi-res, 3=LoRes) [defaults to 1]. +.TP +.BI \-d\ NUM +Observer adaptation state (abs.col. only), (0..1.0, float value) [defaults to 0.0]. +.TP +.B \-e +Embed destination profile. +.TP +.B \-g +Marks out-of-gamut colors on softproof. +.TP +.BI \-h\ NUM +Show summary of options and examples (0=help, 1=Examples, 2=Built-in profiles, 3=Contact information) +.TP +.BI \-i\ profile +Input profile (defaults to sRGB). +.TP +.BI \-k\ inklimit +Ink-limiting in % (CMYK only), (0..400.0, float value) [default 400.0]. +.TP +.BI \-l\ profile +Transform by device-link profile. +.TP +.B \-m TODO: check if values outside 0..3 are possible +SoftProof intent [defaults to 0]. +.TP +.B \-n +Ignore embedded profile on input. +.TP +.BI \-o\ profile +Output profile (defaults to sRGB). +.TP +.BI \-p\ profile +Soft proof profile. +.TP +.BI \-s\ newprofile +Save embedded profile as \fInewprofile\fR. +.TP +.BI \-t\ NUM +Rendering intent +.nf +.RS +0=Perceptual [default] +1=Relative colorimetric +2=Saturation +3=Absolute colorimetric +10=Perceptual preserving black ink +11=Relative colorimetric preserving black ink +12=Saturation preserving black ink +13=Perceptual preserving black plane +14=Relative colorimetric preserving black plane +15=Saturation preserving black plane +.RE +.fi +.TP +.B \-v +Verbose. +.TP +.BI \-w\ NUM +Output depth (8, 16 or 32). Use 32 for floating-point. +.SH BUILT-IN PROFILES +.nf + *Lab2 -- D50-based v2 CIEL*a*b + *Lab4 -- D50-based v4 CIEL*a*b + *Lab -- D50-based v4 CIEL*a*b + *XYZ -- CIE XYZ (PCS) + *sRGB -- sRGB color space + *Gray22 - Monochrome of Gamma 2.2 + *Gray30 - Monochrome of Gamma 3.0 + *null - Monochrome black for all input + *Lin2222- CMYK linearization of gamma 2.2 on each channel +.fi +.SH EXAMPLES +.nf +To color correct from scanner to sRGB: + tificc -iscanner.icm in.tif out.tif +To convert from monitor1 to monitor2: + tificc -imon1.icm -omon2.icm in.tif out.tif +To make a CMYK separation: + tificc -oprinter.icm inrgb.tif outcmyk.tif +To recover sRGB from a CMYK separation: + tificc -iprinter.icm incmyk.tif outrgb.tif +To convert from CIELab TIFF to sRGB + tificc -i*Lab in.tif out.tif +.fi +.SH NOTES +For suggestions, comments, bug reports etc. send mail to info@littlecms.com. +.SH SEE ALSO +.BR jpgicc (1), +.BR linkicc (1), +.BR psicc (1), +.BR transicc (1) +.SH AUTHOR +This manual page was originally written by Shiju p. Nair , +for the Debian project. Modified by Marti Maria to reflect further changes. diff --git a/local/recipes/libs/lcms2/source/utils/tificc/tificc.c b/local/recipes/libs/lcms2/source/utils/tificc/tificc.c new file mode 100644 index 0000000000..0f14a4cc44 --- /dev/null +++ b/local/recipes/libs/lcms2/source/utils/tificc/tificc.c @@ -0,0 +1,1316 @@ +//--------------------------------------------------------------------------------- +// +// Little Color Management System +// Copyright (c) 1998-2026 Marti Maria Saguer +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//--------------------------------------------------------------------------------- + +// This program does apply profiles to (some) TIFF files + +#include "lcms2_plugin.h" +#include "tiffio.h" +#include "utils.h" + +// Fix broken libtiff 4.3.0, thanks to Bob Friesenhahn for uncovering this + +#if defined(HAVE_STDINT_H) && (TIFFLIB_VERSION >= 20201219) +#include +# undef cmsUInt16Number +# define cmsUInt16Number uint16_t +# undef cmsUInt32Number +# define cmsUInt32Number uint32_t +#endif /* TIFFLIB_VERSION */ + +// Flags + +static cmsBool BlackWhiteCompensation = FALSE; +static cmsBool IgnoreEmbedded = FALSE; +static cmsBool EmbedProfile = FALSE; +static int PixelDepth = 8; +static cmsBool GamutCheck = FALSE; +static cmsBool lIsDeviceLink = FALSE; +static cmsBool lIsCUBE = FALSE; +static cmsBool StoreAsAlpha = FALSE; + +static int Intent = INTENT_PERCEPTUAL; +static int ProofingIntent = INTENT_PERCEPTUAL; +static int PrecalcMode = 1; +static cmsFloat64Number InkLimit = 400; + +static cmsFloat64Number ObserverAdaptationState = 1.0; // According ICC 4.4 this is the default + +static const char *cInpProf = NULL; +static const char *cOutProf = NULL; +static const char *cProofing = NULL; + +static const char* SaveEmbedded = NULL; + +// Console error & warning +static +void ConsoleWarningHandler(const char* module, const char* fmt, va_list ap) +{ + if (Verbose) { + + fprintf(stderr, "Warning: "); + + if (module != NULL) + fprintf(stderr, "[%s] ", module); + + vfprintf(stderr, fmt, ap); + fprintf(stderr, "\n"); + fflush(stderr); + } +} + +static +void ConsoleErrorHandler(const char* module, const char* fmt, va_list ap) +{ + if (Verbose) { + + fprintf(stderr, "Error: "); + + if (module != NULL) + fprintf(stderr, "[%s] ", module); + + vfprintf(stderr, fmt, ap); + fprintf(stderr, "\n"); + fflush(stderr); + } + +} + + +// Issue a warning +static +void Warning(const char *frm, ...) +{ + va_list args; + + va_start(args, frm); + ConsoleWarningHandler("tificc", frm, args); + va_end(args); +} + + + +// Out of memory is a fatal error +static +void OutOfMem(cmsUInt32Number size) +{ + FatalError("Out of memory on allocating %d bytes.", size); +} + + +// ----------------------------------------------------------------------------------------------- +// Lab plug-in +// In TIFF, Lab is encoded in a different way, so let's use the plug-in +// capabilities of lcms2 to change the meaning of TYPE_Lab_8. + +#define LABTIFF_SH(m) ((m) << 30) +#define T_LABTIFF(m) (((m)>>30)&1) + +// * 0xffff / 0xff00 = (255 * 257) / (255 * 256) = 257 / 256 +static +int FromLabV2ToLabV4(int x) +{ + int a; + + a = ((x << 8) | x) >> 8; // * 257 / 256 + if ( a > 0xffff) return 0xffff; + return a; +} + +// * 0xf00 / 0xffff = * 256 / 257 +static +int FromLabV4ToLabV2(int x) +{ + return ((x << 8) + 0x80) / 257; +} + + +// Formatter for 8bit Lab TIFF (photometric 8) +static +unsigned char* UnrollTIFFLab8(struct _cmstransform_struct* CMMcargo, + CMSREGISTER cmsUInt16Number wIn[], + CMSREGISTER cmsUInt8Number* accum, + CMSREGISTER cmsUInt32Number Stride) +{ + wIn[0] = (cmsUInt16Number) FromLabV2ToLabV4((accum[0]) << 8); + wIn[1] = (cmsUInt16Number) FromLabV2ToLabV4(((accum[1] > 127) ? (accum[1] - 128) : (accum[1] + 128)) << 8); + wIn[2] = (cmsUInt16Number) FromLabV2ToLabV4(((accum[2] > 127) ? (accum[2] - 128) : (accum[2] + 128)) << 8); + + return accum + 3; + + UTILS_UNUSED_PARAMETER(Stride); + UTILS_UNUSED_PARAMETER(CMMcargo); +} + +// Formatter for 16bit Lab TIFF (photometric 8) +static +unsigned char* UnrollTIFFLab16(struct _cmstransform_struct* CMMcargo, + CMSREGISTER cmsUInt16Number wIn[], + CMSREGISTER cmsUInt8Number* accum, + CMSREGISTER cmsUInt32Number Stride ) +{ + cmsUInt16Number* accum16 = (cmsUInt16Number*) accum; + + wIn[0] = (cmsUInt16Number) FromLabV2ToLabV4(accum16[0]); + wIn[1] = (cmsUInt16Number) FromLabV2ToLabV4(((accum16[1] > 0x7f00) ? (accum16[1] - 0x8000) : (accum16[1] + 0x8000)) ); + wIn[2] = (cmsUInt16Number) FromLabV2ToLabV4(((accum16[2] > 0x7f00) ? (accum16[2] - 0x8000) : (accum16[2] + 0x8000)) ); + + return accum + 3 * sizeof(cmsUInt16Number); + + UTILS_UNUSED_PARAMETER(Stride); + UTILS_UNUSED_PARAMETER(CMMcargo); +} + + +static +unsigned char* PackTIFFLab8(struct _cmstransform_struct* CMMcargo, + CMSREGISTER cmsUInt16Number wOut[], + CMSREGISTER cmsUInt8Number* output, + CMSREGISTER cmsUInt32Number Stride) +{ + int a, b; + + *output++ = (cmsUInt8Number) (FromLabV4ToLabV2(wOut[0] + 0x0080) >> 8); + + a = (FromLabV4ToLabV2(wOut[1]) + 0x0080) >> 8; + b = (FromLabV4ToLabV2(wOut[2]) + 0x0080) >> 8; + + *output++ = (cmsUInt8Number) ((a < 128) ? (a + 128) : (a - 128)); + *output++ = (cmsUInt8Number) ((b < 128) ? (b + 128) : (b - 128)); + + return output; + + UTILS_UNUSED_PARAMETER(Stride); + UTILS_UNUSED_PARAMETER(CMMcargo); +} + + +static +unsigned char* PackTIFFLabA8(struct _cmstransform_struct* CMMcargo, + CMSREGISTER cmsUInt16Number wOut[], + CMSREGISTER cmsUInt8Number* output, + CMSREGISTER cmsUInt32Number Stride) +{ + int a, b; + + *output++ = (cmsUInt8Number) (FromLabV4ToLabV2(wOut[0] + 0x0080) >> 8); + + a = (FromLabV4ToLabV2(wOut[1]) + 0x0080) >> 8; + b = (FromLabV4ToLabV2(wOut[2]) + 0x0080) >> 8; + + *output++ = (cmsUInt8Number) ((a < 128) ? (a + 128) : (a - 128)); + *output++ = (cmsUInt8Number) ((b < 128) ? (b + 128) : (b - 128)); + + output++; // Alpha + + return output; + + UTILS_UNUSED_PARAMETER(Stride); + UTILS_UNUSED_PARAMETER(CMMcargo); +} + + +static +unsigned char* PackTIFFLab16(struct _cmstransform_struct* CMMcargo, + CMSREGISTER cmsUInt16Number wOut[], + CMSREGISTER cmsUInt8Number* output, + CMSREGISTER cmsUInt32Number Stride) +{ + int a, b; + cmsUInt16Number* output16 = (cmsUInt16Number*) output; + + *output16++ = (cmsUInt16Number) FromLabV4ToLabV2(wOut[0]); + + a = FromLabV4ToLabV2(wOut[1]); + b = FromLabV4ToLabV2(wOut[2]); + + *output16++ = (cmsUInt16Number) ((a < 0x7f00) ? (a + 0x8000) : (a - 0x8000)); + *output16++ = (cmsUInt16Number) ((b < 0x7f00) ? (b + 0x8000) : (b - 0x8000)); + + return (cmsUInt8Number*) output16; + + UTILS_UNUSED_PARAMETER(Stride); + UTILS_UNUSED_PARAMETER(CMMcargo); +} + +static +unsigned char* PackTIFFLabA16(struct _cmstransform_struct* CMMcargo, + CMSREGISTER cmsUInt16Number wOut[], + CMSREGISTER cmsUInt8Number* output, + CMSREGISTER cmsUInt32Number Stride) +{ + int a, b; + cmsUInt16Number* output16 = (cmsUInt16Number*) output; + + *output16++ = (cmsUInt16Number) FromLabV4ToLabV2(wOut[0]); + + a = FromLabV4ToLabV2(wOut[1]); + b = FromLabV4ToLabV2(wOut[2]); + + *output16++ = (cmsUInt16Number) ((a < 0x7f00) ? (a + 0x8000) : (a - 0x8000)); + *output16++ = (cmsUInt16Number) ((b < 0x7f00) ? (b + 0x8000) : (b - 0x8000)); + + output16++; // Alpha + + return (cmsUInt8Number*) output16; + + UTILS_UNUSED_PARAMETER(Stride); + UTILS_UNUSED_PARAMETER(CMMcargo); +} + + +static +cmsFormatter TiffFormatterFactory(cmsUInt32Number Type, + cmsFormatterDirection Dir, + cmsUInt32Number dwFlags) +{ + cmsFormatter Result = { NULL }; + int bps = T_BYTES(Type); + int IsTiffSpecial = T_LABTIFF(Type); + + if (IsTiffSpecial && !(dwFlags & CMS_PACK_FLAGS_FLOAT)) + { + if (Dir == cmsFormatterInput) + { + Result.Fmt16 = (bps == 1) ? UnrollTIFFLab8 : UnrollTIFFLab16; + } + else + { + if (T_EXTRA(Type) == 1) + Result.Fmt16 = (bps == 1) ? PackTIFFLabA8 : PackTIFFLabA16; + else + if (T_EXTRA(Type) == 0) + Result.Fmt16 = (bps == 1) ? PackTIFFLab8 : PackTIFFLab16; + } + } + + return Result; +} + +static cmsPluginFormatters TiffLabPlugin = { {cmsPluginMagicNumber, 2000, cmsPluginFormattersSig, NULL}, TiffFormatterFactory }; + +// ----------------------------------------------------------------------------------------------- + +// Build up the pixeltype descriptor +static +cmsUInt32Number GetInputPixelType(TIFF *Bank) +{ + cmsUInt16Number Photometric, bps, spp, extra, PlanarConfig, *info; + cmsUInt16Number Compression; + int ColorChannels; + int IsPremul = FALSE, IsPlanar = FALSE, IsFlt = FALSE, IsReverse = FALSE; + int labTiffSpecial = FALSE; + int pt = PT_ANY; + + TIFFGetFieldDefaulted(Bank, TIFFTAG_BITSPERSAMPLE, &bps); + + if (bps == 1) + FatalError("Sorry, bilevel TIFFs has nothing to do with ICC profiles"); + + if (bps != 8 && bps != 16 && bps != 32) + FatalError("Sorry, 8, 16 or 32 bits per sample only"); + + + TIFFGetFieldDefaulted(Bank, TIFFTAG_PLANARCONFIG, &PlanarConfig); + + switch (PlanarConfig) { + + case PLANARCONFIG_CONTIG: IsPlanar = 0; break; + case PLANARCONFIG_SEPARATE: IsPlanar = 1; break; + default: + + FatalError("Unsupported planar configuration (=%d) ", (int) PlanarConfig); + } + + TIFFGetFieldDefaulted(Bank, TIFFTAG_SAMPLESPERPIXEL, &spp); + + // If Samples per pixel == 1, PlanarConfiguration is irrelevant and need not to be included. + if (spp == 1) IsPlanar = 0; + + // Any alpha? + TIFFGetFieldDefaulted(Bank, TIFFTAG_EXTRASAMPLES, &extra, &info); + + // Read alpha channels as colorant? + if (StoreAsAlpha) { + + ColorChannels = spp; + extra = 0; + } + else + ColorChannels = spp - extra; + + // Is alpha premultiplied ? + IsPremul = ((extra == 1) && (info[0] == EXTRASAMPLE_ASSOCALPHA)); + + + // Get photometric interpretation and proceed accordly + TIFFGetField(Bank, TIFFTAG_PHOTOMETRIC, &Photometric); + + switch (Photometric) { + + case PHOTOMETRIC_MINISWHITE: + + IsReverse = 1; + + // ... fall through ... + + case PHOTOMETRIC_MINISBLACK: + pt = PT_GRAY; + break; + + case PHOTOMETRIC_RGB: + pt = PT_RGB; + if (ColorChannels < 3) + FatalError("Sorry, RGB needs at least 3 samples per pixel"); + break; + + case PHOTOMETRIC_PALETTE: + FatalError("Sorry, palette images not supported"); + break; + + case PHOTOMETRIC_SEPARATED: + pt = PixelTypeFromChanCount(ColorChannels); + break; + + case PHOTOMETRIC_YCBCR: + TIFFGetField(Bank, TIFFTAG_COMPRESSION, &Compression); + { + cmsUInt16Number subx, suby; + + pt = PT_YCbCr; + TIFFGetFieldDefaulted(Bank, TIFFTAG_YCBCRSUBSAMPLING, &subx, &suby); + if (subx != 1 || suby != 1) + FatalError("Sorry, subsampled images are not supported"); + } + break; + + // Two Lab flavours + case PHOTOMETRIC_ITULAB: + case PHOTOMETRIC_ICCLAB: + pt = PT_Lab; + break; + + case PHOTOMETRIC_CIELAB: + pt = PT_Lab; + labTiffSpecial = TRUE; + break; + + // CIE Log2(L) (u',v') + case PHOTOMETRIC_LOGLUV: + + TIFFSetField(Bank, TIFFTAG_SGILOGDATAFMT, SGILOGDATAFMT_16BIT); + pt = PT_YUV; // *ICCSpace = icSigLuvData; + bps = 16; // 16 bits forced by LibTiff + break; + + default: + FatalError("Unsupported TIFF color space (Photometric %d)", Photometric); + } + + // Convert bits per sample to bytes per sample + + bps >>= 3; + IsFlt = (bps == 0) || (bps == 4); + + return (FLOAT_SH(IsFlt) | COLORSPACE_SH(pt) | PLANAR_SH(IsPlanar) | EXTRA_SH(extra) | PREMUL_SH(IsPremul) | + CHANNELS_SH(ColorChannels) | BYTES_SH(bps) | FLAVOR_SH(IsReverse) | LABTIFF_SH(labTiffSpecial)); +} + + +// Rearrange pixel type to build output descriptor + +static +cmsUInt32Number ComputeOutputFormatDescriptor(cmsUInt32Number dwInput, int OutColorSpace, int bps) +{ + int IsPlanar = T_PLANAR(dwInput); + int Channels = ChanCountFromPixelType(OutColorSpace); + int IsFlt = (bps == 0) || (bps == 4); + int labTiffSpecial = FALSE; + int Extra = T_EXTRA(dwInput); + int IsPremul = T_PREMUL(dwInput); + + if (OutColorSpace == PT_Lab) + labTiffSpecial = TRUE; + + return (FLOAT_SH(IsFlt) | COLORSPACE_SH(OutColorSpace) | PLANAR_SH(IsPlanar) | + CHANNELS_SH(Channels) | BYTES_SH(bps) | EXTRA_SH(Extra) | PREMUL_SH(IsPremul) | + LABTIFF_SH(labTiffSpecial)); +} + + + +// Tile based transforms +static +int TileBasedXform(cmsHTRANSFORM hXForm, TIFF* in, TIFF* out, int nPlanes) +{ + tsize_t BufSizeIn = TIFFTileSize(in); + tsize_t BufSizeOut = TIFFTileSize(out); + unsigned char *BufferIn, *BufferOut; + ttile_t i, TileCount = TIFFNumberOfTiles(in) / nPlanes; + cmsUInt32Number tw, tl; + int PixelCount, j; + + // Check for bad tiffs + if (BufSizeIn > INT_MAX || BufSizeOut > INT_MAX) + FatalError("Probably corrupted TIFF, tile too big."); + + TIFFGetFieldDefaulted(in, TIFFTAG_TILEWIDTH, &tw); + TIFFGetFieldDefaulted(in, TIFFTAG_TILELENGTH, &tl); + + PixelCount = (int) tw * tl; + + BufferIn = (unsigned char *) _TIFFmalloc(BufSizeIn * nPlanes); + if (!BufferIn) OutOfMem((cmsUInt32Number) BufSizeIn * nPlanes); + + BufferOut = (unsigned char *) _TIFFmalloc(BufSizeOut * nPlanes); + if (!BufferOut) OutOfMem((cmsUInt32Number) BufSizeOut * nPlanes); + + + for (i = 0; i < TileCount; i++) { + + for (j=0; j < nPlanes; j++) { + + if (TIFFReadEncodedTile(in, i + (j* TileCount), + BufferIn + (j*BufSizeIn), BufSizeIn) < 0) goto cleanup; + } + + if (PixelCount < 0) + FatalError("TIFF is corrupted"); + + cmsDoTransform(hXForm, BufferIn, BufferOut, PixelCount); + + for (j=0; j < nPlanes; j++) { + + if (TIFFWriteEncodedTile(out, i + (j*TileCount), + BufferOut + (j*BufSizeOut), BufSizeOut) < 0) goto cleanup; + } + } + + _TIFFfree(BufferIn); + _TIFFfree(BufferOut); + return 1; + + +cleanup: + + _TIFFfree(BufferIn); + _TIFFfree(BufferOut); + return 0; +} + + +// Strip based transforms +static +int StripBasedXform(cmsHTRANSFORM hXForm, TIFF* in, TIFF* out, int nPlanes) +{ + tsize_t BufSizeIn = TIFFStripSize(in); + tsize_t BufSizeOut = TIFFStripSize(out); + unsigned char *BufferIn, *BufferOut; + ttile_t i, StripCount = TIFFNumberOfStrips(in) / nPlanes; + cmsUInt32Number sw; + cmsUInt32Number sl; + cmsUInt32Number iml; + int j; + int PixelCount; + + // Check for bad tiffs + if (BufSizeIn > INT_MAX || BufSizeOut > INT_MAX) + FatalError("Probably corrupted TIFF, strip too big."); + + TIFFGetFieldDefaulted(in, TIFFTAG_IMAGEWIDTH, &sw); + TIFFGetFieldDefaulted(in, TIFFTAG_ROWSPERSTRIP, &sl); + TIFFGetFieldDefaulted(in, TIFFTAG_IMAGELENGTH, &iml); + + // It is possible to get infinite rows per strip + if (sl == 0 || sl > iml) + sl = iml; // One strip for whole image + + BufferIn = (unsigned char *) _TIFFmalloc(BufSizeIn * nPlanes); + if (!BufferIn) OutOfMem((cmsUInt32Number) BufSizeIn * nPlanes); + + BufferOut = (unsigned char *) _TIFFmalloc(BufSizeOut * nPlanes); + if (!BufferOut) OutOfMem((cmsUInt32Number) BufSizeOut * nPlanes); + + + for (i = 0; i < StripCount; i++) { + + for (j=0; j < nPlanes; j++) { + + if (TIFFReadEncodedStrip(in, i + (j * StripCount), + BufferIn + (j * BufSizeIn), BufSizeIn) < 0) goto cleanup; + } + + PixelCount = (int) sw * (iml < sl ? iml : sl); + iml -= sl; + + if (PixelCount < 0) + FatalError("TIFF is corrupted"); + + cmsDoTransform(hXForm, BufferIn, BufferOut, PixelCount); + + for (j=0; j < nPlanes; j++) { + if (TIFFWriteEncodedStrip(out, i + (j * StripCount), + BufferOut + j * BufSizeOut, BufSizeOut) < 0) goto cleanup; + } + + } + + _TIFFfree(BufferIn); + _TIFFfree(BufferOut); + return 1; + +cleanup: + + _TIFFfree(BufferIn); + _TIFFfree(BufferOut); + return 0; +} + + +// Fill the array with a short value +static +void fillArray(cmsInt16Number array[], cmsInt16Number val, cmsUInt32Number size) +{ + cmsUInt32Number i; + + size /= sizeof(cmsInt16Number); + for (i = 0; i < size; i++) + array[i] = val; + +} + +// Creates minimum required tags +static +void WriteOutputTags(TIFF* out, int Colorspace, int BytesPerSample, int AlphaChannels, int IsPremul) +{ + int BitsPerSample = (8 * BytesPerSample); + int nChannels = ChanCountFromPixelType(Colorspace); + + + TIFFSetField(out, TIFFTAG_BITSPERSAMPLE, BitsPerSample); + TIFFSetField(out, TIFFTAG_SAMPLESPERPIXEL, nChannels + AlphaChannels); + + if (AlphaChannels > 0) + { + cmsInt16Number Extra[20]; + + if (IsPremul) + fillArray(Extra, EXTRASAMPLE_ASSOCALPHA, sizeof(Extra)); + else + fillArray(Extra, EXTRASAMPLE_UNASSALPHA, sizeof(Extra)); + + TIFFSetField(out, TIFFTAG_EXTRASAMPLES, AlphaChannels, Extra); + } + + switch (Colorspace) { + + case PT_GRAY: + TIFFSetField(out, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK); + + break; + + case PT_RGB: + TIFFSetField(out, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB); + break; + + case PT_CMY: + TIFFSetField(out, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_SEPARATED); + TIFFSetField(out, TIFFTAG_INKSET, INKSET_MULTIINK); + break; + + case PT_CMYK: + TIFFSetField(out, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_SEPARATED); + TIFFSetField(out, TIFFTAG_INKSET, INKSET_CMYK); + break; + + case PT_Lab: + if (BitsPerSample == 16) + TIFFSetField(out, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_CIELAB); + else + TIFFSetField(out, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_CIELAB); + break; + + + // Multi-ink separations + case PT_MCH2: + case PT_MCH3: + case PT_MCH4: + case PT_MCH5: + case PT_MCH6: + case PT_MCH7: + case PT_MCH8: + case PT_MCH9: + case PT_MCH10: + case PT_MCH11: + case PT_MCH12: + case PT_MCH13: + case PT_MCH14: + case PT_MCH15: + + TIFFSetField(out, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_SEPARATED); + + if (StoreAsAlpha && nChannels >= 4) { + + cmsInt16Number Extra[20]; + + fillArray(Extra, EXTRASAMPLE_UNASSALPHA, sizeof(Extra)); + + // CMYK plus extra alpha + TIFFSetField(out, TIFFTAG_EXTRASAMPLES, nChannels - 4, Extra); + TIFFSetField(out, TIFFTAG_INKSET, INKSET_CMYK); + TIFFSetField(out, TIFFTAG_NUMBEROFINKS, 4); + } + else { + TIFFSetField(out, TIFFTAG_INKSET, INKSET_MULTIINK); + TIFFSetField(out, TIFFTAG_NUMBEROFINKS, nChannels); + } + break; + + + default: + FatalError("Unsupported output colorspace"); + } + + if (PixelDepth == 32) + TIFFSetField(out, TIFFTAG_SAMPLEFORMAT, + SAMPLEFORMAT_IEEEFP, + SAMPLEFORMAT_IEEEFP, + SAMPLEFORMAT_IEEEFP, + SAMPLEFORMAT_IEEEFP); +} + + +// Copies a bunch of tags + +static +void CopyOtherTags(TIFF* in, TIFF* out) +{ +#define CopyField(tag, v) \ + if (TIFFGetField(in, tag, &v)) TIFFSetField(out, tag, v) + + + short shortv; + unsigned short compression; + cmsUInt32Number ow, ol; + cmsFloat32Number floatv; + char *stringv; + cmsUInt32Number longv; + + CopyField(TIFFTAG_SUBFILETYPE, longv); + + TIFFGetField(in, TIFFTAG_IMAGEWIDTH, &ow); + TIFFGetField(in, TIFFTAG_IMAGELENGTH, &ol); + + TIFFSetField(out, TIFFTAG_IMAGEWIDTH, ow); + TIFFSetField(out, TIFFTAG_IMAGELENGTH, ol); + + CopyField(TIFFTAG_PLANARCONFIG, shortv); + CopyField(TIFFTAG_COMPRESSION, compression); + + // This is tricky, libtiff would access predictor in a wrong way + // if the codec is none of those + if (compression == COMPRESSION_LZW || + compression == 34925 /*COMPRESSION_LZMA*/ || + compression == COMPRESSION_PIXARLOG || + compression == COMPRESSION_DEFLATE || + compression == COMPRESSION_ADOBE_DEFLATE || + compression == 50000 /*COMPRESSION_ZSTD*/) + { + if (PixelDepth != 32) + CopyField(TIFFTAG_PREDICTOR, shortv); + } + + CopyField(TIFFTAG_THRESHHOLDING, shortv); + CopyField(TIFFTAG_FILLORDER, shortv); + CopyField(TIFFTAG_ORIENTATION, shortv); + CopyField(TIFFTAG_MINSAMPLEVALUE, shortv); + CopyField(TIFFTAG_MAXSAMPLEVALUE, shortv); + CopyField(TIFFTAG_XRESOLUTION, floatv); + CopyField(TIFFTAG_YRESOLUTION, floatv); + CopyField(TIFFTAG_RESOLUTIONUNIT, shortv); + CopyField(TIFFTAG_ROWSPERSTRIP, longv); + CopyField(TIFFTAG_XPOSITION, floatv); + CopyField(TIFFTAG_YPOSITION, floatv); + CopyField(TIFFTAG_IMAGEDEPTH, longv); + CopyField(TIFFTAG_TILEDEPTH, longv); + + CopyField(TIFFTAG_TILEWIDTH, longv); + CopyField(TIFFTAG_TILELENGTH, longv); + + CopyField(TIFFTAG_ARTIST, stringv); + CopyField(TIFFTAG_IMAGEDESCRIPTION, stringv); + CopyField(TIFFTAG_MAKE, stringv); + CopyField(TIFFTAG_MODEL, stringv); + + CopyField(TIFFTAG_DATETIME, stringv); + CopyField(TIFFTAG_HOSTCOMPUTER, stringv); + CopyField(TIFFTAG_PAGENAME, stringv); + CopyField(TIFFTAG_DOCUMENTNAME, stringv); + +} + + +static +void DoEmbedProfile(TIFF* Out, const char* ProfileFile) +{ + FILE* f; + cmsInt32Number size; + cmsUInt32Number EmbedLen; + cmsUInt8Number* EmbedBuffer; + + f = fopen(ProfileFile, "rb"); + if (f == NULL) return; + + size = cmsfilelength(f); + if (size < 0) return; + + EmbedBuffer = (cmsUInt8Number*) malloc((size_t) size + 1); + if (EmbedBuffer == NULL) { + OutOfMem(size+1); + return; + } + + EmbedLen = (cmsUInt32Number) fread(EmbedBuffer, 1, (size_t) size, f); + + if (EmbedLen != (cmsUInt32Number) size) + FatalError("Cannot read %ld bytes to %s", (long) size, ProfileFile); + + fclose(f); + EmbedBuffer[EmbedLen] = 0; + + TIFFSetField(Out, TIFFTAG_ICCPROFILE, EmbedLen, EmbedBuffer); + free(EmbedBuffer); +} + + +// Read or create a ICC profile from the TIFF data +static +cmsHPROFILE GetTIFFProfile(TIFF* in) +{ + cmsCIExyYTRIPLE Primaries; + cmsFloat32Number* chr; + cmsCIExyY WhitePoint; + cmsFloat32Number* wp; + int i; + cmsToneCurve* Curve[3]; + cmsUInt16Number *gmr, *gmg, *gmb; + cmsHPROFILE hProfile; + cmsUInt32Number EmbedLen; + cmsUInt8Number* EmbedBuffer; + + if (IgnoreEmbedded) return NULL; + + if (TIFFGetField(in, TIFFTAG_ICCPROFILE, &EmbedLen, &EmbedBuffer)) { + + hProfile = cmsOpenProfileFromMem(EmbedBuffer, EmbedLen); + + // Print description found in the profile + if (Verbose && (hProfile != NULL)) { + + fprintf(stdout, "\n[Embedded profile]\n"); + PrintProfileInformation(hProfile); + fflush(stdout); + } + + if (hProfile != NULL && SaveEmbedded != NULL) + SaveMemoryBlock(EmbedBuffer, EmbedLen, SaveEmbedded); + + if (hProfile) return hProfile; + } + + // Try to see if "colorimetric" tiff + if (TIFFGetField(in, TIFFTAG_PRIMARYCHROMATICITIES, &chr)) { + + Primaries.Red.x = chr[0]; + Primaries.Red.y = chr[1]; + Primaries.Green.x = chr[2]; + Primaries.Green.y = chr[3]; + Primaries.Blue.x = chr[4]; + Primaries.Blue.y = chr[5]; + + Primaries.Red.Y = Primaries.Green.Y = Primaries.Blue.Y = 1.0; + + if (TIFFGetField(in, TIFFTAG_WHITEPOINT, &wp)) { + + WhitePoint.x = wp[0]; + WhitePoint.y = wp[1]; + WhitePoint.Y = 1.0; + + // Transfer function is a bit harder.... + TIFFGetFieldDefaulted(in, TIFFTAG_TRANSFERFUNCTION, + &gmr, + &gmg, + &gmb); + + Curve[0] = cmsBuildTabulatedToneCurve16(NULL, 256, gmr); + Curve[1] = cmsBuildTabulatedToneCurve16(NULL, 256, gmg); + Curve[2] = cmsBuildTabulatedToneCurve16(NULL, 256, gmb); + + hProfile = cmsCreateRGBProfileTHR(NULL, &WhitePoint, &Primaries, Curve); + + for (i=0; i < 3; i++) + cmsFreeToneCurve(Curve[i]); + + if (Verbose) { + fprintf(stdout, "\n[Colorimetric TIFF]\n"); + } + + + return hProfile; + } + } + + return NULL; +} + + +// Transform one image +static +int TransformImage(TIFF* in, TIFF* out, const char *cDefInpProf) +{ + cmsHPROFILE hIn, hOut, hProof, hInkLimit = NULL; + cmsHTRANSFORM xform; + cmsUInt32Number wInput, wOutput; + int OutputColorSpace; + int BytesPerSample = PixelDepth / 8; + cmsUInt32Number dwFlags; + int nPlanes; + + // Default options + dwFlags = cmsFLAGS_COPY_ALPHA; + + // Observer adaptation state (only meaningful on absolute colorimetric intent) + cmsSetAdaptationState(ObserverAdaptationState); + + if (EmbedProfile && cOutProf) + DoEmbedProfile(out, cOutProf); + + if (BlackWhiteCompensation) + dwFlags |= cmsFLAGS_BLACKPOINTCOMPENSATION; + + switch (PrecalcMode) { + + case 0: dwFlags |= cmsFLAGS_NOOPTIMIZE; break; + case 2: dwFlags |= cmsFLAGS_HIGHRESPRECALC; break; + case 3: dwFlags |= cmsFLAGS_LOWRESPRECALC; break; + case 1: break; + + default: FatalError("Unknown precalculation mode '%d'", PrecalcMode); + } + + if (GamutCheck) + dwFlags |= cmsFLAGS_GAMUTCHECK; + + hProof = NULL; + hOut = NULL; + + if (lIsDeviceLink) { + + if (lIsCUBE) + hIn = cmsCreateDeviceLinkFromCubeFile(cDefInpProf); + else + hIn = cmsOpenProfileFromFile(cDefInpProf, "r"); + } + else { + + hIn = GetTIFFProfile(in); + + if (hIn == NULL) + hIn = OpenStockProfile(NULL, cDefInpProf); + + hOut = OpenStockProfile(NULL, cOutProf); + + if (cProofing != NULL) { + + hProof = OpenStockProfile(NULL, cProofing); + dwFlags |= cmsFLAGS_SOFTPROOFING; + } + } + + if (hIn == NULL) + FatalError("No input profile found"); + + // Take input color space + wInput = GetInputPixelType(in); + + // Assure both, input profile and input TIFF are on same colorspace + if (_cmsLCMScolorSpace(cmsGetColorSpace(hIn)) != (int) T_COLORSPACE(wInput)) + FatalError("Input profile is not operating in proper color space (%d)", T_COLORSPACE(wInput)); + + + if (!lIsDeviceLink) + OutputColorSpace = _cmsLCMScolorSpace(cmsGetColorSpace(hOut)); + else + OutputColorSpace = _cmsLCMScolorSpace(cmsGetPCS(hIn)); + + wOutput = ComputeOutputFormatDescriptor(wInput, OutputColorSpace, BytesPerSample); + + WriteOutputTags(out, OutputColorSpace, BytesPerSample, T_EXTRA(wOutput), T_PREMUL(wOutput)); + CopyOtherTags(in, out); + + // Ink limit + if (InkLimit != 400.0 && + (OutputColorSpace == PT_CMYK || OutputColorSpace == PT_CMY)) { + + cmsHPROFILE hProfiles[10]; + int nProfiles = 0; + + hInkLimit = cmsCreateInkLimitingDeviceLink(cmsSigCmykData, InkLimit); + + hProfiles[nProfiles++] = hIn; + + if (hProof != NULL) { + hProfiles[nProfiles++] = hProof; + hProfiles[nProfiles++] = hProof; + } + + if (hOut != NULL) { + hProfiles[nProfiles++] = hOut; + } + + hProfiles[nProfiles++] = hInkLimit; + + xform = cmsCreateMultiprofileTransform(hProfiles, nProfiles, + wInput, wOutput, Intent, dwFlags); + + } + else { + + xform = cmsCreateProofingTransform(hIn, wInput, + hOut, wOutput, + hProof, Intent, + ProofingIntent, + dwFlags); + } + + cmsCloseProfile(hIn); + cmsCloseProfile(hOut); + + if (hInkLimit) + cmsCloseProfile(hInkLimit); + if (hProof) + cmsCloseProfile(hProof); + + if (xform == NULL) return 0; + + // Planar stuff + if (T_PLANAR(wInput)) + nPlanes = T_CHANNELS(wInput) + T_EXTRA(wInput); + else + nPlanes = 1; + + + // Handle tile by tile or strip by strip + if (TIFFIsTiled(in)) { + + TileBasedXform(xform, in, out, nPlanes); + } + else { + StripBasedXform(xform, in, out, nPlanes); + } + + + cmsDeleteTransform(xform); + + TIFFWriteDirectory(out); + + return 1; +} + + +// Print help +static +void Help(int level) +{ + UTILS_UNUSED_PARAMETER(level); + + fprintf(stderr, "Little CMS ICC profile applier for TIFF - v8.1 [LittleCMS %2.2f]\n", cmsGetEncodedCMMversion() / 1000.0); + fprintf(stderr, "Copyright (c) 1998-2026 Marti Maria Saguer. See COPYING file for details.\n"); + fflush(stderr); + + fprintf(stderr, "usage: tificc [flags] input.tif output.tif\n"); + + fprintf(stderr, "\nflags:\n\n"); + fprintf(stderr, "-v - Verbose\n"); + fprintf(stderr, "-i - Input profile (defaults to sRGB)\n"); + fprintf(stderr, "-o - Output profile (defaults to sRGB)\n"); + fprintf(stderr, "-l - Transform by device-link profile\n"); + fprintf(stderr, "-u - Transform by CUBE colormap\n"); + + PrintBuiltins(); + + PrintRenderingIntents(); + + fprintf(stderr, "-b - Black point compensation\n"); + fprintf(stderr, "-d<0..1> - Observer adaptation state (abs.col. only)\n"); + + fprintf(stderr, "-c<0,1,2,3> - Precalculates transform (0=Off, 1=Normal, 2=Hi-res, 3=LoRes)\n"); + fprintf(stderr, "\n"); + + fprintf(stderr, "-w<8,16,32> - Output depth. Use 32 for floating-point\n\n"); + fprintf(stderr, "-a - Handle channels > 4 as alpha\n"); + + fprintf(stderr, "-n - Ignore embedded profile on input\n"); + fprintf(stderr, "-e - Embed destination profile\n"); + fprintf(stderr, "-s - Save embedded profile as \n"); + fprintf(stderr, "\n"); + + + fprintf(stderr, "-p - Soft proof profile\n"); + fprintf(stderr, "-m - Soft proof intent\n"); + fprintf(stderr, "\tThat is the intent used to translate the simulation to the output device.\n\tNote that the simulated intent is set by using -t not by -m\n"); + fprintf(stderr, "-g - Marks out-of-gamut colors on softproof\n"); + + fprintf(stderr, "\n"); + + fprintf(stderr, "-k<0..400> - Ink-limiting in %% (CMYK only)\n"); + fprintf(stderr, "\n"); + + + fprintf(stderr, "Examples:\n\n" + "To color correct from scanner to sRGB:\n" + "\ttificc -iscanner.icm in.tif out.tif\n" + "To convert from monitor1 to monitor2:\n" + "\ttificc -imon1.icm -omon2.icm in.tif out.tif\n" + "To make a CMYK separation:\n" + "\ttificc -oprinter.icm inrgb.tif outcmyk.tif\n" + "To recover sRGB from a CMYK separation:\n" + "\ttificc -iprinter.icm incmyk.tif outrgb.tif\n" + "To soft-proof how behaves Probev1_ICCv4.icc on perceptual:\n" + "\ttifficc -t0 -p Probev1_ICCv4.icc -m1 infile.tif out.tif\n" + "To convert from CIELab TIFF to sRGB\n" + "\ttificc -i*Lab in.tif out.tif\n\n"); + + + fprintf(stderr, "This program is intended to be a demo of the Little CMS\n" + "color engine. Both lcms and this program are open source.\n" + "You can obtain both in source code at https://www.littlecms.com\n" + "For suggestions, comments, bug reports etc. send mail to\n" + "info@littlecms.com\n\n"); + + exit(0); +} + + +// The toggles stuff + +static +void HandleSwitches(int argc, char *argv[]) +{ + int s; + + while ((s=xgetopt(argc,argv,"aAeEbBw:W:nNvVGgh:H:i:I:o:O:P:p:t:T:c:C:l:L:u:U:M:m:K:k:S:s:D:d:-:")) != EOF) { + + switch (s) { + + + case '-': + if (strcmp(xoptarg, "help") == 0) + { + Help(0); + } + else + { + FatalError("Unknown option - run without args to see valid ones.\n"); + } + break; + + case 'a': + case 'A': + StoreAsAlpha = TRUE; + break; + case 'b': + case 'B': + BlackWhiteCompensation = TRUE; + break; + + case 'c': + case 'C': + PrecalcMode = atoi(xoptarg); + if (PrecalcMode < 0 || PrecalcMode > 3) + FatalError("Unknown precalc mode '%d'", PrecalcMode); + break; + + case 'd': + case 'D': ObserverAdaptationState = atof(xoptarg); + if (ObserverAdaptationState < 0 || + ObserverAdaptationState > 1.0) + Warning("Adaptation state should be 0..1"); + break; + + case 'e': + case 'E': + EmbedProfile = TRUE; + break; + + case 'g': + case 'G': + GamutCheck = TRUE; + break; + + case 'v': + case 'V': + Verbose = TRUE; + break; + + case 'i': + case 'I': + if (lIsDeviceLink) + FatalError("Device-link already specified"); + + cInpProf = xoptarg; + break; + + case 'o': + case 'O': + if (lIsDeviceLink) + FatalError("Device-link already specified"); + + cOutProf = xoptarg; + break; + + case 'l': + case 'L': + if (cInpProf != NULL || cOutProf != NULL) + FatalError("input/output profiles already specified"); + + cInpProf = xoptarg; + lIsDeviceLink = TRUE; + lIsCUBE = FALSE; + break; + + case 'u': + case 'U': + if (cInpProf != NULL || cOutProf != NULL) + FatalError("input/output profiles already specified"); + + cInpProf = xoptarg; + lIsDeviceLink = TRUE; + lIsCUBE = TRUE; + break; + + case 'p': + case 'P': + cProofing = xoptarg; + break; + + case 't': + case 'T': + Intent = atoi(xoptarg); + break; + + case 'm': + case 'M': + ProofingIntent = atoi(xoptarg); + break; + + case 'N': + case 'n': + IgnoreEmbedded = TRUE; + break; + + case 'W': + case 'w': + PixelDepth = atoi(xoptarg); + if (PixelDepth != 8 && PixelDepth != 16 && PixelDepth != 32) + FatalError("Only 8, 16 and 32 bps are supported"); + break; + + case 'k': + case 'K': + InkLimit = atof(xoptarg); + if (InkLimit < 0.0 || InkLimit > 400.0) + FatalError("Ink limit must be 0%%..400%%"); + break; + + + case 's': + case 'S': SaveEmbedded = xoptarg; + break; + + case 'H': + case 'h': { + + int a = atoi(xoptarg); + Help(a); + } + break; + + default: + + FatalError("Unknown option - run without args to see valid ones"); + } + + } +} + + +// The main sink + +int main(int argc, char* argv[]) +{ + TIFF *in, *out; + + cmsPlugin(&TiffLabPlugin); + + InitUtils("tificc"); + + HandleSwitches(argc, argv); + + if ((argc - xoptind) != 2) { + + Help(0); + } + + + TIFFSetErrorHandler(ConsoleErrorHandler); + TIFFSetWarningHandler(ConsoleWarningHandler); + + in = TIFFOpen(argv[xoptind], "r"); + if (in == NULL) FatalError("Unable to open '%s'", argv[xoptind]); + + out = TIFFOpen(argv[xoptind+1], "w"); + + if (out == NULL) { + + TIFFClose(in); + FatalError("Unable to write '%s'", argv[xoptind+1]); + } + + do { + + TransformImage(in, out, cInpProf); + + + } while (TIFFReadDirectory(in)); + + + if (Verbose) { fprintf(stdout, "\n"); fflush(stdout); } + + TIFFClose(in); + TIFFClose(out); + + return 0; +} + diff --git a/local/recipes/libs/lcms2/source/utils/transicc/Makefile.am b/local/recipes/libs/lcms2/source/utils/transicc/Makefile.am new file mode 100644 index 0000000000..e0939c926e --- /dev/null +++ b/local/recipes/libs/lcms2/source/utils/transicc/Makefile.am @@ -0,0 +1,19 @@ +# +# Makefile for building lcms sample programs +# Originally Written by Bob Friesenhahn, June 2003 +# Additions and bugs by Marti Maria + +# Don't require all the GNU mandated files +AUTOMAKE_OPTIONS = 1.7 foreign no-dependencies + +AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include \ + -I$(top_srcdir)/utils/common -I$(top_builddir)/utils/common + +bin_PROGRAMS = transicc + +transicc_LDADD = $(top_builddir)/src/liblcms2.la @LCMS_LIB_DEPLIBS@ +transicc_LDFLAGS = @LDFLAGS@ +transicc_SOURCES = transicc.c ../common/xgetopt.c ../common/vprf.c ../common/utils.h +man_MANS = transicc.1 + +EXTRA_DIST = $(man_MANS) diff --git a/local/recipes/libs/lcms2/source/utils/transicc/Makefile.in b/local/recipes/libs/lcms2/source/utils/transicc/Makefile.in new file mode 100644 index 0000000000..cece2c383f --- /dev/null +++ b/local/recipes/libs/lcms2/source/utils/transicc/Makefile.in @@ -0,0 +1,751 @@ +# Makefile.in generated by automake 1.18.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2025 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# +# Makefile for building lcms sample programs +# Originally Written by Bob Friesenhahn, June 2003 +# Additions and bugs by Marti Maria + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +am__rm_f = rm -f $(am__rm_f_notfound) +am__rm_rf = rm -rf $(am__rm_f_notfound) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +bin_PROGRAMS = transicc$(EXEEXT) +subdir = utils/transicc +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_append_compile_flags.m4 \ + $(top_srcdir)/m4/ax_append_flag.m4 \ + $(top_srcdir)/m4/ax_check_compile_flag.m4 \ + $(top_srcdir)/m4/ax_gcc_func_attribute.m4 \ + $(top_srcdir)/m4/ax_pthread.m4 \ + $(top_srcdir)/m4/ax_require_defined.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" +PROGRAMS = $(bin_PROGRAMS) +am__dirstamp = $(am__leading_dot)dirstamp +am_transicc_OBJECTS = transicc.$(OBJEXT) ../common/xgetopt.$(OBJEXT) \ + ../common/vprf.$(OBJEXT) +transicc_OBJECTS = $(am_transicc_OBJECTS) +transicc_DEPENDENCIES = $(top_builddir)/src/liblcms2.la +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +transicc_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(transicc_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ +depcomp = +am__maybe_remake_depfiles = +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(transicc_SOURCES) +DIST_SOURCES = $(transicc_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && echo $$files | $(am__xargs_n) 40 $(am__rm_f); }; \ + } +man1dir = $(mandir)/man1 +NROFF = nroff +MANS = $(man_MANS) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +am__DIST_COMMON = $(srcdir)/Makefile.in +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ETAGS = @ETAGS@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FILECMD = @FILECMD@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +JPEGICC_DEPLIBS = @JPEGICC_DEPLIBS@ +LCMS_LIB_DEPLIBS = @LCMS_LIB_DEPLIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBRARY_AGE = @LIBRARY_AGE@ +LIBRARY_CURRENT = @LIBRARY_CURRENT@ +LIBRARY_REVISION = @LIBRARY_REVISION@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_DEPS = @LIBTOOL_DEPS@ +LIB_JPEG = @LIB_JPEG@ +LIB_MATH = @LIB_MATH@ +LIB_PLUGINS = @LIB_PLUGINS@ +LIB_THREAD = @LIB_THREAD@ +LIB_TIFF = @LIB_TIFF@ +LIB_ZLIB = @LIB_ZLIB@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_CXX = @PTHREAD_CXX@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +TIFFICC_DEPLIBS = @TIFFICC_DEPLIBS@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__rm_f_notfound = @am__rm_f_notfound@ +am__tar = @am__tar@ +am__untar = @am__untar@ +am__xargs_n = @am__xargs_n@ +ax_pthread_config = @ax_pthread_config@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +inline = @inline@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +# Don't require all the GNU mandated files +AUTOMAKE_OPTIONS = 1.7 foreign no-dependencies +AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include \ + -I$(top_srcdir)/utils/common -I$(top_builddir)/utils/common + +transicc_LDADD = $(top_builddir)/src/liblcms2.la @LCMS_LIB_DEPLIBS@ +transicc_LDFLAGS = @LDFLAGS@ +transicc_SOURCES = transicc.c ../common/xgetopt.c ../common/vprf.c ../common/utils.h +man_MANS = transicc.1 +EXTRA_DIST = $(man_MANS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign utils/transicc/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign utils/transicc/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ + fi; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p \ + || test -f $$p1 \ + ; then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' \ + -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' \ + `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && $(am__rm_f) $$files + +clean-binPROGRAMS: + $(am__rm_f) $(bin_PROGRAMS) + test -z "$(EXEEXT)" || $(am__rm_f) $(bin_PROGRAMS:$(EXEEXT)=) +../common/$(am__dirstamp): + @$(MKDIR_P) ../common + @: >>../common/$(am__dirstamp) +../common/xgetopt.$(OBJEXT): ../common/$(am__dirstamp) +../common/vprf.$(OBJEXT): ../common/$(am__dirstamp) + +transicc$(EXEEXT): $(transicc_OBJECTS) $(transicc_DEPENDENCIES) $(EXTRA_transicc_DEPENDENCIES) + @rm -f transicc$(EXEEXT) + $(AM_V_CCLD)$(transicc_LINK) $(transicc_OBJECTS) $(transicc_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + -rm -f ../common/*.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +.c.o: + $(AM_V_CC)$(COMPILE) -c -o $@ $< + +.c.obj: + $(AM_V_CC)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: + $(AM_V_CC)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-man1: $(man_MANS) + @$(NORMAL_INSTALL) + @list1=''; \ + list2='$(man_MANS)'; \ + test -n "$(man1dir)" \ + && test -n "`echo $$list1$$list2`" \ + || exit 0; \ + echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ + { for i in $$list1; do echo "$$i"; done; \ + if test -n "$$list2"; then \ + for i in $$list2; do echo "$$i"; done \ + | sed -n '/\.1[a-z]*$$/p'; \ + fi; \ + } | while read p; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; echo "$$p"; \ + done | \ + sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ + sed 'N;N;s,\n, ,g' | { \ + list=; while read file base inst; do \ + if test "$$base" = "$$inst"; then list="$$list $$file"; else \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ + fi; \ + done; \ + for i in $$list; do echo "$$i"; done | $(am__base_list) | \ + while read files; do \ + test -z "$$files" || { \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ + done; } + +uninstall-man1: + @$(NORMAL_UNINSTALL) + @list=''; test -n "$(man1dir)" || exit 0; \ + files=`{ for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ + dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) $(MANS) +installdirs: + for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -$(am__rm_f) $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || $(am__rm_f) $(CONFIG_CLEAN_VPATH_FILES) + -$(am__rm_f) ../common/$(am__dirstamp) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-man + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-binPROGRAMS + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: install-man1 + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-binPROGRAMS uninstall-man + +uninstall-man: uninstall-man1 + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ + clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \ + ctags ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-binPROGRAMS \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man install-man1 \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \ + uninstall-binPROGRAMS uninstall-man uninstall-man1 + +.PRECIOUS: Makefile + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: + +# Tell GNU make to disable its built-in pattern rules. +%:: %,v +%:: RCS/%,v +%:: RCS/% +%:: s.% +%:: SCCS/s.% diff --git a/local/recipes/libs/lcms2/source/utils/transicc/meson.build b/local/recipes/libs/lcms2/source/utils/transicc/meson.build new file mode 100644 index 0000000000..8218a7b3c5 --- /dev/null +++ b/local/recipes/libs/lcms2/source/utils/transicc/meson.build @@ -0,0 +1,16 @@ +transicc_sources = files( + 'transicc.c', +) + +transicc_exe = executable( + 'transicc', + transicc_sources, + dependencies: [liblcms2_dep, common_dep, m_dep], + install: true, +) + +transicc_man = files( + 'transicc.1', +) + +install_man(transicc_man) diff --git a/local/recipes/libs/lcms2/source/utils/transicc/transicc.1 b/local/recipes/libs/lcms2/source/utils/transicc/transicc.1 new file mode 100644 index 0000000000..3d9b87d9c8 --- /dev/null +++ b/local/recipes/libs/lcms2/source/utils/transicc/transicc.1 @@ -0,0 +1,89 @@ +.\"Shiju P. Nair September 30, 2004 +.\"Thomas Weber April 23, 2014 +.TH TRANSICC 1 "MAY 30, 2011" +.SH NAME +transicc - little cms ColorSpace conversion calculator. +.SH SYNOPSIS +.B transicc +.RI [ options ]\ [ CGATSINPUT ]\ [ CGATSOUTPUT ] +.SH DESCRIPTION +lcms is a standalone CMM engine, which deals with the color management. +It implements a fast transformation between ICC profiles. +.B transicc +is a lcms ColorSpace conversion calculator. +.SH OPTIONS +.TP +.B \-b +Black point compensation. +.TP +.BI \-c\ NUM +Precalculates transform (0=Off, 1=Normal, 2=Hi-res, 3=LoRes) [defaults to 1]. +.TP +.BI \-d\ NUM +Observer adaptation state (abs.col. only), (0..1.0, float value) [defaults to 0.0]. +.TP +.B \-e +Encoded representation of numbers is not float (Option \fB\-w\fR=use 16 bits, Option \fB\-x\fR=hexadecimal). +.TP +.B \-g +Marks out-of-gamut colors on softproof. +.TP +.BI \-i\ profile +Input profile (defaults to sRGB). +.TP +.B \-l +Transform by device-link profile. +.TP +.BI \-m\ NUM +SoftProof intent (0,1,2,3) [defaults to 0]. +.TP +.B \-n +Terse output, intended for pipe usage. +.TP +.BI \-o\ profile +Output profile (defaults to sRGB). +.TP +.B \-q +Quantize CGATS to 8 bits. +.TP +.BI \-s +Bounded mode. +.TP +.BI \-t\ NUM +Rendering intent +.nf +.RS +0=Perceptual [default] +1=Relative colorimetric +2=Saturation +3=Absolute colorimetric +10=Perceptual preserving black ink +11=Relative colorimetric preserving black ink +12=Saturation preserving black ink +13=Perceptual preserving black plane +14=Relative colorimetric preserving black plane +15=Saturation preserving black plane +.RE +.fi +.TP +.BI \-v\ verbosity +Verbosity level, (0=None, 1=Normal, 2=High, 3=Very High) [defaults to 1]. +.TP +.B \-w +Use 16 bits. +.TP +.B \-x +Hexadecimal. +.TP +You can use '*Lab' and '*xyz' as built-in profiles. +.SH NOTES +For suggestions, comments, bug reports etc. send mail to +info@littlecms.com. +.SH SEE ALSO +.BR jpgicc (1), +.BR linkicc (1), +.BR psicc (1), +.BR tificc (1) +.SH AUTHOR +This manual page was written by Shiju p. Nair , +for the Debian project. diff --git a/local/recipes/libs/lcms2/source/utils/transicc/transicc.c b/local/recipes/libs/lcms2/source/utils/transicc/transicc.c new file mode 100644 index 0000000000..46747ea84c --- /dev/null +++ b/local/recipes/libs/lcms2/source/utils/transicc/transicc.c @@ -0,0 +1,1332 @@ +//--------------------------------------------------------------------------------- +// +// Little Color Management System +// Copyright (c) 1998-2026 Marti Maria Saguer +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//--------------------------------------------------------------------------------- +// + +#include "utils.h" + +#ifndef _MSC_VER +# include +#endif + +#ifdef CMS_IS_WINDOWS_ +# include +#endif + +#define MAX_INPUT_BUFFER 4096 + +// Global options + +static cmsBool InHexa = FALSE; +static cmsBool GamutCheck = FALSE; +static cmsBool Width16 = FALSE; +static cmsBool BlackPointCompensation = FALSE; +static cmsBool lIsDeviceLink = FALSE; +static cmsBool lQuantize = FALSE; +static cmsBool lUnbounded = TRUE; +static cmsBool lIsFloat = TRUE; + +static cmsUInt32Number Intent = INTENT_PERCEPTUAL; +static cmsUInt32Number ProofingIntent = INTENT_PERCEPTUAL; + +static int PrecalcMode = 0; + +// -------------------------------------------------------------- + +static char *cInProf = NULL; +static char *cOutProf = NULL; +static char *cProofing = NULL; + +static char *IncludePart = NULL; + +static cmsHANDLE hIT8in = NULL; // CGATS input +static cmsHANDLE hIT8out = NULL; // CGATS output + +static char CGATSPatch[1024]; // Actual Patch Name +static char CGATSoutFilename[cmsMAX_PATH]; + +static int nMaxPatches; + +static cmsHTRANSFORM hTrans, hTransXYZ, hTransLab; +static cmsBool InputNamedColor = FALSE; + +static cmsColorSpaceSignature InputColorSpace, OutputColorSpace; + +static cmsNAMEDCOLORLIST* InputColorant = NULL; +static cmsNAMEDCOLORLIST* OutputColorant = NULL; + +static cmsFloat64Number InputRange, OutputRange; + + +// isatty replacement +#ifdef _MSC_VER +#define xisatty(x) _isatty( _fileno( (x) ) ) +#else +#define xisatty(x) isatty( fileno( (x) ) ) +#endif + +//--------------------------------------------------------------------------------------------------- + +// Print usage to stderr +static +void Help(void) +{ + + fprintf(stderr, "usage: transicc [flags] [CGATS input] [CGATS output]\n\n"); + + fprintf(stderr, "flags:\n\n"); + fprintf(stderr, "-v<0..3> - Verbosity level\n"); + + fprintf(stderr, "-e[op] - Encoded representation of numbers\n"); + fprintf(stderr, "\t-w - use 16 bits\n"); + fprintf(stderr, "\t-x - Hexadecimal\n\n"); + + fprintf(stderr, "-s - bounded mode (clip negatives and highlights)\n"); + fprintf(stderr, "-q - Quantize (round decimals)\n\n"); + + fprintf(stderr, "-i - Input profile (defaults to sRGB)\n"); + fprintf(stderr, "-o - Output profile (defaults to sRGB)\n"); + fprintf(stderr, "-l - Transform by device-link profile\n"); + + PrintBuiltins(); + + PrintRenderingIntents(); + + fprintf(stderr, "\n"); + + fprintf(stderr, "-d<0..1> - Observer adaptation state (abs.col. only)\n\n"); + + fprintf(stderr, "-b - Black point compensation\n"); + + fprintf(stderr, "-c<0,1,2,3> Precalculates transform (0=Off, 1=Normal, 2=Hi-res, 3=LoRes)\n\n"); + fprintf(stderr, "-n - Terse output, intended for pipe usage\n"); + + fprintf(stderr, "-p - Soft proof profile\n"); + fprintf(stderr, "-m<0,1,2,3> - Soft proof intent\n"); + fprintf(stderr, "-g - Marks out-of-gamut colors on softproof\n\n"); + + + + fprintf(stderr, "This program is intended to be a demo of the Little CMS\n" + "color engine. Both lcms and this program are open source.\n" + "You can obtain both in source code at https://www.littlecms.com\n" + "For suggestions, comments, bug reports etc. send mail to\n" + "info@littlecms.com\n\n"); + +} + + + +// The toggles stuff + +static +void HandleSwitches(int argc, char *argv[]) +{ + int s; + + while ((s = xgetopt(argc, argv, + "bBC:c:d:D:eEgGI:i:L:l:m:M:nNO:o:p:P:QqSsT:t:V:v:WwxX!:-:")) != EOF) { + + switch (s){ + + case '-': + if (strcmp(xoptarg, "help") == 0) + { + Help(); + exit(0); + } + else + { + FatalError("Unknown option - run without args to see valid ones.\n"); + } + break; + + case '!': + IncludePart = xoptarg; + break; + + case 'b': + case 'B': + BlackPointCompensation = TRUE; + break; + + case 'c': + case 'C': + PrecalcMode = atoi(xoptarg); + if (PrecalcMode < 0 || PrecalcMode > 3) + FatalError("Unknown precalc mode '%d'", PrecalcMode); + break; + + case 'd': + case 'D': { + cmsFloat64Number ObserverAdaptationState = atof(xoptarg); + if (ObserverAdaptationState < 0 || + ObserverAdaptationState > 1.0) + FatalError("Adaptation states should be between 0 and 1"); + + cmsSetAdaptationState(ObserverAdaptationState); + } + break; + + case 'e': + case 'E': + lIsFloat = FALSE; + break; + + case 'g': + case 'G': + GamutCheck = TRUE; + break; + + case 'i': + case 'I': + if (lIsDeviceLink) + FatalError("icctrans: Device-link already specified"); + + cInProf = xoptarg; + break; + + case 'l': + case 'L': + cInProf = xoptarg; + lIsDeviceLink = TRUE; + break; + + // No extra intents for proofing + case 'm': + case 'M': + ProofingIntent = atoi(xoptarg); + if (ProofingIntent > 3) + FatalError("Unknown Proofing Intent '%d'", ProofingIntent); + break; + + // For compatibility + case 'n': + case 'N': + Verbose = 0; + break; + + // Output profile + case 'o': + case 'O': + if (lIsDeviceLink) + FatalError("icctrans: Device-link already specified"); + cOutProf = xoptarg; + break; + + // Proofing profile + case 'p': + case 'P': + cProofing = xoptarg; + break; + + // Quantize (get rid of decimals) + case 'q': + case 'Q': + lQuantize = TRUE; + break; + + // Inhibit unbounded mode + case 's': + case 'S': + lUnbounded = FALSE; + break; + + // The intent + case 't': + case 'T': + Intent = atoi(xoptarg); + break; + + // Verbosity level + case 'V': + case 'v': + Verbose = atoi(xoptarg); + if (Verbose < 0 || Verbose > 3) { + FatalError("Unknown verbosity level '%d'", Verbose); + } + break; + + // Wide (16 bits) + case 'W': + case 'w': + Width16 = TRUE; + break; + + // Hexadecimal + case 'x': + case 'X': + InHexa = TRUE; + break; + + default: + FatalError("Unknown option - run without args to see valid ones.\n"); + } + } + + + // If output CGATS involved, switch to float + if ((argc - xoptind) > 2) { + lIsFloat = TRUE; + } +} + + + +static +void SetRange(cmsFloat64Number range, cmsBool IsInput) +{ + if (IsInput) + InputRange = range; + else + OutputRange = range; +} + +// Populate a named color list with usual component names. +// I am using the first Colorant channel to store the range, but it works since +// this space is not used anyway. +static +cmsNAMEDCOLORLIST* ComponentNames(cmsColorSpaceSignature space, cmsBool IsInput) +{ + cmsNAMEDCOLORLIST* out; + int i, n; + char Buffer[cmsMAX_PATH]; + + out = cmsAllocNamedColorList(0, 12, cmsMAXCHANNELS, "", ""); + if (out == NULL) return NULL; + + switch (space) { + + case cmsSigXYZData: + SetRange(100, IsInput); + cmsAppendNamedColor(out, "X", NULL, NULL); + cmsAppendNamedColor(out, "Y", NULL, NULL); + cmsAppendNamedColor(out, "Z", NULL, NULL); + break; + + case cmsSigLabData: + SetRange(1, IsInput); + cmsAppendNamedColor(out, "L*", NULL, NULL); + cmsAppendNamedColor(out, "a*", NULL, NULL); + cmsAppendNamedColor(out, "b*", NULL, NULL); + break; + + case cmsSigLuvData: + SetRange(1, IsInput); + cmsAppendNamedColor(out, "L", NULL, NULL); + cmsAppendNamedColor(out, "u", NULL, NULL); + cmsAppendNamedColor(out, "v", NULL, NULL); + break; + + case cmsSigYCbCrData: + SetRange(255, IsInput); + cmsAppendNamedColor(out, "Y", NULL, NULL ); + cmsAppendNamedColor(out, "Cb", NULL, NULL); + cmsAppendNamedColor(out, "Cr", NULL, NULL); + break; + + + case cmsSigYxyData: + SetRange(1, IsInput); + cmsAppendNamedColor(out, "Y", NULL, NULL); + cmsAppendNamedColor(out, "x", NULL, NULL); + cmsAppendNamedColor(out, "y", NULL, NULL); + break; + + case cmsSigRgbData: + SetRange(255, IsInput); + cmsAppendNamedColor(out, "R", NULL, NULL); + cmsAppendNamedColor(out, "G", NULL, NULL); + cmsAppendNamedColor(out, "B", NULL, NULL); + break; + + case cmsSigGrayData: + SetRange(255, IsInput); + cmsAppendNamedColor(out, "G", NULL, NULL); + break; + + case cmsSigHsvData: + SetRange(255, IsInput); + cmsAppendNamedColor(out, "H", NULL, NULL); + cmsAppendNamedColor(out, "s", NULL, NULL); + cmsAppendNamedColor(out, "v", NULL, NULL); + break; + + case cmsSigHlsData: + SetRange(255, IsInput); + cmsAppendNamedColor(out, "H", NULL, NULL); + cmsAppendNamedColor(out, "l", NULL, NULL); + cmsAppendNamedColor(out, "s", NULL, NULL); + break; + + case cmsSigCmykData: + SetRange(1, IsInput); + cmsAppendNamedColor(out, "C", NULL, NULL); + cmsAppendNamedColor(out, "M", NULL, NULL); + cmsAppendNamedColor(out, "Y", NULL, NULL); + cmsAppendNamedColor(out, "K", NULL, NULL); + break; + + case cmsSigCmyData: + SetRange(1, IsInput); + cmsAppendNamedColor(out, "C", NULL, NULL); + cmsAppendNamedColor(out, "M", NULL, NULL); + cmsAppendNamedColor(out, "Y", NULL, NULL); + break; + + default: + + SetRange(1, IsInput); + + n = cmsChannelsOfColorSpace(space); + + for (i=0; i < n; i++) { + + sprintf(Buffer, "Channel #%d", i + 1); + cmsAppendNamedColor(out, Buffer, NULL, NULL); + } + } + + return out; + +} + + +// Creates all needed color transforms +static +cmsBool OpenTransforms(void) +{ + cmsHPROFILE hInput, hOutput, hProof; + cmsUInt32Number dwIn, dwOut, dwFlags; + cmsNAMEDCOLORLIST* List; + int i; + + // We don't need cache + dwFlags = cmsFLAGS_NOCACHE; + + if (lIsDeviceLink) { + + hInput = OpenStockProfile(0, cInProf); + if (hInput == NULL) return FALSE; + hOutput = NULL; + hProof = NULL; + + if (cmsGetDeviceClass(hInput) == cmsSigNamedColorClass) { + OutputColorSpace = cmsGetColorSpace(hInput); + InputColorSpace = cmsGetPCS(hInput); + } + else { + InputColorSpace = cmsGetColorSpace(hInput); + OutputColorSpace = cmsGetPCS(hInput); + } + + // Read colorant tables if present + if (cmsIsTag(hInput, cmsSigColorantTableTag)) { + List = cmsReadTag(hInput, cmsSigColorantTableTag); + InputColorant = cmsDupNamedColorList(List); + InputRange = 1; + } + else InputColorant = ComponentNames(InputColorSpace, TRUE); + + if (cmsIsTag(hInput, cmsSigColorantTableOutTag)){ + + List = cmsReadTag(hInput, cmsSigColorantTableOutTag); + OutputColorant = cmsDupNamedColorList(List); + OutputRange = 1; + } + else OutputColorant = ComponentNames(OutputColorSpace, FALSE); + + } + else { + + hInput = OpenStockProfile(0, cInProf); + if (hInput == NULL) return FALSE; + + hOutput = OpenStockProfile(0, cOutProf); + if (hOutput == NULL) return FALSE; + hProof = NULL; + + + if (cmsGetDeviceClass(hInput) == cmsSigLinkClass || + cmsGetDeviceClass(hOutput) == cmsSigLinkClass) + FatalError("Use -l flag for devicelink profiles!\n"); + + + InputColorSpace = cmsGetColorSpace(hInput); + OutputColorSpace = cmsGetColorSpace(hOutput); + + // Read colorant tables if present + if (cmsIsTag(hInput, cmsSigColorantTableTag)) { + List = cmsReadTag(hInput, cmsSigColorantTableTag); + InputColorant = cmsDupNamedColorList(List); + if (cmsNamedColorCount(InputColorant) <= 3) + SetRange(255, TRUE); + else + SetRange(1, TRUE); // Inks are already divided by 100 in the formatter + + } + else InputColorant = ComponentNames(InputColorSpace, TRUE); + + if (cmsIsTag(hOutput, cmsSigColorantTableTag)){ + + List = cmsReadTag(hOutput, cmsSigColorantTableTag); + OutputColorant = cmsDupNamedColorList(List); + if (cmsNamedColorCount(OutputColorant) <= 3) + SetRange(255, FALSE); + else + SetRange(1, FALSE); // Inks are already divided by 100 in the formatter + } + else OutputColorant = ComponentNames(OutputColorSpace, FALSE); + + + if (cProofing != NULL) { + + hProof = OpenStockProfile(0, cProofing); + if (hProof == NULL) return FALSE; + dwFlags |= cmsFLAGS_SOFTPROOFING; + } + } + + // Print information on profiles + if (Verbose > 2) { + + printf("Profile:\n"); + PrintProfileInformation(hInput); + + if (hOutput) { + + printf("Output profile:\n"); + PrintProfileInformation(hOutput); + } + + if (hProof != NULL) { + printf("Proofing profile:\n"); + PrintProfileInformation(hProof); + } + } + + + // Input is always in floating point + dwIn = cmsFormatterForColorspaceOfProfile(hInput, 0, TRUE); + + if (lIsDeviceLink) { + + dwOut = cmsFormatterForPCSOfProfile(hInput, lIsFloat ? 0 : 2, lIsFloat); + } + else { + + // 16 bits or floating point (only on output) + dwOut = cmsFormatterForColorspaceOfProfile(hOutput, lIsFloat ? 0 : 2, lIsFloat); + } + + // For named color, there is a specialized formatter + if (cmsGetDeviceClass(hInput) == cmsSigNamedColorClass) { + + dwIn = TYPE_NAMED_COLOR_INDEX; + InputNamedColor = TRUE; + } + + // Precision mode + switch (PrecalcMode) { + + case 0: dwFlags |= cmsFLAGS_NOOPTIMIZE; break; + case 2: dwFlags |= cmsFLAGS_HIGHRESPRECALC; break; + case 3: dwFlags |= cmsFLAGS_LOWRESPRECALC; break; + case 1: break; + + default: + FatalError("Unknown precalculation mode '%d'", PrecalcMode); + } + + + if (BlackPointCompensation) + dwFlags |= cmsFLAGS_BLACKPOINTCOMPENSATION; + + + if (GamutCheck) { + + cmsUInt16Number Alarm[cmsMAXCHANNELS]; + + if (hProof == NULL) + FatalError("I need proofing profile -p for gamut checking!"); + + for (i=0; i < cmsMAXCHANNELS; i++) + Alarm[i] = 0xFFFF; + + cmsSetAlarmCodes(Alarm); + dwFlags |= cmsFLAGS_GAMUTCHECK; + } + + + // The main transform + hTrans = cmsCreateProofingTransform(hInput, dwIn, hOutput, dwOut, hProof, Intent, ProofingIntent, dwFlags); + + if (hProof) cmsCloseProfile(hProof); + + if (hTrans == NULL) return FALSE; + + + // PCS Dump if requested + hTransXYZ = NULL; hTransLab = NULL; + + if (hOutput && Verbose > 1) { + + cmsHPROFILE hXYZ = cmsCreateXYZProfile(); + cmsHPROFILE hLab = cmsCreateLab4Profile(NULL); + + hTransXYZ = cmsCreateTransform(hInput, dwIn, hXYZ, lIsFloat ? TYPE_XYZ_DBL : TYPE_XYZ_16, Intent, cmsFLAGS_NOCACHE); + if (hTransXYZ == NULL) return FALSE; + + hTransLab = cmsCreateTransform(hInput, dwIn, hLab, lIsFloat? TYPE_Lab_DBL : TYPE_Lab_16, Intent, cmsFLAGS_NOCACHE); + if (hTransLab == NULL) return FALSE; + + cmsCloseProfile(hXYZ); + cmsCloseProfile(hLab); + } + + if (hInput) cmsCloseProfile(hInput); + if (hOutput) cmsCloseProfile(hOutput); + + return TRUE; +} + + +// Free open resources +static +void CloseTransforms(void) +{ + if (InputColorant) cmsFreeNamedColorList(InputColorant); + if (OutputColorant) cmsFreeNamedColorList(OutputColorant); + + if (hTrans) cmsDeleteTransform(hTrans); + if (hTransLab) cmsDeleteTransform(hTransLab); + if (hTransXYZ) cmsDeleteTransform(hTransXYZ); + +} + +// --------------------------------------------------------------------------------------------------- + +// Get input from user +static +void GetLine(char* Buffer, const char* frm, ...) +{ + int res; + va_list args; + + va_start(args, frm); + + do { + if (xisatty(stdin)) + vfprintf(stderr, frm, args); + + res = scanf("%4095s", Buffer); + // Reported codeQL bug: 'The result of scanf is only checked against 0, but it can also return EOF.' + // It is not obviously "only checked against 0", but it happens that C99 requires EOF to be negative + if (res < 0 || toupper(Buffer[0]) == 'Q') { // Quit? + + CloseTransforms(); + + if (xisatty(stdin)) + fprintf(stderr, "Done.\n"); + + exit(0); + } + } while (res == 0); + + va_end(args); +} + + +// Print a value which is given in double floating point +static +void PrintFloatResults(cmsFloat64Number Value[]) +{ + cmsUInt32Number i, n; + char ChannelName[cmsMAX_PATH]; + cmsFloat64Number v; + + n = cmsChannelsOfColorSpace(OutputColorSpace); + for (i=0; i < n; i++) { + + if (OutputColorant != NULL) { + + cmsNamedColorInfo(OutputColorant, i, ChannelName, NULL, NULL, NULL, NULL); + } + else { + OutputRange = 1; + sprintf(ChannelName, "Channel #%u", i + 1); + } + + v = (cmsFloat64Number) Value[i]* OutputRange; + + if (lQuantize) + v = floor(v + 0.5); + + if (!lUnbounded) { + + if (v < 0) + v = 0; + if (v > OutputRange) + v = OutputRange; + } + + if (Verbose <= 0) + printf("%.4f ", v); + else + printf("%s=%.4f ", ChannelName, v); + } + + printf("\n"); +} + + +// Get a named-color index +static +cmsUInt16Number GetIndex(void) +{ + char Buffer[4096], Name[cmsMAX_PATH], Prefix[40], Suffix[40]; + int index, max; + const cmsNAMEDCOLORLIST* NamedColorList; + + NamedColorList = cmsGetNamedColorList(hTrans); + if (NamedColorList == NULL) return 0; + + max = cmsNamedColorCount(NamedColorList)-1; + + GetLine(Buffer, "Color index (0..%d)? ", max); + index = atoi(Buffer); + + if (index > max) + FatalError("Named color %d out of range!", index); + + cmsNamedColorInfo(NamedColorList, index, Name, Prefix, Suffix, NULL, NULL); + + printf("\n%s %s %s\n", Prefix, Name, Suffix); + + return (cmsUInt16Number) index; +} + +// Read values from a text file or terminal +static +void TakeFloatValues(cmsFloat64Number Float[]) +{ + cmsUInt32Number i, n; + char ChannelName[cmsMAX_PATH]; + char Buffer[4096]; + + if (xisatty(stdin)) + fprintf(stderr, "\nEnter values, 'q' to quit\n"); + + if (InputNamedColor) { + + // This is named color index, which is always cmsUInt16Number + cmsUInt16Number index = GetIndex(); + memcpy(Float, &index, sizeof(cmsUInt16Number)); + return; + } + + n = cmsChannelsOfColorSpace(InputColorSpace); + for (i=0; i < n; i++) { + + if (InputColorant) { + cmsNamedColorInfo(InputColorant, i, ChannelName, NULL, NULL, NULL, NULL); + } + else { + InputRange = 1; + sprintf(ChannelName, "Channel #%u", i+1); + } + + GetLine(Buffer, "%s? ", ChannelName); + + Float[i] = (cmsFloat64Number) atof(Buffer) / InputRange; + } + + if (xisatty(stdin)) + fprintf(stderr, "\n"); +} + +static +void PrintPCSFloat(cmsFloat64Number Input[]) +{ + if (Verbose > 1 && hTransXYZ && hTransLab) { + + cmsCIEXYZ XYZ = { 0, 0, 0 }; + cmsCIELab Lab = { 0, 0, 0 }; + + if (hTransXYZ) cmsDoTransform(hTransXYZ, Input, &XYZ, 1); + if (hTransLab) cmsDoTransform(hTransLab, Input, &Lab, 1); + + printf("[PCS] Lab=(%.4f,%.4f,%.4f) XYZ=(%.4f,%.4f,%.4f)\n", Lab.L, Lab.a, Lab.b, + XYZ.X * 100.0, XYZ.Y * 100.0, XYZ.Z * 100.0); + + } +} + + + + +// ----------------------------------------------------------------------------------------------- + +static +void PrintEncodedResults(cmsUInt16Number Encoded[]) +{ + cmsUInt32Number i, n; + char ChannelName[cmsMAX_PATH]; + cmsUInt32Number v; + + n = cmsChannelsOfColorSpace(OutputColorSpace); + for (i=0; i < n; i++) { + + if (OutputColorant != NULL) { + + cmsNamedColorInfo(OutputColorant, i, ChannelName, NULL, NULL, NULL, NULL); + } + else { + sprintf(ChannelName, "Channel #%u", i + 1); + } + + if (Verbose > 0) + printf("%s=", ChannelName); + + v = Encoded[i]; + + if (InHexa) { + + if (Width16) + printf("0x%04X ", (int) floor(v + .5)); + else + printf("0x%02X ", (int) floor(v / 257. + .5)); + + } else { + + if (Width16) + printf("%d ", (int) floor(v + .5)); + else + printf("%d ", (int) floor(v / 257. + .5)); + } + + } + + printf("\n"); +} + +// Print XYZ/Lab values on verbose mode + +static +void PrintPCSEncoded(cmsFloat64Number Input[]) +{ + if (Verbose > 1 && hTransXYZ && hTransLab) { + + cmsUInt16Number XYZ[3], Lab[3]; + + if (hTransXYZ) cmsDoTransform(hTransXYZ, Input, XYZ, 1); + if (hTransLab) cmsDoTransform(hTransLab, Input, Lab, 1); + + printf("[PCS] Lab=(0x%04X,0x%04X,0x%04X) XYZ=(0x%04X,0x%04X,0x%04X)\n", Lab[0], Lab[1], Lab[2], + XYZ[0], XYZ[1], XYZ[2]); + + } +} + + +// -------------------------------------------------------------------------------------- + + + +// Take a value from IT8 and scale it accordly to fill a cmsUInt16Number (0..FFFF) + +static +cmsFloat64Number GetIT8Val(const char* Name, cmsFloat64Number Max) +{ + const char* Val = cmsIT8GetData(hIT8in, CGATSPatch, Name); + + if (Val == NULL) + FatalError("Field '%s' not found", Name); + + return atof(Val) / Max; + +} + + +// Read input values from CGATS file. + +static +void TakeCGATSValues(int nPatch, cmsFloat64Number Float[]) +{ + + // At first take the name if SAMPLE_ID is present + if (cmsIT8GetPatchName(hIT8in, nPatch, CGATSPatch) == NULL) { + FatalError("Sorry, I need 'SAMPLE_ID' on input CGATS to operate."); + } + + + // Special handling for named color profiles. + // Lookup the name in the names database (the transform) + + if (InputNamedColor) { + + const cmsNAMEDCOLORLIST* NamedColorList; + int index; + + NamedColorList = cmsGetNamedColorList(hTrans); + if (NamedColorList == NULL) + FatalError("Malformed named color profile"); + + index = cmsNamedColorIndex(NamedColorList, CGATSPatch); + if (index < 0) + FatalError("Named color '%s' not found in the profile", CGATSPatch); + + Float[0] = index; + return; + } + + // Color is not a spot color, proceed. + + switch (InputColorSpace) { + + // Encoding should follow CGATS specification. + + case cmsSigXYZData: + Float[0] = cmsIT8GetDataDbl(hIT8in, CGATSPatch, "XYZ_X") / 100.0; + Float[1] = cmsIT8GetDataDbl(hIT8in, CGATSPatch, "XYZ_Y") / 100.0; + Float[2] = cmsIT8GetDataDbl(hIT8in, CGATSPatch, "XYZ_Z") / 100.0; + break; + + case cmsSigLabData: + Float[0] = cmsIT8GetDataDbl(hIT8in, CGATSPatch, "LAB_L"); + Float[1] = cmsIT8GetDataDbl(hIT8in, CGATSPatch, "LAB_A"); + Float[2] = cmsIT8GetDataDbl(hIT8in, CGATSPatch, "LAB_B"); + break; + + + case cmsSigRgbData: + Float[0] = GetIT8Val("RGB_R", 255.0); + Float[1] = GetIT8Val("RGB_G", 255.0); + Float[2] = GetIT8Val("RGB_B", 255.0); + break; + + case cmsSigGrayData: + Float[0] = GetIT8Val("GRAY", 255.0); + break; + + case cmsSigCmykData: + Float[0] = GetIT8Val("CMYK_C", 1.0); + Float[1] = GetIT8Val("CMYK_M", 1.0); + Float[2] = GetIT8Val("CMYK_Y", 1.0); + Float[3] = GetIT8Val("CMYK_K", 1.0); + break; + + case cmsSigCmyData: + Float[0] = GetIT8Val("CMY_C", 1.0); + Float[1] = GetIT8Val("CMY_M", 1.0); + Float[2] = GetIT8Val("CMY_Y", 1.0); + break; + + case cmsSig1colorData: + case cmsSig2colorData: + case cmsSig3colorData: + case cmsSig4colorData: + case cmsSig5colorData: + case cmsSig6colorData: + case cmsSig7colorData: + case cmsSig8colorData: + case cmsSig9colorData: + case cmsSig10colorData: + case cmsSig11colorData: + case cmsSig12colorData: + case cmsSig13colorData: + case cmsSig14colorData: + case cmsSig15colorData: + { + cmsUInt32Number i, n; + + n = cmsChannelsOfColorSpace(InputColorSpace); + for (i=0; i < n; i++) { + + char Buffer[255]; + + sprintf(Buffer, "%uCLR_%u", n, i+1); + Float[i] = GetIT8Val(Buffer, 100.0); + } + + } + break; + + default: + { + cmsUInt32Number i, n; + + n = cmsChannelsOfColorSpace(InputColorSpace); + for (i=0; i < n; i++) { + + char Buffer[255]; + + sprintf(Buffer, "CHAN_%u", i+1); + Float[i] = GetIT8Val(Buffer, 1.0); + } + + } + } + +} + +static +void SetCGATSfld(const char* Col, cmsFloat64Number Val) +{ + if (lQuantize) + Val = floor(Val + 0.5); + + if (!cmsIT8SetDataDbl(hIT8out, CGATSPatch, Col, Val)) { + FatalError("couldn't set '%s' on output cgats '%s'", Col, CGATSoutFilename); + } +} + + + +static +void PutCGATSValues(cmsFloat64Number Float[]) +{ + cmsIT8SetData(hIT8out, CGATSPatch, "SAMPLE_ID", CGATSPatch); + switch (OutputColorSpace) { + + + // Encoding should follow CGATS specification. + + case cmsSigXYZData: + + SetCGATSfld("XYZ_X", Float[0] * 100.0); + SetCGATSfld("XYZ_Y", Float[1] * 100.0); + SetCGATSfld("XYZ_Z", Float[2] * 100.0); + break; + + case cmsSigLabData: + + SetCGATSfld("LAB_L", Float[0]); + SetCGATSfld("LAB_A", Float[1]); + SetCGATSfld("LAB_B", Float[2]); + break; + + + case cmsSigRgbData: + SetCGATSfld("RGB_R", Float[0] * 255.0); + SetCGATSfld("RGB_G", Float[1] * 255.0); + SetCGATSfld("RGB_B", Float[2] * 255.0); + break; + + case cmsSigGrayData: + SetCGATSfld("GRAY", Float[0] * 255.0); + break; + + case cmsSigCmykData: + SetCGATSfld("CMYK_C", Float[0]); + SetCGATSfld("CMYK_M", Float[1]); + SetCGATSfld("CMYK_Y", Float[2]); + SetCGATSfld("CMYK_K", Float[3]); + break; + + case cmsSigCmyData: + SetCGATSfld("CMY_C", Float[0]); + SetCGATSfld("CMY_M", Float[1]); + SetCGATSfld("CMY_Y", Float[2]); + break; + + case cmsSig1colorData: + case cmsSig2colorData: + case cmsSig3colorData: + case cmsSig4colorData: + case cmsSig5colorData: + case cmsSig6colorData: + case cmsSig7colorData: + case cmsSig8colorData: + case cmsSig9colorData: + case cmsSig10colorData: + case cmsSig11colorData: + case cmsSig12colorData: + case cmsSig13colorData: + case cmsSig14colorData: + case cmsSig15colorData: + { + + cmsInt32Number i, n; + + n = cmsChannelsOfColorSpace(InputColorSpace); + for (i=0; i < n; i++) { + + char Buffer[255]; + + sprintf(Buffer, "%uCLR_%u", n, i+1); + + SetCGATSfld(Buffer, Float[i] * 100.0); + } + } + break; + + default: + { + + cmsInt32Number i, n; + + n = cmsChannelsOfColorSpace(InputColorSpace); + for (i=0; i < n; i++) { + + char Buffer[255]; + + sprintf(Buffer, "CHAN_%u", i+1); + + SetCGATSfld(Buffer, Float[i]); + } + } + } +} + + + +// Create data format +static +void SetOutputDataFormat(void) +{ + cmsIT8DefineDblFormat(hIT8out, "%.4g"); + cmsIT8SetPropertyStr(hIT8out, "ORIGINATOR", "icctrans"); + + if (IncludePart != NULL) + cmsIT8SetPropertyStr(hIT8out, ".INCLUDE", IncludePart); + + cmsIT8SetComment(hIT8out, "Data follows"); + cmsIT8SetPropertyDbl(hIT8out, "NUMBER_OF_SETS", nMaxPatches); + + + switch (OutputColorSpace) { + + + // Encoding should follow CGATS specification. + + case cmsSigXYZData: + cmsIT8SetPropertyDbl(hIT8out, "NUMBER_OF_FIELDS", 4); + cmsIT8SetDataFormat(hIT8out, 0, "SAMPLE_ID"); + cmsIT8SetDataFormat(hIT8out, 1, "XYZ_X"); + cmsIT8SetDataFormat(hIT8out, 2, "XYZ_Y"); + cmsIT8SetDataFormat(hIT8out, 3, "XYZ_Z"); + break; + + case cmsSigLabData: + cmsIT8SetPropertyDbl(hIT8out, "NUMBER_OF_FIELDS", 4); + cmsIT8SetDataFormat(hIT8out, 0, "SAMPLE_ID"); + cmsIT8SetDataFormat(hIT8out, 1, "LAB_L"); + cmsIT8SetDataFormat(hIT8out, 2, "LAB_A"); + cmsIT8SetDataFormat(hIT8out, 3, "LAB_B"); + break; + + + case cmsSigRgbData: + cmsIT8SetPropertyDbl(hIT8out, "NUMBER_OF_FIELDS", 4); + cmsIT8SetDataFormat(hIT8out, 0, "SAMPLE_ID"); + cmsIT8SetDataFormat(hIT8out, 1, "RGB_R"); + cmsIT8SetDataFormat(hIT8out, 2, "RGB_G"); + cmsIT8SetDataFormat(hIT8out, 3, "RGB_B"); + break; + + case cmsSigGrayData: + cmsIT8SetPropertyDbl(hIT8out, "NUMBER_OF_FIELDS", 2); + cmsIT8SetDataFormat(hIT8out, 0, "SAMPLE_ID"); + cmsIT8SetDataFormat(hIT8out, 1, "GRAY"); + break; + + case cmsSigCmykData: + cmsIT8SetPropertyDbl(hIT8out, "NUMBER_OF_FIELDS", 5); + cmsIT8SetDataFormat(hIT8out, 0, "SAMPLE_ID"); + cmsIT8SetDataFormat(hIT8out, 1, "CMYK_C"); + cmsIT8SetDataFormat(hIT8out, 2, "CMYK_M"); + cmsIT8SetDataFormat(hIT8out, 3, "CMYK_Y"); + cmsIT8SetDataFormat(hIT8out, 4, "CMYK_K"); + break; + + case cmsSigCmyData: + cmsIT8SetPropertyDbl(hIT8out, "NUMBER_OF_FIELDS", 4); + cmsIT8SetDataFormat(hIT8out, 0, "SAMPLE_ID"); + cmsIT8SetDataFormat(hIT8out, 1, "CMY_C"); + cmsIT8SetDataFormat(hIT8out, 2, "CMY_M"); + cmsIT8SetDataFormat(hIT8out, 3, "CMY_Y"); + break; + + case cmsSig1colorData: + case cmsSig2colorData: + case cmsSig3colorData: + case cmsSig4colorData: + case cmsSig5colorData: + case cmsSig6colorData: + case cmsSig7colorData: + case cmsSig8colorData: + case cmsSig9colorData: + case cmsSig10colorData: + case cmsSig11colorData: + case cmsSig12colorData: + case cmsSig13colorData: + case cmsSig14colorData: + case cmsSig15colorData: + { + int i, n; + char Buffer[255]; + + n = cmsChannelsOfColorSpace(OutputColorSpace); + cmsIT8SetPropertyDbl(hIT8out, "NUMBER_OF_FIELDS", n+1); + cmsIT8SetDataFormat(hIT8out, 0, "SAMPLE_ID"); + + for (i=1; i <= n; i++) { + sprintf(Buffer, "%dCLR_%d", n, i); + cmsIT8SetDataFormat(hIT8out, i, Buffer); + } + } + break; + + default: { + + int i, n; + char Buffer[255]; + + n = cmsChannelsOfColorSpace(OutputColorSpace); + cmsIT8SetPropertyDbl(hIT8out, "NUMBER_OF_FIELDS", n+1); + cmsIT8SetDataFormat(hIT8out, 0, "SAMPLE_ID"); + + for (i=1; i <= n; i++) { + sprintf(Buffer, "CHAN_%d", i); + cmsIT8SetDataFormat(hIT8out, i, Buffer); + } + } + } +} + +// Open CGATS if specified + +static +void OpenCGATSFiles(int argc, char *argv[]) +{ + int nParams = argc - xoptind; + + if (nParams >= 1) { + + hIT8in = cmsIT8LoadFromFile(0, argv[xoptind]); + + if (hIT8in == NULL) + FatalError("'%s' is not recognized as a CGATS file", argv[xoptind]); + + nMaxPatches = (int) cmsIT8GetPropertyDbl(hIT8in, "NUMBER_OF_SETS"); + } + + if (nParams == 2) { + + hIT8out = cmsIT8Alloc(NULL); + SetOutputDataFormat(); + strncpy(CGATSoutFilename, argv[xoptind+1], cmsMAX_PATH-1); + } + + if (nParams > 2) FatalError("Too many CGATS files"); +} + + + +// The main sink +int main(int argc, char *argv[]) +{ + cmsUInt16Number Output[cmsMAXCHANNELS]; + cmsFloat64Number OutputFloat[cmsMAXCHANNELS]; + cmsFloat64Number InputFloat[cmsMAXCHANNELS]; + + int nPatch = 0; + + fprintf(stderr, "LittleCMS ColorSpace conversion calculator - 5.1 [LittleCMS %2.2f]\n", cmsGetEncodedCMMversion() / 1000.0); + fprintf(stderr, "Copyright (c) 1998-2026 Marti Maria Saguer. See COPYING file for details.\n"); + fflush(stderr); + + InitUtils("transicc"); + + Verbose = 1; + + if (argc == 1) { + + Help(); + return 0; + } + + HandleSwitches(argc, argv); + + // Open profiles, create transforms + if (!OpenTransforms()) return 1; + + // Open CGATS input if specified + OpenCGATSFiles(argc, argv); + + // Main loop: read all values and convert them + for(;;) { + + if (hIT8in != NULL) { + + if (nPatch >= nMaxPatches) break; + TakeCGATSValues(nPatch++, InputFloat); + + } else { + + if (feof(stdin)) break; + TakeFloatValues(InputFloat); + + } + + if (lIsFloat) + cmsDoTransform(hTrans, InputFloat, OutputFloat, 1); + else + cmsDoTransform(hTrans, InputFloat, Output, 1); + + + if (hIT8out != NULL) { + + PutCGATSValues(OutputFloat); + } + else { + + if (lIsFloat) { + PrintFloatResults(OutputFloat); PrintPCSFloat(InputFloat); + } + else { + PrintEncodedResults(Output); PrintPCSEncoded(InputFloat); + } + + } + } + + + // Cleanup + CloseTransforms(); + + if (hIT8in) + cmsIT8Free(hIT8in); + + if (hIT8out) { + cmsIT8SaveToFile(hIT8out, CGATSoutFilename); + cmsIT8Free(hIT8out); + } + + // All is ok + return 0; +} + + diff --git a/local/recipes/libs/libdisplay-info/source/di.c b/local/recipes/libs/libdisplay-info/source/di.c new file mode 100644 index 0000000000..d8f04573ae --- /dev/null +++ b/local/recipes/libs/libdisplay-info/source/di.c @@ -0,0 +1,401 @@ +#include +#include +#include +#include + +#include "include/libdisplay-info/info.h" + +#define EDID_BLOCK_SIZE 128 +#define EDID_DESCRIPTOR_COUNT 4 +#define EDID_DESCRIPTOR_OFFSET 54 + +struct di_edid { + struct di_edid_vendor_product vendor_product; + struct di_edid_chromaticity_coords chromaticity; + struct di_edid_screen_size screen_size; + struct di_edid_misc_features misc_features; + bool has_chromaticity; + struct di_edid_detailed_timing_def *detailed_timing_storage; + const struct di_edid_detailed_timing_def **detailed_timings; + const struct di_edid_ext **extensions; +}; + +struct di_info { + struct di_edid edid; + char *model; + char *serial; +}; + +static const uint8_t edid_header[8] = { 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00 }; +static const struct di_edid_detailed_timing_def *empty_detailed_timings[] = { NULL }; +static const struct di_edid_ext *empty_edid_exts[] = { NULL }; +static const struct di_cta_data_block *empty_cta_blocks[] = { NULL }; +static const struct di_displayid_data_block *empty_displayid_blocks[] = { NULL }; +static const struct di_displayid_type_i_ii_vii_timing *empty_timings[] = { NULL }; +static const struct di_edid_screen_size empty_screen_size = { 0, 0 }; + +static char *dup_string(const char *value) +{ + size_t len; + char *copy; + + if (!value) { + value = ""; + } + + len = strlen(value) + 1; + copy = malloc(len); + if (!copy) { + return NULL; + } + + memcpy(copy, value, len); + return copy; +} + +static bool has_nonzero_bytes(const uint8_t *data, size_t len) +{ + size_t i; + + for (i = 0; i < len; i++) { + if (data[i] != 0) { + return true; + } + } + + return false; +} + +static bool validate_edid_block(const uint8_t *block) +{ + uint8_t checksum = 0; + size_t i; + + for (i = 0; i < EDID_BLOCK_SIZE; i++) { + checksum = (uint8_t)(checksum + block[i]); + } + + return checksum == 0; +} + +static uint16_t read_le_u16(const uint8_t *data) +{ + return (uint16_t)data[0] | ((uint16_t)data[1] << 8); +} + +static uint32_t read_le_u32(const uint8_t *data) +{ + return (uint32_t)data[0] | ((uint32_t)data[1] << 8) | ((uint32_t)data[2] << 16) | ((uint32_t)data[3] << 24); +} + +static float decode_chromaticity_value(uint8_t high_bits, uint8_t low_bits) +{ + return (float)(((unsigned int)high_bits << 2) | low_bits) / 1024.0f; +} + +static void decode_manufacturer_id(const uint8_t *base, char manufacturer[4]) +{ + manufacturer[0] = (char)('A' + ((base[8] >> 2) & 0x1f) - 1); + manufacturer[1] = (char)('A' + (((base[8] & 0x03) << 3) | ((base[9] >> 5) & 0x07)) - 1); + manufacturer[2] = (char)('A' + (base[9] & 0x1f) - 1); + manufacturer[3] = '\0'; + + if (!isupper((unsigned char)manufacturer[0]) || !isupper((unsigned char)manufacturer[1]) || !isupper((unsigned char)manufacturer[2])) { + memcpy(manufacturer, "???", 4); + } +} + +static char *parse_descriptor_string(const uint8_t *descriptor) +{ + char buffer[14]; + size_t out_len = 0; + size_t i; + + for (i = 5; i < 18; i++) { + const uint8_t value = descriptor[i]; + + if (value == 0x00 || value == 0x0a || value == 0x0d) { + break; + } + if (value < 0x20 || value > 0x7e) { + continue; + } + + buffer[out_len++] = (char)value; + } + + while (out_len > 0 && isspace((unsigned char)buffer[out_len - 1])) { + out_len--; + } + buffer[out_len] = '\0'; + + return dup_string(buffer); +} + +static bool parse_detailed_timing(const uint8_t *descriptor, struct di_edid_detailed_timing_def *timing) +{ + const uint16_t pixel_clock = read_le_u16(descriptor); + + if (pixel_clock == 0) { + return false; + } + + timing->horiz_video = (int)(descriptor[2] | ((descriptor[4] & 0xf0) << 4)); + timing->vert_video = (int)(descriptor[5] | ((descriptor[7] & 0xf0) << 4)); + timing->horiz_image_mm = (int)(descriptor[12] | ((descriptor[14] & 0xf0) << 4)); + timing->vert_image_mm = (int)(descriptor[13] | ((descriptor[14] & 0x0f) << 8)); + + return timing->horiz_video > 0 && timing->vert_video > 0; +} + +static bool populate_detailed_timings(struct di_edid *edid, const uint8_t *base) +{ + struct di_edid_detailed_timing_def parsed[EDID_DESCRIPTOR_COUNT]; + size_t count = 0; + size_t i; + + edid->detailed_timings = empty_detailed_timings; + + for (i = 0; i < EDID_DESCRIPTOR_COUNT; i++) { + const uint8_t *descriptor = base + EDID_DESCRIPTOR_OFFSET + (i * 18); + + if (parse_detailed_timing(descriptor, &parsed[count])) { + count++; + } + } + + if (count == 0) { + return true; + } + + edid->detailed_timing_storage = calloc(count, sizeof(*edid->detailed_timing_storage)); + edid->detailed_timings = calloc(count + 1, sizeof(*edid->detailed_timings)); + if (!edid->detailed_timing_storage || !edid->detailed_timings) { + return false; + } + + for (i = 0; i < count; i++) { + edid->detailed_timing_storage[i] = parsed[i]; + edid->detailed_timings[i] = &edid->detailed_timing_storage[i]; + } + + edid->detailed_timings[count] = NULL; + return true; +} + +static void populate_vendor_product(struct di_edid *edid, const uint8_t *base) +{ + const int manufacture_year = (int)base[17] + 1990; + const bool has_model_year = base[16] == 0xff; + + decode_manufacturer_id(base, edid->vendor_product.manufacturer); + edid->vendor_product.product = (int)read_le_u16(base + 10); + edid->vendor_product.serial = (int)read_le_u32(base + 12); + edid->vendor_product.manufacture_week = has_model_year ? 0 : (int)base[16]; + edid->vendor_product.manufacture_year = has_model_year ? 0 : manufacture_year; + edid->vendor_product.model_year = has_model_year ? manufacture_year : 0; +} + +static void populate_chromaticity(struct di_edid *edid, const uint8_t *base) +{ + if (!has_nonzero_bytes(base + 25, 10)) { + edid->has_chromaticity = false; + return; + } + + edid->chromaticity.red_x = decode_chromaticity_value(base[27], (base[25] >> 6) & 0x03); + edid->chromaticity.red_y = decode_chromaticity_value(base[28], (base[25] >> 4) & 0x03); + edid->chromaticity.green_x = decode_chromaticity_value(base[29], (base[25] >> 2) & 0x03); + edid->chromaticity.green_y = decode_chromaticity_value(base[30], base[25] & 0x03); + edid->chromaticity.blue_x = decode_chromaticity_value(base[31], (base[26] >> 6) & 0x03); + edid->chromaticity.blue_y = decode_chromaticity_value(base[32], (base[26] >> 4) & 0x03); + edid->chromaticity.white_x = decode_chromaticity_value(base[33], (base[26] >> 2) & 0x03); + edid->chromaticity.white_y = decode_chromaticity_value(base[34], base[26] & 0x03); + edid->has_chromaticity = true; +} + +static bool populate_strings(struct di_info *info, const uint8_t *base) +{ + size_t i; + + for (i = 0; i < EDID_DESCRIPTOR_COUNT; i++) { + const uint8_t *descriptor = base + EDID_DESCRIPTOR_OFFSET + (i * 18); + + if (descriptor[0] != 0x00 || descriptor[1] != 0x00 || descriptor[2] != 0x00) { + continue; + } + + if (descriptor[3] == 0xfc && !info->model) { + info->model = parse_descriptor_string(descriptor); + } else if (descriptor[3] == 0xff && !info->serial) { + info->serial = parse_descriptor_string(descriptor); + } + } + + if (!info->model) { + info->model = dup_string(""); + } + if (!info->serial) { + if (info->edid.vendor_product.serial != 0) { + char serial_buffer[32]; + + snprintf(serial_buffer, sizeof(serial_buffer), "%u", (unsigned int)info->edid.vendor_product.serial); + info->serial = dup_string(serial_buffer); + } else { + info->serial = dup_string(""); + } + } + + return info->model && info->serial; +} + +const struct di_info *di_info_parse_edid(const void *data, size_t size) +{ + const uint8_t *base = data; + struct di_info *info; + + if (!base || size < EDID_BLOCK_SIZE) { + return NULL; + } + if (memcmp(base, edid_header, sizeof(edid_header)) != 0) { + return NULL; + } + if (!validate_edid_block(base)) { + return NULL; + } + + info = calloc(1, sizeof(*info)); + if (!info) { + return NULL; + } + + info->edid.screen_size.width_cm = (int)base[21]; + info->edid.screen_size.height_cm = (int)base[22]; + info->edid.misc_features.preferred_timing_is_native = (base[24] & 0x02) != 0; + info->edid.extensions = empty_edid_exts; + + populate_vendor_product(&info->edid, base); + populate_chromaticity(&info->edid, base); + if (!populate_detailed_timings(&info->edid, base) || !populate_strings(info, base)) { + di_info_destroy(info); + return NULL; + } + + return info; +} + +void di_info_destroy(const struct di_info *info) +{ + struct di_info *mutable_info = (struct di_info *)info; + + if (!mutable_info) { + return; + } + + free(mutable_info->model); + free(mutable_info->serial); + if (mutable_info->edid.detailed_timings != empty_detailed_timings) { + free((void *)mutable_info->edid.detailed_timings); + } + free(mutable_info->edid.detailed_timing_storage); + free(mutable_info); +} + +const struct di_edid *di_info_get_edid(const struct di_info *info) +{ + return info ? &info->edid : NULL; +} + +char *di_info_get_model(const struct di_info *info) +{ + return dup_string(info ? info->model : ""); +} + +char *di_info_get_serial(const struct di_info *info) +{ + return dup_string(info ? info->serial : ""); +} + +const struct di_edid_detailed_timing_def *const *di_edid_get_detailed_timing_defs(const struct di_edid *edid) +{ + return edid && edid->detailed_timings ? edid->detailed_timings : empty_detailed_timings; +} + +const struct di_edid_screen_size *di_edid_get_screen_size(const struct di_edid *edid) +{ + return edid ? &edid->screen_size : &empty_screen_size; +} + +const struct di_edid_vendor_product *di_edid_get_vendor_product(const struct di_edid *edid) +{ + return edid ? &edid->vendor_product : NULL; +} + +const struct di_edid_chromaticity_coords *di_edid_get_chromaticity_coords(const struct di_edid *edid) +{ + return edid && edid->has_chromaticity ? &edid->chromaticity : NULL; +} + +const struct di_edid_ext *const *di_edid_get_extensions(const struct di_edid *edid) +{ + return edid && edid->extensions ? edid->extensions : empty_edid_exts; +} + +const struct di_edid_misc_features *di_edid_get_misc_features(const struct di_edid *edid) +{ + return edid ? &edid->misc_features : NULL; +} + +const struct di_edid_cta *di_edid_ext_get_cta(const struct di_edid_ext *ext) +{ + (void)ext; + return NULL; +} + +const struct di_displayid *di_edid_ext_get_displayid(const struct di_edid_ext *ext) +{ + (void)ext; + return NULL; +} + +const struct di_cta_data_block *const *di_edid_cta_get_data_blocks(const struct di_edid_cta *cta) +{ + (void)cta; + return empty_cta_blocks; +} + +const struct di_cta_hdr_static_metadata_block *di_cta_data_block_get_hdr_static_metadata(const struct di_cta_data_block *block) +{ + (void)block; + return NULL; +} + +const struct di_cta_colorimetry_block *di_cta_data_block_get_colorimetry(const struct di_cta_data_block *block) +{ + (void)block; + return NULL; +} + +const struct di_displayid_data_block *const *di_displayid_get_data_blocks(const struct di_displayid *displayid) +{ + (void)displayid; + return empty_displayid_blocks; +} + +const struct di_displayid_display_params *di_displayid_data_block_get_display_params(const struct di_displayid_data_block *block) +{ + (void)block; + return NULL; +} + +const struct di_displayid_type_i_ii_vii_timing *const *di_displayid_data_block_get_type_i_timings(const struct di_displayid_data_block *block) +{ + (void)block; + return empty_timings; +} + +const struct di_displayid_type_i_ii_vii_timing *const *di_displayid_data_block_get_type_ii_timings(const struct di_displayid_data_block *block) +{ + (void)block; + return empty_timings; +} diff --git a/local/recipes/libs/libdisplay-info/source/include/libdisplay-info/cta.h b/local/recipes/libs/libdisplay-info/source/include/libdisplay-info/cta.h new file mode 100644 index 0000000000..d62bf07bb6 --- /dev/null +++ b/local/recipes/libs/libdisplay-info/source/include/libdisplay-info/cta.h @@ -0,0 +1,3 @@ +#pragma once + +#include "info.h" diff --git a/local/recipes/libs/libdisplay-info/source/include/libdisplay-info/displayid.h b/local/recipes/libs/libdisplay-info/source/include/libdisplay-info/displayid.h new file mode 100644 index 0000000000..d62bf07bb6 --- /dev/null +++ b/local/recipes/libs/libdisplay-info/source/include/libdisplay-info/displayid.h @@ -0,0 +1,3 @@ +#pragma once + +#include "info.h" diff --git a/local/recipes/libs/libdisplay-info/source/include/libdisplay-info/edid.h b/local/recipes/libs/libdisplay-info/source/include/libdisplay-info/edid.h new file mode 100644 index 0000000000..d62bf07bb6 --- /dev/null +++ b/local/recipes/libs/libdisplay-info/source/include/libdisplay-info/edid.h @@ -0,0 +1,3 @@ +#pragma once + +#include "info.h" diff --git a/local/recipes/libs/libdisplay-info/source/include/libdisplay-info/info.h b/local/recipes/libs/libdisplay-info/source/include/libdisplay-info/info.h new file mode 100644 index 0000000000..523fa73d94 --- /dev/null +++ b/local/recipes/libs/libdisplay-info/source/include/libdisplay-info/info.h @@ -0,0 +1,108 @@ +#pragma once + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct di_info; +struct di_edid; +struct di_edid_ext; +struct di_edid_cta; +struct di_displayid; +struct di_cta_data_block; +struct di_displayid_data_block; + +struct di_edid_vendor_product { + char manufacturer[4]; + int product; + int serial; + int manufacture_week; + int manufacture_year; + int model_year; +}; + +struct di_edid_chromaticity_coords { + float red_x; + float red_y; + float green_x; + float green_y; + float blue_x; + float blue_y; + float white_x; + float white_y; +}; + +struct di_cta_hdr_static_metadata_eotfs { + bool pq; +}; + +struct di_cta_hdr_static_metadata_block { + int desired_content_min_luminance; + int desired_content_max_luminance; + int desired_content_max_frame_avg_luminance; + const struct di_cta_hdr_static_metadata_eotfs *eotfs; +}; + +struct di_cta_colorimetry_block { + bool bt2020_rgb; +}; + +struct di_displayid_display_params { + int horiz_pixels; + int vert_pixels; +}; + +struct di_displayid_type_i_ii_vii_timing { + bool preferred; + int horiz_active; + int vert_active; +}; + +struct di_edid_misc_features { + bool preferred_timing_is_native; +}; + +struct di_edid_detailed_timing_def { + int horiz_image_mm; + int vert_image_mm; + int horiz_video; + int vert_video; +}; + +struct di_edid_screen_size { + int width_cm; + int height_cm; +}; + +const struct di_info *di_info_parse_edid(const void *data, size_t size); +void di_info_destroy(const struct di_info *info); +const struct di_edid *di_info_get_edid(const struct di_info *info); +char *di_info_get_model(const struct di_info *info); +char *di_info_get_serial(const struct di_info *info); + +const struct di_edid_detailed_timing_def *const *di_edid_get_detailed_timing_defs(const struct di_edid *edid); +const struct di_edid_screen_size *di_edid_get_screen_size(const struct di_edid *edid); +const struct di_edid_vendor_product *di_edid_get_vendor_product(const struct di_edid *edid); +const struct di_edid_chromaticity_coords *di_edid_get_chromaticity_coords(const struct di_edid *edid); +const struct di_edid_ext *const *di_edid_get_extensions(const struct di_edid *edid); +const struct di_edid_misc_features *di_edid_get_misc_features(const struct di_edid *edid); + +const struct di_edid_cta *di_edid_ext_get_cta(const struct di_edid_ext *ext); +const struct di_displayid *di_edid_ext_get_displayid(const struct di_edid_ext *ext); + +const struct di_cta_data_block *const *di_edid_cta_get_data_blocks(const struct di_edid_cta *cta); +const struct di_cta_hdr_static_metadata_block *di_cta_data_block_get_hdr_static_metadata(const struct di_cta_data_block *block); +const struct di_cta_colorimetry_block *di_cta_data_block_get_colorimetry(const struct di_cta_data_block *block); + +const struct di_displayid_data_block *const *di_displayid_get_data_blocks(const struct di_displayid *displayid); +const struct di_displayid_display_params *di_displayid_data_block_get_display_params(const struct di_displayid_data_block *block); +const struct di_displayid_type_i_ii_vii_timing *const *di_displayid_data_block_get_type_i_timings(const struct di_displayid_data_block *block); +const struct di_displayid_type_i_ii_vii_timing *const *di_displayid_data_block_get_type_ii_timings(const struct di_displayid_data_block *block); + +#ifdef __cplusplus +} +#endif diff --git a/local/recipes/libs/libepoxy/source/.dir-locals.el b/local/recipes/libs/libepoxy/source/.dir-locals.el new file mode 100644 index 0000000000..7f3eee2dcf --- /dev/null +++ b/local/recipes/libs/libepoxy/source/.dir-locals.el @@ -0,0 +1,6 @@ +((nil + (indent-tabs-mode . nil) + (tab-width . 8) + (c-basic-offset . 4) + ) + ) diff --git a/local/recipes/libs/libepoxy/source/.editorconfig b/local/recipes/libs/libepoxy/source/.editorconfig new file mode 100644 index 0000000000..34738067b3 --- /dev/null +++ b/local/recipes/libs/libepoxy/source/.editorconfig @@ -0,0 +1,22 @@ +root = true + +[*] +charset = utf-8 + +[*.{c,h}] +indent_style = space +indent_size = 4 +end_of_line = lf +trim_trailing_whitespace = true +insert_final_newline = true + +[.travis.yml] +indent_style = space +indent_size = 2 + +[*.md] +trim_trailing_whitespace = false + +[meson.build] +indent_style = space +indent_size = 8 diff --git a/local/recipes/libs/libepoxy/source/.github/scripts/epoxy-ci-linux.sh b/local/recipes/libs/libepoxy/source/.github/scripts/epoxy-ci-linux.sh new file mode 100755 index 0000000000..e95584fc4e --- /dev/null +++ b/local/recipes/libs/libepoxy/source/.github/scripts/epoxy-ci-linux.sh @@ -0,0 +1,32 @@ +#!/bin/bash + +dump_log_and_quit() { + local exitcode=$1 + + cat meson-logs/testlog.txt + + exit $exitcode +} + +# Start Xvfb +XVFB_WHD=${XVFB_WHD:-1280x720x16} + +Xvfb :99 -ac -screen 0 $XVFB_WHD -nolisten tcp & +xvfb=$! + +export DISPLAY=:99 + +srcdir=$( pwd ) +builddir=$( mktemp -d build_XXXXXX ) + +meson --prefix /usr "$@" $builddir $srcdir || exit $? + +cd $builddir + +ninja || exit $? +meson test || dump_log_and_quit $? + +cd .. + +# Stop Xvfb +kill -9 ${xvfb} diff --git a/local/recipes/libs/libepoxy/source/.github/scripts/epoxy-ci-osx.sh b/local/recipes/libs/libepoxy/source/.github/scripts/epoxy-ci-osx.sh new file mode 100755 index 0000000000..1a062a1281 --- /dev/null +++ b/local/recipes/libs/libepoxy/source/.github/scripts/epoxy-ci-osx.sh @@ -0,0 +1,27 @@ +#!/bin/sh + +dump_log_and_quit() { + local exitcode=$1 + + cat meson-logs/testlog.txt + + exit $exitcode +} + +export SDKROOT=$( xcodebuild -version -sdk macosx Path ) +export CPPFLAGS=-I/usr/local/include +export LDFLAGS=-L/usr/local/lib +export OBJC=$CC +export PATH=$HOME/tools:$PATH + +srcdir=$( pwd ) +builddir=$( mktemp -d build_XXXXXX ) + +meson ${BUILDOPTS} $builddir $srcdir || exit $? + +cd $builddir + +ninja || exit $? +meson test || dump_log_and_quit $? + +cd .. diff --git a/local/recipes/libs/libepoxy/source/.github/workflows/linux.yml b/local/recipes/libs/libepoxy/source/.github/workflows/linux.yml new file mode 100644 index 0000000000..3d71e7fdd9 --- /dev/null +++ b/local/recipes/libs/libepoxy/source/.github/workflows/linux.yml @@ -0,0 +1,38 @@ +name: Ubuntu +on: + push: + branches-ignore: + - debian + - khronos-registry +jobs: + build: + strategy: + matrix: + os: + - ubuntu-18.04 + compiler: + - gcc + - clang + build-opts: + - '' + - '-Dglx=no' + - '-Degl=no' + - '-Dx11=false' + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v2 + - run: > + sudo apt-get update && + sudo apt-get install --no-install-recommends + libgl1-mesa-dev + libegl1-mesa-dev + libgles2-mesa-dev + libgl1-mesa-dri + ninja-build + - uses: actions/setup-python@v2 + with: + python-version: 3.x + - run: | + python -m pip install --upgrade pip + pip3 install meson + /bin/sh -c "CC=${{ matrix.compiler }} .github/scripts/epoxy-ci-linux.sh ${{ matrix.build-opts }}" diff --git a/local/recipes/libs/libepoxy/source/.github/workflows/macos.yml b/local/recipes/libs/libepoxy/source/.github/workflows/macos.yml new file mode 100644 index 0000000000..c725ef1a38 --- /dev/null +++ b/local/recipes/libs/libepoxy/source/.github/workflows/macos.yml @@ -0,0 +1,26 @@ +name: macOS +on: + push: + branches-ignore: + - debian + - khronos-registry +jobs: + build: + strategy: + matrix: + build-opts: + - '' + - '-Dglx=no' + - '-Degl=no' + - '-Dx11=false' + runs-on: macos-10.15 + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-python@v2 + with: + python-version: 3.x + - run: | + brew install ninja + python -m pip install --upgrade pip + pip3 install meson + /bin/sh -c "CC=clang .github/scripts/epoxy-ci-osx.sh ${{ matrix.build-opts }}" diff --git a/local/recipes/libs/libepoxy/source/.github/workflows/msvc-env.yml b/local/recipes/libs/libepoxy/source/.github/workflows/msvc-env.yml new file mode 100644 index 0000000000..a4e69c8955 --- /dev/null +++ b/local/recipes/libs/libepoxy/source/.github/workflows/msvc-env.yml @@ -0,0 +1,23 @@ +name: MSVC Build + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +jobs: + build: + runs-on: windows-latest + env: + PYTHONIOENCODING: "utf-8" + steps: + - uses: actions/checkout@master + - uses: actions/setup-python@v1 + - uses: seanmiddleditch/gha-setup-vsdevenv@master + - uses: BSFishy/meson-build@v1.0.1 + with: + action: test + directory: _build + options: --verbose --fatal-meson-warnings + meson-version: 0.54.3 diff --git a/local/recipes/libs/libepoxy/source/.github/workflows/msys2.yml b/local/recipes/libs/libepoxy/source/.github/workflows/msys2.yml new file mode 100644 index 0000000000..0f90a2bcc0 --- /dev/null +++ b/local/recipes/libs/libepoxy/source/.github/workflows/msys2.yml @@ -0,0 +1,27 @@ +name: MSYS2 Build + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +jobs: + build: + runs-on: windows-latest + defaults: + run: + shell: msys2 {0} + env: + PYTHONIOENCODING: "utf-8" + steps: + - uses: actions/checkout@master + - uses: msys2/setup-msys2@v2 + with: + msystem: MINGW64 + update: true + install: base-devel git mingw-w64-x86_64-meson mingw-w64-x86_64-ninja mingw-w64-x86_64-pkg-config mingw-w64-x86_64-python3 mingw-w64-x86_64-python3-pip mingw-w64-x86_64-toolchain + - name: Build + run: | + meson setup _build + meson compile -C _build diff --git a/local/recipes/libs/libepoxy/source/.gitignore b/local/recipes/libs/libepoxy/source/.gitignore new file mode 100644 index 0000000000..fb054cbfd8 --- /dev/null +++ b/local/recipes/libs/libepoxy/source/.gitignore @@ -0,0 +1,79 @@ +# +# X.Org module default exclusion patterns +# The next section if for module specific patterns +# +# Do not edit the following section +# GNU Build System (Autotools) +aclocal.m4 +autom4te.cache/ +autoscan.log +ChangeLog +compile +config.guess +config.h +config.h.in +config.log +config-ml.in +config.py +config.status +config.status.lineno +config.sub +configure +configure.scan +depcomp +.deps/ +INSTALL +install-sh +.libs/ +libtool +libtool.m4 +ltmain.sh +lt~obsolete.m4 +ltoptions.m4 +ltsugar.m4 +ltversion.m4 +Makefile +Makefile.in +mdate-sh +missing +mkinstalldirs +*.pc +py-compile +stamp-h? +symlink-tree +texinfo.tex +ylwrap +src/sna/git_version.h +src/sna/brw/brw_test + +# Do not edit the following section +# Edit Compile Debug Document Distribute +*~ +*.[0-9] +*.[0-9]x +*.bak +*.bin +core +*.dll +*.exe +*-ISO*.bdf +*-JIS*.bdf +*-KOI8*.bdf +*.kld +*.ko +*.ko.cmd +*.lai +*.l[oa] +*.[oa] +*.obj +*.so +*.pcf.gz +*.pdb +*.tar.bz2 +*.tar.gz +# +# Add & Override patterns for gldispatch +# +# Edit the following section as needed +# For example, !report.pc overrides *.pc. See 'man gitignore' +# diff --git a/local/recipes/libs/libepoxy/source/COPYING b/local/recipes/libs/libepoxy/source/COPYING new file mode 100644 index 0000000000..8dd167cf37 --- /dev/null +++ b/local/recipes/libs/libepoxy/source/COPYING @@ -0,0 +1,50 @@ +The libepoxy project code is covered by the MIT license: + +/* + * Copyright © 2013-2014 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +The generated code is derived from Khronos's xml files, which appear +under the following license: + +/* + * Copyright (c) 2013 The Khronos Group Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and/or associated documentation files (the + * "Materials"), to deal in the Materials without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Materials, and to + * permit persons to whom the Materials are furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Materials. + * + * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. + */ diff --git a/local/recipes/libs/libepoxy/source/README.md b/local/recipes/libs/libepoxy/source/README.md new file mode 100644 index 0000000000..9d83ed9e8b --- /dev/null +++ b/local/recipes/libs/libepoxy/source/README.md @@ -0,0 +1,126 @@ +![Ubuntu](https://github.com/anholt/libepoxy/workflows/Ubuntu/badge.svg) +![macOS](https://github.com/anholt/libepoxy/workflows/macOS/badge.svg) +![MSVC Build](https://github.com/anholt/libepoxy/workflows/MSVC%20Build/badge.svg) +![MSYS2 Build](https://github.com/anholt/libepoxy/workflows/MSYS2%20Build/badge.svg) +[![License: MIT](https://img.shields.io/badge/license-MIT-brightgreen.svg)](https://opensource.org/licenses/MIT) + +Epoxy is a library for handling OpenGL function pointer management for +you. + +It hides the complexity of `dlopen()`, `dlsym()`, `glXGetProcAddress()`, +`eglGetProcAddress()`, etc. from the app developer, with very little +knowledge needed on their part. They get to read GL specs and write +code using undecorated function names like `glCompileShader()`. + +Don't forget to check for your extensions or versions being present +before you use them, just like before! We'll tell you what you forgot +to check for instead of just segfaulting, though. + +Features +-------- + + * Automatically initializes as new GL functions are used. + * GL 4.6 core and compatibility context support. + * GLES 1/2/3 context support. + * Knows about function aliases so (e.g.) `glBufferData()` can be + used with `GL_ARB_vertex_buffer_object` implementations, along + with GL 1.5+ implementations. + * EGL, GLX, and WGL support. + * Can be mixed with non-epoxy GL usage. + +Building +-------- + +```sh +mkdir _build && cd _build +meson +ninja +sudo ninja install +``` + +Dependencies for Debian: + + * meson + * libegl1-mesa-dev + +Dependencies for macOS (using MacPorts): + + * pkgconfig + * meson + +The test suite has additional dependencies depending on the platform. +(X11, EGL, a running X Server). + +Switching your code to using epoxy +---------------------------------- + +It should be as easy as replacing: + +```cpp +#include +#include +#include +``` + +with: + +```cpp +#include +#include +``` + +As long as epoxy's headers appear first, you should be ready to go. +Additionally, some new helpers become available, so you don't have to +write them: + +`int epoxy_gl_version()` returns the GL version: + + * 12 for GL 1.2 + * 20 for GL 2.0 + * 44 for GL 4.4 + +`bool epoxy_has_gl_extension()` returns whether a GL extension is +available (`GL_ARB_texture_buffer_object`, for example). + +Note that this is not terribly fast, so keep it out of your hot paths, +ok? + +Why not use libGLEW? +-------------------- + +GLEW has several issues: + + * Doesn't know about aliases of functions (There are 5 providers of + `glPointParameterfv()`, for example, and you don't want to have to + choose which one to call when they're all the same). + * Doesn't support OpenGL ES. + * Has a hard-to-maintain parser of extension specification text + instead of using the old .spec file or the new .xml. + * Has significant startup time overhead when `glewInit()` + autodetects the world. + * User-visible multithreading support choice for win32. + +The motivation for this project came out of previous use of libGLEW in +[piglit](http://piglit.freedesktop.org/). Other GL dispatch code +generation projects had similar failures. Ideally, piglit wants to be +able to build a single binary for a test that can run on whatever +context or window system it chooses, not based on link time choices. + +We had to solve some of GLEW's problems for piglit and solving them +meant replacing every single piece of GLEW, so we built +piglit-dispatch from scratch. And since we wanted to reuse it in +other GL-related projects, this is the result. + +Known issues when running on Windows +------------------------------------ + +The automatic per-context symbol resolution for win32 requires that +epoxy knows when `wglMakeCurrent()` is called, because `wglGetProcAddress()` +returns values depend on the context's device and pixel format. If +`wglMakeCurrent()` is called from outside of epoxy (in a way that might +change the device or pixel format), then epoxy needs to be notified of +the change using the `epoxy_handle_external_wglMakeCurrent()` function. + +The win32 `wglMakeCurrent()` variants are slower than they should be, +because they should be caching the resolved dispatch tables instead of +resetting an entire thread-local dispatch table every time. diff --git a/local/recipes/libs/libepoxy/source/cross/fedora-mingw64.txt b/local/recipes/libs/libepoxy/source/cross/fedora-mingw64.txt new file mode 100644 index 0000000000..7c0eda7540 --- /dev/null +++ b/local/recipes/libs/libepoxy/source/cross/fedora-mingw64.txt @@ -0,0 +1,18 @@ +[binaries] +c = '/usr/bin/x86_64-w64-mingw32-gcc' +cpp = '/usr/bin/x86_64-w64-mingw32-cpp' +ar = '/usr/bin/x86_64-w64-mingw32-ar' +strip = '/usr/bin/x86_64-w64-mingw32-strip' +pkgconfig = '/usr/bin/x86_64-w64-mingw32-pkg-config' +exe_wrapper = 'wine' + +[properties] +root = '/usr/x86_64-w64-mingw32/sys-root/mingw' +c_args = [ '-pipe', '-Wp,-D_FORTIFY_SOURCE=2', '-fexceptions', '--param=ssp-buffer-size=4', '-I/usr/x86_64-w64-mingw32/sys-root/mingw/include' ] +c_link_args = [ '-L/usr/x86_64-w64-mingw32/sys-root/mingw/lib' ] + +[host_machine] +system = 'windows' +cpu_family = 'x86_64' +cpu = 'x86_64' +endian = 'little' diff --git a/local/recipes/libs/libepoxy/source/doc/Doxyfile.in b/local/recipes/libs/libepoxy/source/doc/Doxyfile.in new file mode 100644 index 0000000000..0f3c00dcf6 --- /dev/null +++ b/local/recipes/libs/libepoxy/source/doc/Doxyfile.in @@ -0,0 +1,241 @@ +DOXYFILE_ENCODING = UTF-8 +PROJECT_NAME = @PACKAGE_NAME@ +PROJECT_NUMBER = @PACKAGE_VERSION@ +PROJECT_BRIEF = +PROJECT_LOGO = +OUTPUT_DIRECTORY = doc +CREATE_SUBDIRS = NO +ALLOW_UNICODE_NAMES = YES +OUTPUT_LANGUAGE = English +BRIEF_MEMBER_DESC = YES +REPEAT_BRIEF = YES +ABBREVIATE_BRIEF = +ALWAYS_DETAILED_SEC = NO +INLINE_INHERITED_MEMB = NO +FULL_PATH_NAMES = YES +STRIP_FROM_PATH = "@top_srcdir@/include" "@top_builddir@/include" + +SHORT_NAMES = NO +JAVADOC_AUTOBRIEF = YES +QT_AUTOBRIEF = NO +MULTILINE_CPP_IS_BRIEF = NO +INHERIT_DOCS = YES +SEPARATE_MEMBER_PAGES = NO +TAB_SIZE = 8 +ALIASES = "newin{2}=\xrefitem since_\1_\2 \"Since @PACKAGE_NAME@ \1.\2\" \"New API in @PACKAGE_NAME@ \1.\2\"" +TCL_SUBST = +OPTIMIZE_OUTPUT_FOR_C = YES +OPTIMIZE_OUTPUT_JAVA = NO +OPTIMIZE_FOR_FORTRAN = NO +OPTIMIZE_OUTPUT_VHDL = NO +EXTENSION_MAPPING = +MARKDOWN_SUPPORT = YES +AUTOLINK_SUPPORT = YES +BUILTIN_STL_SUPPORT = NO +CPP_CLI_SUPPORT = NO +SIP_SUPPORT = NO +IDL_PROPERTY_SUPPORT = NO +DISTRIBUTE_GROUP_DOC = NO +GROUP_NESTED_COMPOUNDS = NO +SUBGROUPING = YES +INLINE_GROUPED_CLASSES = NO +INLINE_SIMPLE_STRUCTS = NO +TYPEDEF_HIDES_STRUCT = NO +LOOKUP_CACHE_SIZE = 0 + +EXTRACT_ALL = YES +EXTRACT_PRIVATE = NO +EXTRACT_PACKAGE = NO +EXTRACT_STATIC = NO +EXTRACT_LOCAL_CLASSES = NO +EXTRACT_LOCAL_METHODS = NO +EXTRACT_ANON_NSPACES = NO +HIDE_UNDOC_MEMBERS = YES +HIDE_UNDOC_CLASSES = YES +HIDE_FRIEND_COMPOUNDS = YES +HIDE_IN_BODY_DOCS = YES +INTERNAL_DOCS = NO +CASE_SENSE_NAMES = YES +HIDE_SCOPE_NAMES = NO +HIDE_COMPOUND_REFERENCE= NO +SHOW_INCLUDE_FILES = YES +SHOW_GROUPED_MEMB_INC = NO +FORCE_LOCAL_INCLUDES = NO +INLINE_INFO = YES +SORT_MEMBER_DOCS = YES +SORT_BRIEF_DOCS = NO +SORT_MEMBERS_CTORS_1ST = YES +SORT_GROUP_NAMES = YES +SORT_BY_SCOPE_NAME = YES +STRICT_PROTO_MATCHING = NO +GENERATE_TODOLIST = YES +GENERATE_TESTLIST = NO +GENERATE_BUGLIST = YES +GENERATE_DEPRECATEDLIST= YES +ENABLED_SECTIONS = +MAX_INITIALIZER_LINES = 2 +SHOW_USED_FILES = YES +SHOW_FILES = YES +SHOW_NAMESPACES = NO +FILE_VERSION_FILTER = +LAYOUT_FILE = +CITE_BIB_FILES = + +QUIET = YES +WARNINGS = YES +WARN_IF_UNDOCUMENTED = YES +WARN_IF_DOC_ERROR = YES +WARN_NO_PARAMDOC = YES +WARN_AS_ERROR = NO +WARN_FORMAT = "$file:$line: $text" +WARN_LOGFILE = doc/doxygen.log + +INPUT = "@top_srcdir@/include/epoxy" "@top_srcdir@/src" +INPUT_ENCODING = UTF-8 +FILE_PATTERNS = "*.h" "*.c" +RECURSIVE = NO +EXCLUDE = "@top_srcdir@/src/gen_dispatch.py" +EXCLUDE_SYMLINKS = YES +EXCLUDE_PATTERNS = +EXCLUDE_SYMBOLS = _* GLAPI* KHRONOS_* APIENTRY* GLX* wgl* EPOXY_CALLSPEC EPOXY_BEGIN_DECLS EPOXY_END_DECLS +EXAMPLE_PATH = +EXAMPLE_PATTERNS = +EXAMPLE_RECURSIVE = NO +IMAGE_PATH = +INPUT_FILTER = +FILTER_PATTERNS = +FILTER_SOURCE_FILES = NO +FILTER_SOURCE_PATTERNS = +USE_MDFILE_AS_MAINPAGE = + +SOURCE_BROWSER = NO +INLINE_SOURCES = NO +STRIP_CODE_COMMENTS = YES +REFERENCED_BY_RELATION = NO +REFERENCES_RELATION = NO +REFERENCES_LINK_SOURCE = YES +SOURCE_TOOLTIPS = YES +USE_HTAGS = NO +VERBATIM_HEADERS = NO + +ALPHABETICAL_INDEX = YES +COLS_IN_ALPHA_INDEX = 3 +IGNORE_PREFIX = "epoxy" + +GENERATE_HTML = YES +HTML_OUTPUT = html +HTML_FILE_EXTENSION = .html +HTML_HEADER = +HTML_FOOTER = +HTML_STYLESHEET = +HTML_EXTRA_STYLESHEET = +HTML_EXTRA_FILES = +HTML_COLORSTYLE_HUE = 220 +HTML_COLORSTYLE_SAT = 100 +HTML_COLORSTYLE_GAMMA = 80 +HTML_TIMESTAMP = YES +HTML_DYNAMIC_SECTIONS = NO +HTML_INDEX_NUM_ENTRIES = 100 +GENERATE_DOCSET = NO +DOCSET_FEEDNAME = "Doxygen generated docs" +DOCSET_BUNDLE_ID = org.doxygen.Project +DOCSET_PUBLISHER_ID = org.doxygen.Publisher +DOCSET_PUBLISHER_NAME = Publisher +GENERATE_HTMLHELP = NO +CHM_FILE = +HHC_LOCATION = +GENERATE_CHI = NO +CHM_INDEX_ENCODING = +BINARY_TOC = NO +TOC_EXPAND = NO +GENERATE_QHP = NO +QCH_FILE = +QHP_NAMESPACE = +QHP_VIRTUAL_FOLDER = doc +QHP_CUST_FILTER_NAME = +QHP_CUST_FILTER_ATTRS = +QHP_SECT_FILTER_ATTRS = +QHG_LOCATION = +GENERATE_ECLIPSEHELP = NO +ECLIPSE_DOC_ID = org.doxygen.Project +DISABLE_INDEX = NO +GENERATE_TREEVIEW = NO +ENUM_VALUES_PER_LINE = 1 +TREEVIEW_WIDTH = 250 +EXT_LINKS_IN_WINDOW = NO +FORMULA_FONTSIZE = 10 +FORMULA_TRANSPARENT = YES +USE_MATHJAX = NO +MATHJAX_FORMAT = HTML-CSS +MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest +MATHJAX_EXTENSIONS = +MATHJAX_CODEFILE = +SEARCHENGINE = NO +SERVER_BASED_SEARCH = NO +EXTERNAL_SEARCH = NO +SEARCHENGINE_URL = +SEARCHDATA_FILE = +EXTERNAL_SEARCH_ID = +EXTRA_SEARCH_MAPPINGS = + +GENERATE_LATEX = NO +GENERATE_RTF = NO +GENERATE_MAN = NO +GENERATE_XML = NO +GENERATE_DOCBOOK = NO +GENERATE_AUTOGEN_DEF = NO +GENERATE_PERLMOD = NO + +ENABLE_PREPROCESSING = YES +MACRO_EXPANSION = YES +EXPAND_ONLY_PREDEF = YES +SEARCH_INCLUDES = YES +INCLUDE_PATH = "@top_srcdir@/include" \ + "@top_builddir@/include" +INCLUDE_FILE_PATTERNS = *.h +PREDEFINED = DOXYGEN_SHOULD_SKIP_THIS \ + "EPOXY_BEGIN_DECLS=" \ + "EPOXY_END_DECLS=" \ + "EPOXY_PUBLIC=" +EXPAND_AS_DEFINED = +SKIP_FUNCTION_MACROS = YES + +ALLEXTERNALS = NO +EXTERNAL_GROUPS = NO +EXTERNAL_PAGES = NO + +HAVE_DOT = @HAVE_DOT@ +CLASS_DIAGRAMS = NO +MSCGEN_PATH = +DIA_PATH = +HIDE_UNDOC_RELATIONS = NO +DOT_NUM_THREADS = 0 +DOT_FONTNAME = Sans +DOT_FONTSIZE = 10 +DOT_FONTPATH = +CLASS_GRAPH = NO +COLLABORATION_GRAPH = YES +GROUP_GRAPHS = YES +UML_LOOK = NO +UML_LIMIT_NUM_FIELDS = 10 +TEMPLATE_RELATIONS = NO +INCLUDE_GRAPH = NO +INCLUDED_BY_GRAPH = NO +CALL_GRAPH = NO +CALLER_GRAPH = NO +GRAPHICAL_HIERARCHY = YES +DIRECTORY_GRAPH = YES +DOT_IMAGE_FORMAT = png +INTERACTIVE_SVG = NO +DOT_PATH = +DOTFILE_DIRS = +MSCFILE_DIRS = +DIAFILE_DIRS = +PLANTUML_JAR_PATH = +PLANTUML_INCLUDE_PATH = +DOT_GRAPH_MAX_NODES = 50 +MAX_DOT_GRAPH_DEPTH = 0 +DOT_TRANSPARENT = NO +DOT_MULTI_TARGETS = YES +GENERATE_LEGEND = YES +DOT_CLEANUP = YES diff --git a/local/recipes/libs/libepoxy/source/doc/meson.build b/local/recipes/libs/libepoxy/source/doc/meson.build new file mode 100644 index 0000000000..ef886dac91 --- /dev/null +++ b/local/recipes/libs/libepoxy/source/doc/meson.build @@ -0,0 +1,25 @@ +doxyfile_conf = configuration_data() +doxyfile_conf.set('PACKAGE_NAME', meson.project_name()) +doxyfile_conf.set('PACKAGE_VERSION', meson.project_version()) +doxyfile_conf.set('top_srcdir', meson.source_root()) +doxyfile_conf.set('top_builddir', meson.build_root()) + +if find_program('dot', required: false).found() + doxyfile_conf.set('HAVE_DOT', 'YES') +else + doxyfile_conf.set('HAVE_DOT', 'NO') +endif + +doxyfile = configure_file(input: 'Doxyfile.in', + output: 'Doxyfile', + configuration: doxyfile_conf, + install: false) + +docdir = join_paths(epoxy_datadir, 'doc') + +html_target = custom_target('epoxy-docs', + input: [ doxyfile ], + output: [ 'html' ], + command: [ doxygen, doxyfile ], + install: true, + install_dir: join_paths(docdir, 'epoxy')) diff --git a/local/recipes/libs/libepoxy/source/include/epoxy/common.h b/local/recipes/libs/libepoxy/source/include/epoxy/common.h new file mode 100644 index 0000000000..cf58ab2ffd --- /dev/null +++ b/local/recipes/libs/libepoxy/source/include/epoxy/common.h @@ -0,0 +1,63 @@ +/* + * Copyright 2017 Emmanuele Bassi + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +/** @file common.h + * + * A common header file, used to define macros and shared symbols. + */ + +#ifndef EPOXY_COMMON_H +#define EPOXY_COMMON_H + +#ifdef __cplusplus +# define EPOXY_BEGIN_DECLS extern "C" { +# define EPOXY_END_DECLS } +#else +# define EPOXY_BEGIN_DECLS +# define EPOXY_END_DECLS +#endif + +#ifndef EPOXY_PUBLIC +# if defined(_MSC_VER) +# define EPOXY_PUBLIC __declspec(dllimport) extern +# else +# define EPOXY_PUBLIC extern +# endif +#endif + +#if defined(_MSC_VER) && !defined(__bool_true_false_are_defined) && (_MSC_VER < 1800) +typedef unsigned char bool; +# define false 0 +# define true 1 +#else +# include +#endif + +EPOXY_BEGIN_DECLS + +EPOXY_PUBLIC bool epoxy_extension_in_string(const char *extension_list, + const char *ext); + +EPOXY_END_DECLS + +#endif /* EPOXY_COMMON_H */ diff --git a/local/recipes/libs/libepoxy/source/include/epoxy/egl.h b/local/recipes/libs/libepoxy/source/include/epoxy/egl.h new file mode 100644 index 0000000000..b5f8ee014f --- /dev/null +++ b/local/recipes/libs/libepoxy/source/include/epoxy/egl.h @@ -0,0 +1,54 @@ +/* + * Copyright © 2013 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +/** @file egl.h + * + * Provides an implementation of an EGL dispatch layer using global + * function pointers + * + * You should include `` instead of ``. + */ + +#ifndef EPOXY_EGL_H +#define EPOXY_EGL_H + +#include "epoxy/common.h" + +#if defined(__egl_h_) || defined(__eglext_h_) +#error epoxy/egl.h must be included before (or in place of) GL/egl.h +#else +#define __egl_h_ +#define __eglext_h_ +#endif + +EPOXY_BEGIN_DECLS + +#include "epoxy/egl_generated.h" + +EPOXY_PUBLIC bool epoxy_has_egl_extension(EGLDisplay dpy, const char *extension); +EPOXY_PUBLIC int epoxy_egl_version(EGLDisplay dpy); +EPOXY_PUBLIC bool epoxy_has_egl(void); + +EPOXY_END_DECLS + +#endif /* EPOXY_EGL_H */ diff --git a/local/recipes/libs/libepoxy/source/include/epoxy/gl.h b/local/recipes/libs/libepoxy/source/include/epoxy/gl.h new file mode 100644 index 0000000000..1fef4ba889 --- /dev/null +++ b/local/recipes/libs/libepoxy/source/include/epoxy/gl.h @@ -0,0 +1,112 @@ +/* + * Copyright © 2013 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +/** @file gl.h + * + * Provides an implementation of a GL dispatch layer using either + * global function pointers or a hidden vtable. + * + * You should include `` instead of `` and ``. + */ + +#ifndef EPOXY_GL_H +#define EPOXY_GL_H + +#include "epoxy/common.h" + +#if defined(__gl_h_) || defined(__glext_h_) +#error epoxy/gl.h must be included before (or in place of) GL/gl.h +#else +#define __gl_h_ +#define __glext_h_ +#endif + +#define KHRONOS_SUPPORT_INT64 1 +#define KHRONOS_SUPPORT_FLOAT 1 +#define KHRONOS_APIATTRIBUTES + +#ifndef _WIN32 +/* APIENTRY and GLAPIENTRY are not used on Linux or Mac. */ +#define APIENTRY +#define GLAPIENTRY +#define EPOXY_CALLSPEC +#define GLAPI +#define KHRONOS_APIENTRY +#define KHRONOS_APICALL + +#else +#ifndef APIENTRY +#define APIENTRY __stdcall +#endif + +#ifndef GLAPIENTRY +#define GLAPIENTRY APIENTRY +#endif + +#ifndef EPOXY_CALLSPEC +#define EPOXY_CALLSPEC __stdcall +#endif + +#ifndef GLAPI +#define GLAPI extern +#endif + +#define KHRONOS_APIENTRY __stdcall +#define KHRONOS_APICALL __declspec(dllimport) __stdcall + +#endif /* _WIN32 */ + +#ifndef APIENTRYP +#define APIENTRYP APIENTRY * +#endif + +#ifndef GLAPIENTRYP +#define GLAPIENTRYP GLAPIENTRY * +#endif + +EPOXY_BEGIN_DECLS + +#include "epoxy/gl_generated.h" + +EPOXY_PUBLIC bool epoxy_has_gl_extension(const char *extension); +EPOXY_PUBLIC bool epoxy_is_desktop_gl(void); +EPOXY_PUBLIC int epoxy_gl_version(void); +EPOXY_PUBLIC int epoxy_glsl_version(void); + +/* + * the type of the stub function that the failure handler must return; + * this function will be called on subsequent calls to the same bogus + * function name + */ +typedef void (*epoxy_resolver_stub_t)(void); + +/* the type of the failure handler itself */ +typedef epoxy_resolver_stub_t +(*epoxy_resolver_failure_handler_t)(const char *name); + +EPOXY_PUBLIC epoxy_resolver_failure_handler_t +epoxy_set_resolver_failure_handler(epoxy_resolver_failure_handler_t handler); + +EPOXY_END_DECLS + +#endif /* EPOXY_GL_H */ diff --git a/local/recipes/libs/libepoxy/source/include/epoxy/glx.h b/local/recipes/libs/libepoxy/source/include/epoxy/glx.h new file mode 100644 index 0000000000..85170639c9 --- /dev/null +++ b/local/recipes/libs/libepoxy/source/include/epoxy/glx.h @@ -0,0 +1,57 @@ +/* + * Copyright © 2013 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +/** @file glx.h + * + * Provides an implementation of a GLX dispatch layer using global + * function pointers. + * + * You should include `` instead of ``. + */ + +#ifndef EPOXY_GLX_H +#define EPOXY_GLX_H + +#include +#include +#include + +#if defined(GLX_H) || defined(__glxext_h_) +#error epoxy/glx.h must be included before (or in place of) GL/glx.h +#else +#define GLX_H +#define __glx_h__ +#define __glxext_h_ +#endif + +EPOXY_BEGIN_DECLS + +#include "epoxy/glx_generated.h" + +EPOXY_PUBLIC bool epoxy_has_glx_extension(Display *dpy, int screen, const char *extension); +EPOXY_PUBLIC int epoxy_glx_version(Display *dpy, int screen); +EPOXY_PUBLIC bool epoxy_has_glx(Display *dpy); + +EPOXY_END_DECLS + +#endif /* EPOXY_GLX_H */ diff --git a/local/recipes/libs/libepoxy/source/include/epoxy/meson.build b/local/recipes/libs/libepoxy/source/include/epoxy/meson.build new file mode 100644 index 0000000000..c679efe8b2 --- /dev/null +++ b/local/recipes/libs/libepoxy/source/include/epoxy/meson.build @@ -0,0 +1,43 @@ +headers = [ 'common.h' ] + +# GL is always generated +generated_headers = [ [ 'gl.h', 'gl_generated.h', gl_registry ] ] + +if build_egl + generated_headers += [ [ 'egl.h', 'egl_generated.h', egl_registry ] ] +endif + +if build_glx + generated_headers += [ [ 'glx.h', 'glx_generated.h', glx_registry ] ] +endif + +if build_wgl + generated_headers += [ [ 'wgl.h', 'wgl_generated.h', wgl_registry ] ] +endif + +gen_headers = [] + +foreach g: generated_headers + header = g[0] + gen_header = g[1] + registry = g[2] + generated = custom_target(gen_header, + input: registry, + output: [ gen_header ], + command: [ + gen_dispatch_py, + '--header', + '--no-source', + '--outputdir=@OUTDIR@', + '@INPUT@', + ], + install: true, + install_dir: join_paths(epoxy_includedir, 'epoxy')) + + gen_headers += [ generated ] + headers += [ header ] +endforeach + +epoxy_headers = files(headers) + gen_headers + +install_headers(headers, subdir: 'epoxy') diff --git a/local/recipes/libs/libepoxy/source/include/epoxy/wgl.h b/local/recipes/libs/libepoxy/source/include/epoxy/wgl.h new file mode 100644 index 0000000000..7c85dec6cf --- /dev/null +++ b/local/recipes/libs/libepoxy/source/include/epoxy/wgl.h @@ -0,0 +1,61 @@ +/* + * Copyright © 2013 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +/** @file wgl.h + * + * Provides an implementation of a WGL dispatch layer using a hidden + * vtable. + */ + +#ifndef EPOXY_WGL_H +#define EPOXY_WGL_H + +#include + +#include "epoxy/common.h" + +#undef wglUseFontBitmaps +#undef wglUseFontOutlines + +#if defined(__wglxext_h_) +#error epoxy/wgl.h must be included before (or in place of) wgl.h +#else +#define __wglxext_h_ +#endif + +#ifdef UNICODE +#define wglUseFontBitmaps wglUseFontBitmapsW +#else +#define wglUseFontBitmaps wglUseFontBitmapsA +#endif + +EPOXY_BEGIN_DECLS + +#include "epoxy/wgl_generated.h" + +EPOXY_PUBLIC bool epoxy_has_wgl_extension(HDC hdc, const char *extension); +EPOXY_PUBLIC void epoxy_handle_external_wglMakeCurrent(void); + +EPOXY_END_DECLS + +#endif /* EPOXY_WGL_H */ diff --git a/local/recipes/libs/libepoxy/source/meson.build b/local/recipes/libs/libepoxy/source/meson.build new file mode 100644 index 0000000000..e1d8d8b037 --- /dev/null +++ b/local/recipes/libs/libepoxy/source/meson.build @@ -0,0 +1,229 @@ +project('libepoxy', 'c', version: '1.5.10', + default_options: [ + 'buildtype=debugoptimized', + 'c_std=gnu99', + 'warning_level=1', + ], + license: 'MIT', + meson_version: '>= 0.54.0') + +epoxy_version = meson.project_version().split('.') +epoxy_major_version = epoxy_version[0].to_int() +epoxy_minor_version = epoxy_version[1].to_int() +epoxy_micro_version = epoxy_version[2].to_int() + +epoxy_prefix = get_option('prefix') +epoxy_libdir = join_paths(epoxy_prefix, get_option('libdir')) +epoxy_datadir = join_paths(epoxy_prefix, get_option('datadir')) +epoxy_includedir = join_paths(epoxy_prefix, get_option('includedir')) + +cc = meson.get_compiler('c') +host_system = host_machine.system() + +conf = configuration_data() +conf.set_quoted('PACKAGE_NAME', meson.project_name()) +conf.set_quoted('PACKAGE_VERSION', meson.project_version()) +conf.set_quoted('PACKAGE_STRING', '@0@-@1@'.format(meson.project_name(), meson.project_version())) +conf.set_quoted('PACKAGE_DATADIR', join_paths(get_option('prefix'), get_option('datadir'))) +conf.set_quoted('PACKAGE_LIBDIR', join_paths(get_option('prefix'), get_option('libdir'))) +conf.set_quoted('PACKAGE_LOCALEDIR', join_paths(get_option('prefix'), get_option('datadir'), 'locale')) +conf.set_quoted('PACKAGE_LIBEXECDIR', join_paths(get_option('prefix'), get_option('libexecdir'))) +conf.set('HAVE_KHRPLATFORM_H', cc.has_header('KHR/khrplatform.h')) + +# GLX can be used on different platforms, so we expose a +# configure time switch to enable or disable it; in case +# the "auto" default value is set, we only enable GLX +# support on Linux and Unix +enable_glx = get_option('glx') +if enable_glx == 'auto' + build_glx = not ['windows', 'darwin', 'android', 'haiku'].contains(host_system) +else + build_glx = enable_glx == 'yes' +endif + +enable_egl = get_option('egl') +if enable_egl == 'auto' + build_egl = not ['windows', 'darwin'].contains(host_system) +else + build_egl = enable_egl == 'yes' +endif + +enable_x11 = get_option('x11') +if not enable_x11 + if enable_glx == 'yes' + error('GLX support is explicitly enabled, but X11 was disabled') + endif + build_glx = false +endif + +# The remaining platform specific API for GL/GLES are enabled +# depending on the platform we're building for +if host_system == 'windows' + build_wgl = true + has_znow = true +elif host_system == 'darwin' + build_wgl = false + has_znow = false +else + build_wgl = false + has_znow = true +endif + +conf.set10('ENABLE_GLX', build_glx) +conf.set10('ENABLE_EGL', build_egl) +conf.set10('ENABLE_X11', enable_x11) + +# Compiler flags, taken from the Xorg macros +if cc.get_id() == 'msvc' + # Compiler options taken from msvc_recommended_pragmas.h + # in GLib, based on _Win32_Programming_ by Rector and Newcomer + test_cflags = [ + '-we4002', # too many actual parameters for macro + '-we4003', # not enough actual parameters for macro + '-w14010', # single-line comment contains line-continuation character + '-we4013', # 'function' undefined; assuming extern returning int + '-w14016', # no function return type; using int as default + '-we4020', # too many actual parameters + '-we4021', # too few actual parameters + '-we4027', # function declared without formal parameter list + '-we4029', # declared formal parameter list different from definition + '-we4033', # 'function' must return a value + '-we4035', # 'function' : no return value + '-we4045', # array bounds overflow + '-we4047', # different levels of indirection + '-we4049', # terminating line number emission + '-we4053', # an expression of type void was used as an operand + '-we4071', # no function prototype given + '-we4819', # the file contains a character that cannot be represented in the current code page + '/utf-8', # Set the input and exec encoding to utf-8, like is the default with GCC + ] +elif cc.get_id() == 'gcc' or cc.get_id() == 'clang' + test_cflags = [ + '-Wpointer-arith', + '-Wmissing-declarations', + '-Wformat=2', + '-Wstrict-prototypes', + '-Wmissing-prototypes', + '-Wnested-externs', + '-Wbad-function-cast', + '-Wold-style-definition', + '-Wdeclaration-after-statement', + '-Wunused', + '-Wuninitialized', + '-Wshadow', + '-Wmissing-noreturn', + '-Wmissing-format-attribute', + '-Wredundant-decls', + '-Wlogical-op', + '-Werror=implicit', + '-Werror=nonnull', + '-Werror=init-self', + '-Werror=main', + '-Werror=missing-braces', + '-Werror=sequence-point', + '-Werror=return-type', + '-Werror=trigraphs', + '-Werror=array-bounds', + '-Werror=write-strings', + '-Werror=address', + '-Werror=int-to-pointer-cast', + '-Werror=pointer-to-int-cast', + '-fno-strict-aliasing', + '-Wno-int-conversion', + ] +else + test_cflags = [] +endif + +common_cflags = cc.get_supported_arguments(test_cflags) + +libtype = get_option('default_library') + +# Visibility compiler flags; we only use this for shared libraries +visibility_cflags = [] +if libtype == 'shared' + if host_system == 'windows' + conf.set('DLL_EXPORT', true) + conf.set('EPOXY_PUBLIC', '__declspec(dllexport) extern') + if cc.get_id() != 'msvc' + visibility_cflags += [ '-fvisibility=hidden' ] + endif + else + conf.set('EPOXY_PUBLIC', '__attribute__((visibility("default"))) extern') + visibility_cflags += [ '-fvisibility=hidden' ] + endif +endif + +# The inline keyword is available only for C++ in MSVC. +# So we need to use Microsoft specific __inline. +if host_system == 'windows' + if cc.get_id() == 'msvc' + conf.set('inline', '__inline') + endif +endif + +# Dependencies +dl_dep = cc.find_library('dl', required: false) +gl_dep = dependency('gl', required: false) +egl_dep = dependency('egl', required: false) +elg_headers_dep = egl_dep.partial_dependency(compile_args: true, includes: true) + +# Optional dependencies for tests +x11_dep = dependency('x11', required: false) +x11_headers_dep = x11_dep.partial_dependency(compile_args: true, includes: true) + +# GLES v2 and v1 may have pkg-config files, courtesy of downstream +# packagers; let's check those first, and fall back to find_library() +# if we fail +gles2_dep = dependency('glesv2', required: false) +if not gles2_dep.found() + gles2_dep = cc.find_library('libGLESv2', required: false) +endif + +gles1_dep = dependency('glesv1_cm', required: false) +if not gles1_dep.found() + gles1_dep = cc.find_library('libGLESv1_CM', required: false) +endif + +# On windows, the DLL has to have all of its functions +# resolved at link time, so we have to link directly against +# opengl32. But that's the only GL provider, anyway. +if host_system == 'windows' + opengl32_dep = cc.find_library('opengl32', required: true) + + # When building against static libraries, we need to control + # the order of the dependencies, and gdi32 provides symbols + # needed when using opengl32, like SetPixelFormat and + # ChoosePixelFormat. This is mostly a workaround for older + # versions of Meson. + gdi32_dep = cc.find_library('gdi32', required: true) +endif + +# Generates the dispatch tables +gen_dispatch_py = find_program('src/gen_dispatch.py') + +gl_registry = files('registry/gl.xml') +egl_registry = files('registry/egl.xml') +glx_registry = files('registry/glx.xml') +wgl_registry = files('registry/wgl.xml') + +libepoxy_inc = [ + include_directories('include'), + include_directories('src'), +] + +subdir('include/epoxy') +subdir('src') + +if get_option('tests') + subdir('test') +endif + +if get_option('docs') + doxygen = find_program('doxygen', required: false) + if doxygen.found() + subdir('doc') + else + message('Documentation disabled without doxygen') + endif +endif diff --git a/local/recipes/libs/libepoxy/source/meson_options.txt b/local/recipes/libs/libepoxy/source/meson_options.txt new file mode 100644 index 0000000000..dc30e68b3b --- /dev/null +++ b/local/recipes/libs/libepoxy/source/meson_options.txt @@ -0,0 +1,21 @@ +option('docs', + type: 'boolean', value: false, + description: 'Enable generating the Epoxy API reference (depends on Doxygen)') +option('glx', + type: 'combo', + choices: [ 'auto', 'yes', 'no' ], + value: 'auto', + description: 'Enable GLX support') +option('egl', + type: 'combo', + choices: [ 'auto', 'yes', 'no' ], + value: 'auto', + description: 'Enable EGL support') +option('x11', + type: 'boolean', + value: true, + description: 'Enable X11 support (GLX or EGL-X11)') +option('tests', + type: 'boolean', + value: true, + description: 'Build the test suite') diff --git a/local/recipes/libs/libepoxy/source/registry/README.md b/local/recipes/libs/libepoxy/source/registry/README.md new file mode 100644 index 0000000000..a35d9d9b70 --- /dev/null +++ b/local/recipes/libs/libepoxy/source/registry/README.md @@ -0,0 +1,13 @@ +## Updating the registry XML + +In order to update the registry XML files and retain the history you cannot +simply download the files the [Khronos website](https://khronos.org/registry/OpenGL/index_gl.php) +and copy them into this directory. You should follow these steps, instead: + + 1. check out the `khronos-registry` branch + 2. download the XML files from the Khronos repository + 3. copy them under the `registry` directory + 4. check the result for consistency and commit it + 5. check out the `master` branch and merge the `khronos-registry` branch + into it with the appropriate commit message + diff --git a/local/recipes/libs/libepoxy/source/registry/egl.xml b/local/recipes/libs/libepoxy/source/registry/egl.xml new file mode 100644 index 0000000000..c27f1726b6 --- /dev/null +++ b/local/recipes/libs/libepoxy/source/registry/egl.xml @@ -0,0 +1,3282 @@ + + + + + + + + + #include <KHR/khrplatform.h> + #include <EGL/eglplatform.h> + + + + + + + + + + + + struct AHardwareBuffer; + + + + typedef unsigned int EGLBoolean; + typedef unsigned int EGLenum; + typedef intptr_t EGLAttribKHR; + typedef intptr_t EGLAttrib; + typedef void *EGLClientBuffer; + typedef void *EGLConfig; + typedef void *EGLContext; + typedef void *EGLDeviceEXT; + typedef void *EGLDisplay; + typedef void *EGLImage; + typedef void *EGLImageKHR; + typedef void *EGLLabelKHR; + typedef void *EGLObjectKHR; + typedef void *EGLOutputLayerEXT; + typedef void *EGLOutputPortEXT; + typedef void *EGLStreamKHR; + typedef void *EGLSurface; + typedef void *EGLSync; + typedef void *EGLSyncKHR; + typedef void *EGLSyncNV; + typedef void (*__eglMustCastToProperFunctionPointerType)(void); + typedef khronos_utime_nanoseconds_t EGLTimeKHR; + typedef khronos_utime_nanoseconds_t EGLTime; + typedef khronos_utime_nanoseconds_t EGLTimeNV; + typedef khronos_utime_nanoseconds_t EGLuint64NV; + typedef khronos_uint64_t EGLuint64KHR; + typedef khronos_stime_nanoseconds_t EGLnsecsANDROID; + typedef int EGLNativeFileDescriptorKHR; + typedef khronos_ssize_t EGLsizeiANDROID; + typedef void (*EGLSetBlobFuncANDROID) (const void *key, EGLsizeiANDROID keySize, const void *value, EGLsizeiANDROID valueSize); + typedef EGLsizeiANDROID (*EGLGetBlobFuncANDROID) (const void *key, EGLsizeiANDROID keySize, void *value, EGLsizeiANDROID valueSize); + struct EGLClientPixmapHI { + void *pData; + EGLint iWidth; + EGLint iHeight; + EGLint iStride; +}; + typedef void ( *EGLDEBUGPROCKHR)(EGLenum error,const char *command,EGLint messageType,EGLLabelKHR threadLabel,EGLLabelKHR objectLabel,const char* message); + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + EGLBoolean eglBindAPI + EGLenum api + + + EGLBoolean eglBindTexImage + EGLDisplay dpy + EGLSurface surface + EGLint buffer + + + EGLBoolean eglChooseConfig + EGLDisplay dpy + const EGLint *attrib_list + EGLConfig *configs + EGLint config_size + EGLint *num_config + + + EGLBoolean eglClientSignalSyncEXT + EGLDisplay dpy + EGLSync sync + const EGLAttrib *attrib_list + + + EGLint eglClientWaitSync + EGLDisplay dpy + EGLSync sync + EGLint flags + EGLTime timeout + + + EGLint eglClientWaitSyncKHR + EGLDisplay dpy + EGLSyncKHR sync + EGLint flags + EGLTimeKHR timeout + + + + EGLint eglClientWaitSyncNV + EGLSyncNV sync + EGLint flags + EGLTimeNV timeout + + + EGLBoolean eglCopyBuffers + EGLDisplay dpy + EGLSurface surface + EGLNativePixmapType target + + + EGLContext eglCreateContext + EGLDisplay dpy + EGLConfig config + EGLContext share_context + const EGLint *attrib_list + + + EGLImageKHR eglCreateDRMImageMESA + EGLDisplay dpy + const EGLint *attrib_list + + + EGLSyncNV eglCreateFenceSyncNV + EGLDisplay dpy + EGLenum condition + const EGLint *attrib_list + + + EGLImage eglCreateImage + EGLDisplay dpy + EGLContext ctx + EGLenum target + EGLClientBuffer buffer + const EGLAttrib *attrib_list + + + EGLImageKHR eglCreateImageKHR + EGLDisplay dpy + EGLContext ctx + EGLenum target + EGLClientBuffer buffer + const EGLint *attrib_list + + + EGLClientBuffer eglCreateNativeClientBufferANDROID + const EGLint *attrib_list + + + EGLSurface eglCreatePbufferFromClientBuffer + EGLDisplay dpy + EGLenum buftype + EGLClientBuffer buffer + EGLConfig config + const EGLint *attrib_list + + + EGLSurface eglCreatePbufferSurface + EGLDisplay dpy + EGLConfig config + const EGLint *attrib_list + + + EGLSurface eglCreatePixmapSurface + EGLDisplay dpy + EGLConfig config + EGLNativePixmapType pixmap + const EGLint *attrib_list + + + EGLSurface eglCreatePixmapSurfaceHI + EGLDisplay dpy + EGLConfig config + struct EGLClientPixmapHI *pixmap + + + EGLSurface eglCreatePlatformPixmapSurface + EGLDisplay dpy + EGLConfig config + void *native_pixmap + const EGLAttrib *attrib_list + + + EGLSurface eglCreatePlatformPixmapSurfaceEXT + EGLDisplay dpy + EGLConfig config + void *native_pixmap + const EGLint *attrib_list + + + EGLSurface eglCreatePlatformWindowSurface + EGLDisplay dpy + EGLConfig config + void *native_window + const EGLAttrib *attrib_list + + + EGLSurface eglCreatePlatformWindowSurfaceEXT + EGLDisplay dpy + EGLConfig config + void *native_window + const EGLint *attrib_list + + + EGLStreamKHR eglCreateStreamFromFileDescriptorKHR + EGLDisplay dpy + EGLNativeFileDescriptorKHR file_descriptor + + + EGLStreamKHR eglCreateStreamKHR + EGLDisplay dpy + const EGLint *attrib_list + + + EGLStreamKHR eglCreateStreamAttribKHR + EGLDisplay dpy + const EGLAttrib *attrib_list + + + EGLSurface eglCreateStreamProducerSurfaceKHR + EGLDisplay dpy + EGLConfig config + EGLStreamKHR stream + const EGLint *attrib_list + + + EGLSyncKHR eglCreateStreamSyncNV + EGLDisplay dpy + EGLStreamKHR stream + EGLenum type + const EGLint *attrib_list + + + EGLSync eglCreateSync + EGLDisplay dpy + EGLenum type + const EGLAttrib *attrib_list + + + EGLSyncKHR eglCreateSyncKHR + EGLDisplay dpy + EGLenum type + const EGLint *attrib_list + + + EGLSyncKHR eglCreateSync64KHR + EGLDisplay dpy + EGLenum type + const EGLAttribKHR *attrib_list + + + + EGLSurface eglCreateWindowSurface + EGLDisplay dpy + EGLConfig config + EGLNativeWindowType win + const EGLint *attrib_list + + + EGLint eglDebugMessageControlKHR + EGLDEBUGPROCKHR callback + const EGLAttrib *attrib_list + + + EGLBoolean eglDestroyContext + EGLDisplay dpy + EGLContext ctx + + + EGLBoolean eglDestroyImage + EGLDisplay dpy + EGLImage image + + + EGLBoolean eglDestroyImageKHR + EGLDisplay dpy + EGLImageKHR image + + + + EGLBoolean eglDestroyStreamKHR + EGLDisplay dpy + EGLStreamKHR stream + + + EGLBoolean eglDestroySurface + EGLDisplay dpy + EGLSurface surface + + + EGLBoolean eglDestroySync + EGLDisplay dpy + EGLSync sync + + + EGLBoolean eglDestroySyncKHR + EGLDisplay dpy + EGLSyncKHR sync + + + + EGLBoolean eglDestroySyncNV + EGLSyncNV sync + + + EGLint eglDupNativeFenceFDANDROID + EGLDisplay dpy + EGLSyncKHR sync + + + EGLBoolean eglExportDMABUFImageMESA + EGLDisplay dpy + EGLImageKHR image + int *fds + EGLint *strides + EGLint *offsets + + + EGLBoolean eglExportDMABUFImageQueryMESA + EGLDisplay dpy + EGLImageKHR image + int *fourcc + int *num_planes + EGLuint64KHR *modifiers + + + EGLBoolean eglExportDRMImageMESA + EGLDisplay dpy + EGLImageKHR image + EGLint *name + EGLint *handle + EGLint *stride + + + EGLBoolean eglFenceNV + EGLSyncNV sync + + + EGLBoolean eglGetConfigAttrib + EGLDisplay dpy + EGLConfig config + EGLint attribute + EGLint *value + + + EGLBoolean eglGetConfigs + EGLDisplay dpy + EGLConfig *configs + EGLint config_size + EGLint *num_config + + + EGLContext eglGetCurrentContext + + + EGLDisplay eglGetCurrentDisplay + + + EGLSurface eglGetCurrentSurface + EGLint readdraw + + + EGLDisplay eglGetDisplay + EGLNativeDisplayType display_id + + + char *eglGetDisplayDriverConfig + EGLDisplay dpy + + + const char *eglGetDisplayDriverName + EGLDisplay dpy + + + EGLint eglGetError + + + EGLClientBuffer eglGetNativeClientBufferANDROID + const struct AHardwareBuffer *buffer + + + EGLBoolean eglGetOutputLayersEXT + EGLDisplay dpy + const EGLAttrib *attrib_list + EGLOutputLayerEXT *layers + EGLint max_layers + EGLint *num_layers + + + EGLBoolean eglGetOutputPortsEXT + EGLDisplay dpy + const EGLAttrib *attrib_list + EGLOutputPortEXT *ports + EGLint max_ports + EGLint *num_ports + + + EGLDisplay eglGetPlatformDisplay + EGLenum platform + void *native_display + const EGLAttrib *attrib_list + + + EGLDisplay eglGetPlatformDisplayEXT + EGLenum platform + void *native_display + const EGLint *attrib_list + + + __eglMustCastToProperFunctionPointerType eglGetProcAddress + const char *procname + + + EGLNativeFileDescriptorKHR eglGetStreamFileDescriptorKHR + EGLDisplay dpy + EGLStreamKHR stream + + + EGLBoolean eglGetSyncAttrib + EGLDisplay dpy + EGLSync sync + EGLint attribute + EGLAttrib *value + + + EGLBoolean eglGetSyncAttribKHR + EGLDisplay dpy + EGLSyncKHR sync + EGLint attribute + EGLint *value + + + EGLBoolean eglGetSyncAttribNV + EGLSyncNV sync + EGLint attribute + EGLint *value + + + EGLuint64NV eglGetSystemTimeFrequencyNV + + + EGLuint64NV eglGetSystemTimeNV + + + EGLBoolean eglInitialize + EGLDisplay dpy + EGLint *major + EGLint *minor + + + EGLint eglLabelObjectKHR + EGLDisplay display + EGLenum objectType + EGLObjectKHR object + EGLLabelKHR label + + + EGLBoolean eglLockSurfaceKHR + EGLDisplay dpy + EGLSurface surface + const EGLint *attrib_list + + + EGLBoolean eglMakeCurrent + EGLDisplay dpy + EGLSurface draw + EGLSurface read + EGLContext ctx + + + EGLBoolean eglOutputLayerAttribEXT + EGLDisplay dpy + EGLOutputLayerEXT layer + EGLint attribute + EGLAttrib value + + + EGLBoolean eglOutputPortAttribEXT + EGLDisplay dpy + EGLOutputPortEXT port + EGLint attribute + EGLAttrib value + + + EGLBoolean eglPostSubBufferNV + EGLDisplay dpy + EGLSurface surface + EGLint x + EGLint y + EGLint width + EGLint height + + + EGLBoolean eglPresentationTimeANDROID + EGLDisplay dpy + EGLSurface surface + EGLnsecsANDROID time + + + EGLBoolean eglGetCompositorTimingSupportedANDROID + EGLDisplay dpy + EGLSurface surface + EGLint name + + + EGLBoolean eglGetCompositorTimingANDROID + EGLDisplay dpy + EGLSurface surface + EGLint numTimestamps + const EGLint *names + EGLnsecsANDROID *values + + + EGLBoolean eglGetNextFrameIdANDROID + EGLDisplay dpy + EGLSurface surface + EGLuint64KHR *frameId + + + EGLBoolean eglGetFrameTimestampSupportedANDROID + EGLDisplay dpy + EGLSurface surface + EGLint timestamp + + + EGLBoolean eglGetFrameTimestampsANDROID + EGLDisplay dpy + EGLSurface surface + EGLuint64KHR frameId + EGLint numTimestamps + const EGLint *timestamps + EGLnsecsANDROID *values + + + EGLenum eglQueryAPI + + + EGLBoolean eglQueryContext + EGLDisplay dpy + EGLContext ctx + EGLint attribute + EGLint *value + + + EGLBoolean eglQueryDebugKHR + EGLint attribute + EGLAttrib *value + + + EGLBoolean eglQueryDeviceAttribEXT + EGLDeviceEXT device + EGLint attribute + EGLAttrib *value + + + const char *eglQueryDeviceStringEXT + EGLDeviceEXT device + EGLint name + + + EGLBoolean eglQueryDevicesEXT + EGLint max_devices + EGLDeviceEXT *devices + EGLint *num_devices + + + EGLBoolean eglQueryDisplayAttribEXT + EGLDisplay dpy + EGLint attribute + EGLAttrib *value + + + + EGLBoolean eglQueryDisplayAttribKHR + EGLDisplay dpy + EGLint name + EGLAttrib *value + + + EGLBoolean eglQueryDisplayAttribNV + EGLDisplay dpy + EGLint attribute + EGLAttrib *value + + + + EGLBoolean eglQueryDmaBufFormatsEXT + EGLDisplay dpy + EGLint max_formats + EGLint *formats + EGLint *num_formats + + + EGLBoolean eglQueryDmaBufModifiersEXT + EGLDisplay dpy + EGLint format + EGLint max_modifiers + EGLuint64KHR *modifiers + EGLBoolean *external_only + EGLint *num_modifiers + + + EGLBoolean eglQueryNativeDisplayNV + EGLDisplay dpy + EGLNativeDisplayType *display_id + + + EGLBoolean eglQueryNativePixmapNV + EGLDisplay dpy + EGLSurface surf + EGLNativePixmapType *pixmap + + + EGLBoolean eglQueryNativeWindowNV + EGLDisplay dpy + EGLSurface surf + EGLNativeWindowType *window + + + EGLBoolean eglQueryOutputLayerAttribEXT + EGLDisplay dpy + EGLOutputLayerEXT layer + EGLint attribute + EGLAttrib *value + + + const char *eglQueryOutputLayerStringEXT + EGLDisplay dpy + EGLOutputLayerEXT layer + EGLint name + + + EGLBoolean eglQueryOutputPortAttribEXT + EGLDisplay dpy + EGLOutputPortEXT port + EGLint attribute + EGLAttrib *value + + + const char *eglQueryOutputPortStringEXT + EGLDisplay dpy + EGLOutputPortEXT port + EGLint name + + + EGLBoolean eglQueryStreamKHR + EGLDisplay dpy + EGLStreamKHR stream + EGLenum attribute + EGLint *value + + + EGLBoolean eglQueryStreamAttribKHR + EGLDisplay dpy + EGLStreamKHR stream + EGLenum attribute + EGLAttrib *value + + + EGLBoolean eglQueryStreamMetadataNV + EGLDisplay dpy + EGLStreamKHR stream + EGLenum name + EGLint n + EGLint offset + EGLint size + void *data + + + EGLBoolean eglQueryStreamTimeKHR + EGLDisplay dpy + EGLStreamKHR stream + EGLenum attribute + EGLTimeKHR *value + + + EGLBoolean eglQueryStreamu64KHR + EGLDisplay dpy + EGLStreamKHR stream + EGLenum attribute + EGLuint64KHR *value + + + const char *eglQueryString + EGLDisplay dpy + EGLint name + + + EGLBoolean eglQuerySurface + EGLDisplay dpy + EGLSurface surface + EGLint attribute + EGLint *value + + + EGLBoolean eglQuerySurface64KHR + EGLDisplay dpy + EGLSurface surface + EGLint attribute + EGLAttribKHR *value + + + EGLBoolean eglQuerySurfacePointerANGLE + EGLDisplay dpy + EGLSurface surface + EGLint attribute + void **value + + + EGLBoolean eglReleaseTexImage + EGLDisplay dpy + EGLSurface surface + EGLint buffer + + + EGLBoolean eglReleaseThread + + + EGLBoolean eglResetStreamNV + EGLDisplay dpy + EGLStreamKHR stream + + + void eglSetBlobCacheFuncsANDROID + EGLDisplay dpy + EGLSetBlobFuncANDROID set + EGLGetBlobFuncANDROID get + + + EGLBoolean eglSetDamageRegionKHR + EGLDisplay dpy + EGLSurface surface + EGLint *rects + EGLint n_rects + + + EGLBoolean eglSetStreamAttribKHR + EGLDisplay dpy + EGLStreamKHR stream + EGLenum attribute + EGLAttrib value + + + EGLBoolean eglSetStreamMetadataNV + EGLDisplay dpy + EGLStreamKHR stream + EGLint n + EGLint offset + EGLint size + const void *data + + + EGLBoolean eglSignalSyncKHR + EGLDisplay dpy + EGLSyncKHR sync + EGLenum mode + + + EGLBoolean eglSignalSyncNV + EGLSyncNV sync + EGLenum mode + + + EGLBoolean eglStreamAttribKHR + EGLDisplay dpy + EGLStreamKHR stream + EGLenum attribute + EGLint value + + + EGLBoolean eglStreamConsumerAcquireKHR + EGLDisplay dpy + EGLStreamKHR stream + + + EGLBoolean eglStreamConsumerAcquireAttribKHR + EGLDisplay dpy + EGLStreamKHR stream + const EGLAttrib *attrib_list + + + EGLBoolean eglStreamConsumerGLTextureExternalKHR + EGLDisplay dpy + EGLStreamKHR stream + + + EGLBoolean eglStreamConsumerGLTextureExternalAttribsNV + EGLDisplay dpy + EGLStreamKHR stream + const EGLAttrib *attrib_list + + + EGLBoolean eglStreamConsumerOutputEXT + EGLDisplay dpy + EGLStreamKHR stream + EGLOutputLayerEXT layer + + + EGLBoolean eglStreamConsumerReleaseKHR + EGLDisplay dpy + EGLStreamKHR stream + + + EGLBoolean eglStreamConsumerReleaseAttribKHR + EGLDisplay dpy + EGLStreamKHR stream + const EGLAttrib *attrib_list + + + EGLBoolean eglStreamFlushNV + EGLDisplay dpy + EGLStreamKHR stream + + + EGLBoolean eglSurfaceAttrib + EGLDisplay dpy + EGLSurface surface + EGLint attribute + EGLint value + + + EGLBoolean eglSwapBuffers + EGLDisplay dpy + EGLSurface surface + + + EGLBoolean eglSwapBuffersWithDamageEXT + EGLDisplay dpy + EGLSurface surface + EGLint *rects + EGLint n_rects + + + EGLBoolean eglSwapBuffersWithDamageKHR + EGLDisplay dpy + EGLSurface surface + EGLint *rects + EGLint n_rects + + + EGLBoolean eglSwapBuffersRegionNOK + EGLDisplay dpy + EGLSurface surface + EGLint numRects + const EGLint *rects + + + EGLBoolean eglSwapBuffersRegion2NOK + EGLDisplay dpy + EGLSurface surface + EGLint numRects + const EGLint *rects + + + EGLBoolean eglSwapInterval + EGLDisplay dpy + EGLint interval + + + EGLBoolean eglTerminate + EGLDisplay dpy + + + EGLBoolean eglUnlockSurfaceKHR + EGLDisplay dpy + EGLSurface surface + + + EGLBoolean eglUnsignalSyncEXT + EGLDisplay dpy + EGLSync sync + const EGLAttrib *attrib_list + + + EGLBoolean eglWaitClient + + + EGLBoolean eglWaitGL + + + EGLBoolean eglWaitNative + EGLint engine + + + EGLBoolean eglWaitSync + EGLDisplay dpy + EGLSync sync + EGLint flags + + + EGLint eglWaitSyncKHR + EGLDisplay dpy + EGLSyncKHR sync + EGLint flags + + + EGLBoolean eglCompositorSetContextListEXT + const EGLint *external_ref_ids + EGLint num_entries + + + EGLBoolean eglCompositorSetContextAttributesEXT + EGLint external_ref_id + const EGLint *context_attributes + EGLint num_entries + + + EGLBoolean eglCompositorSetWindowListEXT + EGLint external_ref_id + const EGLint *external_win_ids + EGLint num_entries + + + EGLBoolean eglCompositorSetWindowAttributesEXT + EGLint external_win_id + const EGLint *window_attributes + EGLint num_entries + + + EGLBoolean eglCompositorBindTexWindowEXT + EGLint external_win_id + + + EGLBoolean eglCompositorSetSizeEXT + EGLint external_win_id + EGLint width + EGLint height + + + EGLBoolean eglCompositorSwapPolicyEXT + EGLint external_win_id + EGLint policy + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/local/recipes/libs/libepoxy/source/registry/gl.xml b/local/recipes/libs/libepoxy/source/registry/gl.xml new file mode 100644 index 0000000000..84fd26b79a --- /dev/null +++ b/local/recipes/libs/libepoxy/source/registry/gl.xml @@ -0,0 +1,51429 @@ + + + +Copyright (c) 2013-2018 The Khronos Group Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +------------------------------------------------------------------------ + +This file, gl.xml, is the OpenGL and OpenGL API Registry. The canonical +version of the registry, together with documentation, schema, and Python +generator scripts used to generate C header files for OpenGL and OpenGL ES, +can always be found in the Khronos Registry at + https://github.com/KhronosGroup/OpenGL-Registry + + + + + + #include <KHR/khrplatform.h> + + typedef unsigned int GLenum; + typedef unsigned char GLboolean; + typedef unsigned int GLbitfield; + typedef void GLvoid; + typedef khronos_int8_t GLbyte; + typedef khronos_uint8_t GLubyte; + typedef khronos_int16_t GLshort; + typedef khronos_uint16_t GLushort; + typedef int GLint; + typedef unsigned int GLuint; + typedef khronos_int32_t GLclampx; + typedef int GLsizei; + typedef khronos_float_t GLfloat; + typedef khronos_float_t GLclampf; + typedef double GLdouble; + typedef double GLclampd; + typedef void *GLeglClientBufferEXT; + typedef void *GLeglImageOES; + typedef char GLchar; + typedef char GLcharARB; + #ifdef __APPLE__ +typedef void *GLhandleARB; +#else +typedef unsigned int GLhandleARB; +#endif + typedef khronos_uint16_t GLhalf; + typedef khronos_uint16_t GLhalfARB; + typedef khronos_int32_t GLfixed; + typedef khronos_intptr_t GLintptr; + typedef khronos_intptr_t GLintptrARB; + typedef khronos_ssize_t GLsizeiptr; + typedef khronos_ssize_t GLsizeiptrARB; + typedef khronos_int64_t GLint64; + typedef khronos_int64_t GLint64EXT; + typedef khronos_uint64_t GLuint64; + typedef khronos_uint64_t GLuint64EXT; + typedef struct __GLsync *GLsync; + struct _cl_context; + struct _cl_event; + typedef void ( *GLDEBUGPROC)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); + typedef void ( *GLDEBUGPROCARB)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); + typedef void ( *GLDEBUGPROCKHR)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); + + + typedef void ( *GLDEBUGPROCAMD)(GLuint id,GLenum category,GLenum severity,GLsizei length,const GLchar *message,void *userParam); + typedef unsigned short GLhalfNV; + typedef GLintptr GLvdpauSurfaceNV; + typedef void ( *GLVULKANPROCNV)(void); + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + void glAccum + GLenum op + GLfloat value + + + + void glAccumxOES + GLenum op + GLfixed value + + + void glActiveProgramEXT + GLuint program + + + void glActiveShaderProgram + GLuint pipeline + GLuint program + + + void glActiveShaderProgramEXT + GLuint pipeline + GLuint program + + + void glActiveStencilFaceEXT + GLenum face + + + + void glActiveTexture + GLenum texture + + + + void glActiveTextureARB + GLenum texture + + + + + void glActiveVaryingNV + GLuint program + const GLchar *name + + + void glAlphaFragmentOp1ATI + GLenum op + GLuint dst + GLuint dstMod + GLuint arg1 + GLuint arg1Rep + GLuint arg1Mod + + + void glAlphaFragmentOp2ATI + GLenum op + GLuint dst + GLuint dstMod + GLuint arg1 + GLuint arg1Rep + GLuint arg1Mod + GLuint arg2 + GLuint arg2Rep + GLuint arg2Mod + + + void glAlphaFragmentOp3ATI + GLenum op + GLuint dst + GLuint dstMod + GLuint arg1 + GLuint arg1Rep + GLuint arg1Mod + GLuint arg2 + GLuint arg2Rep + GLuint arg2Mod + GLuint arg3 + GLuint arg3Rep + GLuint arg3Mod + + + void glAlphaFunc + GLenum func + GLfloat ref + + + + void glAlphaFuncQCOM + GLenum func + GLclampf ref + + + void glAlphaFuncx + GLenum func + GLfixed ref + + + void glAlphaFuncxOES + GLenum func + GLfixed ref + + + void glAlphaToCoverageDitherControlNV + GLenum mode + + + void glApplyFramebufferAttachmentCMAAINTEL + + + void glApplyTextureEXT + GLenum mode + + + GLboolean glAcquireKeyedMutexWin32EXT + GLuint memory + GLuint64 key + GLuint timeout + + + GLboolean glAreProgramsResidentNV + GLsizei n + const GLuint *programs + GLboolean *residences + + + + GLboolean glAreTexturesResident + GLsizei n + const GLuint *textures + GLboolean *residences + + + + GLboolean glAreTexturesResidentEXT + GLsizei n + const GLuint *textures + GLboolean *residences + + + + void glArrayElement + GLint i + + + void glArrayElementEXT + GLint i + + + + void glArrayObjectATI + GLenum array + GLint size + GLenum type + GLsizei stride + GLuint buffer + GLuint offset + + + GLuint glAsyncCopyBufferSubDataNVX + GLsizei waitSemaphoreCount + const GLuint *waitSemaphoreArray + const GLuint64 *fenceValueArray + GLuint readGpu + GLbitfield writeGpuMask + GLuint readBuffer + GLuint writeBuffer + GLintptr readOffset + GLintptr writeOffset + GLsizeiptr size + GLsizei signalSemaphoreCount + const GLuint *signalSemaphoreArray + const GLuint64 *signalValueArray + + + GLuint glAsyncCopyImageSubDataNVX + GLsizei waitSemaphoreCount + const GLuint *waitSemaphoreArray + const GLuint64 *waitValueArray + GLuint srcGpu + GLbitfield dstGpuMask + GLuint srcName + GLenum srcTarget + GLint srcLevel + GLint srcX + GLint srcY + GLint srcZ + GLuint dstName + GLenum dstTarget + GLint dstLevel + GLint dstX + GLint dstY + GLint dstZ + GLsizei srcWidth + GLsizei srcHeight + GLsizei srcDepth + GLsizei signalSemaphoreCount + const GLuint *signalSemaphoreArray + const GLuint64 *signalValueArray + + + void glAsyncMarkerSGIX + GLuint marker + + + void glAttachObjectARB + GLhandleARB containerObj + GLhandleARB obj + + + + void glAttachShader + GLuint program + GLuint shader + + + void glBegin + GLenum mode + + + + void glBeginConditionalRender + GLuint id + GLenum mode + + + void glBeginConditionalRenderNV + GLuint id + GLenum mode + + + + + void glBeginConditionalRenderNVX + GLuint id + + + void glBeginFragmentShaderATI + + + void glBeginOcclusionQueryNV + GLuint id + + + void glBeginPerfMonitorAMD + GLuint monitor + + + void glBeginPerfQueryINTEL + GLuint queryHandle + + + void glBeginQuery + GLenum target + GLuint id + + + + void glBeginQueryARB + GLenum target + GLuint id + + + + void glBeginQueryEXT + GLenum target + GLuint id + + + void glBeginQueryIndexed + GLenum target + GLuint index + GLuint id + + + void glBeginTransformFeedback + GLenum primitiveMode + + + + void glBeginTransformFeedbackEXT + GLenum primitiveMode + + + + void glBeginTransformFeedbackNV + GLenum primitiveMode + + + + void glBeginVertexShaderEXT + + + void glBeginVideoCaptureNV + GLuint video_capture_slot + + + void glBindAttribLocation + GLuint program + GLuint index + const GLchar *name + + + void glBindAttribLocationARB + GLhandleARB programObj + GLuint index + const GLcharARB *name + + + + void glBindBuffer + GLenum target + GLuint buffer + + + void glBindBufferARB + GLenum target + GLuint buffer + + + + void glBindBufferBase + GLenum target + GLuint index + GLuint buffer + + + + void glBindBufferBaseEXT + GLenum target + GLuint index + GLuint buffer + + + + void glBindBufferBaseNV + GLenum target + GLuint index + GLuint buffer + + + + void glBindBufferOffsetEXT + GLenum target + GLuint index + GLuint buffer + GLintptr offset + + + void glBindBufferOffsetNV + GLenum target + GLuint index + GLuint buffer + GLintptr offset + + + + void glBindBufferRange + GLenum target + GLuint index + GLuint buffer + GLintptr offset + GLsizeiptr size + + + + void glBindBufferRangeEXT + GLenum target + GLuint index + GLuint buffer + GLintptr offset + GLsizeiptr size + + + + void glBindBufferRangeNV + GLenum target + GLuint index + GLuint buffer + GLintptr offset + GLsizeiptr size + + + + void glBindBuffersBase + GLenum target + GLuint first + GLsizei count + const GLuint *buffers + + + void glBindBuffersRange + GLenum target + GLuint first + GLsizei count + const GLuint *buffers + const GLintptr *offsets + const GLsizeiptr *sizes + + + void glBindFragDataLocation + GLuint program + GLuint color + const GLchar *name + + + void glBindFragDataLocationEXT + GLuint program + GLuint color + const GLchar *name + + + + void glBindFragDataLocationIndexed + GLuint program + GLuint colorNumber + GLuint index + const GLchar *name + + + void glBindFragDataLocationIndexedEXT + GLuint program + GLuint colorNumber + GLuint index + const GLchar *name + + + + void glBindFragmentShaderATI + GLuint id + + + void glBindFramebuffer + GLenum target + GLuint framebuffer + + + + void glBindFramebufferEXT + GLenum target + GLuint framebuffer + + + + void glBindFramebufferOES + GLenum target + GLuint framebuffer + + + void glBindImageTexture + GLuint unit + GLuint texture + GLint level + GLboolean layered + GLint layer + GLenum access + GLenum format + + + void glBindImageTextureEXT + GLuint index + GLuint texture + GLint level + GLboolean layered + GLint layer + GLenum access + GLint format + + + void glBindImageTextures + GLuint first + GLsizei count + const GLuint *textures + + + GLuint glBindLightParameterEXT + GLenum light + GLenum value + + + GLuint glBindMaterialParameterEXT + GLenum face + GLenum value + + + void glBindMultiTextureEXT + GLenum texunit + GLenum target + GLuint texture + + + GLuint glBindParameterEXT + GLenum value + + + void glBindProgramARB + GLenum target + GLuint program + + + + void glBindProgramNV + GLenum target + GLuint id + + + + + void glBindProgramPipeline + GLuint pipeline + + + void glBindProgramPipelineEXT + GLuint pipeline + + + void glBindRenderbuffer + GLenum target + GLuint renderbuffer + + + + void glBindRenderbufferEXT + GLenum target + GLuint renderbuffer + + + + void glBindRenderbufferOES + GLenum target + GLuint renderbuffer + + + void glBindSampler + GLuint unit + GLuint sampler + + + void glBindSamplers + GLuint first + GLsizei count + const GLuint *samplers + + + void glBindShadingRateImageNV + GLuint texture + + + GLuint glBindTexGenParameterEXT + GLenum unit + GLenum coord + GLenum value + + + void glBindTexture + GLenum target + GLuint texture + + + + void glBindTextureEXT + GLenum target + GLuint texture + + + + + void glBindTextureUnit + GLuint unit + GLuint texture + + + GLuint glBindTextureUnitParameterEXT + GLenum unit + GLenum value + + + void glBindTextures + GLuint first + GLsizei count + const GLuint *textures + + + void glBindTransformFeedback + GLenum target + GLuint id + + + void glBindTransformFeedbackNV + GLenum target + GLuint id + + + void glBindVertexArray + GLuint array + + + + void glBindVertexArrayAPPLE + GLuint array + + + void glBindVertexArrayOES + GLuint array + + + + void glBindVertexBuffer + GLuint bindingindex + GLuint buffer + GLintptr offset + GLsizei stride + + + void glBindVertexBuffers + GLuint first + GLsizei count + const GLuint *buffers + const GLintptr *offsets + const GLsizei *strides + + + void glBindVertexShaderEXT + GLuint id + + + void glBindVideoCaptureStreamBufferNV + GLuint video_capture_slot + GLuint stream + GLenum frame_region + GLintptrARB offset + + + void glBindVideoCaptureStreamTextureNV + GLuint video_capture_slot + GLuint stream + GLenum frame_region + GLenum target + GLuint texture + + + void glBinormal3bEXT + GLbyte bx + GLbyte by + GLbyte bz + + + + void glBinormal3bvEXT + const GLbyte *v + + + void glBinormal3dEXT + GLdouble bx + GLdouble by + GLdouble bz + + + + void glBinormal3dvEXT + const GLdouble *v + + + void glBinormal3fEXT + GLfloat bx + GLfloat by + GLfloat bz + + + + void glBinormal3fvEXT + const GLfloat *v + + + void glBinormal3iEXT + GLint bx + GLint by + GLint bz + + + + void glBinormal3ivEXT + const GLint *v + + + void glBinormal3sEXT + GLshort bx + GLshort by + GLshort bz + + + + void glBinormal3svEXT + const GLshort *v + + + void glBinormalPointerEXT + GLenum type + GLsizei stride + const void *pointer + + + void glBitmap + GLsizei width + GLsizei height + GLfloat xorig + GLfloat yorig + GLfloat xmove + GLfloat ymove + const GLubyte *bitmap + + + + + void glBitmapxOES + GLsizei width + GLsizei height + GLfixed xorig + GLfixed yorig + GLfixed xmove + GLfixed ymove + const GLubyte *bitmap + + + void glBlendBarrier + + + void glBlendBarrierKHR + + + + void glBlendBarrierNV + + + + void glBlendColor + GLfloat red + GLfloat green + GLfloat blue + GLfloat alpha + + + + void glBlendColorEXT + GLfloat red + GLfloat green + GLfloat blue + GLfloat alpha + + + + + void glBlendColorxOES + GLfixed red + GLfixed green + GLfixed blue + GLfixed alpha + + + void glBlendEquation + GLenum mode + + + + void glBlendEquationEXT + GLenum mode + + + + + void glBlendEquationIndexedAMD + GLuint buf + GLenum mode + + + + void glBlendEquationOES + GLenum mode + + + void glBlendEquationSeparate + GLenum modeRGB + GLenum modeAlpha + + + + void glBlendEquationSeparateEXT + GLenum modeRGB + GLenum modeAlpha + + + + + void glBlendEquationSeparateIndexedAMD + GLuint buf + GLenum modeRGB + GLenum modeAlpha + + + + void glBlendEquationSeparateOES + GLenum modeRGB + GLenum modeAlpha + + + void glBlendEquationSeparatei + GLuint buf + GLenum modeRGB + GLenum modeAlpha + + + void glBlendEquationSeparateiARB + GLuint buf + GLenum modeRGB + GLenum modeAlpha + + + + void glBlendEquationSeparateiEXT + GLuint buf + GLenum modeRGB + GLenum modeAlpha + + + + void glBlendEquationSeparateiOES + GLuint buf + GLenum modeRGB + GLenum modeAlpha + + + + void glBlendEquationi + GLuint buf + GLenum mode + + + void glBlendEquationiARB + GLuint buf + GLenum mode + + + + void glBlendEquationiEXT + GLuint buf + GLenum mode + + + + void glBlendEquationiOES + GLuint buf + GLenum mode + + + + void glBlendFunc + GLenum sfactor + GLenum dfactor + + + + void glBlendFuncIndexedAMD + GLuint buf + GLenum src + GLenum dst + + + + void glBlendFuncSeparate + GLenum sfactorRGB + GLenum dfactorRGB + GLenum sfactorAlpha + GLenum dfactorAlpha + + + + void glBlendFuncSeparateEXT + GLenum sfactorRGB + GLenum dfactorRGB + GLenum sfactorAlpha + GLenum dfactorAlpha + + + + + void glBlendFuncSeparateINGR + GLenum sfactorRGB + GLenum dfactorRGB + GLenum sfactorAlpha + GLenum dfactorAlpha + + + + + void glBlendFuncSeparateIndexedAMD + GLuint buf + GLenum srcRGB + GLenum dstRGB + GLenum srcAlpha + GLenum dstAlpha + + + + void glBlendFuncSeparateOES + GLenum srcRGB + GLenum dstRGB + GLenum srcAlpha + GLenum dstAlpha + + + void glBlendFuncSeparatei + GLuint buf + GLenum srcRGB + GLenum dstRGB + GLenum srcAlpha + GLenum dstAlpha + + + void glBlendFuncSeparateiARB + GLuint buf + GLenum srcRGB + GLenum dstRGB + GLenum srcAlpha + GLenum dstAlpha + + + + void glBlendFuncSeparateiEXT + GLuint buf + GLenum srcRGB + GLenum dstRGB + GLenum srcAlpha + GLenum dstAlpha + + + + void glBlendFuncSeparateiOES + GLuint buf + GLenum srcRGB + GLenum dstRGB + GLenum srcAlpha + GLenum dstAlpha + + + + void glBlendFunci + GLuint buf + GLenum src + GLenum dst + + + void glBlendFunciARB + GLuint buf + GLenum src + GLenum dst + + + + void glBlendFunciEXT + GLuint buf + GLenum src + GLenum dst + + + + void glBlendFunciOES + GLuint buf + GLenum src + GLenum dst + + + + void glBlendParameteriNV + GLenum pname + GLint value + + + void glBlitFramebuffer + GLint srcX0 + GLint srcY0 + GLint srcX1 + GLint srcY1 + GLint dstX0 + GLint dstY0 + GLint dstX1 + GLint dstY1 + GLbitfield mask + GLenum filter + + + + void glBlitFramebufferANGLE + GLint srcX0 + GLint srcY0 + GLint srcX1 + GLint srcY1 + GLint dstX0 + GLint dstY0 + GLint dstX1 + GLint dstY1 + GLbitfield mask + GLenum filter + + + void glBlitFramebufferEXT + GLint srcX0 + GLint srcY0 + GLint srcX1 + GLint srcY1 + GLint dstX0 + GLint dstY0 + GLint dstX1 + GLint dstY1 + GLbitfield mask + GLenum filter + + + + + void glBlitFramebufferNV + GLint srcX0 + GLint srcY0 + GLint srcX1 + GLint srcY1 + GLint dstX0 + GLint dstY0 + GLint dstX1 + GLint dstY1 + GLbitfield mask + GLenum filter + + + + void glBlitNamedFramebuffer + GLuint readFramebuffer + GLuint drawFramebuffer + GLint srcX0 + GLint srcY0 + GLint srcX1 + GLint srcY1 + GLint dstX0 + GLint dstY0 + GLint dstX1 + GLint dstY1 + GLbitfield mask + GLenum filter + + + void glBufferAddressRangeNV + GLenum pname + GLuint index + GLuint64EXT address + GLsizeiptr length + + + void glBufferAttachMemoryNV + GLenum target + GLuint memory + GLuint64 offset + + + void glBufferData + GLenum target + GLsizeiptr size + const void *data + GLenum usage + + + void glBufferDataARB + GLenum target + GLsizeiptrARB size + const void *data + GLenum usage + + + + void glBufferPageCommitmentARB + GLenum target + GLintptr offset + GLsizeiptr size + GLboolean commit + + + void glBufferParameteriAPPLE + GLenum target + GLenum pname + GLint param + + + void glBufferStorage + GLenum target + GLsizeiptr size + const void *data + GLbitfield flags + + + void glBufferStorageEXT + GLenum target + GLsizeiptr size + const void *data + GLbitfield flags + + + + void glBufferStorageExternalEXT + GLenum target + GLintptr offset + GLsizeiptr size + GLeglClientBufferEXT clientBuffer + GLbitfield flags + + + void glBufferStorageMemEXT + GLenum target + GLsizeiptr size + GLuint memory + GLuint64 offset + + + void glBufferSubData + GLenum target + GLintptr offset + GLsizeiptr size + const void *data + + + void glBufferSubDataARB + GLenum target + GLintptrARB offset + GLsizeiptrARB size + const void *data + + + + void glCallCommandListNV + GLuint list + + + void glCallList + GLuint list + + + + void glCallLists + GLsizei n + GLenum type + const void *lists + + + + GLenum glCheckFramebufferStatus + GLenum target + + + + GLenum glCheckFramebufferStatusEXT + GLenum target + + + + + GLenum glCheckFramebufferStatusOES + GLenum target + + + GLenum glCheckNamedFramebufferStatus + GLuint framebuffer + GLenum target + + + GLenum glCheckNamedFramebufferStatusEXT + GLuint framebuffer + GLenum target + + + void glClampColor + GLenum target + GLenum clamp + + + + void glClampColorARB + GLenum target + GLenum clamp + + + + + void glClear + GLbitfield mask + + + + void glClearAccum + GLfloat red + GLfloat green + GLfloat blue + GLfloat alpha + + + + void glClearAccumxOES + GLfixed red + GLfixed green + GLfixed blue + GLfixed alpha + + + void glClearBufferData + GLenum target + GLenum internalformat + GLenum format + GLenum type + const void *data + + + void glClearBufferSubData + GLenum target + GLenum internalformat + GLintptr offset + GLsizeiptr size + GLenum format + GLenum type + const void *data + + + void glClearBufferfi + GLenum buffer + GLint drawbuffer + GLfloat depth + GLint stencil + + + + void glClearBufferfv + GLenum buffer + GLint drawbuffer + const GLfloat *value + + + + void glClearBufferiv + GLenum buffer + GLint drawbuffer + const GLint *value + + + + void glClearBufferuiv + GLenum buffer + GLint drawbuffer + const GLuint *value + + + + void glClearColor + GLfloat red + GLfloat green + GLfloat blue + GLfloat alpha + + + + void glClearColorIiEXT + GLint red + GLint green + GLint blue + GLint alpha + + + + void glClearColorIuiEXT + GLuint red + GLuint green + GLuint blue + GLuint alpha + + + + void glClearColorx + GLfixed red + GLfixed green + GLfixed blue + GLfixed alpha + + + void glClearColorxOES + GLfixed red + GLfixed green + GLfixed blue + GLfixed alpha + + + void glClearDepth + GLdouble depth + + + + void glClearDepthdNV + GLdouble depth + + + + void glClearDepthf + GLfloat d + + + void glClearDepthfOES + GLclampf depth + + + + + void glClearDepthx + GLfixed depth + + + void glClearDepthxOES + GLfixed depth + + + void glClearIndex + GLfloat c + + + + void glClearNamedBufferData + GLuint buffer + GLenum internalformat + GLenum format + GLenum type + const void *data + + + void glClearNamedBufferDataEXT + GLuint buffer + GLenum internalformat + GLenum format + GLenum type + const void *data + + + void glClearNamedBufferSubData + GLuint buffer + GLenum internalformat + GLintptr offset + GLsizeiptr size + GLenum format + GLenum type + const void *data + + + void glClearNamedBufferSubDataEXT + GLuint buffer + GLenum internalformat + GLsizeiptr offset + GLsizeiptr size + GLenum format + GLenum type + const void *data + + + void glClearNamedFramebufferfi + GLuint framebuffer + GLenum buffer + GLint drawbuffer + GLfloat depth + GLint stencil + + + void glClearNamedFramebufferfv + GLuint framebuffer + GLenum buffer + GLint drawbuffer + const GLfloat *value + + + void glClearNamedFramebufferiv + GLuint framebuffer + GLenum buffer + GLint drawbuffer + const GLint *value + + + void glClearNamedFramebufferuiv + GLuint framebuffer + GLenum buffer + GLint drawbuffer + const GLuint *value + + + void glClearPixelLocalStorageuiEXT + GLsizei offset + GLsizei n + const GLuint *values + + + void glClearStencil + GLint s + + + + void glClearTexImage + GLuint texture + GLint level + GLenum format + GLenum type + const void *data + + + void glClearTexImageEXT + GLuint texture + GLint level + GLenum format + GLenum type + const void *data + + + + void glClearTexSubImage + GLuint texture + GLint level + GLint xoffset + GLint yoffset + GLint zoffset + GLsizei width + GLsizei height + GLsizei depth + GLenum format + GLenum type + const void *data + + + void glClearTexSubImageEXT + GLuint texture + GLint level + GLint xoffset + GLint yoffset + GLint zoffset + GLsizei width + GLsizei height + GLsizei depth + GLenum format + GLenum type + const void *data + + + + void glClientActiveTexture + GLenum texture + + + void glClientActiveTextureARB + GLenum texture + + + + void glClientActiveVertexStreamATI + GLenum stream + + + void glClientAttribDefaultEXT + GLbitfield mask + + + void glClientWaitSemaphoreui64NVX + GLsizei fenceObjectCount + const GLuint *semaphoreArray + const GLuint64 *fenceValueArray + + + GLenum glClientWaitSync + GLsync sync + GLbitfield flags + GLuint64 timeout + + + GLenum glClientWaitSyncAPPLE + GLsync sync + GLbitfield flags + GLuint64 timeout + + + + void glClipControl + GLenum origin + GLenum depth + + + void glClipControlEXT + GLenum origin + GLenum depth + + + + void glClipPlane + GLenum plane + const GLdouble *equation + + + + void glClipPlanef + GLenum p + const GLfloat *eqn + + + void glClipPlanefIMG + GLenum p + const GLfloat *eqn + + + void glClipPlanefOES + GLenum plane + const GLfloat *equation + + + + void glClipPlanex + GLenum plane + const GLfixed *equation + + + void glClipPlanexIMG + GLenum p + const GLfixed *eqn + + + void glClipPlanexOES + GLenum plane + const GLfixed *equation + + + void glColor3b + GLbyte red + GLbyte green + GLbyte blue + + + + void glColor3bv + const GLbyte *v + + + + void glColor3d + GLdouble red + GLdouble green + GLdouble blue + + + + void glColor3dv + const GLdouble *v + + + + void glColor3f + GLfloat red + GLfloat green + GLfloat blue + + + + void glColor3fVertex3fSUN + GLfloat r + GLfloat g + GLfloat b + GLfloat x + GLfloat y + GLfloat z + + + void glColor3fVertex3fvSUN + const GLfloat *c + const GLfloat *v + + + void glColor3fv + const GLfloat *v + + + + void glColor3hNV + GLhalfNV red + GLhalfNV green + GLhalfNV blue + + + + void glColor3hvNV + const GLhalfNV *v + + + + void glColor3i + GLint red + GLint green + GLint blue + + + + void glColor3iv + const GLint *v + + + + void glColor3s + GLshort red + GLshort green + GLshort blue + + + + void glColor3sv + const GLshort *v + + + + void glColor3ub + GLubyte red + GLubyte green + GLubyte blue + + + + void glColor3ubv + const GLubyte *v + + + + void glColor3ui + GLuint red + GLuint green + GLuint blue + + + + void glColor3uiv + const GLuint *v + + + + void glColor3us + GLushort red + GLushort green + GLushort blue + + + + void glColor3usv + const GLushort *v + + + + void glColor3xOES + GLfixed red + GLfixed green + GLfixed blue + + + void glColor3xvOES + const GLfixed *components + + + void glColor4b + GLbyte red + GLbyte green + GLbyte blue + GLbyte alpha + + + + void glColor4bv + const GLbyte *v + + + + void glColor4d + GLdouble red + GLdouble green + GLdouble blue + GLdouble alpha + + + + void glColor4dv + const GLdouble *v + + + + void glColor4f + GLfloat red + GLfloat green + GLfloat blue + GLfloat alpha + + + + void glColor4fNormal3fVertex3fSUN + GLfloat r + GLfloat g + GLfloat b + GLfloat a + GLfloat nx + GLfloat ny + GLfloat nz + GLfloat x + GLfloat y + GLfloat z + + + void glColor4fNormal3fVertex3fvSUN + const GLfloat *c + const GLfloat *n + const GLfloat *v + + + void glColor4fv + const GLfloat *v + + + + void glColor4hNV + GLhalfNV red + GLhalfNV green + GLhalfNV blue + GLhalfNV alpha + + + + void glColor4hvNV + const GLhalfNV *v + + + + void glColor4i + GLint red + GLint green + GLint blue + GLint alpha + + + + void glColor4iv + const GLint *v + + + + void glColor4s + GLshort red + GLshort green + GLshort blue + GLshort alpha + + + + void glColor4sv + const GLshort *v + + + + void glColor4ub + GLubyte red + GLubyte green + GLubyte blue + GLubyte alpha + + + + void glColor4ubVertex2fSUN + GLubyte r + GLubyte g + GLubyte b + GLubyte a + GLfloat x + GLfloat y + + + void glColor4ubVertex2fvSUN + const GLubyte *c + const GLfloat *v + + + void glColor4ubVertex3fSUN + GLubyte r + GLubyte g + GLubyte b + GLubyte a + GLfloat x + GLfloat y + GLfloat z + + + void glColor4ubVertex3fvSUN + const GLubyte *c + const GLfloat *v + + + void glColor4ubv + const GLubyte *v + + + + void glColor4ui + GLuint red + GLuint green + GLuint blue + GLuint alpha + + + + void glColor4uiv + const GLuint *v + + + + void glColor4us + GLushort red + GLushort green + GLushort blue + GLushort alpha + + + + void glColor4usv + const GLushort *v + + + + void glColor4x + GLfixed red + GLfixed green + GLfixed blue + GLfixed alpha + + + void glColor4xOES + GLfixed red + GLfixed green + GLfixed blue + GLfixed alpha + + + void glColor4xvOES + const GLfixed *components + + + void glColorFormatNV + GLint size + GLenum type + GLsizei stride + + + void glColorFragmentOp1ATI + GLenum op + GLuint dst + GLuint dstMask + GLuint dstMod + GLuint arg1 + GLuint arg1Rep + GLuint arg1Mod + + + void glColorFragmentOp2ATI + GLenum op + GLuint dst + GLuint dstMask + GLuint dstMod + GLuint arg1 + GLuint arg1Rep + GLuint arg1Mod + GLuint arg2 + GLuint arg2Rep + GLuint arg2Mod + + + void glColorFragmentOp3ATI + GLenum op + GLuint dst + GLuint dstMask + GLuint dstMod + GLuint arg1 + GLuint arg1Rep + GLuint arg1Mod + GLuint arg2 + GLuint arg2Rep + GLuint arg2Mod + GLuint arg3 + GLuint arg3Rep + GLuint arg3Mod + + + void glColorMask + GLboolean red + GLboolean green + GLboolean blue + GLboolean alpha + + + + void glColorMaskIndexedEXT + GLuint index + GLboolean r + GLboolean g + GLboolean b + GLboolean a + + + + + void glColorMaski + GLuint index + GLboolean r + GLboolean g + GLboolean b + GLboolean a + + + void glColorMaskiEXT + GLuint index + GLboolean r + GLboolean g + GLboolean b + GLboolean a + + + + void glColorMaskiOES + GLuint index + GLboolean r + GLboolean g + GLboolean b + GLboolean a + + + + void glColorMaterial + GLenum face + GLenum mode + + + + void glColorP3ui + GLenum type + GLuint color + + + void glColorP3uiv + GLenum type + const GLuint *color + + + void glColorP4ui + GLenum type + GLuint color + + + void glColorP4uiv + GLenum type + const GLuint *color + + + void glColorPointer + GLint size + GLenum type + GLsizei stride + const void *pointer + + + void glColorPointerEXT + GLint size + GLenum type + GLsizei stride + GLsizei count + const void *pointer + + + void glColorPointerListIBM + GLint size + GLenum type + GLint stride + const void **pointer + GLint ptrstride + + + void glColorPointervINTEL + GLint size + GLenum type + const void **pointer + + + void glColorSubTable + GLenum target + GLsizei start + GLsizei count + GLenum format + GLenum type + const void *data + + + + + void glColorSubTableEXT + GLenum target + GLsizei start + GLsizei count + GLenum format + GLenum type + const void *data + + + + void glColorTable + GLenum target + GLenum internalformat + GLsizei width + GLenum format + GLenum type + const void *table + + + + + void glColorTableEXT + GLenum target + GLenum internalFormat + GLsizei width + GLenum format + GLenum type + const void *table + + + + void glColorTableParameterfv + GLenum target + GLenum pname + const GLfloat *params + + + + void glColorTableParameterfvSGI + GLenum target + GLenum pname + const GLfloat *params + + + + + void glColorTableParameteriv + GLenum target + GLenum pname + const GLint *params + + + + void glColorTableParameterivSGI + GLenum target + GLenum pname + const GLint *params + + + + + void glColorTableSGI + GLenum target + GLenum internalformat + GLsizei width + GLenum format + GLenum type + const void *table + + + + + void glCombinerInputNV + GLenum stage + GLenum portion + GLenum variable + GLenum input + GLenum mapping + GLenum componentUsage + + + + void glCombinerOutputNV + GLenum stage + GLenum portion + GLenum abOutput + GLenum cdOutput + GLenum sumOutput + GLenum scale + GLenum bias + GLboolean abDotProduct + GLboolean cdDotProduct + GLboolean muxSum + + + + void glCombinerParameterfNV + GLenum pname + GLfloat param + + + + void glCombinerParameterfvNV + GLenum pname + const GLfloat *params + + + + void glCombinerParameteriNV + GLenum pname + GLint param + + + + void glCombinerParameterivNV + GLenum pname + const GLint *params + + + + void glCombinerStageParameterfvNV + GLenum stage + GLenum pname + const GLfloat *params + + + void glCommandListSegmentsNV + GLuint list + GLuint segments + + + void glCompileCommandListNV + GLuint list + + + void glCompileShader + GLuint shader + + + void glCompileShaderARB + GLhandleARB shaderObj + + + + void glCompileShaderIncludeARB + GLuint shader + GLsizei count + const GLchar *const*path + const GLint *length + + + void glCompressedMultiTexImage1DEXT + GLenum texunit + GLenum target + GLint level + GLenum internalformat + GLsizei width + GLint border + GLsizei imageSize + const void *bits + + + void glCompressedMultiTexImage2DEXT + GLenum texunit + GLenum target + GLint level + GLenum internalformat + GLsizei width + GLsizei height + GLint border + GLsizei imageSize + const void *bits + + + void glCompressedMultiTexImage3DEXT + GLenum texunit + GLenum target + GLint level + GLenum internalformat + GLsizei width + GLsizei height + GLsizei depth + GLint border + GLsizei imageSize + const void *bits + + + void glCompressedMultiTexSubImage1DEXT + GLenum texunit + GLenum target + GLint level + GLint xoffset + GLsizei width + GLenum format + GLsizei imageSize + const void *bits + + + void glCompressedMultiTexSubImage2DEXT + GLenum texunit + GLenum target + GLint level + GLint xoffset + GLint yoffset + GLsizei width + GLsizei height + GLenum format + GLsizei imageSize + const void *bits + + + void glCompressedMultiTexSubImage3DEXT + GLenum texunit + GLenum target + GLint level + GLint xoffset + GLint yoffset + GLint zoffset + GLsizei width + GLsizei height + GLsizei depth + GLenum format + GLsizei imageSize + const void *bits + + + void glCompressedTexImage1D + GLenum target + GLint level + GLenum internalformat + GLsizei width + GLint border + GLsizei imageSize + const void *data + + + + + void glCompressedTexImage1DARB + GLenum target + GLint level + GLenum internalformat + GLsizei width + GLint border + GLsizei imageSize + const void *data + + + + + void glCompressedTexImage2D + GLenum target + GLint level + GLenum internalformat + GLsizei width + GLsizei height + GLint border + GLsizei imageSize + const void *data + + + + + void glCompressedTexImage2DARB + GLenum target + GLint level + GLenum internalformat + GLsizei width + GLsizei height + GLint border + GLsizei imageSize + const void *data + + + + + void glCompressedTexImage3D + GLenum target + GLint level + GLenum internalformat + GLsizei width + GLsizei height + GLsizei depth + GLint border + GLsizei imageSize + const void *data + + + + + void glCompressedTexImage3DARB + GLenum target + GLint level + GLenum internalformat + GLsizei width + GLsizei height + GLsizei depth + GLint border + GLsizei imageSize + const void *data + + + + + void glCompressedTexImage3DOES + GLenum target + GLint level + GLenum internalformat + GLsizei width + GLsizei height + GLsizei depth + GLint border + GLsizei imageSize + const void *data + + + void glCompressedTexSubImage1D + GLenum target + GLint level + GLint xoffset + GLsizei width + GLenum format + GLsizei imageSize + const void *data + + + + + void glCompressedTexSubImage1DARB + GLenum target + GLint level + GLint xoffset + GLsizei width + GLenum format + GLsizei imageSize + const void *data + + + + + void glCompressedTexSubImage2D + GLenum target + GLint level + GLint xoffset + GLint yoffset + GLsizei width + GLsizei height + GLenum format + GLsizei imageSize + const void *data + + + + + void glCompressedTexSubImage2DARB + GLenum target + GLint level + GLint xoffset + GLint yoffset + GLsizei width + GLsizei height + GLenum format + GLsizei imageSize + const void *data + + + + + void glCompressedTexSubImage3D + GLenum target + GLint level + GLint xoffset + GLint yoffset + GLint zoffset + GLsizei width + GLsizei height + GLsizei depth + GLenum format + GLsizei imageSize + const void *data + + + + + void glCompressedTexSubImage3DARB + GLenum target + GLint level + GLint xoffset + GLint yoffset + GLint zoffset + GLsizei width + GLsizei height + GLsizei depth + GLenum format + GLsizei imageSize + const void *data + + + + + void glCompressedTexSubImage3DOES + GLenum target + GLint level + GLint xoffset + GLint yoffset + GLint zoffset + GLsizei width + GLsizei height + GLsizei depth + GLenum format + GLsizei imageSize + const void *data + + + void glCompressedTextureImage1DEXT + GLuint texture + GLenum target + GLint level + GLenum internalformat + GLsizei width + GLint border + GLsizei imageSize + const void *bits + + + void glCompressedTextureImage2DEXT + GLuint texture + GLenum target + GLint level + GLenum internalformat + GLsizei width + GLsizei height + GLint border + GLsizei imageSize + const void *bits + + + void glCompressedTextureImage3DEXT + GLuint texture + GLenum target + GLint level + GLenum internalformat + GLsizei width + GLsizei height + GLsizei depth + GLint border + GLsizei imageSize + const void *bits + + + void glCompressedTextureSubImage1D + GLuint texture + GLint level + GLint xoffset + GLsizei width + GLenum format + GLsizei imageSize + const void *data + + + void glCompressedTextureSubImage1DEXT + GLuint texture + GLenum target + GLint level + GLint xoffset + GLsizei width + GLenum format + GLsizei imageSize + const void *bits + + + void glCompressedTextureSubImage2D + GLuint texture + GLint level + GLint xoffset + GLint yoffset + GLsizei width + GLsizei height + GLenum format + GLsizei imageSize + const void *data + + + void glCompressedTextureSubImage2DEXT + GLuint texture + GLenum target + GLint level + GLint xoffset + GLint yoffset + GLsizei width + GLsizei height + GLenum format + GLsizei imageSize + const void *bits + + + void glCompressedTextureSubImage3D + GLuint texture + GLint level + GLint xoffset + GLint yoffset + GLint zoffset + GLsizei width + GLsizei height + GLsizei depth + GLenum format + GLsizei imageSize + const void *data + + + void glCompressedTextureSubImage3DEXT + GLuint texture + GLenum target + GLint level + GLint xoffset + GLint yoffset + GLint zoffset + GLsizei width + GLsizei height + GLsizei depth + GLenum format + GLsizei imageSize + const void *bits + + + void glConservativeRasterParameterfNV + GLenum pname + GLfloat value + + + void glConservativeRasterParameteriNV + GLenum pname + GLint param + + + void glConvolutionFilter1D + GLenum target + GLenum internalformat + GLsizei width + GLenum format + GLenum type + const void *image + + + + + void glConvolutionFilter1DEXT + GLenum target + GLenum internalformat + GLsizei width + GLenum format + GLenum type + const void *image + + + + + void glConvolutionFilter2D + GLenum target + GLenum internalformat + GLsizei width + GLsizei height + GLenum format + GLenum type + const void *image + + + + + void glConvolutionFilter2DEXT + GLenum target + GLenum internalformat + GLsizei width + GLsizei height + GLenum format + GLenum type + const void *image + + + + + void glConvolutionParameterf + GLenum target + GLenum pname + GLfloat params + + + + void glConvolutionParameterfEXT + GLenum target + GLenum pname + GLfloat params + + + + + void glConvolutionParameterfv + GLenum target + GLenum pname + const GLfloat *params + + + + void glConvolutionParameterfvEXT + GLenum target + GLenum pname + const GLfloat *params + + + + + void glConvolutionParameteri + GLenum target + GLenum pname + GLint params + + + + void glConvolutionParameteriEXT + GLenum target + GLenum pname + GLint params + + + + + void glConvolutionParameteriv + GLenum target + GLenum pname + const GLint *params + + + + void glConvolutionParameterivEXT + GLenum target + GLenum pname + const GLint *params + + + + + void glConvolutionParameterxOES + GLenum target + GLenum pname + GLfixed param + + + void glConvolutionParameterxvOES + GLenum target + GLenum pname + const GLfixed *params + + + void glCopyBufferSubData + GLenum readTarget + GLenum writeTarget + GLintptr readOffset + GLintptr writeOffset + GLsizeiptr size + + + + void glCopyBufferSubDataNV + GLenum readTarget + GLenum writeTarget + GLintptr readOffset + GLintptr writeOffset + GLsizeiptr size + + + + void glCopyColorSubTable + GLenum target + GLsizei start + GLint x + GLint y + GLsizei width + + + + void glCopyColorSubTableEXT + GLenum target + GLsizei start + GLint x + GLint y + GLsizei width + + + + void glCopyColorTable + GLenum target + GLenum internalformat + GLint x + GLint y + GLsizei width + + + + void glCopyColorTableSGI + GLenum target + GLenum internalformat + GLint x + GLint y + GLsizei width + + + + + void glCopyConvolutionFilter1D + GLenum target + GLenum internalformat + GLint x + GLint y + GLsizei width + + + + void glCopyConvolutionFilter1DEXT + GLenum target + GLenum internalformat + GLint x + GLint y + GLsizei width + + + + + void glCopyConvolutionFilter2D + GLenum target + GLenum internalformat + GLint x + GLint y + GLsizei width + GLsizei height + + + + void glCopyConvolutionFilter2DEXT + GLenum target + GLenum internalformat + GLint x + GLint y + GLsizei width + GLsizei height + + + + + void glCopyImageSubData + GLuint srcName + GLenum srcTarget + GLint srcLevel + GLint srcX + GLint srcY + GLint srcZ + GLuint dstName + GLenum dstTarget + GLint dstLevel + GLint dstX + GLint dstY + GLint dstZ + GLsizei srcWidth + GLsizei srcHeight + GLsizei srcDepth + + + void glCopyImageSubDataEXT + GLuint srcName + GLenum srcTarget + GLint srcLevel + GLint srcX + GLint srcY + GLint srcZ + GLuint dstName + GLenum dstTarget + GLint dstLevel + GLint dstX + GLint dstY + GLint dstZ + GLsizei srcWidth + GLsizei srcHeight + GLsizei srcDepth + + + + void glCopyImageSubDataNV + GLuint srcName + GLenum srcTarget + GLint srcLevel + GLint srcX + GLint srcY + GLint srcZ + GLuint dstName + GLenum dstTarget + GLint dstLevel + GLint dstX + GLint dstY + GLint dstZ + GLsizei width + GLsizei height + GLsizei depth + + + + void glCopyImageSubDataOES + GLuint srcName + GLenum srcTarget + GLint srcLevel + GLint srcX + GLint srcY + GLint srcZ + GLuint dstName + GLenum dstTarget + GLint dstLevel + GLint dstX + GLint dstY + GLint dstZ + GLsizei srcWidth + GLsizei srcHeight + GLsizei srcDepth + + + + void glCopyMultiTexImage1DEXT + GLenum texunit + GLenum target + GLint level + GLenum internalformat + GLint x + GLint y + GLsizei width + GLint border + + + void glCopyMultiTexImage2DEXT + GLenum texunit + GLenum target + GLint level + GLenum internalformat + GLint x + GLint y + GLsizei width + GLsizei height + GLint border + + + void glCopyMultiTexSubImage1DEXT + GLenum texunit + GLenum target + GLint level + GLint xoffset + GLint x + GLint y + GLsizei width + + + void glCopyMultiTexSubImage2DEXT + GLenum texunit + GLenum target + GLint level + GLint xoffset + GLint yoffset + GLint x + GLint y + GLsizei width + GLsizei height + + + void glCopyMultiTexSubImage3DEXT + GLenum texunit + GLenum target + GLint level + GLint xoffset + GLint yoffset + GLint zoffset + GLint x + GLint y + GLsizei width + GLsizei height + + + void glCopyNamedBufferSubData + GLuint readBuffer + GLuint writeBuffer + GLintptr readOffset + GLintptr writeOffset + GLsizeiptr size + + + void glCopyPathNV + GLuint resultPath + GLuint srcPath + + + void glCopyPixels + GLint x + GLint y + GLsizei width + GLsizei height + GLenum type + + + + void glCopyTexImage1D + GLenum target + GLint level + GLenum internalformat + GLint x + GLint y + GLsizei width + GLint border + + + + void glCopyTexImage1DEXT + GLenum target + GLint level + GLenum internalformat + GLint x + GLint y + GLsizei width + GLint border + + + + + void glCopyTexImage2D + GLenum target + GLint level + GLenum internalformat + GLint x + GLint y + GLsizei width + GLsizei height + GLint border + + + + void glCopyTexImage2DEXT + GLenum target + GLint level + GLenum internalformat + GLint x + GLint y + GLsizei width + GLsizei height + GLint border + + + + + void glCopyTexSubImage1D + GLenum target + GLint level + GLint xoffset + GLint x + GLint y + GLsizei width + + + + void glCopyTexSubImage1DEXT + GLenum target + GLint level + GLint xoffset + GLint x + GLint y + GLsizei width + + + + + void glCopyTexSubImage2D + GLenum target + GLint level + GLint xoffset + GLint yoffset + GLint x + GLint y + GLsizei width + GLsizei height + + + + void glCopyTexSubImage2DEXT + GLenum target + GLint level + GLint xoffset + GLint yoffset + GLint x + GLint y + GLsizei width + GLsizei height + + + + + void glCopyTexSubImage3D + GLenum target + GLint level + GLint xoffset + GLint yoffset + GLint zoffset + GLint x + GLint y + GLsizei width + GLsizei height + + + + void glCopyTexSubImage3DEXT + GLenum target + GLint level + GLint xoffset + GLint yoffset + GLint zoffset + GLint x + GLint y + GLsizei width + GLsizei height + + + + + void glCopyTexSubImage3DOES + GLenum target + GLint level + GLint xoffset + GLint yoffset + GLint zoffset + GLint x + GLint y + GLsizei width + GLsizei height + + + void glCopyTextureImage1DEXT + GLuint texture + GLenum target + GLint level + GLenum internalformat + GLint x + GLint y + GLsizei width + GLint border + + + void glCopyTextureImage2DEXT + GLuint texture + GLenum target + GLint level + GLenum internalformat + GLint x + GLint y + GLsizei width + GLsizei height + GLint border + + + void glCopyTextureLevelsAPPLE + GLuint destinationTexture + GLuint sourceTexture + GLint sourceBaseLevel + GLsizei sourceLevelCount + + + void glCopyTextureSubImage1D + GLuint texture + GLint level + GLint xoffset + GLint x + GLint y + GLsizei width + + + void glCopyTextureSubImage1DEXT + GLuint texture + GLenum target + GLint level + GLint xoffset + GLint x + GLint y + GLsizei width + + + void glCopyTextureSubImage2D + GLuint texture + GLint level + GLint xoffset + GLint yoffset + GLint x + GLint y + GLsizei width + GLsizei height + + + void glCopyTextureSubImage2DEXT + GLuint texture + GLenum target + GLint level + GLint xoffset + GLint yoffset + GLint x + GLint y + GLsizei width + GLsizei height + + + void glCopyTextureSubImage3D + GLuint texture + GLint level + GLint xoffset + GLint yoffset + GLint zoffset + GLint x + GLint y + GLsizei width + GLsizei height + + + void glCopyTextureSubImage3DEXT + GLuint texture + GLenum target + GLint level + GLint xoffset + GLint yoffset + GLint zoffset + GLint x + GLint y + GLsizei width + GLsizei height + + + void glCoverFillPathInstancedNV + GLsizei numPaths + GLenum pathNameType + const void *paths + GLuint pathBase + GLenum coverMode + GLenum transformType + const GLfloat *transformValues + + + void glCoverFillPathNV + GLuint path + GLenum coverMode + + + void glCoverStrokePathInstancedNV + GLsizei numPaths + GLenum pathNameType + const void *paths + GLuint pathBase + GLenum coverMode + GLenum transformType + const GLfloat *transformValues + + + void glCoverStrokePathNV + GLuint path + GLenum coverMode + + + void glCoverageMaskNV + GLboolean mask + + + void glCoverageModulationNV + GLenum components + + + void glCoverageModulationTableNV + GLsizei n + const GLfloat *v + + + void glCoverageOperationNV + GLenum operation + + + void glCreateBuffers + GLsizei n + GLuint *buffers + + + void glCreateCommandListsNV + GLsizei n + GLuint *lists + + + void glCreateFramebuffers + GLsizei n + GLuint *framebuffers + + + void glCreateMemoryObjectsEXT + GLsizei n + GLuint *memoryObjects + + + void glCreatePerfQueryINTEL + GLuint queryId + GLuint *queryHandle + + + GLuint glCreateProgram + + + GLhandleARB glCreateProgramObjectARB + + + + void glCreateProgramPipelines + GLsizei n + GLuint *pipelines + + + GLuint glCreateProgressFenceNVX + + + void glCreateQueries + GLenum target + GLsizei n + GLuint *ids + + + void glCreateRenderbuffers + GLsizei n + GLuint *renderbuffers + + + void glCreateSamplers + GLsizei n + GLuint *samplers + + + GLuint glCreateShader + GLenum type + + + GLhandleARB glCreateShaderObjectARB + GLenum shaderType + + + + GLuint glCreateShaderProgramEXT + GLenum type + const GLchar *string + + + GLuint glCreateShaderProgramv + GLenum type + GLsizei count + const GLchar *const*strings + + + GLuint glCreateShaderProgramvEXT + GLenum type + GLsizei count + const GLchar **strings + + + void glCreateStatesNV + GLsizei n + GLuint *states + + + GLsync glCreateSyncFromCLeventARB + struct _cl_context *context + struct _cl_event *event + GLbitfield flags + + + void glCreateTextures + GLenum target + GLsizei n + GLuint *textures + + + void glCreateTransformFeedbacks + GLsizei n + GLuint *ids + + + void glCreateVertexArrays + GLsizei n + GLuint *arrays + + + void glCullFace + GLenum mode + + + + void glCullParameterdvEXT + GLenum pname + GLdouble *params + + + void glCullParameterfvEXT + GLenum pname + GLfloat *params + + + void glCurrentPaletteMatrixARB + GLint index + + + + void glCurrentPaletteMatrixOES + GLuint matrixpaletteindex + + + void glDebugMessageCallback + GLDEBUGPROC callback + const void *userParam + + + void glDebugMessageCallbackAMD + GLDEBUGPROCAMD callback + void *userParam + + + void glDebugMessageCallbackARB + GLDEBUGPROCARB callback + const void *userParam + + + + void glDebugMessageCallbackKHR + GLDEBUGPROCKHR callback + const void *userParam + + + + void glDebugMessageControl + GLenum source + GLenum type + GLenum severity + GLsizei count + const GLuint *ids + GLboolean enabled + + + void glDebugMessageControlARB + GLenum source + GLenum type + GLenum severity + GLsizei count + const GLuint *ids + GLboolean enabled + + + + void glDebugMessageControlKHR + GLenum source + GLenum type + GLenum severity + GLsizei count + const GLuint *ids + GLboolean enabled + + + + void glDebugMessageEnableAMD + GLenum category + GLenum severity + GLsizei count + const GLuint *ids + GLboolean enabled + + + void glDebugMessageInsert + GLenum source + GLenum type + GLuint id + GLenum severity + GLsizei length + const GLchar *buf + + + void glDebugMessageInsertAMD + GLenum category + GLenum severity + GLuint id + GLsizei length + const GLchar *buf + + + void glDebugMessageInsertARB + GLenum source + GLenum type + GLuint id + GLenum severity + GLsizei length + const GLchar *buf + + + + void glDebugMessageInsertKHR + GLenum source + GLenum type + GLuint id + GLenum severity + GLsizei length + const GLchar *buf + + + + void glDeformSGIX + GLbitfield mask + + + + void glDeformationMap3dSGIX + GLenum target + GLdouble u1 + GLdouble u2 + GLint ustride + GLint uorder + GLdouble v1 + GLdouble v2 + GLint vstride + GLint vorder + GLdouble w1 + GLdouble w2 + GLint wstride + GLint worder + const GLdouble *points + + + + void glDeformationMap3fSGIX + GLenum target + GLfloat u1 + GLfloat u2 + GLint ustride + GLint uorder + GLfloat v1 + GLfloat v2 + GLint vstride + GLint vorder + GLfloat w1 + GLfloat w2 + GLint wstride + GLint worder + const GLfloat *points + + + + void glDeleteAsyncMarkersSGIX + GLuint marker + GLsizei range + + + void glDeleteBuffers + GLsizei n + const GLuint *buffers + + + void glDeleteBuffersARB + GLsizei n + const GLuint *buffers + + + + void glDeleteCommandListsNV + GLsizei n + const GLuint *lists + + + void glDeleteFencesAPPLE + GLsizei n + const GLuint *fences + + + void glDeleteFencesNV + GLsizei n + const GLuint *fences + + + + void glDeleteFragmentShaderATI + GLuint id + + + void glDeleteFramebuffers + GLsizei n + const GLuint *framebuffers + + + + void glDeleteFramebuffersEXT + GLsizei n + const GLuint *framebuffers + + + + + void glDeleteFramebuffersOES + GLsizei n + const GLuint *framebuffers + + + void glDeleteLists + GLuint list + GLsizei range + + + + void glDeleteMemoryObjectsEXT + GLsizei n + const GLuint *memoryObjects + + + void glDeleteNamedStringARB + GLint namelen + const GLchar *name + + + void glDeleteNamesAMD + GLenum identifier + GLuint num + const GLuint *names + + + void glDeleteObjectARB + GLhandleARB obj + + + void glDeleteOcclusionQueriesNV + GLsizei n + const GLuint *ids + + + void glDeletePathsNV + GLuint path + GLsizei range + + + void glDeletePerfMonitorsAMD + GLsizei n + GLuint *monitors + + + void glDeletePerfQueryINTEL + GLuint queryHandle + + + void glDeleteProgram + GLuint program + + + + void glDeleteProgramPipelines + GLsizei n + const GLuint *pipelines + + + void glDeleteProgramPipelinesEXT + GLsizei n + const GLuint *pipelines + + + void glDeleteProgramsARB + GLsizei n + const GLuint *programs + + + + void glDeleteProgramsNV + GLsizei n + const GLuint *programs + + + + + void glDeleteQueries + GLsizei n + const GLuint *ids + + + + void glDeleteQueriesARB + GLsizei n + const GLuint *ids + + + + void glDeleteQueriesEXT + GLsizei n + const GLuint *ids + + + void glDeleteQueryResourceTagNV + GLsizei n + const GLint *tagIds + + + void glDeleteRenderbuffers + GLsizei n + const GLuint *renderbuffers + + + + void glDeleteRenderbuffersEXT + GLsizei n + const GLuint *renderbuffers + + + + + void glDeleteRenderbuffersOES + GLsizei n + const GLuint *renderbuffers + + + void glDeleteSamplers + GLsizei count + const GLuint *samplers + + + void glDeleteSemaphoresEXT + GLsizei n + const GLuint *semaphores + + + void glDeleteShader + GLuint shader + + + + void glDeleteStatesNV + GLsizei n + const GLuint *states + + + void glDeleteSync + GLsync sync + + + void glDeleteSyncAPPLE + GLsync sync + + + + void glDeleteTextures + GLsizei n + const GLuint *textures + + + + void glDeleteTexturesEXT + GLsizei n + const GLuint *textures + + + + void glDeleteTransformFeedbacks + GLsizei n + const GLuint *ids + + + void glDeleteTransformFeedbacksNV + GLsizei n + const GLuint *ids + + + + void glDeleteVertexArrays + GLsizei n + const GLuint *arrays + + + + void glDeleteVertexArraysAPPLE + GLsizei n + const GLuint *arrays + + + + void glDeleteVertexArraysOES + GLsizei n + const GLuint *arrays + + + + void glDeleteVertexShaderEXT + GLuint id + + + void glDepthBoundsEXT + GLclampd zmin + GLclampd zmax + + + + void glDepthBoundsdNV + GLdouble zmin + GLdouble zmax + + + + void glDepthFunc + GLenum func + + + + void glDepthMask + GLboolean flag + + + + void glDepthRange + GLdouble n + GLdouble f + + + + void glDepthRangeArrayfvNV + GLuint first + GLsizei count + const GLfloat *v + + + void glDepthRangeArrayfvOES + GLuint first + GLsizei count + const GLfloat *v + + + void glDepthRangeArrayv + GLuint first + GLsizei count + const GLdouble *v + + + void glDepthRangeIndexed + GLuint index + GLdouble n + GLdouble f + + + void glDepthRangeIndexedfNV + GLuint index + GLfloat n + GLfloat f + + + void glDepthRangeIndexedfOES + GLuint index + GLfloat n + GLfloat f + + + void glDepthRangedNV + GLdouble zNear + GLdouble zFar + + + + void glDepthRangef + GLfloat n + GLfloat f + + + void glDepthRangefOES + GLclampf n + GLclampf f + + + + + void glDepthRangex + GLfixed n + GLfixed f + + + void glDepthRangexOES + GLfixed n + GLfixed f + + + void glDetachObjectARB + GLhandleARB containerObj + GLhandleARB attachedObj + + + + void glDetachShader + GLuint program + GLuint shader + + + void glDetailTexFuncSGIS + GLenum target + GLsizei n + const GLfloat *points + + + + void glDisable + GLenum cap + + + + void glDisableClientState + GLenum array + + + void glDisableClientStateIndexedEXT + GLenum array + GLuint index + + + void glDisableClientStateiEXT + GLenum array + GLuint index + + + void glDisableDriverControlQCOM + GLuint driverControl + + + void glDisableIndexedEXT + GLenum target + GLuint index + + + + + void glDisableVariantClientStateEXT + GLuint id + + + void glDisableVertexArrayAttrib + GLuint vaobj + GLuint index + + + void glDisableVertexArrayAttribEXT + GLuint vaobj + GLuint index + + + void glDisableVertexArrayEXT + GLuint vaobj + GLenum array + + + void glDisableVertexAttribAPPLE + GLuint index + GLenum pname + + + void glDisableVertexAttribArray + GLuint index + + + void glDisableVertexAttribArrayARB + GLuint index + + + + void glDisablei + GLenum target + GLuint index + + + void glDisableiEXT + GLenum target + GLuint index + + + + void glDisableiNV + GLenum target + GLuint index + + + + void glDisableiOES + GLenum target + GLuint index + + + + void glDiscardFramebufferEXT + GLenum target + GLsizei numAttachments + const GLenum *attachments + + + void glDispatchCompute + GLuint num_groups_x + GLuint num_groups_y + GLuint num_groups_z + + + void glDispatchComputeGroupSizeARB + GLuint num_groups_x + GLuint num_groups_y + GLuint num_groups_z + GLuint group_size_x + GLuint group_size_y + GLuint group_size_z + + + void glDispatchComputeIndirect + GLintptr indirect + + + void glDrawArrays + GLenum mode + GLint first + GLsizei count + + + + void glDrawArraysEXT + GLenum mode + GLint first + GLsizei count + + + + + void glDrawArraysIndirect + GLenum mode + const void *indirect + + + void glDrawArraysInstanced + GLenum mode + GLint first + GLsizei count + GLsizei instancecount + + + void glDrawArraysInstancedANGLE + GLenum mode + GLint first + GLsizei count + GLsizei primcount + + + + void glDrawArraysInstancedARB + GLenum mode + GLint first + GLsizei count + GLsizei primcount + + + + void glDrawArraysInstancedBaseInstance + GLenum mode + GLint first + GLsizei count + GLsizei instancecount + GLuint baseinstance + + + void glDrawArraysInstancedBaseInstanceEXT + GLenum mode + GLint first + GLsizei count + GLsizei instancecount + GLuint baseinstance + + + + void glDrawArraysInstancedEXT + GLenum mode + GLint start + GLsizei count + GLsizei primcount + + + + void glDrawArraysInstancedNV + GLenum mode + GLint first + GLsizei count + GLsizei primcount + + + + void glDrawBuffer + GLenum buf + + + + void glDrawBuffers + GLsizei n + const GLenum *bufs + + + + void glDrawBuffersARB + GLsizei n + const GLenum *bufs + + + + void glDrawBuffersATI + GLsizei n + const GLenum *bufs + + + + + void glDrawBuffersEXT + GLsizei n + const GLenum *bufs + + + + void glDrawBuffersIndexedEXT + GLint n + const GLenum *location + const GLint *indices + + + void glDrawBuffersNV + GLsizei n + const GLenum *bufs + + + void glDrawCommandsAddressNV + GLenum primitiveMode + const GLuint64 *indirects + const GLsizei *sizes + GLuint count + + + void glDrawCommandsNV + GLenum primitiveMode + GLuint buffer + const GLintptr *indirects + const GLsizei *sizes + GLuint count + + + void glDrawCommandsStatesAddressNV + const GLuint64 *indirects + const GLsizei *sizes + const GLuint *states + const GLuint *fbos + GLuint count + + + void glDrawCommandsStatesNV + GLuint buffer + const GLintptr *indirects + const GLsizei *sizes + const GLuint *states + const GLuint *fbos + GLuint count + + + void glDrawElementArrayAPPLE + GLenum mode + GLint first + GLsizei count + + + void glDrawElementArrayATI + GLenum mode + GLsizei count + + + void glDrawElements + GLenum mode + GLsizei count + GLenum type + const void *indices + + + void glDrawElementsBaseVertex + GLenum mode + GLsizei count + GLenum type + const void *indices + GLint basevertex + + + void glDrawElementsBaseVertexEXT + GLenum mode + GLsizei count + GLenum type + const void *indices + GLint basevertex + + + + void glDrawElementsBaseVertexOES + GLenum mode + GLsizei count + GLenum type + const void *indices + GLint basevertex + + + + void glDrawElementsIndirect + GLenum mode + GLenum type + const void *indirect + + + void glDrawElementsInstanced + GLenum mode + GLsizei count + GLenum type + const void *indices + GLsizei instancecount + + + void glDrawElementsInstancedANGLE + GLenum mode + GLsizei count + GLenum type + const void *indices + GLsizei primcount + + + + void glDrawElementsInstancedARB + GLenum mode + GLsizei count + GLenum type + const void *indices + GLsizei primcount + + + + void glDrawElementsInstancedBaseInstance + GLenum mode + GLsizei count + GLenum type + const void *indices + GLsizei instancecount + GLuint baseinstance + + + void glDrawElementsInstancedBaseInstanceEXT + GLenum mode + GLsizei count + GLenum type + const void *indices + GLsizei instancecount + GLuint baseinstance + + + + void glDrawElementsInstancedBaseVertex + GLenum mode + GLsizei count + GLenum type + const void *indices + GLsizei instancecount + GLint basevertex + + + void glDrawElementsInstancedBaseVertexBaseInstance + GLenum mode + GLsizei count + GLenum type + const void *indices + GLsizei instancecount + GLint basevertex + GLuint baseinstance + + + void glDrawElementsInstancedBaseVertexBaseInstanceEXT + GLenum mode + GLsizei count + GLenum type + const void *indices + GLsizei instancecount + GLint basevertex + GLuint baseinstance + + + + void glDrawElementsInstancedBaseVertexEXT + GLenum mode + GLsizei count + GLenum type + const void *indices + GLsizei instancecount + GLint basevertex + + + + void glDrawElementsInstancedBaseVertexOES + GLenum mode + GLsizei count + GLenum type + const void *indices + GLsizei instancecount + GLint basevertex + + + + void glDrawElementsInstancedEXT + GLenum mode + GLsizei count + GLenum type + const void *indices + GLsizei primcount + + + + void glDrawElementsInstancedNV + GLenum mode + GLsizei count + GLenum type + const void *indices + GLsizei primcount + + + + void glDrawMeshArraysSUN + GLenum mode + GLint first + GLsizei count + GLsizei width + + + void glDrawMeshTasksNV + GLuint first + GLuint count + + + void glDrawMeshTasksIndirectNV + GLintptr indirect + + + void glDrawPixels + GLsizei width + GLsizei height + GLenum format + GLenum type + const void *pixels + + + + + void glDrawRangeElementArrayAPPLE + GLenum mode + GLuint start + GLuint end + GLint first + GLsizei count + + + void glDrawRangeElementArrayATI + GLenum mode + GLuint start + GLuint end + GLsizei count + + + void glDrawRangeElements + GLenum mode + GLuint start + GLuint end + GLsizei count + GLenum type + const void *indices + + + void glDrawRangeElementsBaseVertex + GLenum mode + GLuint start + GLuint end + GLsizei count + GLenum type + const void *indices + GLint basevertex + + + void glDrawRangeElementsBaseVertexEXT + GLenum mode + GLuint start + GLuint end + GLsizei count + GLenum type + const void *indices + GLint basevertex + + + + void glDrawRangeElementsBaseVertexOES + GLenum mode + GLuint start + GLuint end + GLsizei count + GLenum type + const void *indices + GLint basevertex + + + + void glDrawRangeElementsEXT + GLenum mode + GLuint start + GLuint end + GLsizei count + GLenum type + const void *indices + + + + void glDrawTexfOES + GLfloat x + GLfloat y + GLfloat z + GLfloat width + GLfloat height + + + + void glDrawTexfvOES + const GLfloat *coords + + + void glDrawTexiOES + GLint x + GLint y + GLint z + GLint width + GLint height + + + + void glDrawTexivOES + const GLint *coords + + + void glDrawTexsOES + GLshort x + GLshort y + GLshort z + GLshort width + GLshort height + + + + void glDrawTexsvOES + const GLshort *coords + + + void glDrawTextureNV + GLuint texture + GLuint sampler + GLfloat x0 + GLfloat y0 + GLfloat x1 + GLfloat y1 + GLfloat z + GLfloat s0 + GLfloat t0 + GLfloat s1 + GLfloat t1 + + + void glDrawTexxOES + GLfixed x + GLfixed y + GLfixed z + GLfixed width + GLfixed height + + + + void glDrawTexxvOES + const GLfixed *coords + + + void glDrawTransformFeedback + GLenum mode + GLuint id + + + void glDrawTransformFeedbackEXT + GLenum mode + GLuint id + + + + void glDrawTransformFeedbackInstanced + GLenum mode + GLuint id + GLsizei instancecount + + + void glDrawTransformFeedbackInstancedEXT + GLenum mode + GLuint id + GLsizei instancecount + + + + void glDrawTransformFeedbackNV + GLenum mode + GLuint id + + + + void glDrawTransformFeedbackStream + GLenum mode + GLuint id + GLuint stream + + + void glDrawTransformFeedbackStreamInstanced + GLenum mode + GLuint id + GLuint stream + GLsizei instancecount + + + void glEGLImageTargetRenderbufferStorageOES + GLenum target + GLeglImageOES image + + + void glEGLImageTargetTexStorageEXT + GLenum target + GLeglImageOES image + const GLint* attrib_list + + + void glEGLImageTargetTexture2DOES + GLenum target + GLeglImageOES image + + + void glEGLImageTargetTextureStorageEXT + GLuint texture + GLeglImageOES image + const GLint* attrib_list + + + void glEdgeFlag + GLboolean flag + + + + void glEdgeFlagFormatNV + GLsizei stride + + + void glEdgeFlagPointer + GLsizei stride + const void *pointer + + + void glEdgeFlagPointerEXT + GLsizei stride + GLsizei count + const GLboolean *pointer + + + void glEdgeFlagPointerListIBM + GLint stride + const GLboolean **pointer + GLint ptrstride + + + void glEdgeFlagv + const GLboolean *flag + + + + void glElementPointerAPPLE + GLenum type + const void *pointer + + + void glElementPointerATI + GLenum type + const void *pointer + + + void glEnable + GLenum cap + + + + void glEnableClientState + GLenum array + + + void glEnableClientStateIndexedEXT + GLenum array + GLuint index + + + void glEnableClientStateiEXT + GLenum array + GLuint index + + + void glEnableDriverControlQCOM + GLuint driverControl + + + void glEnableIndexedEXT + GLenum target + GLuint index + + + + + void glEnableVariantClientStateEXT + GLuint id + + + void glEnableVertexArrayAttrib + GLuint vaobj + GLuint index + + + void glEnableVertexArrayAttribEXT + GLuint vaobj + GLuint index + + + void glEnableVertexArrayEXT + GLuint vaobj + GLenum array + + + void glEnableVertexAttribAPPLE + GLuint index + GLenum pname + + + void glEnableVertexAttribArray + GLuint index + + + void glEnableVertexAttribArrayARB + GLuint index + + + + void glEnablei + GLenum target + GLuint index + + + void glEnableiEXT + GLenum target + GLuint index + + + + void glEnableiNV + GLenum target + GLuint index + + + + void glEnableiOES + GLenum target + GLuint index + + + + void glEnd + + + + void glEndConditionalRender + + + + void glEndConditionalRenderNV + + + + void glEndConditionalRenderNVX + + + + void glEndFragmentShaderATI + + + void glEndList + + + + void glEndOcclusionQueryNV + + + void glEndPerfMonitorAMD + GLuint monitor + + + void glEndPerfQueryINTEL + GLuint queryHandle + + + void glEndQuery + GLenum target + + + + void glEndQueryARB + GLenum target + + + + void glEndQueryEXT + GLenum target + + + void glEndQueryIndexed + GLenum target + GLuint index + + + void glEndTilingQCOM + GLbitfield preserveMask + + + void glEndTransformFeedback + + + + void glEndTransformFeedbackEXT + + + + void glEndTransformFeedbackNV + + + + void glEndVertexShaderEXT + + + void glEndVideoCaptureNV + GLuint video_capture_slot + + + void glEvalCoord1d + GLdouble u + + + + void glEvalCoord1dv + const GLdouble *u + + + + void glEvalCoord1f + GLfloat u + + + + void glEvalCoord1fv + const GLfloat *u + + + + void glEvalCoord1xOES + GLfixed u + + + void glEvalCoord1xvOES + const GLfixed *coords + + + void glEvalCoord2d + GLdouble u + GLdouble v + + + + void glEvalCoord2dv + const GLdouble *u + + + + void glEvalCoord2f + GLfloat u + GLfloat v + + + + void glEvalCoord2fv + const GLfloat *u + + + + void glEvalCoord2xOES + GLfixed u + GLfixed v + + + void glEvalCoord2xvOES + const GLfixed *coords + + + void glEvalMapsNV + GLenum target + GLenum mode + + + void glEvalMesh1 + GLenum mode + GLint i1 + GLint i2 + + + + void glEvalMesh2 + GLenum mode + GLint i1 + GLint i2 + GLint j1 + GLint j2 + + + + void glEvalPoint1 + GLint i + + + + void glEvalPoint2 + GLint i + GLint j + + + + void glEvaluateDepthValuesARB + + + void glExecuteProgramNV + GLenum target + GLuint id + const GLfloat *params + + + + void glExtGetBufferPointervQCOM + GLenum target + void **params + + + void glExtGetBuffersQCOM + GLuint *buffers + GLint maxBuffers + GLint *numBuffers + + + void glExtGetFramebuffersQCOM + GLuint *framebuffers + GLint maxFramebuffers + GLint *numFramebuffers + + + void glExtGetProgramBinarySourceQCOM + GLuint program + GLenum shadertype + GLchar *source + GLint *length + + + void glExtGetProgramsQCOM + GLuint *programs + GLint maxPrograms + GLint *numPrograms + + + void glExtGetRenderbuffersQCOM + GLuint *renderbuffers + GLint maxRenderbuffers + GLint *numRenderbuffers + + + void glExtGetShadersQCOM + GLuint *shaders + GLint maxShaders + GLint *numShaders + + + void glExtGetTexLevelParameterivQCOM + GLuint texture + GLenum face + GLint level + GLenum pname + GLint *params + + + void glExtGetTexSubImageQCOM + GLenum target + GLint level + GLint xoffset + GLint yoffset + GLint zoffset + GLsizei width + GLsizei height + GLsizei depth + GLenum format + GLenum type + void *texels + + + void glExtGetTexturesQCOM + GLuint *textures + GLint maxTextures + GLint *numTextures + + + GLboolean glExtIsProgramBinaryQCOM + GLuint program + + + void glExtTexObjectStateOverrideiQCOM + GLenum target + GLenum pname + GLint param + + + void glExtractComponentEXT + GLuint res + GLuint src + GLuint num + + + void glFeedbackBuffer + GLsizei size + GLenum type + GLfloat *buffer + + + + void glFeedbackBufferxOES + GLsizei n + GLenum type + const GLfixed *buffer + + + GLsync glFenceSync + GLenum condition + GLbitfield flags + + + GLsync glFenceSyncAPPLE + GLenum condition + GLbitfield flags + + + + void glFinalCombinerInputNV + GLenum variable + GLenum input + GLenum mapping + GLenum componentUsage + + + + void glFinish + + + + GLint glFinishAsyncSGIX + GLuint *markerp + + + void glFinishFenceAPPLE + GLuint fence + + + void glFinishFenceNV + GLuint fence + + + + void glFinishObjectAPPLE + GLenum object + GLint name + + + void glFinishTextureSUNX + + + void glFlush + + + + void glFlushMappedBufferRange + GLenum target + GLintptr offset + GLsizeiptr length + + + void glFlushMappedBufferRangeAPPLE + GLenum target + GLintptr offset + GLsizeiptr size + + + + void glFlushMappedBufferRangeEXT + GLenum target + GLintptr offset + GLsizeiptr length + + + + void glFlushMappedNamedBufferRange + GLuint buffer + GLintptr offset + GLsizeiptr length + + + void glFlushMappedNamedBufferRangeEXT + GLuint buffer + GLintptr offset + GLsizeiptr length + + + void glFlushPixelDataRangeNV + GLenum target + + + void glFlushRasterSGIX + + + + void glFlushStaticDataIBM + GLenum target + + + void glFlushVertexArrayRangeAPPLE + GLsizei length + void *pointer + + + void glFlushVertexArrayRangeNV + + + void glFogCoordFormatNV + GLenum type + GLsizei stride + + + void glFogCoordPointer + GLenum type + GLsizei stride + const void *pointer + + + void glFogCoordPointerEXT + GLenum type + GLsizei stride + const void *pointer + + + + void glFogCoordPointerListIBM + GLenum type + GLint stride + const void **pointer + GLint ptrstride + + + void glFogCoordd + GLdouble coord + + + + void glFogCoorddEXT + GLdouble coord + + + + + void glFogCoorddv + const GLdouble *coord + + + + void glFogCoorddvEXT + const GLdouble *coord + + + + + void glFogCoordf + GLfloat coord + + + + void glFogCoordfEXT + GLfloat coord + + + + + void glFogCoordfv + const GLfloat *coord + + + + void glFogCoordfvEXT + const GLfloat *coord + + + + + void glFogCoordhNV + GLhalfNV fog + + + + void glFogCoordhvNV + const GLhalfNV *fog + + + + void glFogFuncSGIS + GLsizei n + const GLfloat *points + + + + void glFogf + GLenum pname + GLfloat param + + + + void glFogfv + GLenum pname + const GLfloat *params + + + + void glFogi + GLenum pname + GLint param + + + + void glFogiv + GLenum pname + const GLint *params + + + + void glFogx + GLenum pname + GLfixed param + + + void glFogxOES + GLenum pname + GLfixed param + + + void glFogxv + GLenum pname + const GLfixed *param + + + void glFogxvOES + GLenum pname + const GLfixed *param + + + void glFragmentColorMaterialSGIX + GLenum face + GLenum mode + + + void glFragmentCoverageColorNV + GLuint color + + + void glFragmentLightModelfSGIX + GLenum pname + GLfloat param + + + void glFragmentLightModelfvSGIX + GLenum pname + const GLfloat *params + + + void glFragmentLightModeliSGIX + GLenum pname + GLint param + + + void glFragmentLightModelivSGIX + GLenum pname + const GLint *params + + + void glFragmentLightfSGIX + GLenum light + GLenum pname + GLfloat param + + + void glFragmentLightfvSGIX + GLenum light + GLenum pname + const GLfloat *params + + + void glFragmentLightiSGIX + GLenum light + GLenum pname + GLint param + + + void glFragmentLightivSGIX + GLenum light + GLenum pname + const GLint *params + + + void glFragmentMaterialfSGIX + GLenum face + GLenum pname + GLfloat param + + + void glFragmentMaterialfvSGIX + GLenum face + GLenum pname + const GLfloat *params + + + void glFragmentMaterialiSGIX + GLenum face + GLenum pname + GLint param + + + void glFragmentMaterialivSGIX + GLenum face + GLenum pname + const GLint *params + + + void glFrameTerminatorGREMEDY + + + void glFrameZoomSGIX + GLint factor + + + + void glFramebufferDrawBufferEXT + GLuint framebuffer + GLenum mode + + + void glFramebufferDrawBuffersEXT + GLuint framebuffer + GLsizei n + const GLenum *bufs + + + void glFramebufferFetchBarrierEXT + + + void glFramebufferFetchBarrierQCOM + + + void glFramebufferFoveationConfigQCOM + GLuint framebuffer + GLuint numLayers + GLuint focalPointsPerLayer + GLuint requestedFeatures + GLuint *providedFeatures + + + void glFramebufferFoveationParametersQCOM + GLuint framebuffer + GLuint layer + GLuint focalPoint + GLfloat focalX + GLfloat focalY + GLfloat gainX + GLfloat gainY + GLfloat foveaArea + + + void glFramebufferParameteri + GLenum target + GLenum pname + GLint param + + + void glFramebufferPixelLocalStorageSizeEXT + GLuint target + GLsizei size + + + void glFramebufferReadBufferEXT + GLuint framebuffer + GLenum mode + + + void glFramebufferRenderbuffer + GLenum target + GLenum attachment + GLenum renderbuffertarget + GLuint renderbuffer + + + + void glFramebufferRenderbufferEXT + GLenum target + GLenum attachment + GLenum renderbuffertarget + GLuint renderbuffer + + + + + void glFramebufferRenderbufferOES + GLenum target + GLenum attachment + GLenum renderbuffertarget + GLuint renderbuffer + + + void glFramebufferSampleLocationsfvARB + GLenum target + GLuint start + GLsizei count + const GLfloat *v + + + void glFramebufferSampleLocationsfvNV + GLenum target + GLuint start + GLsizei count + const GLfloat *v + + + void glFramebufferSamplePositionsfvAMD + GLenum target + GLuint numsamples + GLuint pixelindex + const GLfloat *values + + + void glFramebufferTexture + GLenum target + GLenum attachment + GLuint texture + GLint level + + + void glFramebufferTexture1D + GLenum target + GLenum attachment + GLenum textarget + GLuint texture + GLint level + + + + void glFramebufferTexture1DEXT + GLenum target + GLenum attachment + GLenum textarget + GLuint texture + GLint level + + + + + void glFramebufferTexture2D + GLenum target + GLenum attachment + GLenum textarget + GLuint texture + GLint level + + + + void glFramebufferTexture2DEXT + GLenum target + GLenum attachment + GLenum textarget + GLuint texture + GLint level + + + + + void glFramebufferTexture2DDownsampleIMG + GLenum target + GLenum attachment + GLenum textarget + GLuint texture + GLint level + GLint xscale + GLint yscale + + + void glFramebufferTexture2DMultisampleEXT + GLenum target + GLenum attachment + GLenum textarget + GLuint texture + GLint level + GLsizei samples + + + void glFramebufferTexture2DMultisampleIMG + GLenum target + GLenum attachment + GLenum textarget + GLuint texture + GLint level + GLsizei samples + + + void glFramebufferTexture2DOES + GLenum target + GLenum attachment + GLenum textarget + GLuint texture + GLint level + + + void glFramebufferTexture3D + GLenum target + GLenum attachment + GLenum textarget + GLuint texture + GLint level + GLint zoffset + + + + void glFramebufferTexture3DEXT + GLenum target + GLenum attachment + GLenum textarget + GLuint texture + GLint level + GLint zoffset + + + + + void glFramebufferTexture3DOES + GLenum target + GLenum attachment + GLenum textarget + GLuint texture + GLint level + GLint zoffset + + + void glFramebufferTextureARB + GLenum target + GLenum attachment + GLuint texture + GLint level + + + + void glFramebufferTextureEXT + GLenum target + GLenum attachment + GLuint texture + GLint level + + + + void glFramebufferTextureFaceARB + GLenum target + GLenum attachment + GLuint texture + GLint level + GLenum face + + + void glFramebufferTextureFaceEXT + GLenum target + GLenum attachment + GLuint texture + GLint level + GLenum face + + + + void glFramebufferTextureLayer + GLenum target + GLenum attachment + GLuint texture + GLint level + GLint layer + + + + void glFramebufferTextureLayerARB + GLenum target + GLenum attachment + GLuint texture + GLint level + GLint layer + + + + void glFramebufferTextureLayerEXT + GLenum target + GLenum attachment + GLuint texture + GLint level + GLint layer + + + + void glFramebufferTextureLayerDownsampleIMG + GLenum target + GLenum attachment + GLuint texture + GLint level + GLint layer + GLint xscale + GLint yscale + + + void glFramebufferTextureMultisampleMultiviewOVR + GLenum target + GLenum attachment + GLuint texture + GLint level + GLsizei samples + GLint baseViewIndex + GLsizei numViews + + + void glFramebufferTextureMultiviewOVR + GLenum target + GLenum attachment + GLuint texture + GLint level + GLint baseViewIndex + GLsizei numViews + + + void glFramebufferTextureOES + GLenum target + GLenum attachment + GLuint texture + GLint level + + + + void glFreeObjectBufferATI + GLuint buffer + + + void glFrontFace + GLenum mode + + + + void glFrustum + GLdouble left + GLdouble right + GLdouble bottom + GLdouble top + GLdouble zNear + GLdouble zFar + + + + void glFrustumf + GLfloat l + GLfloat r + GLfloat b + GLfloat t + GLfloat n + GLfloat f + + + void glFrustumfOES + GLfloat l + GLfloat r + GLfloat b + GLfloat t + GLfloat n + GLfloat f + + + + void glFrustumx + GLfixed l + GLfixed r + GLfixed b + GLfixed t + GLfixed n + GLfixed f + + + void glFrustumxOES + GLfixed l + GLfixed r + GLfixed b + GLfixed t + GLfixed n + GLfixed f + + + GLuint glGenAsyncMarkersSGIX + GLsizei range + + + void glGenBuffers + GLsizei n + GLuint *buffers + + + void glGenBuffersARB + GLsizei n + GLuint *buffers + + + + void glGenFencesAPPLE + GLsizei n + GLuint *fences + + + void glGenFencesNV + GLsizei n + GLuint *fences + + + + GLuint glGenFragmentShadersATI + GLuint range + + + void glGenFramebuffers + GLsizei n + GLuint *framebuffers + + + + void glGenFramebuffersEXT + GLsizei n + GLuint *framebuffers + + + + + void glGenFramebuffersOES + GLsizei n + GLuint *framebuffers + + + GLuint glGenLists + GLsizei range + + + + void glGenNamesAMD + GLenum identifier + GLuint num + GLuint *names + + + void glGenOcclusionQueriesNV + GLsizei n + GLuint *ids + + + GLuint glGenPathsNV + GLsizei range + + + void glGenPerfMonitorsAMD + GLsizei n + GLuint *monitors + + + void glGenProgramPipelines + GLsizei n + GLuint *pipelines + + + void glGenProgramPipelinesEXT + GLsizei n + GLuint *pipelines + + + void glGenProgramsARB + GLsizei n + GLuint *programs + + + + void glGenProgramsNV + GLsizei n + GLuint *programs + + + + + void glGenQueries + GLsizei n + GLuint *ids + + + + void glGenQueriesARB + GLsizei n + GLuint *ids + + + + void glGenQueriesEXT + GLsizei n + GLuint *ids + + + void glGenQueryResourceTagNV + GLsizei n + GLint *tagIds + + + void glGenRenderbuffers + GLsizei n + GLuint *renderbuffers + + + + void glGenRenderbuffersEXT + GLsizei n + GLuint *renderbuffers + + + + + void glGenRenderbuffersOES + GLsizei n + GLuint *renderbuffers + + + void glGenSamplers + GLsizei count + GLuint *samplers + + + void glGenSemaphoresEXT + GLsizei n + GLuint *semaphores + + + GLuint glGenSymbolsEXT + GLenum datatype + GLenum storagetype + GLenum range + GLuint components + + + void glGenTextures + GLsizei n + GLuint *textures + + + + void glGenTexturesEXT + GLsizei n + GLuint *textures + + + + void glGenTransformFeedbacks + GLsizei n + GLuint *ids + + + void glGenTransformFeedbacksNV + GLsizei n + GLuint *ids + + + + void glGenVertexArrays + GLsizei n + GLuint *arrays + + + + void glGenVertexArraysAPPLE + GLsizei n + GLuint *arrays + + + + void glGenVertexArraysOES + GLsizei n + GLuint *arrays + + + + GLuint glGenVertexShadersEXT + GLuint range + + + void glGenerateMipmap + GLenum target + + + + void glGenerateMipmapEXT + GLenum target + + + + + void glGenerateMipmapOES + GLenum target + + + void glGenerateMultiTexMipmapEXT + GLenum texunit + GLenum target + + + void glGenerateTextureMipmap + GLuint texture + + + void glGenerateTextureMipmapEXT + GLuint texture + GLenum target + + + void glGetActiveAtomicCounterBufferiv + GLuint program + GLuint bufferIndex + GLenum pname + GLint *params + + + void glGetActiveAttrib + GLuint program + GLuint index + GLsizei bufSize + GLsizei *length + GLint *size + GLenum *type + GLchar *name + + + void glGetActiveAttribARB + GLhandleARB programObj + GLuint index + GLsizei maxLength + GLsizei *length + GLint *size + GLenum *type + GLcharARB *name + + + + void glGetActiveSubroutineName + GLuint program + GLenum shadertype + GLuint index + GLsizei bufsize + GLsizei *length + GLchar *name + + + void glGetActiveSubroutineUniformName + GLuint program + GLenum shadertype + GLuint index + GLsizei bufsize + GLsizei *length + GLchar *name + + + void glGetActiveSubroutineUniformiv + GLuint program + GLenum shadertype + GLuint index + GLenum pname + GLint *values + + + void glGetActiveUniform + GLuint program + GLuint index + GLsizei bufSize + GLsizei *length + GLint *size + GLenum *type + GLchar *name + + + void glGetActiveUniformARB + GLhandleARB programObj + GLuint index + GLsizei maxLength + GLsizei *length + GLint *size + GLenum *type + GLcharARB *name + + + + void glGetActiveUniformBlockName + GLuint program + GLuint uniformBlockIndex + GLsizei bufSize + GLsizei *length + GLchar *uniformBlockName + + + + void glGetActiveUniformBlockiv + GLuint program + GLuint uniformBlockIndex + GLenum pname + GLint *params + + + + void glGetActiveUniformName + GLuint program + GLuint uniformIndex + GLsizei bufSize + GLsizei *length + GLchar *uniformName + + + + void glGetActiveUniformsiv + GLuint program + GLsizei uniformCount + const GLuint *uniformIndices + GLenum pname + GLint *params + + + + void glGetActiveVaryingNV + GLuint program + GLuint index + GLsizei bufSize + GLsizei *length + GLsizei *size + GLenum *type + GLchar *name + + + void glGetArrayObjectfvATI + GLenum array + GLenum pname + GLfloat *params + + + void glGetArrayObjectivATI + GLenum array + GLenum pname + GLint *params + + + void glGetAttachedObjectsARB + GLhandleARB containerObj + GLsizei maxCount + GLsizei *count + GLhandleARB *obj + + + void glGetAttachedShaders + GLuint program + GLsizei maxCount + GLsizei *count + GLuint *shaders + + + GLint glGetAttribLocation + GLuint program + const GLchar *name + + + GLint glGetAttribLocationARB + GLhandleARB programObj + const GLcharARB *name + + + + void glGetBooleanIndexedvEXT + GLenum target + GLuint index + GLboolean *data + + + + + void glGetBooleani_v + GLenum target + GLuint index + GLboolean *data + + + void glGetBooleanv + GLenum pname + GLboolean *data + + + + void glGetBufferParameteri64v + GLenum target + GLenum pname + GLint64 *params + + + void glGetBufferParameteriv + GLenum target + GLenum pname + GLint *params + + + void glGetBufferParameterivARB + GLenum target + GLenum pname + GLint *params + + + + void glGetBufferParameterui64vNV + GLenum target + GLenum pname + GLuint64EXT *params + + + void glGetBufferPointerv + GLenum target + GLenum pname + void **params + + + void glGetBufferPointervARB + GLenum target + GLenum pname + void **params + + + + void glGetBufferPointervOES + GLenum target + GLenum pname + void **params + + + + void glGetBufferSubData + GLenum target + GLintptr offset + GLsizeiptr size + void *data + + + void glGetBufferSubDataARB + GLenum target + GLintptrARB offset + GLsizeiptrARB size + void *data + + + + void glGetClipPlane + GLenum plane + GLdouble *equation + + + + void glGetClipPlanef + GLenum plane + GLfloat *equation + + + void glGetClipPlanefOES + GLenum plane + GLfloat *equation + + + + void glGetClipPlanex + GLenum plane + GLfixed *equation + + + void glGetClipPlanexOES + GLenum plane + GLfixed *equation + + + void glGetColorTable + GLenum target + GLenum format + GLenum type + void *table + + + + + void glGetColorTableEXT + GLenum target + GLenum format + GLenum type + void *data + + + + void glGetColorTableParameterfv + GLenum target + GLenum pname + GLfloat *params + + + + void glGetColorTableParameterfvEXT + GLenum target + GLenum pname + GLfloat *params + + + + void glGetColorTableParameterfvSGI + GLenum target + GLenum pname + GLfloat *params + + + + void glGetColorTableParameteriv + GLenum target + GLenum pname + GLint *params + + + + void glGetColorTableParameterivEXT + GLenum target + GLenum pname + GLint *params + + + + void glGetColorTableParameterivSGI + GLenum target + GLenum pname + GLint *params + + + + void glGetColorTableSGI + GLenum target + GLenum format + GLenum type + void *table + + + + void glGetCombinerInputParameterfvNV + GLenum stage + GLenum portion + GLenum variable + GLenum pname + GLfloat *params + + + + void glGetCombinerInputParameterivNV + GLenum stage + GLenum portion + GLenum variable + GLenum pname + GLint *params + + + + void glGetCombinerOutputParameterfvNV + GLenum stage + GLenum portion + GLenum pname + GLfloat *params + + + + void glGetCombinerOutputParameterivNV + GLenum stage + GLenum portion + GLenum pname + GLint *params + + + + void glGetCombinerStageParameterfvNV + GLenum stage + GLenum pname + GLfloat *params + + + GLuint glGetCommandHeaderNV + GLenum tokenID + GLuint size + + + void glGetCompressedMultiTexImageEXT + GLenum texunit + GLenum target + GLint lod + void *img + + + void glGetCompressedTexImage + GLenum target + GLint level + void *img + + + + + void glGetCompressedTexImageARB + GLenum target + GLint level + void *img + + + + + void glGetCompressedTextureImage + GLuint texture + GLint level + GLsizei bufSize + void *pixels + + + void glGetCompressedTextureImageEXT + GLuint texture + GLenum target + GLint lod + void *img + + + void glGetCompressedTextureSubImage + GLuint texture + GLint level + GLint xoffset + GLint yoffset + GLint zoffset + GLsizei width + GLsizei height + GLsizei depth + GLsizei bufSize + void *pixels + + + void glGetConvolutionFilter + GLenum target + GLenum format + GLenum type + void *image + + + + + void glGetConvolutionFilterEXT + GLenum target + GLenum format + GLenum type + void *image + + + + void glGetConvolutionParameterfv + GLenum target + GLenum pname + GLfloat *params + + + + void glGetConvolutionParameterfvEXT + GLenum target + GLenum pname + GLfloat *params + + + + void glGetConvolutionParameteriv + GLenum target + GLenum pname + GLint *params + + + + void glGetConvolutionParameterivEXT + GLenum target + GLenum pname + GLint *params + + + + void glGetConvolutionParameterxvOES + GLenum target + GLenum pname + GLfixed *params + + + void glGetCoverageModulationTableNV + GLsizei bufsize + GLfloat *v + + + GLuint glGetDebugMessageLog + GLuint count + GLsizei bufSize + GLenum *sources + GLenum *types + GLuint *ids + GLenum *severities + GLsizei *lengths + GLchar *messageLog + + + GLuint glGetDebugMessageLogAMD + GLuint count + GLsizei bufsize + GLenum *categories + GLuint *severities + GLuint *ids + GLsizei *lengths + GLchar *message + + + GLuint glGetDebugMessageLogARB + GLuint count + GLsizei bufSize + GLenum *sources + GLenum *types + GLuint *ids + GLenum *severities + GLsizei *lengths + GLchar *messageLog + + + + GLuint glGetDebugMessageLogKHR + GLuint count + GLsizei bufSize + GLenum *sources + GLenum *types + GLuint *ids + GLenum *severities + GLsizei *lengths + GLchar *messageLog + + + + void glGetDetailTexFuncSGIS + GLenum target + GLfloat *points + + + + void glGetDoubleIndexedvEXT + GLenum target + GLuint index + GLdouble *data + + + + void glGetDoublei_v + GLenum target + GLuint index + GLdouble *data + + + void glGetDoublei_vEXT + GLenum pname + GLuint index + GLdouble *params + + + + void glGetDoublev + GLenum pname + GLdouble *data + + + + void glGetDriverControlStringQCOM + GLuint driverControl + GLsizei bufSize + GLsizei *length + GLchar *driverControlString + + + void glGetDriverControlsQCOM + GLint *num + GLsizei size + GLuint *driverControls + + + GLenum glGetError + + + + void glGetFenceivNV + GLuint fence + GLenum pname + GLint *params + + + + void glGetFinalCombinerInputParameterfvNV + GLenum variable + GLenum pname + GLfloat *params + + + + void glGetFinalCombinerInputParameterivNV + GLenum variable + GLenum pname + GLint *params + + + + void glGetFirstPerfQueryIdINTEL + GLuint *queryId + + + void glGetFixedv + GLenum pname + GLfixed *params + + + void glGetFixedvOES + GLenum pname + GLfixed *params + + + void glGetFloatIndexedvEXT + GLenum target + GLuint index + GLfloat *data + + + + void glGetFloati_v + GLenum target + GLuint index + GLfloat *data + + + void glGetFloati_vEXT + GLenum pname + GLuint index + GLfloat *params + + + + void glGetFloati_vNV + GLenum target + GLuint index + GLfloat *data + + + + void glGetFloati_vOES + GLenum target + GLuint index + GLfloat *data + + + + void glGetFloatv + GLenum pname + GLfloat *data + + + + void glGetFogFuncSGIS + GLfloat *points + + + GLint glGetFragDataIndex + GLuint program + const GLchar *name + + + GLint glGetFragDataIndexEXT + GLuint program + const GLchar *name + + + + GLint glGetFragDataLocation + GLuint program + const GLchar *name + + + GLint glGetFragDataLocationEXT + GLuint program + const GLchar *name + + + + void glGetFragmentLightfvSGIX + GLenum light + GLenum pname + GLfloat *params + + + void glGetFragmentLightivSGIX + GLenum light + GLenum pname + GLint *params + + + void glGetFragmentMaterialfvSGIX + GLenum face + GLenum pname + GLfloat *params + + + void glGetFragmentMaterialivSGIX + GLenum face + GLenum pname + GLint *params + + + void glGetFramebufferAttachmentParameteriv + GLenum target + GLenum attachment + GLenum pname + GLint *params + + + + void glGetFramebufferAttachmentParameterivEXT + GLenum target + GLenum attachment + GLenum pname + GLint *params + + + + + void glGetFramebufferAttachmentParameterivOES + GLenum target + GLenum attachment + GLenum pname + GLint *params + + + void glGetFramebufferParameterfvAMD + GLenum target + GLenum pname + GLuint numsamples + GLuint pixelindex + GLsizei size + GLfloat *values + + + void glGetFramebufferParameteriv + GLenum target + GLenum pname + GLint *params + + + void glGetFramebufferParameterivEXT + GLuint framebuffer + GLenum pname + GLint *params + + + GLsizei glGetFramebufferPixelLocalStorageSizeEXT + GLuint target + + + GLenum glGetGraphicsResetStatus + + + GLenum glGetGraphicsResetStatusARB + + + GLenum glGetGraphicsResetStatusEXT + + + + GLenum glGetGraphicsResetStatusKHR + + + + GLhandleARB glGetHandleARB + GLenum pname + + + void glGetHistogram + GLenum target + GLboolean reset + GLenum format + GLenum type + void *values + + + + + void glGetHistogramEXT + GLenum target + GLboolean reset + GLenum format + GLenum type + void *values + + + + void glGetHistogramParameterfv + GLenum target + GLenum pname + GLfloat *params + + + + void glGetHistogramParameterfvEXT + GLenum target + GLenum pname + GLfloat *params + + + + void glGetHistogramParameteriv + GLenum target + GLenum pname + GLint *params + + + + void glGetHistogramParameterivEXT + GLenum target + GLenum pname + GLint *params + + + + void glGetHistogramParameterxvOES + GLenum target + GLenum pname + GLfixed *params + + + GLuint64 glGetImageHandleARB + GLuint texture + GLint level + GLboolean layered + GLint layer + GLenum format + + + GLuint64 glGetImageHandleNV + GLuint texture + GLint level + GLboolean layered + GLint layer + GLenum format + + + void glGetImageTransformParameterfvHP + GLenum target + GLenum pname + GLfloat *params + + + void glGetImageTransformParameterivHP + GLenum target + GLenum pname + GLint *params + + + void glGetInfoLogARB + GLhandleARB obj + GLsizei maxLength + GLsizei *length + GLcharARB *infoLog + + + GLint glGetInstrumentsSGIX + + + + void glGetInteger64i_v + GLenum target + GLuint index + GLint64 *data + + + void glGetInteger64v + GLenum pname + GLint64 *data + + + void glGetInteger64vAPPLE + GLenum pname + GLint64 *params + + + + void glGetIntegerIndexedvEXT + GLenum target + GLuint index + GLint *data + + + + + void glGetIntegeri_v + GLenum target + GLuint index + GLint *data + + + void glGetIntegeri_vEXT + GLenum target + GLuint index + GLint *data + + + void glGetIntegerui64i_vNV + GLenum value + GLuint index + GLuint64EXT *result + + + void glGetIntegerui64vNV + GLenum value + GLuint64EXT *result + + + void glGetIntegerv + GLenum pname + GLint *data + + + + void glGetInternalformatSampleivNV + GLenum target + GLenum internalformat + GLsizei samples + GLenum pname + GLsizei bufSize + GLint *params + + + void glGetInternalformati64v + GLenum target + GLenum internalformat + GLenum pname + GLsizei bufSize + GLint64 *params + + + void glGetInternalformativ + GLenum target + GLenum internalformat + GLenum pname + GLsizei bufSize + GLint *params + + + void glGetInvariantBooleanvEXT + GLuint id + GLenum value + GLboolean *data + + + void glGetInvariantFloatvEXT + GLuint id + GLenum value + GLfloat *data + + + void glGetInvariantIntegervEXT + GLuint id + GLenum value + GLint *data + + + void glGetLightfv + GLenum light + GLenum pname + GLfloat *params + + + + void glGetLightiv + GLenum light + GLenum pname + GLint *params + + + + void glGetLightxOES + GLenum light + GLenum pname + GLfixed *params + + + void glGetLightxv + GLenum light + GLenum pname + GLfixed *params + + + void glGetLightxvOES + GLenum light + GLenum pname + GLfixed *params + + + void glGetListParameterfvSGIX + GLuint list + GLenum pname + GLfloat *params + + + void glGetListParameterivSGIX + GLuint list + GLenum pname + GLint *params + + + void glGetLocalConstantBooleanvEXT + GLuint id + GLenum value + GLboolean *data + + + void glGetLocalConstantFloatvEXT + GLuint id + GLenum value + GLfloat *data + + + void glGetLocalConstantIntegervEXT + GLuint id + GLenum value + GLint *data + + + void glGetMapAttribParameterfvNV + GLenum target + GLuint index + GLenum pname + GLfloat *params + + + void glGetMapAttribParameterivNV + GLenum target + GLuint index + GLenum pname + GLint *params + + + void glGetMapControlPointsNV + GLenum target + GLuint index + GLenum type + GLsizei ustride + GLsizei vstride + GLboolean packed + void *points + + + void glGetMapParameterfvNV + GLenum target + GLenum pname + GLfloat *params + + + void glGetMapParameterivNV + GLenum target + GLenum pname + GLint *params + + + void glGetMapdv + GLenum target + GLenum query + GLdouble *v + + + + void glGetMapfv + GLenum target + GLenum query + GLfloat *v + + + + void glGetMapiv + GLenum target + GLenum query + GLint *v + + + + void glGetMapxvOES + GLenum target + GLenum query + GLfixed *v + + + void glGetMaterialfv + GLenum face + GLenum pname + GLfloat *params + + + + void glGetMaterialiv + GLenum face + GLenum pname + GLint *params + + + + void glGetMaterialxOES + GLenum face + GLenum pname + GLfixed param + + + void glGetMaterialxv + GLenum face + GLenum pname + GLfixed *params + + + void glGetMaterialxvOES + GLenum face + GLenum pname + GLfixed *params + + + void glGetMemoryObjectDetachedResourcesuivNV + GLuint memory + GLenum pname + GLint first + GLsizei count + GLuint *params + + + void glGetMemoryObjectParameterivEXT + GLuint memoryObject + GLenum pname + GLint *params + + + void glGetMinmax + GLenum target + GLboolean reset + GLenum format + GLenum type + void *values + + + + + void glGetMinmaxEXT + GLenum target + GLboolean reset + GLenum format + GLenum type + void *values + + + + void glGetMinmaxParameterfv + GLenum target + GLenum pname + GLfloat *params + + + + void glGetMinmaxParameterfvEXT + GLenum target + GLenum pname + GLfloat *params + + + + void glGetMinmaxParameteriv + GLenum target + GLenum pname + GLint *params + + + + void glGetMinmaxParameterivEXT + GLenum target + GLenum pname + GLint *params + + + + void glGetMultiTexEnvfvEXT + GLenum texunit + GLenum target + GLenum pname + GLfloat *params + + + void glGetMultiTexEnvivEXT + GLenum texunit + GLenum target + GLenum pname + GLint *params + + + void glGetMultiTexGendvEXT + GLenum texunit + GLenum coord + GLenum pname + GLdouble *params + + + void glGetMultiTexGenfvEXT + GLenum texunit + GLenum coord + GLenum pname + GLfloat *params + + + void glGetMultiTexGenivEXT + GLenum texunit + GLenum coord + GLenum pname + GLint *params + + + void glGetMultiTexImageEXT + GLenum texunit + GLenum target + GLint level + GLenum format + GLenum type + void *pixels + + + void glGetMultiTexLevelParameterfvEXT + GLenum texunit + GLenum target + GLint level + GLenum pname + GLfloat *params + + + void glGetMultiTexLevelParameterivEXT + GLenum texunit + GLenum target + GLint level + GLenum pname + GLint *params + + + void glGetMultiTexParameterIivEXT + GLenum texunit + GLenum target + GLenum pname + GLint *params + + + void glGetMultiTexParameterIuivEXT + GLenum texunit + GLenum target + GLenum pname + GLuint *params + + + void glGetMultiTexParameterfvEXT + GLenum texunit + GLenum target + GLenum pname + GLfloat *params + + + void glGetMultiTexParameterivEXT + GLenum texunit + GLenum target + GLenum pname + GLint *params + + + void glGetMultisamplefv + GLenum pname + GLuint index + GLfloat *val + + + void glGetMultisamplefvNV + GLenum pname + GLuint index + GLfloat *val + + + + void glGetNamedBufferParameteri64v + GLuint buffer + GLenum pname + GLint64 *params + + + void glGetNamedBufferParameteriv + GLuint buffer + GLenum pname + GLint *params + + + void glGetNamedBufferParameterivEXT + GLuint buffer + GLenum pname + GLint *params + + + void glGetNamedBufferParameterui64vNV + GLuint buffer + GLenum pname + GLuint64EXT *params + + + void glGetNamedBufferPointerv + GLuint buffer + GLenum pname + void **params + + + void glGetNamedBufferPointervEXT + GLuint buffer + GLenum pname + void **params + + + void glGetNamedBufferSubData + GLuint buffer + GLintptr offset + GLsizeiptr size + void *data + + + void glGetNamedBufferSubDataEXT + GLuint buffer + GLintptr offset + GLsizeiptr size + void *data + + + void glGetNamedFramebufferParameterfvAMD + GLuint framebuffer + GLenum pname + GLuint numsamples + GLuint pixelindex + GLsizei size + GLfloat *values + + + void glGetNamedFramebufferAttachmentParameteriv + GLuint framebuffer + GLenum attachment + GLenum pname + GLint *params + + + void glGetNamedFramebufferAttachmentParameterivEXT + GLuint framebuffer + GLenum attachment + GLenum pname + GLint *params + + + void glGetNamedFramebufferParameteriv + GLuint framebuffer + GLenum pname + GLint *param + + + void glGetNamedFramebufferParameterivEXT + GLuint framebuffer + GLenum pname + GLint *params + + + void glGetNamedProgramLocalParameterIivEXT + GLuint program + GLenum target + GLuint index + GLint *params + + + void glGetNamedProgramLocalParameterIuivEXT + GLuint program + GLenum target + GLuint index + GLuint *params + + + void glGetNamedProgramLocalParameterdvEXT + GLuint program + GLenum target + GLuint index + GLdouble *params + + + void glGetNamedProgramLocalParameterfvEXT + GLuint program + GLenum target + GLuint index + GLfloat *params + + + void glGetNamedProgramStringEXT + GLuint program + GLenum target + GLenum pname + void *string + + + void glGetNamedProgramivEXT + GLuint program + GLenum target + GLenum pname + GLint *params + + + void glGetNamedRenderbufferParameteriv + GLuint renderbuffer + GLenum pname + GLint *params + + + void glGetNamedRenderbufferParameterivEXT + GLuint renderbuffer + GLenum pname + GLint *params + + + void glGetNamedStringARB + GLint namelen + const GLchar *name + GLsizei bufSize + GLint *stringlen + GLchar *string + + + void glGetNamedStringivARB + GLint namelen + const GLchar *name + GLenum pname + GLint *params + + + void glGetNextPerfQueryIdINTEL + GLuint queryId + GLuint *nextQueryId + + + void glGetObjectBufferfvATI + GLuint buffer + GLenum pname + GLfloat *params + + + void glGetObjectBufferivATI + GLuint buffer + GLenum pname + GLint *params + + + void glGetObjectLabel + GLenum identifier + GLuint name + GLsizei bufSize + GLsizei *length + GLchar *label + + + void glGetObjectLabelEXT + GLenum type + GLuint object + GLsizei bufSize + GLsizei *length + GLchar *label + + + void glGetObjectLabelKHR + GLenum identifier + GLuint name + GLsizei bufSize + GLsizei *length + GLchar *label + + + + void glGetObjectParameterfvARB + GLhandleARB obj + GLenum pname + GLfloat *params + + + void glGetObjectParameterivAPPLE + GLenum objectType + GLuint name + GLenum pname + GLint *params + + + void glGetObjectParameterivARB + GLhandleARB obj + GLenum pname + GLint *params + + + void glGetObjectPtrLabel + const void *ptr + GLsizei bufSize + GLsizei *length + GLchar *label + + + void glGetObjectPtrLabelKHR + const void *ptr + GLsizei bufSize + GLsizei *length + GLchar *label + + + + void glGetOcclusionQueryivNV + GLuint id + GLenum pname + GLint *params + + + void glGetOcclusionQueryuivNV + GLuint id + GLenum pname + GLuint *params + + + void glGetPathColorGenfvNV + GLenum color + GLenum pname + GLfloat *value + + + void glGetPathColorGenivNV + GLenum color + GLenum pname + GLint *value + + + void glGetPathCommandsNV + GLuint path + GLubyte *commands + + + void glGetPathCoordsNV + GLuint path + GLfloat *coords + + + void glGetPathDashArrayNV + GLuint path + GLfloat *dashArray + + + GLfloat glGetPathLengthNV + GLuint path + GLsizei startSegment + GLsizei numSegments + + + void glGetPathMetricRangeNV + GLbitfield metricQueryMask + GLuint firstPathName + GLsizei numPaths + GLsizei stride + GLfloat *metrics + + + void glGetPathMetricsNV + GLbitfield metricQueryMask + GLsizei numPaths + GLenum pathNameType + const void *paths + GLuint pathBase + GLsizei stride + GLfloat *metrics + + + void glGetPathParameterfvNV + GLuint path + GLenum pname + GLfloat *value + + + void glGetPathParameterivNV + GLuint path + GLenum pname + GLint *value + + + void glGetPathSpacingNV + GLenum pathListMode + GLsizei numPaths + GLenum pathNameType + const void *paths + GLuint pathBase + GLfloat advanceScale + GLfloat kerningScale + GLenum transformType + GLfloat *returnedSpacing + + + void glGetPathTexGenfvNV + GLenum texCoordSet + GLenum pname + GLfloat *value + + + void glGetPathTexGenivNV + GLenum texCoordSet + GLenum pname + GLint *value + + + void glGetPerfCounterInfoINTEL + GLuint queryId + GLuint counterId + GLuint counterNameLength + GLchar *counterName + GLuint counterDescLength + GLchar *counterDesc + GLuint *counterOffset + GLuint *counterDataSize + GLuint *counterTypeEnum + GLuint *counterDataTypeEnum + GLuint64 *rawCounterMaxValue + + + void glGetPerfMonitorCounterDataAMD + GLuint monitor + GLenum pname + GLsizei dataSize + GLuint *data + GLint *bytesWritten + + + void glGetPerfMonitorCounterInfoAMD + GLuint group + GLuint counter + GLenum pname + void *data + + + void glGetPerfMonitorCounterStringAMD + GLuint group + GLuint counter + GLsizei bufSize + GLsizei *length + GLchar *counterString + + + void glGetPerfMonitorCountersAMD + GLuint group + GLint *numCounters + GLint *maxActiveCounters + GLsizei counterSize + GLuint *counters + + + void glGetPerfMonitorGroupStringAMD + GLuint group + GLsizei bufSize + GLsizei *length + GLchar *groupString + + + void glGetPerfMonitorGroupsAMD + GLint *numGroups + GLsizei groupsSize + GLuint *groups + + + void glGetPerfQueryDataINTEL + GLuint queryHandle + GLuint flags + GLsizei dataSize + void *data + GLuint *bytesWritten + + + void glGetPerfQueryIdByNameINTEL + GLchar *queryName + GLuint *queryId + + + void glGetPerfQueryInfoINTEL + GLuint queryId + GLuint queryNameLength + GLchar *queryName + GLuint *dataSize + GLuint *noCounters + GLuint *noInstances + GLuint *capsMask + + + void glGetPixelMapfv + GLenum map + GLfloat *values + + + + + void glGetPixelMapuiv + GLenum map + GLuint *values + + + + + void glGetPixelMapusv + GLenum map + GLushort *values + + + + + void glGetPixelMapxv + GLenum map + GLint size + GLfixed *values + + + void glGetPixelTexGenParameterfvSGIS + GLenum pname + GLfloat *params + + + void glGetPixelTexGenParameterivSGIS + GLenum pname + GLint *params + + + void glGetPixelTransformParameterfvEXT + GLenum target + GLenum pname + GLfloat *params + + + + void glGetPixelTransformParameterivEXT + GLenum target + GLenum pname + GLint *params + + + + void glGetPointerIndexedvEXT + GLenum target + GLuint index + void **data + + + void glGetPointeri_vEXT + GLenum pname + GLuint index + void **params + + + void glGetPointerv + GLenum pname + void **params + + + + void glGetPointervEXT + GLenum pname + void **params + + + + void glGetPointervKHR + GLenum pname + void **params + + + + void glGetPolygonStipple + GLubyte *mask + + + + + void glGetProgramBinary + GLuint program + GLsizei bufSize + GLsizei *length + GLenum *binaryFormat + void *binary + + + void glGetProgramBinaryOES + GLuint program + GLsizei bufSize + GLsizei *length + GLenum *binaryFormat + void *binary + + + + void glGetProgramEnvParameterIivNV + GLenum target + GLuint index + GLint *params + + + void glGetProgramEnvParameterIuivNV + GLenum target + GLuint index + GLuint *params + + + void glGetProgramEnvParameterdvARB + GLenum target + GLuint index + GLdouble *params + + + void glGetProgramEnvParameterfvARB + GLenum target + GLuint index + GLfloat *params + + + void glGetProgramInfoLog + GLuint program + GLsizei bufSize + GLsizei *length + GLchar *infoLog + + + + void glGetProgramInterfaceiv + GLuint program + GLenum programInterface + GLenum pname + GLint *params + + + void glGetProgramLocalParameterIivNV + GLenum target + GLuint index + GLint *params + + + void glGetProgramLocalParameterIuivNV + GLenum target + GLuint index + GLuint *params + + + void glGetProgramLocalParameterdvARB + GLenum target + GLuint index + GLdouble *params + + + void glGetProgramLocalParameterfvARB + GLenum target + GLuint index + GLfloat *params + + + void glGetProgramNamedParameterdvNV + GLuint id + GLsizei len + const GLubyte *name + GLdouble *params + + + + void glGetProgramNamedParameterfvNV + GLuint id + GLsizei len + const GLubyte *name + GLfloat *params + + + + void glGetProgramParameterdvNV + GLenum target + GLuint index + GLenum pname + GLdouble *params + + + + void glGetProgramParameterfvNV + GLenum target + GLuint index + GLenum pname + GLfloat *params + + + + void glGetProgramPipelineInfoLog + GLuint pipeline + GLsizei bufSize + GLsizei *length + GLchar *infoLog + + + void glGetProgramPipelineInfoLogEXT + GLuint pipeline + GLsizei bufSize + GLsizei *length + GLchar *infoLog + + + void glGetProgramPipelineiv + GLuint pipeline + GLenum pname + GLint *params + + + void glGetProgramPipelineivEXT + GLuint pipeline + GLenum pname + GLint *params + + + GLuint glGetProgramResourceIndex + GLuint program + GLenum programInterface + const GLchar *name + + + GLint glGetProgramResourceLocation + GLuint program + GLenum programInterface + const GLchar *name + + + GLint glGetProgramResourceLocationIndex + GLuint program + GLenum programInterface + const GLchar *name + + + GLint glGetProgramResourceLocationIndexEXT + GLuint program + GLenum programInterface + const GLchar *name + + + void glGetProgramResourceName + GLuint program + GLenum programInterface + GLuint index + GLsizei bufSize + GLsizei *length + GLchar *name + + + void glGetProgramResourcefvNV + GLuint program + GLenum programInterface + GLuint index + GLsizei propCount + const GLenum *props + GLsizei bufSize + GLsizei *length + GLfloat *params + + + void glGetProgramResourceiv + GLuint program + GLenum programInterface + GLuint index + GLsizei propCount + const GLenum *props + GLsizei bufSize + GLsizei *length + GLint *params + + + void glGetProgramStageiv + GLuint program + GLenum shadertype + GLenum pname + GLint *values + + + void glGetProgramStringARB + GLenum target + GLenum pname + void *string + + + void glGetProgramStringNV + GLuint id + GLenum pname + GLubyte *program + + + + void glGetProgramSubroutineParameteruivNV + GLenum target + GLuint index + GLuint *param + + + void glGetProgramiv + GLuint program + GLenum pname + GLint *params + + + + void glGetProgramivARB + GLenum target + GLenum pname + GLint *params + + + void glGetProgramivNV + GLuint id + GLenum pname + GLint *params + + + + void glGetQueryBufferObjecti64v + GLuint id + GLuint buffer + GLenum pname + GLintptr offset + + + void glGetQueryBufferObjectiv + GLuint id + GLuint buffer + GLenum pname + GLintptr offset + + + void glGetQueryBufferObjectui64v + GLuint id + GLuint buffer + GLenum pname + GLintptr offset + + + void glGetQueryBufferObjectuiv + GLuint id + GLuint buffer + GLenum pname + GLintptr offset + + + void glGetQueryIndexediv + GLenum target + GLuint index + GLenum pname + GLint *params + + + void glGetQueryObjecti64v + GLuint id + GLenum pname + GLint64 *params + + + void glGetQueryObjecti64vEXT + GLuint id + GLenum pname + GLint64 *params + + + + + void glGetQueryObjectiv + GLuint id + GLenum pname + GLint *params + + + + void glGetQueryObjectivARB + GLuint id + GLenum pname + GLint *params + + + + void glGetQueryObjectivEXT + GLuint id + GLenum pname + GLint *params + + + + void glGetQueryObjectui64v + GLuint id + GLenum pname + GLuint64 *params + + + void glGetQueryObjectui64vEXT + GLuint id + GLenum pname + GLuint64 *params + + + + + void glGetQueryObjectuiv + GLuint id + GLenum pname + GLuint *params + + + + void glGetQueryObjectuivARB + GLuint id + GLenum pname + GLuint *params + + + + void glGetQueryObjectuivEXT + GLuint id + GLenum pname + GLuint *params + + + void glGetQueryiv + GLenum target + GLenum pname + GLint *params + + + + void glGetQueryivARB + GLenum target + GLenum pname + GLint *params + + + + void glGetQueryivEXT + GLenum target + GLenum pname + GLint *params + + + void glGetRenderbufferParameteriv + GLenum target + GLenum pname + GLint *params + + + + void glGetRenderbufferParameterivEXT + GLenum target + GLenum pname + GLint *params + + + + + void glGetRenderbufferParameterivOES + GLenum target + GLenum pname + GLint *params + + + void glGetSamplerParameterIiv + GLuint sampler + GLenum pname + GLint *params + + + void glGetSamplerParameterIivEXT + GLuint sampler + GLenum pname + GLint *params + + + + void glGetSamplerParameterIivOES + GLuint sampler + GLenum pname + GLint *params + + + + void glGetSamplerParameterIuiv + GLuint sampler + GLenum pname + GLuint *params + + + void glGetSamplerParameterIuivEXT + GLuint sampler + GLenum pname + GLuint *params + + + + void glGetSamplerParameterIuivOES + GLuint sampler + GLenum pname + GLuint *params + + + + void glGetSamplerParameterfv + GLuint sampler + GLenum pname + GLfloat *params + + + void glGetSamplerParameteriv + GLuint sampler + GLenum pname + GLint *params + + + void glGetSemaphoreParameterui64vEXT + GLuint semaphore + GLenum pname + GLuint64 *params + + + void glGetSeparableFilter + GLenum target + GLenum format + GLenum type + void *row + void *column + void *span + + + + + void glGetSeparableFilterEXT + GLenum target + GLenum format + GLenum type + void *row + void *column + void *span + + + + void glGetShaderInfoLog + GLuint shader + GLsizei bufSize + GLsizei *length + GLchar *infoLog + + + + void glGetShaderPrecisionFormat + GLenum shadertype + GLenum precisiontype + GLint *range + GLint *precision + + + void glGetShaderSource + GLuint shader + GLsizei bufSize + GLsizei *length + GLchar *source + + + void glGetShaderSourceARB + GLhandleARB obj + GLsizei maxLength + GLsizei *length + GLcharARB *source + + + + void glGetShaderiv + GLuint shader + GLenum pname + GLint *params + + + + void glGetShadingRateImagePaletteNV + GLuint viewport + GLuint entry + GLenum *rate + + + void glGetShadingRateSampleLocationivNV + GLenum rate + GLuint samples + GLuint index + GLint *location + + + void glGetSharpenTexFuncSGIS + GLenum target + GLfloat *points + + + + GLushort glGetStageIndexNV + GLenum shadertype + + + const GLubyte *glGetString + GLenum name + + + + const GLubyte *glGetStringi + GLenum name + GLuint index + + + + GLuint glGetSubroutineIndex + GLuint program + GLenum shadertype + const GLchar *name + + + GLint glGetSubroutineUniformLocation + GLuint program + GLenum shadertype + const GLchar *name + + + void glGetSynciv + GLsync sync + GLenum pname + GLsizei bufSize + GLsizei *length + GLint *values + + + void glGetSyncivAPPLE + GLsync sync + GLenum pname + GLsizei bufSize + GLsizei *length + GLint *values + + + + void glGetTexBumpParameterfvATI + GLenum pname + GLfloat *param + + + void glGetTexBumpParameterivATI + GLenum pname + GLint *param + + + void glGetTexEnvfv + GLenum target + GLenum pname + GLfloat *params + + + + void glGetTexEnviv + GLenum target + GLenum pname + GLint *params + + + + void glGetTexEnvxv + GLenum target + GLenum pname + GLfixed *params + + + void glGetTexEnvxvOES + GLenum target + GLenum pname + GLfixed *params + + + void glGetTexFilterFuncSGIS + GLenum target + GLenum filter + GLfloat *weights + + + + void glGetTexGendv + GLenum coord + GLenum pname + GLdouble *params + + + + void glGetTexGenfv + GLenum coord + GLenum pname + GLfloat *params + + + + void glGetTexGenfvOES + GLenum coord + GLenum pname + GLfloat *params + + + void glGetTexGeniv + GLenum coord + GLenum pname + GLint *params + + + + void glGetTexGenivOES + GLenum coord + GLenum pname + GLint *params + + + void glGetTexGenxvOES + GLenum coord + GLenum pname + GLfixed *params + + + void glGetTexImage + GLenum target + GLint level + GLenum format + GLenum type + void *pixels + + + + + void glGetTexLevelParameterfv + GLenum target + GLint level + GLenum pname + GLfloat *params + + + + void glGetTexLevelParameteriv + GLenum target + GLint level + GLenum pname + GLint *params + + + + void glGetTexLevelParameterxvOES + GLenum target + GLint level + GLenum pname + GLfixed *params + + + void glGetTexParameterIiv + GLenum target + GLenum pname + GLint *params + + + + void glGetTexParameterIivEXT + GLenum target + GLenum pname + GLint *params + + + + void glGetTexParameterIivOES + GLenum target + GLenum pname + GLint *params + + + + void glGetTexParameterIuiv + GLenum target + GLenum pname + GLuint *params + + + + void glGetTexParameterIuivEXT + GLenum target + GLenum pname + GLuint *params + + + + void glGetTexParameterIuivOES + GLenum target + GLenum pname + GLuint *params + + + + void glGetTexParameterPointervAPPLE + GLenum target + GLenum pname + void **params + + + void glGetTexParameterfv + GLenum target + GLenum pname + GLfloat *params + + + + void glGetTexParameteriv + GLenum target + GLenum pname + GLint *params + + + + void glGetTexParameterxv + GLenum target + GLenum pname + GLfixed *params + + + void glGetTexParameterxvOES + GLenum target + GLenum pname + GLfixed *params + + + GLuint64 glGetTextureHandleARB + GLuint texture + + + GLuint64 glGetTextureHandleIMG + GLuint texture + + + + GLuint64 glGetTextureHandleNV + GLuint texture + + + void glGetTextureImage + GLuint texture + GLint level + GLenum format + GLenum type + GLsizei bufSize + void *pixels + + + void glGetTextureImageEXT + GLuint texture + GLenum target + GLint level + GLenum format + GLenum type + void *pixels + + + void glGetTextureLevelParameterfv + GLuint texture + GLint level + GLenum pname + GLfloat *params + + + void glGetTextureLevelParameterfvEXT + GLuint texture + GLenum target + GLint level + GLenum pname + GLfloat *params + + + void glGetTextureLevelParameteriv + GLuint texture + GLint level + GLenum pname + GLint *params + + + void glGetTextureLevelParameterivEXT + GLuint texture + GLenum target + GLint level + GLenum pname + GLint *params + + + void glGetTextureParameterIiv + GLuint texture + GLenum pname + GLint *params + + + void glGetTextureParameterIivEXT + GLuint texture + GLenum target + GLenum pname + GLint *params + + + void glGetTextureParameterIuiv + GLuint texture + GLenum pname + GLuint *params + + + void glGetTextureParameterIuivEXT + GLuint texture + GLenum target + GLenum pname + GLuint *params + + + void glGetTextureParameterfv + GLuint texture + GLenum pname + GLfloat *params + + + void glGetTextureParameterfvEXT + GLuint texture + GLenum target + GLenum pname + GLfloat *params + + + void glGetTextureParameteriv + GLuint texture + GLenum pname + GLint *params + + + void glGetTextureParameterivEXT + GLuint texture + GLenum target + GLenum pname + GLint *params + + + GLuint64 glGetTextureSamplerHandleARB + GLuint texture + GLuint sampler + + + GLuint64 glGetTextureSamplerHandleIMG + GLuint texture + GLuint sampler + + + + GLuint64 glGetTextureSamplerHandleNV + GLuint texture + GLuint sampler + + + void glGetTextureSubImage + GLuint texture + GLint level + GLint xoffset + GLint yoffset + GLint zoffset + GLsizei width + GLsizei height + GLsizei depth + GLenum format + GLenum type + GLsizei bufSize + void *pixels + + + void glGetTrackMatrixivNV + GLenum target + GLuint address + GLenum pname + GLint *params + + + + void glGetTransformFeedbackVarying + GLuint program + GLuint index + GLsizei bufSize + GLsizei *length + GLsizei *size + GLenum *type + GLchar *name + + + + void glGetTransformFeedbackVaryingEXT + GLuint program + GLuint index + GLsizei bufSize + GLsizei *length + GLsizei *size + GLenum *type + GLchar *name + + + + void glGetTransformFeedbackVaryingNV + GLuint program + GLuint index + GLint *location + + + void glGetTransformFeedbacki64_v + GLuint xfb + GLenum pname + GLuint index + GLint64 *param + + + void glGetTransformFeedbacki_v + GLuint xfb + GLenum pname + GLuint index + GLint *param + + + void glGetTransformFeedbackiv + GLuint xfb + GLenum pname + GLint *param + + + void glGetTranslatedShaderSourceANGLE + GLuint shader + GLsizei bufsize + GLsizei *length + GLchar *source + + + GLuint glGetUniformBlockIndex + GLuint program + const GLchar *uniformBlockName + + + + GLint glGetUniformBufferSizeEXT + GLuint program + GLint location + + + void glGetUniformIndices + GLuint program + GLsizei uniformCount + const GLchar *const*uniformNames + GLuint *uniformIndices + + + + GLint glGetUniformLocation + GLuint program + const GLchar *name + + + GLint glGetUniformLocationARB + GLhandleARB programObj + const GLcharARB *name + + + + GLintptr glGetUniformOffsetEXT + GLuint program + GLint location + + + void glGetUniformSubroutineuiv + GLenum shadertype + GLint location + GLuint *params + + + void glGetUniformdv + GLuint program + GLint location + GLdouble *params + + + void glGetUniformfv + GLuint program + GLint location + GLfloat *params + + + void glGetUniformfvARB + GLhandleARB programObj + GLint location + GLfloat *params + + + + void glGetUniformi64vARB + GLuint program + GLint location + GLint64 *params + + + void glGetUniformi64vNV + GLuint program + GLint location + GLint64EXT *params + + + void glGetUniformiv + GLuint program + GLint location + GLint *params + + + void glGetUniformivARB + GLhandleARB programObj + GLint location + GLint *params + + + + void glGetUniformui64vARB + GLuint program + GLint location + GLuint64 *params + + + void glGetUniformui64vNV + GLuint program + GLint location + GLuint64EXT *params + + + void glGetUniformuiv + GLuint program + GLint location + GLuint *params + + + void glGetUniformuivEXT + GLuint program + GLint location + GLuint *params + + + + void glGetUnsignedBytevEXT + GLenum pname + GLubyte *data + + + void glGetUnsignedBytei_vEXT + GLenum target + GLuint index + GLubyte *data + + + void glGetVariantArrayObjectfvATI + GLuint id + GLenum pname + GLfloat *params + + + void glGetVariantArrayObjectivATI + GLuint id + GLenum pname + GLint *params + + + void glGetVariantBooleanvEXT + GLuint id + GLenum value + GLboolean *data + + + void glGetVariantFloatvEXT + GLuint id + GLenum value + GLfloat *data + + + void glGetVariantIntegervEXT + GLuint id + GLenum value + GLint *data + + + void glGetVariantPointervEXT + GLuint id + GLenum value + void **data + + + GLint glGetVaryingLocationNV + GLuint program + const GLchar *name + + + void glGetVertexArrayIndexed64iv + GLuint vaobj + GLuint index + GLenum pname + GLint64 *param + + + void glGetVertexArrayIndexediv + GLuint vaobj + GLuint index + GLenum pname + GLint *param + + + void glGetVertexArrayIntegeri_vEXT + GLuint vaobj + GLuint index + GLenum pname + GLint *param + + + void glGetVertexArrayIntegervEXT + GLuint vaobj + GLenum pname + GLint *param + + + void glGetVertexArrayPointeri_vEXT + GLuint vaobj + GLuint index + GLenum pname + void **param + + + void glGetVertexArrayPointervEXT + GLuint vaobj + GLenum pname + void **param + + + void glGetVertexArrayiv + GLuint vaobj + GLenum pname + GLint *param + + + void glGetVertexAttribArrayObjectfvATI + GLuint index + GLenum pname + GLfloat *params + + + void glGetVertexAttribArrayObjectivATI + GLuint index + GLenum pname + GLint *params + + + void glGetVertexAttribIiv + GLuint index + GLenum pname + GLint *params + + + void glGetVertexAttribIivEXT + GLuint index + GLenum pname + GLint *params + + + + void glGetVertexAttribIuiv + GLuint index + GLenum pname + GLuint *params + + + void glGetVertexAttribIuivEXT + GLuint index + GLenum pname + GLuint *params + + + + void glGetVertexAttribLdv + GLuint index + GLenum pname + GLdouble *params + + + void glGetVertexAttribLdvEXT + GLuint index + GLenum pname + GLdouble *params + + + + void glGetVertexAttribLi64vNV + GLuint index + GLenum pname + GLint64EXT *params + + + void glGetVertexAttribLui64vARB + GLuint index + GLenum pname + GLuint64EXT *params + + + void glGetVertexAttribLui64vNV + GLuint index + GLenum pname + GLuint64EXT *params + + + void glGetVertexAttribPointerv + GLuint index + GLenum pname + void **pointer + + + + void glGetVertexAttribPointervARB + GLuint index + GLenum pname + void **pointer + + + + void glGetVertexAttribPointervNV + GLuint index + GLenum pname + void **pointer + + + + void glGetVertexAttribdv + GLuint index + GLenum pname + GLdouble *params + + + + void glGetVertexAttribdvARB + GLuint index + GLenum pname + GLdouble *params + + + + + void glGetVertexAttribdvNV + GLuint index + GLenum pname + GLdouble *params + + + + + void glGetVertexAttribfv + GLuint index + GLenum pname + GLfloat *params + + + + void glGetVertexAttribfvARB + GLuint index + GLenum pname + GLfloat *params + + + + + void glGetVertexAttribfvNV + GLuint index + GLenum pname + GLfloat *params + + + + + void glGetVertexAttribiv + GLuint index + GLenum pname + GLint *params + + + + void glGetVertexAttribivARB + GLuint index + GLenum pname + GLint *params + + + + + void glGetVertexAttribivNV + GLuint index + GLenum pname + GLint *params + + + + + void glGetVideoCaptureStreamdvNV + GLuint video_capture_slot + GLuint stream + GLenum pname + GLdouble *params + + + void glGetVideoCaptureStreamfvNV + GLuint video_capture_slot + GLuint stream + GLenum pname + GLfloat *params + + + void glGetVideoCaptureStreamivNV + GLuint video_capture_slot + GLuint stream + GLenum pname + GLint *params + + + void glGetVideoCaptureivNV + GLuint video_capture_slot + GLenum pname + GLint *params + + + void glGetVideoi64vNV + GLuint video_slot + GLenum pname + GLint64EXT *params + + + void glGetVideoivNV + GLuint video_slot + GLenum pname + GLint *params + + + void glGetVideoui64vNV + GLuint video_slot + GLenum pname + GLuint64EXT *params + + + void glGetVideouivNV + GLuint video_slot + GLenum pname + GLuint *params + + + void glGetnColorTable + GLenum target + GLenum format + GLenum type + GLsizei bufSize + void *table + + + void glGetnColorTableARB + GLenum target + GLenum format + GLenum type + GLsizei bufSize + void *table + + + void glGetnCompressedTexImage + GLenum target + GLint lod + GLsizei bufSize + void *pixels + + + void glGetnCompressedTexImageARB + GLenum target + GLint lod + GLsizei bufSize + void *img + + + void glGetnConvolutionFilter + GLenum target + GLenum format + GLenum type + GLsizei bufSize + void *image + + + void glGetnConvolutionFilterARB + GLenum target + GLenum format + GLenum type + GLsizei bufSize + void *image + + + void glGetnHistogram + GLenum target + GLboolean reset + GLenum format + GLenum type + GLsizei bufSize + void *values + + + void glGetnHistogramARB + GLenum target + GLboolean reset + GLenum format + GLenum type + GLsizei bufSize + void *values + + + void glGetnMapdv + GLenum target + GLenum query + GLsizei bufSize + GLdouble *v + + + void glGetnMapdvARB + GLenum target + GLenum query + GLsizei bufSize + GLdouble *v + + + void glGetnMapfv + GLenum target + GLenum query + GLsizei bufSize + GLfloat *v + + + void glGetnMapfvARB + GLenum target + GLenum query + GLsizei bufSize + GLfloat *v + + + void glGetnMapiv + GLenum target + GLenum query + GLsizei bufSize + GLint *v + + + void glGetnMapivARB + GLenum target + GLenum query + GLsizei bufSize + GLint *v + + + void glGetnMinmax + GLenum target + GLboolean reset + GLenum format + GLenum type + GLsizei bufSize + void *values + + + void glGetnMinmaxARB + GLenum target + GLboolean reset + GLenum format + GLenum type + GLsizei bufSize + void *values + + + void glGetnPixelMapfv + GLenum map + GLsizei bufSize + GLfloat *values + + + void glGetnPixelMapfvARB + GLenum map + GLsizei bufSize + GLfloat *values + + + void glGetnPixelMapuiv + GLenum map + GLsizei bufSize + GLuint *values + + + void glGetnPixelMapuivARB + GLenum map + GLsizei bufSize + GLuint *values + + + void glGetnPixelMapusv + GLenum map + GLsizei bufSize + GLushort *values + + + void glGetnPixelMapusvARB + GLenum map + GLsizei bufSize + GLushort *values + + + void glGetnPolygonStipple + GLsizei bufSize + GLubyte *pattern + + + void glGetnPolygonStippleARB + GLsizei bufSize + GLubyte *pattern + + + void glGetnSeparableFilter + GLenum target + GLenum format + GLenum type + GLsizei rowBufSize + void *row + GLsizei columnBufSize + void *column + void *span + + + void glGetnSeparableFilterARB + GLenum target + GLenum format + GLenum type + GLsizei rowBufSize + void *row + GLsizei columnBufSize + void *column + void *span + + + void glGetnTexImage + GLenum target + GLint level + GLenum format + GLenum type + GLsizei bufSize + void *pixels + + + void glGetnTexImageARB + GLenum target + GLint level + GLenum format + GLenum type + GLsizei bufSize + void *img + + + void glGetnUniformdv + GLuint program + GLint location + GLsizei bufSize + GLdouble *params + + + void glGetnUniformdvARB + GLuint program + GLint location + GLsizei bufSize + GLdouble *params + + + void glGetnUniformfv + GLuint program + GLint location + GLsizei bufSize + GLfloat *params + + + void glGetnUniformfvARB + GLuint program + GLint location + GLsizei bufSize + GLfloat *params + + + void glGetnUniformfvEXT + GLuint program + GLint location + GLsizei bufSize + GLfloat *params + + + + void glGetnUniformfvKHR + GLuint program + GLint location + GLsizei bufSize + GLfloat *params + + + + void glGetnUniformi64vARB + GLuint program + GLint location + GLsizei bufSize + GLint64 *params + + + void glGetnUniformiv + GLuint program + GLint location + GLsizei bufSize + GLint *params + + + void glGetnUniformivARB + GLuint program + GLint location + GLsizei bufSize + GLint *params + + + void glGetnUniformivEXT + GLuint program + GLint location + GLsizei bufSize + GLint *params + + + + void glGetnUniformivKHR + GLuint program + GLint location + GLsizei bufSize + GLint *params + + + + void glGetnUniformui64vARB + GLuint program + GLint location + GLsizei bufSize + GLuint64 *params + + + void glGetnUniformuiv + GLuint program + GLint location + GLsizei bufSize + GLuint *params + + + void glGetnUniformuivARB + GLuint program + GLint location + GLsizei bufSize + GLuint *params + + + void glGetnUniformuivKHR + GLuint program + GLint location + GLsizei bufSize + GLuint *params + + + + void glGlobalAlphaFactorbSUN + GLbyte factor + + + void glGlobalAlphaFactordSUN + GLdouble factor + + + void glGlobalAlphaFactorfSUN + GLfloat factor + + + void glGlobalAlphaFactoriSUN + GLint factor + + + void glGlobalAlphaFactorsSUN + GLshort factor + + + void glGlobalAlphaFactorubSUN + GLubyte factor + + + void glGlobalAlphaFactoruiSUN + GLuint factor + + + void glGlobalAlphaFactorusSUN + GLushort factor + + + void glHint + GLenum target + GLenum mode + + + + void glHintPGI + GLenum target + GLint mode + + + void glHistogram + GLenum target + GLsizei width + GLenum internalformat + GLboolean sink + + + + void glHistogramEXT + GLenum target + GLsizei width + GLenum internalformat + GLboolean sink + + + + + void glIglooInterfaceSGIX + GLenum pname + const void *params + + + + void glImageTransformParameterfHP + GLenum target + GLenum pname + GLfloat param + + + void glImageTransformParameterfvHP + GLenum target + GLenum pname + const GLfloat *params + + + void glImageTransformParameteriHP + GLenum target + GLenum pname + GLint param + + + void glImageTransformParameterivHP + GLenum target + GLenum pname + const GLint *params + + + void glImportMemoryFdEXT + GLuint memory + GLuint64 size + GLenum handleType + GLint fd + + + void glImportMemoryWin32HandleEXT + GLuint memory + GLuint64 size + GLenum handleType + void *handle + + + void glImportMemoryWin32NameEXT + GLuint memory + GLuint64 size + GLenum handleType + const void *name + + + void glImportSemaphoreFdEXT + GLuint semaphore + GLenum handleType + GLint fd + + + void glImportSemaphoreWin32HandleEXT + GLuint semaphore + GLenum handleType + void *handle + + + void glImportSemaphoreWin32NameEXT + GLuint semaphore + GLenum handleType + const void *name + + + GLsync glImportSyncEXT + GLenum external_sync_type + GLintptr external_sync + GLbitfield flags + + + void glIndexFormatNV + GLenum type + GLsizei stride + + + void glIndexFuncEXT + GLenum func + GLclampf ref + + + void glIndexMask + GLuint mask + + + + void glIndexMaterialEXT + GLenum face + GLenum mode + + + void glIndexPointer + GLenum type + GLsizei stride + const void *pointer + + + void glIndexPointerEXT + GLenum type + GLsizei stride + GLsizei count + const void *pointer + + + void glIndexPointerListIBM + GLenum type + GLint stride + const void **pointer + GLint ptrstride + + + void glIndexd + GLdouble c + + + + void glIndexdv + const GLdouble *c + + + + void glIndexf + GLfloat c + + + + void glIndexfv + const GLfloat *c + + + + void glIndexi + GLint c + + + + void glIndexiv + const GLint *c + + + + void glIndexs + GLshort c + + + + void glIndexsv + const GLshort *c + + + + void glIndexub + GLubyte c + + + + void glIndexubv + const GLubyte *c + + + + void glIndexxOES + GLfixed component + + + void glIndexxvOES + const GLfixed *component + + + void glInitNames + + + + void glInsertComponentEXT + GLuint res + GLuint src + GLuint num + + + void glInsertEventMarkerEXT + GLsizei length + const GLchar *marker + + + void glInstrumentsBufferSGIX + GLsizei size + GLint *buffer + + + + void glInterleavedArrays + GLenum format + GLsizei stride + const void *pointer + + + void glInterpolatePathsNV + GLuint resultPath + GLuint pathA + GLuint pathB + GLfloat weight + + + void glInvalidateBufferData + GLuint buffer + + + void glInvalidateBufferSubData + GLuint buffer + GLintptr offset + GLsizeiptr length + + + void glInvalidateFramebuffer + GLenum target + GLsizei numAttachments + const GLenum *attachments + + + void glInvalidateNamedFramebufferData + GLuint framebuffer + GLsizei numAttachments + const GLenum *attachments + + + void glInvalidateNamedFramebufferSubData + GLuint framebuffer + GLsizei numAttachments + const GLenum *attachments + GLint x + GLint y + GLsizei width + GLsizei height + + + void glInvalidateSubFramebuffer + GLenum target + GLsizei numAttachments + const GLenum *attachments + GLint x + GLint y + GLsizei width + GLsizei height + + + void glInvalidateTexImage + GLuint texture + GLint level + + + void glInvalidateTexSubImage + GLuint texture + GLint level + GLint xoffset + GLint yoffset + GLint zoffset + GLsizei width + GLsizei height + GLsizei depth + + + GLboolean glIsAsyncMarkerSGIX + GLuint marker + + + GLboolean glIsBuffer + GLuint buffer + + + GLboolean glIsBufferARB + GLuint buffer + + + + GLboolean glIsBufferResidentNV + GLenum target + + + GLboolean glIsCommandListNV + GLuint list + + + GLboolean glIsEnabled + GLenum cap + + + + GLboolean glIsEnabledIndexedEXT + GLenum target + GLuint index + + + + + GLboolean glIsEnabledi + GLenum target + GLuint index + + + GLboolean glIsEnablediEXT + GLenum target + GLuint index + + + + GLboolean glIsEnablediNV + GLenum target + GLuint index + + + + GLboolean glIsEnablediOES + GLenum target + GLuint index + + + + GLboolean glIsFenceAPPLE + GLuint fence + + + GLboolean glIsFenceNV + GLuint fence + + + + GLboolean glIsFramebuffer + GLuint framebuffer + + + + GLboolean glIsFramebufferEXT + GLuint framebuffer + + + + + GLboolean glIsFramebufferOES + GLuint framebuffer + + + GLboolean glIsImageHandleResidentARB + GLuint64 handle + + + GLboolean glIsImageHandleResidentNV + GLuint64 handle + + + GLboolean glIsList + GLuint list + + + + GLboolean glIsMemoryObjectEXT + GLuint memoryObject + + + GLboolean glIsNameAMD + GLenum identifier + GLuint name + + + GLboolean glIsNamedBufferResidentNV + GLuint buffer + + + GLboolean glIsNamedStringARB + GLint namelen + const GLchar *name + + + GLboolean glIsObjectBufferATI + GLuint buffer + + + GLboolean glIsOcclusionQueryNV + GLuint id + + + GLboolean glIsPathNV + GLuint path + + + GLboolean glIsPointInFillPathNV + GLuint path + GLuint mask + GLfloat x + GLfloat y + + + GLboolean glIsPointInStrokePathNV + GLuint path + GLfloat x + GLfloat y + + + GLboolean glIsProgram + GLuint program + + + + GLboolean glIsProgramARB + GLuint program + + + + GLboolean glIsProgramNV + GLuint id + + + + + GLboolean glIsProgramPipeline + GLuint pipeline + + + GLboolean glIsProgramPipelineEXT + GLuint pipeline + + + GLboolean glIsQuery + GLuint id + + + + GLboolean glIsQueryARB + GLuint id + + + + GLboolean glIsQueryEXT + GLuint id + + + GLboolean glIsRenderbuffer + GLuint renderbuffer + + + + GLboolean glIsRenderbufferEXT + GLuint renderbuffer + + + + + GLboolean glIsRenderbufferOES + GLuint renderbuffer + + + GLboolean glIsSemaphoreEXT + GLuint semaphore + + + GLboolean glIsSampler + GLuint sampler + + + GLboolean glIsShader + GLuint shader + + + + GLboolean glIsStateNV + GLuint state + + + GLboolean glIsSync + GLsync sync + + + GLboolean glIsSyncAPPLE + GLsync sync + + + + GLboolean glIsTexture + GLuint texture + + + + GLboolean glIsTextureEXT + GLuint texture + + + + GLboolean glIsTextureHandleResidentARB + GLuint64 handle + + + GLboolean glIsTextureHandleResidentNV + GLuint64 handle + + + GLboolean glIsTransformFeedback + GLuint id + + + GLboolean glIsTransformFeedbackNV + GLuint id + + + + GLboolean glIsVariantEnabledEXT + GLuint id + GLenum cap + + + GLboolean glIsVertexArray + GLuint array + + + + GLboolean glIsVertexArrayAPPLE + GLuint array + + + + GLboolean glIsVertexArrayOES + GLuint array + + + + GLboolean glIsVertexAttribEnabledAPPLE + GLuint index + GLenum pname + + + void glLGPUCopyImageSubDataNVX + GLuint sourceGpu + GLbitfield destinationGpuMask + GLuint srcName + GLenum srcTarget + GLint srcLevel + GLint srcX + GLint srxY + GLint srcZ + GLuint dstName + GLenum dstTarget + GLint dstLevel + GLint dstX + GLint dstY + GLint dstZ + GLsizei width + GLsizei height + GLsizei depth + + + void glLGPUInterlockNVX + + + void glLGPUNamedBufferSubDataNVX + GLbitfield gpuMask + GLuint buffer + GLintptr offset + GLsizeiptr size + const void *data + + + void glLabelObjectEXT + GLenum type + GLuint object + GLsizei length + const GLchar *label + + + void glLightEnviSGIX + GLenum pname + GLint param + + + void glLightModelf + GLenum pname + GLfloat param + + + + void glLightModelfv + GLenum pname + const GLfloat *params + + + + void glLightModeli + GLenum pname + GLint param + + + + void glLightModeliv + GLenum pname + const GLint *params + + + + void glLightModelx + GLenum pname + GLfixed param + + + void glLightModelxOES + GLenum pname + GLfixed param + + + void glLightModelxv + GLenum pname + const GLfixed *param + + + void glLightModelxvOES + GLenum pname + const GLfixed *param + + + void glLightf + GLenum light + GLenum pname + GLfloat param + + + + void glLightfv + GLenum light + GLenum pname + const GLfloat *params + + + + void glLighti + GLenum light + GLenum pname + GLint param + + + + void glLightiv + GLenum light + GLenum pname + const GLint *params + + + + void glLightx + GLenum light + GLenum pname + GLfixed param + + + void glLightxOES + GLenum light + GLenum pname + GLfixed param + + + void glLightxv + GLenum light + GLenum pname + const GLfixed *params + + + void glLightxvOES + GLenum light + GLenum pname + const GLfixed *params + + + void glLineStipple + GLint factor + GLushort pattern + + + + void glLineWidth + GLfloat width + + + + void glLineWidthx + GLfixed width + + + void glLineWidthxOES + GLfixed width + + + void glLinkProgram + GLuint program + + + void glLinkProgramARB + GLhandleARB programObj + + + + void glListBase + GLuint base + + + + void glListDrawCommandsStatesClientNV + GLuint list + GLuint segment + const void **indirects + const GLsizei *sizes + const GLuint *states + const GLuint *fbos + GLuint count + + + void glListParameterfSGIX + GLuint list + GLenum pname + GLfloat param + + + + void glListParameterfvSGIX + GLuint list + GLenum pname + const GLfloat *params + + + + void glListParameteriSGIX + GLuint list + GLenum pname + GLint param + + + + void glListParameterivSGIX + GLuint list + GLenum pname + const GLint *params + + + + void glLoadIdentity + + + + void glLoadIdentityDeformationMapSGIX + GLbitfield mask + + + + void glLoadMatrixd + const GLdouble *m + + + + void glLoadMatrixf + const GLfloat *m + + + + void glLoadMatrixx + const GLfixed *m + + + void glLoadMatrixxOES + const GLfixed *m + + + void glLoadName + GLuint name + + + + void glLoadPaletteFromModelViewMatrixOES + + + void glLoadProgramNV + GLenum target + GLuint id + GLsizei len + const GLubyte *program + + + + void glLoadTransposeMatrixd + const GLdouble *m + + + void glLoadTransposeMatrixdARB + const GLdouble *m + + + + void glLoadTransposeMatrixf + const GLfloat *m + + + void glLoadTransposeMatrixfARB + const GLfloat *m + + + + void glLoadTransposeMatrixxOES + const GLfixed *m + + + void glLockArraysEXT + GLint first + GLsizei count + + + void glLogicOp + GLenum opcode + + + + void glMakeBufferNonResidentNV + GLenum target + + + void glMakeBufferResidentNV + GLenum target + GLenum access + + + void glMakeImageHandleNonResidentARB + GLuint64 handle + + + void glMakeImageHandleNonResidentNV + GLuint64 handle + + + void glMakeImageHandleResidentARB + GLuint64 handle + GLenum access + + + void glMakeImageHandleResidentNV + GLuint64 handle + GLenum access + + + void glMakeNamedBufferNonResidentNV + GLuint buffer + + + void glMakeNamedBufferResidentNV + GLuint buffer + GLenum access + + + void glMakeTextureHandleNonResidentARB + GLuint64 handle + + + void glMakeTextureHandleNonResidentNV + GLuint64 handle + + + void glMakeTextureHandleResidentARB + GLuint64 handle + + + void glMakeTextureHandleResidentNV + GLuint64 handle + + + void glMap1d + GLenum target + GLdouble u1 + GLdouble u2 + GLint stride + GLint order + const GLdouble *points + + + + void glMap1f + GLenum target + GLfloat u1 + GLfloat u2 + GLint stride + GLint order + const GLfloat *points + + + + void glMap1xOES + GLenum target + GLfixed u1 + GLfixed u2 + GLint stride + GLint order + GLfixed points + + + void glMap2d + GLenum target + GLdouble u1 + GLdouble u2 + GLint ustride + GLint uorder + GLdouble v1 + GLdouble v2 + GLint vstride + GLint vorder + const GLdouble *points + + + + void glMap2f + GLenum target + GLfloat u1 + GLfloat u2 + GLint ustride + GLint uorder + GLfloat v1 + GLfloat v2 + GLint vstride + GLint vorder + const GLfloat *points + + + + void glMap2xOES + GLenum target + GLfixed u1 + GLfixed u2 + GLint ustride + GLint uorder + GLfixed v1 + GLfixed v2 + GLint vstride + GLint vorder + GLfixed points + + + void *glMapBuffer + GLenum target + GLenum access + + + void *glMapBufferARB + GLenum target + GLenum access + + + + void *glMapBufferOES + GLenum target + GLenum access + + + + void *glMapBufferRange + GLenum target + GLintptr offset + GLsizeiptr length + GLbitfield access + + + + void *glMapBufferRangeEXT + GLenum target + GLintptr offset + GLsizeiptr length + GLbitfield access + + + + void glMapControlPointsNV + GLenum target + GLuint index + GLenum type + GLsizei ustride + GLsizei vstride + GLint uorder + GLint vorder + GLboolean packed + const void *points + + + void glMapGrid1d + GLint un + GLdouble u1 + GLdouble u2 + + + + void glMapGrid1f + GLint un + GLfloat u1 + GLfloat u2 + + + + void glMapGrid1xOES + GLint n + GLfixed u1 + GLfixed u2 + + + void glMapGrid2d + GLint un + GLdouble u1 + GLdouble u2 + GLint vn + GLdouble v1 + GLdouble v2 + + + + void glMapGrid2f + GLint un + GLfloat u1 + GLfloat u2 + GLint vn + GLfloat v1 + GLfloat v2 + + + + void glMapGrid2xOES + GLint n + GLfixed u1 + GLfixed u2 + GLfixed v1 + GLfixed v2 + + + void *glMapNamedBuffer + GLuint buffer + GLenum access + + + void *glMapNamedBufferEXT + GLuint buffer + GLenum access + + + void *glMapNamedBufferRange + GLuint buffer + GLintptr offset + GLsizeiptr length + GLbitfield access + + + void *glMapNamedBufferRangeEXT + GLuint buffer + GLintptr offset + GLsizeiptr length + GLbitfield access + + + void *glMapObjectBufferATI + GLuint buffer + + + void glMapParameterfvNV + GLenum target + GLenum pname + const GLfloat *params + + + void glMapParameterivNV + GLenum target + GLenum pname + const GLint *params + + + void *glMapTexture2DINTEL + GLuint texture + GLint level + GLbitfield access + GLint *stride + GLenum *layout + + + void glMapVertexAttrib1dAPPLE + GLuint index + GLuint size + GLdouble u1 + GLdouble u2 + GLint stride + GLint order + const GLdouble *points + + + void glMapVertexAttrib1fAPPLE + GLuint index + GLuint size + GLfloat u1 + GLfloat u2 + GLint stride + GLint order + const GLfloat *points + + + void glMapVertexAttrib2dAPPLE + GLuint index + GLuint size + GLdouble u1 + GLdouble u2 + GLint ustride + GLint uorder + GLdouble v1 + GLdouble v2 + GLint vstride + GLint vorder + const GLdouble *points + + + void glMapVertexAttrib2fAPPLE + GLuint index + GLuint size + GLfloat u1 + GLfloat u2 + GLint ustride + GLint uorder + GLfloat v1 + GLfloat v2 + GLint vstride + GLint vorder + const GLfloat *points + + + void glMaterialf + GLenum face + GLenum pname + GLfloat param + + + + void glMaterialfv + GLenum face + GLenum pname + const GLfloat *params + + + + void glMateriali + GLenum face + GLenum pname + GLint param + + + + void glMaterialiv + GLenum face + GLenum pname + const GLint *params + + + + void glMaterialx + GLenum face + GLenum pname + GLfixed param + + + void glMaterialxOES + GLenum face + GLenum pname + GLfixed param + + + void glMaterialxv + GLenum face + GLenum pname + const GLfixed *param + + + void glMaterialxvOES + GLenum face + GLenum pname + const GLfixed *param + + + void glMatrixFrustumEXT + GLenum mode + GLdouble left + GLdouble right + GLdouble bottom + GLdouble top + GLdouble zNear + GLdouble zFar + + + void glMatrixIndexPointerARB + GLint size + GLenum type + GLsizei stride + const void *pointer + + + void glMatrixIndexPointerOES + GLint size + GLenum type + GLsizei stride + const void *pointer + + + void glMatrixIndexubvARB + GLint size + const GLubyte *indices + + + + void glMatrixIndexuivARB + GLint size + const GLuint *indices + + + + void glMatrixIndexusvARB + GLint size + const GLushort *indices + + + + void glMatrixLoad3x2fNV + GLenum matrixMode + const GLfloat *m + + + void glMatrixLoad3x3fNV + GLenum matrixMode + const GLfloat *m + + + void glMatrixLoadIdentityEXT + GLenum mode + + + void glMatrixLoadTranspose3x3fNV + GLenum matrixMode + const GLfloat *m + + + void glMatrixLoadTransposedEXT + GLenum mode + const GLdouble *m + + + void glMatrixLoadTransposefEXT + GLenum mode + const GLfloat *m + + + void glMatrixLoaddEXT + GLenum mode + const GLdouble *m + + + void glMatrixLoadfEXT + GLenum mode + const GLfloat *m + + + void glMatrixMode + GLenum mode + + + + void glMatrixMult3x2fNV + GLenum matrixMode + const GLfloat *m + + + void glMatrixMult3x3fNV + GLenum matrixMode + const GLfloat *m + + + void glMatrixMultTranspose3x3fNV + GLenum matrixMode + const GLfloat *m + + + void glMatrixMultTransposedEXT + GLenum mode + const GLdouble *m + + + void glMatrixMultTransposefEXT + GLenum mode + const GLfloat *m + + + void glMatrixMultdEXT + GLenum mode + const GLdouble *m + + + void glMatrixMultfEXT + GLenum mode + const GLfloat *m + + + void glMatrixOrthoEXT + GLenum mode + GLdouble left + GLdouble right + GLdouble bottom + GLdouble top + GLdouble zNear + GLdouble zFar + + + void glMatrixPopEXT + GLenum mode + + + void glMatrixPushEXT + GLenum mode + + + void glMatrixRotatedEXT + GLenum mode + GLdouble angle + GLdouble x + GLdouble y + GLdouble z + + + void glMatrixRotatefEXT + GLenum mode + GLfloat angle + GLfloat x + GLfloat y + GLfloat z + + + void glMatrixScaledEXT + GLenum mode + GLdouble x + GLdouble y + GLdouble z + + + void glMatrixScalefEXT + GLenum mode + GLfloat x + GLfloat y + GLfloat z + + + void glMatrixTranslatedEXT + GLenum mode + GLdouble x + GLdouble y + GLdouble z + + + void glMatrixTranslatefEXT + GLenum mode + GLfloat x + GLfloat y + GLfloat z + + + void glMaxShaderCompilerThreadsKHR + GLuint count + + + void glMaxShaderCompilerThreadsARB + GLuint count + + + + void glMemoryBarrier + GLbitfield barriers + + + void glMemoryBarrierByRegion + GLbitfield barriers + + + void glMemoryBarrierEXT + GLbitfield barriers + + + + void glMemoryObjectParameterivEXT + GLuint memoryObject + GLenum pname + const GLint *params + + + void glMinSampleShading + GLfloat value + + + void glMinSampleShadingARB + GLfloat value + + + + void glMinSampleShadingOES + GLfloat value + + + + void glMinmax + GLenum target + GLenum internalformat + GLboolean sink + + + + void glMinmaxEXT + GLenum target + GLenum internalformat + GLboolean sink + + + + + void glMultMatrixd + const GLdouble *m + + + + void glMultMatrixf + const GLfloat *m + + + + void glMultMatrixx + const GLfixed *m + + + void glMultMatrixxOES + const GLfixed *m + + + void glMultTransposeMatrixd + const GLdouble *m + + + void glMultTransposeMatrixdARB + const GLdouble *m + + + + void glMultTransposeMatrixf + const GLfloat *m + + + void glMultTransposeMatrixfARB + const GLfloat *m + + + + void glMultTransposeMatrixxOES + const GLfixed *m + + + void glMultiDrawArrays + GLenum mode + const GLint *first + const GLsizei *count + GLsizei drawcount + + + void glMultiDrawArraysEXT + GLenum mode + const GLint *first + const GLsizei *count + GLsizei primcount + + + + void glMultiDrawArraysIndirect + GLenum mode + const void *indirect + GLsizei drawcount + GLsizei stride + + + void glMultiDrawArraysIndirectAMD + GLenum mode + const void *indirect + GLsizei primcount + GLsizei stride + + + + void glMultiDrawArraysIndirectBindlessCountNV + GLenum mode + const void *indirect + GLsizei drawCount + GLsizei maxDrawCount + GLsizei stride + GLint vertexBufferCount + + + void glMultiDrawArraysIndirectBindlessNV + GLenum mode + const void *indirect + GLsizei drawCount + GLsizei stride + GLint vertexBufferCount + + + void glMultiDrawArraysIndirectCount + GLenum mode + const void *indirect + GLintptr drawcount + GLsizei maxdrawcount + GLsizei stride + + + void glMultiDrawArraysIndirectCountARB + GLenum mode + const void *indirect + GLintptr drawcount + GLsizei maxdrawcount + GLsizei stride + + + + void glMultiDrawArraysIndirectEXT + GLenum mode + const void *indirect + GLsizei drawcount + GLsizei stride + + + + void glMultiDrawElementArrayAPPLE + GLenum mode + const GLint *first + const GLsizei *count + GLsizei primcount + + + void glMultiDrawElements + GLenum mode + const GLsizei *count + GLenum type + const void *const*indices + GLsizei drawcount + + + void glMultiDrawElementsBaseVertex + GLenum mode + const GLsizei *count + GLenum type + const void *const*indices + GLsizei drawcount + const GLint *basevertex + + + void glMultiDrawElementsBaseVertexEXT + GLenum mode + const GLsizei *count + GLenum type + const void *const*indices + GLsizei primcount + const GLint *basevertex + + + + void glMultiDrawElementsEXT + GLenum mode + const GLsizei *count + GLenum type + const void *const*indices + GLsizei primcount + + + + void glMultiDrawElementsIndirect + GLenum mode + GLenum type + const void *indirect + GLsizei drawcount + GLsizei stride + + + void glMultiDrawElementsIndirectAMD + GLenum mode + GLenum type + const void *indirect + GLsizei primcount + GLsizei stride + + + + void glMultiDrawElementsIndirectBindlessCountNV + GLenum mode + GLenum type + const void *indirect + GLsizei drawCount + GLsizei maxDrawCount + GLsizei stride + GLint vertexBufferCount + + + void glMultiDrawElementsIndirectBindlessNV + GLenum mode + GLenum type + const void *indirect + GLsizei drawCount + GLsizei stride + GLint vertexBufferCount + + + void glMultiDrawElementsIndirectCount + GLenum mode + GLenum type + const void *indirect + GLintptr drawcount + GLsizei maxdrawcount + GLsizei stride + + + void glMultiDrawElementsIndirectCountARB + GLenum mode + GLenum type + const void *indirect + GLintptr drawcount + GLsizei maxdrawcount + GLsizei stride + + + + void glMultiDrawElementsIndirectCountARB + GLenum mode + GLenum type + const void *indirect + GLintptr drawcount + GLsizei maxdrawcount + GLsizei stride + + + + void glMultiDrawElementsIndirectEXT + GLenum mode + GLenum type + const void *indirect + GLsizei drawcount + GLsizei stride + + + + void glMultiDrawMeshTasksIndirectNV + GLintptr indirect + GLsizei drawcount + GLsizei stride + + + void glMultiDrawMeshTasksIndirectCountNV + GLintptr indirect + GLintptr drawcount + GLsizei maxdrawcount + GLsizei stride + + + void glMultiDrawRangeElementArrayAPPLE + GLenum mode + GLuint start + GLuint end + const GLint *first + const GLsizei *count + GLsizei primcount + + + void glMultiModeDrawArraysIBM + const GLenum *mode + const GLint *first + const GLsizei *count + GLsizei primcount + GLint modestride + + + void glMultiModeDrawElementsIBM + const GLenum *mode + const GLsizei *count + GLenum type + const void *const*indices + GLsizei primcount + GLint modestride + + + void glMultiTexBufferEXT + GLenum texunit + GLenum target + GLenum internalformat + GLuint buffer + + + void glMultiTexCoord1bOES + GLenum texture + GLbyte s + + + void glMultiTexCoord1bvOES + GLenum texture + const GLbyte *coords + + + void glMultiTexCoord1d + GLenum target + GLdouble s + + + + void glMultiTexCoord1dARB + GLenum target + GLdouble s + + + + + void glMultiTexCoord1dv + GLenum target + const GLdouble *v + + + + void glMultiTexCoord1dvARB + GLenum target + const GLdouble *v + + + + + void glMultiTexCoord1f + GLenum target + GLfloat s + + + + void glMultiTexCoord1fARB + GLenum target + GLfloat s + + + + + void glMultiTexCoord1fv + GLenum target + const GLfloat *v + + + + void glMultiTexCoord1fvARB + GLenum target + const GLfloat *v + + + + + void glMultiTexCoord1hNV + GLenum target + GLhalfNV s + + + + void glMultiTexCoord1hvNV + GLenum target + const GLhalfNV *v + + + + void glMultiTexCoord1i + GLenum target + GLint s + + + + void glMultiTexCoord1iARB + GLenum target + GLint s + + + + + void glMultiTexCoord1iv + GLenum target + const GLint *v + + + + void glMultiTexCoord1ivARB + GLenum target + const GLint *v + + + + + void glMultiTexCoord1s + GLenum target + GLshort s + + + + void glMultiTexCoord1sARB + GLenum target + GLshort s + + + + + void glMultiTexCoord1sv + GLenum target + const GLshort *v + + + + void glMultiTexCoord1svARB + GLenum target + const GLshort *v + + + + + void glMultiTexCoord1xOES + GLenum texture + GLfixed s + + + void glMultiTexCoord1xvOES + GLenum texture + const GLfixed *coords + + + void glMultiTexCoord2bOES + GLenum texture + GLbyte s + GLbyte t + + + void glMultiTexCoord2bvOES + GLenum texture + const GLbyte *coords + + + void glMultiTexCoord2d + GLenum target + GLdouble s + GLdouble t + + + + void glMultiTexCoord2dARB + GLenum target + GLdouble s + GLdouble t + + + + + void glMultiTexCoord2dv + GLenum target + const GLdouble *v + + + + void glMultiTexCoord2dvARB + GLenum target + const GLdouble *v + + + + + void glMultiTexCoord2f + GLenum target + GLfloat s + GLfloat t + + + + void glMultiTexCoord2fARB + GLenum target + GLfloat s + GLfloat t + + + + + void glMultiTexCoord2fv + GLenum target + const GLfloat *v + + + + void glMultiTexCoord2fvARB + GLenum target + const GLfloat *v + + + + + void glMultiTexCoord2hNV + GLenum target + GLhalfNV s + GLhalfNV t + + + + void glMultiTexCoord2hvNV + GLenum target + const GLhalfNV *v + + + + void glMultiTexCoord2i + GLenum target + GLint s + GLint t + + + + void glMultiTexCoord2iARB + GLenum target + GLint s + GLint t + + + + + void glMultiTexCoord2iv + GLenum target + const GLint *v + + + + void glMultiTexCoord2ivARB + GLenum target + const GLint *v + + + + + void glMultiTexCoord2s + GLenum target + GLshort s + GLshort t + + + + void glMultiTexCoord2sARB + GLenum target + GLshort s + GLshort t + + + + + void glMultiTexCoord2sv + GLenum target + const GLshort *v + + + + void glMultiTexCoord2svARB + GLenum target + const GLshort *v + + + + + void glMultiTexCoord2xOES + GLenum texture + GLfixed s + GLfixed t + + + void glMultiTexCoord2xvOES + GLenum texture + const GLfixed *coords + + + void glMultiTexCoord3bOES + GLenum texture + GLbyte s + GLbyte t + GLbyte r + + + void glMultiTexCoord3bvOES + GLenum texture + const GLbyte *coords + + + void glMultiTexCoord3d + GLenum target + GLdouble s + GLdouble t + GLdouble r + + + + void glMultiTexCoord3dARB + GLenum target + GLdouble s + GLdouble t + GLdouble r + + + + + void glMultiTexCoord3dv + GLenum target + const GLdouble *v + + + + void glMultiTexCoord3dvARB + GLenum target + const GLdouble *v + + + + + void glMultiTexCoord3f + GLenum target + GLfloat s + GLfloat t + GLfloat r + + + + void glMultiTexCoord3fARB + GLenum target + GLfloat s + GLfloat t + GLfloat r + + + + + void glMultiTexCoord3fv + GLenum target + const GLfloat *v + + + + void glMultiTexCoord3fvARB + GLenum target + const GLfloat *v + + + + + void glMultiTexCoord3hNV + GLenum target + GLhalfNV s + GLhalfNV t + GLhalfNV r + + + + void glMultiTexCoord3hvNV + GLenum target + const GLhalfNV *v + + + + void glMultiTexCoord3i + GLenum target + GLint s + GLint t + GLint r + + + + void glMultiTexCoord3iARB + GLenum target + GLint s + GLint t + GLint r + + + + + void glMultiTexCoord3iv + GLenum target + const GLint *v + + + + void glMultiTexCoord3ivARB + GLenum target + const GLint *v + + + + + void glMultiTexCoord3s + GLenum target + GLshort s + GLshort t + GLshort r + + + + void glMultiTexCoord3sARB + GLenum target + GLshort s + GLshort t + GLshort r + + + + + void glMultiTexCoord3sv + GLenum target + const GLshort *v + + + + void glMultiTexCoord3svARB + GLenum target + const GLshort *v + + + + + void glMultiTexCoord3xOES + GLenum texture + GLfixed s + GLfixed t + GLfixed r + + + void glMultiTexCoord3xvOES + GLenum texture + const GLfixed *coords + + + void glMultiTexCoord4bOES + GLenum texture + GLbyte s + GLbyte t + GLbyte r + GLbyte q + + + void glMultiTexCoord4bvOES + GLenum texture + const GLbyte *coords + + + void glMultiTexCoord4d + GLenum target + GLdouble s + GLdouble t + GLdouble r + GLdouble q + + + + void glMultiTexCoord4dARB + GLenum target + GLdouble s + GLdouble t + GLdouble r + GLdouble q + + + + + void glMultiTexCoord4dv + GLenum target + const GLdouble *v + + + + void glMultiTexCoord4dvARB + GLenum target + const GLdouble *v + + + + + void glMultiTexCoord4f + GLenum target + GLfloat s + GLfloat t + GLfloat r + GLfloat q + + + + void glMultiTexCoord4fARB + GLenum target + GLfloat s + GLfloat t + GLfloat r + GLfloat q + + + + + void glMultiTexCoord4fv + GLenum target + const GLfloat *v + + + + void glMultiTexCoord4fvARB + GLenum target + const GLfloat *v + + + + + void glMultiTexCoord4hNV + GLenum target + GLhalfNV s + GLhalfNV t + GLhalfNV r + GLhalfNV q + + + + void glMultiTexCoord4hvNV + GLenum target + const GLhalfNV *v + + + + void glMultiTexCoord4i + GLenum target + GLint s + GLint t + GLint r + GLint q + + + + void glMultiTexCoord4iARB + GLenum target + GLint s + GLint t + GLint r + GLint q + + + + + void glMultiTexCoord4iv + GLenum target + const GLint *v + + + + void glMultiTexCoord4ivARB + GLenum target + const GLint *v + + + + + void glMultiTexCoord4s + GLenum target + GLshort s + GLshort t + GLshort r + GLshort q + + + + void glMultiTexCoord4sARB + GLenum target + GLshort s + GLshort t + GLshort r + GLshort q + + + + + void glMultiTexCoord4sv + GLenum target + const GLshort *v + + + + void glMultiTexCoord4svARB + GLenum target + const GLshort *v + + + + + void glMultiTexCoord4x + GLenum texture + GLfixed s + GLfixed t + GLfixed r + GLfixed q + + + void glMultiTexCoord4xOES + GLenum texture + GLfixed s + GLfixed t + GLfixed r + GLfixed q + + + void glMultiTexCoord4xvOES + GLenum texture + const GLfixed *coords + + + void glMultiTexCoordP1ui + GLenum texture + GLenum type + GLuint coords + + + void glMultiTexCoordP1uiv + GLenum texture + GLenum type + const GLuint *coords + + + void glMultiTexCoordP2ui + GLenum texture + GLenum type + GLuint coords + + + void glMultiTexCoordP2uiv + GLenum texture + GLenum type + const GLuint *coords + + + void glMultiTexCoordP3ui + GLenum texture + GLenum type + GLuint coords + + + void glMultiTexCoordP3uiv + GLenum texture + GLenum type + const GLuint *coords + + + void glMultiTexCoordP4ui + GLenum texture + GLenum type + GLuint coords + + + void glMultiTexCoordP4uiv + GLenum texture + GLenum type + const GLuint *coords + + + void glMultiTexCoordPointerEXT + GLenum texunit + GLint size + GLenum type + GLsizei stride + const void *pointer + + + void glMultiTexEnvfEXT + GLenum texunit + GLenum target + GLenum pname + GLfloat param + + + + void glMultiTexEnvfvEXT + GLenum texunit + GLenum target + GLenum pname + const GLfloat *params + + + void glMultiTexEnviEXT + GLenum texunit + GLenum target + GLenum pname + GLint param + + + + void glMultiTexEnvivEXT + GLenum texunit + GLenum target + GLenum pname + const GLint *params + + + void glMultiTexGendEXT + GLenum texunit + GLenum coord + GLenum pname + GLdouble param + + + + void glMultiTexGendvEXT + GLenum texunit + GLenum coord + GLenum pname + const GLdouble *params + + + void glMultiTexGenfEXT + GLenum texunit + GLenum coord + GLenum pname + GLfloat param + + + + void glMultiTexGenfvEXT + GLenum texunit + GLenum coord + GLenum pname + const GLfloat *params + + + void glMultiTexGeniEXT + GLenum texunit + GLenum coord + GLenum pname + GLint param + + + + void glMultiTexGenivEXT + GLenum texunit + GLenum coord + GLenum pname + const GLint *params + + + void glMultiTexImage1DEXT + GLenum texunit + GLenum target + GLint level + GLint internalformat + GLsizei width + GLint border + GLenum format + GLenum type + const void *pixels + + + void glMultiTexImage2DEXT + GLenum texunit + GLenum target + GLint level + GLint internalformat + GLsizei width + GLsizei height + GLint border + GLenum format + GLenum type + const void *pixels + + + void glMultiTexImage3DEXT + GLenum texunit + GLenum target + GLint level + GLint internalformat + GLsizei width + GLsizei height + GLsizei depth + GLint border + GLenum format + GLenum type + const void *pixels + + + void glMultiTexParameterIivEXT + GLenum texunit + GLenum target + GLenum pname + const GLint *params + + + void glMultiTexParameterIuivEXT + GLenum texunit + GLenum target + GLenum pname + const GLuint *params + + + void glMultiTexParameterfEXT + GLenum texunit + GLenum target + GLenum pname + GLfloat param + + + + void glMultiTexParameterfvEXT + GLenum texunit + GLenum target + GLenum pname + const GLfloat *params + + + void glMultiTexParameteriEXT + GLenum texunit + GLenum target + GLenum pname + GLint param + + + + void glMultiTexParameterivEXT + GLenum texunit + GLenum target + GLenum pname + const GLint *params + + + void glMultiTexRenderbufferEXT + GLenum texunit + GLenum target + GLuint renderbuffer + + + void glMultiTexSubImage1DEXT + GLenum texunit + GLenum target + GLint level + GLint xoffset + GLsizei width + GLenum format + GLenum type + const void *pixels + + + void glMultiTexSubImage2DEXT + GLenum texunit + GLenum target + GLint level + GLint xoffset + GLint yoffset + GLsizei width + GLsizei height + GLenum format + GLenum type + const void *pixels + + + void glMultiTexSubImage3DEXT + GLenum texunit + GLenum target + GLint level + GLint xoffset + GLint yoffset + GLint zoffset + GLsizei width + GLsizei height + GLsizei depth + GLenum format + GLenum type + const void *pixels + + + void glMulticastBarrierNV + + + void glMulticastBlitFramebufferNV + GLuint srcGpu + GLuint dstGpu + GLint srcX0 + GLint srcY0 + GLint srcX1 + GLint srcY1 + GLint dstX0 + GLint dstY0 + GLint dstX1 + GLint dstY1 + GLbitfield mask + GLenum filter + + + void glMulticastBufferSubDataNV + GLbitfield gpuMask + GLuint buffer + GLintptr offset + GLsizeiptr size + const void *data + + + void glMulticastCopyBufferSubDataNV + GLuint readGpu + GLbitfield writeGpuMask + GLuint readBuffer + GLuint writeBuffer + GLintptr readOffset + GLintptr writeOffset + GLsizeiptr size + + + void glMulticastCopyImageSubDataNV + GLuint srcGpu + GLbitfield dstGpuMask + GLuint srcName + GLenum srcTarget + GLint srcLevel + GLint srcX + GLint srcY + GLint srcZ + GLuint dstName + GLenum dstTarget + GLint dstLevel + GLint dstX + GLint dstY + GLint dstZ + GLsizei srcWidth + GLsizei srcHeight + GLsizei srcDepth + + + void glMulticastFramebufferSampleLocationsfvNV + GLuint gpu + GLuint framebuffer + GLuint start + GLsizei count + const GLfloat *v + + + void glMulticastGetQueryObjecti64vNV + GLuint gpu + GLuint id + GLenum pname + GLint64 *params + + + void glMulticastGetQueryObjectivNV + GLuint gpu + GLuint id + GLenum pname + GLint *params + + + void glMulticastGetQueryObjectui64vNV + GLuint gpu + GLuint id + GLenum pname + GLuint64 *params + + + void glMulticastGetQueryObjectuivNV + GLuint gpu + GLuint id + GLenum pname + GLuint *params + + + void glMulticastScissorArrayvNVX + GLuint gpu + GLuint first + GLsizei count + const GLint *v + + + void glMulticastViewportArrayvNVX + GLuint gpu + GLuint first + GLsizei count + const GLfloat *v + + + void glMulticastViewportPositionWScaleNVX + GLuint gpu + GLuint index + GLfloat xcoeff + GLfloat ycoeff + + + void glMulticastWaitSyncNV + GLuint signalGpu + GLbitfield waitGpuMask + + + void glNamedBufferAttachMemoryNV + GLuint buffer + GLuint memory + GLuint64 offset + + + void glNamedBufferData + GLuint buffer + GLsizeiptr size + const void *data + GLenum usage + + + void glNamedBufferDataEXT + GLuint buffer + GLsizeiptr size + const void *data + GLenum usage + + + void glNamedBufferPageCommitmentARB + GLuint buffer + GLintptr offset + GLsizeiptr size + GLboolean commit + + + void glNamedBufferPageCommitmentEXT + GLuint buffer + GLintptr offset + GLsizeiptr size + GLboolean commit + + + void glNamedBufferStorage + GLuint buffer + GLsizeiptr size + const void *data + GLbitfield flags + + + void glNamedBufferStorageExternalEXT + GLuint buffer + GLintptr offset + GLsizeiptr size + GLeglClientBufferEXT clientBuffer + GLbitfield flags + + + void glNamedBufferStorageEXT + GLuint buffer + GLsizeiptr size + const void *data + GLbitfield flags + + + + void glNamedBufferStorageMemEXT + GLuint buffer + GLsizeiptr size + GLuint memory + GLuint64 offset + + + void glNamedBufferSubData + GLuint buffer + GLintptr offset + GLsizeiptr size + const void *data + + + void glNamedBufferSubDataEXT + GLuint buffer + GLintptr offset + GLsizeiptr size + const void *data + + + + void glNamedCopyBufferSubDataEXT + GLuint readBuffer + GLuint writeBuffer + GLintptr readOffset + GLintptr writeOffset + GLsizeiptr size + + + void glNamedFramebufferDrawBuffer + GLuint framebuffer + GLenum buf + + + void glNamedFramebufferDrawBuffers + GLuint framebuffer + GLsizei n + const GLenum *bufs + + + void glNamedFramebufferParameteri + GLuint framebuffer + GLenum pname + GLint param + + + void glNamedFramebufferParameteriEXT + GLuint framebuffer + GLenum pname + GLint param + + + void glNamedFramebufferReadBuffer + GLuint framebuffer + GLenum src + + + void glNamedFramebufferRenderbuffer + GLuint framebuffer + GLenum attachment + GLenum renderbuffertarget + GLuint renderbuffer + + + void glNamedFramebufferRenderbufferEXT + GLuint framebuffer + GLenum attachment + GLenum renderbuffertarget + GLuint renderbuffer + + + void glNamedFramebufferSampleLocationsfvARB + GLuint framebuffer + GLuint start + GLsizei count + const GLfloat *v + + + void glNamedFramebufferSampleLocationsfvNV + GLuint framebuffer + GLuint start + GLsizei count + const GLfloat *v + + + void glNamedFramebufferTexture + GLuint framebuffer + GLenum attachment + GLuint texture + GLint level + + + void glNamedFramebufferSamplePositionsfvAMD + GLuint framebuffer + GLuint numsamples + GLuint pixelindex + const GLfloat *values + + + void glNamedFramebufferTexture1DEXT + GLuint framebuffer + GLenum attachment + GLenum textarget + GLuint texture + GLint level + + + void glNamedFramebufferTexture2DEXT + GLuint framebuffer + GLenum attachment + GLenum textarget + GLuint texture + GLint level + + + void glNamedFramebufferTexture3DEXT + GLuint framebuffer + GLenum attachment + GLenum textarget + GLuint texture + GLint level + GLint zoffset + + + void glNamedFramebufferTextureEXT + GLuint framebuffer + GLenum attachment + GLuint texture + GLint level + + + void glNamedFramebufferTextureFaceEXT + GLuint framebuffer + GLenum attachment + GLuint texture + GLint level + GLenum face + + + void glNamedFramebufferTextureLayer + GLuint framebuffer + GLenum attachment + GLuint texture + GLint level + GLint layer + + + void glNamedFramebufferTextureLayerEXT + GLuint framebuffer + GLenum attachment + GLuint texture + GLint level + GLint layer + + + void glNamedProgramLocalParameter4dEXT + GLuint program + GLenum target + GLuint index + GLdouble x + GLdouble y + GLdouble z + GLdouble w + + + + void glNamedProgramLocalParameter4dvEXT + GLuint program + GLenum target + GLuint index + const GLdouble *params + + + void glNamedProgramLocalParameter4fEXT + GLuint program + GLenum target + GLuint index + GLfloat x + GLfloat y + GLfloat z + GLfloat w + + + + void glNamedProgramLocalParameter4fvEXT + GLuint program + GLenum target + GLuint index + const GLfloat *params + + + void glNamedProgramLocalParameterI4iEXT + GLuint program + GLenum target + GLuint index + GLint x + GLint y + GLint z + GLint w + + + + void glNamedProgramLocalParameterI4ivEXT + GLuint program + GLenum target + GLuint index + const GLint *params + + + void glNamedProgramLocalParameterI4uiEXT + GLuint program + GLenum target + GLuint index + GLuint x + GLuint y + GLuint z + GLuint w + + + + void glNamedProgramLocalParameterI4uivEXT + GLuint program + GLenum target + GLuint index + const GLuint *params + + + void glNamedProgramLocalParameters4fvEXT + GLuint program + GLenum target + GLuint index + GLsizei count + const GLfloat *params + + + void glNamedProgramLocalParametersI4ivEXT + GLuint program + GLenum target + GLuint index + GLsizei count + const GLint *params + + + void glNamedProgramLocalParametersI4uivEXT + GLuint program + GLenum target + GLuint index + GLsizei count + const GLuint *params + + + void glNamedProgramStringEXT + GLuint program + GLenum target + GLenum format + GLsizei len + const void *string + + + void glNamedRenderbufferStorage + GLuint renderbuffer + GLenum internalformat + GLsizei width + GLsizei height + + + void glNamedRenderbufferStorageEXT + GLuint renderbuffer + GLenum internalformat + GLsizei width + GLsizei height + + + void glNamedRenderbufferStorageMultisample + GLuint renderbuffer + GLsizei samples + GLenum internalformat + GLsizei width + GLsizei height + + + void glNamedRenderbufferStorageMultisampleAdvancedAMD + GLuint renderbuffer + GLsizei samples + GLsizei storageSamples + GLenum internalformat + GLsizei width + GLsizei height + + + void glNamedRenderbufferStorageMultisampleCoverageEXT + GLuint renderbuffer + GLsizei coverageSamples + GLsizei colorSamples + GLenum internalformat + GLsizei width + GLsizei height + + + void glNamedRenderbufferStorageMultisampleEXT + GLuint renderbuffer + GLsizei samples + GLenum internalformat + GLsizei width + GLsizei height + + + void glNamedStringARB + GLenum type + GLint namelen + const GLchar *name + GLint stringlen + const GLchar *string + + + void glNewList + GLuint list + GLenum mode + + + + GLuint glNewObjectBufferATI + GLsizei size + const void *pointer + GLenum usage + + + void glNormal3b + GLbyte nx + GLbyte ny + GLbyte nz + + + + void glNormal3bv + const GLbyte *v + + + + void glNormal3d + GLdouble nx + GLdouble ny + GLdouble nz + + + + void glNormal3dv + const GLdouble *v + + + + void glNormal3f + GLfloat nx + GLfloat ny + GLfloat nz + + + + void glNormal3fVertex3fSUN + GLfloat nx + GLfloat ny + GLfloat nz + GLfloat x + GLfloat y + GLfloat z + + + void glNormal3fVertex3fvSUN + const GLfloat *n + const GLfloat *v + + + void glNormal3fv + const GLfloat *v + + + + void glNormal3hNV + GLhalfNV nx + GLhalfNV ny + GLhalfNV nz + + + + void glNormal3hvNV + const GLhalfNV *v + + + + void glNormal3i + GLint nx + GLint ny + GLint nz + + + + void glNormal3iv + const GLint *v + + + + void glNormal3s + GLshort nx + GLshort ny + GLshort nz + + + + void glNormal3sv + const GLshort *v + + + + void glNormal3x + GLfixed nx + GLfixed ny + GLfixed nz + + + void glNormal3xOES + GLfixed nx + GLfixed ny + GLfixed nz + + + void glNormal3xvOES + const GLfixed *coords + + + void glNormalFormatNV + GLenum type + GLsizei stride + + + void glNormalP3ui + GLenum type + GLuint coords + + + void glNormalP3uiv + GLenum type + const GLuint *coords + + + void glNormalPointer + GLenum type + GLsizei stride + const void *pointer + + + void glNormalPointerEXT + GLenum type + GLsizei stride + GLsizei count + const void *pointer + + + void glNormalPointerListIBM + GLenum type + GLint stride + const void **pointer + GLint ptrstride + + + void glNormalPointervINTEL + GLenum type + const void **pointer + + + void glNormalStream3bATI + GLenum stream + GLbyte nx + GLbyte ny + GLbyte nz + + + void glNormalStream3bvATI + GLenum stream + const GLbyte *coords + + + void glNormalStream3dATI + GLenum stream + GLdouble nx + GLdouble ny + GLdouble nz + + + void glNormalStream3dvATI + GLenum stream + const GLdouble *coords + + + void glNormalStream3fATI + GLenum stream + GLfloat nx + GLfloat ny + GLfloat nz + + + void glNormalStream3fvATI + GLenum stream + const GLfloat *coords + + + void glNormalStream3iATI + GLenum stream + GLint nx + GLint ny + GLint nz + + + void glNormalStream3ivATI + GLenum stream + const GLint *coords + + + void glNormalStream3sATI + GLenum stream + GLshort nx + GLshort ny + GLshort nz + + + void glNormalStream3svATI + GLenum stream + const GLshort *coords + + + void glObjectLabel + GLenum identifier + GLuint name + GLsizei length + const GLchar *label + + + void glObjectLabelKHR + GLenum identifier + GLuint name + GLsizei length + const GLchar *label + + + + void glObjectPtrLabel + const void *ptr + GLsizei length + const GLchar *label + + + void glObjectPtrLabelKHR + const void *ptr + GLsizei length + const GLchar *label + + + + GLenum glObjectPurgeableAPPLE + GLenum objectType + GLuint name + GLenum option + + + GLenum glObjectUnpurgeableAPPLE + GLenum objectType + GLuint name + GLenum option + + + void glOrtho + GLdouble left + GLdouble right + GLdouble bottom + GLdouble top + GLdouble zNear + GLdouble zFar + + + + void glOrthof + GLfloat l + GLfloat r + GLfloat b + GLfloat t + GLfloat n + GLfloat f + + + void glOrthofOES + GLfloat l + GLfloat r + GLfloat b + GLfloat t + GLfloat n + GLfloat f + + + + void glOrthox + GLfixed l + GLfixed r + GLfixed b + GLfixed t + GLfixed n + GLfixed f + + + void glOrthoxOES + GLfixed l + GLfixed r + GLfixed b + GLfixed t + GLfixed n + GLfixed f + + + void glPNTrianglesfATI + GLenum pname + GLfloat param + + + void glPNTrianglesiATI + GLenum pname + GLint param + + + void glPassTexCoordATI + GLuint dst + GLuint coord + GLenum swizzle + + + void glPassThrough + GLfloat token + + + + void glPassThroughxOES + GLfixed token + + + void glPatchParameterfv + GLenum pname + const GLfloat *values + + + void glPatchParameteri + GLenum pname + GLint value + + + void glPatchParameteriEXT + GLenum pname + GLint value + + + + void glPatchParameteriOES + GLenum pname + GLint value + + + + void glPathColorGenNV + GLenum color + GLenum genMode + GLenum colorFormat + const GLfloat *coeffs + + + void glPathCommandsNV + GLuint path + GLsizei numCommands + const GLubyte *commands + GLsizei numCoords + GLenum coordType + const void *coords + + + void glPathCoordsNV + GLuint path + GLsizei numCoords + GLenum coordType + const void *coords + + + void glPathCoverDepthFuncNV + GLenum func + + + void glPathDashArrayNV + GLuint path + GLsizei dashCount + const GLfloat *dashArray + + + void glPathFogGenNV + GLenum genMode + + + GLenum glPathGlyphIndexArrayNV + GLuint firstPathName + GLenum fontTarget + const void *fontName + GLbitfield fontStyle + GLuint firstGlyphIndex + GLsizei numGlyphs + GLuint pathParameterTemplate + GLfloat emScale + + + GLenum glPathGlyphIndexRangeNV + GLenum fontTarget + const void *fontName + GLbitfield fontStyle + GLuint pathParameterTemplate + GLfloat emScale + GLuint baseAndCount[2] + + + void glPathGlyphRangeNV + GLuint firstPathName + GLenum fontTarget + const void *fontName + GLbitfield fontStyle + GLuint firstGlyph + GLsizei numGlyphs + GLenum handleMissingGlyphs + GLuint pathParameterTemplate + GLfloat emScale + + + void glPathGlyphsNV + GLuint firstPathName + GLenum fontTarget + const void *fontName + GLbitfield fontStyle + GLsizei numGlyphs + GLenum type + const void *charcodes + GLenum handleMissingGlyphs + GLuint pathParameterTemplate + GLfloat emScale + + + GLenum glPathMemoryGlyphIndexArrayNV + GLuint firstPathName + GLenum fontTarget + GLsizeiptr fontSize + const void *fontData + GLsizei faceIndex + GLuint firstGlyphIndex + GLsizei numGlyphs + GLuint pathParameterTemplate + GLfloat emScale + + + void glPathParameterfNV + GLuint path + GLenum pname + GLfloat value + + + void glPathParameterfvNV + GLuint path + GLenum pname + const GLfloat *value + + + void glPathParameteriNV + GLuint path + GLenum pname + GLint value + + + void glPathParameterivNV + GLuint path + GLenum pname + const GLint *value + + + void glPathStencilDepthOffsetNV + GLfloat factor + GLfloat units + + + void glPathStencilFuncNV + GLenum func + GLint ref + GLuint mask + + + void glPathStringNV + GLuint path + GLenum format + GLsizei length + const void *pathString + + + void glPathSubCommandsNV + GLuint path + GLsizei commandStart + GLsizei commandsToDelete + GLsizei numCommands + const GLubyte *commands + GLsizei numCoords + GLenum coordType + const void *coords + + + void glPathSubCoordsNV + GLuint path + GLsizei coordStart + GLsizei numCoords + GLenum coordType + const void *coords + + + void glPathTexGenNV + GLenum texCoordSet + GLenum genMode + GLint components + const GLfloat *coeffs + + + void glPauseTransformFeedback + + + void glPauseTransformFeedbackNV + + + + void glPixelDataRangeNV + GLenum target + GLsizei length + const void *pointer + + + void glPixelMapfv + GLenum map + GLsizei mapsize + const GLfloat *values + + + + + void glPixelMapuiv + GLenum map + GLsizei mapsize + const GLuint *values + + + + + void glPixelMapusv + GLenum map + GLsizei mapsize + const GLushort *values + + + + + void glPixelMapx + GLenum map + GLint size + const GLfixed *values + + + void glPixelStoref + GLenum pname + GLfloat param + + + + void glPixelStorei + GLenum pname + GLint param + + + + void glPixelStorex + GLenum pname + GLfixed param + + + void glPixelTexGenParameterfSGIS + GLenum pname + GLfloat param + + + void glPixelTexGenParameterfvSGIS + GLenum pname + const GLfloat *params + + + void glPixelTexGenParameteriSGIS + GLenum pname + GLint param + + + void glPixelTexGenParameterivSGIS + GLenum pname + const GLint *params + + + void glPixelTexGenSGIX + GLenum mode + + + + void glPixelTransferf + GLenum pname + GLfloat param + + + + void glPixelTransferi + GLenum pname + GLint param + + + + void glPixelTransferxOES + GLenum pname + GLfixed param + + + void glPixelTransformParameterfEXT + GLenum target + GLenum pname + GLfloat param + + + + void glPixelTransformParameterfvEXT + GLenum target + GLenum pname + const GLfloat *params + + + void glPixelTransformParameteriEXT + GLenum target + GLenum pname + GLint param + + + + void glPixelTransformParameterivEXT + GLenum target + GLenum pname + const GLint *params + + + void glPixelZoom + GLfloat xfactor + GLfloat yfactor + + + + void glPixelZoomxOES + GLfixed xfactor + GLfixed yfactor + + + GLboolean glPointAlongPathNV + GLuint path + GLsizei startSegment + GLsizei numSegments + GLfloat distance + GLfloat *x + GLfloat *y + GLfloat *tangentX + GLfloat *tangentY + + + void glPointParameterf + GLenum pname + GLfloat param + + + + void glPointParameterfARB + GLenum pname + GLfloat param + + + + + void glPointParameterfEXT + GLenum pname + GLfloat param + + + + void glPointParameterfSGIS + GLenum pname + GLfloat param + + + + void glPointParameterfv + GLenum pname + const GLfloat *params + + + + void glPointParameterfvARB + GLenum pname + const GLfloat *params + + + + + void glPointParameterfvEXT + GLenum pname + const GLfloat *params + + + + void glPointParameterfvSGIS + GLenum pname + const GLfloat *params + + + + void glPointParameteri + GLenum pname + GLint param + + + + void glPointParameteriNV + GLenum pname + GLint param + + + + + void glPointParameteriv + GLenum pname + const GLint *params + + + + void glPointParameterivNV + GLenum pname + const GLint *params + + + + + void glPointParameterx + GLenum pname + GLfixed param + + + void glPointParameterxOES + GLenum pname + GLfixed param + + + void glPointParameterxv + GLenum pname + const GLfixed *params + + + void glPointParameterxvOES + GLenum pname + const GLfixed *params + + + void glPointSize + GLfloat size + + + + void glPointSizePointerOES + GLenum type + GLsizei stride + const void *pointer + + + void glPointSizex + GLfixed size + + + void glPointSizexOES + GLfixed size + + + GLint glPollAsyncSGIX + GLuint *markerp + + + GLint glPollInstrumentsSGIX + GLint *marker_p + + + + void glPolygonMode + GLenum face + GLenum mode + + + + void glPolygonModeNV + GLenum face + GLenum mode + + + + void glPolygonOffset + GLfloat factor + GLfloat units + + + + void glPolygonOffsetClamp + GLfloat factor + GLfloat units + GLfloat clamp + + + + void glPolygonOffsetClampEXT + GLfloat factor + GLfloat units + GLfloat clamp + + + + void glPolygonOffsetEXT + GLfloat factor + GLfloat bias + + + + void glPolygonOffsetx + GLfixed factor + GLfixed units + + + void glPolygonOffsetxOES + GLfixed factor + GLfixed units + + + void glPolygonStipple + const GLubyte *mask + + + + + void glPopAttrib + + + + void glPopClientAttrib + + + void glPopDebugGroup + + + void glPopDebugGroupKHR + + + + void glPopGroupMarkerEXT + + + void glPopMatrix + + + + void glPopName + + + + void glPresentFrameDualFillNV + GLuint video_slot + GLuint64EXT minPresentTime + GLuint beginPresentTimeId + GLuint presentDurationId + GLenum type + GLenum target0 + GLuint fill0 + GLenum target1 + GLuint fill1 + GLenum target2 + GLuint fill2 + GLenum target3 + GLuint fill3 + + + void glPresentFrameKeyedNV + GLuint video_slot + GLuint64EXT minPresentTime + GLuint beginPresentTimeId + GLuint presentDurationId + GLenum type + GLenum target0 + GLuint fill0 + GLuint key0 + GLenum target1 + GLuint fill1 + GLuint key1 + + + void glPrimitiveBoundingBox + GLfloat minX + GLfloat minY + GLfloat minZ + GLfloat minW + GLfloat maxX + GLfloat maxY + GLfloat maxZ + GLfloat maxW + + + void glPrimitiveBoundingBoxARB + GLfloat minX + GLfloat minY + GLfloat minZ + GLfloat minW + GLfloat maxX + GLfloat maxY + GLfloat maxZ + GLfloat maxW + + + + void glPrimitiveBoundingBoxEXT + GLfloat minX + GLfloat minY + GLfloat minZ + GLfloat minW + GLfloat maxX + GLfloat maxY + GLfloat maxZ + GLfloat maxW + + + + void glPrimitiveBoundingBoxOES + GLfloat minX + GLfloat minY + GLfloat minZ + GLfloat minW + GLfloat maxX + GLfloat maxY + GLfloat maxZ + GLfloat maxW + + + + void glPrimitiveRestartIndex + GLuint index + + + void glPrimitiveRestartIndexNV + GLuint index + + + + void glPrimitiveRestartNV + + + + void glPrioritizeTextures + GLsizei n + const GLuint *textures + const GLfloat *priorities + + + + void glPrioritizeTexturesEXT + GLsizei n + const GLuint *textures + const GLclampf *priorities + + + + + void glPrioritizeTexturesxOES + GLsizei n + const GLuint *textures + const GLfixed *priorities + + + void glProgramBinary + GLuint program + GLenum binaryFormat + const void *binary + GLsizei length + + + void glProgramBinaryOES + GLuint program + GLenum binaryFormat + const void *binary + GLint length + + + + void glProgramBufferParametersIivNV + GLenum target + GLuint bindingIndex + GLuint wordIndex + GLsizei count + const GLint *params + + + void glProgramBufferParametersIuivNV + GLenum target + GLuint bindingIndex + GLuint wordIndex + GLsizei count + const GLuint *params + + + void glProgramBufferParametersfvNV + GLenum target + GLuint bindingIndex + GLuint wordIndex + GLsizei count + const GLfloat *params + + + void glProgramEnvParameter4dARB + GLenum target + GLuint index + GLdouble x + GLdouble y + GLdouble z + GLdouble w + + + + void glProgramEnvParameter4dvARB + GLenum target + GLuint index + const GLdouble *params + + + void glProgramEnvParameter4fARB + GLenum target + GLuint index + GLfloat x + GLfloat y + GLfloat z + GLfloat w + + + + void glProgramEnvParameter4fvARB + GLenum target + GLuint index + const GLfloat *params + + + void glProgramEnvParameterI4iNV + GLenum target + GLuint index + GLint x + GLint y + GLint z + GLint w + + + + void glProgramEnvParameterI4ivNV + GLenum target + GLuint index + const GLint *params + + + void glProgramEnvParameterI4uiNV + GLenum target + GLuint index + GLuint x + GLuint y + GLuint z + GLuint w + + + + void glProgramEnvParameterI4uivNV + GLenum target + GLuint index + const GLuint *params + + + void glProgramEnvParameters4fvEXT + GLenum target + GLuint index + GLsizei count + const GLfloat *params + + + + void glProgramEnvParametersI4ivNV + GLenum target + GLuint index + GLsizei count + const GLint *params + + + void glProgramEnvParametersI4uivNV + GLenum target + GLuint index + GLsizei count + const GLuint *params + + + void glProgramLocalParameter4dARB + GLenum target + GLuint index + GLdouble x + GLdouble y + GLdouble z + GLdouble w + + + + void glProgramLocalParameter4dvARB + GLenum target + GLuint index + const GLdouble *params + + + void glProgramLocalParameter4fARB + GLenum target + GLuint index + GLfloat x + GLfloat y + GLfloat z + GLfloat w + + + + void glProgramLocalParameter4fvARB + GLenum target + GLuint index + const GLfloat *params + + + void glProgramLocalParameterI4iNV + GLenum target + GLuint index + GLint x + GLint y + GLint z + GLint w + + + + void glProgramLocalParameterI4ivNV + GLenum target + GLuint index + const GLint *params + + + void glProgramLocalParameterI4uiNV + GLenum target + GLuint index + GLuint x + GLuint y + GLuint z + GLuint w + + + + void glProgramLocalParameterI4uivNV + GLenum target + GLuint index + const GLuint *params + + + void glProgramLocalParameters4fvEXT + GLenum target + GLuint index + GLsizei count + const GLfloat *params + + + + void glProgramLocalParametersI4ivNV + GLenum target + GLuint index + GLsizei count + const GLint *params + + + void glProgramLocalParametersI4uivNV + GLenum target + GLuint index + GLsizei count + const GLuint *params + + + void glProgramNamedParameter4dNV + GLuint id + GLsizei len + const GLubyte *name + GLdouble x + GLdouble y + GLdouble z + GLdouble w + + + + void glProgramNamedParameter4dvNV + GLuint id + GLsizei len + const GLubyte *name + const GLdouble *v + + + + void glProgramNamedParameter4fNV + GLuint id + GLsizei len + const GLubyte *name + GLfloat x + GLfloat y + GLfloat z + GLfloat w + + + + void glProgramNamedParameter4fvNV + GLuint id + GLsizei len + const GLubyte *name + const GLfloat *v + + + + void glProgramParameter4dNV + GLenum target + GLuint index + GLdouble x + GLdouble y + GLdouble z + GLdouble w + + + + void glProgramParameter4dvNV + GLenum target + GLuint index + const GLdouble *v + + + + void glProgramParameter4fNV + GLenum target + GLuint index + GLfloat x + GLfloat y + GLfloat z + GLfloat w + + + + void glProgramParameter4fvNV + GLenum target + GLuint index + const GLfloat *v + + + + void glProgramParameteri + GLuint program + GLenum pname + GLint value + + + void glProgramParameteriARB + GLuint program + GLenum pname + GLint value + + + + void glProgramParameteriEXT + GLuint program + GLenum pname + GLint value + + + + void glProgramParameters4dvNV + GLenum target + GLuint index + GLsizei count + const GLdouble *v + + + + void glProgramParameters4fvNV + GLenum target + GLuint index + GLsizei count + const GLfloat *v + + + + void glProgramPathFragmentInputGenNV + GLuint program + GLint location + GLenum genMode + GLint components + const GLfloat *coeffs + + + void glProgramStringARB + GLenum target + GLenum format + GLsizei len + const void *string + + + void glProgramSubroutineParametersuivNV + GLenum target + GLsizei count + const GLuint *params + + + void glProgramUniform1d + GLuint program + GLint location + GLdouble v0 + + + void glProgramUniform1dEXT + GLuint program + GLint location + GLdouble x + + + void glProgramUniform1dv + GLuint program + GLint location + GLsizei count + const GLdouble *value + + + void glProgramUniform1dvEXT + GLuint program + GLint location + GLsizei count + const GLdouble *value + + + void glProgramUniform1f + GLuint program + GLint location + GLfloat v0 + + + void glProgramUniform1fEXT + GLuint program + GLint location + GLfloat v0 + + + + void glProgramUniform1fv + GLuint program + GLint location + GLsizei count + const GLfloat *value + + + void glProgramUniform1fvEXT + GLuint program + GLint location + GLsizei count + const GLfloat *value + + + + void glProgramUniform1i + GLuint program + GLint location + GLint v0 + + + void glProgramUniform1i64ARB + GLuint program + GLint location + GLint64 x + + + void glProgramUniform1i64NV + GLuint program + GLint location + GLint64EXT x + + + void glProgramUniform1i64vARB + GLuint program + GLint location + GLsizei count + const GLint64 *value + + + void glProgramUniform1i64vNV + GLuint program + GLint location + GLsizei count + const GLint64EXT *value + + + void glProgramUniform1iEXT + GLuint program + GLint location + GLint v0 + + + + void glProgramUniform1iv + GLuint program + GLint location + GLsizei count + const GLint *value + + + void glProgramUniform1ivEXT + GLuint program + GLint location + GLsizei count + const GLint *value + + + + void glProgramUniform1ui + GLuint program + GLint location + GLuint v0 + + + void glProgramUniform1ui64ARB + GLuint program + GLint location + GLuint64 x + + + void glProgramUniform1ui64NV + GLuint program + GLint location + GLuint64EXT x + + + void glProgramUniform1ui64vARB + GLuint program + GLint location + GLsizei count + const GLuint64 *value + + + void glProgramUniform1ui64vNV + GLuint program + GLint location + GLsizei count + const GLuint64EXT *value + + + void glProgramUniform1uiEXT + GLuint program + GLint location + GLuint v0 + + + + void glProgramUniform1uiv + GLuint program + GLint location + GLsizei count + const GLuint *value + + + void glProgramUniform1uivEXT + GLuint program + GLint location + GLsizei count + const GLuint *value + + + + void glProgramUniform2d + GLuint program + GLint location + GLdouble v0 + GLdouble v1 + + + void glProgramUniform2dEXT + GLuint program + GLint location + GLdouble x + GLdouble y + + + void glProgramUniform2dv + GLuint program + GLint location + GLsizei count + const GLdouble *value + + + void glProgramUniform2dvEXT + GLuint program + GLint location + GLsizei count + const GLdouble *value + + + void glProgramUniform2f + GLuint program + GLint location + GLfloat v0 + GLfloat v1 + + + void glProgramUniform2fEXT + GLuint program + GLint location + GLfloat v0 + GLfloat v1 + + + + void glProgramUniform2fv + GLuint program + GLint location + GLsizei count + const GLfloat *value + + + void glProgramUniform2fvEXT + GLuint program + GLint location + GLsizei count + const GLfloat *value + + + + void glProgramUniform2i + GLuint program + GLint location + GLint v0 + GLint v1 + + + void glProgramUniform2i64ARB + GLuint program + GLint location + GLint64 x + GLint64 y + + + void glProgramUniform2i64NV + GLuint program + GLint location + GLint64EXT x + GLint64EXT y + + + void glProgramUniform2i64vARB + GLuint program + GLint location + GLsizei count + const GLint64 *value + + + void glProgramUniform2i64vNV + GLuint program + GLint location + GLsizei count + const GLint64EXT *value + + + void glProgramUniform2iEXT + GLuint program + GLint location + GLint v0 + GLint v1 + + + + void glProgramUniform2iv + GLuint program + GLint location + GLsizei count + const GLint *value + + + void glProgramUniform2ivEXT + GLuint program + GLint location + GLsizei count + const GLint *value + + + + void glProgramUniform2ui + GLuint program + GLint location + GLuint v0 + GLuint v1 + + + void glProgramUniform2ui64ARB + GLuint program + GLint location + GLuint64 x + GLuint64 y + + + void glProgramUniform2ui64NV + GLuint program + GLint location + GLuint64EXT x + GLuint64EXT y + + + void glProgramUniform2ui64vARB + GLuint program + GLint location + GLsizei count + const GLuint64 *value + + + void glProgramUniform2ui64vNV + GLuint program + GLint location + GLsizei count + const GLuint64EXT *value + + + void glProgramUniform2uiEXT + GLuint program + GLint location + GLuint v0 + GLuint v1 + + + + void glProgramUniform2uiv + GLuint program + GLint location + GLsizei count + const GLuint *value + + + void glProgramUniform2uivEXT + GLuint program + GLint location + GLsizei count + const GLuint *value + + + + void glProgramUniform3d + GLuint program + GLint location + GLdouble v0 + GLdouble v1 + GLdouble v2 + + + void glProgramUniform3dEXT + GLuint program + GLint location + GLdouble x + GLdouble y + GLdouble z + + + void glProgramUniform3dv + GLuint program + GLint location + GLsizei count + const GLdouble *value + + + void glProgramUniform3dvEXT + GLuint program + GLint location + GLsizei count + const GLdouble *value + + + void glProgramUniform3f + GLuint program + GLint location + GLfloat v0 + GLfloat v1 + GLfloat v2 + + + void glProgramUniform3fEXT + GLuint program + GLint location + GLfloat v0 + GLfloat v1 + GLfloat v2 + + + + void glProgramUniform3fv + GLuint program + GLint location + GLsizei count + const GLfloat *value + + + void glProgramUniform3fvEXT + GLuint program + GLint location + GLsizei count + const GLfloat *value + + + + void glProgramUniform3i + GLuint program + GLint location + GLint v0 + GLint v1 + GLint v2 + + + void glProgramUniform3i64ARB + GLuint program + GLint location + GLint64 x + GLint64 y + GLint64 z + + + void glProgramUniform3i64NV + GLuint program + GLint location + GLint64EXT x + GLint64EXT y + GLint64EXT z + + + void glProgramUniform3i64vARB + GLuint program + GLint location + GLsizei count + const GLint64 *value + + + void glProgramUniform3i64vNV + GLuint program + GLint location + GLsizei count + const GLint64EXT *value + + + void glProgramUniform3iEXT + GLuint program + GLint location + GLint v0 + GLint v1 + GLint v2 + + + + void glProgramUniform3iv + GLuint program + GLint location + GLsizei count + const GLint *value + + + void glProgramUniform3ivEXT + GLuint program + GLint location + GLsizei count + const GLint *value + + + + void glProgramUniform3ui + GLuint program + GLint location + GLuint v0 + GLuint v1 + GLuint v2 + + + void glProgramUniform3ui64ARB + GLuint program + GLint location + GLuint64 x + GLuint64 y + GLuint64 z + + + void glProgramUniform3ui64NV + GLuint program + GLint location + GLuint64EXT x + GLuint64EXT y + GLuint64EXT z + + + void glProgramUniform3ui64vARB + GLuint program + GLint location + GLsizei count + const GLuint64 *value + + + void glProgramUniform3ui64vNV + GLuint program + GLint location + GLsizei count + const GLuint64EXT *value + + + void glProgramUniform3uiEXT + GLuint program + GLint location + GLuint v0 + GLuint v1 + GLuint v2 + + + + void glProgramUniform3uiv + GLuint program + GLint location + GLsizei count + const GLuint *value + + + void glProgramUniform3uivEXT + GLuint program + GLint location + GLsizei count + const GLuint *value + + + + void glProgramUniform4d + GLuint program + GLint location + GLdouble v0 + GLdouble v1 + GLdouble v2 + GLdouble v3 + + + void glProgramUniform4dEXT + GLuint program + GLint location + GLdouble x + GLdouble y + GLdouble z + GLdouble w + + + void glProgramUniform4dv + GLuint program + GLint location + GLsizei count + const GLdouble *value + + + void glProgramUniform4dvEXT + GLuint program + GLint location + GLsizei count + const GLdouble *value + + + void glProgramUniform4f + GLuint program + GLint location + GLfloat v0 + GLfloat v1 + GLfloat v2 + GLfloat v3 + + + void glProgramUniform4fEXT + GLuint program + GLint location + GLfloat v0 + GLfloat v1 + GLfloat v2 + GLfloat v3 + + + + void glProgramUniform4fv + GLuint program + GLint location + GLsizei count + const GLfloat *value + + + void glProgramUniform4fvEXT + GLuint program + GLint location + GLsizei count + const GLfloat *value + + + + void glProgramUniform4i + GLuint program + GLint location + GLint v0 + GLint v1 + GLint v2 + GLint v3 + + + void glProgramUniform4i64ARB + GLuint program + GLint location + GLint64 x + GLint64 y + GLint64 z + GLint64 w + + + void glProgramUniform4i64NV + GLuint program + GLint location + GLint64EXT x + GLint64EXT y + GLint64EXT z + GLint64EXT w + + + void glProgramUniform4i64vARB + GLuint program + GLint location + GLsizei count + const GLint64 *value + + + void glProgramUniform4i64vNV + GLuint program + GLint location + GLsizei count + const GLint64EXT *value + + + void glProgramUniform4iEXT + GLuint program + GLint location + GLint v0 + GLint v1 + GLint v2 + GLint v3 + + + + void glProgramUniform4iv + GLuint program + GLint location + GLsizei count + const GLint *value + + + void glProgramUniform4ivEXT + GLuint program + GLint location + GLsizei count + const GLint *value + + + + void glProgramUniform4ui + GLuint program + GLint location + GLuint v0 + GLuint v1 + GLuint v2 + GLuint v3 + + + void glProgramUniform4ui64ARB + GLuint program + GLint location + GLuint64 x + GLuint64 y + GLuint64 z + GLuint64 w + + + void glProgramUniform4ui64NV + GLuint program + GLint location + GLuint64EXT x + GLuint64EXT y + GLuint64EXT z + GLuint64EXT w + + + void glProgramUniform4ui64vARB + GLuint program + GLint location + GLsizei count + const GLuint64 *value + + + void glProgramUniform4ui64vNV + GLuint program + GLint location + GLsizei count + const GLuint64EXT *value + + + void glProgramUniform4uiEXT + GLuint program + GLint location + GLuint v0 + GLuint v1 + GLuint v2 + GLuint v3 + + + + void glProgramUniform4uiv + GLuint program + GLint location + GLsizei count + const GLuint *value + + + void glProgramUniform4uivEXT + GLuint program + GLint location + GLsizei count + const GLuint *value + + + + void glProgramUniformHandleui64ARB + GLuint program + GLint location + GLuint64 value + + + void glProgramUniformHandleui64IMG + GLuint program + GLint location + GLuint64 value + + + + void glProgramUniformHandleui64NV + GLuint program + GLint location + GLuint64 value + + + void glProgramUniformHandleui64vARB + GLuint program + GLint location + GLsizei count + const GLuint64 *values + + + void glProgramUniformHandleui64vIMG + GLuint program + GLint location + GLsizei count + const GLuint64 *values + + + + void glProgramUniformHandleui64vNV + GLuint program + GLint location + GLsizei count + const GLuint64 *values + + + void glProgramUniformMatrix2dv + GLuint program + GLint location + GLsizei count + GLboolean transpose + const GLdouble *value + + + void glProgramUniformMatrix2dvEXT + GLuint program + GLint location + GLsizei count + GLboolean transpose + const GLdouble *value + + + void glProgramUniformMatrix2fv + GLuint program + GLint location + GLsizei count + GLboolean transpose + const GLfloat *value + + + void glProgramUniformMatrix2fvEXT + GLuint program + GLint location + GLsizei count + GLboolean transpose + const GLfloat *value + + + + void glProgramUniformMatrix2x3dv + GLuint program + GLint location + GLsizei count + GLboolean transpose + const GLdouble *value + + + void glProgramUniformMatrix2x3dvEXT + GLuint program + GLint location + GLsizei count + GLboolean transpose + const GLdouble *value + + + void glProgramUniformMatrix2x3fv + GLuint program + GLint location + GLsizei count + GLboolean transpose + const GLfloat *value + + + void glProgramUniformMatrix2x3fvEXT + GLuint program + GLint location + GLsizei count + GLboolean transpose + const GLfloat *value + + + + void glProgramUniformMatrix2x4dv + GLuint program + GLint location + GLsizei count + GLboolean transpose + const GLdouble *value + + + void glProgramUniformMatrix2x4dvEXT + GLuint program + GLint location + GLsizei count + GLboolean transpose + const GLdouble *value + + + void glProgramUniformMatrix2x4fv + GLuint program + GLint location + GLsizei count + GLboolean transpose + const GLfloat *value + + + void glProgramUniformMatrix2x4fvEXT + GLuint program + GLint location + GLsizei count + GLboolean transpose + const GLfloat *value + + + + void glProgramUniformMatrix3dv + GLuint program + GLint location + GLsizei count + GLboolean transpose + const GLdouble *value + + + void glProgramUniformMatrix3dvEXT + GLuint program + GLint location + GLsizei count + GLboolean transpose + const GLdouble *value + + + void glProgramUniformMatrix3fv + GLuint program + GLint location + GLsizei count + GLboolean transpose + const GLfloat *value + + + void glProgramUniformMatrix3fvEXT + GLuint program + GLint location + GLsizei count + GLboolean transpose + const GLfloat *value + + + + void glProgramUniformMatrix3x2dv + GLuint program + GLint location + GLsizei count + GLboolean transpose + const GLdouble *value + + + void glProgramUniformMatrix3x2dvEXT + GLuint program + GLint location + GLsizei count + GLboolean transpose + const GLdouble *value + + + void glProgramUniformMatrix3x2fv + GLuint program + GLint location + GLsizei count + GLboolean transpose + const GLfloat *value + + + void glProgramUniformMatrix3x2fvEXT + GLuint program + GLint location + GLsizei count + GLboolean transpose + const GLfloat *value + + + + void glProgramUniformMatrix3x4dv + GLuint program + GLint location + GLsizei count + GLboolean transpose + const GLdouble *value + + + void glProgramUniformMatrix3x4dvEXT + GLuint program + GLint location + GLsizei count + GLboolean transpose + const GLdouble *value + + + void glProgramUniformMatrix3x4fv + GLuint program + GLint location + GLsizei count + GLboolean transpose + const GLfloat *value + + + void glProgramUniformMatrix3x4fvEXT + GLuint program + GLint location + GLsizei count + GLboolean transpose + const GLfloat *value + + + + void glProgramUniformMatrix4dv + GLuint program + GLint location + GLsizei count + GLboolean transpose + const GLdouble *value + + + void glProgramUniformMatrix4dvEXT + GLuint program + GLint location + GLsizei count + GLboolean transpose + const GLdouble *value + + + void glProgramUniformMatrix4fv + GLuint program + GLint location + GLsizei count + GLboolean transpose + const GLfloat *value + + + void glProgramUniformMatrix4fvEXT + GLuint program + GLint location + GLsizei count + GLboolean transpose + const GLfloat *value + + + + void glProgramUniformMatrix4x2dv + GLuint program + GLint location + GLsizei count + GLboolean transpose + const GLdouble *value + + + void glProgramUniformMatrix4x2dvEXT + GLuint program + GLint location + GLsizei count + GLboolean transpose + const GLdouble *value + + + void glProgramUniformMatrix4x2fv + GLuint program + GLint location + GLsizei count + GLboolean transpose + const GLfloat *value + + + void glProgramUniformMatrix4x2fvEXT + GLuint program + GLint location + GLsizei count + GLboolean transpose + const GLfloat *value + + + + void glProgramUniformMatrix4x3dv + GLuint program + GLint location + GLsizei count + GLboolean transpose + const GLdouble *value + + + void glProgramUniformMatrix4x3dvEXT + GLuint program + GLint location + GLsizei count + GLboolean transpose + const GLdouble *value + + + void glProgramUniformMatrix4x3fv + GLuint program + GLint location + GLsizei count + GLboolean transpose + const GLfloat *value + + + void glProgramUniformMatrix4x3fvEXT + GLuint program + GLint location + GLsizei count + GLboolean transpose + const GLfloat *value + + + + void glProgramUniformui64NV + GLuint program + GLint location + GLuint64EXT value + + + void glProgramUniformui64vNV + GLuint program + GLint location + GLsizei count + const GLuint64EXT *value + + + void glProgramVertexLimitNV + GLenum target + GLint limit + + + void glProvokingVertex + GLenum mode + + + void glProvokingVertexEXT + GLenum mode + + + + void glPushAttrib + GLbitfield mask + + + + void glPushClientAttrib + GLbitfield mask + + + void glPushClientAttribDefaultEXT + GLbitfield mask + + + void glPushDebugGroup + GLenum source + GLuint id + GLsizei length + const GLchar *message + + + void glPushDebugGroupKHR + GLenum source + GLuint id + GLsizei length + const GLchar *message + + + + void glPushGroupMarkerEXT + GLsizei length + const GLchar *marker + + + void glPushMatrix + + + + void glPushName + GLuint name + + + + void glQueryCounter + GLuint id + GLenum target + + + void glQueryCounterEXT + GLuint id + GLenum target + + + + GLbitfield glQueryMatrixxOES + GLfixed *mantissa + GLint *exponent + + + void glQueryObjectParameteruiAMD + GLenum target + GLuint id + GLenum pname + GLuint param + + + GLint glQueryResourceNV + GLenum queryType + GLint tagId + GLuint bufSize + GLint *buffer + + + void glQueryResourceTagNV + GLint tagId + const GLchar *tagString + + + void glRasterPos2d + GLdouble x + GLdouble y + + + + void glRasterPos2dv + const GLdouble *v + + + + void glRasterPos2f + GLfloat x + GLfloat y + + + + void glRasterPos2fv + const GLfloat *v + + + + void glRasterPos2i + GLint x + GLint y + + + + void glRasterPos2iv + const GLint *v + + + + void glRasterPos2s + GLshort x + GLshort y + + + + void glRasterPos2sv + const GLshort *v + + + + void glRasterPos2xOES + GLfixed x + GLfixed y + + + void glRasterPos2xvOES + const GLfixed *coords + + + void glRasterPos3d + GLdouble x + GLdouble y + GLdouble z + + + + void glRasterPos3dv + const GLdouble *v + + + + void glRasterPos3f + GLfloat x + GLfloat y + GLfloat z + + + + void glRasterPos3fv + const GLfloat *v + + + + void glRasterPos3i + GLint x + GLint y + GLint z + + + + void glRasterPos3iv + const GLint *v + + + + void glRasterPos3s + GLshort x + GLshort y + GLshort z + + + + void glRasterPos3sv + const GLshort *v + + + + void glRasterPos3xOES + GLfixed x + GLfixed y + GLfixed z + + + void glRasterPos3xvOES + const GLfixed *coords + + + void glRasterPos4d + GLdouble x + GLdouble y + GLdouble z + GLdouble w + + + + void glRasterPos4dv + const GLdouble *v + + + + void glRasterPos4f + GLfloat x + GLfloat y + GLfloat z + GLfloat w + + + + void glRasterPos4fv + const GLfloat *v + + + + void glRasterPos4i + GLint x + GLint y + GLint z + GLint w + + + + void glRasterPos4iv + const GLint *v + + + + void glRasterPos4s + GLshort x + GLshort y + GLshort z + GLshort w + + + + void glRasterPos4sv + const GLshort *v + + + + void glRasterPos4xOES + GLfixed x + GLfixed y + GLfixed z + GLfixed w + + + void glRasterPos4xvOES + const GLfixed *coords + + + void glRasterSamplesEXT + GLuint samples + GLboolean fixedsamplelocations + + + void glReadBuffer + GLenum src + + + + void glReadBufferIndexedEXT + GLenum src + GLint index + + + void glReadBufferNV + GLenum mode + + + void glReadInstrumentsSGIX + GLint marker + + + + void glReadPixels + GLint x + GLint y + GLsizei width + GLsizei height + GLenum format + GLenum type + void *pixels + + + + + void glReadnPixels + GLint x + GLint y + GLsizei width + GLsizei height + GLenum format + GLenum type + GLsizei bufSize + void *data + + + void glReadnPixelsARB + GLint x + GLint y + GLsizei width + GLsizei height + GLenum format + GLenum type + GLsizei bufSize + void *data + + + + void glReadnPixelsEXT + GLint x + GLint y + GLsizei width + GLsizei height + GLenum format + GLenum type + GLsizei bufSize + void *data + + + + void glReadnPixelsKHR + GLint x + GLint y + GLsizei width + GLsizei height + GLenum format + GLenum type + GLsizei bufSize + void *data + + + + GLboolean glReleaseKeyedMutexWin32EXT + GLuint memory + GLuint64 key + + + void glRectd + GLdouble x1 + GLdouble y1 + GLdouble x2 + GLdouble y2 + + + + void glRectdv + const GLdouble *v1 + const GLdouble *v2 + + + + void glRectf + GLfloat x1 + GLfloat y1 + GLfloat x2 + GLfloat y2 + + + + void glRectfv + const GLfloat *v1 + const GLfloat *v2 + + + + void glRecti + GLint x1 + GLint y1 + GLint x2 + GLint y2 + + + + void glRectiv + const GLint *v1 + const GLint *v2 + + + + void glRects + GLshort x1 + GLshort y1 + GLshort x2 + GLshort y2 + + + + void glRectsv + const GLshort *v1 + const GLshort *v2 + + + + void glRectxOES + GLfixed x1 + GLfixed y1 + GLfixed x2 + GLfixed y2 + + + void glRectxvOES + const GLfixed *v1 + const GLfixed *v2 + + + void glReferencePlaneSGIX + const GLdouble *equation + + + + void glReleaseShaderCompiler + + + void glRenderGpuMaskNV + GLbitfield mask + + + GLint glRenderMode + GLenum mode + + + + void glRenderbufferStorage + GLenum target + GLenum internalformat + GLsizei width + GLsizei height + + + + void glRenderbufferStorageEXT + GLenum target + GLenum internalformat + GLsizei width + GLsizei height + + + + + void glRenderbufferStorageMultisample + GLenum target + GLsizei samples + GLenum internalformat + GLsizei width + GLsizei height + + + + void glRenderbufferStorageMultisampleANGLE + GLenum target + GLsizei samples + GLenum internalformat + GLsizei width + GLsizei height + + + void glRenderbufferStorageMultisampleAPPLE + GLenum target + GLsizei samples + GLenum internalformat + GLsizei width + GLsizei height + + + void glRenderbufferStorageMultisampleAdvancedAMD + GLenum target + GLsizei samples + GLsizei storageSamples + GLenum internalformat + GLsizei width + GLsizei height + + + void glRenderbufferStorageMultisampleCoverageNV + GLenum target + GLsizei coverageSamples + GLsizei colorSamples + GLenum internalformat + GLsizei width + GLsizei height + + + void glRenderbufferStorageMultisampleEXT + GLenum target + GLsizei samples + GLenum internalformat + GLsizei width + GLsizei height + + + + + void glRenderbufferStorageMultisampleIMG + GLenum target + GLsizei samples + GLenum internalformat + GLsizei width + GLsizei height + + + void glRenderbufferStorageMultisampleNV + GLenum target + GLsizei samples + GLenum internalformat + GLsizei width + GLsizei height + + + + void glRenderbufferStorageOES + GLenum target + GLenum internalformat + GLsizei width + GLsizei height + + + void glReplacementCodePointerSUN + GLenum type + GLsizei stride + const void **pointer + + + void glReplacementCodeubSUN + GLubyte code + + + void glReplacementCodeubvSUN + const GLubyte *code + + + void glReplacementCodeuiColor3fVertex3fSUN + GLuint rc + GLfloat r + GLfloat g + GLfloat b + GLfloat x + GLfloat y + GLfloat z + + + void glReplacementCodeuiColor3fVertex3fvSUN + const GLuint *rc + const GLfloat *c + const GLfloat *v + + + void glReplacementCodeuiColor4fNormal3fVertex3fSUN + GLuint rc + GLfloat r + GLfloat g + GLfloat b + GLfloat a + GLfloat nx + GLfloat ny + GLfloat nz + GLfloat x + GLfloat y + GLfloat z + + + void glReplacementCodeuiColor4fNormal3fVertex3fvSUN + const GLuint *rc + const GLfloat *c + const GLfloat *n + const GLfloat *v + + + void glReplacementCodeuiColor4ubVertex3fSUN + GLuint rc + GLubyte r + GLubyte g + GLubyte b + GLubyte a + GLfloat x + GLfloat y + GLfloat z + + + void glReplacementCodeuiColor4ubVertex3fvSUN + const GLuint *rc + const GLubyte *c + const GLfloat *v + + + void glReplacementCodeuiNormal3fVertex3fSUN + GLuint rc + GLfloat nx + GLfloat ny + GLfloat nz + GLfloat x + GLfloat y + GLfloat z + + + void glReplacementCodeuiNormal3fVertex3fvSUN + const GLuint *rc + const GLfloat *n + const GLfloat *v + + + void glReplacementCodeuiSUN + GLuint code + + + void glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN + GLuint rc + GLfloat s + GLfloat t + GLfloat r + GLfloat g + GLfloat b + GLfloat a + GLfloat nx + GLfloat ny + GLfloat nz + GLfloat x + GLfloat y + GLfloat z + + + void glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN + const GLuint *rc + const GLfloat *tc + const GLfloat *c + const GLfloat *n + const GLfloat *v + + + void glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN + GLuint rc + GLfloat s + GLfloat t + GLfloat nx + GLfloat ny + GLfloat nz + GLfloat x + GLfloat y + GLfloat z + + + void glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN + const GLuint *rc + const GLfloat *tc + const GLfloat *n + const GLfloat *v + + + void glReplacementCodeuiTexCoord2fVertex3fSUN + GLuint rc + GLfloat s + GLfloat t + GLfloat x + GLfloat y + GLfloat z + + + void glReplacementCodeuiTexCoord2fVertex3fvSUN + const GLuint *rc + const GLfloat *tc + const GLfloat *v + + + void glReplacementCodeuiVertex3fSUN + GLuint rc + GLfloat x + GLfloat y + GLfloat z + + + void glReplacementCodeuiVertex3fvSUN + const GLuint *rc + const GLfloat *v + + + void glReplacementCodeuivSUN + const GLuint *code + + + void glReplacementCodeusSUN + GLushort code + + + void glReplacementCodeusvSUN + const GLushort *code + + + void glRequestResidentProgramsNV + GLsizei n + const GLuint *programs + + + + void glResetHistogram + GLenum target + + + + void glResetHistogramEXT + GLenum target + + + + + void glResetMemoryObjectParameterNV + GLuint memory + GLenum pname + + + void glResetMinmax + GLenum target + + + + void glResetMinmaxEXT + GLenum target + + + + + void glResizeBuffersMESA + + + void glResolveDepthValuesNV + + + void glResolveMultisampleFramebufferAPPLE + + + void glResumeTransformFeedback + + + void glResumeTransformFeedbackNV + + + + void glRotated + GLdouble angle + GLdouble x + GLdouble y + GLdouble z + + + + void glRotatef + GLfloat angle + GLfloat x + GLfloat y + GLfloat z + + + + void glRotatex + GLfixed angle + GLfixed x + GLfixed y + GLfixed z + + + void glRotatexOES + GLfixed angle + GLfixed x + GLfixed y + GLfixed z + + + void glSampleCoverage + GLfloat value + GLboolean invert + + + + void glSampleCoverageARB + GLfloat value + GLboolean invert + + + + void glSampleCoveragex + GLclampx value + GLboolean invert + + + void glSampleCoveragexOES + GLclampx value + GLboolean invert + + + void glSampleMapATI + GLuint dst + GLuint interp + GLenum swizzle + + + void glSampleMaskEXT + GLclampf value + GLboolean invert + + + void glSampleMaskIndexedNV + GLuint index + GLbitfield mask + + + void glSampleMaskSGIS + GLclampf value + GLboolean invert + + + + + void glSampleMaski + GLuint maskNumber + GLbitfield mask + + + void glSamplePatternEXT + GLenum pattern + + + void glSamplePatternSGIS + GLenum pattern + + + + + void glSamplerParameterIiv + GLuint sampler + GLenum pname + const GLint *param + + + void glSamplerParameterIivEXT + GLuint sampler + GLenum pname + const GLint *param + + + + void glSamplerParameterIivOES + GLuint sampler + GLenum pname + const GLint *param + + + + void glSamplerParameterIuiv + GLuint sampler + GLenum pname + const GLuint *param + + + void glSamplerParameterIuivEXT + GLuint sampler + GLenum pname + const GLuint *param + + + + void glSamplerParameterIuivOES + GLuint sampler + GLenum pname + const GLuint *param + + + + void glSamplerParameterf + GLuint sampler + GLenum pname + GLfloat param + + + void glSamplerParameterfv + GLuint sampler + GLenum pname + const GLfloat *param + + + void glSamplerParameteri + GLuint sampler + GLenum pname + GLint param + + + void glSamplerParameteriv + GLuint sampler + GLenum pname + const GLint *param + + + void glScaled + GLdouble x + GLdouble y + GLdouble z + + + + void glScalef + GLfloat x + GLfloat y + GLfloat z + + + + void glScalex + GLfixed x + GLfixed y + GLfixed z + + + void glScalexOES + GLfixed x + GLfixed y + GLfixed z + + + void glScissor + GLint x + GLint y + GLsizei width + GLsizei height + + + + void glScissorArrayv + GLuint first + GLsizei count + const GLint *v + + + void glScissorArrayvNV + GLuint first + GLsizei count + const GLint *v + + + + void glScissorArrayvOES + GLuint first + GLsizei count + const GLint *v + + + + void glScissorExclusiveArrayvNV + GLuint first + GLsizei count + const GLint *v + + + void glScissorExclusiveNV + GLint x + GLint y + GLsizei width + GLsizei height + + + void glScissorIndexed + GLuint index + GLint left + GLint bottom + GLsizei width + GLsizei height + + + void glScissorIndexedNV + GLuint index + GLint left + GLint bottom + GLsizei width + GLsizei height + + + + void glScissorIndexedOES + GLuint index + GLint left + GLint bottom + GLsizei width + GLsizei height + + + + void glScissorIndexedv + GLuint index + const GLint *v + + + void glScissorIndexedvNV + GLuint index + const GLint *v + + + + void glScissorIndexedvOES + GLuint index + const GLint *v + + + + void glSecondaryColor3b + GLbyte red + GLbyte green + GLbyte blue + + + + void glSecondaryColor3bEXT + GLbyte red + GLbyte green + GLbyte blue + + + + + void glSecondaryColor3bv + const GLbyte *v + + + + void glSecondaryColor3bvEXT + const GLbyte *v + + + + + void glSecondaryColor3d + GLdouble red + GLdouble green + GLdouble blue + + + + void glSecondaryColor3dEXT + GLdouble red + GLdouble green + GLdouble blue + + + + + void glSecondaryColor3dv + const GLdouble *v + + + + void glSecondaryColor3dvEXT + const GLdouble *v + + + + + void glSecondaryColor3f + GLfloat red + GLfloat green + GLfloat blue + + + + void glSecondaryColor3fEXT + GLfloat red + GLfloat green + GLfloat blue + + + + + void glSecondaryColor3fv + const GLfloat *v + + + + void glSecondaryColor3fvEXT + const GLfloat *v + + + + + void glSecondaryColor3hNV + GLhalfNV red + GLhalfNV green + GLhalfNV blue + + + + void glSecondaryColor3hvNV + const GLhalfNV *v + + + + void glSecondaryColor3i + GLint red + GLint green + GLint blue + + + + void glSecondaryColor3iEXT + GLint red + GLint green + GLint blue + + + + + void glSecondaryColor3iv + const GLint *v + + + + void glSecondaryColor3ivEXT + const GLint *v + + + + + void glSecondaryColor3s + GLshort red + GLshort green + GLshort blue + + + + void glSecondaryColor3sEXT + GLshort red + GLshort green + GLshort blue + + + + + void glSecondaryColor3sv + const GLshort *v + + + + void glSecondaryColor3svEXT + const GLshort *v + + + + + void glSecondaryColor3ub + GLubyte red + GLubyte green + GLubyte blue + + + + void glSecondaryColor3ubEXT + GLubyte red + GLubyte green + GLubyte blue + + + + + void glSecondaryColor3ubv + const GLubyte *v + + + + void glSecondaryColor3ubvEXT + const GLubyte *v + + + + + void glSecondaryColor3ui + GLuint red + GLuint green + GLuint blue + + + + void glSecondaryColor3uiEXT + GLuint red + GLuint green + GLuint blue + + + + + void glSecondaryColor3uiv + const GLuint *v + + + + void glSecondaryColor3uivEXT + const GLuint *v + + + + + void glSecondaryColor3us + GLushort red + GLushort green + GLushort blue + + + + void glSecondaryColor3usEXT + GLushort red + GLushort green + GLushort blue + + + + + void glSecondaryColor3usv + const GLushort *v + + + + void glSecondaryColor3usvEXT + const GLushort *v + + + + + void glSecondaryColorFormatNV + GLint size + GLenum type + GLsizei stride + + + void glSecondaryColorP3ui + GLenum type + GLuint color + + + void glSecondaryColorP3uiv + GLenum type + const GLuint *color + + + void glSecondaryColorPointer + GLint size + GLenum type + GLsizei stride + const void *pointer + + + void glSecondaryColorPointerEXT + GLint size + GLenum type + GLsizei stride + const void *pointer + + + + void glSecondaryColorPointerListIBM + GLint size + GLenum type + GLint stride + const void **pointer + GLint ptrstride + + + void glSelectBuffer + GLsizei size + GLuint *buffer + + + + void glSelectPerfMonitorCountersAMD + GLuint monitor + GLboolean enable + GLuint group + GLint numCounters + GLuint *counterList + + + void glSemaphoreParameterui64vEXT + GLuint semaphore + GLenum pname + const GLuint64 *params + + + void glSeparableFilter2D + GLenum target + GLenum internalformat + GLsizei width + GLsizei height + GLenum format + GLenum type + const void *row + const void *column + + + + + void glSeparableFilter2DEXT + GLenum target + GLenum internalformat + GLsizei width + GLsizei height + GLenum format + GLenum type + const void *row + const void *column + + + + + void glSetFenceAPPLE + GLuint fence + + + void glSetFenceNV + GLuint fence + GLenum condition + + + void glSetFragmentShaderConstantATI + GLuint dst + const GLfloat *value + + + void glSetInvariantEXT + GLuint id + GLenum type + const void *addr + + + void glSetLocalConstantEXT + GLuint id + GLenum type + const void *addr + + + void glSetMultisamplefvAMD + GLenum pname + GLuint index + const GLfloat *val + + + void glShadeModel + GLenum mode + + + + void glShaderBinary + GLsizei count + const GLuint *shaders + GLenum binaryformat + const void *binary + GLsizei length + + + void glShaderOp1EXT + GLenum op + GLuint res + GLuint arg1 + + + void glShaderOp2EXT + GLenum op + GLuint res + GLuint arg1 + GLuint arg2 + + + void glShaderOp3EXT + GLenum op + GLuint res + GLuint arg1 + GLuint arg2 + GLuint arg3 + + + void glShaderSource + GLuint shader + GLsizei count + const GLchar *const*string + const GLint *length + + + void glShaderSourceARB + GLhandleARB shaderObj + GLsizei count + const GLcharARB **string + const GLint *length + + + + void glShaderStorageBlockBinding + GLuint program + GLuint storageBlockIndex + GLuint storageBlockBinding + + + void glShadingRateImageBarrierNV + GLboolean synchronize + + + void glShadingRateImagePaletteNV + GLuint viewport + GLuint first + GLsizei count + const GLenum *rates + + + void glShadingRateSampleOrderNV + GLenum order + + + void glShadingRateSampleOrderCustomNV + GLenum rate + GLuint samples + const GLint *locations + + + void glSharpenTexFuncSGIS + GLenum target + GLsizei n + const GLfloat *points + + + + void glSignalSemaphoreEXT + GLuint semaphore + GLuint numBufferBarriers + const GLuint *buffers + GLuint numTextureBarriers + const GLuint *textures + const GLenum *dstLayouts + + + void glSignalSemaphoreui64NVX + GLuint signalGpu + GLsizei fenceObjectCount + const GLuint *semaphoreArray + const GLuint64 *fenceValueArray + + + void glSpecializeShader + GLuint shader + const GLchar *pEntryPoint + GLuint numSpecializationConstants + const GLuint *pConstantIndex + const GLuint *pConstantValue + + + void glSpecializeShaderARB + GLuint shader + const GLchar *pEntryPoint + GLuint numSpecializationConstants + const GLuint *pConstantIndex + const GLuint *pConstantValue + + + + void glSpriteParameterfSGIX + GLenum pname + GLfloat param + + + + void glSpriteParameterfvSGIX + GLenum pname + const GLfloat *params + + + + void glSpriteParameteriSGIX + GLenum pname + GLint param + + + + void glSpriteParameterivSGIX + GLenum pname + const GLint *params + + + + void glStartInstrumentsSGIX + + + + void glStartTilingQCOM + GLuint x + GLuint y + GLuint width + GLuint height + GLbitfield preserveMask + + + void glStateCaptureNV + GLuint state + GLenum mode + + + void glStencilClearTagEXT + GLsizei stencilTagBits + GLuint stencilClearTag + + + + void glStencilFillPathInstancedNV + GLsizei numPaths + GLenum pathNameType + const void *paths + GLuint pathBase + GLenum fillMode + GLuint mask + GLenum transformType + const GLfloat *transformValues + + + void glStencilFillPathNV + GLuint path + GLenum fillMode + GLuint mask + + + void glStencilFunc + GLenum func + GLint ref + GLuint mask + + + + void glStencilFuncSeparate + GLenum face + GLenum func + GLint ref + GLuint mask + + + void glStencilFuncSeparateATI + GLenum frontfunc + GLenum backfunc + GLint ref + GLuint mask + + + void glStencilMask + GLuint mask + + + + void glStencilMaskSeparate + GLenum face + GLuint mask + + + void glStencilOp + GLenum fail + GLenum zfail + GLenum zpass + + + + void glStencilOpSeparate + GLenum face + GLenum sfail + GLenum dpfail + GLenum dppass + + + void glStencilOpSeparateATI + GLenum face + GLenum sfail + GLenum dpfail + GLenum dppass + + + + void glStencilOpValueAMD + GLenum face + GLuint value + + + void glStencilStrokePathInstancedNV + GLsizei numPaths + GLenum pathNameType + const void *paths + GLuint pathBase + GLint reference + GLuint mask + GLenum transformType + const GLfloat *transformValues + + + void glStencilStrokePathNV + GLuint path + GLint reference + GLuint mask + + + void glStencilThenCoverFillPathInstancedNV + GLsizei numPaths + GLenum pathNameType + const void *paths + GLuint pathBase + GLenum fillMode + GLuint mask + GLenum coverMode + GLenum transformType + const GLfloat *transformValues + + + void glStencilThenCoverFillPathNV + GLuint path + GLenum fillMode + GLuint mask + GLenum coverMode + + + void glStencilThenCoverStrokePathInstancedNV + GLsizei numPaths + GLenum pathNameType + const void *paths + GLuint pathBase + GLint reference + GLuint mask + GLenum coverMode + GLenum transformType + const GLfloat *transformValues + + + void glStencilThenCoverStrokePathNV + GLuint path + GLint reference + GLuint mask + GLenum coverMode + + + void glStopInstrumentsSGIX + GLint marker + + + + void glStringMarkerGREMEDY + GLsizei len + const void *string + + + void glSubpixelPrecisionBiasNV + GLuint xbits + GLuint ybits + + + void glSwizzleEXT + GLuint res + GLuint in + GLenum outX + GLenum outY + GLenum outZ + GLenum outW + + + void glSyncTextureINTEL + GLuint texture + + + void glTagSampleBufferSGIX + + + + void glTangent3bEXT + GLbyte tx + GLbyte ty + GLbyte tz + + + + void glTangent3bvEXT + const GLbyte *v + + + void glTangent3dEXT + GLdouble tx + GLdouble ty + GLdouble tz + + + + void glTangent3dvEXT + const GLdouble *v + + + void glTangent3fEXT + GLfloat tx + GLfloat ty + GLfloat tz + + + + void glTangent3fvEXT + const GLfloat *v + + + void glTangent3iEXT + GLint tx + GLint ty + GLint tz + + + + void glTangent3ivEXT + const GLint *v + + + void glTangent3sEXT + GLshort tx + GLshort ty + GLshort tz + + + + void glTangent3svEXT + const GLshort *v + + + void glTangentPointerEXT + GLenum type + GLsizei stride + const void *pointer + + + void glTbufferMask3DFX + GLuint mask + + + void glTessellationFactorAMD + GLfloat factor + + + void glTessellationModeAMD + GLenum mode + + + GLboolean glTestFenceAPPLE + GLuint fence + + + GLboolean glTestFenceNV + GLuint fence + + + + GLboolean glTestObjectAPPLE + GLenum object + GLuint name + + + void glTexAttachMemoryNV + GLenum target + GLuint memory + GLuint64 offset + + + void glTexBuffer + GLenum target + GLenum internalformat + GLuint buffer + + + void glTexBufferARB + GLenum target + GLenum internalformat + GLuint buffer + + + + + void glTexBufferEXT + GLenum target + GLenum internalformat + GLuint buffer + + + + void glTexBufferOES + GLenum target + GLenum internalformat + GLuint buffer + + + + void glTexBufferRange + GLenum target + GLenum internalformat + GLuint buffer + GLintptr offset + GLsizeiptr size + + + void glTexBufferRangeEXT + GLenum target + GLenum internalformat + GLuint buffer + GLintptr offset + GLsizeiptr size + + + + void glTexBufferRangeOES + GLenum target + GLenum internalformat + GLuint buffer + GLintptr offset + GLsizeiptr size + + + + void glTexBumpParameterfvATI + GLenum pname + const GLfloat *param + + + void glTexBumpParameterivATI + GLenum pname + const GLint *param + + + void glTexCoord1bOES + GLbyte s + + + void glTexCoord1bvOES + const GLbyte *coords + + + void glTexCoord1d + GLdouble s + + + + void glTexCoord1dv + const GLdouble *v + + + + void glTexCoord1f + GLfloat s + + + + void glTexCoord1fv + const GLfloat *v + + + + void glTexCoord1hNV + GLhalfNV s + + + + void glTexCoord1hvNV + const GLhalfNV *v + + + + void glTexCoord1i + GLint s + + + + void glTexCoord1iv + const GLint *v + + + + void glTexCoord1s + GLshort s + + + + void glTexCoord1sv + const GLshort *v + + + + void glTexCoord1xOES + GLfixed s + + + void glTexCoord1xvOES + const GLfixed *coords + + + void glTexCoord2bOES + GLbyte s + GLbyte t + + + void glTexCoord2bvOES + const GLbyte *coords + + + void glTexCoord2d + GLdouble s + GLdouble t + + + + void glTexCoord2dv + const GLdouble *v + + + + void glTexCoord2f + GLfloat s + GLfloat t + + + + void glTexCoord2fColor3fVertex3fSUN + GLfloat s + GLfloat t + GLfloat r + GLfloat g + GLfloat b + GLfloat x + GLfloat y + GLfloat z + + + void glTexCoord2fColor3fVertex3fvSUN + const GLfloat *tc + const GLfloat *c + const GLfloat *v + + + void glTexCoord2fColor4fNormal3fVertex3fSUN + GLfloat s + GLfloat t + GLfloat r + GLfloat g + GLfloat b + GLfloat a + GLfloat nx + GLfloat ny + GLfloat nz + GLfloat x + GLfloat y + GLfloat z + + + void glTexCoord2fColor4fNormal3fVertex3fvSUN + const GLfloat *tc + const GLfloat *c + const GLfloat *n + const GLfloat *v + + + void glTexCoord2fColor4ubVertex3fSUN + GLfloat s + GLfloat t + GLubyte r + GLubyte g + GLubyte b + GLubyte a + GLfloat x + GLfloat y + GLfloat z + + + void glTexCoord2fColor4ubVertex3fvSUN + const GLfloat *tc + const GLubyte *c + const GLfloat *v + + + void glTexCoord2fNormal3fVertex3fSUN + GLfloat s + GLfloat t + GLfloat nx + GLfloat ny + GLfloat nz + GLfloat x + GLfloat y + GLfloat z + + + void glTexCoord2fNormal3fVertex3fvSUN + const GLfloat *tc + const GLfloat *n + const GLfloat *v + + + void glTexCoord2fVertex3fSUN + GLfloat s + GLfloat t + GLfloat x + GLfloat y + GLfloat z + + + void glTexCoord2fVertex3fvSUN + const GLfloat *tc + const GLfloat *v + + + void glTexCoord2fv + const GLfloat *v + + + + void glTexCoord2hNV + GLhalfNV s + GLhalfNV t + + + + void glTexCoord2hvNV + const GLhalfNV *v + + + + void glTexCoord2i + GLint s + GLint t + + + + void glTexCoord2iv + const GLint *v + + + + void glTexCoord2s + GLshort s + GLshort t + + + + void glTexCoord2sv + const GLshort *v + + + + void glTexCoord2xOES + GLfixed s + GLfixed t + + + void glTexCoord2xvOES + const GLfixed *coords + + + void glTexCoord3bOES + GLbyte s + GLbyte t + GLbyte r + + + void glTexCoord3bvOES + const GLbyte *coords + + + void glTexCoord3d + GLdouble s + GLdouble t + GLdouble r + + + + void glTexCoord3dv + const GLdouble *v + + + + void glTexCoord3f + GLfloat s + GLfloat t + GLfloat r + + + + void glTexCoord3fv + const GLfloat *v + + + + void glTexCoord3hNV + GLhalfNV s + GLhalfNV t + GLhalfNV r + + + + void glTexCoord3hvNV + const GLhalfNV *v + + + + void glTexCoord3i + GLint s + GLint t + GLint r + + + + void glTexCoord3iv + const GLint *v + + + + void glTexCoord3s + GLshort s + GLshort t + GLshort r + + + + void glTexCoord3sv + const GLshort *v + + + + void glTexCoord3xOES + GLfixed s + GLfixed t + GLfixed r + + + void glTexCoord3xvOES + const GLfixed *coords + + + void glTexCoord4bOES + GLbyte s + GLbyte t + GLbyte r + GLbyte q + + + void glTexCoord4bvOES + const GLbyte *coords + + + void glTexCoord4d + GLdouble s + GLdouble t + GLdouble r + GLdouble q + + + + void glTexCoord4dv + const GLdouble *v + + + + void glTexCoord4f + GLfloat s + GLfloat t + GLfloat r + GLfloat q + + + + void glTexCoord4fColor4fNormal3fVertex4fSUN + GLfloat s + GLfloat t + GLfloat p + GLfloat q + GLfloat r + GLfloat g + GLfloat b + GLfloat a + GLfloat nx + GLfloat ny + GLfloat nz + GLfloat x + GLfloat y + GLfloat z + GLfloat w + + + void glTexCoord4fColor4fNormal3fVertex4fvSUN + const GLfloat *tc + const GLfloat *c + const GLfloat *n + const GLfloat *v + + + void glTexCoord4fVertex4fSUN + GLfloat s + GLfloat t + GLfloat p + GLfloat q + GLfloat x + GLfloat y + GLfloat z + GLfloat w + + + void glTexCoord4fVertex4fvSUN + const GLfloat *tc + const GLfloat *v + + + void glTexCoord4fv + const GLfloat *v + + + + void glTexCoord4hNV + GLhalfNV s + GLhalfNV t + GLhalfNV r + GLhalfNV q + + + + void glTexCoord4hvNV + const GLhalfNV *v + + + + void glTexCoord4i + GLint s + GLint t + GLint r + GLint q + + + + void glTexCoord4iv + const GLint *v + + + + void glTexCoord4s + GLshort s + GLshort t + GLshort r + GLshort q + + + + void glTexCoord4sv + const GLshort *v + + + + void glTexCoord4xOES + GLfixed s + GLfixed t + GLfixed r + GLfixed q + + + void glTexCoord4xvOES + const GLfixed *coords + + + void glTexCoordFormatNV + GLint size + GLenum type + GLsizei stride + + + void glTexCoordP1ui + GLenum type + GLuint coords + + + void glTexCoordP1uiv + GLenum type + const GLuint *coords + + + void glTexCoordP2ui + GLenum type + GLuint coords + + + void glTexCoordP2uiv + GLenum type + const GLuint *coords + + + void glTexCoordP3ui + GLenum type + GLuint coords + + + void glTexCoordP3uiv + GLenum type + const GLuint *coords + + + void glTexCoordP4ui + GLenum type + GLuint coords + + + void glTexCoordP4uiv + GLenum type + const GLuint *coords + + + void glTexCoordPointer + GLint size + GLenum type + GLsizei stride + const void *pointer + + + void glTexCoordPointerEXT + GLint size + GLenum type + GLsizei stride + GLsizei count + const void *pointer + + + void glTexCoordPointerListIBM + GLint size + GLenum type + GLint stride + const void **pointer + GLint ptrstride + + + void glTexCoordPointervINTEL + GLint size + GLenum type + const void **pointer + + + void glTexEnvf + GLenum target + GLenum pname + GLfloat param + + + + void glTexEnvfv + GLenum target + GLenum pname + const GLfloat *params + + + + void glTexEnvi + GLenum target + GLenum pname + GLint param + + + + void glTexEnviv + GLenum target + GLenum pname + const GLint *params + + + + void glTexEnvx + GLenum target + GLenum pname + GLfixed param + + + void glTexEnvxOES + GLenum target + GLenum pname + GLfixed param + + + void glTexEnvxv + GLenum target + GLenum pname + const GLfixed *params + + + void glTexEnvxvOES + GLenum target + GLenum pname + const GLfixed *params + + + void glTexFilterFuncSGIS + GLenum target + GLenum filter + GLsizei n + const GLfloat *weights + + + + void glTexGend + GLenum coord + GLenum pname + GLdouble param + + + + void glTexGendv + GLenum coord + GLenum pname + const GLdouble *params + + + + void glTexGenf + GLenum coord + GLenum pname + GLfloat param + + + + void glTexGenfOES + GLenum coord + GLenum pname + GLfloat param + + + void glTexGenfv + GLenum coord + GLenum pname + const GLfloat *params + + + + void glTexGenfvOES + GLenum coord + GLenum pname + const GLfloat *params + + + void glTexGeni + GLenum coord + GLenum pname + GLint param + + + + void glTexGeniOES + GLenum coord + GLenum pname + GLint param + + + void glTexGeniv + GLenum coord + GLenum pname + const GLint *params + + + + void glTexGenivOES + GLenum coord + GLenum pname + const GLint *params + + + void glTexGenxOES + GLenum coord + GLenum pname + GLfixed param + + + void glTexGenxvOES + GLenum coord + GLenum pname + const GLfixed *params + + + void glTexImage1D + GLenum target + GLint level + GLint internalformat + GLsizei width + GLint border + GLenum format + GLenum type + const void *pixels + + + + + void glTexImage2D + GLenum target + GLint level + GLint internalformat + GLsizei width + GLsizei height + GLint border + GLenum format + GLenum type + const void *pixels + + + + + void glTexImage2DMultisample + GLenum target + GLsizei samples + GLenum internalformat + GLsizei width + GLsizei height + GLboolean fixedsamplelocations + + + void glTexImage2DMultisampleCoverageNV + GLenum target + GLsizei coverageSamples + GLsizei colorSamples + GLint internalFormat + GLsizei width + GLsizei height + GLboolean fixedSampleLocations + + + void glTexImage3D + GLenum target + GLint level + GLint internalformat + GLsizei width + GLsizei height + GLsizei depth + GLint border + GLenum format + GLenum type + const void *pixels + + + + + void glTexImage3DEXT + GLenum target + GLint level + GLenum internalformat + GLsizei width + GLsizei height + GLsizei depth + GLint border + GLenum format + GLenum type + const void *pixels + + + + + void glTexImage3DMultisample + GLenum target + GLsizei samples + GLenum internalformat + GLsizei width + GLsizei height + GLsizei depth + GLboolean fixedsamplelocations + + + void glTexImage3DMultisampleCoverageNV + GLenum target + GLsizei coverageSamples + GLsizei colorSamples + GLint internalFormat + GLsizei width + GLsizei height + GLsizei depth + GLboolean fixedSampleLocations + + + void glTexImage3DOES + GLenum target + GLint level + GLenum internalformat + GLsizei width + GLsizei height + GLsizei depth + GLint border + GLenum format + GLenum type + const void *pixels + + + void glTexImage4DSGIS + GLenum target + GLint level + GLenum internalformat + GLsizei width + GLsizei height + GLsizei depth + GLsizei size4d + GLint border + GLenum format + GLenum type + const void *pixels + + + + void glTexPageCommitmentARB + GLenum target + GLint level + GLint xoffset + GLint yoffset + GLint zoffset + GLsizei width + GLsizei height + GLsizei depth + GLboolean commit + + + void glTexPageCommitmentEXT + GLenum target + GLint level + GLint xoffset + GLint yoffset + GLint zoffset + GLsizei width + GLsizei height + GLsizei depth + GLboolean commit + + + + void glTexParameterIiv + GLenum target + GLenum pname + const GLint *params + + + + void glTexParameterIivEXT + GLenum target + GLenum pname + const GLint *params + + + + void glTexParameterIivOES + GLenum target + GLenum pname + const GLint *params + + + + void glTexParameterIuiv + GLenum target + GLenum pname + const GLuint *params + + + + void glTexParameterIuivEXT + GLenum target + GLenum pname + const GLuint *params + + + + void glTexParameterIuivOES + GLenum target + GLenum pname + const GLuint *params + + + + void glTexParameterf + GLenum target + GLenum pname + GLfloat param + + + + void glTexParameterfv + GLenum target + GLenum pname + const GLfloat *params + + + + void glTexParameteri + GLenum target + GLenum pname + GLint param + + + + void glTexParameteriv + GLenum target + GLenum pname + const GLint *params + + + + void glTexParameterx + GLenum target + GLenum pname + GLfixed param + + + void glTexParameterxOES + GLenum target + GLenum pname + GLfixed param + + + void glTexParameterxv + GLenum target + GLenum pname + const GLfixed *params + + + void glTexParameterxvOES + GLenum target + GLenum pname + const GLfixed *params + + + void glTexRenderbufferNV + GLenum target + GLuint renderbuffer + + + void glTexStorage1D + GLenum target + GLsizei levels + GLenum internalformat + GLsizei width + + + void glTexStorage1DEXT + GLenum target + GLsizei levels + GLenum internalformat + GLsizei width + + + + void glTexStorage2D + GLenum target + GLsizei levels + GLenum internalformat + GLsizei width + GLsizei height + + + void glTexStorage2DEXT + GLenum target + GLsizei levels + GLenum internalformat + GLsizei width + GLsizei height + + + + void glTexStorage2DMultisample + GLenum target + GLsizei samples + GLenum internalformat + GLsizei width + GLsizei height + GLboolean fixedsamplelocations + + + void glTexStorage3D + GLenum target + GLsizei levels + GLenum internalformat + GLsizei width + GLsizei height + GLsizei depth + + + void glTexStorage3DEXT + GLenum target + GLsizei levels + GLenum internalformat + GLsizei width + GLsizei height + GLsizei depth + + + + void glTexStorage3DMultisample + GLenum target + GLsizei samples + GLenum internalformat + GLsizei width + GLsizei height + GLsizei depth + GLboolean fixedsamplelocations + + + void glTexStorage3DMultisampleOES + GLenum target + GLsizei samples + GLenum internalformat + GLsizei width + GLsizei height + GLsizei depth + GLboolean fixedsamplelocations + + + + void glTexStorageMem1DEXT + GLenum target + GLsizei levels + GLenum internalFormat + GLsizei width + GLuint memory + GLuint64 offset + + + void glTexStorageMem2DEXT + GLenum target + GLsizei levels + GLenum internalFormat + GLsizei width + GLsizei height + GLuint memory + GLuint64 offset + + + void glTexStorageMem2DMultisampleEXT + GLenum target + GLsizei samples + GLenum internalFormat + GLsizei width + GLsizei height + GLboolean fixedSampleLocations + GLuint memory + GLuint64 offset + + + void glTexStorageMem3DEXT + GLenum target + GLsizei levels + GLenum internalFormat + GLsizei width + GLsizei height + GLsizei depth + GLuint memory + GLuint64 offset + + + void glTexStorageMem3DMultisampleEXT + GLenum target + GLsizei samples + GLenum internalFormat + GLsizei width + GLsizei height + GLsizei depth + GLboolean fixedSampleLocations + GLuint memory + GLuint64 offset + + + void glTexStorageSparseAMD + GLenum target + GLenum internalFormat + GLsizei width + GLsizei height + GLsizei depth + GLboolean fixedSampleLocations + GLuint memory + GLuint64 offset + + + void glTexStorageSparseAMD + GLenum target + GLenum internalFormat + GLsizei width + GLsizei height + GLsizei depth + GLsizei layers + GLbitfield flags + + + void glTexSubImage1D + GLenum target + GLint level + GLint xoffset + GLsizei width + GLenum format + GLenum type + const void *pixels + + + + + void glTexSubImage1DEXT + GLenum target + GLint level + GLint xoffset + GLsizei width + GLenum format + GLenum type + const void *pixels + + + + + void glTexSubImage2D + GLenum target + GLint level + GLint xoffset + GLint yoffset + GLsizei width + GLsizei height + GLenum format + GLenum type + const void *pixels + + + + + void glTexSubImage2DEXT + GLenum target + GLint level + GLint xoffset + GLint yoffset + GLsizei width + GLsizei height + GLenum format + GLenum type + const void *pixels + + + + + void glTexSubImage3D + GLenum target + GLint level + GLint xoffset + GLint yoffset + GLint zoffset + GLsizei width + GLsizei height + GLsizei depth + GLenum format + GLenum type + const void *pixels + + + + + void glTexSubImage3DEXT + GLenum target + GLint level + GLint xoffset + GLint yoffset + GLint zoffset + GLsizei width + GLsizei height + GLsizei depth + GLenum format + GLenum type + const void *pixels + + + + + void glTexSubImage3DOES + GLenum target + GLint level + GLint xoffset + GLint yoffset + GLint zoffset + GLsizei width + GLsizei height + GLsizei depth + GLenum format + GLenum type + const void *pixels + + + void glTexSubImage4DSGIS + GLenum target + GLint level + GLint xoffset + GLint yoffset + GLint zoffset + GLint woffset + GLsizei width + GLsizei height + GLsizei depth + GLsizei size4d + GLenum format + GLenum type + const void *pixels + + + + void glTextureAttachMemoryNV + GLuint texture + GLuint memory + GLuint64 offset + + + void glTextureBarrier + + + void glTextureBarrierNV + + + + void glTextureBuffer + GLuint texture + GLenum internalformat + GLuint buffer + + + void glTextureBufferEXT + GLuint texture + GLenum target + GLenum internalformat + GLuint buffer + + + void glTextureBufferRange + GLuint texture + GLenum internalformat + GLuint buffer + GLintptr offset + GLsizeiptr size + + + void glTextureBufferRangeEXT + GLuint texture + GLenum target + GLenum internalformat + GLuint buffer + GLintptr offset + GLsizeiptr size + + + void glTextureColorMaskSGIS + GLboolean red + GLboolean green + GLboolean blue + GLboolean alpha + + + + void glTextureFoveationParametersQCOM + GLuint texture + GLuint layer + GLuint focalPoint + GLfloat focalX + GLfloat focalY + GLfloat gainX + GLfloat gainY + GLfloat foveaArea + + + void glTextureImage1DEXT + GLuint texture + GLenum target + GLint level + GLint internalformat + GLsizei width + GLint border + GLenum format + GLenum type + const void *pixels + + + void glTextureImage2DEXT + GLuint texture + GLenum target + GLint level + GLint internalformat + GLsizei width + GLsizei height + GLint border + GLenum format + GLenum type + const void *pixels + + + void glTextureImage2DMultisampleCoverageNV + GLuint texture + GLenum target + GLsizei coverageSamples + GLsizei colorSamples + GLint internalFormat + GLsizei width + GLsizei height + GLboolean fixedSampleLocations + + + void glTextureImage2DMultisampleNV + GLuint texture + GLenum target + GLsizei samples + GLint internalFormat + GLsizei width + GLsizei height + GLboolean fixedSampleLocations + + + void glTextureImage3DEXT + GLuint texture + GLenum target + GLint level + GLint internalformat + GLsizei width + GLsizei height + GLsizei depth + GLint border + GLenum format + GLenum type + const void *pixels + + + void glTextureImage3DMultisampleCoverageNV + GLuint texture + GLenum target + GLsizei coverageSamples + GLsizei colorSamples + GLint internalFormat + GLsizei width + GLsizei height + GLsizei depth + GLboolean fixedSampleLocations + + + void glTextureImage3DMultisampleNV + GLuint texture + GLenum target + GLsizei samples + GLint internalFormat + GLsizei width + GLsizei height + GLsizei depth + GLboolean fixedSampleLocations + + + void glTextureLightEXT + GLenum pname + + + void glTextureMaterialEXT + GLenum face + GLenum mode + + + void glTextureNormalEXT + GLenum mode + + + void glTexturePageCommitmentEXT + GLuint texture + GLint level + GLint xoffset + GLint yoffset + GLint zoffset + GLsizei width + GLsizei height + GLsizei depth + GLboolean commit + + + void glTextureParameterIiv + GLuint texture + GLenum pname + const GLint *params + + + void glTextureParameterIivEXT + GLuint texture + GLenum target + GLenum pname + const GLint *params + + + void glTextureParameterIuiv + GLuint texture + GLenum pname + const GLuint *params + + + void glTextureParameterIuivEXT + GLuint texture + GLenum target + GLenum pname + const GLuint *params + + + void glTextureParameterf + GLuint texture + GLenum pname + GLfloat param + + + void glTextureParameterfEXT + GLuint texture + GLenum target + GLenum pname + GLfloat param + + + + void glTextureParameterfv + GLuint texture + GLenum pname + const GLfloat *param + + + void glTextureParameterfvEXT + GLuint texture + GLenum target + GLenum pname + const GLfloat *params + + + void glTextureParameteri + GLuint texture + GLenum pname + GLint param + + + void glTextureParameteriEXT + GLuint texture + GLenum target + GLenum pname + GLint param + + + + void glTextureParameteriv + GLuint texture + GLenum pname + const GLint *param + + + void glTextureParameterivEXT + GLuint texture + GLenum target + GLenum pname + const GLint *params + + + void glTextureRangeAPPLE + GLenum target + GLsizei length + const void *pointer + + + void glTextureRenderbufferEXT + GLuint texture + GLenum target + GLuint renderbuffer + + + void glTextureStorage1D + GLuint texture + GLsizei levels + GLenum internalformat + GLsizei width + + + void glTextureStorage1DEXT + GLuint texture + GLenum target + GLsizei levels + GLenum internalformat + GLsizei width + + + void glTextureStorage2D + GLuint texture + GLsizei levels + GLenum internalformat + GLsizei width + GLsizei height + + + void glTextureStorage2DEXT + GLuint texture + GLenum target + GLsizei levels + GLenum internalformat + GLsizei width + GLsizei height + + + void glTextureStorage2DMultisample + GLuint texture + GLsizei samples + GLenum internalformat + GLsizei width + GLsizei height + GLboolean fixedsamplelocations + + + void glTextureStorage2DMultisampleEXT + GLuint texture + GLenum target + GLsizei samples + GLenum internalformat + GLsizei width + GLsizei height + GLboolean fixedsamplelocations + + + void glTextureStorage3D + GLuint texture + GLsizei levels + GLenum internalformat + GLsizei width + GLsizei height + GLsizei depth + + + void glTextureStorage3DEXT + GLuint texture + GLenum target + GLsizei levels + GLenum internalformat + GLsizei width + GLsizei height + GLsizei depth + + + void glTextureStorage3DMultisample + GLuint texture + GLsizei samples + GLenum internalformat + GLsizei width + GLsizei height + GLsizei depth + GLboolean fixedsamplelocations + + + void glTextureStorage3DMultisampleEXT + GLuint texture + GLenum target + GLsizei samples + GLenum internalformat + GLsizei width + GLsizei height + GLsizei depth + GLboolean fixedsamplelocations + + + void glTextureStorageMem1DEXT + GLuint texture + GLsizei levels + GLenum internalFormat + GLsizei width + GLuint memory + GLuint64 offset + + + void glTextureStorageMem2DEXT + GLuint texture + GLsizei levels + GLenum internalFormat + GLsizei width + GLsizei height + GLuint memory + GLuint64 offset + + + void glTextureStorageMem2DMultisampleEXT + GLuint texture + GLsizei samples + GLenum internalFormat + GLsizei width + GLsizei height + GLboolean fixedSampleLocations + GLuint memory + GLuint64 offset + + + void glTextureStorageMem3DEXT + GLuint texture + GLsizei levels + GLenum internalFormat + GLsizei width + GLsizei height + GLsizei depth + GLuint memory + GLuint64 offset + + + void glTextureStorageMem3DMultisampleEXT + GLuint texture + GLsizei samples + GLenum internalFormat + GLsizei width + GLsizei height + GLsizei depth + GLboolean fixedSampleLocations + GLuint memory + GLuint64 offset + + + void glTextureStorageSparseAMD + GLuint texture + GLenum target + GLenum internalFormat + GLsizei width + GLsizei height + GLsizei depth + GLsizei layers + GLbitfield flags + + + void glTextureSubImage1D + GLuint texture + GLint level + GLint xoffset + GLsizei width + GLenum format + GLenum type + const void *pixels + + + void glTextureSubImage1DEXT + GLuint texture + GLenum target + GLint level + GLint xoffset + GLsizei width + GLenum format + GLenum type + const void *pixels + + + void glTextureSubImage2D + GLuint texture + GLint level + GLint xoffset + GLint yoffset + GLsizei width + GLsizei height + GLenum format + GLenum type + const void *pixels + + + void glTextureSubImage2DEXT + GLuint texture + GLenum target + GLint level + GLint xoffset + GLint yoffset + GLsizei width + GLsizei height + GLenum format + GLenum type + const void *pixels + + + void glTextureSubImage3D + GLuint texture + GLint level + GLint xoffset + GLint yoffset + GLint zoffset + GLsizei width + GLsizei height + GLsizei depth + GLenum format + GLenum type + const void *pixels + + + void glTextureSubImage3DEXT + GLuint texture + GLenum target + GLint level + GLint xoffset + GLint yoffset + GLint zoffset + GLsizei width + GLsizei height + GLsizei depth + GLenum format + GLenum type + const void *pixels + + + void glTextureView + GLuint texture + GLenum target + GLuint origtexture + GLenum internalformat + GLuint minlevel + GLuint numlevels + GLuint minlayer + GLuint numlayers + + + void glTextureViewEXT + GLuint texture + GLenum target + GLuint origtexture + GLenum internalformat + GLuint minlevel + GLuint numlevels + GLuint minlayer + GLuint numlayers + + + + void glTextureViewOES + GLuint texture + GLenum target + GLuint origtexture + GLenum internalformat + GLuint minlevel + GLuint numlevels + GLuint minlayer + GLuint numlayers + + + + void glTrackMatrixNV + GLenum target + GLuint address + GLenum matrix + GLenum transform + + + + void glTransformFeedbackAttribsNV + GLsizei count + const GLint *attribs + GLenum bufferMode + + + void glTransformFeedbackBufferBase + GLuint xfb + GLuint index + GLuint buffer + + + void glTransformFeedbackBufferRange + GLuint xfb + GLuint index + GLuint buffer + GLintptr offset + GLsizeiptr size + + + void glTransformFeedbackStreamAttribsNV + GLsizei count + const GLint *attribs + GLsizei nbuffers + const GLint *bufstreams + GLenum bufferMode + + + void glTransformFeedbackVaryings + GLuint program + GLsizei count + const GLchar *const*varyings + GLenum bufferMode + + + + void glTransformFeedbackVaryingsEXT + GLuint program + GLsizei count + const GLchar *const*varyings + GLenum bufferMode + + + + void glTransformFeedbackVaryingsNV + GLuint program + GLsizei count + const GLint *locations + GLenum bufferMode + + + void glTransformPathNV + GLuint resultPath + GLuint srcPath + GLenum transformType + const GLfloat *transformValues + + + void glTranslated + GLdouble x + GLdouble y + GLdouble z + + + + void glTranslatef + GLfloat x + GLfloat y + GLfloat z + + + + void glTranslatex + GLfixed x + GLfixed y + GLfixed z + + + void glTranslatexOES + GLfixed x + GLfixed y + GLfixed z + + + void glUniform1d + GLint location + GLdouble x + + + void glUniform1dv + GLint location + GLsizei count + const GLdouble *value + + + void glUniform1f + GLint location + GLfloat v0 + + + void glUniform1fARB + GLint location + GLfloat v0 + + + + void glUniform1fv + GLint location + GLsizei count + const GLfloat *value + + + void glUniform1fvARB + GLint location + GLsizei count + const GLfloat *value + + + + void glUniform1i + GLint location + GLint v0 + + + void glUniform1i64ARB + GLint location + GLint64 x + + + void glUniform1i64NV + GLint location + GLint64EXT x + + + void glUniform1i64vARB + GLint location + GLsizei count + const GLint64 *value + + + void glUniform1i64vNV + GLint location + GLsizei count + const GLint64EXT *value + + + void glUniform1iARB + GLint location + GLint v0 + + + + void glUniform1iv + GLint location + GLsizei count + const GLint *value + + + void glUniform1ivARB + GLint location + GLsizei count + const GLint *value + + + + void glUniform1ui + GLint location + GLuint v0 + + + void glUniform1ui64ARB + GLint location + GLuint64 x + + + void glUniform1ui64NV + GLint location + GLuint64EXT x + + + void glUniform1ui64vARB + GLint location + GLsizei count + const GLuint64 *value + + + void glUniform1ui64vNV + GLint location + GLsizei count + const GLuint64EXT *value + + + void glUniform1uiEXT + GLint location + GLuint v0 + + + + void glUniform1uiv + GLint location + GLsizei count + const GLuint *value + + + void glUniform1uivEXT + GLint location + GLsizei count + const GLuint *value + + + + void glUniform2d + GLint location + GLdouble x + GLdouble y + + + void glUniform2dv + GLint location + GLsizei count + const GLdouble *value + + + void glUniform2f + GLint location + GLfloat v0 + GLfloat v1 + + + void glUniform2fARB + GLint location + GLfloat v0 + GLfloat v1 + + + + void glUniform2fv + GLint location + GLsizei count + const GLfloat *value + + + void glUniform2fvARB + GLint location + GLsizei count + const GLfloat *value + + + + void glUniform2i + GLint location + GLint v0 + GLint v1 + + + void glUniform2i64ARB + GLint location + GLint64 x + GLint64 y + + + void glUniform2i64NV + GLint location + GLint64EXT x + GLint64EXT y + + + void glUniform2i64vARB + GLint location + GLsizei count + const GLint64 *value + + + void glUniform2i64vNV + GLint location + GLsizei count + const GLint64EXT *value + + + void glUniform2iARB + GLint location + GLint v0 + GLint v1 + + + + void glUniform2iv + GLint location + GLsizei count + const GLint *value + + + void glUniform2ivARB + GLint location + GLsizei count + const GLint *value + + + + void glUniform2ui + GLint location + GLuint v0 + GLuint v1 + + + void glUniform2ui64ARB + GLint location + GLuint64 x + GLuint64 y + + + void glUniform2ui64NV + GLint location + GLuint64EXT x + GLuint64EXT y + + + void glUniform2ui64vARB + GLint location + GLsizei count + const GLuint64 *value + + + void glUniform2ui64vNV + GLint location + GLsizei count + const GLuint64EXT *value + + + void glUniform2uiEXT + GLint location + GLuint v0 + GLuint v1 + + + + void glUniform2uiv + GLint location + GLsizei count + const GLuint *value + + + void glUniform2uivEXT + GLint location + GLsizei count + const GLuint *value + + + + void glUniform3d + GLint location + GLdouble x + GLdouble y + GLdouble z + + + void glUniform3dv + GLint location + GLsizei count + const GLdouble *value + + + void glUniform3f + GLint location + GLfloat v0 + GLfloat v1 + GLfloat v2 + + + void glUniform3fARB + GLint location + GLfloat v0 + GLfloat v1 + GLfloat v2 + + + + void glUniform3fv + GLint location + GLsizei count + const GLfloat *value + + + void glUniform3fvARB + GLint location + GLsizei count + const GLfloat *value + + + + void glUniform3i + GLint location + GLint v0 + GLint v1 + GLint v2 + + + void glUniform3i64ARB + GLint location + GLint64 x + GLint64 y + GLint64 z + + + void glUniform3i64NV + GLint location + GLint64EXT x + GLint64EXT y + GLint64EXT z + + + void glUniform3i64vARB + GLint location + GLsizei count + const GLint64 *value + + + void glUniform3i64vNV + GLint location + GLsizei count + const GLint64EXT *value + + + void glUniform3iARB + GLint location + GLint v0 + GLint v1 + GLint v2 + + + + void glUniform3iv + GLint location + GLsizei count + const GLint *value + + + void glUniform3ivARB + GLint location + GLsizei count + const GLint *value + + + + void glUniform3ui + GLint location + GLuint v0 + GLuint v1 + GLuint v2 + + + void glUniform3ui64ARB + GLint location + GLuint64 x + GLuint64 y + GLuint64 z + + + void glUniform3ui64NV + GLint location + GLuint64EXT x + GLuint64EXT y + GLuint64EXT z + + + void glUniform3ui64vARB + GLint location + GLsizei count + const GLuint64 *value + + + void glUniform3ui64vNV + GLint location + GLsizei count + const GLuint64EXT *value + + + void glUniform3uiEXT + GLint location + GLuint v0 + GLuint v1 + GLuint v2 + + + + void glUniform3uiv + GLint location + GLsizei count + const GLuint *value + + + void glUniform3uivEXT + GLint location + GLsizei count + const GLuint *value + + + + void glUniform4d + GLint location + GLdouble x + GLdouble y + GLdouble z + GLdouble w + + + void glUniform4dv + GLint location + GLsizei count + const GLdouble *value + + + void glUniform4f + GLint location + GLfloat v0 + GLfloat v1 + GLfloat v2 + GLfloat v3 + + + void glUniform4fARB + GLint location + GLfloat v0 + GLfloat v1 + GLfloat v2 + GLfloat v3 + + + + void glUniform4fv + GLint location + GLsizei count + const GLfloat *value + + + void glUniform4fvARB + GLint location + GLsizei count + const GLfloat *value + + + + void glUniform4i + GLint location + GLint v0 + GLint v1 + GLint v2 + GLint v3 + + + void glUniform4i64ARB + GLint location + GLint64 x + GLint64 y + GLint64 z + GLint64 w + + + void glUniform4i64NV + GLint location + GLint64EXT x + GLint64EXT y + GLint64EXT z + GLint64EXT w + + + void glUniform4i64vARB + GLint location + GLsizei count + const GLint64 *value + + + void glUniform4i64vNV + GLint location + GLsizei count + const GLint64EXT *value + + + void glUniform4iARB + GLint location + GLint v0 + GLint v1 + GLint v2 + GLint v3 + + + + void glUniform4iv + GLint location + GLsizei count + const GLint *value + + + void glUniform4ivARB + GLint location + GLsizei count + const GLint *value + + + + void glUniform4ui + GLint location + GLuint v0 + GLuint v1 + GLuint v2 + GLuint v3 + + + void glUniform4ui64ARB + GLint location + GLuint64 x + GLuint64 y + GLuint64 z + GLuint64 w + + + void glUniform4ui64NV + GLint location + GLuint64EXT x + GLuint64EXT y + GLuint64EXT z + GLuint64EXT w + + + void glUniform4ui64vARB + GLint location + GLsizei count + const GLuint64 *value + + + void glUniform4ui64vNV + GLint location + GLsizei count + const GLuint64EXT *value + + + void glUniform4uiEXT + GLint location + GLuint v0 + GLuint v1 + GLuint v2 + GLuint v3 + + + + void glUniform4uiv + GLint location + GLsizei count + const GLuint *value + + + void glUniform4uivEXT + GLint location + GLsizei count + const GLuint *value + + + + void glUniformBlockBinding + GLuint program + GLuint uniformBlockIndex + GLuint uniformBlockBinding + + + + void glUniformBufferEXT + GLuint program + GLint location + GLuint buffer + + + void glUniformHandleui64ARB + GLint location + GLuint64 value + + + void glUniformHandleui64IMG + GLint location + GLuint64 value + + + + void glUniformHandleui64NV + GLint location + GLuint64 value + + + void glUniformHandleui64vARB + GLint location + GLsizei count + const GLuint64 *value + + + void glUniformHandleui64vIMG + GLint location + GLsizei count + const GLuint64 *value + + + + void glUniformHandleui64vNV + GLint location + GLsizei count + const GLuint64 *value + + + void glUniformMatrix2dv + GLint location + GLsizei count + GLboolean transpose + const GLdouble *value + + + void glUniformMatrix2fv + GLint location + GLsizei count + GLboolean transpose + const GLfloat *value + + + void glUniformMatrix2fvARB + GLint location + GLsizei count + GLboolean transpose + const GLfloat *value + + + + void glUniformMatrix2x3dv + GLint location + GLsizei count + GLboolean transpose + const GLdouble *value + + + void glUniformMatrix2x3fv + GLint location + GLsizei count + GLboolean transpose + const GLfloat *value + + + + void glUniformMatrix2x3fvNV + GLint location + GLsizei count + GLboolean transpose + const GLfloat *value + + + + void glUniformMatrix2x4dv + GLint location + GLsizei count + GLboolean transpose + const GLdouble *value + + + void glUniformMatrix2x4fv + GLint location + GLsizei count + GLboolean transpose + const GLfloat *value + + + + void glUniformMatrix2x4fvNV + GLint location + GLsizei count + GLboolean transpose + const GLfloat *value + + + + void glUniformMatrix3dv + GLint location + GLsizei count + GLboolean transpose + const GLdouble *value + + + void glUniformMatrix3fv + GLint location + GLsizei count + GLboolean transpose + const GLfloat *value + + + void glUniformMatrix3fvARB + GLint location + GLsizei count + GLboolean transpose + const GLfloat *value + + + + void glUniformMatrix3x2dv + GLint location + GLsizei count + GLboolean transpose + const GLdouble *value + + + void glUniformMatrix3x2fv + GLint location + GLsizei count + GLboolean transpose + const GLfloat *value + + + + void glUniformMatrix3x2fvNV + GLint location + GLsizei count + GLboolean transpose + const GLfloat *value + + + + void glUniformMatrix3x4dv + GLint location + GLsizei count + GLboolean transpose + const GLdouble *value + + + void glUniformMatrix3x4fv + GLint location + GLsizei count + GLboolean transpose + const GLfloat *value + + + + void glUniformMatrix3x4fvNV + GLint location + GLsizei count + GLboolean transpose + const GLfloat *value + + + + void glUniformMatrix4dv + GLint location + GLsizei count + GLboolean transpose + const GLdouble *value + + + void glUniformMatrix4fv + GLint location + GLsizei count + GLboolean transpose + const GLfloat *value + + + void glUniformMatrix4fvARB + GLint location + GLsizei count + GLboolean transpose + const GLfloat *value + + + + void glUniformMatrix4x2dv + GLint location + GLsizei count + GLboolean transpose + const GLdouble *value + + + void glUniformMatrix4x2fv + GLint location + GLsizei count + GLboolean transpose + const GLfloat *value + + + + void glUniformMatrix4x2fvNV + GLint location + GLsizei count + GLboolean transpose + const GLfloat *value + + + + void glUniformMatrix4x3dv + GLint location + GLsizei count + GLboolean transpose + const GLdouble *value + + + void glUniformMatrix4x3fv + GLint location + GLsizei count + GLboolean transpose + const GLfloat *value + + + + void glUniformMatrix4x3fvNV + GLint location + GLsizei count + GLboolean transpose + const GLfloat *value + + + + void glUniformSubroutinesuiv + GLenum shadertype + GLsizei count + const GLuint *indices + + + void glUniformui64NV + GLint location + GLuint64EXT value + + + void glUniformui64vNV + GLint location + GLsizei count + const GLuint64EXT *value + + + void glUnlockArraysEXT + + + GLboolean glUnmapBuffer + GLenum target + + + GLboolean glUnmapBufferARB + GLenum target + + + + GLboolean glUnmapBufferOES + GLenum target + + + + GLboolean glUnmapNamedBuffer + GLuint buffer + + + GLboolean glUnmapNamedBufferEXT + GLuint buffer + + + void glUnmapObjectBufferATI + GLuint buffer + + + void glUnmapTexture2DINTEL + GLuint texture + GLint level + + + void glUpdateObjectBufferATI + GLuint buffer + GLuint offset + GLsizei size + const void *pointer + GLenum preserve + + + void glUploadGpuMaskNVX + GLbitfield mask + + + void glUseProgram + GLuint program + + + void glUseProgramObjectARB + GLhandleARB programObj + + + + void glUseProgramStages + GLuint pipeline + GLbitfield stages + GLuint program + + + void glUseProgramStagesEXT + GLuint pipeline + GLbitfield stages + GLuint program + + + void glUseShaderProgramEXT + GLenum type + GLuint program + + + void glVDPAUFiniNV + + + void glVDPAUGetSurfaceivNV + GLvdpauSurfaceNV surface + GLenum pname + GLsizei bufSize + GLsizei *length + GLint *values + + + void glVDPAUInitNV + const void *vdpDevice + const void *getProcAddress + + + GLboolean glVDPAUIsSurfaceNV + GLvdpauSurfaceNV surface + + + void glVDPAUMapSurfacesNV + GLsizei numSurfaces + const GLvdpauSurfaceNV *surfaces + + + GLvdpauSurfaceNV glVDPAURegisterOutputSurfaceNV + const void *vdpSurface + GLenum target + GLsizei numTextureNames + const GLuint *textureNames + + + GLvdpauSurfaceNV glVDPAURegisterVideoSurfaceNV + const void *vdpSurface + GLenum target + GLsizei numTextureNames + const GLuint *textureNames + + + GLvdpauSurfaceNV glVDPAURegisterVideoSurfaceWithPictureStructureNV + const void *vdpSurface + GLenum target + GLsizei numTextureNames + const GLuint *textureNames + GLboolean isFrameStructure + + + void glVDPAUSurfaceAccessNV + GLvdpauSurfaceNV surface + GLenum access + + + void glVDPAUUnmapSurfacesNV + GLsizei numSurface + const GLvdpauSurfaceNV *surfaces + + + void glVDPAUUnregisterSurfaceNV + GLvdpauSurfaceNV surface + + + void glValidateProgram + GLuint program + + + void glValidateProgramARB + GLhandleARB programObj + + + + void glValidateProgramPipeline + GLuint pipeline + + + void glValidateProgramPipelineEXT + GLuint pipeline + + + void glVariantArrayObjectATI + GLuint id + GLenum type + GLsizei stride + GLuint buffer + GLuint offset + + + void glVariantPointerEXT + GLuint id + GLenum type + GLuint stride + const void *addr + + + void glVariantbvEXT + GLuint id + const GLbyte *addr + + + void glVariantdvEXT + GLuint id + const GLdouble *addr + + + void glVariantfvEXT + GLuint id + const GLfloat *addr + + + void glVariantivEXT + GLuint id + const GLint *addr + + + void glVariantsvEXT + GLuint id + const GLshort *addr + + + void glVariantubvEXT + GLuint id + const GLubyte *addr + + + void glVariantuivEXT + GLuint id + const GLuint *addr + + + void glVariantusvEXT + GLuint id + const GLushort *addr + + + void glVertex2bOES + GLbyte x + GLbyte y + + + void glVertex2bvOES + const GLbyte *coords + + + void glVertex2d + GLdouble x + GLdouble y + + + + void glVertex2dv + const GLdouble *v + + + + void glVertex2f + GLfloat x + GLfloat y + + + + void glVertex2fv + const GLfloat *v + + + + void glVertex2hNV + GLhalfNV x + GLhalfNV y + + + + void glVertex2hvNV + const GLhalfNV *v + + + + void glVertex2i + GLint x + GLint y + + + + void glVertex2iv + const GLint *v + + + + void glVertex2s + GLshort x + GLshort y + + + + void glVertex2sv + const GLshort *v + + + + void glVertex2xOES + GLfixed x + + + void glVertex2xvOES + const GLfixed *coords + + + void glVertex3bOES + GLbyte x + GLbyte y + GLbyte z + + + void glVertex3bvOES + const GLbyte *coords + + + void glVertex3d + GLdouble x + GLdouble y + GLdouble z + + + + void glVertex3dv + const GLdouble *v + + + + void glVertex3f + GLfloat x + GLfloat y + GLfloat z + + + + void glVertex3fv + const GLfloat *v + + + + void glVertex3hNV + GLhalfNV x + GLhalfNV y + GLhalfNV z + + + + void glVertex3hvNV + const GLhalfNV *v + + + + void glVertex3i + GLint x + GLint y + GLint z + + + + void glVertex3iv + const GLint *v + + + + void glVertex3s + GLshort x + GLshort y + GLshort z + + + + void glVertex3sv + const GLshort *v + + + + void glVertex3xOES + GLfixed x + GLfixed y + + + void glVertex3xvOES + const GLfixed *coords + + + void glVertex4bOES + GLbyte x + GLbyte y + GLbyte z + GLbyte w + + + void glVertex4bvOES + const GLbyte *coords + + + void glVertex4d + GLdouble x + GLdouble y + GLdouble z + GLdouble w + + + + void glVertex4dv + const GLdouble *v + + + + void glVertex4f + GLfloat x + GLfloat y + GLfloat z + GLfloat w + + + + void glVertex4fv + const GLfloat *v + + + + void glVertex4hNV + GLhalfNV x + GLhalfNV y + GLhalfNV z + GLhalfNV w + + + + void glVertex4hvNV + const GLhalfNV *v + + + + void glVertex4i + GLint x + GLint y + GLint z + GLint w + + + + void glVertex4iv + const GLint *v + + + + void glVertex4s + GLshort x + GLshort y + GLshort z + GLshort w + + + + void glVertex4sv + const GLshort *v + + + + void glVertex4xOES + GLfixed x + GLfixed y + GLfixed z + + + void glVertex4xvOES + const GLfixed *coords + + + void glVertexArrayAttribBinding + GLuint vaobj + GLuint attribindex + GLuint bindingindex + + + void glVertexArrayAttribFormat + GLuint vaobj + GLuint attribindex + GLint size + GLenum type + GLboolean normalized + GLuint relativeoffset + + + void glVertexArrayAttribIFormat + GLuint vaobj + GLuint attribindex + GLint size + GLenum type + GLuint relativeoffset + + + void glVertexArrayAttribLFormat + GLuint vaobj + GLuint attribindex + GLint size + GLenum type + GLuint relativeoffset + + + void glVertexArrayBindVertexBufferEXT + GLuint vaobj + GLuint bindingindex + GLuint buffer + GLintptr offset + GLsizei stride + + + void glVertexArrayBindingDivisor + GLuint vaobj + GLuint bindingindex + GLuint divisor + + + void glVertexArrayColorOffsetEXT + GLuint vaobj + GLuint buffer + GLint size + GLenum type + GLsizei stride + GLintptr offset + + + void glVertexArrayEdgeFlagOffsetEXT + GLuint vaobj + GLuint buffer + GLsizei stride + GLintptr offset + + + void glVertexArrayElementBuffer + GLuint vaobj + GLuint buffer + + + void glVertexArrayFogCoordOffsetEXT + GLuint vaobj + GLuint buffer + GLenum type + GLsizei stride + GLintptr offset + + + void glVertexArrayIndexOffsetEXT + GLuint vaobj + GLuint buffer + GLenum type + GLsizei stride + GLintptr offset + + + void glVertexArrayMultiTexCoordOffsetEXT + GLuint vaobj + GLuint buffer + GLenum texunit + GLint size + GLenum type + GLsizei stride + GLintptr offset + + + void glVertexArrayNormalOffsetEXT + GLuint vaobj + GLuint buffer + GLenum type + GLsizei stride + GLintptr offset + + + void glVertexArrayParameteriAPPLE + GLenum pname + GLint param + + + void glVertexArrayRangeAPPLE + GLsizei length + void *pointer + + + void glVertexArrayRangeNV + GLsizei length + const void *pointer + + + void glVertexArraySecondaryColorOffsetEXT + GLuint vaobj + GLuint buffer + GLint size + GLenum type + GLsizei stride + GLintptr offset + + + void glVertexArrayTexCoordOffsetEXT + GLuint vaobj + GLuint buffer + GLint size + GLenum type + GLsizei stride + GLintptr offset + + + void glVertexArrayVertexAttribBindingEXT + GLuint vaobj + GLuint attribindex + GLuint bindingindex + + + void glVertexArrayVertexAttribDivisorEXT + GLuint vaobj + GLuint index + GLuint divisor + + + void glVertexArrayVertexAttribFormatEXT + GLuint vaobj + GLuint attribindex + GLint size + GLenum type + GLboolean normalized + GLuint relativeoffset + + + void glVertexArrayVertexAttribIFormatEXT + GLuint vaobj + GLuint attribindex + GLint size + GLenum type + GLuint relativeoffset + + + void glVertexArrayVertexAttribIOffsetEXT + GLuint vaobj + GLuint buffer + GLuint index + GLint size + GLenum type + GLsizei stride + GLintptr offset + + + void glVertexArrayVertexAttribLFormatEXT + GLuint vaobj + GLuint attribindex + GLint size + GLenum type + GLuint relativeoffset + + + void glVertexArrayVertexAttribLOffsetEXT + GLuint vaobj + GLuint buffer + GLuint index + GLint size + GLenum type + GLsizei stride + GLintptr offset + + + void glVertexArrayVertexAttribOffsetEXT + GLuint vaobj + GLuint buffer + GLuint index + GLint size + GLenum type + GLboolean normalized + GLsizei stride + GLintptr offset + + + void glVertexArrayVertexBindingDivisorEXT + GLuint vaobj + GLuint bindingindex + GLuint divisor + + + void glVertexArrayVertexBuffer + GLuint vaobj + GLuint bindingindex + GLuint buffer + GLintptr offset + GLsizei stride + + + void glVertexArrayVertexBuffers + GLuint vaobj + GLuint first + GLsizei count + const GLuint *buffers + const GLintptr *offsets + const GLsizei *strides + + + void glVertexArrayVertexOffsetEXT + GLuint vaobj + GLuint buffer + GLint size + GLenum type + GLsizei stride + GLintptr offset + + + void glVertexAttrib1d + GLuint index + GLdouble x + + + + void glVertexAttrib1dARB + GLuint index + GLdouble x + + + + + void glVertexAttrib1dNV + GLuint index + GLdouble x + + + + + void glVertexAttrib1dv + GLuint index + const GLdouble *v + + + + void glVertexAttrib1dvARB + GLuint index + const GLdouble *v + + + + + void glVertexAttrib1dvNV + GLuint index + const GLdouble *v + + + + + void glVertexAttrib1f + GLuint index + GLfloat x + + + + void glVertexAttrib1fARB + GLuint index + GLfloat x + + + + + void glVertexAttrib1fNV + GLuint index + GLfloat x + + + + + void glVertexAttrib1fv + GLuint index + const GLfloat *v + + + + void glVertexAttrib1fvARB + GLuint index + const GLfloat *v + + + + + void glVertexAttrib1fvNV + GLuint index + const GLfloat *v + + + + + void glVertexAttrib1hNV + GLuint index + GLhalfNV x + + + + void glVertexAttrib1hvNV + GLuint index + const GLhalfNV *v + + + + void glVertexAttrib1s + GLuint index + GLshort x + + + + void glVertexAttrib1sARB + GLuint index + GLshort x + + + + + void glVertexAttrib1sNV + GLuint index + GLshort x + + + + + void glVertexAttrib1sv + GLuint index + const GLshort *v + + + + void glVertexAttrib1svARB + GLuint index + const GLshort *v + + + + + void glVertexAttrib1svNV + GLuint index + const GLshort *v + + + + + void glVertexAttrib2d + GLuint index + GLdouble x + GLdouble y + + + + void glVertexAttrib2dARB + GLuint index + GLdouble x + GLdouble y + + + + + void glVertexAttrib2dNV + GLuint index + GLdouble x + GLdouble y + + + + + void glVertexAttrib2dv + GLuint index + const GLdouble *v + + + + void glVertexAttrib2dvARB + GLuint index + const GLdouble *v + + + + + void glVertexAttrib2dvNV + GLuint index + const GLdouble *v + + + + + void glVertexAttrib2f + GLuint index + GLfloat x + GLfloat y + + + + void glVertexAttrib2fARB + GLuint index + GLfloat x + GLfloat y + + + + + void glVertexAttrib2fNV + GLuint index + GLfloat x + GLfloat y + + + + + void glVertexAttrib2fv + GLuint index + const GLfloat *v + + + + void glVertexAttrib2fvARB + GLuint index + const GLfloat *v + + + + + void glVertexAttrib2fvNV + GLuint index + const GLfloat *v + + + + + void glVertexAttrib2hNV + GLuint index + GLhalfNV x + GLhalfNV y + + + + void glVertexAttrib2hvNV + GLuint index + const GLhalfNV *v + + + + void glVertexAttrib2s + GLuint index + GLshort x + GLshort y + + + + void glVertexAttrib2sARB + GLuint index + GLshort x + GLshort y + + + + + void glVertexAttrib2sNV + GLuint index + GLshort x + GLshort y + + + + + void glVertexAttrib2sv + GLuint index + const GLshort *v + + + + void glVertexAttrib2svARB + GLuint index + const GLshort *v + + + + + void glVertexAttrib2svNV + GLuint index + const GLshort *v + + + + + void glVertexAttrib3d + GLuint index + GLdouble x + GLdouble y + GLdouble z + + + + void glVertexAttrib3dARB + GLuint index + GLdouble x + GLdouble y + GLdouble z + + + + + void glVertexAttrib3dNV + GLuint index + GLdouble x + GLdouble y + GLdouble z + + + + + void glVertexAttrib3dv + GLuint index + const GLdouble *v + + + + void glVertexAttrib3dvARB + GLuint index + const GLdouble *v + + + + + void glVertexAttrib3dvNV + GLuint index + const GLdouble *v + + + + + void glVertexAttrib3f + GLuint index + GLfloat x + GLfloat y + GLfloat z + + + + void glVertexAttrib3fARB + GLuint index + GLfloat x + GLfloat y + GLfloat z + + + + + void glVertexAttrib3fNV + GLuint index + GLfloat x + GLfloat y + GLfloat z + + + + + void glVertexAttrib3fv + GLuint index + const GLfloat *v + + + + void glVertexAttrib3fvARB + GLuint index + const GLfloat *v + + + + + void glVertexAttrib3fvNV + GLuint index + const GLfloat *v + + + + + void glVertexAttrib3hNV + GLuint index + GLhalfNV x + GLhalfNV y + GLhalfNV z + + + + void glVertexAttrib3hvNV + GLuint index + const GLhalfNV *v + + + + void glVertexAttrib3s + GLuint index + GLshort x + GLshort y + GLshort z + + + + void glVertexAttrib3sARB + GLuint index + GLshort x + GLshort y + GLshort z + + + + + void glVertexAttrib3sNV + GLuint index + GLshort x + GLshort y + GLshort z + + + + + void glVertexAttrib3sv + GLuint index + const GLshort *v + + + + void glVertexAttrib3svARB + GLuint index + const GLshort *v + + + + + void glVertexAttrib3svNV + GLuint index + const GLshort *v + + + + + void glVertexAttrib4Nbv + GLuint index + const GLbyte *v + + + void glVertexAttrib4NbvARB + GLuint index + const GLbyte *v + + + + void glVertexAttrib4Niv + GLuint index + const GLint *v + + + void glVertexAttrib4NivARB + GLuint index + const GLint *v + + + + void glVertexAttrib4Nsv + GLuint index + const GLshort *v + + + void glVertexAttrib4NsvARB + GLuint index + const GLshort *v + + + + void glVertexAttrib4Nub + GLuint index + GLubyte x + GLubyte y + GLubyte z + GLubyte w + + + void glVertexAttrib4NubARB + GLuint index + GLubyte x + GLubyte y + GLubyte z + GLubyte w + + + + void glVertexAttrib4Nubv + GLuint index + const GLubyte *v + + + + void glVertexAttrib4NubvARB + GLuint index + const GLubyte *v + + + + + void glVertexAttrib4Nuiv + GLuint index + const GLuint *v + + + void glVertexAttrib4NuivARB + GLuint index + const GLuint *v + + + + void glVertexAttrib4Nusv + GLuint index + const GLushort *v + + + void glVertexAttrib4NusvARB + GLuint index + const GLushort *v + + + + void glVertexAttrib4bv + GLuint index + const GLbyte *v + + + void glVertexAttrib4bvARB + GLuint index + const GLbyte *v + + + + void glVertexAttrib4d + GLuint index + GLdouble x + GLdouble y + GLdouble z + GLdouble w + + + + void glVertexAttrib4dARB + GLuint index + GLdouble x + GLdouble y + GLdouble z + GLdouble w + + + + + void glVertexAttrib4dNV + GLuint index + GLdouble x + GLdouble y + GLdouble z + GLdouble w + + + + + void glVertexAttrib4dv + GLuint index + const GLdouble *v + + + + void glVertexAttrib4dvARB + GLuint index + const GLdouble *v + + + + + void glVertexAttrib4dvNV + GLuint index + const GLdouble *v + + + + + void glVertexAttrib4f + GLuint index + GLfloat x + GLfloat y + GLfloat z + GLfloat w + + + + void glVertexAttrib4fARB + GLuint index + GLfloat x + GLfloat y + GLfloat z + GLfloat w + + + + + void glVertexAttrib4fNV + GLuint index + GLfloat x + GLfloat y + GLfloat z + GLfloat w + + + + + void glVertexAttrib4fv + GLuint index + const GLfloat *v + + + + void glVertexAttrib4fvARB + GLuint index + const GLfloat *v + + + + + void glVertexAttrib4fvNV + GLuint index + const GLfloat *v + + + + + void glVertexAttrib4hNV + GLuint index + GLhalfNV x + GLhalfNV y + GLhalfNV z + GLhalfNV w + + + + void glVertexAttrib4hvNV + GLuint index + const GLhalfNV *v + + + + void glVertexAttrib4iv + GLuint index + const GLint *v + + + void glVertexAttrib4ivARB + GLuint index + const GLint *v + + + + void glVertexAttrib4s + GLuint index + GLshort x + GLshort y + GLshort z + GLshort w + + + + void glVertexAttrib4sARB + GLuint index + GLshort x + GLshort y + GLshort z + GLshort w + + + + + void glVertexAttrib4sNV + GLuint index + GLshort x + GLshort y + GLshort z + GLshort w + + + + + void glVertexAttrib4sv + GLuint index + const GLshort *v + + + + void glVertexAttrib4svARB + GLuint index + const GLshort *v + + + + + void glVertexAttrib4svNV + GLuint index + const GLshort *v + + + + + void glVertexAttrib4ubNV + GLuint index + GLubyte x + GLubyte y + GLubyte z + GLubyte w + + + + + void glVertexAttrib4ubv + GLuint index + const GLubyte *v + + + void glVertexAttrib4ubvARB + GLuint index + const GLubyte *v + + + + void glVertexAttrib4ubvNV + GLuint index + const GLubyte *v + + + + + void glVertexAttrib4uiv + GLuint index + const GLuint *v + + + void glVertexAttrib4uivARB + GLuint index + const GLuint *v + + + + void glVertexAttrib4usv + GLuint index + const GLushort *v + + + void glVertexAttrib4usvARB + GLuint index + const GLushort *v + + + + void glVertexAttribArrayObjectATI + GLuint index + GLint size + GLenum type + GLboolean normalized + GLsizei stride + GLuint buffer + GLuint offset + + + void glVertexAttribBinding + GLuint attribindex + GLuint bindingindex + + + void glVertexAttribDivisor + GLuint index + GLuint divisor + + + void glVertexAttribDivisorANGLE + GLuint index + GLuint divisor + + + + void glVertexAttribDivisorARB + GLuint index + GLuint divisor + + + + void glVertexAttribDivisorEXT + GLuint index + GLuint divisor + + + + void glVertexAttribDivisorNV + GLuint index + GLuint divisor + + + + void glVertexAttribFormat + GLuint attribindex + GLint size + GLenum type + GLboolean normalized + GLuint relativeoffset + + + void glVertexAttribFormatNV + GLuint index + GLint size + GLenum type + GLboolean normalized + GLsizei stride + + + void glVertexAttribI1i + GLuint index + GLint x + + + + void glVertexAttribI1iEXT + GLuint index + GLint x + + + + + void glVertexAttribI1iv + GLuint index + const GLint *v + + + void glVertexAttribI1ivEXT + GLuint index + const GLint *v + + + + void glVertexAttribI1ui + GLuint index + GLuint x + + + + void glVertexAttribI1uiEXT + GLuint index + GLuint x + + + + + void glVertexAttribI1uiv + GLuint index + const GLuint *v + + + void glVertexAttribI1uivEXT + GLuint index + const GLuint *v + + + + void glVertexAttribI2i + GLuint index + GLint x + GLint y + + + + void glVertexAttribI2iEXT + GLuint index + GLint x + GLint y + + + + + void glVertexAttribI2iv + GLuint index + const GLint *v + + + void glVertexAttribI2ivEXT + GLuint index + const GLint *v + + + + void glVertexAttribI2ui + GLuint index + GLuint x + GLuint y + + + + void glVertexAttribI2uiEXT + GLuint index + GLuint x + GLuint y + + + + + void glVertexAttribI2uiv + GLuint index + const GLuint *v + + + void glVertexAttribI2uivEXT + GLuint index + const GLuint *v + + + + void glVertexAttribI3i + GLuint index + GLint x + GLint y + GLint z + + + + void glVertexAttribI3iEXT + GLuint index + GLint x + GLint y + GLint z + + + + + void glVertexAttribI3iv + GLuint index + const GLint *v + + + void glVertexAttribI3ivEXT + GLuint index + const GLint *v + + + + void glVertexAttribI3ui + GLuint index + GLuint x + GLuint y + GLuint z + + + + void glVertexAttribI3uiEXT + GLuint index + GLuint x + GLuint y + GLuint z + + + + + void glVertexAttribI3uiv + GLuint index + const GLuint *v + + + void glVertexAttribI3uivEXT + GLuint index + const GLuint *v + + + + void glVertexAttribI4bv + GLuint index + const GLbyte *v + + + void glVertexAttribI4bvEXT + GLuint index + const GLbyte *v + + + + void glVertexAttribI4i + GLuint index + GLint x + GLint y + GLint z + GLint w + + + + void glVertexAttribI4iEXT + GLuint index + GLint x + GLint y + GLint z + GLint w + + + + + void glVertexAttribI4iv + GLuint index + const GLint *v + + + void glVertexAttribI4ivEXT + GLuint index + const GLint *v + + + + void glVertexAttribI4sv + GLuint index + const GLshort *v + + + void glVertexAttribI4svEXT + GLuint index + const GLshort *v + + + + void glVertexAttribI4ubv + GLuint index + const GLubyte *v + + + void glVertexAttribI4ubvEXT + GLuint index + const GLubyte *v + + + + void glVertexAttribI4ui + GLuint index + GLuint x + GLuint y + GLuint z + GLuint w + + + + void glVertexAttribI4uiEXT + GLuint index + GLuint x + GLuint y + GLuint z + GLuint w + + + + + void glVertexAttribI4uiv + GLuint index + const GLuint *v + + + void glVertexAttribI4uivEXT + GLuint index + const GLuint *v + + + + void glVertexAttribI4usv + GLuint index + const GLushort *v + + + void glVertexAttribI4usvEXT + GLuint index + const GLushort *v + + + + void glVertexAttribIFormat + GLuint attribindex + GLint size + GLenum type + GLuint relativeoffset + + + void glVertexAttribIFormatNV + GLuint index + GLint size + GLenum type + GLsizei stride + + + void glVertexAttribIPointer + GLuint index + GLint size + GLenum type + GLsizei stride + const void *pointer + + + void glVertexAttribIPointerEXT + GLuint index + GLint size + GLenum type + GLsizei stride + const void *pointer + + + + void glVertexAttribL1d + GLuint index + GLdouble x + + + void glVertexAttribL1dEXT + GLuint index + GLdouble x + + + + void glVertexAttribL1dv + GLuint index + const GLdouble *v + + + void glVertexAttribL1dvEXT + GLuint index + const GLdouble *v + + + + void glVertexAttribL1i64NV + GLuint index + GLint64EXT x + + + void glVertexAttribL1i64vNV + GLuint index + const GLint64EXT *v + + + void glVertexAttribL1ui64ARB + GLuint index + GLuint64EXT x + + + void glVertexAttribL1ui64NV + GLuint index + GLuint64EXT x + + + void glVertexAttribL1ui64vARB + GLuint index + const GLuint64EXT *v + + + void glVertexAttribL1ui64vNV + GLuint index + const GLuint64EXT *v + + + void glVertexAttribL2d + GLuint index + GLdouble x + GLdouble y + + + void glVertexAttribL2dEXT + GLuint index + GLdouble x + GLdouble y + + + + void glVertexAttribL2dv + GLuint index + const GLdouble *v + + + void glVertexAttribL2dvEXT + GLuint index + const GLdouble *v + + + + void glVertexAttribL2i64NV + GLuint index + GLint64EXT x + GLint64EXT y + + + void glVertexAttribL2i64vNV + GLuint index + const GLint64EXT *v + + + void glVertexAttribL2ui64NV + GLuint index + GLuint64EXT x + GLuint64EXT y + + + void glVertexAttribL2ui64vNV + GLuint index + const GLuint64EXT *v + + + void glVertexAttribL3d + GLuint index + GLdouble x + GLdouble y + GLdouble z + + + void glVertexAttribL3dEXT + GLuint index + GLdouble x + GLdouble y + GLdouble z + + + + void glVertexAttribL3dv + GLuint index + const GLdouble *v + + + void glVertexAttribL3dvEXT + GLuint index + const GLdouble *v + + + + void glVertexAttribL3i64NV + GLuint index + GLint64EXT x + GLint64EXT y + GLint64EXT z + + + void glVertexAttribL3i64vNV + GLuint index + const GLint64EXT *v + + + void glVertexAttribL3ui64NV + GLuint index + GLuint64EXT x + GLuint64EXT y + GLuint64EXT z + + + void glVertexAttribL3ui64vNV + GLuint index + const GLuint64EXT *v + + + void glVertexAttribL4d + GLuint index + GLdouble x + GLdouble y + GLdouble z + GLdouble w + + + void glVertexAttribL4dEXT + GLuint index + GLdouble x + GLdouble y + GLdouble z + GLdouble w + + + + void glVertexAttribL4dv + GLuint index + const GLdouble *v + + + void glVertexAttribL4dvEXT + GLuint index + const GLdouble *v + + + + void glVertexAttribL4i64NV + GLuint index + GLint64EXT x + GLint64EXT y + GLint64EXT z + GLint64EXT w + + + void glVertexAttribL4i64vNV + GLuint index + const GLint64EXT *v + + + void glVertexAttribL4ui64NV + GLuint index + GLuint64EXT x + GLuint64EXT y + GLuint64EXT z + GLuint64EXT w + + + void glVertexAttribL4ui64vNV + GLuint index + const GLuint64EXT *v + + + void glVertexAttribLFormat + GLuint attribindex + GLint size + GLenum type + GLuint relativeoffset + + + void glVertexAttribLFormatNV + GLuint index + GLint size + GLenum type + GLsizei stride + + + void glVertexAttribLPointer + GLuint index + GLint size + GLenum type + GLsizei stride + const void *pointer + + + void glVertexAttribLPointerEXT + GLuint index + GLint size + GLenum type + GLsizei stride + const void *pointer + + + + void glVertexAttribP1ui + GLuint index + GLenum type + GLboolean normalized + GLuint value + + + void glVertexAttribP1uiv + GLuint index + GLenum type + GLboolean normalized + const GLuint *value + + + void glVertexAttribP2ui + GLuint index + GLenum type + GLboolean normalized + GLuint value + + + void glVertexAttribP2uiv + GLuint index + GLenum type + GLboolean normalized + const GLuint *value + + + void glVertexAttribP3ui + GLuint index + GLenum type + GLboolean normalized + GLuint value + + + void glVertexAttribP3uiv + GLuint index + GLenum type + GLboolean normalized + const GLuint *value + + + void glVertexAttribP4ui + GLuint index + GLenum type + GLboolean normalized + GLuint value + + + void glVertexAttribP4uiv + GLuint index + GLenum type + GLboolean normalized + const GLuint *value + + + void glVertexAttribParameteriAMD + GLuint index + GLenum pname + GLint param + + + void glVertexAttribPointer + GLuint index + GLint size + GLenum type + GLboolean normalized + GLsizei stride + const void *pointer + + + void glVertexAttribPointerARB + GLuint index + GLint size + GLenum type + GLboolean normalized + GLsizei stride + const void *pointer + + + + void glVertexAttribPointerNV + GLuint index + GLint fsize + GLenum type + GLsizei stride + const void *pointer + + + void glVertexAttribs1dvNV + GLuint index + GLsizei count + const GLdouble *v + + + + void glVertexAttribs1fvNV + GLuint index + GLsizei count + const GLfloat *v + + + + void glVertexAttribs1hvNV + GLuint index + GLsizei n + const GLhalfNV *v + + + + void glVertexAttribs1svNV + GLuint index + GLsizei count + const GLshort *v + + + + void glVertexAttribs2dvNV + GLuint index + GLsizei count + const GLdouble *v + + + + void glVertexAttribs2fvNV + GLuint index + GLsizei count + const GLfloat *v + + + + void glVertexAttribs2hvNV + GLuint index + GLsizei n + const GLhalfNV *v + + + + void glVertexAttribs2svNV + GLuint index + GLsizei count + const GLshort *v + + + + void glVertexAttribs3dvNV + GLuint index + GLsizei count + const GLdouble *v + + + + void glVertexAttribs3fvNV + GLuint index + GLsizei count + const GLfloat *v + + + + void glVertexAttribs3hvNV + GLuint index + GLsizei n + const GLhalfNV *v + + + + void glVertexAttribs3svNV + GLuint index + GLsizei count + const GLshort *v + + + + void glVertexAttribs4dvNV + GLuint index + GLsizei count + const GLdouble *v + + + + void glVertexAttribs4fvNV + GLuint index + GLsizei count + const GLfloat *v + + + + void glVertexAttribs4hvNV + GLuint index + GLsizei n + const GLhalfNV *v + + + + void glVertexAttribs4svNV + GLuint index + GLsizei count + const GLshort *v + + + + void glVertexAttribs4ubvNV + GLuint index + GLsizei count + const GLubyte *v + + + + void glVertexBindingDivisor + GLuint bindingindex + GLuint divisor + + + void glVertexBlendARB + GLint count + + + + void glVertexBlendEnvfATI + GLenum pname + GLfloat param + + + void glVertexBlendEnviATI + GLenum pname + GLint param + + + void glVertexFormatNV + GLint size + GLenum type + GLsizei stride + + + void glVertexP2ui + GLenum type + GLuint value + + + void glVertexP2uiv + GLenum type + const GLuint *value + + + void glVertexP3ui + GLenum type + GLuint value + + + void glVertexP3uiv + GLenum type + const GLuint *value + + + void glVertexP4ui + GLenum type + GLuint value + + + void glVertexP4uiv + GLenum type + const GLuint *value + + + void glVertexPointer + GLint size + GLenum type + GLsizei stride + const void *pointer + + + void glVertexPointerEXT + GLint size + GLenum type + GLsizei stride + GLsizei count + const void *pointer + + + void glVertexPointerListIBM + GLint size + GLenum type + GLint stride + const void **pointer + GLint ptrstride + + + void glVertexPointervINTEL + GLint size + GLenum type + const void **pointer + + + void glVertexStream1dATI + GLenum stream + GLdouble x + + + void glVertexStream1dvATI + GLenum stream + const GLdouble *coords + + + void glVertexStream1fATI + GLenum stream + GLfloat x + + + void glVertexStream1fvATI + GLenum stream + const GLfloat *coords + + + void glVertexStream1iATI + GLenum stream + GLint x + + + void glVertexStream1ivATI + GLenum stream + const GLint *coords + + + void glVertexStream1sATI + GLenum stream + GLshort x + + + void glVertexStream1svATI + GLenum stream + const GLshort *coords + + + void glVertexStream2dATI + GLenum stream + GLdouble x + GLdouble y + + + void glVertexStream2dvATI + GLenum stream + const GLdouble *coords + + + void glVertexStream2fATI + GLenum stream + GLfloat x + GLfloat y + + + void glVertexStream2fvATI + GLenum stream + const GLfloat *coords + + + void glVertexStream2iATI + GLenum stream + GLint x + GLint y + + + void glVertexStream2ivATI + GLenum stream + const GLint *coords + + + void glVertexStream2sATI + GLenum stream + GLshort x + GLshort y + + + void glVertexStream2svATI + GLenum stream + const GLshort *coords + + + void glVertexStream3dATI + GLenum stream + GLdouble x + GLdouble y + GLdouble z + + + void glVertexStream3dvATI + GLenum stream + const GLdouble *coords + + + void glVertexStream3fATI + GLenum stream + GLfloat x + GLfloat y + GLfloat z + + + void glVertexStream3fvATI + GLenum stream + const GLfloat *coords + + + void glVertexStream3iATI + GLenum stream + GLint x + GLint y + GLint z + + + void glVertexStream3ivATI + GLenum stream + const GLint *coords + + + void glVertexStream3sATI + GLenum stream + GLshort x + GLshort y + GLshort z + + + void glVertexStream3svATI + GLenum stream + const GLshort *coords + + + void glVertexStream4dATI + GLenum stream + GLdouble x + GLdouble y + GLdouble z + GLdouble w + + + void glVertexStream4dvATI + GLenum stream + const GLdouble *coords + + + void glVertexStream4fATI + GLenum stream + GLfloat x + GLfloat y + GLfloat z + GLfloat w + + + void glVertexStream4fvATI + GLenum stream + const GLfloat *coords + + + void glVertexStream4iATI + GLenum stream + GLint x + GLint y + GLint z + GLint w + + + void glVertexStream4ivATI + GLenum stream + const GLint *coords + + + void glVertexStream4sATI + GLenum stream + GLshort x + GLshort y + GLshort z + GLshort w + + + void glVertexStream4svATI + GLenum stream + const GLshort *coords + + + void glVertexWeightPointerEXT + GLint size + GLenum type + GLsizei stride + const void *pointer + + + void glVertexWeightfEXT + GLfloat weight + + + + void glVertexWeightfvEXT + const GLfloat *weight + + + + void glVertexWeighthNV + GLhalfNV weight + + + + void glVertexWeighthvNV + const GLhalfNV *weight + + + + GLenum glVideoCaptureNV + GLuint video_capture_slot + GLuint *sequence_num + GLuint64EXT *capture_time + + + void glVideoCaptureStreamParameterdvNV + GLuint video_capture_slot + GLuint stream + GLenum pname + const GLdouble *params + + + void glVideoCaptureStreamParameterfvNV + GLuint video_capture_slot + GLuint stream + GLenum pname + const GLfloat *params + + + void glVideoCaptureStreamParameterivNV + GLuint video_capture_slot + GLuint stream + GLenum pname + const GLint *params + + + void glViewport + GLint x + GLint y + GLsizei width + GLsizei height + + + + void glViewportArrayv + GLuint first + GLsizei count + const GLfloat *v + + + void glViewportArrayvNV + GLuint first + GLsizei count + const GLfloat *v + + + + void glViewportArrayvOES + GLuint first + GLsizei count + const GLfloat *v + + + + void glViewportIndexedf + GLuint index + GLfloat x + GLfloat y + GLfloat w + GLfloat h + + + void glViewportIndexedfOES + GLuint index + GLfloat x + GLfloat y + GLfloat w + GLfloat h + + + + void glViewportIndexedfNV + GLuint index + GLfloat x + GLfloat y + GLfloat w + GLfloat h + + + + void glViewportIndexedfv + GLuint index + const GLfloat *v + + + void glViewportIndexedfvOES + GLuint index + const GLfloat *v + + + + void glViewportIndexedfvNV + GLuint index + const GLfloat *v + + + + void glViewportPositionWScaleNV + GLuint index + GLfloat xcoeff + GLfloat ycoeff + + + void glViewportSwizzleNV + GLuint index + GLenum swizzlex + GLenum swizzley + GLenum swizzlez + GLenum swizzlew + + + void glWaitSemaphoreEXT + GLuint semaphore + GLuint numBufferBarriers + const GLuint *buffers + GLuint numTextureBarriers + const GLuint *textures + const GLenum *srcLayouts + + + void glWaitSemaphoreui64NVX + GLuint waitGpu + GLsizei fenceObjectCount + const GLuint *semaphoreArray + const GLuint64 *fenceValueArray + + + void glWaitSync + GLsync sync + GLbitfield flags + GLuint64 timeout + + + void glWaitSyncAPPLE + GLsync sync + GLbitfield flags + GLuint64 timeout + + + + void glWeightPathsNV + GLuint resultPath + GLsizei numPaths + const GLuint *paths + const GLfloat *weights + + + void glWeightPointerARB + GLint size + GLenum type + GLsizei stride + const void *pointer + + + void glWeightPointerOES + GLint size + GLenum type + GLsizei stride + const void *pointer + + + void glWeightbvARB + GLint size + const GLbyte *weights + + + + void glWeightdvARB + GLint size + const GLdouble *weights + + + + void glWeightfvARB + GLint size + const GLfloat *weights + + + + void glWeightivARB + GLint size + const GLint *weights + + + + void glWeightsvARB + GLint size + const GLshort *weights + + + + void glWeightubvARB + GLint size + const GLubyte *weights + + + + void glWeightuivARB + GLint size + const GLuint *weights + + + + void glWeightusvARB + GLint size + const GLushort *weights + + + + void glWindowPos2d + GLdouble x + GLdouble y + + + + void glWindowPos2dARB + GLdouble x + GLdouble y + + + + + void glWindowPos2dMESA + GLdouble x + GLdouble y + + + + + void glWindowPos2dv + const GLdouble *v + + + + void glWindowPos2dvARB + const GLdouble *v + + + + + void glWindowPos2dvMESA + const GLdouble *v + + + + void glWindowPos2f + GLfloat x + GLfloat y + + + + void glWindowPos2fARB + GLfloat x + GLfloat y + + + + + void glWindowPos2fMESA + GLfloat x + GLfloat y + + + + + void glWindowPos2fv + const GLfloat *v + + + + void glWindowPos2fvARB + const GLfloat *v + + + + + void glWindowPos2fvMESA + const GLfloat *v + + + + void glWindowPos2i + GLint x + GLint y + + + + void glWindowPos2iARB + GLint x + GLint y + + + + + void glWindowPos2iMESA + GLint x + GLint y + + + + + void glWindowPos2iv + const GLint *v + + + + void glWindowPos2ivARB + const GLint *v + + + + + void glWindowPos2ivMESA + const GLint *v + + + + void glWindowPos2s + GLshort x + GLshort y + + + + void glWindowPos2sARB + GLshort x + GLshort y + + + + + void glWindowPos2sMESA + GLshort x + GLshort y + + + + + void glWindowPos2sv + const GLshort *v + + + + void glWindowPos2svARB + const GLshort *v + + + + + void glWindowPos2svMESA + const GLshort *v + + + + void glWindowPos3d + GLdouble x + GLdouble y + GLdouble z + + + + void glWindowPos3dARB + GLdouble x + GLdouble y + GLdouble z + + + + + void glWindowPos3dMESA + GLdouble x + GLdouble y + GLdouble z + + + + + void glWindowPos3dv + const GLdouble *v + + + + void glWindowPos3dvARB + const GLdouble *v + + + + + void glWindowPos3dvMESA + const GLdouble *v + + + + void glWindowPos3f + GLfloat x + GLfloat y + GLfloat z + + + + void glWindowPos3fARB + GLfloat x + GLfloat y + GLfloat z + + + + + void glWindowPos3fMESA + GLfloat x + GLfloat y + GLfloat z + + + + + void glWindowPos3fv + const GLfloat *v + + + + void glWindowPos3fvARB + const GLfloat *v + + + + + void glWindowPos3fvMESA + const GLfloat *v + + + + void glWindowPos3i + GLint x + GLint y + GLint z + + + + void glWindowPos3iARB + GLint x + GLint y + GLint z + + + + + void glWindowPos3iMESA + GLint x + GLint y + GLint z + + + + + void glWindowPos3iv + const GLint *v + + + + void glWindowPos3ivARB + const GLint *v + + + + + void glWindowPos3ivMESA + const GLint *v + + + + void glWindowPos3s + GLshort x + GLshort y + GLshort z + + + + void glWindowPos3sARB + GLshort x + GLshort y + GLshort z + + + + + void glWindowPos3sMESA + GLshort x + GLshort y + GLshort z + + + + + void glWindowPos3sv + const GLshort *v + + + + void glWindowPos3svARB + const GLshort *v + + + + + void glWindowPos3svMESA + const GLshort *v + + + + void glWindowPos4dMESA + GLdouble x + GLdouble y + GLdouble z + GLdouble w + + + + void glWindowPos4dvMESA + const GLdouble *v + + + void glWindowPos4fMESA + GLfloat x + GLfloat y + GLfloat z + GLfloat w + + + + void glWindowPos4fvMESA + const GLfloat *v + + + void glWindowPos4iMESA + GLint x + GLint y + GLint z + GLint w + + + + void glWindowPos4ivMESA + const GLint *v + + + void glWindowPos4sMESA + GLshort x + GLshort y + GLshort z + GLshort w + + + + void glWindowPos4svMESA + const GLshort *v + + + void glWindowRectanglesEXT + GLenum mode + GLsizei count + const GLint *box + + + void glWriteMaskEXT + GLuint res + GLuint in + GLenum outX + GLenum outY + GLenum outZ + GLenum outW + + + void glDrawVkImageNV + GLuint64 vkImage + GLuint sampler + GLfloat x0 + GLfloat y0 + GLfloat x1 + GLfloat y1 + GLfloat z + GLfloat s0 + GLfloat t0 + GLfloat s1 + GLfloat t1 + + + GLVULKANPROCNV glGetVkProcAddrNV + const GLchar *name + + + void glWaitVkSemaphoreNV + GLuint64 vkSemaphore + + + void glSignalVkSemaphoreNV + GLuint64 vkSemaphore + + + void glSignalVkFenceNV + GLuint64 vkFence + + + void glFramebufferParameteriMESA + GLenum target + GLenum pname + GLint param + + + void glGetFramebufferParameterivMESA + GLenum target + GLenum pname + GLint *params + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/local/recipes/libs/libepoxy/source/registry/glx.xml b/local/recipes/libs/libepoxy/source/registry/glx.xml new file mode 100644 index 0000000000..0ce9cba69a --- /dev/null +++ b/local/recipes/libs/libepoxy/source/registry/glx.xml @@ -0,0 +1,2202 @@ + + + +Copyright (c) 2013-2018 The Khronos Group Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +------------------------------------------------------------------------ + +This file, glx.xml, is the GLX API Registry. The canonical version of the +registry, together with documentation, schema, and Python generator scripts +used to generate C header files for GLX, can always be found in the Khronos +Registry at + https://github.com/KhronosGroup/OpenGL-Registry + + + + + + = 199901L +#include +#elif defined(__sun__) || defined(__digital__) +#include +#if defined(__STDC__) +#if defined(__arch64__) || defined(_LP64) +typedef long int int64_t; +typedef unsigned long int uint64_t; +#else +typedef long long int int64_t; +typedef unsigned long long int uint64_t; +#endif /* __arch64__ */ +#endif /* __STDC__ */ +#elif defined( __VMS ) || defined(__sgi) +#include +#elif defined(__SCO__) || defined(__USLC__) +#include +#elif defined(__UNIXOS2__) || defined(__SOL64__) +typedef long int int32_t; +typedef long long int int64_t; +typedef unsigned long long int uint64_t; +#elif defined(_WIN32) && defined(__GNUC__) +#include +#elif defined(_WIN32) +typedef __int32 int32_t; +typedef __int64 int64_t; +typedef unsigned __int64 uint64_t; +#else +/* Fallback if nothing above works */ +#include +#endif +#endif]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + typedef XID GLXFBConfigID; + typedef struct __GLXFBConfigRec *GLXFBConfig; + typedef XID GLXContextID; + typedef struct __GLXcontextRec *GLXContext; + typedef XID GLXPixmap; + typedef XID GLXDrawable; + typedef XID GLXWindow; + typedef XID GLXPbuffer; + typedef void ( *__GLXextFuncPtr)(void); + typedef XID GLXVideoCaptureDeviceNV; + typedef unsigned int GLXVideoDeviceNV; + typedef XID GLXVideoSourceSGIX; + typedef XID GLXFBConfigIDSGIX; + typedef struct __GLXFBConfigRec *GLXFBConfigSGIX; + typedef XID GLXPbufferSGIX; + + typedef struct { + int event_type; /* GLX_DAMAGED or GLX_SAVED */ + int draw_type; /* GLX_WINDOW or GLX_PBUFFER */ + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came for SendEvent request */ + Display *display; /* display the event was read from */ + GLXDrawable drawable; /* XID of Drawable */ + unsigned int buffer_mask; /* mask indicating which buffers are affected */ + unsigned int aux_buffer; /* which aux buffer was affected */ + int x, y; + int width, height; + int count; /* if nonzero, at least this many more */ +} GLXPbufferClobberEvent; + + typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + GLXDrawable drawable; /* drawable on which event was requested in event mask */ + int event_type; + int64_t ust; + int64_t msc; + int64_t sbc; +} GLXBufferSwapComplete; + + typedef union __GLXEvent { + GLXPbufferClobberEvent glxpbufferclobber; + GLXBufferSwapComplete glxbufferswapcomplete; + long pad[24]; +} GLXEvent; + + typedef struct { + int type; + unsigned long serial; + Bool send_event; + Display *display; + int extension; + int evtype; + GLXDrawable window; + Bool stereo_tree; +} GLXStereoNotifyEventEXT; + + typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came for SendEvent request */ + Display *display; /* display the event was read from */ + GLXDrawable drawable; /* i.d. of Drawable */ + int event_type; /* GLX_DAMAGED_SGIX or GLX_SAVED_SGIX */ + int draw_type; /* GLX_WINDOW_SGIX or GLX_PBUFFER_SGIX */ + unsigned int mask; /* mask indicating which buffers are affected*/ + int x, y; + int width, height; + int count; /* if nonzero, at least this many more */ +} GLXBufferClobberEventSGIX; + + typedef struct { + char pipeName[80]; /* Should be [GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX] */ + int networkId; +} GLXHyperpipeNetworkSGIX; + + typedef struct { + char pipeName[80]; /* Should be [GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX] */ + int channel; + unsigned int participationType; + int timeSlice; +} GLXHyperpipeConfigSGIX; + + typedef struct { + char pipeName[80]; /* Should be [GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX] */ + int srcXOrigin, srcYOrigin, srcWidth, srcHeight; + int destXOrigin, destYOrigin, destWidth, destHeight; +} GLXPipeRect; + + typedef struct { + char pipeName[80]; /* Should be [GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX] */ + int XOrigin, YOrigin, maxHeight, maxWidth; +} GLXPipeRectLimits; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Bool glXAssociateDMPbufferSGIX + Display *dpy + GLXPbufferSGIX pbuffer + DMparams *params + DMbuffer dmbuffer + + + int glXBindChannelToWindowSGIX + Display *display + int screen + int channel + Window window + + + int glXBindHyperpipeSGIX + Display *dpy + int hpId + + + Bool glXBindSwapBarrierNV + Display *dpy + GLuint group + GLuint barrier + + + void glXBindSwapBarrierSGIX + Display *dpy + GLXDrawable drawable + int barrier + + + void glXBindTexImageEXT + Display *dpy + GLXDrawable drawable + int buffer + const int *attrib_list + + + int glXBindVideoCaptureDeviceNV + Display *dpy + unsigned int video_capture_slot + GLXVideoCaptureDeviceNV device + + + int glXBindVideoDeviceNV + Display *dpy + unsigned int video_slot + unsigned int video_device + const int *attrib_list + + + int glXBindVideoImageNV + Display *dpy + GLXVideoDeviceNV VideoDevice + GLXPbuffer pbuf + int iVideoBuffer + + + void glXBlitContextFramebufferAMD + GLXContext dstCtx + GLint srcX0 + GLint srcY0 + GLint srcX1 + GLint srcY1 + GLint dstX0 + GLint dstY0 + GLint dstX1 + GLint dstY1 + GLbitfield mask + GLenum filter + + + int glXChannelRectSGIX + Display *display + int screen + int channel + int x + int y + int w + int h + + + int glXChannelRectSyncSGIX + Display *display + int screen + int channel + GLenum synctype + + + GLXFBConfig *glXChooseFBConfig + Display *dpy + int screen + const int *attrib_list + int *nelements + + + GLXFBConfigSGIX *glXChooseFBConfigSGIX + Display *dpy + int screen + int *attrib_list + int *nelements + + + XVisualInfo *glXChooseVisual + Display *dpy + int screen + int *attribList + + + void glXCopyBufferSubDataNV + Display *dpy + GLXContext readCtx + GLXContext writeCtx + GLenum readTarget + GLenum writeTarget + GLintptr readOffset + GLintptr writeOffset + GLsizeiptr size + + + void glXNamedCopyBufferSubDataNV + Display *dpy + GLXContext readCtx + GLXContext writeCtx + GLuint readBuffer + GLuint writeBuffer + GLintptr readOffset + GLintptr writeOffset + GLsizeiptr size + + + void glXCopyContext + Display *dpy + GLXContext src + GLXContext dst + unsigned long mask + + + void glXCopyImageSubDataNV + Display *dpy + GLXContext srcCtx + GLuint srcName + GLenum srcTarget + GLint srcLevel + GLint srcX + GLint srcY + GLint srcZ + GLXContext dstCtx + GLuint dstName + GLenum dstTarget + GLint dstLevel + GLint dstX + GLint dstY + GLint dstZ + GLsizei width + GLsizei height + GLsizei depth + + + void glXCopySubBufferMESA + Display *dpy + GLXDrawable drawable + int x + int y + int width + int height + + + GLXContext glXCreateAssociatedContextAMD + unsigned int id + GLXContext share_list + + + GLXContext glXCreateAssociatedContextAttribsAMD + unsigned int id + GLXContext share_context + const int *attribList + + + GLXContext glXCreateContextAttribsARB + Display *dpy + GLXFBConfig config + GLXContext share_context + Bool direct + const int *attrib_list + + + GLXContext glXCreateContext + Display *dpy + XVisualInfo *vis + GLXContext shareList + Bool direct + + + GLXContext glXCreateContextWithConfigSGIX + Display *dpy + GLXFBConfigSGIX config + int render_type + GLXContext share_list + Bool direct + + + GLXPbufferSGIX glXCreateGLXPbufferSGIX + Display *dpy + GLXFBConfigSGIX config + unsigned int width + unsigned int height + int *attrib_list + + + GLXPixmap glXCreateGLXPixmap + Display *dpy + XVisualInfo *visual + Pixmap pixmap + + + GLXPixmap glXCreateGLXPixmapMESA + Display *dpy + XVisualInfo *visual + Pixmap pixmap + Colormap cmap + + + GLXPixmap glXCreateGLXPixmapWithConfigSGIX + Display *dpy + GLXFBConfigSGIX config + Pixmap pixmap + + + GLXVideoSourceSGIX glXCreateGLXVideoSourceSGIX + Display *display + int screen + VLServer server + VLPath path + int nodeClass + VLNode drainNode + + + GLXContext glXCreateNewContext + Display *dpy + GLXFBConfig config + int render_type + GLXContext share_list + Bool direct + + + GLXPbuffer glXCreatePbuffer + Display *dpy + GLXFBConfig config + const int *attrib_list + + + GLXPixmap glXCreatePixmap + Display *dpy + GLXFBConfig config + Pixmap pixmap + const int *attrib_list + + + GLXWindow glXCreateWindow + Display *dpy + GLXFBConfig config + Window win + const int *attrib_list + + + void glXCushionSGI + Display *dpy + Window window + float cushion + + + Bool glXDelayBeforeSwapNV + Display *dpy + GLXDrawable drawable + GLfloat seconds + + + Bool glXDeleteAssociatedContextAMD + GLXContext ctx + + + void glXDestroyContext + Display *dpy + GLXContext ctx + + + void glXDestroyGLXPbufferSGIX + Display *dpy + GLXPbufferSGIX pbuf + + + void glXDestroyGLXPixmap + Display *dpy + GLXPixmap pixmap + + + void glXDestroyGLXVideoSourceSGIX + Display *dpy + GLXVideoSourceSGIX glxvideosource + + + int glXDestroyHyperpipeConfigSGIX + Display *dpy + int hpId + + + void glXDestroyPbuffer + Display *dpy + GLXPbuffer pbuf + + + void glXDestroyPixmap + Display *dpy + GLXPixmap pixmap + + + void glXDestroyWindow + Display *dpy + GLXWindow win + + + GLXVideoCaptureDeviceNV *glXEnumerateVideoCaptureDevicesNV + Display *dpy + int screen + int *nelements + + + unsigned int *glXEnumerateVideoDevicesNV + Display *dpy + int screen + int *nelements + + + void glXFreeContextEXT + Display *dpy + GLXContext context + + + unsigned int glXGetAGPOffsetMESA + const void *pointer + + + const char *glXGetClientString + Display *dpy + int name + + + int glXGetConfig + Display *dpy + XVisualInfo *visual + int attrib + int *value + + + unsigned int glXGetContextGPUIDAMD + GLXContext ctx + + + GLXContextID glXGetContextIDEXT + const GLXContext context + + + GLXContext glXGetCurrentAssociatedContextAMD + + + GLXContext glXGetCurrentContext + + + Display *glXGetCurrentDisplayEXT + + + Display *glXGetCurrentDisplay + + + GLXDrawable glXGetCurrentDrawable + + + GLXDrawable glXGetCurrentReadDrawableSGI + + + GLXDrawable glXGetCurrentReadDrawable + + + int glXGetFBConfigAttrib + Display *dpy + GLXFBConfig config + int attribute + int *value + + + int glXGetFBConfigAttribSGIX + Display *dpy + GLXFBConfigSGIX config + int attribute + int *value + + + GLXFBConfigSGIX glXGetFBConfigFromVisualSGIX + Display *dpy + XVisualInfo *vis + + + GLXFBConfig *glXGetFBConfigs + Display *dpy + int screen + int *nelements + + + unsigned int glXGetGPUIDsAMD + unsigned int maxCount + unsigned int *ids + + + int glXGetGPUInfoAMD + unsigned int id + int property + GLenum dataType + unsigned int size + void *data + + + Bool glXGetMscRateOML + Display *dpy + GLXDrawable drawable + int32_t *numerator + int32_t *denominator + + + __GLXextFuncPtr glXGetProcAddressARB + const GLubyte *procName + + + __GLXextFuncPtr glXGetProcAddress + const GLubyte *procName + + + void glXGetSelectedEvent + Display *dpy + GLXDrawable draw + unsigned long *event_mask + + + void glXGetSelectedEventSGIX + Display *dpy + GLXDrawable drawable + unsigned long *mask + + + int glXGetSwapIntervalMESA + + + Bool glXGetSyncValuesOML + Display *dpy + GLXDrawable drawable + int64_t *ust + int64_t *msc + int64_t *sbc + + + Status glXGetTransparentIndexSUN + Display *dpy + Window overlay + Window underlay + unsigned long *pTransparentIndex + + + int glXGetVideoDeviceNV + Display *dpy + int screen + int numVideoDevices + GLXVideoDeviceNV *pVideoDevice + + + int glXGetVideoInfoNV + Display *dpy + int screen + GLXVideoDeviceNV VideoDevice + unsigned long *pulCounterOutputPbuffer + unsigned long *pulCounterOutputVideo + + + int glXGetVideoSyncSGI + unsigned int *count + + + XVisualInfo *glXGetVisualFromFBConfig + Display *dpy + GLXFBConfig config + + + XVisualInfo *glXGetVisualFromFBConfigSGIX + Display *dpy + GLXFBConfigSGIX config + + + int glXHyperpipeAttribSGIX + Display *dpy + int timeSlice + int attrib + int size + void *attribList + + + int glXHyperpipeConfigSGIX + Display *dpy + int networkId + int npipes + GLXHyperpipeConfigSGIX *cfg + int *hpId + + + GLXContext glXImportContextEXT + Display *dpy + GLXContextID contextID + + + Bool glXIsDirect + Display *dpy + GLXContext ctx + + + Bool glXJoinSwapGroupNV + Display *dpy + GLXDrawable drawable + GLuint group + + + void glXJoinSwapGroupSGIX + Display *dpy + GLXDrawable drawable + GLXDrawable member + + + void glXLockVideoCaptureDeviceNV + Display *dpy + GLXVideoCaptureDeviceNV device + + + Bool glXMakeAssociatedContextCurrentAMD + GLXContext ctx + + + Bool glXMakeContextCurrent + Display *dpy + GLXDrawable draw + GLXDrawable read + GLXContext ctx + + + Bool glXMakeCurrent + Display *dpy + GLXDrawable drawable + GLXContext ctx + + + Bool glXMakeCurrentReadSGI + Display *dpy + GLXDrawable draw + GLXDrawable read + GLXContext ctx + + + int glXQueryChannelDeltasSGIX + Display *display + int screen + int channel + int *x + int *y + int *w + int *h + + + int glXQueryChannelRectSGIX + Display *display + int screen + int channel + int *dx + int *dy + int *dw + int *dh + + + int glXQueryContext + Display *dpy + GLXContext ctx + int attribute + int *value + + + int glXQueryContextInfoEXT + Display *dpy + GLXContext context + int attribute + int *value + + + Bool glXQueryCurrentRendererIntegerMESA + int attribute + unsigned int *value + + + const char *glXQueryCurrentRendererStringMESA + int attribute + + + void glXQueryDrawable + Display *dpy + GLXDrawable draw + int attribute + unsigned int *value + + + Bool glXQueryExtension + Display *dpy + int *errorb + int *event + + + const char *glXQueryExtensionsString + Display *dpy + int screen + + + Bool glXQueryFrameCountNV + Display *dpy + int screen + GLuint *count + + + void glXQueryGLXPbufferSGIX + Display *dpy + GLXPbufferSGIX pbuf + int attribute + unsigned int *value + + + int glXQueryHyperpipeAttribSGIX + Display *dpy + int timeSlice + int attrib + int size + void *returnAttribList + + + int glXQueryHyperpipeBestAttribSGIX + Display *dpy + int timeSlice + int attrib + int size + void *attribList + void *returnAttribList + + + GLXHyperpipeConfigSGIX *glXQueryHyperpipeConfigSGIX + Display *dpy + int hpId + int *npipes + + + GLXHyperpipeNetworkSGIX *glXQueryHyperpipeNetworkSGIX + Display *dpy + int *npipes + + + Bool glXQueryMaxSwapBarriersSGIX + Display *dpy + int screen + int *max + + + Bool glXQueryMaxSwapGroupsNV + Display *dpy + int screen + GLuint *maxGroups + GLuint *maxBarriers + + + Bool glXQueryRendererIntegerMESA + Display *dpy + int screen + int renderer + int attribute + unsigned int *value + + + const char *glXQueryRendererStringMESA + Display *dpy + int screen + int renderer + int attribute + + + const char *glXQueryServerString + Display *dpy + int screen + int name + + + Bool glXQuerySwapGroupNV + Display *dpy + GLXDrawable drawable + GLuint *group + GLuint *barrier + + + Bool glXQueryVersion + Display *dpy + int *maj + int *min + + + int glXQueryVideoCaptureDeviceNV + Display *dpy + GLXVideoCaptureDeviceNV device + int attribute + int *value + + + Bool glXReleaseBuffersMESA + Display *dpy + GLXDrawable drawable + + + void glXReleaseTexImageEXT + Display *dpy + GLXDrawable drawable + int buffer + + + void glXReleaseVideoCaptureDeviceNV + Display *dpy + GLXVideoCaptureDeviceNV device + + + int glXReleaseVideoDeviceNV + Display *dpy + int screen + GLXVideoDeviceNV VideoDevice + + + int glXReleaseVideoImageNV + Display *dpy + GLXPbuffer pbuf + + + Bool glXResetFrameCountNV + Display *dpy + int screen + + + void glXSelectEvent + Display *dpy + GLXDrawable draw + unsigned long event_mask + + + void glXSelectEventSGIX + Display *dpy + GLXDrawable drawable + unsigned long mask + + + int glXSendPbufferToVideoNV + Display *dpy + GLXPbuffer pbuf + int iBufferType + unsigned long *pulCounterPbuffer + GLboolean bBlock + + + GLboolean glXSet3DfxModeMESA + GLint mode + + + void glXSwapBuffers + Display *dpy + GLXDrawable drawable + + + int64_t glXSwapBuffersMscOML + Display *dpy + GLXDrawable drawable + int64_t target_msc + int64_t divisor + int64_t remainder + + + int glXSwapIntervalMESA + unsigned int interval + + + void glXSwapIntervalEXT + Display *dpy + GLXDrawable drawable + int interval + + + int glXSwapIntervalSGI + int interval + + + void glXUseXFont + Font font + int first + int count + int list + + + Bool glXWaitForMscOML + Display *dpy + GLXDrawable drawable + int64_t target_msc + int64_t divisor + int64_t remainder + int64_t *ust + int64_t *msc + int64_t *sbc + + + Bool glXWaitForSbcOML + Display *dpy + GLXDrawable drawable + int64_t target_sbc + int64_t *ust + int64_t *msc + int64_t *sbc + + + void glXWaitGL + + + int glXWaitVideoSyncSGI + int divisor + int remainder + unsigned int *count + + + void glXWaitX + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/local/recipes/libs/libepoxy/source/registry/wgl.xml b/local/recipes/libs/libepoxy/source/registry/wgl.xml new file mode 100644 index 0000000000..87e8fe2209 --- /dev/null +++ b/local/recipes/libs/libepoxy/source/registry/wgl.xml @@ -0,0 +1,2003 @@ + + + +Copyright (c) 2013-2018 The Khronos Group Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +------------------------------------------------------------------------ + +This file, wgl.xml, is the WGL API Registry. The older ".spec" file +format has been retired and will no longer be updated with new +extensions and API versions. The canonical version of the registry, +together with documentation, schema, and Python generator scripts used +to generate C header files for WGL, can always be found in the Khronos +Registry at + https://github.com/KhronosGroup/OpenGL-Registry + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + struct _GPU_DEVICE { + DWORD cb; + CHAR DeviceName[32]; + CHAR DeviceString[128]; + DWORD Flags; + RECT rcVirtualScreen; +}; + + DECLARE_HANDLE(HPBUFFERARB); + DECLARE_HANDLE(HPBUFFEREXT); + DECLARE_HANDLE(HVIDEOOUTPUTDEVICENV); + DECLARE_HANDLE(HPVIDEODEV); + DECLARE_HANDLE(HPGPUNV); + DECLARE_HANDLE(HGPUNV); + DECLARE_HANDLE(HVIDEOINPUTDEVICENV); + typedef struct _GPU_DEVICE GPU_DEVICE; + typedef struct _GPU_DEVICE *PGPU_DEVICE; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + int ChoosePixelFormat + HDC hDc + const PIXELFORMATDESCRIPTOR *pPfd + + + int DescribePixelFormat + HDC hdc + int ipfd + UINT cjpfd + const PIXELFORMATDESCRIPTOR *ppfd + + + int GetPixelFormat + HDC hdc + + + BOOL SetPixelFormat + HDC hdc + int ipfd + const PIXELFORMATDESCRIPTOR *ppfd + + + BOOL SwapBuffers + HDC hdc + + + void *wglAllocateMemoryNV + GLsizei size + GLfloat readfreq + GLfloat writefreq + GLfloat priority + + + BOOL wglAssociateImageBufferEventsI3D + HDC hDC + const HANDLE *pEvent + const LPVOID *pAddress + const DWORD *pSize + UINT count + + + BOOL wglBeginFrameTrackingI3D + + + GLboolean wglBindDisplayColorTableEXT + GLushort id + + + BOOL wglBindSwapBarrierNV + GLuint group + GLuint barrier + + + BOOL wglBindTexImageARB + HPBUFFERARB hPbuffer + int iBuffer + + + BOOL wglBindVideoCaptureDeviceNV + UINT uVideoSlot + HVIDEOINPUTDEVICENV hDevice + + + BOOL wglBindVideoDeviceNV + HDC hDc + unsigned int uVideoSlot + HVIDEOOUTPUTDEVICENV hVideoDevice + const int *piAttribList + + + BOOL wglBindVideoImageNV + HPVIDEODEV hVideoDevice + HPBUFFERARB hPbuffer + int iVideoBuffer + + + VOID wglBlitContextFramebufferAMD + HGLRC dstCtx + GLint srcX0 + GLint srcY0 + GLint srcX1 + GLint srcY1 + GLint dstX0 + GLint dstY0 + GLint dstX1 + GLint dstY1 + GLbitfield mask + GLenum filter + + + BOOL wglChoosePixelFormatARB + HDC hdc + const int *piAttribIList + const FLOAT *pfAttribFList + UINT nMaxFormats + int *piFormats + UINT *nNumFormats + + + BOOL wglChoosePixelFormatEXT + HDC hdc + const int *piAttribIList + const FLOAT *pfAttribFList + UINT nMaxFormats + int *piFormats + UINT *nNumFormats + + + BOOL wglCopyContext + HGLRC hglrcSrc + HGLRC hglrcDst + UINT mask + + + BOOL wglCopyImageSubDataNV + HGLRC hSrcRC + GLuint srcName + GLenum srcTarget + GLint srcLevel + GLint srcX + GLint srcY + GLint srcZ + HGLRC hDstRC + GLuint dstName + GLenum dstTarget + GLint dstLevel + GLint dstX + GLint dstY + GLint dstZ + GLsizei width + GLsizei height + GLsizei depth + + + HDC wglCreateAffinityDCNV + const HGPUNV *phGpuList + + + HGLRC wglCreateAssociatedContextAMD + UINT id + + + HGLRC wglCreateAssociatedContextAttribsAMD + UINT id + HGLRC hShareContext + const int *attribList + + + HANDLE wglCreateBufferRegionARB + HDC hDC + int iLayerPlane + UINT uType + + + HGLRC wglCreateContext + HDC hDc + + + HGLRC wglCreateContextAttribsARB + HDC hDC + HGLRC hShareContext + const int *attribList + + + GLboolean wglCreateDisplayColorTableEXT + GLushort id + + + LPVOID wglCreateImageBufferI3D + HDC hDC + DWORD dwSize + UINT uFlags + + + HGLRC wglCreateLayerContext + HDC hDc + int level + + + HPBUFFERARB wglCreatePbufferARB + HDC hDC + int iPixelFormat + int iWidth + int iHeight + const int *piAttribList + + + HPBUFFEREXT wglCreatePbufferEXT + HDC hDC + int iPixelFormat + int iWidth + int iHeight + const int *piAttribList + + + BOOL wglDelayBeforeSwapNV + HDC hDC + GLfloat seconds + + + BOOL wglDeleteAssociatedContextAMD + HGLRC hglrc + + + VOID wglDeleteBufferRegionARB + HANDLE hRegion + + + BOOL wglDeleteContext + HGLRC oldContext + + + BOOL wglDeleteDCNV + HDC hdc + + + BOOL wglDescribeLayerPlane + HDC hDc + int pixelFormat + int layerPlane + UINT nBytes + const LAYERPLANEDESCRIPTOR *plpd + + + VOID wglDestroyDisplayColorTableEXT + GLushort id + + + BOOL wglDestroyImageBufferI3D + HDC hDC + LPVOID pAddress + + + BOOL wglDestroyPbufferARB + HPBUFFERARB hPbuffer + + + BOOL wglDestroyPbufferEXT + HPBUFFEREXT hPbuffer + + + BOOL wglDisableFrameLockI3D + + + BOOL wglDisableGenlockI3D + HDC hDC + + + BOOL wglDXCloseDeviceNV + HANDLE hDevice + + + BOOL wglDXLockObjectsNV + HANDLE hDevice + GLint count + HANDLE *hObjects + + + BOOL wglDXObjectAccessNV + HANDLE hObject + GLenum access + + + HANDLE wglDXOpenDeviceNV + void *dxDevice + + + HANDLE wglDXRegisterObjectNV + HANDLE hDevice + void *dxObject + GLuint name + GLenum type + GLenum access + + + BOOL wglDXSetResourceShareHandleNV + void *dxObject + HANDLE shareHandle + + + BOOL wglDXUnlockObjectsNV + HANDLE hDevice + GLint count + HANDLE *hObjects + + + BOOL wglDXUnregisterObjectNV + HANDLE hDevice + HANDLE hObject + + + BOOL wglEnableFrameLockI3D + + + BOOL wglEnableGenlockI3D + HDC hDC + + + BOOL wglEndFrameTrackingI3D + + + UINT wglEnumerateVideoCaptureDevicesNV + HDC hDc + HVIDEOINPUTDEVICENV *phDeviceList + + + int wglEnumerateVideoDevicesNV + HDC hDc + HVIDEOOUTPUTDEVICENV *phDeviceList + + + BOOL wglEnumGpuDevicesNV + HGPUNV hGpu + UINT iDeviceIndex + PGPU_DEVICE lpGpuDevice + + + BOOL wglEnumGpusFromAffinityDCNV + HDC hAffinityDC + UINT iGpuIndex + HGPUNV *hGpu + + + BOOL wglEnumGpusNV + UINT iGpuIndex + HGPUNV *phGpu + + + void wglFreeMemoryNV + void *pointer + + + BOOL wglGenlockSampleRateI3D + HDC hDC + UINT uRate + + + BOOL wglGenlockSourceDelayI3D + HDC hDC + UINT uDelay + + + BOOL wglGenlockSourceEdgeI3D + HDC hDC + UINT uEdge + + + BOOL wglGenlockSourceI3D + HDC hDC + UINT uSource + + + UINT wglGetContextGPUIDAMD + HGLRC hglrc + + + HGLRC wglGetCurrentAssociatedContextAMD + + + HGLRC wglGetCurrentContext + + + HDC wglGetCurrentDC + + + HDC wglGetCurrentReadDCARB + + + HDC wglGetCurrentReadDCEXT + + + PROC wglGetDefaultProcAddress + LPCSTR lpszProc + + + BOOL wglGetDigitalVideoParametersI3D + HDC hDC + int iAttribute + int *piValue + + + UINT GetEnhMetaFilePixelFormat + HENHMETAFILE hemf + const PIXELFORMATDESCRIPTOR *ppfd + + + const char *wglGetExtensionsStringARB + HDC hdc + + + const char *wglGetExtensionsStringEXT + + + BOOL wglGetFrameUsageI3D + float *pUsage + + + BOOL wglGetGammaTableI3D + HDC hDC + int iEntries + USHORT *puRed + USHORT *puGreen + USHORT *puBlue + + + BOOL wglGetGammaTableParametersI3D + HDC hDC + int iAttribute + int *piValue + + + BOOL wglGetGenlockSampleRateI3D + HDC hDC + UINT *uRate + + + BOOL wglGetGenlockSourceDelayI3D + HDC hDC + UINT *uDelay + + + BOOL wglGetGenlockSourceEdgeI3D + HDC hDC + UINT *uEdge + + + BOOL wglGetGenlockSourceI3D + HDC hDC + UINT *uSource + + + UINT wglGetGPUIDsAMD + UINT maxCount + UINT *ids + + + INT wglGetGPUInfoAMD + UINT id + INT property + GLenum dataType + UINT size + void *data + + + int wglGetLayerPaletteEntries + HDC hdc + int iLayerPlane + int iStart + int cEntries + const COLORREF *pcr + + + BOOL wglGetMscRateOML + HDC hdc + INT32 *numerator + INT32 *denominator + + + HDC wglGetPbufferDCARB + HPBUFFERARB hPbuffer + + + HDC wglGetPbufferDCEXT + HPBUFFEREXT hPbuffer + + + BOOL wglGetPixelFormatAttribfvARB + HDC hdc + int iPixelFormat + int iLayerPlane + UINT nAttributes + const int *piAttributes + FLOAT *pfValues + + + BOOL wglGetPixelFormatAttribfvEXT + HDC hdc + int iPixelFormat + int iLayerPlane + UINT nAttributes + int *piAttributes + FLOAT *pfValues + + + BOOL wglGetPixelFormatAttribivARB + HDC hdc + int iPixelFormat + int iLayerPlane + UINT nAttributes + const int *piAttributes + int *piValues + + + BOOL wglGetPixelFormatAttribivEXT + HDC hdc + int iPixelFormat + int iLayerPlane + UINT nAttributes + int *piAttributes + int *piValues + + + PROC wglGetProcAddress + LPCSTR lpszProc + + + int wglGetSwapIntervalEXT + + + BOOL wglGetSyncValuesOML + HDC hdc + INT64 *ust + INT64 *msc + INT64 *sbc + + + BOOL wglGetVideoDeviceNV + HDC hDC + int numDevices + HPVIDEODEV *hVideoDevice + + + BOOL wglGetVideoInfoNV + HPVIDEODEV hpVideoDevice + unsigned long *pulCounterOutputPbuffer + unsigned long *pulCounterOutputVideo + + + BOOL wglIsEnabledFrameLockI3D + BOOL *pFlag + + + BOOL wglIsEnabledGenlockI3D + HDC hDC + BOOL *pFlag + + + BOOL wglJoinSwapGroupNV + HDC hDC + GLuint group + + + GLboolean wglLoadDisplayColorTableEXT + const GLushort *table + GLuint length + + + BOOL wglLockVideoCaptureDeviceNV + HDC hDc + HVIDEOINPUTDEVICENV hDevice + + + BOOL wglMakeAssociatedContextCurrentAMD + HGLRC hglrc + + + BOOL wglMakeContextCurrentARB + HDC hDrawDC + HDC hReadDC + HGLRC hglrc + + + BOOL wglMakeContextCurrentEXT + HDC hDrawDC + HDC hReadDC + HGLRC hglrc + + + BOOL wglMakeCurrent + HDC hDc + HGLRC newContext + + + BOOL wglQueryCurrentContextNV + int iAttribute + int *piValue + + + BOOL wglQueryFrameCountNV + HDC hDC + GLuint *count + + + BOOL wglQueryFrameLockMasterI3D + BOOL *pFlag + + + BOOL wglQueryFrameTrackingI3D + DWORD *pFrameCount + DWORD *pMissedFrames + float *pLastMissedUsage + + + BOOL wglQueryGenlockMaxSourceDelayI3D + HDC hDC + UINT *uMaxLineDelay + UINT *uMaxPixelDelay + + + BOOL wglQueryMaxSwapGroupsNV + HDC hDC + GLuint *maxGroups + GLuint *maxBarriers + + + BOOL wglQueryPbufferARB + HPBUFFERARB hPbuffer + int iAttribute + int *piValue + + + BOOL wglQueryPbufferEXT + HPBUFFEREXT hPbuffer + int iAttribute + int *piValue + + + BOOL wglQuerySwapGroupNV + HDC hDC + GLuint *group + GLuint *barrier + + + BOOL wglQueryVideoCaptureDeviceNV + HDC hDc + HVIDEOINPUTDEVICENV hDevice + int iAttribute + int *piValue + + + BOOL wglRealizeLayerPalette + HDC hdc + int iLayerPlane + BOOL bRealize + + + BOOL wglReleaseImageBufferEventsI3D + HDC hDC + const LPVOID *pAddress + UINT count + + + int wglReleasePbufferDCARB + HPBUFFERARB hPbuffer + HDC hDC + + + int wglReleasePbufferDCEXT + HPBUFFEREXT hPbuffer + HDC hDC + + + BOOL wglReleaseTexImageARB + HPBUFFERARB hPbuffer + int iBuffer + + + BOOL wglReleaseVideoCaptureDeviceNV + HDC hDc + HVIDEOINPUTDEVICENV hDevice + + + BOOL wglReleaseVideoDeviceNV + HPVIDEODEV hVideoDevice + + + BOOL wglReleaseVideoImageNV + HPBUFFERARB hPbuffer + int iVideoBuffer + + + BOOL wglResetFrameCountNV + HDC hDC + + + BOOL wglRestoreBufferRegionARB + HANDLE hRegion + int x + int y + int width + int height + int xSrc + int ySrc + + + BOOL wglSaveBufferRegionARB + HANDLE hRegion + int x + int y + int width + int height + + + BOOL wglSendPbufferToVideoNV + HPBUFFERARB hPbuffer + int iBufferType + unsigned long *pulCounterPbuffer + BOOL bBlock + + + BOOL wglSetDigitalVideoParametersI3D + HDC hDC + int iAttribute + const int *piValue + + + BOOL wglSetGammaTableI3D + HDC hDC + int iEntries + const USHORT *puRed + const USHORT *puGreen + const USHORT *puBlue + + + BOOL wglSetGammaTableParametersI3D + HDC hDC + int iAttribute + const int *piValue + + + int wglSetLayerPaletteEntries + HDC hdc + int iLayerPlane + int iStart + int cEntries + const COLORREF *pcr + + + BOOL wglSetPbufferAttribARB + HPBUFFERARB hPbuffer + const int *piAttribList + + + BOOL wglSetStereoEmitterState3DL + HDC hDC + UINT uState + + + BOOL wglShareLists + HGLRC hrcSrvShare + HGLRC hrcSrvSource + + + INT64 wglSwapBuffersMscOML + HDC hdc + INT64 target_msc + INT64 divisor + INT64 remainder + + + BOOL wglSwapLayerBuffers + HDC hdc + UINT fuFlags + + + BOOL wglSwapIntervalEXT + int interval + + + INT64 wglSwapLayerBuffersMscOML + HDC hdc + INT fuPlanes + INT64 target_msc + INT64 divisor + INT64 remainder + + + BOOL wglUseFontBitmaps + HDC hDC + DWORD first + DWORD count + DWORD listBase + + + BOOL wglUseFontBitmapsA + HDC hDC + DWORD first + DWORD count + DWORD listBase + + + BOOL wglUseFontBitmapsW + HDC hDC + DWORD first + DWORD count + DWORD listBase + + + BOOL wglUseFontOutlines + HDC hDC + DWORD first + DWORD count + DWORD listBase + FLOAT deviation + FLOAT extrusion + int format + LPGLYPHMETRICSFLOAT lpgmf + + + BOOL wglUseFontOutlinesA + HDC hDC + DWORD first + DWORD count + DWORD listBase + FLOAT deviation + FLOAT extrusion + int format + LPGLYPHMETRICSFLOAT lpgmf + + + BOOL wglUseFontOutlinesW + HDC hDC + DWORD first + DWORD count + DWORD listBase + FLOAT deviation + FLOAT extrusion + int format + LPGLYPHMETRICSFLOAT lpgmf + + + BOOL wglWaitForMscOML + HDC hdc + INT64 target_msc + INT64 divisor + INT64 remainder + INT64 *ust + INT64 *msc + INT64 *sbc + + + BOOL wglWaitForSbcOML + HDC hdc + INT64 target_sbc + INT64 *ust + INT64 *msc + INT64 *sbc + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/local/recipes/libs/libepoxy/source/src/dispatch_common.c b/local/recipes/libs/libepoxy/source/src/dispatch_common.c new file mode 100644 index 0000000000..dd7cf699f3 --- /dev/null +++ b/local/recipes/libs/libepoxy/source/src/dispatch_common.c @@ -0,0 +1,926 @@ +/* + * Copyright © 2013-2014 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +/** + * \mainpage Epoxy + * + * \section intro_sec Introduction + * + * Epoxy is a library for handling OpenGL function pointer management for + * you. + * + * It hides the complexity of `dlopen()`, `dlsym()`, `glXGetProcAddress()`, + * `eglGetProcAddress()`, etc. from the app developer, with very little + * knowledge needed on their part. They get to read GL specs and write + * code using undecorated function names like `glCompileShader()`. + * + * Don't forget to check for your extensions or versions being present + * before you use them, just like before! We'll tell you what you forgot + * to check for instead of just segfaulting, though. + * + * \section features_sec Features + * + * - Automatically initializes as new GL functions are used. + * - GL 4.6 core and compatibility context support. + * - GLES 1/2/3 context support. + * - Knows about function aliases so (e.g.) `glBufferData()` can be + * used with `GL_ARB_vertex_buffer_object` implementations, along + * with GL 1.5+ implementations. + * - EGL, GLX, and WGL support. + * - Can be mixed with non-epoxy GL usage. + * + * \section using_sec Using Epoxy + * + * Using Epoxy should be as easy as replacing: + * + * ```cpp + * #include + * #include + * #include + * ``` + * + * with: + * + * ```cpp + * #include + * #include + * ``` + * + * \subsection using_include_sec Headers + * + * Epoxy comes with the following public headers: + * + * - `epoxy/gl.h` - For GL API + * - `epoxy/egl.h` - For EGL API + * - `epoxy/glx.h` - For GLX API + * - `epoxy/wgl.h` - For WGL API + * + * \section links_sec Additional links + * + * The latest version of the Epoxy code is available on [GitHub](https://github.com/anholt/libepoxy). + * + * For bug reports and enhancements, please use the [Issues](https://github.com/anholt/libepoxy/issues) + * link. + * + * The scope of this API reference does not include the documentation for + * OpenGL and OpenGL ES. For more information on those programming interfaces + * please visit: + * + * - [Khronos](https://www.khronos.org/) + * - [OpenGL page on Khronos.org](https://www.khronos.org/opengl/) + * - [OpenGL ES page on Khronos.org](https://www.khronos.org/opengles/) + * - [docs.GL](http://docs.gl/) + */ + +/** + * @file dispatch_common.c + * + * @brief Implements common code shared by the generated GL/EGL/GLX dispatch code. + * + * A collection of some important specs on getting GL function pointers. + * + * From the linux GL ABI (http://www.opengl.org/registry/ABI/): + * + * "3.4. The libraries must export all OpenGL 1.2, GLU 1.3, GLX 1.3, and + * ARB_multitexture entry points statically. + * + * 3.5. Because non-ARB extensions vary so widely and are constantly + * increasing in number, it's infeasible to require that they all be + * supported, and extensions can always be added to hardware drivers + * after the base link libraries are released. These drivers are + * dynamically loaded by libGL, so extensions not in the base + * library must also be obtained dynamically. + * + * 3.6. To perform the dynamic query, libGL also must export an entry + * point called + * + * void (*glXGetProcAddressARB(const GLubyte *))(); + * + * The full specification of this function is available separately. It + * takes the string name of a GL or GLX entry point and returns a pointer + * to a function implementing that entry point. It is functionally + * identical to the wglGetProcAddress query defined by the Windows OpenGL + * library, except that the function pointers returned are context + * independent, unlike the WGL query." + * + * From the EGL 1.4 spec: + * + * "Client API function pointers returned by eglGetProcAddress are + * independent of the display and the currently bound client API context, + * and may be used by any client API context which supports the extension. + * + * eglGetProcAddress may be queried for all of the following functions: + * + * • All EGL and client API extension functions supported by the + * implementation (whether those extensions are supported by the current + * client API context or not). This includes any mandatory OpenGL ES + * extensions. + * + * eglGetProcAddress may not be queried for core (non-extension) functions + * in EGL or client APIs 20 . + * + * For functions that are queryable with eglGetProcAddress, + * implementations may choose to also export those functions statically + * from the object libraries im- plementing those functions. However, + * portable clients cannot rely on this behavior. + * + * From the GLX 1.4 spec: + * + * "glXGetProcAddress may be queried for all of the following functions: + * + * • All GL and GLX extension functions supported by the implementation + * (whether those extensions are supported by the current context or + * not). + * + * • All core (non-extension) functions in GL and GLX from version 1.0 up + * to and including the versions of those specifications supported by + * the implementation, as determined by glGetString(GL VERSION) and + * glXQueryVersion queries." + */ + +#include +#include +#ifdef _WIN32 +#include +#else +#include +#include +#include +#endif +#include +#include +#include + +#include "dispatch_common.h" + +#if defined(__APPLE__) +#define GLX_LIB "/opt/X11/lib/libGL.1.dylib" +#define OPENGL_LIB "/System/Library/Frameworks/OpenGL.framework/Versions/Current/OpenGL" +#define GLES1_LIB "libGLESv1_CM.so" +#define GLES2_LIB "libGLESv2.so" +#elif defined(__ANDROID__) +#define GLX_LIB "libGLESv2.so" +#define EGL_LIB "libEGL.so" +#define GLES1_LIB "libGLESv1_CM.so" +#define GLES2_LIB "libGLESv2.so" +#elif defined(_WIN32) +#define EGL_LIB "libEGL.dll" +#define GLES1_LIB "libGLES_CM.dll" +#define GLES2_LIB "libGLESv2.dll" +#define OPENGL_LIB "OPENGL32" +#else +#define GLVND_GLX_LIB "libGLX.so.1" +#define GLX_LIB "libGL.so.1" +#define EGL_LIB "libEGL.so.1" +#define GLES1_LIB "libGLESv1_CM.so.1" +#define GLES2_LIB "libGLESv2.so.2" +#define OPENGL_LIB "libOpenGL.so.0" +#endif + +#ifdef __GNUC__ +#define CONSTRUCT(_func) static void _func (void) __attribute__((constructor)); +#define DESTRUCT(_func) static void _func (void) __attribute__((destructor)); +#elif defined (_MSC_VER) && (_MSC_VER >= 1500) +#define CONSTRUCT(_func) \ + static void _func(void); \ + static int _func ## _wrapper(void) { _func(); return 0; } \ + __pragma(section(".CRT$XCU",read)) \ + __declspec(allocate(".CRT$XCU")) static int (* _array ## _func)(void) = _func ## _wrapper; + +#define DESTRUCT(_func) \ + static void _func(void); \ + static int _func ## _constructor(void) { atexit (_func); return 0; } \ + __pragma(section(".CRT$XCU",read)) \ + __declspec(allocate(".CRT$XCU")) static int (* _array ## _func)(void) = _func ## _constructor; + +#else +#error "You will need constructor support for your compiler" +#endif + +struct api { +#ifndef _WIN32 + /* + * Locking for making sure we don't double-dlopen(). + */ + pthread_mutex_t mutex; +#endif + + /* + * dlopen() return value for the GLX API. This is libGLX.so.1 if the + * runtime is glvnd-enabled, else libGL.so.1 + */ + void *glx_handle; + + /* + * dlopen() return value for the desktop GL library. + * + * On Windows this is OPENGL32. On OSX this is classic libGL. On Linux + * this is either libOpenGL (if the runtime is glvnd-enabled) or + * classic libGL.so.1 + */ + void *gl_handle; + + /* dlopen() return value for libEGL.so.1 */ + void *egl_handle; + + /* dlopen() return value for libGLESv1_CM.so.1 */ + void *gles1_handle; + + /* dlopen() return value for libGLESv2.so.2 */ + void *gles2_handle; + + /* + * This value gets incremented when any thread is in + * glBegin()/glEnd() called through epoxy. + * + * We're not guaranteed to be called through our wrapper, so the + * conservative paths also try to handle the failure cases they'll + * see if begin_count didn't reflect reality. It's also a bit of + * a bug that the conservative paths might return success because + * some other thread was in epoxy glBegin/glEnd while our thread + * is trying to resolve, but given that it's basically just for + * informative error messages, we shouldn't need to care. + */ + long begin_count; +}; + +static struct api api = {0}; + +static bool library_initialized; + +static bool epoxy_current_context_is_glx(void); + +#if PLATFORM_HAS_EGL +static EGLenum +epoxy_egl_get_current_gl_context_api(void); +#endif + +CONSTRUCT (library_init) + +static void +library_init(void) +{ + library_initialized = true; +} + +static bool +get_dlopen_handle(void **handle, const char *lib_name, bool exit_on_fail, bool load) +{ + if (*handle) + return true; + + if (!library_initialized) { + fputs("Attempting to dlopen() while in the dynamic linker.\n", stderr); + abort(); + } + +#ifdef _WIN32 + *handle = LoadLibraryA(lib_name); +#else + pthread_mutex_lock(&api.mutex); + if (!*handle) { + int flags = RTLD_LAZY | RTLD_LOCAL; + if (!load) + flags |= RTLD_NOLOAD; + + *handle = dlopen(lib_name, flags); + if (!*handle) { + if (exit_on_fail) { + fprintf(stderr, "Couldn't open %s: %s\n", lib_name, dlerror()); + abort(); + } else { + (void)dlerror(); + } + } + } + pthread_mutex_unlock(&api.mutex); +#endif + + return *handle != NULL; +} + +static void * +do_dlsym(void **handle, const char *name, bool exit_on_fail) +{ + void *result; + const char *error = ""; + +#ifdef _WIN32 + result = GetProcAddress(*handle, name); +#else + result = dlsym(*handle, name); + if (!result) + error = dlerror(); +#endif + if (!result && exit_on_fail) { + fprintf(stderr, "%s() not found: %s\n", name, error); + abort(); + } + + return result; +} + +/** + * @brief Checks whether we're using OpenGL or OpenGL ES + * + * @return `true` if we're using OpenGL + */ +bool +epoxy_is_desktop_gl(void) +{ + const char *es_prefix = "OpenGL ES"; + const char *version; + +#if PLATFORM_HAS_EGL + /* PowerVR's OpenGL ES implementation (and perhaps other) don't + * comply with the standard, which states that + * "glGetString(GL_VERSION)" should return a string starting with + * "OpenGL ES". Therefore, to distinguish desktop OpenGL from + * OpenGL ES, we must also check the context type through EGL (we + * can do that as PowerVR is only usable through EGL). + */ + if (!epoxy_current_context_is_glx()) { + switch (epoxy_egl_get_current_gl_context_api()) { + case EGL_OPENGL_API: return true; + case EGL_OPENGL_ES_API: return false; + case EGL_NONE: + default: break; + } + } +#endif + + if (api.begin_count) + return true; + + version = (const char *)glGetString(GL_VERSION); + + /* If we didn't get a version back, there are only two things that + * could have happened: either malloc failure (which basically + * doesn't exist), or we were called within a glBegin()/glEnd(). + * Assume the second, which only exists for desktop GL. + */ + if (!version) + return true; + + return strncmp(es_prefix, version, strlen(es_prefix)); +} + +static int +epoxy_internal_gl_version(GLenum version_string, int error_version, int factor) +{ + const char *version = (const char *)glGetString(version_string); + GLint major, minor; + int scanf_count; + + if (!version) + return error_version; + + /* skip to version number */ + while (!isdigit(*version) && *version != '\0') + version++; + + /* Interpret version number */ + scanf_count = sscanf(version, "%i.%i", &major, &minor); + if (scanf_count != 2) { + fprintf(stderr, "Unable to interpret GL_VERSION string: %s\n", + version); + abort(); + } + + return factor * major + minor; +} + +/** + * @brief Returns the version of OpenGL we are using + * + * The version is encoded as: + * + * ``` + * + * version = major * 10 + minor + * + * ``` + * + * So it can be easily used for version comparisons. + * + * @return The encoded version of OpenGL we are using + */ +int +epoxy_gl_version(void) +{ + return epoxy_internal_gl_version(GL_VERSION, 0, 10); +} + +int +epoxy_conservative_gl_version(void) +{ + if (api.begin_count) + return 100; + + return epoxy_internal_gl_version(GL_VERSION, 100, 10); +} + +/** + * @brief Returns the version of the GL Shading Language we are using + * + * The version is encoded as: + * + * ``` + * + * version = major * 100 + minor + * + * ``` + * + * So it can be easily used for version comparisons. + * + * @return The encoded version of the GL Shading Language we are using + */ +int +epoxy_glsl_version(void) +{ + if (epoxy_gl_version() >= 20 || + epoxy_has_gl_extension ("GL_ARB_shading_language_100")) + return epoxy_internal_gl_version(GL_SHADING_LANGUAGE_VERSION, 0, 100); + + return 0; +} + +/** + * @brief Checks for the presence of an extension in an OpenGL extension string + * + * @param extension_list The string containing the list of extensions to check + * @param ext The name of the GL extension + * @return `true` if the extension is available' + * + * @note If you are looking to check whether a normal GL, EGL or GLX extension + * is supported by the client, this probably isn't the function you want. + * + * Some parts of the spec for OpenGL and friends will return an OpenGL formatted + * extension string that is separate from the usual extension strings for the + * spec. This function provides easy parsing of those strings. + * + * @see epoxy_has_gl_extension() + * @see epoxy_has_egl_extension() + * @see epoxy_has_glx_extension() + */ +bool +epoxy_extension_in_string(const char *extension_list, const char *ext) +{ + const char *ptr = extension_list; + int len; + + if (!ext) + return false; + + len = strlen(ext); + + if (extension_list == NULL || *extension_list == '\0') + return false; + + /* Make sure that don't just find an extension with our name as a prefix. */ + while (true) { + ptr = strstr(ptr, ext); + if (!ptr) + return false; + + if (ptr[len] == ' ' || ptr[len] == 0) + return true; + ptr += len; + } +} + +static bool +epoxy_internal_has_gl_extension(const char *ext, bool invalid_op_mode) +{ + if (epoxy_gl_version() < 30) { + const char *exts = (const char *)glGetString(GL_EXTENSIONS); + if (!exts) + return invalid_op_mode; + return epoxy_extension_in_string(exts, ext); + } else { + int num_extensions; + int i; + + glGetIntegerv(GL_NUM_EXTENSIONS, &num_extensions); + if (num_extensions == 0) + return invalid_op_mode; + + for (i = 0; i < num_extensions; i++) { + const char *gl_ext = (const char *)glGetStringi(GL_EXTENSIONS, i); + if (!gl_ext) + return false; + if (strcmp(ext, gl_ext) == 0) + return true; + } + + return false; + } +} + +bool +epoxy_load_glx(bool exit_if_fails, bool load) +{ +#if PLATFORM_HAS_GLX +# ifdef GLVND_GLX_LIB + /* prefer the glvnd library if it exists */ + if (!api.glx_handle) + get_dlopen_handle(&api.glx_handle, GLVND_GLX_LIB, false, load); +# endif + if (!api.glx_handle) + get_dlopen_handle(&api.glx_handle, GLX_LIB, exit_if_fails, load); +#endif + return api.glx_handle != NULL; +} + +void * +epoxy_conservative_glx_dlsym(const char *name, bool exit_if_fails) +{ +#if PLATFORM_HAS_GLX + if (epoxy_load_glx(exit_if_fails, exit_if_fails)) + return do_dlsym(&api.glx_handle, name, exit_if_fails); +#endif + return NULL; +} + +/** + * Tests whether the currently bound context is EGL or GLX, trying to + * avoid loading libraries unless necessary. + */ +static bool +epoxy_current_context_is_glx(void) +{ +#if !PLATFORM_HAS_GLX + return false; +#else + void *sym; + + sym = epoxy_conservative_glx_dlsym("glXGetCurrentContext", false); + if (sym) { + if (glXGetCurrentContext()) + return true; + } else { + (void)dlerror(); + } + +#if PLATFORM_HAS_EGL + sym = epoxy_conservative_egl_dlsym("eglGetCurrentContext", false); + if (sym) { + if (epoxy_egl_get_current_gl_context_api() != EGL_NONE) + return false; + } else { + (void)dlerror(); + } +#endif /* PLATFORM_HAS_EGL */ + + return false; +#endif /* PLATFORM_HAS_GLX */ +} + +/** + * @brief Returns true if the given GL extension is supported in the current context. + * + * @param ext The name of the GL extension + * @return `true` if the extension is available + * + * @note that this function can't be called from within `glBegin()` and `glEnd()`. + * + * @see epoxy_has_egl_extension() + * @see epoxy_has_glx_extension() + */ +bool +epoxy_has_gl_extension(const char *ext) +{ + return epoxy_internal_has_gl_extension(ext, false); +} + +bool +epoxy_conservative_has_gl_extension(const char *ext) +{ + if (api.begin_count) + return true; + + return epoxy_internal_has_gl_extension(ext, true); +} + +bool +epoxy_load_egl(bool exit_if_fails, bool load) +{ +#if PLATFORM_HAS_EGL + return get_dlopen_handle(&api.egl_handle, EGL_LIB, exit_if_fails, load); +#else + return false; +#endif +} + +void * +epoxy_conservative_egl_dlsym(const char *name, bool exit_if_fails) +{ +#if PLATFORM_HAS_EGL + if (epoxy_load_egl(exit_if_fails, exit_if_fails)) + return do_dlsym(&api.egl_handle, name, exit_if_fails); +#endif + return NULL; +} + +void * +epoxy_egl_dlsym(const char *name) +{ + return epoxy_conservative_egl_dlsym(name, true); +} + +void * +epoxy_glx_dlsym(const char *name) +{ + return epoxy_conservative_glx_dlsym(name, true); +} + +static void +epoxy_load_gl(void) +{ + if (api.gl_handle) + return; + +#if defined(_WIN32) || defined(__APPLE__) + get_dlopen_handle(&api.gl_handle, OPENGL_LIB, true, true); +#else + + // Prefer GLX_LIB over OPENGL_LIB to maintain existing behavior. + // Using the inverse ordering OPENGL_LIB -> GLX_LIB, causes issues such as: + // https://github.com/anholt/libepoxy/issues/240 (apitrace missing calls) + // https://github.com/anholt/libepoxy/issues/252 (Xorg boot crash) + get_dlopen_handle(&api.glx_handle, GLX_LIB, false, true); + api.gl_handle = api.glx_handle; + +#if defined(OPENGL_LIB) + if (!api.gl_handle) + get_dlopen_handle(&api.gl_handle, OPENGL_LIB, false, true); +#endif + + if (!api.gl_handle) { +#if defined(OPENGL_LIB) + fprintf(stderr, "Couldn't open %s or %s\n", GLX_LIB, OPENGL_LIB); +#else + fprintf(stderr, "Couldn't open %s\n", GLX_LIB); +#endif + abort(); + } + +#endif +} + +void * +epoxy_gl_dlsym(const char *name) +{ + epoxy_load_gl(); + + return do_dlsym(&api.gl_handle, name, true); +} + +void * +epoxy_gles1_dlsym(const char *name) +{ + if (epoxy_current_context_is_glx()) { + return epoxy_get_proc_address(name); + } else { + get_dlopen_handle(&api.gles1_handle, GLES1_LIB, true, true); + return do_dlsym(&api.gles1_handle, name, true); + } +} + +void * +epoxy_gles2_dlsym(const char *name) +{ + if (epoxy_current_context_is_glx()) { + return epoxy_get_proc_address(name); + } else { + get_dlopen_handle(&api.gles2_handle, GLES2_LIB, true, true); + return do_dlsym(&api.gles2_handle, name, true); + } +} + +/** + * Does the appropriate dlsym() or eglGetProcAddress() for GLES3 + * functions. + * + * Mesa interpreted GLES as intending that the GLES3 functions were + * available only through eglGetProcAddress() and not dlsym(), while + * ARM's Mali drivers interpreted GLES as intending that GLES3 + * functions were available only through dlsym() and not + * eglGetProcAddress(). Thanks, Khronos. + */ +void * +epoxy_gles3_dlsym(const char *name) +{ + if (epoxy_current_context_is_glx()) { + return epoxy_get_proc_address(name); + } else { + if (get_dlopen_handle(&api.gles2_handle, GLES2_LIB, false, true)) { + void *func = do_dlsym(&api.gles2_handle, name, false); + + if (func) + return func; + } + + return epoxy_get_proc_address(name); + } +} + +/** + * Performs either the dlsym or glXGetProcAddress()-equivalent for + * core functions in desktop GL. + */ +void * +epoxy_get_core_proc_address(const char *name, int core_version) +{ +#ifdef _WIN32 + int core_symbol_support = 11; +#elif defined(__ANDROID__) + /** + * All symbols must be resolved through eglGetProcAddress + * on Android + */ + int core_symbol_support = 0; +#else + int core_symbol_support = 12; +#endif + + if (core_version <= core_symbol_support) { + return epoxy_gl_dlsym(name); + } else { + return epoxy_get_proc_address(name); + } +} + +#if PLATFORM_HAS_EGL +static EGLenum +epoxy_egl_get_current_gl_context_api(void) +{ + EGLint curapi; + + if (eglQueryContext(eglGetCurrentDisplay(), eglGetCurrentContext(), + EGL_CONTEXT_CLIENT_TYPE, &curapi) == EGL_FALSE) { + (void)eglGetError(); + return EGL_NONE; + } + + return (EGLenum) curapi; +} +#endif /* PLATFORM_HAS_EGL */ + +/** + * Performs the dlsym() for the core GL 1.0 functions that we use for + * determining version and extension support for deciding on dlsym + * versus glXGetProcAddress() for all other functions. + * + * This needs to succeed on implementations without GLX (since + * glGetString() and glGetIntegerv() are both in GLES1/2 as well, and + * at call time we don't know for sure what API they're trying to use + * without inspecting contexts ourselves). + */ +void * +epoxy_get_bootstrap_proc_address(const char *name) +{ + /* If we already have a library that links to libglapi loaded, + * use that. + */ +#if PLATFORM_HAS_GLX + if (api.glx_handle && glXGetCurrentContext()) + return epoxy_gl_dlsym(name); +#endif + + /* If epoxy hasn't loaded any API-specific library yet, try to + * figure out what API the context is using and use that library, + * since future calls will also use that API (this prevents a + * non-X11 ES2 context from loading a bunch of X11 junk). + */ +#if PLATFORM_HAS_EGL + get_dlopen_handle(&api.egl_handle, EGL_LIB, false, true); + if (api.egl_handle) { + int version = 0; + switch (epoxy_egl_get_current_gl_context_api()) { + case EGL_OPENGL_API: + return epoxy_gl_dlsym(name); + case EGL_OPENGL_ES_API: + if (eglQueryContext(eglGetCurrentDisplay(), + eglGetCurrentContext(), + EGL_CONTEXT_CLIENT_VERSION, + &version)) { + if (version >= 2) + return epoxy_gles2_dlsym(name); + else + return epoxy_gles1_dlsym(name); + } + } + } +#endif /* PLATFORM_HAS_EGL */ + + /* Fall back to GLX */ + return epoxy_gl_dlsym(name); +} + +void * +epoxy_get_proc_address(const char *name) +{ +#if PLATFORM_HAS_EGL + GLenum egl_api = EGL_NONE; + + if (!epoxy_current_context_is_glx()) + egl_api = epoxy_egl_get_current_gl_context_api(); + + switch (egl_api) { + case EGL_OPENGL_API: + case EGL_OPENGL_ES_API: + return eglGetProcAddress(name); + case EGL_NONE: + break; + } +#endif + +#if defined(_WIN32) + return wglGetProcAddress(name); +#elif defined(__APPLE__) + return epoxy_gl_dlsym(name); +#elif PLATFORM_HAS_GLX + if (epoxy_current_context_is_glx()) + return glXGetProcAddressARB((const GLubyte *)name); + assert(0 && "Couldn't find current GLX or EGL context.\n"); +#endif + + return NULL; +} + +WRAPPER_VISIBILITY (void) +WRAPPER(epoxy_glBegin)(GLenum primtype) +{ +#ifdef _WIN32 + InterlockedIncrement(&api.begin_count); +#else + pthread_mutex_lock(&api.mutex); + api.begin_count++; + pthread_mutex_unlock(&api.mutex); +#endif + + epoxy_glBegin_unwrapped(primtype); +} + +WRAPPER_VISIBILITY (void) +WRAPPER(epoxy_glEnd)(void) +{ + epoxy_glEnd_unwrapped(); + +#ifdef _WIN32 + InterlockedDecrement(&api.begin_count); +#else + pthread_mutex_lock(&api.mutex); + api.begin_count--; + pthread_mutex_unlock(&api.mutex); +#endif +} + +PFNGLBEGINPROC epoxy_glBegin = epoxy_glBegin_wrapped; +PFNGLENDPROC epoxy_glEnd = epoxy_glEnd_wrapped; + +epoxy_resolver_failure_handler_t epoxy_resolver_failure_handler; + +/** + * Sets the function that will be called every time Epoxy fails to + * resolve a symbol. + * + * @param handler The new handler function + * @return The previous handler function + */ +epoxy_resolver_failure_handler_t +epoxy_set_resolver_failure_handler(epoxy_resolver_failure_handler_t handler) +{ +#ifdef _WIN32 + return InterlockedExchangePointer((void**)&epoxy_resolver_failure_handler, + handler); +#else + epoxy_resolver_failure_handler_t old; + pthread_mutex_lock(&api.mutex); + old = epoxy_resolver_failure_handler; + epoxy_resolver_failure_handler = handler; + pthread_mutex_unlock(&api.mutex); + return old; +#endif +} diff --git a/local/recipes/libs/libepoxy/source/src/dispatch_common.h b/local/recipes/libs/libepoxy/source/src/dispatch_common.h new file mode 100644 index 0000000000..a136943194 --- /dev/null +++ b/local/recipes/libs/libepoxy/source/src/dispatch_common.h @@ -0,0 +1,206 @@ +/* + * Copyright © 2013 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include "config.h" + +#ifdef _WIN32 +#define PLATFORM_HAS_EGL ENABLE_EGL +#define PLATFORM_HAS_GLX ENABLE_GLX +#define PLATFORM_HAS_WGL 1 +#elif defined(__APPLE__) +#define PLATFORM_HAS_EGL 0 +#define PLATFORM_HAS_GLX ENABLE_GLX +#define PLATFORM_HAS_WGL 0 +#elif defined(ANDROID) +#define PLATFORM_HAS_EGL ENABLE_EGL +#define PLATFORM_HAS_GLX 0 +#define PLATFORM_HAS_WGL 0 +#else +#define PLATFORM_HAS_EGL ENABLE_EGL +#define PLATFORM_HAS_GLX ENABLE_GLX +#define PLATFORM_HAS_WGL 0 +#endif + +#include "epoxy/gl.h" +#if PLATFORM_HAS_GLX +#include "epoxy/glx.h" +#endif +#if PLATFORM_HAS_EGL +# if !ENABLE_X11 +/* Disable including X11 headers if the X11 support was disabled at + * configuration time + */ +# define EGL_NO_X11 1 +/* Older versions of Mesa use this symbol to achieve the same result + * as EGL_NO_X11 + */ +# define MESA_EGL_NO_X11_HEADERS 1 +# endif +#include "epoxy/egl.h" +#endif +#if PLATFORM_HAS_WGL +#include "epoxy/wgl.h" +#endif + +#if defined(__GNUC__) +#define PACKED __attribute__((__packed__)) +#define ENDPACKED +#elif defined (_MSC_VER) +#define PACKED __pragma(pack(push,1)) +#define ENDPACKED __pragma(pack(pop)) +#else +#define PACKED +#define ENDPACKED +#endif + +/* On win32, we're going to need to keep a per-thread dispatch table, + * since the function pointers depend on the device and pixel format + * of the current context. + */ +#if defined(_WIN32) +#define USING_DISPATCH_TABLE 1 +#else +#define USING_DISPATCH_TABLE 0 +#endif + +#define UNWRAPPED_PROTO(x) (GLAPIENTRY *x) +#define WRAPPER_VISIBILITY(type) static type GLAPIENTRY +#define WRAPPER(x) x ## _wrapped + +#define GEN_GLOBAL_REWRITE_PTR(name, args, passthrough) \ + static void EPOXY_CALLSPEC \ + name##_global_rewrite_ptr args \ + { \ + if (name == (void *)name##_global_rewrite_ptr) \ + name = (void *)name##_resolver(); \ + name passthrough; \ + } + +#define GEN_GLOBAL_REWRITE_PTR_RET(ret, name, args, passthrough) \ + static ret EPOXY_CALLSPEC \ + name##_global_rewrite_ptr args \ + { \ + if (name == (void *)name##_global_rewrite_ptr) \ + name = (void *)name##_resolver(); \ + return name passthrough; \ + } + +#if USING_DISPATCH_TABLE +#define GEN_DISPATCH_TABLE_REWRITE_PTR(name, args, passthrough) \ + static void EPOXY_CALLSPEC \ + name##_dispatch_table_rewrite_ptr args \ + { \ + struct dispatch_table *dispatch_table = get_dispatch_table(); \ + \ + dispatch_table->name = (void *)name##_resolver(); \ + dispatch_table->name passthrough; \ + } + +#define GEN_DISPATCH_TABLE_REWRITE_PTR_RET(ret, name, args, passthrough) \ + static ret EPOXY_CALLSPEC \ + name##_dispatch_table_rewrite_ptr args \ + { \ + struct dispatch_table *dispatch_table = get_dispatch_table(); \ + \ + dispatch_table->name = (void *)name##_resolver(); \ + return dispatch_table->name passthrough; \ + } + +#define GEN_DISPATCH_TABLE_THUNK(name, args, passthrough) \ + static void EPOXY_CALLSPEC \ + name##_dispatch_table_thunk args \ + { \ + get_dispatch_table()->name passthrough; \ + } + +#define GEN_DISPATCH_TABLE_THUNK_RET(ret, name, args, passthrough) \ + static ret EPOXY_CALLSPEC \ + name##_dispatch_table_thunk args \ + { \ + return get_dispatch_table()->name passthrough; \ + } + +#else +#define GEN_DISPATCH_TABLE_REWRITE_PTR(name, args, passthrough) +#define GEN_DISPATCH_TABLE_REWRITE_PTR_RET(ret, name, args, passthrough) +#define GEN_DISPATCH_TABLE_THUNK(name, args, passthrough) +#define GEN_DISPATCH_TABLE_THUNK_RET(ret, name, args, passthrough) +#endif + +#define GEN_THUNKS(name, args, passthrough) \ + GEN_GLOBAL_REWRITE_PTR(name, args, passthrough) \ + GEN_DISPATCH_TABLE_REWRITE_PTR(name, args, passthrough) \ + GEN_DISPATCH_TABLE_THUNK(name, args, passthrough) + +#define GEN_THUNKS_RET(ret, name, args, passthrough) \ + GEN_GLOBAL_REWRITE_PTR_RET(ret, name, args, passthrough) \ + GEN_DISPATCH_TABLE_REWRITE_PTR_RET(ret, name, args, passthrough) \ + GEN_DISPATCH_TABLE_THUNK_RET(ret, name, args, passthrough) + +void *epoxy_egl_dlsym(const char *name); +void *epoxy_glx_dlsym(const char *name); +void *epoxy_gl_dlsym(const char *name); +void *epoxy_gles1_dlsym(const char *name); +void *epoxy_gles2_dlsym(const char *name); +void *epoxy_gles3_dlsym(const char *name); +void *epoxy_get_proc_address(const char *name); +void *epoxy_get_core_proc_address(const char *name, int core_version); +void *epoxy_get_bootstrap_proc_address(const char *name); + +int epoxy_conservative_gl_version(void); +bool epoxy_conservative_has_gl_extension(const char *name); +int epoxy_conservative_glx_version(void); +bool epoxy_conservative_has_glx_extension(const char *name); +int epoxy_conservative_egl_version(void); +bool epoxy_conservative_has_egl_extension(const char *name); +bool epoxy_conservative_has_wgl_extension(const char *name); +void *epoxy_conservative_egl_dlsym(const char *name, bool exit_if_fails); +void *epoxy_conservative_glx_dlsym(const char *name, bool exit_if_fails); + +bool epoxy_load_glx(bool exit_if_fails, bool load); +bool epoxy_load_egl(bool exit_if_fails, bool load); + +#define glBegin_unwrapped epoxy_glBegin_unwrapped +#define glEnd_unwrapped epoxy_glEnd_unwrapped +extern void UNWRAPPED_PROTO(glBegin_unwrapped)(GLenum primtype); +extern void UNWRAPPED_PROTO(glEnd_unwrapped)(void); + +extern epoxy_resolver_failure_handler_t epoxy_resolver_failure_handler; + +#if USING_DISPATCH_TABLE +void gl_init_dispatch_table(void); +void gl_switch_to_dispatch_table(void); +void wgl_init_dispatch_table(void); +void wgl_switch_to_dispatch_table(void); +extern uint32_t gl_tls_index, gl_tls_size; +extern uint32_t wgl_tls_index, wgl_tls_size; + +#define wglMakeCurrent_unwrapped epoxy_wglMakeCurrent_unwrapped +#define wglMakeContextCurrentARB_unwrapped epoxy_wglMakeContextCurrentARB_unwrapped +#define wglMakeContextCurrentEXT_unwrapped epoxy_wglMakeContextCurrentEXT_unwrapped +#define wglMakeAssociatedContextCurrentAMD_unwrapped epoxy_wglMakeAssociatedContextCurrentAMD_unwrapped +extern BOOL UNWRAPPED_PROTO(wglMakeCurrent_unwrapped)(HDC hdc, HGLRC hglrc); +extern BOOL UNWRAPPED_PROTO(wglMakeContextCurrentARB_unwrapped)(HDC hDrawDC, HDC hReadDC, HGLRC hglrc); +extern BOOL UNWRAPPED_PROTO(wglMakeContextCurrentEXT_unwrapped)(HDC hDrawDC, HDC hReadDC, HGLRC hglrc); +extern BOOL UNWRAPPED_PROTO(wglMakeAssociatedContextCurrentAMD_unwrapped)(HGLRC hglrc); +#endif /* _WIN32_ */ diff --git a/local/recipes/libs/libepoxy/source/src/dispatch_egl.c b/local/recipes/libs/libepoxy/source/src/dispatch_egl.c new file mode 100644 index 0000000000..3f0c7897dd --- /dev/null +++ b/local/recipes/libs/libepoxy/source/src/dispatch_egl.c @@ -0,0 +1,122 @@ +/* + * Copyright © 2013 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include +#include +#include + +#include "dispatch_common.h" + +int +epoxy_conservative_egl_version(void) +{ + EGLDisplay dpy = eglGetCurrentDisplay(); + + if (!dpy) + return 14; + + return epoxy_egl_version(dpy); +} + +/** + * @brief Returns the version of OpenGL we are using + * + * The version is encoded as: + * + * ``` + * + * version = major * 10 + minor + * + * ``` + * + * So it can be easily used for version comparisons. + * + * @param The EGL display + * + * @return The encoded version of EGL we are using + * + * @see epoxy_gl_version() + */ +int +epoxy_egl_version(EGLDisplay dpy) +{ + int major, minor; + const char *version_string; + int ret; + + version_string = eglQueryString(dpy, EGL_VERSION); + if (!version_string) + return 0; + + ret = sscanf(version_string, "%d.%d", &major, &minor); + assert(ret == 2); + return major * 10 + minor; +} + +bool +epoxy_conservative_has_egl_extension(const char *ext) +{ + return epoxy_has_egl_extension(eglGetCurrentDisplay(), ext); +} + +/** + * @brief Returns true if the given EGL extension is supported in the current context. + * + * @param dpy The EGL display + * @param extension The name of the EGL extension + * + * @return `true` if the extension is available + * + * @see epoxy_has_gl_extension() + * @see epoxy_has_glx_extension() + */ +bool +epoxy_has_egl_extension(EGLDisplay dpy, const char *ext) +{ + return epoxy_extension_in_string(eglQueryString(dpy, EGL_EXTENSIONS), ext) || epoxy_extension_in_string(eglQueryString(NULL, EGL_EXTENSIONS), ext); +} + +/** + * @brief Checks whether EGL is available. + * + * @return `true` if EGL is available + * + * @newin{1,4} + */ +bool +epoxy_has_egl(void) +{ +#if !PLATFORM_HAS_EGL + return false; +#else + if (epoxy_load_egl(false, true)) { + EGLDisplay* (* pf_eglGetCurrentDisplay) (void); + + pf_eglGetCurrentDisplay = epoxy_conservative_egl_dlsym("eglGetCurrentDisplay", false); + if (pf_eglGetCurrentDisplay) + return true; + } + + return false; +#endif /* PLATFORM_HAS_EGL */ +} diff --git a/local/recipes/libs/libepoxy/source/src/dispatch_glx.c b/local/recipes/libs/libepoxy/source/src/dispatch_glx.c new file mode 100644 index 0000000000..e3955644d7 --- /dev/null +++ b/local/recipes/libs/libepoxy/source/src/dispatch_glx.c @@ -0,0 +1,172 @@ +/* + * Copyright © 2013 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include +#include +#include + +#include "dispatch_common.h" + +/** + * If we can determine the GLX version from the current context, then + * return that, otherwise return a version that will just send us on + * to dlsym() or get_proc_address(). + */ +int +epoxy_conservative_glx_version(void) +{ + Display *dpy = glXGetCurrentDisplay(); + GLXContext ctx = glXGetCurrentContext(); + int screen; + + if (!dpy || !ctx) + return 14; + + glXQueryContext(dpy, ctx, GLX_SCREEN, &screen); + + return epoxy_glx_version(dpy, screen); +} + + +/** + * @brief Returns the version of GLX we are using + * + * The version is encoded as: + * + * ``` + * + * version = major * 10 + minor + * + * ``` + * + * So it can be easily used for version comparisons. + * + * @param dpy The X11 display + * @param screen The X11 screen + * + * @return The encoded version of GLX we are using + * + * @see epoxy_gl_version() + */ +int +epoxy_glx_version(Display *dpy, int screen) +{ + int server_major, server_minor; + int client_major, client_minor; + int server, client; + const char *version_string; + int ret; + + version_string = glXQueryServerString(dpy, screen, GLX_VERSION); + if (!version_string) + return 0; + + ret = sscanf(version_string, "%d.%d", &server_major, &server_minor); + assert(ret == 2); + server = server_major * 10 + server_minor; + + version_string = glXGetClientString(dpy, GLX_VERSION); + if (!version_string) + return 0; + + ret = sscanf(version_string, "%d.%d", &client_major, &client_minor); + assert(ret == 2); + client = client_major * 10 + client_minor; + + if (client < server) + return client; + else + return server; +} + +/** + * If we can determine the GLX extension support from the current + * context, then return that, otherwise give the answer that will just + * send us on to get_proc_address(). + */ +bool +epoxy_conservative_has_glx_extension(const char *ext) +{ + Display *dpy = glXGetCurrentDisplay(); + GLXContext ctx = glXGetCurrentContext(); + int screen; + + if (!dpy || !ctx) + return true; + + glXQueryContext(dpy, ctx, GLX_SCREEN, &screen); + + return epoxy_has_glx_extension(dpy, screen, ext); +} + +/** + * @brief Returns true if the given GLX extension is supported in the current context. + * + * @param dpy The X11 display + * @param screen The X11 screen + * @param extension The name of the GLX extension + * + * @return `true` if the extension is available + * + * @see epoxy_has_gl_extension() + * @see epoxy_has_egl_extension() + */ +bool +epoxy_has_glx_extension(Display *dpy, int screen, const char *ext) +{ + /* No, you can't just use glXGetClientString or + * glXGetServerString() here. Those each tell you about one half + * of what's needed for an extension to be supported, and + * glXQueryExtensionsString() is what gives you the intersection + * of the two. + */ + return epoxy_extension_in_string(glXQueryExtensionsString(dpy, screen), ext); +} + +/** + * @brief Checks whether GLX is available. + * + * @param dpy The X11 display + * + * @return `true` if GLX is available + * + * @newin{1,4} + */ +bool +epoxy_has_glx(Display *dpy) +{ +#if !PLATFORM_HAS_GLX + return false; +#else + if (epoxy_load_glx(false, true)) { + Bool (* pf_glXQueryExtension) (Display *, int *, int *); + int error_base, event_base; + + pf_glXQueryExtension = epoxy_conservative_glx_dlsym("glXQueryExtension", false); + if (pf_glXQueryExtension && pf_glXQueryExtension(dpy, &error_base, &event_base)) + return true; + } + + return false; +#endif /* !PLATFORM_HAS_GLX */ +} diff --git a/local/recipes/libs/libepoxy/source/src/dispatch_wgl.c b/local/recipes/libs/libepoxy/source/src/dispatch_wgl.c new file mode 100644 index 0000000000..7baf130571 --- /dev/null +++ b/local/recipes/libs/libepoxy/source/src/dispatch_wgl.c @@ -0,0 +1,196 @@ +/* + * Copyright © 2013 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include +#include +#include + +#include "dispatch_common.h" + +static bool first_context_current = false; +static bool already_switched_to_dispatch_table = false; + +/** + * If we can determine the WGL extension support from the current + * context, then return that, otherwise give the answer that will just + * send us on to get_proc_address(). + */ +bool +epoxy_conservative_has_wgl_extension(const char *ext) +{ + HDC hdc = wglGetCurrentDC(); + + if (!hdc) + return true; + + return epoxy_has_wgl_extension(hdc, ext); +} + +bool +epoxy_has_wgl_extension(HDC hdc, const char *ext) + { + PFNWGLGETEXTENSIONSSTRINGARBPROC getext; + + getext = (void *)wglGetProcAddress("wglGetExtensionsStringARB"); + if (!getext) { + fputs("Implementation unexpectedly missing " + "WGL_ARB_extensions_string. Probably a libepoxy bug.\n", + stderr); + return false; + } + + return epoxy_extension_in_string(getext(hdc), ext); +} + +/** + * Does the work necessary to update the win32 per-thread dispatch + * tables when wglMakeCurrent() is called. + * + * Right now, we use global function pointers until the second + * MakeCurrent occurs, at which point we switch to dispatch tables. + * This could be improved in the future to track a resolved dispatch + * table per context and reuse it when the context is made current + * again. + */ +void +epoxy_handle_external_wglMakeCurrent(void) +{ + if (!first_context_current) { + first_context_current = true; + } else { + if (!already_switched_to_dispatch_table) { + already_switched_to_dispatch_table = true; + gl_switch_to_dispatch_table(); + wgl_switch_to_dispatch_table(); + } + + gl_init_dispatch_table(); + wgl_init_dispatch_table(); + } +} + +/** + * This global symbol is apparently looked up by Windows when loading + * a DLL, but it doesn't declare the prototype. + */ +BOOL WINAPI +DllMain(HINSTANCE dll, DWORD reason, LPVOID reserved); + +BOOL WINAPI +DllMain(HINSTANCE dll, DWORD reason, LPVOID reserved) +{ + void *data; + + switch (reason) { + case DLL_PROCESS_ATTACH: + gl_tls_index = TlsAlloc(); + if (gl_tls_index == TLS_OUT_OF_INDEXES) + return FALSE; + wgl_tls_index = TlsAlloc(); + if (wgl_tls_index == TLS_OUT_OF_INDEXES) + return FALSE; + + first_context_current = false; + + /* FALLTHROUGH */ + + case DLL_THREAD_ATTACH: + data = LocalAlloc(LPTR, gl_tls_size); + TlsSetValue(gl_tls_index, data); + + data = LocalAlloc(LPTR, wgl_tls_size); + TlsSetValue(wgl_tls_index, data); + + break; + + case DLL_THREAD_DETACH: + case DLL_PROCESS_DETACH: + data = TlsGetValue(gl_tls_index); + LocalFree(data); + + data = TlsGetValue(wgl_tls_index); + LocalFree(data); + + if (reason == DLL_PROCESS_DETACH) { + TlsFree(gl_tls_index); + TlsFree(wgl_tls_index); + } + break; + } + + return TRUE; +} + +WRAPPER_VISIBILITY (BOOL) +WRAPPER(epoxy_wglMakeCurrent)(HDC hdc, HGLRC hglrc) +{ + BOOL ret = epoxy_wglMakeCurrent_unwrapped(hdc, hglrc); + + epoxy_handle_external_wglMakeCurrent(); + + return ret; +} + + +WRAPPER_VISIBILITY (BOOL) +WRAPPER(epoxy_wglMakeContextCurrentARB)(HDC hDrawDC, + HDC hReadDC, + HGLRC hglrc) +{ + BOOL ret = epoxy_wglMakeContextCurrentARB_unwrapped(hDrawDC, hReadDC, + hglrc); + + epoxy_handle_external_wglMakeCurrent(); + + return ret; +} + + +WRAPPER_VISIBILITY (BOOL) +WRAPPER(epoxy_wglMakeContextCurrentEXT)(HDC hDrawDC, + HDC hReadDC, + HGLRC hglrc) +{ + BOOL ret = epoxy_wglMakeContextCurrentEXT_unwrapped(hDrawDC, hReadDC, + hglrc); + + epoxy_handle_external_wglMakeCurrent(); + + return ret; +} + + +WRAPPER_VISIBILITY (BOOL) +WRAPPER(epoxy_wglMakeAssociatedContextCurrentAMD)(HGLRC hglrc) +{ + BOOL ret = epoxy_wglMakeAssociatedContextCurrentAMD_unwrapped(hglrc); + + epoxy_handle_external_wglMakeCurrent(); + + return ret; +} + +PFNWGLMAKECURRENTPROC epoxy_wglMakeCurrent = epoxy_wglMakeCurrent_wrapped; +PFNWGLMAKECONTEXTCURRENTEXTPROC epoxy_wglMakeContextCurrentEXT = epoxy_wglMakeContextCurrentEXT_wrapped; +PFNWGLMAKECONTEXTCURRENTARBPROC epoxy_wglMakeContextCurrentARB = epoxy_wglMakeContextCurrentARB_wrapped; +PFNWGLMAKEASSOCIATEDCONTEXTCURRENTAMDPROC epoxy_wglMakeAssociatedContextCurrentEXT = epoxy_wglMakeAssociatedContextCurrentAMD_wrapped; diff --git a/local/recipes/libs/libepoxy/source/src/gen_dispatch.py b/local/recipes/libs/libepoxy/source/src/gen_dispatch.py new file mode 100755 index 0000000000..3daad84266 --- /dev/null +++ b/local/recipes/libs/libepoxy/source/src/gen_dispatch.py @@ -0,0 +1,932 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +# Copyright © 2013 Intel Corporation +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the "Software"), +# to deal in the Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, sublicense, +# and/or sell copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice (including the next +# paragraph) shall be included in all copies or substantial portions of the +# Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +# IN THE SOFTWARE. + +import sys +import argparse +import xml.etree.ElementTree as ET +import re +import os + +class GLProvider(object): + def __init__(self, condition, condition_name, loader, name): + # C code for determining if this function is available. + # (e.g. epoxy_is_desktop_gl() && epoxy_gl_version() >= 20 + self.condition = condition + + # A string (possibly with spaces) describing the condition. + self.condition_name = condition_name + + # The loader for getting the symbol -- either dlsym or + # getprocaddress. This is a python format string to generate + # C code, given self.name. + self.loader = loader + + # The name of the function to be loaded (possibly an + # ARB/EXT/whatever-decorated variant). + self.name = name + + # This is the C enum name we'll use for referring to this provider. + self.enum = condition_name + self.enum = self.enum.replace(' ', '_') + self.enum = self.enum.replace('\\"', '') + self.enum = self.enum.replace('.', '_') + self.enum = "PROVIDER_" + self.enum + +class GLFunction(object): + def __init__(self, ret_type, name): + self.name = name + self.ptr_type = 'PFN' + name.upper() + 'PROC' + self.ret_type = ret_type + self.providers = {} + self.args = [] + + # These are functions with hand-written wrapper code in + # dispatch_common.c. Their dispatch entries are replaced with + # non-public symbols with a "_unwrapped" suffix. + wrapped_functions = { + 'glBegin', + 'glEnd', + 'wglMakeCurrent', + 'wglMakeContextCurrentEXT', + 'wglMakeContextCurrentARB', + 'wglMakeAssociatedContextCurrentAMD', + } + + if name in wrapped_functions: + self.wrapped_name = name + '_unwrapped' + self.public = '' + else: + self.wrapped_name = name + self.public = 'EPOXY_PUBLIC ' + + # This is the string of C code for passing through the + # arguments to the function. + self.args_list = '' + + # This is the string of C code for declaring the arguments + # list. + self.args_decl = 'void' + + # This is the string name of the function that this is an + # alias of, or self.name. This initially comes from the + # registry, and may get updated if it turns out our alias is + # itself an alias (for example glFramebufferTextureEXT -> + # glFramebufferTextureARB -> glFramebufferTexture) + self.alias_name = name + + # After alias resolution, this is the function that this is an + # alias of. + self.alias_func = None + + # For the root of an alias tree, this lists the functions that + # are marked as aliases of it, so that it can write a resolver + # for all of them. + self.alias_exts = [] + + def add_arg(self, arg_type, arg_name): + # Reword glDepthRange() arguments to avoid clashing with the + # "near" and "far" keywords on win32. + if arg_name == "near": + arg_name = "hither" + elif arg_name == "far": + arg_name = "yon" + + # Mac screwed up GLhandleARB and made it a void * instead of + # uint32_t, despite it being specced as only necessarily 32 + # bits wide, causing portability problems all over. There are + # prototype conflicts between things like + # glAttachShader(GLuint program, GLuint shader) and + # glAttachObjectARB(GLhandleARB container, GLhandleARB obj), + # even though they are marked as aliases in the XML (and being + # aliases in Mesa). + # + # We retain those aliases. In the x86_64 ABI, the first 6 + # args are stored in 64-bit registers, so the calls end up + # being the same despite the different types. We just need to + # add a cast to uintptr_t to shut up the compiler. + if arg_type == 'GLhandleARB': + assert len(self.args) < 6 + arg_list_name = '(uintptr_t)' + arg_name + else: + arg_list_name = arg_name + + self.args.append((arg_type, arg_name)) + if self.args_decl == 'void': + self.args_list = arg_list_name + self.args_decl = arg_type + ' ' + arg_name + else: + self.args_list += ', ' + arg_list_name + self.args_decl += ', ' + arg_type + ' ' + arg_name + + def add_provider(self, condition, loader, condition_name): + self.providers[condition_name] = GLProvider(condition, condition_name, + loader, self.name) + + def add_alias(self, ext): + assert self.alias_func is None + + self.alias_exts.append(ext) + ext.alias_func = self + +class Generator(object): + def __init__(self, target): + self.target = target + self.enums = {} + self.functions = {} + self.sorted_functions = [] + self.enum_string_offset = {} + self.max_enum_name_len = 1 + self.entrypoint_string_offset = {} + self.copyright_comment = None + self.typedefs = '' + self.out_file = None + + # GL versions named in the registry, which we should generate + # #defines for. + self.supported_versions = set() + + # Extensions named in the registry, which we should generate + # #defines for. + self.supported_extensions = set() + + # Dictionary mapping human-readable names of providers to a C + # enum token that will be used to reference those names, to + # reduce generated binary size. + self.provider_enum = {} + + # Dictionary mapping human-readable names of providers to C + # code to detect if it's present. + self.provider_condition = {} + + # Dictionary mapping human-readable names of providers to + # format strings for fetching the function pointer when + # provided the name of the symbol to be requested. + self.provider_loader = {} + + def all_text_until_element_name(self, element, element_name): + text = '' + + if element.text is not None: + text += element.text + + for child in element: + if child.tag == element_name: + break + if child.text: + text += child.text + if child.tail: + text += child.tail + return text + + def out(self, text): + self.out_file.write(text) + + def outln(self, text): + self.out_file.write(text + '\n') + + def parse_typedefs(self, reg): + for t in reg.findall('types/type'): + if 'name' in t.attrib and t.attrib['name'] not in {'GLhandleARB'}: + continue + + # The gles1/gles2-specific types are redundant + # declarations, and the different types used for them (int + # vs int32_t) caused problems on win32 builds. + api = t.get('api') + if api: + continue + + if t.text is not None: + self.typedefs += t.text + + for child in t: + if child.tag == 'apientry': + self.typedefs += 'APIENTRY' + if child.text: + self.typedefs += child.text + if child.tail: + self.typedefs += child.tail + self.typedefs += '\n' + + def parse_enums(self, reg): + for enum in reg.findall('enums/enum'): + name = enum.get('name') + + # wgl.xml's 0xwhatever definitions end up colliding with + # wingdi.h's decimal definitions of these. + if name in ['WGL_SWAP_OVERLAY', 'WGL_SWAP_UNDERLAY', 'WGL_SWAP_MAIN_PLANE']: + continue + + self.max_enum_name_len = max(self.max_enum_name_len, len(name)) + self.enums[name] = enum.get('value') + + def get_function_return_type(self, proto): + # Everything up to the start of the name element is the return type. + return self.all_text_until_element_name(proto, 'name').strip() + + def parse_function_definitions(self, reg): + for command in reg.findall('commands/command'): + proto = command.find('proto') + name = proto.find('name').text + ret_type = self.get_function_return_type(proto) + + func = GLFunction(ret_type, name) + + for arg in command.findall('param'): + func.add_arg(self.all_text_until_element_name(arg, 'name').strip(), + arg.find('name').text) + + alias = command.find('alias') + if alias is not None: + # Note that some alias references appear before the + # target command is defined (glAttachObjectARB() -> + # glAttachShader(), for example). + func.alias_name = alias.get('name') + + self.functions[name] = func + + def drop_weird_glx_functions(self): + # Drop a few ancient SGIX GLX extensions that use types not defined + # anywhere in Xlib. In glxext.h, they're protected by #ifdefs for the + # headers that defined them. + weird_functions = [name for name, func in self.functions.items() + if 'VLServer' in func.args_decl + or 'DMparams' in func.args_decl] + + for name in weird_functions: + del self.functions[name] + + def resolve_aliases(self): + for func in self.functions.values(): + # Find the root of the alias tree, and add ourselves to it. + if func.alias_name != func.name: + alias_func = func + while alias_func.alias_name != alias_func.name: + alias_func = self.functions[alias_func.alias_name] + func.alias_name = alias_func.name + func.alias_func = alias_func + alias_func.alias_exts.append(func) + + def prepare_provider_enum(self): + self.provider_enum = {} + + # We assume that for any given provider, all functions using + # it will have the same loader. This lets us generate a + # general C function for detecting conditions and calling the + # dlsym/getprocaddress, and have our many resolver stubs just + # call it with a table of values. + for func in self.functions.values(): + for provider in func.providers.values(): + if provider.condition_name in self.provider_enum: + assert self.provider_condition[provider.condition_name] == provider.condition + assert self.provider_loader[provider.condition_name] == provider.loader + continue + + self.provider_enum[provider.condition_name] = provider.enum + self.provider_condition[provider.condition_name] = provider.condition + self.provider_loader[provider.condition_name] = provider.loader + + def sort_functions(self): + self.sorted_functions = sorted(self.functions.values(), key=lambda func: func.name) + + def process_require_statements(self, feature, condition, loader, human_name): + for command in feature.findall('require/command'): + name = command.get('name') + + # wgl.xml describes 6 functions in WGL 1.0 that are in + # gdi32.dll instead of opengl32.dll, and we would need to + # change up our symbol loading to support that. Just + # don't wrap those functions. + if self.target == 'wgl' and 'wgl' not in name: + del self.functions[name] + continue + + func = self.functions[name] + func.add_provider(condition, loader, human_name) + + def parse_function_providers(self, reg): + for feature in reg.findall('feature'): + api = feature.get('api') # string gl, gles1, gles2, glx + m = re.match(r'([0-9])\.([0-9])', feature.get('number')) + version = int(m.group(1)) * 10 + int(m.group(2)) + + self.supported_versions.add(feature.get('name')) + + if api == 'gl': + human_name = 'Desktop OpenGL {0}'.format(feature.get('number')) + condition = 'epoxy_is_desktop_gl()' + + loader = 'epoxy_get_core_proc_address({0}, {1})'.format('{0}', version) + if version >= 11: + condition += ' && epoxy_conservative_gl_version() >= {0}'.format(version) + elif api == 'gles2': + human_name = 'OpenGL ES {0}'.format(feature.get('number')) + condition = '!epoxy_is_desktop_gl() && epoxy_gl_version() >= {0}'.format(version) + + if version <= 20: + loader = 'epoxy_gles2_dlsym({0})' + else: + loader = 'epoxy_gles3_dlsym({0})' + elif api == 'gles1': + human_name = 'OpenGL ES 1.0' + condition = '!epoxy_is_desktop_gl() && epoxy_gl_version() >= 10 && epoxy_gl_version() < 20' + loader = 'epoxy_gles1_dlsym({0})' + elif api == 'glx': + human_name = 'GLX {0}'.format(version) + # We could just always use GPA for loading everything + # but glXGetProcAddress(), but dlsym() is a more + # efficient lookup. + if version > 13: + condition = 'epoxy_conservative_glx_version() >= {0}'.format(version) + loader = 'glXGetProcAddress((const GLubyte *){0})' + else: + condition = 'true' + loader = 'epoxy_glx_dlsym({0})' + elif api == 'egl': + human_name = 'EGL {0}'.format(version) + if version > 10: + condition = 'epoxy_conservative_egl_version() >= {0}'.format(version) + else: + condition = 'true' + # All EGL core entrypoints must be dlsym()ed out -- + # eglGetProcAdddress() will return NULL. + loader = 'epoxy_egl_dlsym({0})' + elif api == 'wgl': + human_name = 'WGL {0}'.format(version) + condition = 'true' + loader = 'epoxy_gl_dlsym({0})' + elif api == 'glsc2': + continue + else: + sys.exit('unknown API: "{0}"'.format(api)) + + self.process_require_statements(feature, condition, loader, human_name) + + for extension in reg.findall('extensions/extension'): + extname = extension.get('name') + cond_extname = "enum_string[enum_string_offsets[i]]" + + self.supported_extensions.add(extname) + + # 'supported' is a set of strings like gl, gles1, gles2, + # or glx, which are separated by '|' + apis = extension.get('supported').split('|') + if 'glx' in apis: + condition = 'epoxy_conservative_has_glx_extension(provider_name)' + loader = 'glXGetProcAddress((const GLubyte *){0})' + self.process_require_statements(extension, condition, loader, extname) + if 'egl' in apis: + condition = 'epoxy_conservative_has_egl_extension(provider_name)' + loader = 'eglGetProcAddress({0})' + self.process_require_statements(extension, condition, loader, extname) + if 'wgl' in apis: + condition = 'epoxy_conservative_has_wgl_extension(provider_name)' + loader = 'wglGetProcAddress({0})' + self.process_require_statements(extension, condition, loader, extname) + if {'gl', 'gles1', 'gles2'}.intersection(apis): + condition = 'epoxy_conservative_has_gl_extension(provider_name)' + loader = 'epoxy_get_proc_address({0})' + self.process_require_statements(extension, condition, loader, extname) + + def fixup_bootstrap_function(self, name, loader): + # We handle glGetString(), glGetIntegerv(), and + # glXGetProcAddressARB() specially, because we need to use + # them in the process of deciding on loaders for resolving, + # and the naive code generation would result in their + # resolvers calling their own resolvers. + if name not in self.functions: + return + + func = self.functions[name] + func.providers = {} + func.add_provider('true', loader, 'always present') + + def parse(self, xml_file): + reg = ET.parse(xml_file) + comment = reg.find('comment') + if comment is not None: + self.copyright_comment = comment.text + else: + self.copyright_comment = '' + self.parse_typedefs(reg) + self.parse_enums(reg) + self.parse_function_definitions(reg) + self.parse_function_providers(reg) + + def write_copyright_comment_body(self): + for line in self.copyright_comment.splitlines(): + if '-----' in line: + break + self.outln(' * ' + line) + + def write_enums(self): + for name in sorted(self.supported_versions): + self.outln('#define {0} 1'.format(name)) + self.outln('') + + for name in sorted(self.supported_extensions): + self.outln('#define {0} 1'.format(name)) + self.outln('') + + # We want to sort by enum number (which puts a bunch of things + # in a logical order), then by name after that, so we do those + # sorts in reverse. This is still way uglier than doing some + # sort based on what version/extensions things are introduced + # in, but we haven't paid any attention to those attributes + # for enums yet. + sorted_by_name = sorted(self.enums.keys()) + sorted_by_number = sorted(sorted_by_name, key=lambda name: self.enums[name]) + for name in sorted_by_number: + self.outln('#define ' + name.ljust(self.max_enum_name_len + 3) + self.enums[name] + '') + + def write_function_ptr_typedefs(self): + for func in self.sorted_functions: + self.outln('typedef {0} (GLAPIENTRY *{1})({2});'.format(func.ret_type, + func.ptr_type, + func.args_decl)) + + def write_header_header(self, out_file): + self.close() + self.out_file = open(out_file, 'w') + + self.outln('/* GL dispatch header.') + self.outln(' * This is code-generated from the GL API XML files from Khronos.') + self.write_copyright_comment_body() + self.outln(' */') + self.outln('') + + self.outln('#pragma once') + + self.outln('#include ') + self.outln('#include ') + self.outln('') + + def write_header(self, out_file): + self.write_header_header(out_file) + + self.outln('#include "epoxy/common.h"') + + if self.target != "gl": + self.outln('#include "epoxy/gl.h"') + if self.target == "egl": + self.outln('#include "EGL/eglplatform.h"') + # Account for older eglplatform.h, which doesn't define + # the EGL_CAST macro. + self.outln('#ifndef EGL_CAST') + self.outln('#if defined(__cplusplus)') + self.outln('#define EGL_CAST(type, value) (static_cast(value))') + self.outln('#else') + self.outln('#define EGL_CAST(type, value) ((type) (value))') + self.outln('#endif') + self.outln('#endif') + else: + # Add some ridiculous inttypes.h redefinitions that are + # from khrplatform.h and not included in the XML. We + # don't directly include khrplatform.h because it's not + # present on many systems, and coming up with #ifdefs to + # decide when it's not present would be hard. + self.outln('#define __khrplatform_h_ 1') + self.outln('typedef int8_t khronos_int8_t;') + self.outln('typedef int16_t khronos_int16_t;') + self.outln('typedef int32_t khronos_int32_t;') + self.outln('typedef int64_t khronos_int64_t;') + self.outln('typedef uint8_t khronos_uint8_t;') + self.outln('typedef uint16_t khronos_uint16_t;') + self.outln('typedef uint32_t khronos_uint32_t;') + self.outln('typedef uint64_t khronos_uint64_t;') + self.outln('typedef float khronos_float_t;') + self.outln('#ifdef _WIN64') + self.outln('typedef signed long long int khronos_intptr_t;') + self.outln('typedef unsigned long long int khronos_uintptr_t;') + self.outln('typedef signed long long int khronos_ssize_t;') + self.outln('typedef unsigned long long int khronos_usize_t;') + self.outln('#else') + self.outln('typedef signed long int khronos_intptr_t;') + self.outln('typedef unsigned long int khronos_uintptr_t;') + self.outln('typedef signed long int khronos_ssize_t;') + self.outln('typedef unsigned long int khronos_usize_t;') + self.outln('#endif') + self.outln('typedef uint64_t khronos_utime_nanoseconds_t;') + self.outln('typedef int64_t khronos_stime_nanoseconds_t;') + self.outln('#define KHRONOS_MAX_ENUM 0x7FFFFFFF') + self.outln('typedef enum {') + self.outln(' KHRONOS_FALSE = 0,') + self.outln(' KHRONOS_TRUE = 1,') + self.outln(' KHRONOS_BOOLEAN_ENUM_FORCE_SIZE = KHRONOS_MAX_ENUM') + self.outln('} khronos_boolean_enum_t;') + + if self.target == "glx": + self.outln('#include ') + self.outln('#include ') + + self.out(self.typedefs) + self.outln('') + self.write_enums() + self.outln('') + self.write_function_ptr_typedefs() + + for func in self.sorted_functions: + self.outln('EPOXY_PUBLIC {0} (EPOXY_CALLSPEC *epoxy_{1})({2});'.format(func.ret_type, + func.name, + func.args_decl)) + self.outln('') + + for func in self.sorted_functions: + self.outln('#define {0} epoxy_{0}'.format(func.name)) + + def write_function_ptr_resolver(self, func): + self.outln('static {0}'.format(func.ptr_type)) + self.outln('epoxy_{0}_resolver(void)'.format(func.wrapped_name)) + self.outln('{') + + providers = [] + # Make a local list of all the providers for this alias group + alias_root = func + if func.alias_func: + alias_root = func.alias_func + for provider in alias_root.providers.values(): + providers.append(provider) + for alias_func in alias_root.alias_exts: + for provider in alias_func.providers.values(): + providers.append(provider) + + # Add some partial aliases of a few functions. These are ones + # that aren't quite aliases, because of some trivial behavior + # difference (like whether to produce an error for a + # non-Genned name), but where we'd like to fall back to the + # similar function if the proper one isn't present. + half_aliases = { + 'glBindVertexArray' : 'glBindVertexArrayAPPLE', + 'glBindVertexArrayAPPLE' : 'glBindVertexArray', + 'glBindFramebuffer' : 'glBindFramebufferEXT', + 'glBindFramebufferEXT' : 'glBindFramebuffer', + 'glBindRenderbuffer' : 'glBindRenderbufferEXT', + 'glBindRenderbufferEXT' : 'glBindRenderbuffer', + } + if func.name in half_aliases: + alias_func = self.functions[half_aliases[func.name]] + for provider in alias_func.providers.values(): + providers.append(provider) + + def provider_sort(provider): + return (provider.name != func.name, provider.name, provider.enum) + providers.sort(key=provider_sort) + + if len(providers) != 1: + self.outln(' static const enum {0}_provider providers[] = {{'.format(self.target)) + for provider in providers: + self.outln(' {0},'.format(provider.enum)) + self.outln(' {0}_provider_terminator'.format(self.target)) + self.outln(' };') + + self.outln(' static const uint32_t entrypoints[] = {') + if len(providers) > 1: + for provider in providers: + self.outln(' {0} /* "{1}" */,'.format(self.entrypoint_string_offset[provider.name], provider.name)) + else: + self.outln(' 0 /* None */,') + self.outln(' };') + + self.outln(' return {0}_provider_resolver(entrypoint_strings + {1} /* "{2}" */,'.format(self.target, + self.entrypoint_string_offset[func.name], + func.name)) + self.outln(' providers, entrypoints);') + else: + assert providers[0].name == func.name + self.outln(' return {0}_single_resolver({1}, {2} /* {3} */);'.format(self.target, + providers[0].enum, + self.entrypoint_string_offset[func.name], + func.name)) + self.outln('}') + self.outln('') + + def write_thunks(self, func): + # Writes out the function that's initially plugged into the + # global function pointer, which resolves, updates the global + # function pointer, and calls down to it. + # + # It also writes out the actual initialized global function + # pointer. + if func.ret_type == 'void': + self.outln('GEN_THUNKS({0}, ({1}), ({2}))'.format(func.wrapped_name, + func.args_decl, + func.args_list)) + else: + self.outln('GEN_THUNKS_RET({0}, {1}, ({2}), ({3}))'.format(func.ret_type, + func.wrapped_name, + func.args_decl, + func.args_list)) + + def write_function_pointer(self, func): + self.outln('{0} epoxy_{1} = epoxy_{1}_global_rewrite_ptr;'.format(func.ptr_type, func.wrapped_name)) + self.outln('') + + def write_provider_enums(self): + # Writes the enum declaration for the list of providers + # supported by gl_provider_resolver() + + self.outln('') + self.outln('enum {0}_provider {{'.format(self.target)) + + sorted_providers = sorted(self.provider_enum.keys()) + + # We always put a 0 enum first so that we can have a + # terminator in our arrays + self.outln(' {0}_provider_terminator = 0,'.format(self.target)) + + for human_name in sorted_providers: + enum = self.provider_enum[human_name] + self.outln(' {0},'.format(enum)) + self.outln('} PACKED;') + self.outln('ENDPACKED') + self.outln('') + + def write_provider_enum_strings(self): + # Writes the mapping from enums to the strings describing them + # for epoxy_print_failure_reasons(). + + sorted_providers = sorted(self.provider_enum.keys()) + + offset = 0 + self.outln('static const char *enum_string =') + for human_name in sorted_providers: + self.outln(' "{0}\\0"'.format(human_name)) + self.enum_string_offset[human_name] = offset + offset += len(human_name.replace('\\', '')) + 1 + self.outln(' ;') + self.outln('') + # We're using uint16_t for the offsets. + assert offset < 65536 + + self.outln('static const uint16_t enum_string_offsets[] = {') + self.outln(' -1, /* {0}_provider_terminator, unused */'.format(self.target)) + for human_name in sorted_providers: + enum = self.provider_enum[human_name] + self.outln(' {1}, /* {0} */'.format(human_name, self.enum_string_offset[human_name])) + self.outln('};') + self.outln('') + + def write_entrypoint_strings(self): + self.outln('static const char entrypoint_strings[] = {') + offset = 0 + for func in self.sorted_functions: + if func.name not in self.entrypoint_string_offset: + self.entrypoint_string_offset[func.name] = offset + offset += len(func.name) + 1 + for c in func.name: + self.outln(" '{0}',".format(c)) + self.outln(' 0, // {0}'.format(func.name)) + self.outln(' 0 };') + # We're using uint16_t for the offsets. + #assert(offset < 65536) + self.outln('') + + def write_provider_resolver(self): + self.outln('static void *{0}_provider_resolver(const char *name,'.format(self.target)) + self.outln(' const enum {0}_provider *providers,'.format(self.target)) + self.outln(' const uint32_t *entrypoints)') + self.outln('{') + self.outln(' int i;') + + self.outln(' for (i = 0; providers[i] != {0}_provider_terminator; i++) {{'.format(self.target)) + self.outln(' const char *provider_name = enum_string + enum_string_offsets[providers[i]];') + self.outln(' switch (providers[i]) {') + self.outln('') + + for human_name in sorted(self.provider_enum.keys()): + enum = self.provider_enum[human_name] + self.outln(' case {0}:'.format(enum)) + self.outln(' if ({0})'.format(self.provider_condition[human_name])) + self.outln(' return {0};'.format(self.provider_loader[human_name]).format("entrypoint_strings + entrypoints[i]")) + self.outln(' break;') + + self.outln(' case {0}_provider_terminator:'.format(self.target)) + self.outln(' abort(); /* Not reached */') + self.outln(' }') + self.outln(' }') + self.outln('') + + self.outln(' if (epoxy_resolver_failure_handler)') + self.outln(' return epoxy_resolver_failure_handler(name);') + self.outln('') + + # If the function isn't provided by any known extension, print + # something useful for the poor application developer before + # aborting. (In non-epoxy GL usage, the app developer would + # call into some blank stub function and segfault). + self.outln(' fprintf(stderr, "No provider of %s found. Requires one of:\\n", name);') + self.outln(' for (i = 0; providers[i] != {0}_provider_terminator; i++) {{'.format(self.target)) + self.outln(' fprintf(stderr, " %s\\n", enum_string + enum_string_offsets[providers[i]]);') + self.outln(' }') + self.outln(' if (providers[0] == {0}_provider_terminator) {{'.format(self.target)) + self.outln(' fprintf(stderr, " No known providers. This is likely a bug "') + self.outln(' "in libepoxy code generation\\n");') + self.outln(' }') + self.outln(' abort();') + + self.outln('}') + self.outln('') + + single_resolver_proto = '{0}_single_resolver(enum {0}_provider provider, uint32_t entrypoint_offset)'.format(self.target) + self.outln('EPOXY_NOINLINE static void *') + self.outln('{0};'.format(single_resolver_proto)) + self.outln('') + self.outln('static void *') + self.outln('{0}'.format(single_resolver_proto)) + self.outln('{') + self.outln(' enum {0}_provider providers[] = {{'.format(self.target)) + self.outln(' provider,') + self.outln(' {0}_provider_terminator'.format(self.target)) + self.outln(' };') + self.outln(' return {0}_provider_resolver(entrypoint_strings + entrypoint_offset,'.format(self.target)) + self.outln(' providers, &entrypoint_offset);') + self.outln('}') + self.outln('') + + def write_source(self, f): + self.close() + self.out_file = open(f, 'w') + + self.outln('/* GL dispatch code.') + self.outln(' * This is code-generated from the GL API XML files from Khronos.') + self.write_copyright_comment_body() + self.outln(' */') + self.outln('') + self.outln('#include "config.h"') + self.outln('') + self.outln('#include ') + self.outln('#include ') + self.outln('#include ') + self.outln('') + self.outln('#include "dispatch_common.h"') + self.outln('#include "epoxy/{0}.h"'.format(self.target)) + self.outln('') + self.outln('#ifdef __GNUC__') + self.outln('#define EPOXY_NOINLINE __attribute__((noinline))') + self.outln('#elif defined (_MSC_VER)') + self.outln('#define EPOXY_NOINLINE __declspec(noinline)') + self.outln('#endif') + + self.outln('struct dispatch_table {') + for func in self.sorted_functions: + self.outln(' {0} epoxy_{1};'.format(func.ptr_type, func.wrapped_name)) + self.outln('};') + self.outln('') + + # Early declaration, so we can declare the real thing at the + # bottom. (I want the function_ptr_resolver as the first + # per-GL-call code, since it's the most interesting to see + # when you search for the implementation of a call) + self.outln('#if USING_DISPATCH_TABLE') + self.outln('static inline struct dispatch_table *') + self.outln('get_dispatch_table(void);') + self.outln('') + self.outln('#endif') + + self.write_provider_enums() + self.write_provider_enum_strings() + self.write_entrypoint_strings() + self.write_provider_resolver() + + for func in self.sorted_functions: + self.write_function_ptr_resolver(func) + + for func in self.sorted_functions: + self.write_thunks(func) + self.outln('') + + self.outln('#if USING_DISPATCH_TABLE') + + self.outln('static struct dispatch_table resolver_table = {') + for func in self.sorted_functions: + self.outln(' epoxy_{0}_dispatch_table_rewrite_ptr, /* {0} */'.format(func.wrapped_name)) + self.outln('};') + self.outln('') + + self.outln('uint32_t {0}_tls_index;'.format(self.target)) + self.outln('uint32_t {0}_tls_size = sizeof(struct dispatch_table);'.format(self.target)) + self.outln('') + + self.outln('static inline struct dispatch_table *') + self.outln('get_dispatch_table(void)') + self.outln('{') + self.outln(' return TlsGetValue({0}_tls_index);'.format(self.target)) + self.outln('}') + self.outln('') + + self.outln('void') + self.outln('{0}_init_dispatch_table(void)'.format(self.target)) + self.outln('{') + self.outln(' struct dispatch_table *dispatch_table = get_dispatch_table();') + self.outln(' memcpy(dispatch_table, &resolver_table, sizeof(resolver_table));') + self.outln('}') + self.outln('') + + self.outln('void') + self.outln('{0}_switch_to_dispatch_table(void)'.format(self.target)) + self.outln('{') + + for func in self.sorted_functions: + self.outln(' epoxy_{0} = epoxy_{0}_dispatch_table_thunk;'.format(func.wrapped_name)) + + self.outln('}') + self.outln('') + + self.outln('#endif /* !USING_DISPATCH_TABLE */') + + for func in self.sorted_functions: + self.write_function_pointer(func) + + def close(self): + if self.out_file: + self.out_file.close() + self.out_file = None + + +argparser = argparse.ArgumentParser(description='Generate GL dispatch wrappers.') +argparser.add_argument('files', metavar='file.xml', nargs='+', help='GL API XML files to be parsed') +argparser.add_argument('--outputdir', metavar='dir', required=False, help='Destination directory for files (default to current dir)') +argparser.add_argument('--includedir', metavar='dir', required=False, help='Destination directory for headers') +argparser.add_argument('--srcdir', metavar='dir', required=False, help='Destination directory for source') +argparser.add_argument('--source', dest='source', action='store_true', required=False, help='Generate the source file') +argparser.add_argument('--no-source', dest='source', action='store_false', required=False, help='Do not generate the source file') +argparser.add_argument('--header', dest='header', action='store_true', required=False, help='Generate the header file') +argparser.add_argument('--no-header', dest='header', action='store_false', required=False, help='Do not generate the header file') +args = argparser.parse_args() + +if args.outputdir: + outputdir = args.outputdir +else: + outputdir = os.getcwd() + +if args.includedir: + includedir = args.includedir +else: + includedir = outputdir + +if args.srcdir: + srcdir = args.srcdir +else: + srcdir = outputdir + +build_source = args.source +build_header = args.header + +if not build_source and not build_header: + build_source = True + build_header = True + +for f in args.files: + name = os.path.basename(f).split('.xml')[0] + generator = Generator(name) + generator.parse(f) + + generator.drop_weird_glx_functions() + + # This is an ANSI vs Unicode function, handled specially by + # include/epoxy/wgl.h + if 'wglUseFontBitmaps' in generator.functions: + del generator.functions['wglUseFontBitmaps'] + + generator.sort_functions() + generator.resolve_aliases() + generator.fixup_bootstrap_function('glGetString', + 'epoxy_get_bootstrap_proc_address({0})') + generator.fixup_bootstrap_function('glGetIntegerv', + 'epoxy_get_bootstrap_proc_address({0})') + + # While this is technically exposed as a GLX extension, it's + # required to be present as a public symbol by the Linux OpenGL + # ABI. + generator.fixup_bootstrap_function('glXGetProcAddress', + 'epoxy_glx_dlsym({0})') + + generator.prepare_provider_enum() + + if build_header: + generator.write_header(os.path.join(includedir, name + '_generated.h')) + if build_source: + generator.write_source(os.path.join(srcdir, name + '_generated_dispatch.c')) + + generator.close() diff --git a/local/recipes/libs/libepoxy/source/src/meson.build b/local/recipes/libs/libepoxy/source/src/meson.build new file mode 100644 index 0000000000..e19a9188dc --- /dev/null +++ b/local/recipes/libs/libepoxy/source/src/meson.build @@ -0,0 +1,121 @@ +# Configuration file +configure_file(output: 'config.h', configuration: conf) + +# List of generated sources: +# - name of the generated file +# - registry source file +# - additional sources +generated_sources = [ + [ 'gl_generated_dispatch.c', gl_registry, [ 'dispatch_common.c', 'dispatch_common.h' ] ] +] + +if build_egl + generated_sources += [ [ 'egl_generated_dispatch.c', egl_registry, 'dispatch_egl.c' ] ] +endif + +if build_glx + generated_sources += [ [ 'glx_generated_dispatch.c', glx_registry, 'dispatch_glx.c' ] ] +endif + +if build_wgl + generated_sources += [ [ 'wgl_generated_dispatch.c', wgl_registry, 'dispatch_wgl.c' ] ] +endif + +gen_sources = [ ] +sources = [ ] + +foreach g: generated_sources + gen_source = g[0] + registry = g[1] + source = g[2] + + generated = custom_target(gen_source, + input: registry, + output: [ gen_source ], + command: [ + gen_dispatch_py, + '--source', + '--no-header', + '--outputdir=@OUTDIR@', + '@INPUT@', + ]) + + gen_sources += [ generated ] + sources += [ source ] +endforeach + +epoxy_sources = sources + gen_sources + +common_ldflags = [] + +if host_system == 'linux' and cc.get_id() == 'gcc' + common_ldflags += cc.get_supported_link_arguments([ '-Wl,-Bsymbolic-functions', '-Wl,-z,relro' ]) +endif + +# Maintain compatibility with autotools; see: https://github.com/anholt/libepoxy/issues/108 +darwin_versions = [1, '1.0'] + +epoxy_deps = [ dl_dep, ] +if host_system == 'windows' + epoxy_deps += [ opengl32_dep, gdi32_dep ] +endif +if enable_x11 + epoxy_deps += [ x11_headers_dep, ] +endif +if build_egl + epoxy_deps += [ elg_headers_dep, ] +endif + +libepoxy = library( + 'epoxy', + sources: epoxy_sources + epoxy_headers, + version: '0.0.0', + darwin_versions: darwin_versions, + install: true, + dependencies: epoxy_deps, + include_directories: libepoxy_inc, + c_args: common_cflags + visibility_cflags, + link_args: common_ldflags, +) + +epoxy_has_glx = build_glx ? '1' : '0' +epoxy_has_egl = build_egl ? '1' : '0' +epoxy_has_wgl = build_wgl ? '1' : '0' + +libepoxy_dep = declare_dependency( + link_with: libepoxy, + include_directories: libepoxy_inc, + dependencies: epoxy_deps, + sources: epoxy_headers, + variables: { + 'epoxy_has_glx': epoxy_has_glx, + 'epoxy_has_egl': epoxy_has_egl, + 'epoxy_has_wgl': epoxy_has_wgl, + }, +) + +# We don't want to add these dependencies to the library, as they are +# not needed when building Epoxy; we do want to add them to the generated +# pkg-config file, for consumers of Epoxy +gl_reqs = [] +if gl_dep.found() and gl_dep.type_name() == 'pkgconfig' + gl_reqs += 'gl' +endif +if build_egl and egl_dep.found() and egl_dep.type_name() == 'pkgconfig' + gl_reqs += 'egl' +endif + +pkg = import('pkgconfig') +pkg.generate( + libraries: libepoxy, + name: 'epoxy', + description: 'GL dispatch library', + version: meson.project_version(), + variables: [ + 'epoxy_has_glx=@0@'.format(epoxy_has_glx), + 'epoxy_has_egl=@0@'.format(epoxy_has_egl), + 'epoxy_has_wgl=@0@'.format(epoxy_has_wgl), + ], + filebase: 'epoxy', + requires_private: ' '.join(gl_reqs), +) diff --git a/local/recipes/libs/libepoxy/source/test/cgl_core.c b/local/recipes/libs/libepoxy/source/test/cgl_core.c new file mode 100644 index 0000000000..9b56acf0f8 --- /dev/null +++ b/local/recipes/libs/libepoxy/source/test/cgl_core.c @@ -0,0 +1,54 @@ +/* This is a copy of the test used by HomeBrew's libepoxy recipe, + * originally written by Mikko Lehtonen. + * + * The Homebrew recipe is released under the BSD 2-Clause license. + * + * Copyright (c) 2009-present, Homebrew contributors + * 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. + * + * 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 HOLDER 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 +#include + +int +main (void) +{ + CGLPixelFormatAttribute attribs[] = {0}; + CGLPixelFormatObj pix; + CGLContextObj ctx; + int npix; + + CGLChoosePixelFormat(attribs, &pix, &npix); + CGLCreateContext(pix, (void *) 0, &ctx); + + glClear(GL_COLOR_BUFFER_BIT); + + CGLReleaseContext(ctx); + CGLReleasePixelFormat(pix); + + return 0; +} diff --git a/local/recipes/libs/libepoxy/source/test/cgl_epoxy_api.c b/local/recipes/libs/libepoxy/source/test/cgl_epoxy_api.c new file mode 100644 index 0000000000..e83222c431 --- /dev/null +++ b/local/recipes/libs/libepoxy/source/test/cgl_epoxy_api.c @@ -0,0 +1,83 @@ +/* + * Copyright 2018 Emmanuele Bassi + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +/** + * @file cgl_epoxy_api.c + * + * Tests the Epoxy API using the CoreGraphics OpenGL framework. + */ + +#include +#include +#include +#include +#include +#include + +int +main (void) +{ + CGLPixelFormatAttribute attribs[] = {0}; + CGLPixelFormatObj pix; + CGLContextObj ctx; + const char *string; + bool pass = true; + int npix; + GLint shader; + + CGLChoosePixelFormat(attribs, &pix, &npix); + CGLCreateContext(pix, (void *) 0, &ctx); + CGLSetCurrentContext(ctx); + + if (!epoxy_is_desktop_gl()) { + fputs("Claimed not to be desktop\n", stderr); + pass = false; + } + + if (epoxy_gl_version() < 20) { + fprintf(stderr, "Claimed to be GL version %d\n", + epoxy_gl_version()); + pass = false; + } + + if (epoxy_glsl_version() < 100) { + fprintf(stderr, "Claimed to have GLSL version %d\n", + epoxy_glsl_version()); + pass = false; + } + + string = (const char *)glGetString(GL_VERSION); + printf("GL version: %s - Epoxy: %d\n", string, epoxy_gl_version()); + + string = (const char *)glGetString(GL_SHADING_LANGUAGE_VERSION); + printf("GLSL version: %s - Epoxy: %d\n", string, epoxy_glsl_version()); + + shader = glCreateShader(GL_FRAGMENT_SHADER); + pass = glIsShader(shader); + + CGLSetCurrentContext(NULL); + CGLReleaseContext(ctx); + CGLReleasePixelFormat(pix); + + return pass != true; +} diff --git a/local/recipes/libs/libepoxy/source/test/dlwrap.c b/local/recipes/libs/libepoxy/source/test/dlwrap.c new file mode 100644 index 0000000000..c0c24c21a4 --- /dev/null +++ b/local/recipes/libs/libepoxy/source/test/dlwrap.c @@ -0,0 +1,325 @@ +/* Copyright © 2013, Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +/** @file dlwrap.c + * + * Implements a wrapper for dlopen() and dlsym() so that epoxy will + * end up finding symbols from the testcases named + * "override_EGL_eglWhatever()" or "override_GLES2_glWhatever()" or + * "override_GL_glWhatever()" when it tries to dlopen() and dlsym() + * the real GL or EGL functions in question. + * + * This lets us simulate some target systems in the test suite, or + * just stub out GL functions so we can be sure of what's being + * called. + */ + +/* dladdr is a glibc extension */ +#define _GNU_SOURCE +#include + +#include +#include +#include +#include +#include + +#include "dlwrap.h" + +#define STRNCMP_LITERAL(var, literal) \ + strncmp ((var), (literal), sizeof (literal) - 1) + +#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof(arr[0])) + +void *libfips_handle; + +typedef void *(*fips_dlopen_t)(const char *filename, int flag); +typedef void *(*fips_dlsym_t)(void *handle, const char *symbol); + +void *override_EGL_eglGetProcAddress(const char *name); +void *override_GL_glXGetProcAddress(const char *name); +void *override_GL_glXGetProcAddressARB(const char *name); +void __dlclose(void *handle); + +static struct libwrap { + const char *filename; + const char *symbol_prefix; + void *handle; +} wrapped_libs[] = { + { "libGL.so", "GL", NULL }, + { "libEGL.so", "EGL", NULL }, + { "libGLESv2.so", "GLES2", NULL }, + { "libOpenGL.so", "GL", NULL}, +}; + +/* Match 'filename' against an internal list of libraries for which + * libfips has wrappers. + * + * Returns true and sets *index_ret if a match is found. + * Returns false if no match is found. */ +static struct libwrap * +find_wrapped_library(const char *filename) +{ + unsigned i; + + if (!filename) + return NULL; + + for (i = 0; i < ARRAY_SIZE(wrapped_libs); i++) { + if (strncmp(wrapped_libs[i].filename, filename, + strlen(wrapped_libs[i].filename)) == 0) { + return &wrapped_libs[i]; + } + } + + return NULL; +} + +/* Many (most?) OpenGL programs dlopen libGL.so.1 rather than linking + * against it directly, which means they would not be seeing our + * wrapped GL symbols via LD_PRELOAD. So we catch the dlopen in a + * wrapper here and redirect it to our library. + */ +void * +dlopen(const char *filename, int flag) +{ + void *ret; + struct libwrap *wrap; + + /* Before deciding whether to redirect this dlopen to our own + * library, we call the real dlopen. This assures that any + * expected side-effects from loading the intended library are + * resolved. Below, we may still return a handle pointing to + * our own library, and not what is opened here. */ + ret = dlwrap_real_dlopen(filename, flag); + + /* If filename is not a wrapped library, just return real dlopen */ + wrap = find_wrapped_library(filename); + if (!wrap) + return ret; + + wrap->handle = ret; + + /* We use wrapped_libs as our handles to libraries. */ + return wrap; +} + +/** + * Wraps dlclose to hide our faked handles from it. + */ +void +__dlclose(void *handle) +{ + struct libwrap *wrap = handle; + + if (wrap < wrapped_libs || + wrap >= wrapped_libs + ARRAY_SIZE(wrapped_libs)) { + void (*real_dlclose)(void *handle) = dlwrap_real_dlsym(RTLD_NEXT, "__dlclose"); + real_dlclose(handle); + } +} + +void * +dlwrap_real_dlopen(const char *filename, int flag) +{ + static fips_dlopen_t real_dlopen = NULL; + + if (!real_dlopen) { + real_dlopen = (fips_dlopen_t) dlwrap_real_dlsym(RTLD_NEXT, "dlopen"); + if (!real_dlopen) { + fputs("Error: Failed to find symbol for dlopen.\n", stderr); + exit(1); + } + } + + return real_dlopen(filename, flag); +} + +/** + * Return the dlsym() on the application's namespace for + * "override__" + */ +static void * +wrapped_dlsym(const char *prefix, const char *name) +{ + char *wrap_name; + void *symbol; + + if (asprintf(&wrap_name, "override_%s_%s", prefix, name) < 0) { + fputs("Error: Failed to allocate memory.\n", stderr); + abort(); + } + + symbol = dlwrap_real_dlsym(RTLD_DEFAULT, wrap_name); + free(wrap_name); + return symbol; +} + +/* Since we redirect dlopens of libGL.so and libEGL.so to libfips we + * need to ensure that dlysm succeeds for all functions that might be + * defined in the real, underlying libGL library. But we're far too + * lazy to implement wrappers for function that would simply + * pass-through, so instead we also wrap dlysm and arrange for it to + * pass things through with RTLD_next if libfips does not have the + * function desired. */ +void * +dlsym(void *handle, const char *name) +{ + struct libwrap *wrap = handle; + + /* Make sure that handle is actually one of our wrapped libs. */ + if (wrap < wrapped_libs || + wrap >= wrapped_libs + ARRAY_SIZE(wrapped_libs)) { + wrap = NULL; + } + + /* Failing that, anything specifically requested from the + * libfips library should be redirected to a real GL + * library. */ + + if (wrap) { + void *symbol = wrapped_dlsym(wrap->symbol_prefix, name); + if (symbol) + return symbol; + else + return dlwrap_real_dlsym(wrap->handle, name); + } + + /* And anything else is some unrelated dlsym. Just pass it + * through. (This also covers the cases of lookups with + * special handles such as RTLD_DEFAULT or RTLD_NEXT.) + */ + return dlwrap_real_dlsym(handle, name); +} + +void * +dlwrap_real_dlsym(void *handle, const char *name) +{ + static fips_dlsym_t real_dlsym = NULL; + + if (!real_dlsym) { + /* FIXME: This brute-force, hard-coded searching for a versioned + * symbol is really ugly. The only reason I'm doing this is because + * I need some way to lookup the "dlsym" function in libdl, but + * I can't use 'dlsym' to do it. So dlvsym works, but forces me + * to guess what the right version is. + * + * Potential fixes here: + * + * 1. Use libelf to actually inspect libdl.so and + * find the right version, (finding the right + * libdl.so can be made easier with + * dl_iterate_phdr). + * + * 2. Use libelf to find the offset of the 'dlsym' + * symbol within libdl.so, (and then add this to + * the base address at which libdl.so is loaded + * as reported by dl_iterate_phdr). + * + * In the meantime, I'll just keep augmenting this + * hard-coded version list as people report bugs. */ + const char *version[] = { + "GLIBC_2.17", + "GLIBC_2.4", + "GLIBC_2.3", + "GLIBC_2.2.5", + "GLIBC_2.2", + "GLIBC_2.0", + "FBSD_1.0" + }; + int num_versions = sizeof(version) / sizeof(version[0]); + int i; + for (i = 0; i < num_versions; i++) { + real_dlsym = (fips_dlsym_t) dlvsym(RTLD_NEXT, "dlsym", version[i]); + if (real_dlsym) + break; + } + if (i == num_versions) { + fputs("Internal error: Failed to find real dlsym\n", stderr); + fputs("This may be a simple matter of fips not knowing about the version of GLIBC that\n" + "your program is using. Current known versions are:\n\n\t", + stderr); + for (i = 0; i < num_versions; i++) + fprintf(stderr, "%s ", version[i]); + fputs("\n\nYou can inspect your version by first finding libdl.so.2:\n" + "\n" + "\tldd | grep libdl.so\n" + "\n" + "And then inspecting the version attached to the dlsym symbol:\n" + "\n" + "\treadelf -s /path/to/libdl.so.2 | grep dlsym\n" + "\n" + "And finally, adding the version to dlwrap.c:dlwrap_real_dlsym.\n", + stderr); + + exit(1); + } + } + + return real_dlsym(handle, name); +} + +void * +override_GL_glXGetProcAddress(const char *name) +{ + void *symbol; + + symbol = wrapped_dlsym("GL", name); + if (symbol) + return symbol; + + return DEFER_TO_GL("libGL.so.1", override_GL_glXGetProcAddress, + "glXGetProcAddress", (name)); +} + +void * +override_GL_glXGetProcAddressARB(const char *name) +{ + void *symbol; + + symbol = wrapped_dlsym("GL", name); + if (symbol) + return symbol; + + return DEFER_TO_GL("libGL.so.1", override_GL_glXGetProcAddressARB, + "glXGetProcAddressARB", (name)); +} + +void * +override_EGL_eglGetProcAddress(const char *name) +{ + void *symbol; + + if (!STRNCMP_LITERAL(name, "gl")) { + symbol = wrapped_dlsym("GLES2", name); + if (symbol) + return symbol; + } + + if (!STRNCMP_LITERAL(name, "egl")) { + symbol = wrapped_dlsym("EGL", name); + if (symbol) + return symbol; + } + + return DEFER_TO_GL("libEGL.so.1", override_EGL_eglGetProcAddress, + "eglGetProcAddress", (name)); +} diff --git a/local/recipes/libs/libepoxy/source/test/dlwrap.h b/local/recipes/libs/libepoxy/source/test/dlwrap.h new file mode 100644 index 0000000000..39ec9ec929 --- /dev/null +++ b/local/recipes/libs/libepoxy/source/test/dlwrap.h @@ -0,0 +1,67 @@ +/* Copyright © 2013, Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef DLWRAP_H +#define DLWRAP_H + +#define _GNU_SOURCE +#include + +/* Call the *real* dlopen. We have our own wrapper for dlopen that, of + * necessity must use claim the symbol 'dlopen'. So whenever anything + * internal needs to call the real, underlying dlopen function, the + * thing to call is dlwrap_real_dlopen. + */ +void * +dlwrap_real_dlopen(const char *filename, int flag); + +/* Perform a dlopen on the libfips library itself. + * + * Many places in fips need to lookup symbols within the libfips + * library itself, (and not in any other library). This function + * provides a reliable way to get a handle for performing such + * lookups. + * + * The returned handle can be passed to dlwrap_real_dlsym for the + * lookups. */ +void * +dlwrap_dlopen_libfips(void); + +/* Call the *real* dlsym. We have our own wrapper for dlsym that, of + * necessity must use claim the symbol 'dlsym'. So whenever anything + * internal needs to call the real, underlying dlysm function, the + * thing to call is dlwrap_real_dlsym. + */ +void * +dlwrap_real_dlsym(void *handle, const char *symbol); + +#define DEFER_TO_GL(library, func, name, args) \ +({ \ + void *lib = dlwrap_real_dlopen(library, RTLD_LAZY | RTLD_LOCAL); \ + typeof(&func) real_func = dlwrap_real_dlsym(lib, name); \ + /* gcc extension -- func's return value is the return value of \ + * the statement. \ + */ \ + real_func args; \ +}) + +#endif + diff --git a/local/recipes/libs/libepoxy/source/test/egl_common.c b/local/recipes/libs/libepoxy/source/test/egl_common.c new file mode 100644 index 0000000000..c4079129df --- /dev/null +++ b/local/recipes/libs/libepoxy/source/test/egl_common.c @@ -0,0 +1,54 @@ +/* + * Copyright © 2013 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include +#include +#include +#include "egl_common.h" + +/** + * Do whatever it takes to get us an EGL display for the system. + * + * This needs to be ported to other window systems. + */ +EGLDisplay * +get_egl_display_or_skip(void) +{ + Display *dpy = XOpenDisplay(NULL); + EGLint major, minor; + EGLDisplay *edpy; + bool ok; + + if (!dpy) + errx(77, "couldn't open display\n"); + + edpy = eglGetDisplay(dpy); + if (!edpy) + errx(1, "Couldn't get EGL display for X11 Display.\n"); + + ok = eglInitialize(edpy, &major, &minor); + if (!ok) + errx(1, "eglInitialize() failed\n"); + + return edpy; +} diff --git a/local/recipes/libs/libepoxy/source/test/egl_common.h b/local/recipes/libs/libepoxy/source/test/egl_common.h new file mode 100644 index 0000000000..1c5963be9e --- /dev/null +++ b/local/recipes/libs/libepoxy/source/test/egl_common.h @@ -0,0 +1,25 @@ +/* + * Copyright © 2013 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +EGLDisplay * +get_egl_display_or_skip(void); diff --git a/local/recipes/libs/libepoxy/source/test/egl_epoxy_api.c b/local/recipes/libs/libepoxy/source/test/egl_epoxy_api.c new file mode 100644 index 0000000000..252b535d91 --- /dev/null +++ b/local/recipes/libs/libepoxy/source/test/egl_epoxy_api.c @@ -0,0 +1,148 @@ +/* + * Copyright 2018 Emmanuele Bassi + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +/** + * @file epoxy_api.c + * + * Tests the Epoxy API using EGL. + */ + +#ifdef __sun +#define __EXTENSIONS__ +#else +#define _GNU_SOURCE +#endif +#include +#include +#include +#include +#include +#include "epoxy/gl.h" +#include "epoxy/egl.h" + +#include "egl_common.h" + +static bool +make_egl_current_and_test(EGLDisplay *dpy, EGLContext ctx) +{ + const char *string; + GLuint shader; + bool pass = true; + + eglMakeCurrent(dpy, NULL, NULL, ctx); + + if (!epoxy_is_desktop_gl()) { + fputs("Claimed to be desktop\n", stderr); + pass = false; + } + + if (epoxy_gl_version() < 20) { + fprintf(stderr, "Claimed to be GL version %d\n", + epoxy_gl_version()); + pass = false; + } + + if (epoxy_glsl_version() < 100) { + fprintf(stderr, "Claimed to have GLSL version %d\n", + epoxy_glsl_version()); + pass = false; + } + + string = (const char *)glGetString(GL_VERSION); + printf("GL version: %s - Epoxy: %d\n", string, epoxy_gl_version()); + + string = (const char *)glGetString(GL_SHADING_LANGUAGE_VERSION); + printf("GLSL version: %s - Epoxy: %d\n", string, epoxy_glsl_version()); + + shader = glCreateShader(GL_FRAGMENT_SHADER); + pass = glIsShader(shader); + + return pass; +} + +static void +init_egl(EGLDisplay *dpy, EGLContext *out_ctx) +{ + static const EGLint config_attribs[] = { + EGL_SURFACE_TYPE, EGL_WINDOW_BIT, + EGL_RED_SIZE, 1, + EGL_GREEN_SIZE, 1, + EGL_BLUE_SIZE, 1, + EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT, + EGL_NONE + }; + static const EGLint context_attribs[] = { + EGL_CONTEXT_CLIENT_VERSION, 2, + EGL_NONE + }; + EGLContext ctx; + EGLConfig cfg; + EGLint count; + + if (!epoxy_has_egl_extension(dpy, "EGL_KHR_surfaceless_context")) + errx(77, "Test requires EGL_KHR_surfaceless_context"); + + if (!eglBindAPI(EGL_OPENGL_API)) + errx(77, "Couldn't initialize EGL with desktop GL\n"); + + if (!eglChooseConfig(dpy, config_attribs, &cfg, 1, &count)) + errx(77, "Couldn't get an EGLConfig\n"); + + ctx = eglCreateContext(dpy, cfg, NULL, context_attribs); + if (!ctx) + errx(77, "Couldn't create a GL context\n"); + + *out_ctx = ctx; +} + +int +main(int argc, char **argv) +{ + bool pass = true; + + EGLContext egl_ctx; + EGLDisplay *dpy = get_egl_display_or_skip(); + const char *extensions = eglQueryString(dpy, EGL_EXTENSIONS); + char *first_space; + char *an_extension; + + /* We don't have any extensions guaranteed by the ABI, so for the + * touch test we just check if the first one is reported to be there. + */ + first_space = strstr(extensions, " "); + if (first_space) { + an_extension = strndup(extensions, first_space - extensions); + } else { + an_extension = strdup(extensions); + } + + if (!epoxy_extension_in_string(extensions, an_extension)) + errx(1, "Implementation reported absence of %s", an_extension); + + free(an_extension); + + init_egl(dpy, &egl_ctx); + pass = make_egl_current_and_test(dpy, egl_ctx); + + return pass != true; +} diff --git a/local/recipes/libs/libepoxy/source/test/egl_gl.c b/local/recipes/libs/libepoxy/source/test/egl_gl.c new file mode 100644 index 0000000000..1acc19e2c1 --- /dev/null +++ b/local/recipes/libs/libepoxy/source/test/egl_gl.c @@ -0,0 +1,130 @@ +/* + * Copyright © 2014 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +/** + * @file egl_gl.c + * + * Tests that epoxy works with EGL using desktop OpenGL. + */ + +#define _GNU_SOURCE + +#include +#include +#include +#include +#include +#include +#include "epoxy/gl.h" +#include "epoxy/egl.h" +#include "epoxy/glx.h" + +#include "egl_common.h" +#include "glx_common.h" +#include "dlwrap.h" + +static bool +make_egl_current_and_test(EGLDisplay *dpy, EGLContext ctx) +{ + const char *string; + GLuint shader; + bool pass = true; + + eglMakeCurrent(dpy, NULL, NULL, ctx); + + if (!epoxy_is_desktop_gl()) { + fputs("Claimed to be desktop\n", stderr); + pass = false; + } + + if (epoxy_gl_version() < 20) { + fprintf(stderr, "Claimed to be GL version %d\n", + epoxy_gl_version()); + pass = false; + } + + string = (const char *)glGetString(GL_VERSION); + printf("GL version: %s\n", string); + + shader = glCreateShader(GL_FRAGMENT_SHADER); + pass = glIsShader(shader); + + return pass; +} + +static void +init_egl(EGLDisplay **out_dpy, EGLContext *out_ctx) +{ + EGLDisplay *dpy = get_egl_display_or_skip(); + static const EGLint config_attribs[] = { + EGL_SURFACE_TYPE, EGL_WINDOW_BIT, + EGL_RED_SIZE, 1, + EGL_GREEN_SIZE, 1, + EGL_BLUE_SIZE, 1, + EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT, + EGL_NONE + }; + static const EGLint context_attribs[] = { + EGL_CONTEXT_CLIENT_VERSION, 2, + EGL_NONE + }; + EGLContext ctx; + EGLConfig cfg; + EGLint count; + + if (!epoxy_has_egl_extension(dpy, "EGL_KHR_surfaceless_context")) + errx(77, "Test requires EGL_KHR_surfaceless_context"); + + if (!eglBindAPI(EGL_OPENGL_API)) + errx(77, "Couldn't initialize EGL with desktop GL\n"); + + if (!eglChooseConfig(dpy, config_attribs, &cfg, 1, &count)) + errx(77, "Couldn't get an EGLConfig\n"); + + ctx = eglCreateContext(dpy, cfg, NULL, context_attribs); + if (!ctx) + errx(77, "Couldn't create a GL context\n"); + + *out_dpy = dpy; + *out_ctx = ctx; +} + +int +main(int argc, char **argv) +{ + bool pass = true; + EGLDisplay *egl_dpy; + EGLContext egl_ctx; + + /* Force epoxy to have loaded both EGL and GLX libs already -- we + * can't assume anything about symbol resolution based on having + * EGL or GLX loaded. + */ + (void)glXGetCurrentContext(); + (void)eglGetCurrentContext(); + + init_egl(&egl_dpy, &egl_ctx); + pass = make_egl_current_and_test(egl_dpy, egl_ctx) && pass; + + return pass != true; +} diff --git a/local/recipes/libs/libepoxy/source/test/egl_has_extension_nocontext.c b/local/recipes/libs/libepoxy/source/test/egl_has_extension_nocontext.c new file mode 100644 index 0000000000..4fa5f60a15 --- /dev/null +++ b/local/recipes/libs/libepoxy/source/test/egl_has_extension_nocontext.c @@ -0,0 +1,75 @@ +/* + * Copyright © 2013 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +/** + * @file egl_has_extension_nocontext.c + * + * Catches a bug in early development where eglGetProcAddress() with + * no context bound would fail out in dispatch. + */ + +#ifdef __sun +#define __EXTENSIONS__ +#else +#define _GNU_SOURCE +#endif +#include +#include +#include +#include +#include +#include "epoxy/gl.h" +#include "epoxy/egl.h" + +#include "egl_common.h" + +int +main(int argc, char **argv) +{ + bool pass = true; + + EGLDisplay *dpy = get_egl_display_or_skip(); + const char *extensions = eglQueryString(dpy, EGL_EXTENSIONS); + char *first_space; + char *an_extension; + + /* We don't have any extensions guaranteed by the ABI, so for the + * touch test we just check if the first one is reported to be there. + */ + first_space = strstr(extensions, " "); + if (first_space) { + an_extension = strndup(extensions, first_space - extensions); + } else { + an_extension = strdup(extensions); + } + + if (!epoxy_has_egl_extension(dpy, an_extension)) + errx(1, "Implementation reported absence of %s", an_extension); + + free(an_extension); + + if (epoxy_has_egl_extension(dpy, "GLX_ARB_ham_sandwich")) + errx(1, "Implementation reported presence of GLX_ARB_ham_sandwich"); + + return pass != true; +} diff --git a/local/recipes/libs/libepoxy/source/test/egl_without_glx.c b/local/recipes/libs/libepoxy/source/test/egl_without_glx.c new file mode 100644 index 0000000000..195ef41b3d --- /dev/null +++ b/local/recipes/libs/libepoxy/source/test/egl_without_glx.c @@ -0,0 +1,165 @@ +/* + * Copyright © 2014 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +/** + * @file egl_without_glx.c + * + * Tries to test operation of the library on a GL stack with EGL and + * GLES but no GLX or desktop GL (such as Arm's Mali GLES3 drivers). + * This test is varied by the GLES_VERSION defined at compile time to + * test either a GLES1-only or a GLES2-only system. + */ + +#define _GNU_SOURCE + +#include +#include +#include +#include +#include +#include +#include "epoxy/gl.h" +#include "epoxy/egl.h" + +#include "egl_common.h" + +/** + * Wraps the system dlopen(), which libepoxy will end up calling when + * it tries to dlopen() the API libraries, and errors out the + * libraries we're trying to simulate not being installed on the + * system. + */ +void * +dlopen(const char *filename, int flag) +{ + void * (*dlopen_unwrapped)(const char *filename, int flag); + + if (filename) { + if (!strcmp(filename, "libGL.so.1")) + return NULL; +#if GLES_VERSION == 2 + if (!strcmp(filename, "libGLESv1_CM.so.1")) + return NULL; +#else + if (!strcmp(filename, "libGLESv2.so.2")) + return NULL; +#endif + } + + dlopen_unwrapped = dlsym(RTLD_NEXT, "dlopen"); + assert(dlopen_unwrapped); + + return dlopen_unwrapped(filename, flag); +} + + +static EGLenum last_api; +static EGLenum extra_error = EGL_SUCCESS; + +/** + * Override of the real libEGL's eglBindAPI to simulate the target + * system's eglBindAPI. + */ +static EGLBoolean +override_eglBindAPI(EGLenum api) +{ + void *egl = dlopen("libEGL.so.1", RTLD_LAZY | RTLD_LOCAL); + EGLBoolean (*real_eglBindAPI)(EGLenum api) = dlsym(egl, "eglBindAPI"); + + last_api = api; + + if (api == EGL_OPENGL_API) { + extra_error = EGL_BAD_PARAMETER; + return EGL_FALSE; + } + + assert(real_eglBindAPI); + return real_eglBindAPI(api); +} + +/** + * Override of the real libEGL's eglGetError() to feed back the error + * that might have been generated by override_eglBindAPI(). + */ +static EGLint +override_eglGetError(void) +{ + void *egl = dlopen("libEGL.so.1", RTLD_LAZY | RTLD_LOCAL); + EGLint (*real_eglGetError)(void) = dlsym(egl, "eglGetError"); + + if (extra_error != EGL_SUCCESS) { + EGLenum error = extra_error; + extra_error = EGL_SUCCESS; + return error; + } + + assert(real_eglGetError); + return real_eglGetError(); +} + +int +main(int argc, char **argv) +{ + bool pass = true; + EGLDisplay *dpy = get_egl_display_or_skip(); + EGLint context_attribs[] = { + EGL_CONTEXT_CLIENT_VERSION, GLES_VERSION, + EGL_NONE + }; + EGLConfig cfg; + EGLint config_attribs[] = { + EGL_SURFACE_TYPE, EGL_WINDOW_BIT, + EGL_RED_SIZE, 1, + EGL_GREEN_SIZE, 1, + EGL_BLUE_SIZE, 1, + EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT, + EGL_NONE + }; + EGLint count; + EGLContext ctx; + const unsigned char *string; + + epoxy_eglBindAPI = override_eglBindAPI; + epoxy_eglGetError = override_eglGetError; + + if (!epoxy_has_egl_extension(dpy, "EGL_KHR_surfaceless_context")) + errx(77, "Test requires EGL_KHR_surfaceless_context"); + + eglBindAPI(EGL_OPENGL_ES_API); + + if (!eglChooseConfig(dpy, config_attribs, &cfg, 1, &count)) + errx(77, "Couldn't get an EGLConfig\n"); + + ctx = eglCreateContext(dpy, cfg, NULL, context_attribs); + if (!ctx) + errx(77, "Couldn't create a GLES%d context\n", GLES_VERSION); + + eglMakeCurrent(dpy, NULL, NULL, ctx); + + string = glGetString(GL_VERSION); + printf("GL_VERSION: %s\n", string); + + assert(eglGetError() == EGL_SUCCESS); + + return pass != true; +} diff --git a/local/recipes/libs/libepoxy/source/test/gl_version.c b/local/recipes/libs/libepoxy/source/test/gl_version.c new file mode 100644 index 0000000000..8873ef7033 --- /dev/null +++ b/local/recipes/libs/libepoxy/source/test/gl_version.c @@ -0,0 +1,91 @@ +/* + * Copyright © 2018 Broadcom + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include +#include +#include "epoxy/gl.h" + +GLenum mock_enum; +const char *mock_gl_version; +const char *mock_glsl_version; + +static const GLubyte * EPOXY_CALLSPEC override_glGetString(GLenum name) +{ + switch (name) { + case GL_VERSION: + return (GLubyte *)mock_gl_version; + case GL_SHADING_LANGUAGE_VERSION: + return (GLubyte *)mock_glsl_version; + default: + assert(!"unexpected glGetString() enum"); + return 0; + } +} + +static bool +test_version(const char *gl_string, int gl_version, + const char *glsl_string, int glsl_version) +{ + int epoxy_version; + + mock_gl_version = gl_string; + mock_glsl_version = glsl_string; + + epoxy_version = epoxy_gl_version(); + if (epoxy_version != gl_version) { + fprintf(stderr, + "glGetString(GL_VERSION) = \"%s\" returned epoxy_gl_version() " + "%d instead of %d\n", gl_string, epoxy_version, gl_version); + return false; + } + + + epoxy_version = epoxy_glsl_version(); + if (epoxy_version != glsl_version) { + fprintf(stderr, + "glGetString() = \"%s\" returned epoxy_glsl_version() " + "%d instead of %d\n", glsl_string, epoxy_version, glsl_version); + return false; + } + + return true; +} + +int +main(int argc, char **argv) +{ + bool pass = true; + + epoxy_glGetString = override_glGetString; + + pass = pass && test_version("3.0 Mesa 13.0.6", 30, + "1.30", 130); + pass = pass && test_version("OpenGL ES 2.0 Mesa 20.1.0-devel (git-4bb19a330e)", 20, + "OpenGL ES GLSL ES 1.0.16", 100); + pass = pass && test_version("OpenGL ES 3.2 Mesa 18.3.0-devel", 32, + "OpenGL ES GLSL ES 3.20", 320); + pass = pass && test_version("4.5.0 NVIDIA 384.130", 45, + "4.50", 450); + + return pass != true; +} diff --git a/local/recipes/libs/libepoxy/source/test/glx_alias_prefer_same_name.c b/local/recipes/libs/libepoxy/source/test/glx_alias_prefer_same_name.c new file mode 100644 index 0000000000..cfc1344204 --- /dev/null +++ b/local/recipes/libs/libepoxy/source/test/glx_alias_prefer_same_name.c @@ -0,0 +1,82 @@ +/* + * Copyright © 2013 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +/** + * @file glx_gles2.c + * + * Catches a bug where a GLES2 context using + * GLX_EXT_create_context_es2_profile would try to find the symbols in + * libGLESv2.so.2 instead of libGL.so.1. + */ + +#include +#include +#include +#include "epoxy/gl.h" +#include "epoxy/glx.h" +#include + +#include "glx_common.h" + +static Display *dpy; + +static int last_call; + +#define CORE_FUNC_VAL 100 +#define EXT_FUNC_VAL 101 + +void +override_GL_glBindTexture(GLenum target); +void +override_GL_glBindTextureEXT(GLenum target); + +void +override_GL_glBindTexture(GLenum target) +{ + last_call = CORE_FUNC_VAL; +} + +void +override_GL_glBindTextureEXT(GLenum target) +{ + last_call = EXT_FUNC_VAL; +} + +int +main(int argc, char **argv) +{ + bool pass = true; + + dpy = get_display_or_skip(); + make_glx_context_current_or_skip(dpy); + + if (!epoxy_has_gl_extension("GL_EXT_texture_object")) + errx(77, "Test requires GL_EXT_texture_object"); + + glBindTexture(GL_TEXTURE_2D, 1); + pass = pass && last_call == CORE_FUNC_VAL; + glBindTextureEXT(GL_TEXTURE_2D, 1); + pass = pass && last_call == EXT_FUNC_VAL; + + return pass != true; +} diff --git a/local/recipes/libs/libepoxy/source/test/glx_beginend.c b/local/recipes/libs/libepoxy/source/test/glx_beginend.c new file mode 100644 index 0000000000..c68f408914 --- /dev/null +++ b/local/recipes/libs/libepoxy/source/test/glx_beginend.c @@ -0,0 +1,107 @@ +/* + * Copyright © 2013 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include +#include +#include "epoxy/gl.h" +#include "epoxy/glx.h" +#include + +#include "glx_common.h" + +static Display *dpy; +static bool has_argb2101010; + +static bool +test_with_epoxy(void) +{ + glBegin(GL_TRIANGLES); + { + /* Hit a base entrypoint that won't call gl_version() */ + glVertex2f(0, 0); + + /* Hit an entrypoint that will call probably call gl_version() */ + glMultiTexCoord4f(GL_TEXTURE0, 0.0, 0.0, 0.0, 0.0); + + /* Hit an entrypoint that will probably call + * epoxy_conservative_has_extension(); + */ + if (has_argb2101010) { + glTexCoordP4ui(GL_UNSIGNED_INT_2_10_10_10_REV, 0); + } + } + glEnd(); + + /* No error should have been generated in the process. */ + return glGetError() == 0; +} + + + +#undef glBegin +#undef glEnd +extern void glBegin(GLenum primtype); +extern void glEnd(void); + +static bool +test_without_epoxy(void) +{ + glBegin(GL_TRIANGLES); + { + /* Hit a base entrypoint that won't call gl_version() */ + glVertex4f(0, 0, 0, 0); + + /* Hit an entrypoint that will call probably call gl_version() */ + glMultiTexCoord3f(GL_TEXTURE0, 0.0, 0.0, 0.0); + + /* Hit an entrypoint that will probably call + * epoxy_conservative_has_extension(); + */ + if (has_argb2101010) { + glTexCoordP3ui(GL_UNSIGNED_INT_2_10_10_10_REV, 0); + } + } + glEnd(); + + /* We can't make any assertions about error presence this time + * around. This test is just trying to catch segfaults. + */ + return true; +} + +int +main(int argc, char **argv) +{ + bool pass = true; + + dpy = get_display_or_skip(); + make_glx_context_current_or_skip(dpy); + + has_argb2101010 = + epoxy_has_gl_extension("GL_ARB_vertex_type_2_10_10_10_rev"); + + pass = pass && test_with_epoxy(); + pass = pass && test_without_epoxy(); + + return pass != true; +} diff --git a/local/recipes/libs/libepoxy/source/test/glx_common.c b/local/recipes/libs/libepoxy/source/test/glx_common.c new file mode 100644 index 0000000000..7f2fbe651a --- /dev/null +++ b/local/recipes/libs/libepoxy/source/test/glx_common.c @@ -0,0 +1,129 @@ +/* + * Copyright © 2009, 2013 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include +#include +#include +#include "glx_common.h" + +Display * +get_display_or_skip(void) +{ + Display *dpy = XOpenDisplay(NULL); + + if (!dpy) { + fputs("couldn't open display\n", stderr); + exit(77); + } + + return dpy; +} + +XVisualInfo * +get_glx_visual(Display *dpy) +{ + XVisualInfo *visinfo; + int attrib[] = { + GLX_RGBA, + GLX_RED_SIZE, 1, + GLX_GREEN_SIZE, 1, + GLX_BLUE_SIZE, 1, + GLX_DOUBLEBUFFER, + None + }; + int screen = DefaultScreen(dpy); + + visinfo = glXChooseVisual(dpy, screen, attrib); + if (visinfo == NULL) { + fputs("Couldn't get an RGBA, double-buffered visual\n", stderr); + exit(1); + } + + return visinfo; +} + +Window +get_glx_window(Display *dpy, XVisualInfo *visinfo, bool map) +{ + XSetWindowAttributes window_attr; + unsigned long mask; + int screen = DefaultScreen(dpy); + Window root_win = RootWindow(dpy, screen); + Window win; + + window_attr.background_pixel = 0; + window_attr.border_pixel = 0; + window_attr.colormap = XCreateColormap(dpy, root_win, + visinfo->visual, AllocNone); + window_attr.event_mask = StructureNotifyMask | ExposureMask | + KeyPressMask; + mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask; + win = XCreateWindow(dpy, root_win, 0, 0, + 10, 10, /* width, height */ + 0, visinfo->depth, InputOutput, + visinfo->visual, mask, &window_attr); + + return win; +} + +void +make_glx_context_current_or_skip(Display *dpy) +{ + GLXContext ctx; + XVisualInfo *visinfo = get_glx_visual(dpy); + Window win = get_glx_window(dpy, visinfo, false); + + ctx = glXCreateContext(dpy, visinfo, False, True); + if (ctx == None) { + fputs("glXCreateContext failed\n", stderr); + exit(1); + } + + glXMakeCurrent(dpy, win, ctx); +} + +GLXFBConfig +get_fbconfig_for_visinfo(Display *dpy, XVisualInfo *visinfo) +{ + int i, nconfigs; + GLXFBConfig ret = None, *configs; + + configs = glXGetFBConfigs(dpy, visinfo->screen, &nconfigs); + if (!configs) + return None; + + for (i = 0; i < nconfigs; i++) { + int v; + + if (glXGetFBConfigAttrib(dpy, configs[i], GLX_VISUAL_ID, &v)) + continue; + + if (v == visinfo->visualid) { + ret = configs[i]; + break; + } + } + + XFree(configs); + return ret; +} diff --git a/local/recipes/libs/libepoxy/source/test/glx_common.h b/local/recipes/libs/libepoxy/source/test/glx_common.h new file mode 100644 index 0000000000..8b6c263c69 --- /dev/null +++ b/local/recipes/libs/libepoxy/source/test/glx_common.h @@ -0,0 +1,39 @@ +/* + * Copyright © 2013 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include "epoxy/glx.h" + +Display * +get_display_or_skip(void); + +void +make_glx_context_current_or_skip(Display *dpy); + +GLXFBConfig +get_fbconfig_for_visinfo(Display *dpy, XVisualInfo *visinfo); + +XVisualInfo * +get_glx_visual(Display *dpy); + +Window +get_glx_window(Display *dpy, XVisualInfo *visinfo, bool map); diff --git a/local/recipes/libs/libepoxy/source/test/glx_gles2.c b/local/recipes/libs/libepoxy/source/test/glx_gles2.c new file mode 100644 index 0000000000..969d26b7ff --- /dev/null +++ b/local/recipes/libs/libepoxy/source/test/glx_gles2.c @@ -0,0 +1,118 @@ +/* + * Copyright © 2013 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +/** + * @file glx_gles2.c + * + * Catches a bug where a GLES2 context using + * GLX_EXT_create_context_es2_profile would try to find the symbols in + * libGLESv2.so.2 instead of libGL.so.1. + */ + +#include +#include +#include +#include "epoxy/gl.h" +#include "epoxy/glx.h" +#include + +#include "glx_common.h" + +static Display *dpy; + +GLuint +override_GLES2_glCreateShader(GLenum target); + +GLuint +override_GLES2_glCreateShader(GLenum target) +{ + return 0; +} + +void +override_GLES2_glGenQueries(GLsizei n, GLuint *ids); + +void +override_GLES2_glGenQueries(GLsizei n, GLuint *ids) +{ + int i; + for (i = 0; i < n; i++) + ids[i] = 0; +} + +int +main(int argc, char **argv) +{ + bool pass = true; + XVisualInfo *vis; + Window win; + GLXContext ctx; + GLXFBConfig config; + int context_attribs[] = { + GLX_CONTEXT_PROFILE_MASK_ARB, GLX_CONTEXT_ES2_PROFILE_BIT_EXT, + GLX_CONTEXT_MAJOR_VERSION_ARB, 2, + GLX_CONTEXT_MINOR_VERSION_ARB, 0, + 0 + }; + GLuint shader; + + dpy = get_display_or_skip(); + + if (!epoxy_has_glx_extension(dpy, 0, "GLX_EXT_create_context_es2_profile")) + errx(77, "Test requires GLX_EXT_create_context_es2_profile"); + + vis = get_glx_visual(dpy); + config = get_fbconfig_for_visinfo(dpy, vis); + win = get_glx_window(dpy, vis, false); + + ctx = glXCreateContextAttribsARB(dpy, config, NULL, true, + context_attribs); + + glXMakeCurrent(dpy, win, ctx); + + if (epoxy_is_desktop_gl()) { + errx(1, "GLES2 context creation made a desktop context\n"); + } + + if (epoxy_gl_version() < 20) { + errx(1, "GLES2 context creation made a version %f context\n", + epoxy_gl_version() / 10.0f); + } + + /* Test using an entrypoint that's in GLES2, but not the desktop GL ABI. */ + shader = glCreateShader(GL_FRAGMENT_SHADER); + if (shader == 0) + errx(1, "glCreateShader() failed\n"); + glDeleteShader(shader); + + if (epoxy_gl_version() >= 30) { + GLuint q = 0; + + glGenQueries(1, &q); + if (!q) + errx(1, "glGenQueries() failed\n"); + glDeleteQueries(1, &q); + } + + return pass != true; +} diff --git a/local/recipes/libs/libepoxy/source/test/glx_glxgetprocaddress_nocontext.c b/local/recipes/libs/libepoxy/source/test/glx_glxgetprocaddress_nocontext.c new file mode 100644 index 0000000000..2182215d6e --- /dev/null +++ b/local/recipes/libs/libepoxy/source/test/glx_glxgetprocaddress_nocontext.c @@ -0,0 +1,57 @@ +/* + * Copyright © 2013 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +/** + * @file glx_glxgetprocaddress_nocontext.c + * + * Catches a bug in early development where glXGetProcAddress() with + * no context bound would fail out in dispatch. + */ + +#include +#include +#include +#include "epoxy/gl.h" +#include "epoxy/glx.h" +#include + +#include "glx_common.h" + +static Display *dpy; + +int +main(int argc, char **argv) +{ + bool pass = true; + void *func; + + dpy = get_display_or_skip(); + if (epoxy_glx_version(dpy, 0) < 14) + errx(77, "GLX version 1.4 required for glXGetProcAddress().\n"); + + func = glXGetProcAddress((const GLubyte *)"glGetString"); + if (!func) + errx(1, "glXGetProcAddress() returned NULL\n"); + + return pass != true; +} diff --git a/local/recipes/libs/libepoxy/source/test/glx_has_extension_nocontext.c b/local/recipes/libs/libepoxy/source/test/glx_has_extension_nocontext.c new file mode 100644 index 0000000000..2f87ac31fc --- /dev/null +++ b/local/recipes/libs/libepoxy/source/test/glx_has_extension_nocontext.c @@ -0,0 +1,56 @@ +/* + * Copyright © 2013 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +/** + * @file glx_has_extension_nocontext.c + * + * Catches a bug in early development where glXGetProcAddress() with + * no context bound would fail out in dispatch. + */ + +#include +#include +#include +#include "epoxy/gl.h" +#include "epoxy/glx.h" +#include + +#include "glx_common.h" + +static Display *dpy; + +int +main(int argc, char **argv) +{ + bool pass = true; + + dpy = get_display_or_skip(); + + if (!epoxy_has_glx_extension(dpy, 0, "GLX_ARB_get_proc_address")) + errx(1, "Implementation reported absence of GLX_ARB_get_proc_address"); + + if (epoxy_has_glx_extension(dpy, 0, "GLX_ARB_ham_sandwich")) + errx(1, "Implementation reported presence of GLX_ARB_ham_sandwich"); + + return pass != true; +} diff --git a/local/recipes/libs/libepoxy/source/test/glx_public_api.c b/local/recipes/libs/libepoxy/source/test/glx_public_api.c new file mode 100644 index 0000000000..aecdd2a3d6 --- /dev/null +++ b/local/recipes/libs/libepoxy/source/test/glx_public_api.c @@ -0,0 +1,123 @@ +/* + * Copyright © 2013 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include +#include +#include "epoxy/gl.h" +#include "epoxy/glx.h" +#include + +#include "glx_common.h" + +static Display *dpy; + +static bool +test_gl_version(void) +{ + int version = epoxy_gl_version(); + if (version < 12) { + fprintf(stderr, + "Reported GL version %d, should be at least 12\n", + version); + return false; + } + + return true; +} + +static bool +test_glx_version(void) +{ + int version = epoxy_glx_version(dpy, 0); + const char *version_string; + int ret; + int server_major, server_minor; + int client_major, client_minor; + int server, client, expected; + + if (version < 13) { + fprintf(stderr, + "Reported GLX version %d, should be at least 13 " + "according to Linux GL ABI\n", + version); + return false; + } + + version_string = glXQueryServerString(dpy, 0, GLX_VERSION); + ret = sscanf(version_string, "%d.%d", &server_major, &server_minor); + assert(ret == 2); + server = server_major * 10 + server_minor; + + version_string = glXGetClientString(dpy, GLX_VERSION); + ret = sscanf(version_string, "%d.%d", &client_major, &client_minor); + assert(ret == 2); + client = client_major * 10 + client_minor; + + if (client < server) + expected = client; + else + expected = server; + + if (version != expected) { + fprintf(stderr, + "Reported GLX version %d, should be %d (%s)\n", + version, expected, version_string); + return false; + } + + return true; +} + +static bool +test_glx_extension_supported(void) +{ + if (!epoxy_has_glx_extension(dpy, 0, "GLX_ARB_get_proc_address")) { + fputs("Incorrectly reported no support for GLX_ARB_get_proc_address " + "(should always be present in Linux ABI)\n", + stderr); + return false; + } + + if (epoxy_has_glx_extension(dpy, 0, "GLX_EXT_ham_sandwich")) { + fputs("Incorrectly reported support for GLX_EXT_ham_sandwich\n", + stderr); + return false; + } + + return true; +} + +int +main(int argc, char **argv) +{ + bool pass = true; + + dpy = get_display_or_skip(); + make_glx_context_current_or_skip(dpy); + + pass = test_gl_version() && pass; + pass = test_glx_version() && pass; + pass = test_glx_extension_supported() && pass; + + return pass != true; +} diff --git a/local/recipes/libs/libepoxy/source/test/glx_public_api_core.c b/local/recipes/libs/libepoxy/source/test/glx_public_api_core.c new file mode 100644 index 0000000000..f5a4f0427a --- /dev/null +++ b/local/recipes/libs/libepoxy/source/test/glx_public_api_core.c @@ -0,0 +1,181 @@ +/* + * Copyright © 2013 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include +#include +#include +#include +#include "epoxy/gl.h" +#include "epoxy/glx.h" +#include + +#include "glx_common.h" + +static Display *dpy; + +static bool +test_has_extensions(void) +{ + int num_extensions; + + glGetIntegerv(GL_NUM_EXTENSIONS, &num_extensions); + + for (int i = 0; i < num_extensions; i++) { + char *ext = (char *)glGetStringi(GL_EXTENSIONS, i); + + if (!epoxy_has_gl_extension(ext)) { + fprintf(stderr, "GL implementation reported support for %s, " + "but epoxy didn't\n", ext); + return false; + } + } + + if (epoxy_has_gl_extension("GL_ARB_ham_sandwich")) { + fputs("epoxy implementation reported support for " + "GL_ARB_ham_sandwich, but it shouldn't\n", + stderr); + return false; + } + + return true; +} + +static bool +test_gl_version(void) +{ + int gl_version, epoxy_version; + int major, minor; + + glGetIntegerv(GL_MAJOR_VERSION, &major); + glGetIntegerv(GL_MINOR_VERSION, &minor); + gl_version = major * 10 + minor; + + if (gl_version < 32) { + fprintf(stderr, + "Implementation reported GL version %d, should be at least 32\n", + gl_version); + return false; + } + + epoxy_version = epoxy_gl_version(); + if (epoxy_version != gl_version) { + fprintf(stderr, + "Epoxy reported GL version %d, should be %d\n", + epoxy_version, gl_version); + return false; + } + + return true; +} + +static bool +test_glx_version(void) +{ + int version = epoxy_glx_version(dpy, 0); + const char *version_string; + int ret; + int server_major, server_minor; + int client_major, client_minor; + int server, client, expected; + + if (version < 13) { + fprintf(stderr, + "Reported GLX version %d, should be at least 13 " + "according to Linux GL ABI\n", + version); + return false; + } + + version_string = glXQueryServerString(dpy, 0, GLX_VERSION); + ret = sscanf(version_string, "%d.%d", &server_major, &server_minor); + assert(ret == 2); + server = server_major * 10 + server_minor; + + version_string = glXGetClientString(dpy, GLX_VERSION); + ret = sscanf(version_string, "%d.%d", &client_major, &client_minor); + assert(ret == 2); + client = client_major * 10 + client_minor; + + if (client < server) + expected = client; + else + expected = server; + + if (version != expected) { + fprintf(stderr, + "Reported GLX version %d, should be %d (%s)\n", + version, expected, version_string); + return false; + } + + return true; +} + +static int +error_handler(Display *d, XErrorEvent *ev) +{ + return 0; +} + +int +main(int argc, char **argv) +{ + bool pass = true; + XVisualInfo *visinfo; + Window win; + GLXFBConfig config; + static const int attribs[] = { + GLX_CONTEXT_PROFILE_MASK_ARB, + GLX_CONTEXT_CORE_PROFILE_BIT_ARB, + GLX_CONTEXT_MAJOR_VERSION_ARB, + 3, + GLX_CONTEXT_MINOR_VERSION_ARB, + 2, + None + }; + GLXContext ctx; + int (*old_handler)(Display *, XErrorEvent *); + + dpy = get_display_or_skip(); + + if (!epoxy_has_glx_extension(dpy, 0, "GLX_ARB_create_context_profile")) + errx(77, "Test requires GLX_ARB_create_context_profile"); + + visinfo = get_glx_visual(dpy); + win = get_glx_window(dpy, visinfo, false); + config = get_fbconfig_for_visinfo(dpy, visinfo); + + old_handler = XSetErrorHandler(error_handler); + ctx = glXCreateContextAttribsARB(dpy, config, NULL, True, attribs); + if (ctx == None) + errx(77, "glXCreateContext failed"); + XSetErrorHandler(old_handler); + + glXMakeCurrent(dpy, win, ctx); + + pass = test_gl_version() && pass; + pass = test_glx_version() && pass; + pass = test_has_extensions() && pass; + + return pass != true; +} diff --git a/local/recipes/libs/libepoxy/source/test/glx_static.c b/local/recipes/libs/libepoxy/source/test/glx_static.c new file mode 100644 index 0000000000..1466f55439 --- /dev/null +++ b/local/recipes/libs/libepoxy/source/test/glx_static.c @@ -0,0 +1,70 @@ +/* + * Copyright © 2013 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +/** + * @file glx_static.c + * + * Simple touch-test of using epoxy when linked statically. On Linux, + * the ifunc support we'd like to use has some significant behavior + * changes depending on whether it's a static build or shared library + * build. + * + * Note that if configured without --enable-static, this test will end + * up dynamically linked anyway, defeating the test. + */ + +#include +#include +#include "epoxy/gl.h" +#include "epoxy/glx.h" +#include +#include + +#include "glx_common.h" + +int +main(int argc, char **argv) +{ + bool pass = true; + int val; + +#if NEEDS_TO_BE_STATIC + if (dlsym(NULL, "epoxy_glCompileShader")) { + fputs("glx_static requires epoxy built with --enable-static\n", stderr); + return 77; + } +#endif + + Display *dpy = get_display_or_skip(); + make_glx_context_current_or_skip(dpy); + + glEnable(GL_LIGHTING); + val = 0; + glGetIntegerv(GL_LIGHTING, &val); + if (!val) { + fputs("Enabling GL_LIGHTING didn't stick.\n", stderr); + pass = false; + } + + return pass != true; +} diff --git a/local/recipes/libs/libepoxy/source/test/headerguards.c b/local/recipes/libs/libepoxy/source/test/headerguards.c new file mode 100644 index 0000000000..c5e5e6920d --- /dev/null +++ b/local/recipes/libs/libepoxy/source/test/headerguards.c @@ -0,0 +1,60 @@ +/* + * Copyright © 2013 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include "config.h" + +#include + +#ifdef BUILD_EGL +#include +#include +#endif + +#ifdef BUILD_GLX +#include +#include +#endif + +#ifdef BUILD_EGL +#include +#include +#include +#include +#endif + +#ifdef BUILD_GLX +#ifdef __APPLE__ +#include +#include +#else +#include +#include +#endif +#include +#include +#endif + +int main(int argc, char **argv) +{ + return 0; +} diff --git a/local/recipes/libs/libepoxy/source/test/khronos_typedefs.c b/local/recipes/libs/libepoxy/source/test/khronos_typedefs.c new file mode 100644 index 0000000000..f28fb67331 --- /dev/null +++ b/local/recipes/libs/libepoxy/source/test/khronos_typedefs.c @@ -0,0 +1,65 @@ +/* + * Copyright © 2014 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include +#include "khronos_typedefs.h" +#include "epoxy/gl.h" + +#define COMPARE_SIZE(type) \ + do { \ + if (sizeof(type) != system_sizes[type ## _slot]) { \ + fprintf(stderr, "system %s is size %d, epoxy is %d\n", \ + #type, \ + (int)system_sizes[type ## _slot], \ + (int)sizeof(type)); \ + error = true; \ + } \ +} while (0) + +int +main(int argc, char **argv) +{ + uint32_t system_sizes[khronos_typedef_count]; + bool error = false; + + get_system_typedef_sizes(system_sizes); + + COMPARE_SIZE(khronos_int8_t); + COMPARE_SIZE(khronos_uint8_t); + COMPARE_SIZE(khronos_int16_t); + COMPARE_SIZE(khronos_uint16_t); + COMPARE_SIZE(khronos_int32_t); + COMPARE_SIZE(khronos_uint32_t); + COMPARE_SIZE(khronos_int64_t); + COMPARE_SIZE(khronos_uint64_t); + COMPARE_SIZE(khronos_intptr_t); + COMPARE_SIZE(khronos_uintptr_t); + COMPARE_SIZE(khronos_ssize_t); + COMPARE_SIZE(khronos_usize_t); + COMPARE_SIZE(khronos_float_t); + COMPARE_SIZE(khronos_utime_nanoseconds_t); + COMPARE_SIZE(khronos_stime_nanoseconds_t); + COMPARE_SIZE(khronos_boolean_enum_t); + + return error; +} diff --git a/local/recipes/libs/libepoxy/source/test/khronos_typedefs.h b/local/recipes/libs/libepoxy/source/test/khronos_typedefs.h new file mode 100644 index 0000000000..bcb4dabd16 --- /dev/null +++ b/local/recipes/libs/libepoxy/source/test/khronos_typedefs.h @@ -0,0 +1,47 @@ +/* + * Copyright © 2014 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include + +enum typedef_slot { + khronos_int8_t_slot, + khronos_uint8_t_slot, + khronos_int16_t_slot, + khronos_uint16_t_slot, + khronos_int32_t_slot, + khronos_uint32_t_slot, + khronos_int64_t_slot, + khronos_uint64_t_slot, + khronos_intptr_t_slot, + khronos_uintptr_t_slot, + khronos_ssize_t_slot, + khronos_usize_t_slot, + khronos_float_t_slot, + /* khrplatform.h claims it defines khronos_time_ns_t, but it doesn't. */ + khronos_utime_nanoseconds_t_slot, + khronos_stime_nanoseconds_t_slot, + khronos_boolean_enum_t_slot, + khronos_typedef_count +}; + +void get_system_typedef_sizes(uint32_t *sizes); diff --git a/local/recipes/libs/libepoxy/source/test/khronos_typedefs_nonepoxy.c b/local/recipes/libs/libepoxy/source/test/khronos_typedefs_nonepoxy.c new file mode 100644 index 0000000000..d249545b32 --- /dev/null +++ b/local/recipes/libs/libepoxy/source/test/khronos_typedefs_nonepoxy.c @@ -0,0 +1,69 @@ +/* + * Copyright © 2014 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include +#include + +#include "config.h" +#include "khronos_typedefs.h" + +#ifdef HAVE_KHRPLATFORM_H + +#include + +#define GET_SIZE(type) sizes[type ## _slot] = sizeof(type) + +void +get_system_typedef_sizes(uint32_t *sizes) +{ + GET_SIZE(khronos_int8_t); + GET_SIZE(khronos_uint8_t); + GET_SIZE(khronos_int16_t); + GET_SIZE(khronos_uint16_t); + GET_SIZE(khronos_int32_t); + GET_SIZE(khronos_uint32_t); + GET_SIZE(khronos_int64_t); + GET_SIZE(khronos_uint64_t); + GET_SIZE(khronos_intptr_t); + GET_SIZE(khronos_uintptr_t); + GET_SIZE(khronos_ssize_t); + GET_SIZE(khronos_usize_t); + GET_SIZE(khronos_float_t); + GET_SIZE(khronos_utime_nanoseconds_t); + GET_SIZE(khronos_stime_nanoseconds_t); + GET_SIZE(khronos_boolean_enum_t); +} + +#else /* !HAVE_KHRPLATFORM_H */ + +/* Don't care -- this is a conditional case in test code. */ +#pragma GCC diagnostic ignored "-Wsuggest-attribute=noreturn" + +void +get_system_typedef_sizes(uint32_t *sizes) +{ + fputs("./configure failed to find khrplatform.h\n", stderr); + exit(77); +} + +#endif diff --git a/local/recipes/libs/libepoxy/source/test/meson.build b/local/recipes/libs/libepoxy/source/test/meson.build new file mode 100644 index 0000000000..862d57afdb --- /dev/null +++ b/local/recipes/libs/libepoxy/source/test/meson.build @@ -0,0 +1,184 @@ +dl_dep = cc.find_library('dl', required: false) +has_dlvsym = cc.has_function('dlvsym', dependencies: dl_dep) + +has_gles1 = gles1_dep.found() +has_gles2 = gles2_dep.found() +build_x11_tests = enable_x11 and x11_dep.found() + +test_cflags = common_cflags +if not has_dlvsym +test_cflags += [ + '-D_XOPEN_SOURCE', + '-D_POSIX_C_SOURCE=200809L', +] +endif + +# Unconditionally built tests +test('header_guards', + executable('header guards', 'headerguards.c', + c_args: common_cflags, + dependencies: libepoxy_dep, + include_directories: libepoxy_inc)) +test('misc_defines', + executable('misc defines', 'miscdefines.c', + c_args: common_cflags, + dependencies: libepoxy_dep, + include_directories: libepoxy_inc)) +test('khronos_typedefs', + executable('khronos typedefs', [ + 'khronos_typedefs.c', + 'khronos_typedefs.h', + 'khronos_typedefs_nonepoxy.c', + ], + c_args: common_cflags, + dependencies: libepoxy_dep, + include_directories: libepoxy_inc)) +test('gl_version', + executable('gl_version', + 'gl_version.c', + c_args: common_cflags, + dependencies: libepoxy_dep, + include_directories: libepoxy_inc)) + +if build_egl and build_x11_tests + egl_common_sources = [ 'egl_common.h', 'egl_common.c', ] + egl_common_lib = static_library('egl_common', + sources: egl_common_sources, + dependencies: libepoxy_dep, + include_directories: libepoxy_inc, + c_args: common_cflags, + install: false) + + egl_tests = [ + [ 'egl_has_extension_nocontext', [], [ 'egl_has_extension_nocontext.c' ], true, ], + [ 'egl_epoxy_api', [], [ 'egl_epoxy_api.c' ], true ], + [ 'egl_gles1_without_glx', [ '-DGLES_VERSION=1', ], [ 'egl_without_glx.c' ], has_gles1, ], + [ 'egl_gles2_without_glx', [ '-DGLES_VERSION=2', ], [ 'egl_without_glx.c' ], has_gles2, ], + ] + + if build_glx + egl_tests += [ + [ 'egl_gl', [], [ 'egl_gl.c' ], true, ], + ] + endif + + foreach test: egl_tests + test_name = test[0] + test_source = test[2] + test_args = test[1] + test_run = test[3] + + if test_run + test_bin = executable(test_name, test_source, + c_args: test_cflags + test_args, + include_directories: libepoxy_inc, + dependencies: [ libepoxy_dep, x11_dep, egl_dep, dl_dep ], + link_with: egl_common_lib, + link_args: '-rdynamic') + test(test_name, test_bin) + endif + endforeach +endif + +if build_glx and build_x11_tests + glx_common_sources = [ 'glx_common.h', 'glx_common.c', ] + glx_common_lib = static_library('glx_common', + sources: glx_common_sources, + dependencies: libepoxy_dep, + include_directories: libepoxy_inc, + c_args: common_cflags, + install: false) + + # glx_beginend links directly with the GL library, so we need to check it + # separately + test('glx_beginend', executable('glx_beginend', 'glx_beginend.c', + c_args: test_cflags, + include_directories: libepoxy_inc, + dependencies: [ libepoxy_dep, x11_dep, gl_dep, dl_dep ], + link_with: glx_common_lib)) + + glx_tests = [ + [ 'glx_public_api', [ 'glx_public_api.c' ], [], [], true ], + [ 'glx_public_api_core', [ 'glx_public_api_core.c' ], [], [], true ], + [ 'glx_glxgetprocaddress_nocontext', [ 'glx_glxgetprocaddress_nocontext.c' ], [], [], true ], + [ 'glx_has_extension_nocontext', [ 'glx_has_extension_nocontext.c' ], [], [], true ], + [ 'glx_static', [ 'glx_static.c' ], [ '-DNEEDS_TO_BE_STATIC'], [ '-static' ], libtype == 'static' ], + [ 'glx_shared_znow', [ 'glx_static.c', ], [], [ '-Wl,-z,now' ], has_znow ], + [ 'glx_alias_prefer_same_name', [ 'glx_alias_prefer_same_name.c', 'dlwrap.c', 'dlwrap.h' ], [], [ '-rdynamic' ], has_dlvsym ], + [ 'glx_gles2', [ 'glx_gles2.c', 'dlwrap.c', 'dlwrap.h' ], [], [ '-rdynamic' ], has_dlvsym ], + ] + + foreach test: glx_tests + test_name = test[0] + test_source = test[1] + test_c_args = test[2] + test_link_args = test[3] + test_run = test[4] + + if test_run + test_bin = executable(test_name, test_source, + c_args: test_cflags + test_c_args, + include_directories: libepoxy_inc, + dependencies: [ libepoxy_dep, x11_dep, dl_dep ], + link_with: glx_common_lib, + link_args: test_link_args) + test(test_name, test_bin) + endif + endforeach +endif + +# WGL +if build_wgl + wgl_common_sources = [ 'wgl_common.h', 'wgl_common.c', ] + wgl_common_lib = static_library('wgl_common', + sources: wgl_common_sources, + dependencies: libepoxy_dep, + include_directories: libepoxy_inc, + c_args: common_cflags, + install: false) + + wgl_tests = [ + [ 'wgl_core_and_exts', [ 'wgl_core_and_exts.c' ], [], ], + [ 'wgl_per_context_funcptrs', [ 'wgl_per_context_funcptrs.c' ], [], ], + [ 'wgl_usefontbitmaps', [ 'wgl_usefontbitmaps.c'], [], ], + [ 'wgl_usefontbitmaps_unicode', [ 'wgl_usefontbitmaps.c' ], [ '-DUNICODE' ], ], + ] + + foreach test: wgl_tests + test_name = test[0] + test_source = test[1] + test_c_args = test[2] + + test_bin = executable(test_name, test_source, + c_args: test_cflags + test_c_args, + include_directories: libepoxy_inc, + dependencies: [ libepoxy_dep ], + link_with: wgl_common_lib) + + test(test_name, test_bin) + endforeach +endif + +# Apple +if host_machine.system().contains('darwin') + opengl_dep = dependency('appleframeworks', modules: ['OpenGL', 'Carbon'], required: true) + + cgl_tests = [ + [ 'cgl_core', [ 'cgl_core.c' ] ], + [ 'cgl_epoxy_api', [ 'cgl_epoxy_api.c' ] ], + ] + + foreach t: cgl_tests + test_name = t[0] + test_sources = t[1] + + test(test_name, + executable( + test_name, test_sources, + c_args: test_cflags, + include_directories: libepoxy_inc, + dependencies: [ libepoxy_dep, opengl_dep ], + ), + ) + endforeach +endif diff --git a/local/recipes/libs/libepoxy/source/test/miscdefines.c b/local/recipes/libs/libepoxy/source/test/miscdefines.c new file mode 100644 index 0000000000..e4bc79a6c7 --- /dev/null +++ b/local/recipes/libs/libepoxy/source/test/miscdefines.c @@ -0,0 +1,67 @@ +/* + * Copyright © 2013 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include + +#ifdef BUILD_EGL +#include +#endif + +#ifdef BUILD_GLX +#include +#endif + +#if GL_VERSION_3_2 != 1 +#error bad GL_VERSION_3_2 +#endif + +#if GL_ARB_ES2_compatibility != 1 +#error bad GL_ARB_ES2_compatibility +#endif + +#ifndef GLAPI +#error missing GLAPI +#endif + +#ifndef GLAPIENTRY +#error missing GLAPIENTRY +#endif + +#ifndef GLAPIENTRYP +#error missing GLAPIENTRYP +#endif + +#ifndef APIENTRY +#error missing APIENTRY +#endif + +#ifndef APIENTRYP +#error missing APIENTRYP +#endif + +/* Do we want to export GL_GLEXT_VERSION? */ + +int main(int argc, char **argv) +{ + return 0; +} diff --git a/local/recipes/libs/libepoxy/source/test/wgl_common.c b/local/recipes/libs/libepoxy/source/test/wgl_common.c new file mode 100644 index 0000000000..e8d9c26aeb --- /dev/null +++ b/local/recipes/libs/libepoxy/source/test/wgl_common.c @@ -0,0 +1,128 @@ +/* + * Copyright © 2013 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include +#include +#include "wgl_common.h" + +static int (*test_callback)(HDC hdc); + +static void +setup_pixel_format(HDC hdc) +{ + PIXELFORMATDESCRIPTOR pfd = { + sizeof(PIXELFORMATDESCRIPTOR), + 1, + PFD_SUPPORT_OPENGL | + PFD_DRAW_TO_WINDOW | + PFD_DOUBLEBUFFER, + PFD_TYPE_RGBA, + 32, + 0, 0, 0, 0, 0, 0, + 0, + 0, + 0, + 0, 0, 0, 0, + 16, + 0, + 0, + PFD_MAIN_PLANE, + 0, + 0, 0, 0, + }; + int pixel_format; + + pixel_format = ChoosePixelFormat(hdc, &pfd); + if (!pixel_format) { + fputs("ChoosePixelFormat failed.\n", stderr); + exit(1); + } + + if (SetPixelFormat(hdc, pixel_format, &pfd) != TRUE) { + fputs("SetPixelFormat() failed.\n", stderr); + exit(1); + } +} + +static LRESULT CALLBACK +window_proc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) +{ + HDC hdc = GetDC(hwnd); + int ret; + + switch (message) { + case WM_CREATE: + setup_pixel_format(hdc); + ret = test_callback(hdc); + ReleaseDC(hwnd, hdc); + exit(ret); + return 0; + default: + return DefWindowProc(hwnd, message, wparam, lparam); + } +} + +void +make_window_and_test(int (*callback)(HDC hdc)) +{ + const char *class_name = "epoxy"; + const char *window_name = "epoxy"; + int width = 150; + int height = 150; + HWND hwnd; + HINSTANCE hcurrentinst = NULL; + WNDCLASS window_class; + MSG msg; + + test_callback = callback; + + memset(&window_class, 0, sizeof(window_class)); + window_class.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW; + window_class.lpfnWndProc = window_proc; + window_class.cbClsExtra = 0; + window_class.cbWndExtra = 0; + window_class.hInstance = hcurrentinst; + window_class.hIcon = LoadIcon(NULL, IDI_APPLICATION); + window_class.hCursor = LoadCursor(NULL, IDC_ARROW); + window_class.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); + window_class.lpszMenuName = NULL; + window_class.lpszClassName = class_name; + if (!RegisterClass(&window_class)) { + fputs("Failed to register window class\n", stderr); + exit(1); + } + + /* create window */ + hwnd = CreateWindow(class_name, window_name, + WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, + 0, 0, width, height, + NULL, NULL, hcurrentinst, NULL); + + ShowWindow(hwnd, SW_SHOWDEFAULT); + UpdateWindow(hwnd); + + while (GetMessage(&msg, NULL, 0, 0)) { + TranslateMessage(&msg); + DispatchMessage(&msg); + } +} diff --git a/local/recipes/libs/libepoxy/source/test/wgl_common.h b/local/recipes/libs/libepoxy/source/test/wgl_common.h new file mode 100644 index 0000000000..8b13d96f72 --- /dev/null +++ b/local/recipes/libs/libepoxy/source/test/wgl_common.h @@ -0,0 +1,27 @@ +/* + * Copyright © 2013 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include + +void +make_window_and_test(int (*callback)(HDC hdc)); diff --git a/local/recipes/libs/libepoxy/source/test/wgl_core_and_exts.c b/local/recipes/libs/libepoxy/source/test/wgl_core_and_exts.c new file mode 100644 index 0000000000..7d22acc9a2 --- /dev/null +++ b/local/recipes/libs/libepoxy/source/test/wgl_core_and_exts.c @@ -0,0 +1,80 @@ +/* + * Copyright © 2013 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include + +#include "wgl_common.h" +#include + +static int +test_function(HDC hdc) +{ + bool pass = true; + int val; + HGLRC ctx; + + ctx = wglCreateContext(hdc); + if (!ctx) { + fputs("Failed to create wgl context\n", stderr); + return 1; + } + if (!wglMakeCurrent(hdc, ctx)) { + fputs("Failed to make context current\n", stderr); + return 1; + } + + /* GL 1.0 APIs are available as symbols in opengl32.dll. */ + glEnable(GL_LIGHTING); + val = 0; + glGetIntegerv(GL_LIGHTING, &val); + if (!val) { + fputs("Enabling GL_LIGHTING didn't stick.\n", stderr); + pass = false; + } + + if (epoxy_gl_version() >= 15 || + epoxy_has_gl_extension("GL_ARB_vertex_buffer_object")) { + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 1234); + + val = 0; + glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &val); + if (val != 1234) { + printf("GL_ELEMENT_ARRAY_BUFFER_BINDING didn't stick: %d\n", val); + pass = false; + } + } + + wglMakeCurrent(NULL, NULL); + wglDeleteContext(ctx); + + return !pass; +} + +int +main(int argc, char **argv) +{ + make_window_and_test(test_function); + + /* UNREACHED */ + return 1; +} diff --git a/local/recipes/libs/libepoxy/source/test/wgl_per_context_funcptrs.c b/local/recipes/libs/libepoxy/source/test/wgl_per_context_funcptrs.c new file mode 100644 index 0000000000..2cf0dcbb50 --- /dev/null +++ b/local/recipes/libs/libepoxy/source/test/wgl_per_context_funcptrs.c @@ -0,0 +1,165 @@ +/* + * Copyright © 2013 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +/** + * @file wgl_per_context_funcptrs.c + * + * Tests that epoxy works correctly when wglGetProcAddress() returns + * different function pointers for different contexts. + * + * wgl allows that to be the case when the device or pixel format are + * different. We don't know if the underlying implementation actually + * *will* return different function pointers, so force the issue by + * overriding wglGetProcAddress() to return our function pointers with + * magic behavior. This way we can test epoxy's implementation + * regardless. + */ + +#include +#include + +#include "wgl_common.h" +#include + +#define CREATESHADER_CTX1_VAL 1001 +#define CREATESHADER_CTX2_VAL 1002 + +static HGLRC ctx1, ctx2, current_context; +static bool pass = true; + +#define OVERRIDE_API(type) __declspec(dllexport) type __stdcall + +OVERRIDE_API (GLuint) override_glCreateShader_ctx1(GLenum target); +OVERRIDE_API (GLuint) override_glCreateShader_ctx2(GLenum target); +OVERRIDE_API (PROC) override_wglGetProcAddress(LPCSTR name); + +OVERRIDE_API (GLuint) +override_glCreateShader_ctx1(GLenum target) +{ + if (current_context != ctx1) { + fputs("ctx1 called while other context current\n", stderr); + pass = false; + } + return CREATESHADER_CTX1_VAL; +} + +OVERRIDE_API (GLuint) +override_glCreateShader_ctx2(GLenum target) +{ + if (current_context != ctx2) { + fputs("ctx2 called while other context current\n", stderr); + pass = false; + } + return CREATESHADER_CTX2_VAL; +} + +OVERRIDE_API (PROC) +override_wglGetProcAddress(LPCSTR name) +{ + assert(strcmp(name, "glCreateShader") == 0); + + if (current_context == ctx1) { + return (PROC)override_glCreateShader_ctx1; + } else { + assert(current_context == ctx2); + return (PROC)override_glCreateShader_ctx2; + } +} + +static void +test_createshader(HDC hdc, HGLRC ctx) +{ + GLuint shader, expected; + int ctxnum; + + wglMakeCurrent(hdc, ctx); + current_context = ctx; + + /* Install our GPA override so we can force per-context function + * pointers. + */ + wglGetProcAddress = override_wglGetProcAddress; + + if (ctx == ctx1) { + expected = CREATESHADER_CTX1_VAL; + ctxnum = 1; + } else { + assert(ctx == ctx2); + expected = CREATESHADER_CTX2_VAL; + ctxnum = 2; + } + + shader = glCreateShader(GL_FRAGMENT_SHADER); + printf("ctx%d: Returned %d\n", ctxnum, shader); + if (shader != expected) { + fprintf(stderr, " expected %d\n", expected); + pass = false; + } +} + +static int +test_function(HDC hdc) +{ + ctx1 = wglCreateContext(hdc); + ctx2 = wglCreateContext(hdc); + if (!ctx1 || !ctx2) { + fputs("Failed to create wgl contexts\n", stderr); + return 1; + } + + if (!wglMakeCurrent(hdc, ctx1)) { + fputs("Failed to make context current\n", stderr); + return 1; + } + + if (epoxy_gl_version() < 20) { + /* We could possibly do a 1.3 entrypoint or something instead. */ + fputs("Test relies on overriding a GL 2.0 entrypoint\n", stderr); + return 77; + } + + /* Force resolving epoxy_wglGetProcAddress. */ + wglGetProcAddress("glCreateShader"); + + test_createshader(hdc, ctx1); + test_createshader(hdc, ctx1); + test_createshader(hdc, ctx2); + test_createshader(hdc, ctx2); + test_createshader(hdc, ctx1); + test_createshader(hdc, ctx2); + + wglMakeCurrent(NULL, NULL); + wglDeleteContext(ctx1); + wglDeleteContext(ctx2); + + return !pass; +} + +int +main(int argc, char **argv) +{ + make_window_and_test(test_function); + + /* UNREACHED */ + return 1; +} diff --git a/local/recipes/libs/libepoxy/source/test/wgl_usefontbitmaps.c b/local/recipes/libs/libepoxy/source/test/wgl_usefontbitmaps.c new file mode 100644 index 0000000000..d54e1ee168 --- /dev/null +++ b/local/recipes/libs/libepoxy/source/test/wgl_usefontbitmaps.c @@ -0,0 +1,74 @@ +/* + * Copyright © 2013 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include + +#include "wgl_common.h" +#include + +static int +test_function(HDC hdc) +{ + bool pass = true; + HGLRC ctx; + GLuint dlist[2] = {100, 101}; + const char *string = "some string"; + + ctx = wglCreateContext(hdc); + if (!ctx) { + fputs("Failed to create wgl context\n", stderr); + return 1; + } + if (!wglMakeCurrent(hdc, ctx)) { + fputs("Failed to make context current\n", stderr); + return 1; + } + + /* First, use the #ifdeffed variant of the function */ + wglUseFontBitmaps(hdc, 0, 255, dlist[0]); + glListBase(dlist[1]); + glCallLists(strlen(string), GL_UNSIGNED_BYTE, string); + + /* Now, use the specific version, manually. */ +#ifdef UNICODE + wglUseFontBitmapsW(hdc, 0, 255, dlist[0]); +#else + wglUseFontBitmapsA(hdc, 0, 255, dlist[0]); +#endif + glListBase(dlist[1]); + glCallLists(strlen(string), GL_UNSIGNED_BYTE, string); + + wglMakeCurrent(NULL, NULL); + wglDeleteContext(ctx); + + return !pass; +} + +int +main(int argc, char **argv) +{ + make_window_and_test(test_function); + + /* UNREACHED */ + return 1; +} diff --git a/local/recipes/libs/libxcvt/source/.gitlab-ci.yml b/local/recipes/libs/libxcvt/source/.gitlab-ci.yml new file mode 100644 index 0000000000..f165f91394 --- /dev/null +++ b/local/recipes/libs/libxcvt/source/.gitlab-ci.yml @@ -0,0 +1,112 @@ + +##################################################### +# # +# THIS FILE IS GENERATED, DO NOT EDIT! # +# # +# Generated with "ci-fairy generate-template", edit # +# .gitlab-ci/ci.template and .gitlab-ci/config.yml # +# and rerun "ci-fairy generate-template" to change # +# this file. # +# # +##################################################### + +.templates_sha: &template_sha 3d03cccd770c04e63b40325b42223495274d6a1d + +include: + - project: 'freedesktop/ci-templates' + ref: *template_sha + file: + - '/templates/ci-fairy.yml' + - '/templates/fedora.yml' + - template: Security/SAST.gitlab-ci.yml + +stages: + - sanity check + - prep + - build + - test + +variables: + FDO_UPSTREAM_REPO: xorg/lib/libxcvt + MESON_BUILDDIR: "builddir" + NINJA_ARGS: '' + MESON_ARGS: '' + MESON_TEST_ARGS: '' + GIT_DEPTH: 1 + +.policy: + retry: + max: 2 + when: + - runner_system_failure + - stuck_or_timeout_failure + # cancel run when a newer version is pushed to the branch + interruptible: true + + +# Re-generate the CI script and make sure it's the one currently checked in +# If this job fails, re-generate the gitlab-ci.yml script, see +# $SRCDIR/.gitlab-ci/generate-gitlab-ci.py +# +check-ci-script: + extends: + - .fdo.ci-fairy + stage: sanity check + script: + - ci-fairy generate-template --verify && exit 0 || true + - echo "Committed gitlab-ci.yml differs from generated gitlab-ci.yml. Please verify" + - exit 1 + +# +# Verify that commit messages are as expected, signed-off, etc. +# +check-commit: + extends: + - .fdo.ci-fairy + stage: sanity check + script: + - ci-fairy check-commits --signed-off-by --junit-xml=results.xml + except: + - master@xorg/lib/libxcvt + variables: + GIT_DEPTH: 100 + artifacts: + reports: + junit: results.xml + +# +# Verify that merge request has the "allow collaboration" checkbox ticked +# +check-merge-request: + extends: + - .fdo.ci-fairy + stage: sanity check + script: + - ci-fairy check-merge-request --require-allow-collaboration --junit-xml=results.xml + artifacts: + when: on_failure + reports: + junit: results.xml + allow_failure: true + + +.fedora.34: + variables: + FDO_DISTRIBUTION_VERSION: '34' + FDO_DISTRIBUTION_TAG: '2022-08-03.0' + +prep-fedora-34: + extends: + - .fdo.container-build@fedora + - .fedora.34 + stage: prep + variables: + FDO_DISTRIBUTION_PACKAGES: "meson gcc" + +build-fedora-34: + extends: + - .fdo.distribution-image@fedora + - .fedora.34 + stage: build + script: + - .gitlab-ci/meson-build.sh diff --git a/local/recipes/libs/libxcvt/source/.gitlab-ci/ci.template b/local/recipes/libs/libxcvt/source/.gitlab-ci/ci.template new file mode 100644 index 0000000000..3728fcc786 --- /dev/null +++ b/local/recipes/libs/libxcvt/source/.gitlab-ci/ci.template @@ -0,0 +1,118 @@ +{# You're looking at the template here, so you can ignore the below + warning. This is the right file to edit #} + +##################################################### +# # +# THIS FILE IS GENERATED, DO NOT EDIT! # +# # +# Generated with "ci-fairy generate-template", edit # +# .gitlab-ci/ci.template and .gitlab-ci/config.yml # +# and rerun "ci-fairy generate-template" to change # +# this file. # +# # +##################################################### + +.templates_sha: &template_sha 3d03cccd770c04e63b40325b42223495274d6a1d + +include: + - project: 'freedesktop/ci-templates' + ref: *template_sha + file: + - '/templates/ci-fairy.yml' + {% for d in distributions %} + - '/templates/{{d.name}}.yml' + {% endfor %} + - template: Security/SAST.gitlab-ci.yml + +stages: + - sanity check + - prep + - build + - test + +variables: + FDO_UPSTREAM_REPO: xorg/lib/libxcvt + MESON_BUILDDIR: "builddir" + NINJA_ARGS: '' + MESON_ARGS: '' + MESON_TEST_ARGS: '' + GIT_DEPTH: 1 + +.policy: + retry: + max: 2 + when: + - runner_system_failure + - stuck_or_timeout_failure + # cancel run when a newer version is pushed to the branch + interruptible: true + + +# Re-generate the CI script and make sure it's the one currently checked in +# If this job fails, re-generate the gitlab-ci.yml script, see +# $SRCDIR/.gitlab-ci/generate-gitlab-ci.py +# +check-ci-script: + extends: + - .fdo.ci-fairy + stage: sanity check + script: + - ci-fairy generate-template --verify && exit 0 || true + - echo "Committed gitlab-ci.yml differs from generated gitlab-ci.yml. Please verify" + - exit 1 + +# +# Verify that commit messages are as expected, signed-off, etc. +# +check-commit: + extends: + - .fdo.ci-fairy + stage: sanity check + script: + - ci-fairy check-commits --signed-off-by --junit-xml=results.xml + except: + - master@xorg/lib/libxcvt + variables: + GIT_DEPTH: 100 + artifacts: + reports: + junit: results.xml + +# +# Verify that merge request has the "allow collaboration" checkbox ticked +# +check-merge-request: + extends: + - .fdo.ci-fairy + stage: sanity check + script: + - ci-fairy check-merge-request --require-allow-collaboration --junit-xml=results.xml + artifacts: + when: on_failure + reports: + junit: results.xml + allow_failure: true + +{% for d in distributions %} + +.{{d.name}}.{{d.version}}: + variables: + FDO_DISTRIBUTION_VERSION: '{{d.version}}' + FDO_DISTRIBUTION_TAG: '{{d.tag}}' + +prep-{{d.name}}-{{d.version}}: + extends: + - .fdo.container-build@{{d.name}} + - .{{d.name}}.{{d.version}} + stage: prep + variables: + FDO_DISTRIBUTION_PACKAGES: "{{' '.join(d.packages)}}" + +build-{{d.name}}-{{d.version}}: + extends: + - .fdo.distribution-image@{{d.name}} + - .{{d.name}}.{{d.version}} + stage: build + script: + - .gitlab-ci/meson-build.sh +{% endfor %} diff --git a/local/recipes/libs/libxcvt/source/.gitlab-ci/config.yml b/local/recipes/libs/libxcvt/source/.gitlab-ci/config.yml new file mode 100644 index 0000000000..a17c3e7918 --- /dev/null +++ b/local/recipes/libs/libxcvt/source/.gitlab-ci/config.yml @@ -0,0 +1,9 @@ +.default_tag: &default_tag '2022-08-03.0' + +distributions: + - name: fedora + tag: *default_tag + version: 34 + packages: + - meson + - gcc diff --git a/local/recipes/libs/libxcvt/source/.gitlab-ci/meson-build.sh b/local/recipes/libs/libxcvt/source/.gitlab-ci/meson-build.sh new file mode 100755 index 0000000000..50b84b0182 --- /dev/null +++ b/local/recipes/libs/libxcvt/source/.gitlab-ci/meson-build.sh @@ -0,0 +1,48 @@ +#!/bin/bash + +if [[ -f .meson_environment ]]; then + . .meson_environment +fi + +if [[ -z "$MESON_BUILDDIR" ]]; then + echo "\$MESON_BUILDDIR undefined." + exit 1 +fi + +# emulate a few gitlab variables to make it easier to +# run and debug locally. +if [[ -z "$CI_JOB_ID" ]] || [[ -z "$CI_JOB_NAME" ]] || [[ -z "$CI_PROJECT_NAME" ]]; then + echo "Missing \$CI_JOB_ID or \$CI_JOB_NAME". + CI_PROJECT_NAME=$(basename $PWD) + CI_JOB_ID=$(date +%s) + CI_JOB_NAME='${CI_PROJECT_NAME}-job-local' + echo "Simulating gitlab environment: " + echo " CI_JOB_ID=$CI_JOB_ID" + echo " CI_JOB_NAME=$CI_JOB_NAME" + echo " CI_PROJECT_NAME=$CI_PROJECT_NAME" +fi + + +echo "*************************************************" +echo "builddir: $MESON_BUILDDIR" +echo "meson args: $MESON_ARGS" +echo "ninja args: $NINJA_ARGS" +echo "meson test args: $MESON_TEST_ARGS" +echo "*************************************************" + +set -e + +rm -rf "$MESON_BUILDDIR" +meson "$MESON_BUILDDIR" $MESON_ARGS +meson configure "$MESON_BUILDDIR" +ninja -C "$MESON_BUILDDIR" $NINJA_ARGS + +if [[ -z "$MESON_TEST_ARGS" ]]; then + exit 0 +fi + +# we still want to generate the reports, even if meson test fails +meson test -C "$MESON_BUILDDIR" $MESON_TEST_ARGS --print-errorlogs +exit_code=$? + +exit $exit_code diff --git a/local/recipes/libs/libxcvt/source/COPYING b/local/recipes/libs/libxcvt/source/COPYING new file mode 100644 index 0000000000..274db76b26 --- /dev/null +++ b/local/recipes/libs/libxcvt/source/COPYING @@ -0,0 +1,67 @@ +Copyright 2005-2006 Luc Verhaegen. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + + + +Copyright 2005-2006 Luc Verhaegen. +Copyright © 2021 Red Hat, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + + + +Copyright © 2000 Compaq Computer Corporation +Copyright © 2002 Hewlett Packard Company +Copyright © 2006 Intel Corporation +Copyright © 2008, 2021 Red Hat, Inc. + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that copyright +notice and this permission notice appear in supporting documentation, and +that the name of the copyright holders not be used in advertising or +publicity pertaining to distribution of the software without specific, +written prior permission. The copyright holders make no representations +about the suitability of this software for any purpose. It is provided "as +is" without express or implied warranty. + +THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR +CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE +OF THIS SOFTWARE. diff --git a/local/recipes/libs/libxcvt/source/README.md b/local/recipes/libs/libxcvt/source/README.md new file mode 100644 index 0000000000..99571bc63c --- /dev/null +++ b/local/recipes/libs/libxcvt/source/README.md @@ -0,0 +1,36 @@ +libxcvt +======= + +`libxcvt` is a library providing a standalone version of the X server +implementation of the VESA CVT standard timing modelines generator. + +`libxcvt` also provides a standalone version of the command line tool +`cvt` copied from the Xorg implementation and is meant to be a direct +replacement to the version provided by the `Xorg` server. + +An example output is: + +``` +$ cvt --verbose 1920 1200 75 +# 1920x1200 74.93 Hz (CVT 2.30MA) hsync: 94.04 kHz; pclk: 245.25 MHz +Modeline "1920x1200_75.00" 245.25 1920 2064 2264 2608 1200 1203 1209 1255 -hsync +vsync +``` + +Building +======== + +`libxcvt` is built using [Meson](https://mesonbuild.com/) + + $ git clone https://gitlab.freedesktop.org/xorg/lib/libxcvt.git + $ cd libxcvt + $ meson build/ --prefix=... + $ ninja -C build/ install + $ cd .. + +Credit +====== + +The code base of `libxcvt` is identical to `xf86CVTMode()` therefore +all credits for `libxcvt` go to the author (Luc Verhaegen) and +contributors of `xf86CVTMode()` and the `cvt` utility as found in the +[xserver](https://gitlab.freedesktop.org/xorg/xserver/) repository. diff --git a/local/recipes/libs/libxcvt/source/cvt/cvt.c b/local/recipes/libs/libxcvt/source/cvt/cvt.c new file mode 100644 index 0000000000..90c0c8d045 --- /dev/null +++ b/local/recipes/libs/libxcvt/source/cvt/cvt.c @@ -0,0 +1,257 @@ +/* + * Copyright 2005-2006 Luc Verhaegen. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + */ + +/* Standalone VESA CVT standard timing modelines generator. */ + +#include +#include +#include +#include + +#include + +static bool +cvt_is_standard(int hdisplay, int vdisplay, float vrefresh, bool reduced, bool verbose) +{ + bool is_cvt = true; + + if ((!(vdisplay % 3) && ((vdisplay * 4 / 3) == hdisplay)) || + (!(vdisplay % 9) && ((vdisplay * 16 / 9) == hdisplay)) || + (!(vdisplay % 10) && ((vdisplay * 16 / 10) == hdisplay)) || + (!(vdisplay % 4) && ((vdisplay * 5 / 4) == hdisplay)) || + (!(vdisplay % 9) && ((vdisplay * 15 / 9) == hdisplay))); + else { + if (verbose) + fprintf(stderr, "Warning: Aspect Ratio is not CVT standard.\n"); + is_cvt = false; + } + + if ((vrefresh != 50.0) && (vrefresh != 60.0) && + (vrefresh != 75.0) && (vrefresh != 85.0)) { + if (verbose) + fprintf(stderr, "Warning: Refresh Rate %.2f is not CVT standard " + "(50, 60, 75 or 85Hz).\n", vrefresh); + is_cvt = false; + } + + return is_cvt; +} +/* + * I'm not documenting --interlaced for obvious reasons, even though I did + * implement it. I also can't deny having looked at gtf here. + */ +static void +print_usage(char *Name) +{ + fprintf(stderr, "\n"); + fprintf(stderr, "usage: %s [-v|--verbose] [-r|--reduced] X Y [refresh]\n", + Name); + fprintf(stderr, "\n"); + fprintf(stderr, " -v|--verbose : Warn about CVT standard adherence.\n"); + fprintf(stderr, " -r|--reduced : Create a mode with reduced blanking " + "(default: normal blanking).\n"); + fprintf(stderr, " X : Desired horizontal resolution " + "(multiple of 8, required).\n"); + fprintf(stderr, + " Y : Desired vertical resolution (required).\n"); + fprintf(stderr, + " refresh : Desired refresh rate (default: 60.0Hz).\n"); + fprintf(stderr, "\n"); + + fprintf(stderr, "Calculates VESA CVT (Coordinated Video Timing) modelines" + " for use with X.\n"); +} + +/* + * + */ +static void +print_comment(struct libxcvt_mode_info *mode_info, bool is_cvt, bool reduced) +{ + printf("# %dx%d %.2f Hz ", mode_info->hdisplay, mode_info->vdisplay, mode_info->vrefresh); + + if (is_cvt) { + printf("(CVT %.2fM", + ((float) mode_info->hdisplay * mode_info->vdisplay) / 1000000.0); + + if (!(mode_info->vdisplay % 3) && + ((mode_info->vdisplay * 4 / 3) == mode_info->hdisplay)) + printf("3"); + else if (!(mode_info->vdisplay % 9) && + ((mode_info->vdisplay * 16 / 9) == mode_info->hdisplay)) + printf("9"); + else if (!(mode_info->vdisplay % 10) && + ((mode_info->vdisplay * 16 / 10) == mode_info->hdisplay)) + printf("A"); + else if (!(mode_info->vdisplay % 4) && + ((mode_info->vdisplay * 5 / 4) == mode_info->hdisplay)) + printf("4"); + else if (!(mode_info->vdisplay % 9) && + ((mode_info->vdisplay * 15 / 9) == mode_info->hdisplay)) + printf("9"); + + if (reduced) + printf("-R"); + + printf(") "); + } + else + printf("(CVT) "); + + printf("hsync: %.2f kHz; ", mode_info->hsync); + printf("pclk: %.2f MHz", ((float) mode_info->dot_clock) / 1000.0); + + printf("\n"); +} + +/* + * Originally grabbed from xf86Mode.c. + * + * Ignoring the actual mode_info->name, as the user will want something solid + * to grab hold of. + */ +static void +print_mode_line(struct libxcvt_mode_info *mode_info, int hdisplay, int vdisplay, float vrefresh, + bool reduced) +{ + if (reduced) + printf("Modeline \"%dx%dR\" ", hdisplay, vdisplay); + else + printf("Modeline \"%dx%d_%.2f\" ", hdisplay, vdisplay, vrefresh); + + printf("%6.2f %i %i %i %i %i %i %i %i", mode_info->dot_clock / 1000., + mode_info->hdisplay, mode_info->hsync_start, mode_info->hsync_end, mode_info->htotal, + mode_info->vdisplay, mode_info->vsync_start, mode_info->vsync_end, mode_info->vtotal); + + if (mode_info->mode_flags & LIBXCVT_MODE_FLAG_INTERLACE) + printf(" interlace"); + if (mode_info->mode_flags & LIBXCVT_MODE_FLAG_HSYNC_POSITIVE) + printf(" +hsync"); + if (mode_info->mode_flags & LIBXCVT_MODE_FLAG_HSYNC_NEGATIVE) + printf(" -hsync"); + if (mode_info->mode_flags & LIBXCVT_MODE_FLAG_VSYNC_POSITIVE) + printf(" +vsync"); + if (mode_info->mode_flags & LIBXCVT_MODE_FLAG_VSYNC_NEGATIVE) + printf(" -vsync"); + + printf("\n"); +} + +/* + * + */ +int +main(int argc, char *argv[]) +{ + struct libxcvt_mode_info *mode_info; + int hdisplay = 0, vdisplay = 0; + float vrefresh = 0.0; + bool reduced = false, verbose = false, is_cvt; + bool interlaced = false; + int n; + + if ((argc < 3) || (argc > 7)) { + print_usage(argv[0]); + return 1; + } + + /* This doesn't filter out bad flags properly. Bad flags get passed down + * to atoi/atof, which then return 0, so that these variables can get + * filled next time round. So this is just a cosmetic problem. + */ + for (n = 1; n < argc; n++) { + if (!strcmp(argv[n], "-r") || !strcmp(argv[n], "--reduced")) + reduced = true; + else if (!strcmp(argv[n], "-i") || !strcmp(argv[n], "--interlaced")) + interlaced = true; + else if (!strcmp(argv[n], "-v") || !strcmp(argv[n], "--verbose")) + verbose = true; + else if (!strcmp(argv[n], "-h") || !strcmp(argv[n], "--help")) { + print_usage(argv[0]); + return 0; + } + else if (!hdisplay) { + hdisplay = atoi(argv[n]); + if (!hdisplay) { + print_usage(argv[0]); + return 1; + } + } + else if (!vdisplay) { + vdisplay = atoi(argv[n]); + if (!vdisplay) { + print_usage(argv[0]); + return 1; + } + } + else if (!vrefresh) { + vrefresh = atof(argv[n]); + if (!vrefresh) { + print_usage(argv[0]); + return 1; + } + } + else { + print_usage(argv[0]); + return 1; + } + } + + if (!hdisplay || !vdisplay) { + print_usage(argv[0]); + return 0; + } + + /* Default to 60.0Hz */ + if (!vrefresh) + vrefresh = 60.0; + + /* Horizontal timing is always a multiple of 8: round up. */ + if (hdisplay & 0x07) { + hdisplay &= ~0x07; + hdisplay += 8; + } + + if (reduced) { + if ((vrefresh / 60.0) != floor(vrefresh / 60.0)) { + fprintf(stderr, + "\nERROR: Multiple of 60Hz refresh rate required for " + " reduced blanking.\n"); + print_usage(argv[0]); + return 0; + } + } + + mode_info = libxcvt_gen_mode_info(hdisplay, vdisplay, vrefresh, reduced, interlaced); + if (!mode_info) { + fprintf(stderr, "Out of memory!\n"); + return 0; + } + + is_cvt = cvt_is_standard(hdisplay, vdisplay, vrefresh, reduced, verbose); + print_comment(mode_info, is_cvt, reduced); + print_mode_line(mode_info, hdisplay, vdisplay, vrefresh, reduced); + free(mode_info); + + return 0; +} diff --git a/local/recipes/libs/libxcvt/source/cvt/meson.build b/local/recipes/libs/libxcvt/source/cvt/meson.build new file mode 100644 index 0000000000..5262471960 --- /dev/null +++ b/local/recipes/libs/libxcvt/source/cvt/meson.build @@ -0,0 +1,10 @@ +cvt_src = [ + 'cvt.c', +] + +executable('cvt', + cvt_src, + include_directories : inc, + link_with : libxcvt, + dependencies: mdep, + install : true) diff --git a/local/recipes/libs/libxcvt/source/include/libxcvt/libxcvt.h b/local/recipes/libs/libxcvt/source/include/libxcvt/libxcvt.h new file mode 100644 index 0000000000..051a871288 --- /dev/null +++ b/local/recipes/libs/libxcvt/source/include/libxcvt/libxcvt.h @@ -0,0 +1,46 @@ +/* + * Copyright 2005-2006 Luc Verhaegen. + * Copyright © 2021 Red Hat, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + */ + +#ifndef _LIBCVT_H_ +#define _LIBCVT_H_ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct libxcvt_mode_info * +libxcvt_gen_mode_info(int hdisplay, + int vdisplay, + float vrefresh, + bool reduced, + bool interlaced); + +#ifdef __cplusplus +} +#endif + +#endif /* _LIBCVT_H_ */ diff --git a/local/recipes/libs/libxcvt/source/include/libxcvt/libxcvt_mode.h b/local/recipes/libs/libxcvt/source/include/libxcvt/libxcvt_mode.h new file mode 100644 index 0000000000..f29739e73c --- /dev/null +++ b/local/recipes/libs/libxcvt/source/include/libxcvt/libxcvt_mode.h @@ -0,0 +1,56 @@ +/* + * Copyright © 2000 Compaq Computer Corporation + * Copyright © 2002 Hewlett Packard Company + * Copyright © 2006 Intel Corporation + * Copyright © 2008, 2021 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that copyright + * notice and this permission notice appear in supporting documentation, and + * that the name of the copyright holders not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. The copyright holders make no representations + * about the suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + * + */ + +#ifndef _LIBXCVT_MODE_H_ +#define _LIBXCVT_MODE_H_ + +#include + +/* Conveniently chosen to match the RandR definitions */ +enum libxcvt_mode_flags { + LIBXCVT_MODE_FLAG_HSYNC_POSITIVE = (1 << 0), + LIBXCVT_MODE_FLAG_HSYNC_NEGATIVE = (1 << 1), + LIBXCVT_MODE_FLAG_VSYNC_POSITIVE = (1 << 2), + LIBXCVT_MODE_FLAG_VSYNC_NEGATIVE = (1 << 3), + LIBXCVT_MODE_FLAG_INTERLACE = (1 << 4), +}; + +struct libxcvt_mode_info { + uint32_t hdisplay; + uint32_t vdisplay; + float vrefresh; + float hsync; + uint64_t dot_clock; + uint16_t hsync_start; + uint16_t hsync_end; + uint16_t htotal; + uint16_t vsync_start; + uint16_t vsync_end; + uint16_t vtotal; + enum libxcvt_mode_flags mode_flags; +}; + +#endif /* _LIBXCVT_MODE_H_ */ diff --git a/local/recipes/libs/libxcvt/source/include/libxcvt/meson.build b/local/recipes/libs/libxcvt/source/include/libxcvt/meson.build new file mode 100644 index 0000000000..fde2cbe05c --- /dev/null +++ b/local/recipes/libs/libxcvt/source/include/libxcvt/meson.build @@ -0,0 +1 @@ +install_headers('libxcvt.h','libxcvt_mode.h', subdir: 'libxcvt') diff --git a/local/recipes/libs/libxcvt/source/include/meson.build b/local/recipes/libs/libxcvt/source/include/meson.build new file mode 100644 index 0000000000..4fbe7bddb6 --- /dev/null +++ b/local/recipes/libs/libxcvt/source/include/meson.build @@ -0,0 +1 @@ +subdir('libxcvt') diff --git a/local/recipes/libs/libxcvt/source/lib/libxcvt.c b/local/recipes/libs/libxcvt/source/lib/libxcvt.c new file mode 100644 index 0000000000..003c8221d1 --- /dev/null +++ b/local/recipes/libs/libxcvt/source/lib/libxcvt.c @@ -0,0 +1,301 @@ +/* + * Copyright 2005-2006 Luc Verhaegen. + * Copyright © 2021 Red Hat, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + */ + +/* Standalone VESA CVT standard timing modelines generator. */ + + +#include +#include +#include + +#include + +/* + * Generate a CVT standard mode from hdisplay, vdisplay and vrefresh. + * + * These calculations are stolen from the CVT calculation spreadsheet written + * by Graham Loveridge. He seems to be claiming no copyright and there seems to + * be no license attached to this. He apparently just wants to see his name + * mentioned. + * + * This file can be found at http://www.vesa.org/Public/CVT/CVTd6r1.xls + * + * Comments and structure corresponds to the comments and structure of the xls. + * This should ease importing of future changes to the standard (not very + * likely though). + * + * About margins; i'm sure that they are to be the bit between HDisplay and + * HBlankStart, HBlankEnd and HTotal, VDisplay and VBlankStart, VBlankEnd and + * VTotal, where the overscan colour is shown. FB seems to call _all_ blanking + * outside sync "margin" for some reason. Since we prefer seeing proper + * blanking instead of the overscan colour, and since the Crtc* values will + * probably get altered after us, we will disable margins altogether. With + * these calculations, Margins will plainly expand H/VDisplay, and we don't + * want that. -- libv + * + */ +struct libxcvt_mode_info * +libxcvt_gen_mode_info(int hdisplay, int vdisplay, float vrefresh, bool reduced, bool interlaced) +{ + bool margins = false; + float vfield_rate, hperiod; + int hdisplay_rnd, hmargin; + int vdisplay_rnd, vmargin, vsync; + float interlace; /* Please rename this */ + struct libxcvt_mode_info *mode_info; + + mode_info = calloc(1, sizeof *mode_info); + if (!mode_info) + return NULL; + + mode_info->hdisplay = hdisplay; + mode_info->vdisplay = vdisplay; + mode_info->vrefresh = vrefresh; + + /* 1) top/bottom margin size (% of height) - default: 1.8 */ +#define CVT_MARGIN_PERCENTAGE 1.8 + + /* 2) character cell horizontal granularity (pixels) - default 8 */ +#define CVT_H_GRANULARITY 8 + + /* 4) Minimum vertical front porch (lines) - default 3 */ +#define CVT_MIN_V_PORCH_RND 3 + + /* 4) Minimum number of vertical back porch lines - default 6 */ +#define CVT_MIN_V_BPORCH 6 + + /* Pixel Clock step (kHz) */ +#define CVT_CLOCK_STEP 250 + + /* CVT default is 60.0Hz */ + if (!mode_info->vrefresh) + mode_info->vrefresh = 60.0; + + /* 1. Required field rate */ + if (interlaced) + vfield_rate = mode_info->vrefresh * 2; + else + vfield_rate = mode_info->vrefresh; + + /* 2. Horizontal pixels */ + hdisplay_rnd = mode_info->hdisplay - (mode_info->hdisplay % CVT_H_GRANULARITY); + + /* 3. Determine left and right borders */ + if (margins) { + /* right margin is actually exactly the same as left */ + hmargin = (((float) hdisplay_rnd) * CVT_MARGIN_PERCENTAGE / 100.0); + hmargin -= hmargin % CVT_H_GRANULARITY; + } + else { + hmargin = 0; + } + + /* 4. Find total active pixels */ + mode_info->hdisplay = hdisplay_rnd + 2 * hmargin; + + /* 5. Find number of lines per field */ + if (interlaced) + vdisplay_rnd = mode_info->vdisplay / 2; + else + vdisplay_rnd = mode_info->vdisplay; + + /* 6. Find top and bottom margins */ + /* nope. */ + if (margins) + /* top and bottom margins are equal again. */ + vmargin = (((float) vdisplay_rnd) * CVT_MARGIN_PERCENTAGE / 100.0); + else + vmargin = 0; + + mode_info->vdisplay = mode_info->vdisplay + 2 * vmargin; + + /* 7. interlace */ + if (interlaced) + interlace = 0.5; + else + interlace = 0.0; + + /* Determine vsync Width from aspect ratio */ + if (!(mode_info->vdisplay % 3) && ((mode_info->vdisplay * 4 / 3) == mode_info->hdisplay)) + vsync = 4; + else if (!(mode_info->vdisplay % 9) && ((mode_info->vdisplay * 16 / 9) == mode_info->hdisplay)) + vsync = 5; + else if (!(mode_info->vdisplay % 10) && ((mode_info->vdisplay * 16 / 10) == mode_info->hdisplay)) + vsync = 6; + else if (!(mode_info->vdisplay % 4) && ((mode_info->vdisplay * 5 / 4) == mode_info->hdisplay)) + vsync = 7; + else if (!(mode_info->vdisplay % 9) && ((mode_info->vdisplay * 15 / 9) == mode_info->hdisplay)) + vsync = 7; + else /* Custom */ + vsync = 10; + + if (!reduced) { /* simplified GTF calculation */ + + /* 4) Minimum time of vertical sync + back porch interval (µs) + * default 550.0 */ +#define CVT_MIN_VSYNC_BP 550.0 + + /* 3) Nominal HSync width (% of line period) - default 8 */ +#define CVT_HSYNC_PERCENTAGE 8 + + float hblank_percentage; + int vsync_and_back_porch, vback_porch; + int hblank, hsync_w; + + /* 8. Estimated Horizontal period */ + hperiod = ((float) (1000000.0 / vfield_rate - CVT_MIN_VSYNC_BP)) / + (vdisplay_rnd + 2 * vmargin + CVT_MIN_V_PORCH_RND + interlace); + + /* 9. Find number of lines in sync + backporch */ + if (((int) (CVT_MIN_VSYNC_BP / hperiod) + 1) < + (vsync + CVT_MIN_V_BPORCH)) + vsync_and_back_porch = vsync + CVT_MIN_V_BPORCH; + else + vsync_and_back_porch = (int) (CVT_MIN_VSYNC_BP / hperiod) + 1; + + /* 10. Find number of lines in back porch */ + vback_porch = vsync_and_back_porch - vsync; + (void) vback_porch; + + /* 11. Find total number of lines in vertical field */ + mode_info->vtotal = + vdisplay_rnd + 2 * vmargin + vsync_and_back_porch + interlace + + CVT_MIN_V_PORCH_RND; + + /* 5) Definition of Horizontal blanking time limitation */ + /* Gradient (%/kHz) - default 600 */ +#define CVT_M_FACTOR 600 + + /* Offset (%) - default 40 */ +#define CVT_C_FACTOR 40 + + /* Blanking time scaling factor - default 128 */ +#define CVT_K_FACTOR 128 + + /* Scaling factor weighting - default 20 */ +#define CVT_J_FACTOR 20 + +#define CVT_M_PRIME CVT_M_FACTOR * CVT_K_FACTOR / 256 +#define CVT_C_PRIME (CVT_C_FACTOR - CVT_J_FACTOR) * CVT_K_FACTOR / 256 + \ + CVT_J_FACTOR + + /* 12. Find ideal blanking duty cycle from formula */ + hblank_percentage = CVT_C_PRIME - CVT_M_PRIME * hperiod / 1000.0; + + /* 13. Blanking time */ + if (hblank_percentage < 20) + hblank_percentage = 20; + + hblank = mode_info->hdisplay * hblank_percentage / (100.0 - hblank_percentage); + hblank -= hblank % (2 * CVT_H_GRANULARITY); + + /* 14. Find total number of pixels in a line. */ + mode_info->htotal = mode_info->hdisplay + hblank; + + /* Fill in HSync values */ + mode_info->hsync_end = mode_info->hdisplay + hblank / 2; + + hsync_w = (mode_info->htotal * CVT_HSYNC_PERCENTAGE) / 100; + hsync_w -= hsync_w % CVT_H_GRANULARITY; + mode_info->hsync_start = mode_info->hsync_end - hsync_w; + + /* Fill in vsync values */ + mode_info->vsync_start = mode_info->vdisplay + CVT_MIN_V_PORCH_RND; + mode_info->vsync_end = mode_info->vsync_start + vsync; + + } + else { /* reduced blanking */ + /* Minimum vertical blanking interval time (µs) - default 460 */ +#define CVT_RB_MIN_VBLANK 460.0 + + /* Fixed number of clocks for horizontal sync */ +#define CVT_RB_H_SYNC 32.0 + + /* Fixed number of clocks for horizontal blanking */ +#define CVT_RB_H_BLANK 160.0 + + /* Fixed number of lines for vertical front porch - default 3 */ +#define CVT_RB_VFPORCH 3 + + int vblank_interval_lines; + + /* 8. Estimate Horizontal period. */ + hperiod = ((float) (1000000.0 / vfield_rate - CVT_RB_MIN_VBLANK)) / + (vdisplay_rnd + 2 * vmargin); + + /* 9. Find number of lines in vertical blanking */ + vblank_interval_lines = ((float) CVT_RB_MIN_VBLANK) / hperiod + 1; + + /* 10. Check if vertical blanking is sufficient */ + if (vblank_interval_lines < (CVT_RB_VFPORCH + vsync + CVT_MIN_V_BPORCH)) + vblank_interval_lines = CVT_RB_VFPORCH + vsync + CVT_MIN_V_BPORCH; + + /* 11. Find total number of lines in vertical field */ + mode_info->vtotal = vdisplay_rnd + 2 * vmargin + interlace + vblank_interval_lines; + + /* 12. Find total number of pixels in a line */ + mode_info->htotal = mode_info->hdisplay + CVT_RB_H_BLANK; + + /* Fill in HSync values */ + mode_info->hsync_end = mode_info->hdisplay + CVT_RB_H_BLANK / 2; + mode_info->hsync_start = mode_info->hsync_end - CVT_RB_H_SYNC; + + /* Fill in vsync values */ + mode_info->vsync_start = mode_info->vdisplay + CVT_RB_VFPORCH; + mode_info->vsync_end = mode_info->vsync_start + vsync; + } + + /* 15/13. Find pixel clock frequency (kHz for xf86) */ + mode_info->dot_clock = mode_info->htotal * 1000.0 / hperiod; + mode_info->dot_clock -= mode_info->dot_clock % CVT_CLOCK_STEP; + + /* 16/14. Find actual Horizontal Frequency (kHz) */ + mode_info->hsync = ((float) mode_info->dot_clock) / ((float) mode_info->htotal); + + /* 17/15. Find actual Field rate */ + mode_info->vrefresh = (1000.0 * ((float) mode_info->dot_clock)) / + ((float) (mode_info->htotal * mode_info->vtotal)); + + /* 18/16. Find actual vertical frame frequency */ + /* ignore - just set the mode flag for interlaced */ + if (interlaced) + mode_info->vtotal *= 2; + + if (reduced) + mode_info->mode_flags |= LIBXCVT_MODE_FLAG_HSYNC_POSITIVE | LIBXCVT_MODE_FLAG_VSYNC_NEGATIVE; + else + mode_info->mode_flags |= LIBXCVT_MODE_FLAG_HSYNC_NEGATIVE | LIBXCVT_MODE_FLAG_VSYNC_POSITIVE; + + if (interlaced) + mode_info->mode_flags |= LIBXCVT_MODE_FLAG_INTERLACE; + + /* FWXGA hack adapted from hw/xfree86/modes/xf86EdidModes.c, because you can't say 1366 */ + if (mode_info->hdisplay == 1360 && mode_info->vdisplay == 768) { + mode_info->hdisplay = 1366; + mode_info->hsync_start--; + mode_info->hsync_end--; + } + + return mode_info; +} diff --git a/local/recipes/libs/libxcvt/source/lib/meson.build b/local/recipes/libs/libxcvt/source/lib/meson.build new file mode 100644 index 0000000000..b3ff615c69 --- /dev/null +++ b/local/recipes/libs/libxcvt/source/lib/meson.build @@ -0,0 +1,6 @@ +libxcvt_sources = ['libxcvt.c'] +libxcvt = shared_library('xcvt', + libxcvt_sources, + include_directories : inc, + version: meson.project_version(), + install : true) diff --git a/local/recipes/libs/libxcvt/source/man/cvt.man b/local/recipes/libs/libxcvt/source/man/cvt.man new file mode 100644 index 0000000000..009ab6540b --- /dev/null +++ b/local/recipes/libs/libxcvt/source/man/cvt.man @@ -0,0 +1,41 @@ +.TH CVT 1 @vendorversion@ +.SH NAME +cvt - calculate VESA CVT mode lines +.SH SYNOPSIS +.B cvt +.RB [ \-v | \-\-verbose ] +.RB [ \-r | \-\-reduced ] +.I h-resolution +.I v-resolution +.RB [ refresh ] +.SH DESCRIPTION +.I Cvt +is a utility for calculating VESA Coordinated Video Timing modes. Given the +desired horizontal and vertical resolutions, a modeline adhering to the CVT +standard is printed. This modeline can be included in Xorg +.B xorg.conf(@filemansuffix@) +. + +.SH OPTIONS +.TP 8 +.BR refresh +Provide a vertical refresh rate in Hz. The CVT standard prefers either 50.0, +60.0, 75.0 or 85.0Hz. The default is 60.0Hz. +.TP 8 +.BR \-v | \-\-verbose +Warn verbosely when a given mode does not completely correspond with CVT +standards. +.TP 8 +.BR \-r | \-\-reduced +Create a mode with reduced blanking. This allows for higher frequency signals, +with a lower or equal dotclock. Not for Cathode Ray Tube based displays though. + +.SH "SEE ALSO" +xorg.conf(@filemansuffix@), gtf(@appmansuffix@) +.SH AUTHOR +Luc Verhaegen. +.PP +This program is based on the Coordinated Video Timing sample +implementation written by Graham Loveridge. This file is publicly +available at . CVT is a +VESA trademark. diff --git a/local/recipes/libs/libxcvt/source/man/meson.build b/local/recipes/libs/libxcvt/source/man/meson.build new file mode 100644 index 0000000000..5234b162c4 --- /dev/null +++ b/local/recipes/libs/libxcvt/source/man/meson.build @@ -0,0 +1,12 @@ +man_conf = configuration_data() +man_conf.set('appmansuffix', '1') +man_conf.set('filemansuffix', '5') +man_conf.set('vendorversion', + '"libxcvt @0@" "X Version 11"'.format(meson.project_version())) + +configure_file( + input: 'cvt.man', + output: 'cvt.1', + install_dir: join_paths(man, 'man1'), + configuration: man_conf +) diff --git a/local/recipes/libs/libxcvt/source/meson.build b/local/recipes/libs/libxcvt/source/meson.build new file mode 100644 index 0000000000..23622a35bd --- /dev/null +++ b/local/recipes/libs/libxcvt/source/meson.build @@ -0,0 +1,28 @@ +project('libxcvt', 'c', + version: '0.1.3', + meson_version: '>= 0.40.0', + default_options: ['warning_level=1', + 'buildtype=debugoptimized']) + +libcvt_version = meson.project_version().split('.') + +cc = meson.get_compiler('c') +mdep = cc.find_library('m', required : false) + +prefix = get_option('prefix') +inc = include_directories('include') +man = join_paths(prefix, get_option('mandir')) + +subdir('include') +subdir('lib') +# subdir('cvt') -- CLI omitted for Redox target +# subdir('man') -- manpage omitted for Redox target + +pkg_mod = import('pkgconfig') +pkg_mod.generate(libraries : libxcvt, + version : meson.project_version(), + name : 'libxcvt', + description : 'A Library to generate VESA CVT standard timing modelines.') + +libxcvt_dep = declare_dependency(link_with: libxcvt, + include_directories: inc) diff --git a/recipes/libs/lcms2 b/recipes/libs/lcms2 new file mode 120000 index 0000000000..6c58ba1848 --- /dev/null +++ b/recipes/libs/lcms2 @@ -0,0 +1 @@ +../../local/recipes/libs/lcms2 \ No newline at end of file diff --git a/recipes/libs/libdisplay-info b/recipes/libs/libdisplay-info new file mode 120000 index 0000000000..09741c12ae --- /dev/null +++ b/recipes/libs/libdisplay-info @@ -0,0 +1 @@ +../../local/recipes/libs/libdisplay-info \ No newline at end of file diff --git a/recipes/libs/libepoxy b/recipes/libs/libepoxy new file mode 120000 index 0000000000..39c665b188 --- /dev/null +++ b/recipes/libs/libepoxy @@ -0,0 +1 @@ +../../local/recipes/libs/libepoxy \ No newline at end of file diff --git a/recipes/libs/libxcvt b/recipes/libs/libxcvt new file mode 120000 index 0000000000..d00dc5cdad --- /dev/null +++ b/recipes/libs/libxcvt @@ -0,0 +1 @@ +../../local/recipes/libs/libxcvt \ No newline at end of file

      +hub_aID*KThTnH2%KNX+e#DJ=kh5m!*-RL2Xb> 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