Compare commits

..
109 Commits
Author SHA1 Message Date
Cary Phillips 456bf42dc2 Pin IMATH_TAG to v3.1.9
Signed-off-by: Cary Phillips <cary@ilm.com>
2023-08-28 10:56:26 -07:00
Cary Phillips fdaee4bd27 Remove -dev setting from release type
Signed-off-by: Cary Phillips <cary@ilm.com>
2023-08-28 10:50:44 -07:00
Cary Phillips 4713cf0da6 OpenEXRConfig.h.in uses version extracted from openexr_version.h (#1527)
* OpenEXRConfig.h.in uses version extracted from openexr_version.h

The logic was already in place to extract the version from
`openexr_version.h`, so the `.in` file just needed to reference the
proper CMake variables. This also duplicates the `OpenEXR_VERSION_*`
settings to `OPENEXR_VERSION_*`.

Signed-off-by: Cary Phillips <cary@ilm.com>

* bazel

Signed-off-by: Cary Phillips <cary@ilm.com>

* comment

Signed-off-by: Cary Phillips <cary@ilm.com>

* fix formatting of core version test error message

Signed-off-by: Cary Phillips <cary@ilm.com>

* fix extra comparison test

Signed-off-by: Cary Phillips <cary@ilm.com>

---------

Signed-off-by: Cary Phillips <cary@ilm.com>
2023-08-28 10:45:58 -07:00
Cary Phillips b2cfe364db Add 1523, 1525, 1527 to notes
Signed-off-by: Cary Phillips <cary@ilm.com>
2023-08-28 09:32:39 -07:00
Vertexwahn a8609d9252 Add bzlmod support (#1525)
Signed-off-by: Vertexwahn <julian.amann@tum.de>
2023-08-28 09:29:05 -07:00
Cary Phillips 311c6e691e Add DEPENDENCIES Imath::Imath for OpenEXRCore (#1523)
This frees exrinfo and any other external application from any special
settings to pick up the necessary Imath #includes.

Signed-off-by: Cary Phillips <cary@ilm.com>
2023-08-28 09:28:57 -07:00
Cary Phillips 22b99053b9 Release notes and news for v3.2.0 (#1515)
* release notes for v3.1.10

Signed-off-by: Cary Phillips <cary@ilm.com>

* fix typos in CHANGES.md

Signed-off-by: Cary Phillips <cary@ilm.com>

* update release date

Signed-off-by: Cary Phillips <cary@ilm.com>

* release notes for v3.1.11

Signed-off-by: Cary Phillips <cary@ilm.com>

* Release notes and news for 3.2.0

Signed-off-by: Cary Phillips <cary@ilm.com>

* add 1520,1519,1518,1517,1516

Signed-off-by: Cary Phillips <cary@ilm.com>

* push release date; fix news links/formatting

Signed-off-by: Cary Phillips <cary@ilm.com>

* add 1473, 1522; fix formatting

Signed-off-by: Cary Phillips <cary@ilm.com>

---------

Signed-off-by: Cary Phillips <cary@ilm.com>
2023-08-17 14:14:08 -07:00
Nick Porcino 15aa9a726c consolidate project configurations to one place (#1473)
* Consolidate external project includes to openexr_conf.h

Signed-off-by: Nick Porcino <meshula@hotmail.com>

* Add path for ImathConfig.h

Signed-off-by: Nick Porcino <meshula@hotmail.com>

* Add missing dependency on OpenEXR::Config to exrinfo

Signed-off-by: Nick Porcino <meshula@hotmail.com>

* Rename openexr_conf.h to openexr_config.h

Signed-off-by: Nick Porcino <meshula@hotmail.com>

* Add Imath dependency to OpenEXRCore

Signed-off-by: Nick Porcino <meshula@hotmail.com>

---------

Signed-off-by: Nick Porcino <meshula@hotmail.com>
2023-08-17 14:06:36 -07:00
Cary Phillips ce7d8606d1 Rename cifuzz workflow to OSS-Fuzz, and filter out unnecessary triggers (#1522)
This name is more consistent with the others. And the workflow does
not need to run on changes to the website or website source.

Signed-off-by: Cary Phillips <cary@ilm.com>
2023-08-17 14:03:35 -07:00
Cary Phillips 318536c09e Streamline Python wheel workflow, and add tests and a CMake setup for bindings (#1517)
- Remove the libdeflate patch, not actually necessary
- Add a CMake build setup, controlled ``OPENEXR_BUILD_PYTHON``, off by default
- Update the doc strings
- Add ``#define PY_SSIZE_T_CLEAN``, apparently required in Python 3.10
  for ``Py_BuildValue("s#")``. PreviewImage attributes crash
  otherwise.
- Add a more extensive unit test
- Disable building PyPy wheels, since the bindings don't work properly
  (the ``channels()`` method fails in ``test_unittests.py`` when built
  against PyPy)

Signed-off-by: Cary Phillips <cary@ilm.com>
2023-08-15 16:18:52 -07:00
Cary Phillips aed455ff67 Separate workflow for the website (#1513)
The website does not need to be built on changes to source code, only
on changes in the "website" directory. And the main CI builds/tests
don't need to be triggered by website changes.

Signed-off-by: Cary Phillips <cary@ilm.com>
2023-08-15 16:01:53 -07:00
Anton Dukhovnikov faceebdfa1 fix memory leaks in exrmultipart (#1520)
* fix memory leaks in exrmultipart

Signed-off-by: Anton Dukhovnikov <antond@wetafx.co.nz>

* remove unneeded change

Signed-off-by: Anton Dukhovnikov <antond@wetafx.co.nz>

---------

Signed-off-by: Anton Dukhovnikov <antond@wetafx.co.nz>
2023-08-15 16:00:34 -07:00
Vertexwahn e8809d45e3 Bazel support: Simplify use of libdeflate dependency (#1518)
Signed-off-by: Vertexwahn <julian.amann@tum.de>
2023-08-14 17:22:35 -07:00
Vertexwahn e1a8ce0831 Remove .bazelrc file (#1519)
Signed-off-by: Vertexwahn <julian.amann@tum.de>
2023-08-14 15:53:12 -07:00
Cary Phillips 69b1297563 Website "Attributes" page now describes all attributes (#1511)
* Website "Attributes" page now describes all attributes

This gathers all the attribute definitions onto a single page, both
required and optional, and organizes them into logical groups. It also
documents each attribute's type.

Signed-off-by: Cary Phillips <cary@ilm.com>

* update display/data window definitions

Signed-off-by: Cary Phillips <cary@ilm.com>

* clarify some definitions

Signed-off-by: Cary Phillips <cary@ilm.com>

* lose the status column

Signed-off-by: Cary Phillips <cary@ilm.com>

---------

Signed-off-by: Cary Phillips <cary@ilm.com>
2023-08-14 09:13:59 -07:00
Vertexwahn 9852be60a5 Bazel support: Remove Bazel specific example and use same examples as CMake build (#1516)
Signed-off-by: Vertexwahn <julian.amann@tum.de>
2023-08-13 16:41:45 -07:00
Cary Phillips 0dba5e3663 Deprecate renderingTransform and lookModTransform (#1510)
As discussed in #1379, these are obsolete. This leaves them in place
but marks them as deprecated.

Signed-off-by: Cary Phillips <cary@ilm.com>
2023-08-13 16:41:29 -07:00
Cary Phillips d688d05d99 Initialize regs[] to 0 in check_for_x86_simd (#1509)
gcc warns of a potentially uninitialized memory reference, in the case
where ``__get_cpuid()`` fails to assign values to all its parameters.

Signed-off-by: Cary Phillips <cary@ilm.com>
2023-08-09 10:12:34 -07:00
Cary Phillips 5bd66ff6ea Rename "docs" to "website" (#1504)
* Rename "docs" to "website"

"website" is a more accurate term for the majority of the content that
has been under ``docs``, with the exception of the tool manpages, so:

- The website source now lives in the ``website`` subdirectory (was ``docs``)
- The CMake option is now ``BUILD_WEBSITE`` (was ``BUILD_DOCS``)
- The new CMake target ``website`` now builds the website source (via doxygen, sphinx, etc)
- The CI job is called "Website" (was ``Docs``)
- The CMake target ``docs`` now installs just the tool manpages
- The CMake option ``OPENEXR_INSTALL_DOCS`` controls whether to install the manpages, and defaults to OFF
- [website/install.rst](website/install.rst) explains the process and dependencies

Signed-off-by: Cary Phillips <cary@ilm.com>

* remove src subdir

Signed-off-by: Cary Phillips <cary@ilm.com>

* build website/src; mention posix

Signed-off-by: Cary Phillips <cary@ilm.com>

* max

Signed-off-by: Cary Phillips <cary@ilm.com>

* clamp

Signed-off-by: Cary Phillips <cary@ilm.com>

---------

Signed-off-by: Cary Phillips <cary@ilm.com>
2023-08-07 09:09:48 -07:00
Cary Phillips 772208b45d Reorganize share/util and remove unnecessary files (#1503)
- Move util under share
- Move the scripts under share into share/util
- The . files in src/bin appear to have been committed unncessarily long ago

Signed-off-by: Cary Phillips <cary@ilm.com>
2023-08-07 09:08:37 -07:00
Anton Dukhovnikov 09f8aeae66 multipart code examples (#1502)
Signed-off-by: Anton Dukhovnikov <antond@wetafx.co.nz>
2023-08-06 16:37:38 -07:00
Yaakov Selkowitz ebeb5676cb Fix CPUID detection with -march=x86-64-v3 (#1507)
When compiling for x86-64-v3 (or with -mavx -mf16c), bypass the CPUID
detection entirely, as osxsave is not (nor need be) defined in that
case.

Fixes: #1459

Signed-off-by: Yaakov Selkowitz <yselkowi@redhat.com>
2023-08-06 16:36:59 -07:00
Cary Phillips 8f6849f6a8 Add missing copyright/license specifiers (#1505)
* Add missing copyright/license specifiers

Signed-off-by: Cary Phillips <cary@ilm.com>

* revert CODEOWNERS

Signed-off-by: Cary Phillips <cary@ilm.com>

* revert .bazelversion

Signed-off-by: Cary Phillips <cary@ilm.com>

---------

Signed-off-by: Cary Phillips <cary@ilm.com>
2023-08-03 17:09:34 -07:00
Kimball Thurston 726fde32bc Add simple abi checker util (#1428)
* Add copyright clause

Signed-off-by: Kimball Thurston <kdt3rd@gmail.com>

* Add abi_check folder to git ignore

Signed-off-by: Kimball Thurston <kdt3rd@gmail.com>

* Add initial version of abi check wrapper script

Signed-off-by: Kimball Thurston <kdt3rd@gmail.com>

---------

Signed-off-by: Kimball Thurston <kdt3rd@gmail.com>
2023-08-03 08:17:02 -07:00
Cary Phillips ce8f39a23a Add website example source files to the CMake build for validation (#1501)
- Include all .cpp files in `docs/src` in `docs/src/all.cpp` and add
  it as a build dependency. This validates that it compiles, although
  there's no execution so it still doesn't validate correct behavior.

- Move larger code-blocks from ReadingAndWritingImageFiles.rst into
  individual files in `docs/src`

Signed-off-by: Cary Phillips <cary@ilm.com>
2023-08-03 08:08:29 -07:00
Cary Phillips f0c76e1bff Add 2023 Virtual Town Hall to news (#1500)
Signed-off-by: Cary Phillips <cary@ilm.com>
2023-08-01 17:48:24 -07:00
Cary Phillips 8f8be506c9 Add detailed instructions for making both patch and major/minor release (#1471)
* Add detailed instructions for making both patch and major/minor release

This documents the way I've been doing it, I'm certainly open to
improvements. Certainly a lot of this could conceivably be automated.

The key element for a patch release is the SO version and ABI
compatibility, and our SO numbering scheme still needs simplification.

Signed-off-by: Cary Phillips <cary@ilm.com>

* Update versioning process with the new policy and ``openexr_version.h``

Signed-off-by: Cary Phillips <cary@ilm.com>

* mention IMATH_TAG in the patch and major/minor release instructions

Signed-off-by: Cary Phillips <cary@ilm.com>

---------

Signed-off-by: Cary Phillips <cary@ilm.com>
2023-08-01 08:53:20 -07:00
Cary Phillips 649b25473b Update and simplify SO versioning policy (#1498)
* Update and simplify SO versioning policy

This change retires the "libtool" versioning scheme and adopts a
policy of appending the ``MAJOR.MINOR.PATCH`` software release name to
the SONAME to form the real name of the shared library.

The SOVERSION is specified via the ``OPENEXR_LIB_SOVERSION`` setting
in ``CMakeLists.txt`` and is the single number that increments
whenever, and only when, the ABI changes in non-backwards-compatible
ways. In practice, this corresponds to major and minor releases.

The resulting real shared library file names look like, for example,
``libOpenEXR.so.31.3.2.0``, where ``libOpenEXR.so.31`` is the SONAME
and ``.3.2.0`` identifies the corresponding software release.

This naming scheme helps reinforce the correspondence between the
shared library's real file name and the software release it
corresponds to, moreso than would be indicated by a single increasing
number.

By OpenEXR project policy and discussion of the technical steering
committee, the additional versioning information in the libtool
versioning scheme is too confusing and error-prone to follow, without
offering additional practical benefit.

Documentation is in ``CMakeLists.txt`` and in ``docs/install.rst``.

Signed-off-by: Cary Phillips <cary@ilm.com>

* remove reference to libtool

Signed-off-by: Cary Phillips <cary@ilm.com>

---------

Signed-off-by: Cary Phillips <cary@ilm.com>
2023-08-01 08:43:10 -07:00
Jose Luis Cercós Pita af87558c60 Python wheels (#1487)
* Let's see if the wheels are building

Signed-off-by: Jose Luis Cercos-Pita <jlcercos@gmail.com>

* Enable the building on the python branch to can test it

Signed-off-by: Jose Luis Cercos-Pita <jlcercos@gmail.com>

* Wrong path

Signed-off-by: Jose Luis Cercos-Pita <jlcercos@gmail.com>

* Windows...

Signed-off-by: Jose Luis Cercos-Pita <jlcercos@gmail.com>

* Copy the wrapper source files on the main folder

Signed-off-by: Jose Luis Cercos-Pita <jlcercos@gmail.com>

* Skip the OpenEXR examples

Signed-off-by: Jose Luis Cercos-Pita <jlcercos@gmail.com>

* Fixed the library names

Signed-off-by: Jose Luis Cercos-Pita <jlcercos@gmail.com>

* Install pytest to run the tests

Signed-off-by: Jose Luis Cercos-Pita <jlcercos@gmail.com>

* Let's try the cibuildwheel way

Signed-off-by: Jose Luis Cercos-Pita <jlcercos@gmail.com>

* Maybe this way...

Signed-off-by: Jose Luis Cercos-Pita <jlcercos@gmail.com>

* Use require instead of custom command

Signed-off-by: Jose Luis Cercos-Pita <jlcercos@gmail.com>

* Simplified the test

Signed-off-by: Jose Luis Cercos-Pita <jlcercos@gmail.com>

* Specifically instruct pytest to run the tests in the folder

Signed-off-by: Jose Luis Cercos-Pita <jlcercos@gmail.com>

* Fix the test

Signed-off-by: Jose Luis Cercos-Pita <jlcercos@gmail.com>

* Disable threading

Signed-off-by: Jose Luis Cercos-Pita <jlcercos@gmail.com>

* Reenable threading

Signed-off-by: Jose Luis Cercos-Pita <jlcercos@gmail.com>

* Link also OpenEXRCore

Signed-off-by: Jose Luis Cercos-Pita <jlcercos@gmail.com>

* CIBW_BEFORE_BUILD is the same in all platforms

Signed-off-by: Jose Luis Cercos-Pita <jlcercos@gmail.com>

* Imath 3.1.9

Signed-off-by: Jose Luis Cercos-Pita <jlcercos@gmail.com>

* List the exported symbols

Signed-off-by: Jose Luis Cercos-Pita <jlcercos@gmail.com>

* List the exported symbols

Signed-off-by: Jose Luis Cercos-Pita <jlcercos@gmail.com>

* Link everything available

Signed-off-by: Jose Luis Cercos-Pita <jlcercos@gmail.com>

* Link everything available

Signed-off-by: Jose Luis Cercos-Pita <jlcercos@gmail.com>

* Link statically also libdeflate

Signed-off-by: Jose Luis Cercos-Pita <jlcercos@gmail.com>

* tar.gz, not zip

Signed-off-by: Jose Luis Cercos-Pita <jlcercos@gmail.com>

* libdeflate static lib name is not found by openexr on windows

Signed-off-by: Jose Luis Cercos-Pita <jlcercos@gmail.com>

* Syntax error

Signed-off-by: Jose Luis Cercos-Pita <jlcercos@gmail.com>

* Try to fix the deflate linking on windows

Signed-off-by: Jose Luis Cercos-Pita <jlcercos@gmail.com>

* Remove the need of the wildcard while testing

Signed-off-by: Jose Luis Cercos-Pita <jlcercos@gmail.com>

* BSD license

Signed-off-by: Jose Luis Cercos-Pita <jlcercos@gmail.com>

---------

Signed-off-by: Jose Luis Cercos-Pita <jlcercos@gmail.com>
2023-07-28 06:57:02 -07:00
Anton Dukhovnikov 881f4989ce adds deep examples, fixes the deep examples in docs (#1493)
Signed-off-by: Anton Dukhovnikov <antond@wetafx.co.nz>
2023-07-28 06:42:23 -07:00
Cary Phillips da9f785d6c Rename IMATH_REPO/TAG to OPENEXR_IMATH_REPO/TAG and update install docs (#1495)
For consistency with ``OPENEXR_DEFLATE_REPO`` and other config options.

Also, add docs section for the ``DEFLATE`` options.

Signed-off-by: Cary Phillips <cary@ilm.com>
2023-07-28 06:42:01 -07:00
Vertexwahn 34fd6433b9 Bazel update (#1496)
* Bazel: Update to Bazel 6.3.0

Signed-off-by: Vertexwahn <julian.amann@tum.de>

* Bazel: Use macOS Ventura in CI

Signed-off-by: Vertexwahn <julian.amann@tum.de>

---------

Signed-off-by: Vertexwahn <julian.amann@tum.de>
2023-07-28 06:41:33 -07:00
Joseph Goldstone cfd1c76eab Reorder attributes in doc to match order in header (#1494)
Signed-off-by: Joseph Goldstone <jgoldstone@arri.com>
2023-07-26 09:10:36 -07:00
Kimball Thurston 54dd0411dd Fix handling for corrupt number of DC components (#1484)
When the number of DC components has been incorrectly stored in the dwa
subheader, this causes a cascade of errors, resulting in out of bounds
access. Instead, track how many we've read and detect when we're out as
soon as possible

Fixes OSS-Fuzz #59457

Signed-off-by: Kimball Thurston <kdt3rd@gmail.com>
2023-07-23 14:55:27 -07:00
Kimball Thurston 83c57cb4b9 Revert pre-computed values (#1488)
It would appear the precomputed values cause differences from the
specific computed values on other architectures.

Signed-off-by: Kimball Thurston <kdt3rd@gmail.com>
2023-07-23 14:55:07 -07:00
Joseph Goldstone ae32ed6c6e Add sensorCenterOffset, sensorOverallDimensions, sensorPhotositePitch… (#1489)
* Add sensorCenterOffset, sensorOverallDimensions, sensorPhotositePitch and sensorAcquisitionRectangle optional standard attributes

Signed-off-by: Joseph Goldstone <jgoldstone@arri.com>

* Add descriptions of sensorCenterOffset, sensorOverallDimensions, sensorPhotositePitch, and sensorAcquisitionRectangle to doc page for standard optional attributes

Signed-off-by: Joseph Goldstone <jgoldstone@arri.com>

* Fix typo in, and use correct inter-item spacing for Sphinx, in standard optional attributes doc

Signed-off-by: Joseph Goldstone <jgoldstone@arri.com>

---------

Signed-off-by: Joseph Goldstone <jgoldstone@arri.com>
2023-07-18 11:44:57 -07:00
peterhillman e452e5fd23 Readdress #1456: disallow NaNs in testOptimizedInterleavePatterns ... (#1490)
* Readdress #1456: disallow NaNs in testOptimizedInterleavePatterns unless both writing and reading as half

Signed-off-by: Peter Hillman <peterh@wetafx.co.nz>

* fix typos

Signed-off-by: Peter Hillman <peterh@wetafx.co.nz>

---------

Signed-off-by: Peter Hillman <peterh@wetafx.co.nz>
2023-07-17 15:27:27 -07:00
Cary Phillips 4d683ec76e Replace ILMBASE_THREADING_ENABLED with ILMTHREAD_THREADING_ENABLED (#1486)
A remnant vestage from v2.X

Signed-off-by: Cary Phillips <cary@ilm.com>
2023-07-13 09:09:51 -07:00
Cary Phillips 2e27f41b79 Add ImfMisc.h and ImfCompressor.h as installed headers (#1483)
I tried compiling the source to ``exrheader`` against an installation
of OpenEXR and it failed because it includes ``ImfMisc.h`` and
``ImfCompressor.h``, which were not included in the list of installed
headers.

It seems that code should be buildable by the public API, so those
headers should, in fact, be distributed.

Signed-off-by: Cary Phillips <cary@ilm.com>
2023-07-10 08:30:58 -07:00
Cary Phillips c9b6b73e1f Add OPENEXR_MISSING_ARM_VLD1 workaround to internal_dwa_simd.h (#1482)
Addresses #1477

Signed-off-by: Cary Phillips <cary@ilm.com>
2023-07-10 20:59:00 +12:00
Nick Porcino 811c941e42 Fix range check in dwa compressor (#1472)
Signed-off-by: Nick Porcino <meshula@hotmail.com>
2023-07-10 18:27:39 +12:00
Peter Urbanec 114cc6453b Fix Huffman performance regression on Linux/clang (#1480)
PR #1323 introduces a nested #ifdef check that results in a performance
regression on Linux systems that use the clang compiler. This is because
the check for __clang__ succeeds, but the nested check for __APPLE__
fails. As a result, the elif case is not taken on Linux.

Fixes issue #1479

Signed-off-by: Peter Urbanec <peterurbanec@users.noreply.github.com>
2023-07-09 11:52:00 -07:00
Christina Tempelaar-Lietz f3fc12b490 Update CI with vfx2023 Linux jobs. (#1475)
Signed-off-by: Christina Tempelaar-Lietz <xlietz@gmail.com>
2023-07-09 11:51:40 -07:00
Md Sadman Chowdhury a30498e76e fix dupe word typos (#1481)
Signed-off-by: sadman <61442059+SpicyCatGames@users.noreply.github.com>
2023-07-05 20:17:13 -04:00
Cary Phillips 2c9bf6f8a2 Fix gcc-11 warnings: signed/unsigned integer comparison, unused variables (#1463)
* Fix gcc-11 warnings: signed/unsigned integer comparision, unused variables

Signed-off-by: Cary Phillips <cary@ilm.com>

* declare loop variable i as unsigned int

Signed-off-by: Cary Phillips <cary@ilm.com>

* uncomment-out failable_free

Signed-off-by: Cary Phillips <cary@ilm.com>

* add commented-out assignment of failable_free as TODO

Signed-off-by: Cary Phillips <cary@ilm.com>

---------

Signed-off-by: Cary Phillips <cary@ilm.com>
2023-07-04 07:12:30 -07:00
Christoph Gohlke e4bb5997b9 Fix build error on win_arm64 (#1447)
* Fix build error on win_arm64

Signed-off-by: Christoph Gohlke <cgohlke@cgohlke.com>

* Simplify fix for build error on win_arm64

Signed-off-by: Christoph Gohlke <cgohlke@cgohlke.com>

---------

Signed-off-by: Christoph Gohlke <cgohlke@cgohlke.com>
2023-06-30 09:01:49 -07:00
Cristian Martínez fe463369d1 Fix build with i386 and musl libc (#1470)
The current code asumes glibc == linux. This patch extends support to all non-glibc Linux systems.

Signed-off-by: Cristian Othón Martínez Vera <cfuga@cfuga.mx>
2023-06-29 16:09:10 -07:00
zengwei2000 a5de20e817 Fix the code contains unhandled character (#1469)
It looks like there are some non-ASCII characters present in the code. Specifically, the character "–" in the line:

Signed-off-by: zengwei2000 <102871671+zengwei2000@users.noreply.github.com>
2023-06-27 14:07:37 -07:00
zengwei2000 0853c73bdf Fix the code contains unhandled character (#1466)
It looks like there are some non-ASCII characters present in the code. Specifically, the character "–" in the line:

Signed-off-by: zengwei2000 <102871671+zengwei2000@users.noreply.github.com>
2023-06-26 19:30:32 -07:00
Kimball Thurston 56ca398f36 Remove old zlib reference (#1468)
We have now switched to lib deflate, remove vestige of zlib usage

Signed-off-by: Kimball Thurston <kdt3rd@gmail.com>
2023-06-26 09:41:21 -07:00
Kimball Thurston f1d662064f Fix cpu detection of sse2 on non-64 x86 (#1467)
* Fix cpu detection of sse2 on non-64 x86

Previous code accidentally elided the i386 (i.e. non-64 bit versions of
x86 compiles). This refactors and simplifies the ifdef snarl to clarify
and fix that.

Fixes #1459

Signed-off-by: Kimball Thurston <kdt3rd@gmail.com>

* Fix mismatch with windows and enable avx support check there

Signed-off-by: Kimball Thurston <kdt3rd@gmail.com>

* Disable avx detection under msvc for now

We require gcc / clang style inline asm for avx support, detecting it
properly causes problems for the dwa support which uses that. Disable
again.

Signed-off-by: Kimball Thurston <kdt3rd@gmail.com>

---------

Signed-off-by: Kimball Thurston <kdt3rd@gmail.com>
2023-06-26 09:40:46 -07:00
Cary Phillips 1367e0a0da Fix link typos in news.rst (#1465)
Signed-off-by: Cary Phillips <cary@ilm.com>
2023-06-26 09:27:48 -07:00
Cary Phillips 049eb3aa38 Fix macOS and Windows build failures when threading is disabled (#1462)
* Fix macOS and Windows build failures when threading is disabled

Addresses #1455

The logic around which implementation of the IlmThread::Semaphore
class to use is now consolidated into the block of code that deciphers
the platform and specifies the #includes, rather than spread across
multiple files.

Signed-off-by: Cary Phillips <cary@ilm.com>

* Add macOS/Windows builds with threading disabled

Signed-off-by: Cary Phillips <cary@ilm.com>

* Fix typo with ILMTHREAD_SEMAPHORE_OTHER, and add missing macOS includes

Signed-off-by: Cary Phillips <cary@ilm.com>

* Add threads-enabled='ON' so it shows up in the job name

Signed-off-by: Cary Phillips <cary@ilm.com>

---------

Signed-off-by: Cary Phillips <cary@ilm.com>
2023-06-26 09:26:43 -07:00
Cary Phillips 11a99dfd58 v3.1.9/v3.1.8 notes and news (#1464)
* v3.1.9 release notes

Signed-off-by: Cary Phillips <cary@ilm.com>

* Add 1443, 1457, 1461 to release notes

Signed-off-by: Cary Phillips <cary@ilm.com>

* Add recent releases to news

Signed-off-by: Cary Phillips <cary@ilm.com>

---------

Signed-off-by: Cary Phillips <cary@ilm.com>
2023-06-25 20:53:56 -07:00
peterhillman fe2a8f5817 don't use NaNs/infs in testOptimizedInterleavePatterns (#1461)
* don't use NaNs/infs in testOptimizedInterleavePatterns

Signed-off-by: Peter Hillman <peterh@wetafx.co.nz>

* allow NaN/inf halfs in testOptimizedInterleavePatterns if not casting to float

Signed-off-by: Peter Hillman <peterh@wetafx.co.nz>

---------

Signed-off-by: Peter Hillman <peterh@wetafx.co.nz>
2023-06-22 16:08:00 -07:00
Cary Phillips ff27eeb9e4 CIFuzz skips PRs that only modify markdown (#1453)
Similar to ci_workflow.yml

Signed-off-by: Cary Phillips <cary@ilm.com>
2023-06-20 15:29:39 -07:00
Cary Phillips 7447f9930a Use security@openexr.com for consistency (#1452)
openexr.com forwards to openexr.org, but for consistency, let's refer
to all email addresses as @openexr.com, to match the website.

Signed-off-by: Cary Phillips <cary@ilm.com>
2023-06-19 16:31:36 -07:00
Cary Phillips 3147ffacdf Add OPENEXR_IMF_INTERNAL_NAMESPACE for WidenFilename (#1454)
Fixes #1446

Signed-off-by: Cary Phillips <cary@ilm.com>
2023-06-18 16:08:38 -07:00
Vertexwahn e504fb2ec3 Bazel support: Switch back to VS2019 due to a toolchain issue in Bazel (#1457)
Signed-off-by: Vertexwahn <julian.amann@tum.de>
2023-06-16 12:21:16 -07:00
Vertexwahn 7a8ae78f8b Bazel bump imath (#1443)
* Bazel: Bump Imath to 3.1.9

Signed-off-by: Vertexwahn <julian.amann@tum.de>

* Bazel: Bump skylib version

Signed-off-by: Vertexwahn <julian.amann@tum.de>

---------

Signed-off-by: Vertexwahn <julian.amann@tum.de>
2023-06-14 17:36:10 -07:00
Sergey Fedorov 729f42648d compression.cpp: fix isnan (#1448)
Fixes: https://github.com/AcademySoftwareFoundation/openexr/issues/1412

Signed-off-by: Sergey Fedorov <vital.had@gmail.com>
2023-06-08 21:35:20 +12:00
Kimball Thurston 425d4b24e0 Fix scenario where malformed dwa file could read past end of buffer (#1439)
Fixes OSS-Fuzz 59382

Signed-off-by: Kimball Thurston <kdt3rd@gmail.com>
2023-05-29 19:19:02 +12:00
Vertexwahn 379a2884af Bazel update (#1438)
* Update Cache action in Bazel CI build

Signed-off-by: Vertexwahn <julian.amann@tum.de>

* Bazel support: Update #cmakedefines for Imath

Signed-off-by: Vertexwahn <julian.amann@tum.de>

---------

Signed-off-by: Vertexwahn <julian.amann@tum.de>
2023-05-26 14:54:27 -07:00
Vertexwahn 4d49374dc5 Fix macOS arm64 build (#1434)
Signed-off-by: Julian Amann <julian.amann@tum.de>
2023-05-26 11:15:39 -07:00
Vertexwahn af517234b3 Fix spelling mistakes (#1436)
Signed-off-by: Julian Amann <julian.amann@tum.de>
2023-05-26 11:07:49 -07:00
Vertexwahn 7fe4e3bfbc Bazel support: Update Imath to 3.1.8 (#1435)
Signed-off-by: Julian Amann <julian.amann@tum.de>
2023-05-26 11:05:50 -07:00
Kimball Thurston 6f235a803c fix out of bounds check with a full channel name vs. byte count (#1429)
Signed-off-by: Kimball Thurston <kdt3rd@gmail.com>
2023-05-24 22:47:30 +12:00
Cary Phillips 200613925d Fix handling of builddir and cxxwarns in clang_coverage.sh (#1427)
Also, some ='s appeared to be missing on the -ignore-filename-regex lines

Signed-off-by: Cary Phillips <cary@ilm.com>
2023-05-22 08:52:17 -07:00
Cary Phillips b4899a6788 Fix reference to the number of supported compression types (#1422)
Signed-off-by: Cary Phillips <cary@ilm.com>
2023-05-21 12:24:55 -07:00
Kimball Thurston a5428248c1 Prevent re-download of images if already in place (#1426)
Signed-off-by: Kimball Thurston <kdt3rd@gmail.com>
2023-05-21 21:13:09 +12:00
Kimball Thurston 9e47dfdfad prepare for new version of libdeflate with thread-safe alloc function mechanism (#1425)
Removes all other calls to internal_exr_alloc if there is a context,
allowing full memory allocator overload without setting global
functions.

Also cleanup code formatting

Signed-off-by: Kimball Thurston <kdt3rd@gmail.com>
2023-05-21 21:12:42 +12:00
Kimball Thurston a00bac506f Start working on improving test coverage (#1424)
* fix potential crash
* Add initial tests for half utility operations in core
* add dump of attr to support testing of debug code (coverage)
* Add simple script around running and generating coverage report locally using clang tools

---------

Signed-off-by: Kimball Thurston <kdt3rd@gmail.com>
2023-05-21 09:28:06 +12:00
Cary Phillips a91df5206e Document DWAA/DWAB compression in Technical Introduction (#1420)
Signed-off-by: Cary Phillips <cary@ilm.com>
2023-05-19 13:57:53 -07:00
Kimball Thurston 447451f0a6 after other merges, need to fix include (#1421)
Signed-off-by: Kimball Thurston <kdt3rd@gmail.com>
2023-05-19 22:46:15 +12:00
Kimball Thurston 62cf13cd69 ensure we are passing through valid function pointers (#1403)
libdeflate doesn't have the same fallback handling such that if
someone resets the pointers, allocations later will crash

Signed-off-by: Kimball Thurston <kdt3rd@gmail.com>
2023-05-19 20:41:49 +12:00
Diogo Teles Sant'Anna 39a77f22ae ci: set minimal permisisons on github workflows (#1417)
Signed-off-by: Diogo Teles Sant'Anna <diogoteles@google.com>
2023-05-18 13:29:55 -07:00
Sergey Fedorov 6773e77bad IlmThread: fix defines for older macOS: do not prefix with __ (#1416)
See: https://github.com/macports/macports-ports/pull/18711

Signed-off-by: Sergey Fedorov <vital.had@gmail.com>
2023-05-17 16:18:48 -07:00
Cary Phillips 2e4c5229e8 Add #include <cmath> for isnan (#1414)
Signed-off-by: Cary Phillips <cary@ilm.com>
2023-05-17 08:55:02 -07:00
Kimball Thurston 7c40603eb2 Add dwa support to core (#1402)
* Fix nodiscard warning on gcc 13
* Add buffer range checks to huf code
* Refactor cpuid code for use in dwa
* Fix issue with big endian deep encoding of chunk table
* refactor to expose byte reordering zip compression uses for dwa
* expose option flag to enable headers to be more easily like old style headers
* fix potential issue with piz and not able to compress data small enough
* Restore piz tests
* Initial implementation of DWAA/B compression for Core
* write with legacy header during tests to make comparing bytes in files easier
* Initial support for validating exact match in file output between C / C++
* Enable DWAA/DWAB tests
* Older versions of MSVC have issues with specifying C11 for use of
stdalign.h and alignas macro. Work around this by targeting the lower
level macros / declspec instead of using C11 stdalign.h
* Add unit test for x86 cpu id checks
* Add alignment helper utility
* Add missing include guards
* Fix pedantic warnings
* Fix compile warnings. Core should now compile with
-Weverything
-Wno-reserved-identifier
-Wno-covered-switch-default
-Wno-cast-align
-Wno-overlength-strings

Signed-off-by: Kimball Thurston <kdt3rd@gmail.com>
2023-05-16 19:38:52 +12:00
Sergey Fedorov 7862c23a2b Use posix compat code for old macOS without libdispatch (#1409)
See: https://github.com/AcademySoftwareFoundation/openexr/issues/1405

Signed-off-by: Sergey Fedorov <vital.had@gmail.com>
2023-05-16 16:56:42 +12:00
Vertexwahn b7446c0ec5 Revert fix of spelling mistakes in PR messages (#1410)
Signed-off-by: Vertexwahn <julian.amann@tum.de>
2023-05-15 16:25:35 -07:00
Kimball Thurston 2dcc1b80e3 Shift MacOS versions in flight (#1411)
* Shift MacOS versions in flight

github has long deprecated version 10.15

Signed-off-by: Kimball Thurston <kdt3rd@gmail.com>

* Fix versioning updates to match VFX platform with github supported o.s.

Signed-off-by: Kimball Thurston <kdt3rd@gmail.com>

---------

Signed-off-by: Kimball Thurston <kdt3rd@gmail.com>
2023-05-15 16:20:34 -07:00
Sergey Fedorov 663708e53d internal_xdr.h: fix endian logic for Apple (#1408)
Fixes PPC builds as required for macports
See: https://github.com/AcademySoftwareFoundation/openexr/issues/1404

Signed-off-by: Sergey Fedorov <vital.had@gmail.com>
2023-05-13 23:23:48 -07:00
Cary Phillips cf19b5491b Deprecate exrbuild.cpp (#1381)
This code appears to have not made it through the v3.0 transition, the
associated CMakeList.txt has been lost. There isn't much in the git
history describing the program. It seems to do the same thing as
"exrmultipart --combine" so its benefit of maintaining it seems
minimal.

Signed-off-by: Cary Phillips <cary@ilm.com>
2023-05-12 10:23:18 -07:00
Vertexwahn 83210c7c7b Remove unused private member variable _maxScanLineSize (ABI break) (#1394)
Signed-off-by: Vertexwahn <julian.amann@tum.de>
2023-05-12 09:46:26 -07:00
Sergey Fedorov 9293eef977 internal_structs.h: __STDC_FORMAT_MACROS should be defined prior to inttypes.h (#1406)
Signed-off-by: Sergey Fedorov <vital.had@gmail.com>
2023-05-12 09:38:00 -07:00
Nick Porcino d2460f0192 Fix version h (#1399)
* More robust openexr_version.h handling
* hardcode versions for now until the vagaries of Bazel and linux install scripts can be sorted out

Signed-off-by: Nick Porcino <meshula@hotmail.com>
2023-04-29 00:26:02 -07:00
Nick Porcino 1f7de5aeef More robust openexr_version.h handling (#1398)
Signed-off-by: Nick Porcino <meshula@hotmail.com>
2023-04-29 00:04:43 -07:00
Vertexwahn 8c1fde8eca Fix spelling mistakes (#1396)
Signed-off-by: Vertexwahn <julian.amann@tum.de>
2023-04-27 13:22:33 -07:00
Vertexwahn 0d1d0c38f2 Bazel support update (#1395)
* Update Bazel version
* Apply buildifier on Bazel build files

Signed-off-by: Vertexwahn <julian.amann@tum.de>
2023-04-27 13:20:58 -07:00
Nick Porcino 9ef5625b19 Govern library version by OpenEXRVersion.h (#1386)
* Govern library version by openexr_version.h

Signed-off-by: Nick Porcino <meshula@hotmail.com>
2023-04-27 00:13:30 -07:00
Cary Phillips 80f798b0d7 remove debugging status message
Signed-off-by: Cary Phillips <cary@ilm.com>
2023-04-26 21:50:54 -07:00
Cary Phillips 6903f8a920 Tool manpages, doc page, and standardized --help messages
- Add manpages for the tool programs (exr2aces, exrenvmap, etc)
  - Pages are generated via help2man
  - Pages are installed into share/man

- Standardize the tool usage messages:
  * The output of --help goes to stdout, so that "exrheader --help | more" is easy
  * Usage output goes to stderr on mistakes like malformed arguments
  * Each program has a --version option
  * ImfMisc.h has a getLibraryVersion() that returns the
    CMAKE_OPENEXR_VERSION the library was compiled with (which might
    be mismatched with the headers currently being compiled.

- The website has a "Tools" page that describes the tools and usage,
  but also includes a pointer to oiiotool for any serious image
  processing utilities

- The website html output is no longer installed with the
  distribution. This was inadvertent and not helpful, a leftover from
  when "docs" referred to the .pdf technical documentation that now
  lives on the webpage.

Signed-off-by: Cary Phillips <cary@ilm.com>
2023-04-26 21:50:54 -07:00
Joseph Goldstone 2e24872d03 aperture and tStop have effectiveFocalLength as their numerator now, as per Cooke Optics
Signed-off-by: Joseph Goldstone <jgoldstone@arri.com>
2023-04-26 10:53:57 -07:00
Joseph Goldstone 714d90288b withdraw timecodeRate carryover from SMPTE ST 2065-4 in absence of compelling real-world use case
Signed-off-by: Joseph Goldstone <jgoldstone@arri.com>
2023-04-26 10:53:57 -07:00
Joseph Goldstone 9120defaf3 Move timecodeRate to be adjacent to framesPerSecond and add explanation of non-default rounding
Signed-off-by: Joseph Goldstone <jgoldstone@arri.com>
2023-04-26 10:53:57 -07:00
Joseph Goldstone eda96c308d framelines -> ascFramingDecisionList; UTF-8 clarification; improved descriptions of entrancePupilOffset and shutterAngle
Signed-off-by: Joseph Goldstone <jgoldstone@arri.com>
2023-04-26 10:53:57 -07:00
Joseph Goldstone d98a34bff4 Add missing ImfIntAttribute.h reference to ImfStandadAttributes.h; make the relationship between aperture and tStop less ambiguous.
Signed-off-by: Joseph Goldstone <jgoldstone@arri.com>
2023-04-26 10:53:57 -07:00
Joseph Goldstone 9ce8ef819a add framelines attribute to carry JSON-encoded frameline info; fix new unit test invocations to use same format as previous ones
Signed-off-by: Joseph Goldstone <jgoldstone@arri.com>
2023-04-26 10:53:57 -07:00
Joseph Goldstone 434a962771 Add selected SMPTE camdkit or camdkit-enabling standard optional attributes
Signed-off-by: Joseph Goldstone <jgoldstone@arri.com>
2023-04-26 10:53:57 -07:00
lilinjie 5aa18bca26 fix typo
Signed-off-by: lilinjie <lilinjie@uniontech.com>
2023-04-25 17:19:37 -07:00
Kimball Thurston ef4b710f73 Switch to embedding libdeflate into EXRCore (#1387)
Switches to embedding upstream (MIT license) libdeflate vs linking
against external library, functions should be private / hidden by
default.

Like Imath, enables one to use a system version or force using an
internally embedded version (OPENEXR_FORCE_INTERNAL_DEFLATE).
Further, the repository used can be controlled with
OPENEXR_DEFLATE_REPO and OPENEXR_DEFLATE_TAG cmake variables.

This centralizes all IETF RFC 1950 (zlib) compression into
the EXRCore library. This implies that the main C++ library
depends on EXRCore.

Signed-off-by: Kimball Thurston <kdt3rd@gmail.com>
2023-04-25 17:41:58 +12:00
Christina Tempelaar-Lietz faf1bc1e90 Updated Mac and Windows jobs for VFX platform 2023. (#1388)
Signed-off-by: Christina Tempelaar-Lietz <xlietz@gmail.com>
2023-04-25 17:40:26 +12:00
Kimball Thurston 358eec4516 Change setNumThreads to wait for thread start (#1291)
Fix Issue #890, issue with windows shutdown when exiting quickly prior to
threads actually starting. We do this by having a data block that is passed
by shared_ptr to the thread to avoid dereferencing a deleted object.

Further, greatly simplify the ThreadPool code by using atomic shared_ptr
functions instead of trying to manually implement something similar and
otherwise modernizing the thread code.

Fix a few potential null dereference locations and also fix an issue when
systems are overloaded enabling the TaskGroup destructor to destroy
the semaphore while code is still using it, causing undefined memory
corruption if some other thread immediately allocates that same block

Originally based on a proposed patch by Dieter De Baets @debaetsd

Signed-off-by: Kimball Thurston <kdt3rd@gmail.com>
2023-04-22 15:58:43 +12:00
Cary Phillips 67f7d05973 Update macOS installation instructions (#1382)
The recommendations for macOS were backwards. Homebrew is the
recommended installer. Macports is not recommended, as it's on v2.3.

Signed-off-by: Cary Phillips <cary@ilm.com>
2023-04-14 06:22:14 -07:00
Joseph Goldstone 60611ccd5f Reorder attribute definitions in ImfStandardAttributes.h in functional groupings (#1379)
Signed-off-by: Joseph Goldstone <jgoldstone@arri.com>
2023-04-13 06:57:42 -07:00
Darby Johnston fc7f898ef0 Only install exrinfo when OPENEXR_INSTALL_TOOLS is on (#1377)
Signed-off-by: Darby Johnston <darbyjohnston@yahoo.com>
2023-04-11 12:17:10 -07:00
Darby Johnston b6480cffe0 Fix typo in README.md (#1378)
Signed-off-by: Darby Johnston <darbyjohnston@yahoo.com>
2023-04-11 10:33:02 -07:00
Cary Phillips 71a7141556 Test Images page for website (#1372)
This adds a "Test Image" section to the website with a gallery of images from the test image repo https://github.com/AcademySoftwareFoundation/openexr-images, with a page for each image that shows the output of exrheader. Each image is a link to download the .exr file.

Preview it here: https://cary-ilm-openexr.readthedocs.io/en/docs-images/index.html

It's not perfect, but it's a decent start, feel free to suggest improvements to the layout or content. A few notes:

In lieu of setting up a way to view .exr images directly in a browser, I converted the .exr's in openexr-images to .jpg's. They are stored in the openexr-images repo and served to the website directly from github, so the OpenEXR distribution (which holds the website source) doesn't get bloated with extra image data. The download link downloads the source .exr image, not the .jpg.

This draft actually serves them from a branch of my fork of the openexr-images repo, but that can get fixed later.

The exr2rst.py script generates the rst (and embedded html) from the .exr's (by running exrheader) and the accompanying README's, so it's (relatively) easy to add new images.

---------

Major update to this, the .rst and the proxy .jpg’s are now generated automatically, so no need to maintain .jpg’s in the openexr-images repo.

The docs/test_images.txt file lists urls for .exr’s and README.rst files that define the contents of the “Test Images” page.

The docs/scripts/test_images.py script builds the index page and the per-image pages. It downloads the files via wget, then runs convert (ImageMagick) to generate the proxy .jpg’s, then runs exrheader to generate the tables of attribute values.

The script puts the auto-generated .rst files in the docs/_test_images subdirectory. Ideally, these would go in the build directory, but sphinx seems to want all .rst input under a single source root.

There's now a separate "Docs" CI job that builds the docs, so I removed all references to docs in the other jobs. It uses Ubuntu to mirror .readthedocs.yml. There's no need for the install_doxygen.sh and install_docs_env.sh scripts, the necessary installations are simple enough to do inline in the CI job.

---------

Signed-off-by: Cary Phillips <cary@ilm.com>
2023-04-07 15:42:56 -07:00
305 changed files with 19021 additions and 6691 deletions
-9
View File
@@ -1,9 +0,0 @@
# SPDX-License-Identifier: BSD-3-Clause
# Copyright (c) Contributors to the OpenEXR Project.
build --symlink_prefix=/ # Out of source build
# Uncomment this to treat C++ compile warnings as errors
#build --cxxopt=-Wall
#build --cxxopt=-Werror
#build --cxxopt=-Wextra
+1 -1
View File
@@ -1 +1 @@
6.0.0
6.3.2
+2
View File
@@ -1,3 +1,5 @@
# SPDX-License-Identifier: BSD-3-Clause
# Copyright Contributors to the OpenEXR Project.
---
Language: Cpp
# BasedOnStyle: LLVM
+3
View File
@@ -12,6 +12,9 @@ on:
- cron: "0 0 * * 0"
workflow_dispatch:
permissions:
contents: read
jobs:
# ---------------------------------------------------------------------------
+39 -16
View File
@@ -6,43 +6,58 @@
name: Bazel
# Skip the run on *.md changes and on changes to the website, *except*
# for "website/src", since that code needs validation. There's a
# separate workflow for with website.
on:
push:
# Versioned branches and tags are ignored for OpenEXR <= 1.x.x
branches-ignore:
- RB-2.*
tags-ignore:
- v1.*
- v2.*
# Jobs are skipped when ONLY Markdown (*.md) files are changed
paths-ignore:
- '**.md'
paths:
- '**'
- '!**.md'
- '!website/**'
- 'website/src/**'
pull_request:
branches-ignore:
- RB-2.*
tags-ignore:
- v1.*
- v2.*
paths-ignore:
- '**.md'
paths:
- '**'
- '!**.md'
- '!website/**'
- 'website/src/**'
permissions:
contents: read
jobs:
build_and_test_ubuntu:
name: Linux Ubuntu 20.04 Bazel build <GCC 9.3.0>
runs-on: ubuntu-20.04
name: Linux Ubuntu 22.04 Bazel build <GCC 11.4.0>
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v3
- name: Mount Bazel cache
uses: actions/cache@v2
uses: actions/cache@v3
with:
path: "/home/runner/.cache/bazel"
key: bazel-ubuntu
key: bazel-ubuntu-22
- name: Build
run: |
bazelisk build //...
bazelisk test //...
# Test bzlmod
bazelisk build --enable_bzlmod -- //...
bazelisk test --enable_bzlmod -- //...
build_and_test_windows:
name: Windows Server 2022 build <Visual Studio 2022>
@@ -52,28 +67,36 @@ jobs:
- uses: actions/checkout@v3
- name: Mount Bazel cache
uses: actions/cache@v2
uses: actions/cache@v3
with:
path: "/home/runner/.cache/bazel"
key: bazel-windows
key: bazel-windows-2022
- name: Build
run: |
bazelisk build //...
bazelisk test //...
# Test bzlmod
bazelisk build --enable_bzlmod -- //...
bazelisk test --enable_bzlmod -- //...
build_and_test_macos:
name: macOS 12 Bazel build <Apple Clang14>
runs-on: macos-12
name: macOS 13 Bazel build <Apple Clang14>
runs-on: macos-13
steps:
- uses: actions/checkout@v3
- name: Mount Bazel cache
uses: actions/cache@v2
uses: actions/cache@v3
with:
path: "/home/runner/.cache/bazel"
key: bazel-macos
key: bazel-macos-13
- name: Build
run: |
bazelisk build //...
bazelisk test //...
# Test bzlmod
bazelisk build --enable_bzlmod -- //...
bazelisk test --enable_bzlmod -- //...
+159 -156
View File
@@ -6,25 +6,39 @@
name: CI
# Skip the run on *.md changes and on changes to the website, *except*
# for "website/src", since that code needs validation. There's a
# separate workflow for with website. Also, no need to run on changes
# to the bazel setup.
on:
push:
# Versioned branches and tags are ignored for OpenEXR <= 1.x.x
branches-ignore:
- RB-2.*
tags-ignore:
- v1.*
- v2.*
# Jobs are skipped when ONLY Markdown (*.md) files are changed
paths-ignore:
- '**.md'
paths:
- '**'
- '!**.md'
- '!website/**'
- 'website/src/**'
- '!bazel/**'
pull_request:
branches-ignore:
- RB-2.*
tags-ignore:
- v1.*
- v2.*
paths-ignore:
- '**.md'
paths:
- '**'
- '!**.md'
- '!website/**'
- 'website/src/**'
- '!bazel/**'
permissions:
contents: read
jobs:
# Linux jobs run in Docker containers, so the latest OS version is OK. macOS
@@ -47,8 +61,7 @@ jobs:
C++${{ matrix.cxx-standard }},
config=${{ matrix.build-type }},
shared=${{ matrix.build-shared }},
threads=${{ matrix.threads-enabled }},
docs=${{ matrix.build-docs }}>'
threads=${{ matrix.threads-enabled }}>'
# GH-hosted VM. The build runs in CentOS 7 'container' defined below.
runs-on: ubuntu-latest
container:
@@ -57,11 +70,11 @@ jobs:
image: aswf/ci-openexr:${{ matrix.vfx-cy }}
strategy:
matrix:
build: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
build: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
include:
# -------------------------------------------------------------------
# VFX CY2022 - GCC
# VFX CY2023 - GCC
# -------------------------------------------------------------------
# Shared, Release
- build: 1
@@ -70,11 +83,10 @@ jobs:
cxx-standard: 17
cxx-compiler: g++
cc-compiler: gcc
compiler-desc: gcc9.3.1
compiler-desc: gcc11.2.1
label:
threads-enabled: 'ON'
vfx-cy: 2022
build-docs: 'ON'
vfx-cy: 2023
exclude-tests:
# Shared, Release, Threads OFF
@@ -84,11 +96,10 @@ jobs:
cxx-standard: 17
cxx-compiler: g++
cc-compiler: gcc
compiler-desc: gcc9.3.1
compiler-desc: gcc11.2.1
label:
threads-enabled: 'OFF'
vfx-cy: 2022
build-docs: 'OFF'
vfx-cy: 2023
exclude-tests:
# Shared, Debug
@@ -98,11 +109,10 @@ jobs:
cxx-standard: 17
cxx-compiler: g++
cc-compiler: gcc
compiler-desc: gcc9.3.1
compiler-desc: gcc11.2.1
label:
threads-enabled: 'ON'
vfx-cy: 2022
build-docs: 'OFF'
vfx-cy: 2023
exclude-tests:
# Static, Release
@@ -112,29 +122,27 @@ jobs:
cxx-standard: 17
cxx-compiler: g++
cc-compiler: gcc
compiler-desc: gcc9.3.1
compiler-desc: gcc11.2.1
label:
threads-enabled: 'ON'
vfx-cy: 2022
build-docs: 'OFF'
vfx-cy: 2023
exclude-tests:
# Static, Debug
# Shared, Release, C++14
- build: 5
build-type: Debug
build-shared: 'OFF'
cxx-standard: 17
build-type: Release
build-shared: 'ON'
cxx-standard: 14
cxx-compiler: g++
cc-compiler: gcc
compiler-desc: gcc9.3.1
compiler-desc: gcc11.2.1
label:
threads-enabled: 'ON'
vfx-cy: 2022
build-docs: 'OFF'
vfx-cy: 2023
exclude-tests:
# -------------------------------------------------------------------
# VFX CY2021 - Clang
# VFX CY2023 - Clang 15.0
# -------------------------------------------------------------------
# Release
- build: 6
@@ -143,60 +151,49 @@ jobs:
cxx-standard: 17
cxx-compiler: clang++
cc-compiler: clang
compiler-desc: clang10
compiler-desc: clang15.0
label:
threads-enabled: 'ON'
vfx-cy: 2022
build-docs: 'OFF'
vfx-cy: 2023
exclude-tests:
# Debug
# -------------------------------------------------------------------
# VFX CY2023 - Clang 14.0
# -------------------------------------------------------------------
# Release
- build: 7
build-type: Debug
build-shared: 'ON'
cxx-standard: 17
cxx-compiler: clang++
cc-compiler: clang
compiler-desc: clang10
label:
threads-enabled: 'ON'
vfx-cy: 2022
build-docs: 'OFF'
exclude-tests:
# Static, Release
- build: 8
build-type: Release
build-shared: 'ON'
cxx-standard: 17
cxx-compiler: clang++
cc-compiler: clang
compiler-desc: clang10
compiler-desc: clang14.0
label:
threads-enabled: 'ON'
vfx-cy: 2022
build-docs: 'OFF'
exclude-tests:
# Static, Debug
- build: 9
build-type: Debug
build-shared: 'OFF'
cxx-standard: 17
cxx-compiler: clang++
cc-compiler: clang
compiler-desc: clang10
label:
threads-enabled: 'ON'
build-docs: 'OFF'
vfx-cy: 2022
vfx-cy: 2023
exclude-tests:
# -------------------------------------------------------------------
# VFX CY2021 - GCC, Release
# VFX CY2022 - GCC, Release
# -------------------------------------------------------------------
# Shared, Release
- build: 10
- build: 8
build-type: Release
build-shared: 'ON'
cxx-standard: 17
cxx-compiler: g++
cc-compiler: gcc
compiler-desc: gcc9.3.1
label:
threads-enabled: 'ON'
vfx-cy: 2022
exclude-tests:
# -------------------------------------------------------------------
# VFX CY2021 - GCC, Release
# -------------------------------------------------------------------
# Shared, Release
- build: 9
build-type: Release
build-shared: 'ON'
cxx-standard: 17
@@ -205,7 +202,6 @@ jobs:
compiler-desc: gcc9.3.1
label:
threads-enabled: 'ON'
build-docs: 'OFF'
vfx-cy: 2021
exclude-tests:
@@ -213,7 +209,7 @@ jobs:
# VFX CY2020 - GCC, Release
# -------------------------------------------------------------------
# Shared, Release
- build: 11
- build: 10
build-type: Release
build-shared: 'ON'
cxx-standard: 14
@@ -222,44 +218,9 @@ jobs:
compiler-desc: gcc6.3.1
label:
threads-enabled: 'ON'
build-docs: 'OFF'
vfx-cy: 2020
exclude-tests:
# -------------------------------------------------------------------
# VFX CY2019 - GCC, Release
# -------------------------------------------------------------------
# Shared, Release
- build: 12
build-type: Release
build-shared: 'ON'
cxx-standard: 14
cxx-compiler: g++
cc-compiler: gcc
compiler-desc: gcc6.3.1
label:
threads-enabled: 'ON'
build-docs: 'OFF'
vfx-cy: 2019
exclude-tests:
# -------------------------------------------------------------------
# Legacy - VFX CY2019 - C++11
# -------------------------------------------------------------------
# Shared, Release
- build: 13
build-type: Release
build-shared: 'ON'
cxx-standard: 11
cxx-compiler: g++
cc-compiler: gcc
compiler-desc: gcc6.3.1
label: 'Legacy '
threads-enabled: 'ON'
build-docs: 'OFF'
vfx-cy: 2019
exclude-tests:
env:
CXX: ${{ matrix.cxx-compiler }}
CC: ${{ matrix.cc-compiler }}
@@ -271,9 +232,8 @@ jobs:
mkdir _install
mkdir _build
mkdir _examples
- name: Install docs env
run: share/ci/scripts/linux/yum/install_docs_env.sh
if: matrix.build-docs == 'ON'
- name: Install help2man
run: yum install -y help2man
- name: Configure
run: |
cmake .. \
@@ -283,8 +243,8 @@ jobs:
-DCMAKE_CXX_FLAGS=${{ matrix.cxx-flags }} \
-DCMAKE_VERBOSE_MAKEFILE:BOOL='OFF' \
-DBUILD_SHARED_LIBS=${{ matrix.build-shared }} \
-DBUILD_DOCS=${{ matrix.build-docs }} \
-DOPENEXR_BUILD_TOOLS='ON' \
-DOPENEXR_INSTALL_TOOLS='ON' \
-DOPENEXR_INSTALL_DOCS='ON' \
-DOPENEXR_RUN_FUZZ_TESTS='OFF' \
-DOPENEXR_ENABLE_THREADING=${{ matrix.threads-enabled }}
working-directory: _build
@@ -327,50 +287,79 @@ jobs:
# TODO: Add ARM64/x86_64 (universal 2) build
macos:
name: 'Mac VFXP-2022 macos-${{ matrix.osver }}
name: 'Mac VFXP-${{ matrix.vfx-cy }} macos-${{ matrix.osver }}
<${{ matrix.compiler-desc }},
C++${{ matrix.cxx-standard }},
config=${{ matrix.build-type }},
shared=${{ matrix.build-shared }},
cxx=${{ matrix.cxx-standard }},
docs=${{ matrix.build-docs }}>'
threads=${{ matrix.threads-enabled }}>'
runs-on: macos-${{ matrix.osver }}
strategy:
matrix:
build: [1, 2, 3]
build: [1, 2, 3, 4, 5]
include:
# -------------------------------------------------------------------
# VFX CY2022 - C++17
# VFX CY2023 - C++17 - MacOS 11.0
# -------------------------------------------------------------------
# Shared, Release
- build: 1
build-type: Release
build-shared: 'ON'
build-docs: 'OFF'
threads-enabled: 'ON'
compiler-desc: AppleClang11.0
cxx-standard: 17
osver: 10.15
osver: 11.0
exclude-tests:
vfx-cy: 23
# Static, Release
# Shared, Release, Threads OFF
- build: 2
build-type: Release
build-shared: 'OFF'
build-docs: 'OFF'
build-shared: 'ON'
threads-enabled: 'OFF'
compiler-desc: AppleClang11.0
cxx-standard: 17
osver: 10.15
osver: 11.0
exclude-tests:
vfx-cy: 23
# Static, Release
- build: 3
build-type: Release
build-shared: 'OFF'
threads-enabled: 'ON'
compiler-desc: AppleClang11.0
cxx-standard: 17
osver: 11.0
exclude-tests:
vfx-cy: 23
# Shared, Debug
- build: 3
- build: 4
build-type: Debug
build-shared: 'ON'
build-docs: 'OFF'
threads-enabled: 'ON'
compiler-desc: AppleClang11.0
cxx-standard: 17
osver: 10.15
osver: 11.0
exclude-tests:
vfx-cy: 23
# -------------------------------------------------------------------
# VFX CY2023 - C++17 - MacOS 12
# -------------------------------------------------------------------
# Shared, Release
- build: 5
build-type: Release
build-shared: 'ON'
threads-enabled: 'ON'
compiler-desc: AppleClang11.0
cxx-standard: 17
osver: 12.0
exclude-tests:
vfx-cy: 23
steps:
- name: Checkout
uses: actions/checkout@v3
@@ -388,7 +377,8 @@ jobs:
-DCMAKE_CXX_FLAGS=${{ matrix.cxx-flags }} \
-DCMAKE_VERBOSE_MAKEFILE:BOOL='OFF' \
-DBUILD_SHARED_LIBS=${{ matrix.build-shared }} \
-DOPENEXR_BUILD_TOOLS='ON' \
-DOPENEXR_INSTALL_TOOLS='ON' \
-DOPENEXR_INSTALL_DOCS='OFF' \
-DOPENEXR_RUN_FUZZ_TESTS='OFF'
working-directory: _build
- name: Build
@@ -398,7 +388,7 @@ jobs:
--config ${{ matrix.build-type }}
working-directory: _build
- name: Examples
run: |
run: |
# Make sure we can build the examples when configured as a
# standalone application linking against the just-installed
# OpenEXR library.
@@ -426,67 +416,78 @@ jobs:
# ---------------------------------------------------------------------------
# TODO: Debug mode is catatonically slow under windows
windows:
name: 'Windows VFXP-2022
name: 'Windows VFXP-${{ matrix.vfx-cy }}
<${{ matrix.compiler-desc }},
config=${{ matrix.build-type }},
shared=${{ matrix.build-shared }},
cxx=${{ matrix.cxx-standard }},
docs=${{ matrix.build-docs }}>'
cxx=${{ matrix.cxx-standard }},
threads=${{ matrix.threads-enabled }}>'
runs-on: windows-${{ matrix.osver }}
strategy:
matrix:
build: [1, 2, 3, 4]
build: [1, 2, 3, 4, 5]
include:
# -------------------------------------------------------------------
# VFX CY2022 - C++17 - Windows 2019
# VFX CY2023 - C++17 - Windows 2022 runner - MSVC 2022 (17.5)
# -------------------------------------------------------------------
# Shared, Release
- build: 1
build-type: Release
build-shared: 'ON'
build-docs: 'OFF'
compiler-desc: msvc16.11
threads-enabled: 'ON'
compiler-desc: msvc17.5
cxx-standard: 17
vfx-cy: 2021
vfx-cy: 2023
exclude-tests: ''
osver: 2019
osver: 2022
# Static, Release
# Shared, Release, Threads OFF
- build: 2
build-type: Release
build-shared: 'OFF'
build-docs: 'OFF'
compiler-desc: msvc16.11
cxx-standard: 17
vfx-cy: 2021
exclude-tests: ''
osver: 2019
# -------------------------------------------------------------------
# VFX CY2022 - C++17 - Windows 2022
# -------------------------------------------------------------------
# Shared, Release
- build: 3
build-type: Release
build-shared: 'ON'
build-docs: 'OFF'
compiler-desc: msvc17.1
threads-enabled: 'OFF'
compiler-desc: msvc17.5
cxx-standard: 17
vfx-cy: 2021
vfx-cy: 2023
exclude-tests: ''
osver: 2022
# Static, Release
- build: 4
- build: 3
build-type: Release
build-shared: 'OFF'
build-docs: 'OFF'
compiler-desc: msvc17.1
threads-enabled: 'ON'
compiler-desc: msvc17.5
cxx-standard: 17
vfx-cy: 2021
vfx-cy: 2023
exclude-tests: ''
osver: 2022
# -------------------------------------------------------------------
# VFX CY2022 - C++17 - Windows 2019 runner - MSVC 2019 (16.11)
# -------------------------------------------------------------------
# Shared, Release
- build: 4
build-type: Release
build-shared: 'ON'
threads-enabled: 'ON'
compiler-desc: msvc16.11
cxx-standard: 17
vfx-cy: 2022
exclude-tests: ''
osver: 2019
# Static, Release
- build: 5
build-type: Release
build-shared: 'OFF'
threads-enabled: 'ON'
compiler-desc: msvc16.11
cxx-standard: 17
vfx-cy: 2022
exclude-tests: ''
osver: 2019
steps:
- name: Checkout
uses: actions/checkout@v3
@@ -511,7 +512,8 @@ jobs:
-DCMAKE_CXX_FLAGS=${{ matrix.cxx-flags }} \
-DCMAKE_VERBOSE_MAKEFILE:BOOL='OFF' \
-DBUILD_SHARED_LIBS=${{ matrix.build-shared }} \
-DOPENEXR_BUILD_TOOLS='ON' \
-DOPENEXR_INSTALL_TOOLS='ON' \
-DOPENEXR_INSTALL_DOCS='OFF' \
-DOPENEXR_RUN_FUZZ_TESTS='OFF'
shell: bash
working-directory: _build
@@ -547,3 +549,4 @@ jobs:
-VV
shell: bash
working-directory: _build
@@ -1,5 +1,38 @@
name: CIFuzz
on: [pull_request]
# SPDX-License-Identifier: BSD-3-Clause
# Copyright Contributors to the OpenEXR Project.
name: OSS-Fuzz
# Skip the run on *.md changes and on changes to the website.
# Also, no need to run on changes to the bazel setup.
on:
push:
branches-ignore:
- RB-2.*
tags-ignore:
- v1.*
- v2.*
paths:
- '**'
- '!**.md'
- '!website/**'
- '!bazel/**'
pull_request:
branches-ignore:
- RB-2.*
tags-ignore:
- v1.*
- v2.*
paths:
- '**'
- '!**.md'
- '!website/**'
- '!bazel/**'
permissions:
contents: read
jobs:
Fuzzing:
runs-on: ubuntu-latest
+82
View File
@@ -0,0 +1,82 @@
# SPDX-License-Identifier: BSD-3-Clause
# Copyright (c) Contributors to the OpenEXR Project.
#
name: Python wheels
on:
push:
branches-ignore:
- RB-2.*
tags-ignore:
- v1.*
- v2.*
paths:
- '**'
- '!**.md'
- '!website/**'
- 'website/src/**'
- '!bazel/**'
pull_request:
branches-ignore:
- RB-2.*
tags-ignore:
- v1.*
- v2.*
paths:
- '**'
- '!**.md'
- '!website/**'
- 'website/src/**'
- '!bazel/**'
jobs:
build_wheels:
name: Build Python wheels
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-22.04, windows-latest, macOS-latest]
env:
# Skip 32-bit wheels builds.
# Also skip the PyPy builds, since they fail the unittests
CIBW_SKIP: "*-win32 *_i686 pp*"
CIBW_BEFORE_BUILD: >
echo "Installing OpenEXR..." &&
cd openexr.build &&
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=../openexr.install -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON -DCMAKE_PREFIX_PATH=../openexr.install -DCMAKE_INSTALL_LIBDIR=lib -DBUILD_TESTING=OFF -DOPENEXR_INSTALL_EXAMPLES=OFF -DOPENEXR_BUILD_TOOLS=OFF -DBUILD_SHARED_LIBS=OFF -DOPENEXR_FORCE_INTERNAL_DEFLATE=ON -DOPENEXR_FORCE_INTERNAL_IMATH=ON -DCMAKE_POSITION_INDEPENDENT_CODE=ON ../ &&
cmake --build ./ --config Release --clean-first &&
cmake --install ./ --config Release &&
cd ..
CIBW_TEST_REQUIRES: pytest
CIBW_TEST_COMMAND: pytest {project}/src/wrappers/python/tests/
steps:
- uses: actions/checkout@v3
# Used to host cibuildwheel
- uses: actions/setup-python@v4
with:
python-version: '3.x'
- name: Install cibuildwheel
run: python -m pip install cibuildwheel==2.8.1
- name: Create setup.py
run: |
mv ${{github.workspace}}/src/wrappers/python/setup.py ${{github.workspace}}/setup.py
mv ${{github.workspace}}/src/wrappers/python/Imath.py ${{github.workspace}}/Imath.py
mv ${{github.workspace}}/src/wrappers/python/OpenEXR.cpp ${{github.workspace}}/OpenEXR.cpp
- name: Create folders
run: |
mkdir -p ${{github.workspace}}/openexr.build
mkdir -p ${{github.workspace}}/openexr.install
- name: Build wheels
run: python -m cibuildwheel --output-dir wheelhouse
- uses: actions/upload-artifact@v3
with:
name: "Python wheels"
path: ./wheelhouse/*.whl
+64
View File
@@ -0,0 +1,64 @@
# SPDX-License-Identifier: BSD-3-Clause
# Copyright (c) Contributors to the OpenEXR Project.
#
# GitHub Actions workflow file
# https://help.github.com/en/actions/reference/workflow-syntax-for-github-actions
name: Website
# Run only on changes in the "website" directory.
# Skip the release branches, since the website is built from main.
on:
push:
branches:-ignore:
- RB-2.*
- RB-3.*
paths:
- 'website/**'
pull_request:
branches:-ignore:
- RB-2.*
- RB-3.*
paths:
- 'website/**'
permissions:
contents: read
jobs:
Website:
# Build the website, using a process that mimics the readthedoc build.
#
# Note that this job does not actually build OpenEXR libraries or
# programs, it just runs doxygen, sphinx, and the
# website/script/test_images.py script to generate the "Test Images"
# page.
name: 'Website'
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Create build directory
run: mkdir _build
- name: Install doxygen & imagemagick
# Need imagemagick for convert, to convert "Test Image" exrs to jpgs
# Need openexr for exrheader
run: sudo apt-get install -y doxygen imagemagick openexr
- name: Install sphinx requirements
run: pip3 install -r website/requirements.txt
- name: Configure
run: cmake .. -DBUILD_WEBSITE='ON'
working-directory: _build
- name: Build
run: |
cmake --build . \
--target website \
--config Release
working-directory: _build
+8 -1
View File
@@ -1,3 +1,5 @@
# SPDX-License-Identifier: BSD-3-Clause
# Copyright Contributors to the OpenEXR Project.
Makefile
Makefile.in
autom4te.cache
@@ -45,8 +47,13 @@ Contrib/DtexToExr/DtexToExr
*.project
*.cproject
.DS_Store
abi_check
build/
build-win/
build-nuget/
*~
.vscode
.vscode
docs/_test_images/
# Ignore Bazel generated files
bazel-*
+28
View File
@@ -0,0 +1,28 @@
# SPDX-License-Identifier: BSD-3-Clause
# Copyright Contributors to the OpenEXR Project.
# .readthedocs.yml
# Read the Docs configuration file
# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
# Required
version: 2
build:
os: "ubuntu-22.04"
tools:
python: "3.9"
apt_packages:
- wget # for test images
- imagemagick # for convert, for test images
- openexr # for exrheader, for test images
jobs:
pre_build:
- python website/scripts/test_images.py
sphinx:
configuration: website/conf.py
python:
install:
- requirements: website/requirements.txt
+124 -3
View File
@@ -53,10 +53,10 @@ expand_template(
"@OPENEXR_NAMESPACE_CUSTOM@": "3.2.0",
"@OPENEXR_PACKAGE_NAME@": "OpenEXR 3.2.0",
"@OPENEXR_VERSION_EXTRA@": "",
"@OPENEXR_VERSION@": "3.2.0",
"@OPENEXR_VERSION_MAJOR@": "3",
"@OPENEXR_VERSION_MINOR@": "2",
"@OPENEXR_VERSION_PATCH@": "0",
"@OPENEXR_VERSION@": "3.2.0",
"#cmakedefine OPENEXR_ENABLE_API_VISIBILITY": "#define OPENEXR_ENABLE_API_VISIBILITY",
"#cmakedefine OPENEXR_HAVE_LARGE_STACK 1": "/* #undef OPENEXR_HAVE_LARGE_STACK */",
},
@@ -84,6 +84,7 @@ cc_library(
"src/lib/Iex/IexMathFloatExc.cpp",
"src/lib/Iex/IexMathFpu.cpp",
"src/lib/Iex/IexThrowErrnoExc.cpp",
"src/lib/OpenEXRCore/openexr_version.h",
],
hdrs = [
"src/lib/Iex/Iex.h",
@@ -109,6 +110,7 @@ cc_library(
includes = [
"src/lib/Iex",
"src/lib/OpenEXR",
"src/lib/OpenEXRCore",
],
)
@@ -122,6 +124,7 @@ cc_library(
"src/lib/IlmThread/IlmThreadSemaphorePosix.cpp",
"src/lib/IlmThread/IlmThreadSemaphorePosixCompat.cpp",
"src/lib/IlmThread/IlmThreadSemaphoreWin32.cpp",
"src/lib/OpenEXRCore/openexr_version.h",
],
hdrs = [
"src/lib/IlmThread/IlmThread.h",
@@ -137,10 +140,128 @@ cc_library(
":windows": ["windows_export_all_symbols"],
"//conditions:default": [],
}),
includes = ["src/lib/IlmThread"],
includes = [
"src/lib/IlmThread",
"src/lib/OpenEXRCore",
],
deps = [":Iex"],
)
cc_library(
name = "OpenEXRCore",
srcs = [
"src/lib/IlmThread/IlmThreadConfig.h",
"src/lib/OpenEXR/OpenEXRConfig.h",
"src/lib/OpenEXR/OpenEXRConfigInternal.h",
"src/lib/OpenEXR/dwaLookups.h",
"src/lib/OpenEXRCore/attributes.c",
"src/lib/OpenEXRCore/backward_compatibility.h",
"src/lib/OpenEXRCore/base.c",
"src/lib/OpenEXRCore/channel_list.c",
"src/lib/OpenEXRCore/chunk.c",
"src/lib/OpenEXRCore/coding.c",
"src/lib/OpenEXRCore/compression.c",
"src/lib/OpenEXRCore/context.c",
"src/lib/OpenEXRCore/debug.c",
"src/lib/OpenEXRCore/decoding.c",
"src/lib/OpenEXRCore/encoding.c",
"src/lib/OpenEXRCore/float_vector.c",
"src/lib/OpenEXRCore/internal_attr.h",
"src/lib/OpenEXRCore/internal_b44.c",
"src/lib/OpenEXRCore/internal_b44_table.c",
"src/lib/OpenEXRCore/internal_channel_list.h",
"src/lib/OpenEXRCore/internal_coding.h",
"src/lib/OpenEXRCore/internal_compress.h",
"src/lib/OpenEXRCore/internal_constants.h",
"src/lib/OpenEXRCore/internal_cpuid.h",
"src/lib/OpenEXRCore/internal_decompress.h",
"src/lib/OpenEXRCore/internal_dwa.c",
"src/lib/OpenEXRCore/internal_dwa_channeldata.h",
"src/lib/OpenEXRCore/internal_dwa_classifier.h",
"src/lib/OpenEXRCore/internal_dwa_compressor.h",
"src/lib/OpenEXRCore/internal_dwa_decoder.h",
"src/lib/OpenEXRCore/internal_dwa_encoder.h",
"src/lib/OpenEXRCore/internal_dwa_helpers.h",
"src/lib/OpenEXRCore/internal_dwa_simd.h",
"src/lib/OpenEXRCore/internal_file.h",
"src/lib/OpenEXRCore/internal_float_vector.h",
"src/lib/OpenEXRCore/internal_huf.c",
"src/lib/OpenEXRCore/internal_huf.h",
"src/lib/OpenEXRCore/internal_memory.h",
"src/lib/OpenEXRCore/internal_opaque.h",
"src/lib/OpenEXRCore/internal_piz.c",
"src/lib/OpenEXRCore/internal_posix_file_impl.h",
"src/lib/OpenEXRCore/internal_preview.h",
"src/lib/OpenEXRCore/internal_pxr24.c",
"src/lib/OpenEXRCore/internal_rle.c",
"src/lib/OpenEXRCore/internal_string.h",
"src/lib/OpenEXRCore/internal_string_vector.h",
"src/lib/OpenEXRCore/internal_structs.c",
"src/lib/OpenEXRCore/internal_structs.h",
"src/lib/OpenEXRCore/internal_util.h",
"src/lib/OpenEXRCore/internal_win32_file_impl.h",
"src/lib/OpenEXRCore/internal_xdr.h",
"src/lib/OpenEXRCore/internal_zip.c",
"src/lib/OpenEXRCore/memory.c",
"src/lib/OpenEXRCore/opaque.c",
"src/lib/OpenEXRCore/openexr_version.h",
"src/lib/OpenEXRCore/pack.c",
"src/lib/OpenEXRCore/parse_header.c",
"src/lib/OpenEXRCore/part.c",
"src/lib/OpenEXRCore/part_attr.c",
"src/lib/OpenEXRCore/preview.c",
"src/lib/OpenEXRCore/std_attr.c",
"src/lib/OpenEXRCore/string.c",
"src/lib/OpenEXRCore/string_vector.c",
"src/lib/OpenEXRCore/unpack.c",
"src/lib/OpenEXRCore/validation.c",
"src/lib/OpenEXRCore/write_header.c",
],
hdrs = [
"src/lib/OpenEXRCore/openexr.h",
"src/lib/OpenEXRCore/openexr_attr.h",
"src/lib/OpenEXRCore/openexr_base.h",
"src/lib/OpenEXRCore/openexr_chunkio.h",
"src/lib/OpenEXRCore/openexr_coding.h",
"src/lib/OpenEXRCore/openexr_compression.h",
"src/lib/OpenEXRCore/openexr_config.h",
"src/lib/OpenEXRCore/openexr_context.h",
"src/lib/OpenEXRCore/openexr_debug.h",
"src/lib/OpenEXRCore/openexr_decode.h",
"src/lib/OpenEXRCore/openexr_encode.h",
"src/lib/OpenEXRCore/openexr_errors.h",
"src/lib/OpenEXRCore/openexr_part.h",
"src/lib/OpenEXRCore/openexr_std_attr.h",
],
copts = select({
":windows": [],
"//conditions:default": [
"-Wno-error",
],
}),
features = select({
":windows": ["windows_export_all_symbols"],
"//conditions:default": [],
}),
includes = [
"src/lib/IlmThread",
"src/lib/OpenEXR",
"src/lib/OpenEXRCore",
],
linkopts =
select({
":windows": [],
"//conditions:default": [
"-pthread",
],
}),
visibility = ["//visibility:public"],
deps = [
"@Imath",
"@libdeflate//:deflate",
],
)
cc_library(
name = "OpenEXR",
srcs = [
@@ -378,8 +499,8 @@ cc_library(
visibility = ["//visibility:public"],
deps = [
":IlmThread",
":OpenEXRCore",
"@Imath",
"@net_zlib_zlib//:zlib",
],
)
+463 -25
View File
@@ -3,6 +3,11 @@
# OpenEXR Release Notes
* [Version 3.2.0](#version-320-august-30-2023) August 30, 2023
* [Version 3.1.11](#version-3111-august-13-2023) August 13, 2023
* [Version 3.1.10](#version-3110-august-2-2023) August 2, 2023
* [Version 3.1.9](#version-319-june-25-2023) June 25, 2023
* [Version 3.1.8](#version-318-june-2-2023) June 2, 2023
* [Version 3.1.7](#version-317-march-28-2023) March 28, 2023
* [Version 3.1.6](#version-316-march-9-2023) March 9, 2023
* [Version 3.1.5](#version-315-april-11-2022) April 11, 2022
@@ -61,6 +66,439 @@
* [Version 1.0.1](#version-101)
* [Version 1.0](#version-10)
## Version 3.2.0 (August 30, 2023)
Minor release with several additions, changes and improvements:
* Zip compression via ``libdeflate``
As of OpenEXR release v3.2, OpenEXR depends on
[libdeflate](https://github.com/ebiggers/libdeflate) for
DEFLATE-based compression. Previous OpenEXR releases relied on
[zlib](https://www.zlib.net). Builds of OpenEXR can choose either an
``libdeflate`` installation, or CMake can auto-fetch the source and
build it internally. The internal build is linked statically, so no
extra shared object is produced.
See [website/install.rst](website/install.rst) for more details.
* New camdkit/camdkit-enabled standard attributes
These changes bring to OpenEXR new standard optional attributes that
were discussed in the [SMPTE Rapid Industry Solutions On-Set Virtual
Production
Initiative)](https://www.smpte.org/blog/update-on-smptes-rapid-industry-solutions-ris-on-set-virtual-production-osvp-initiative). Additionally,
some useful attributes from the SMPTE ACES Container File Layout
standard, SMPTE ST 2065-4:2023, have been included as well. The new
attributes are:
Support automated editorial workflow:
- ``reelName``
- ``imageCounter``
- ``ascFramingDecisionList``
Support forensics:
- ``cameraMake``
- ``cameraModel``
- ``cameraSerialNumber``
- ``cameraFirmware``
- ``cameraUuid``
- ``cameraLabel``
- ``lensMake``
- ``lensModel``
- ``lensSerialNumber``
- ``lensFirmware``
- ``cameraColorBalance``
Support pickup shots:
- ``shutterAngle``
- ``cameraCCTSetting``
- ``cameraTintSetting``
Support metadata-driven match move:
- ``sensorCenterOffset``
- ``sensorOverallDimensions``
- ``sensorPhotositePitch``
- ``sensorAcquisitionRectangle``
- ``nominalFocalLength``
- ``effectiveFocalLength``
- ``pinholeFocalLength``
- ``entrancePupilOffset``
- ``tStop`` (complementing existing aperture)
Also, ``renderingTransform`` and ``lookTransform`` have been deprecated.
See
[website/StandardAttributes.rst](website/StandardAttributes.rst)
and [PR
#1383](https://github.com/AcademySoftwareFoundation/openexr/pull/1383)
for more details.
* Updated SO versioning policy
This change adopts a policy of appending the ``MAJOR.MINOR.PATCH``
software release name to the ``SONAME`` to form the real name of the
shared library.
See [website/install.rst](website/install.rst) and [PR
#1498](https://github.com/AcademySoftwareFoundation/openexr/pull/1498)
for more details.
* Python bindings & PyPI wheel
Support for the [OpenEXR python
bindings](https://pypi.org/project/OpenEXR) have been formally
adopted by the OpenEXR project.
* Miscellaneous improvements:
- "docs" renamed to "website" ([PR
#1504](https://github.com/AcademySoftwareFoundation/openexr/pull/1504))
- Additional deep & multipart code examples ([PR
#1493](https://github.com/AcademySoftwareFoundation/openexr/pull/1493)
and [PR
#1502](https://github.com/AcademySoftwareFoundation/openexr/pull/1502))
- Many small build/test fixes
- bin tools man pages
- Expanded test coverage
Specific OSS-fuzz issues addressed:
* OSS-fuzz [46459](https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=46459)
Out-of-memory in ``openexr_exrcheck_fuzzer``
* OSS-fuzz [46432](https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=46432)
Heap-buffer-overflow in ``generic_unpack``
* OSS-fuzz [46413](https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=46413)
Integer-overflow in ``reconstruct_chunk_table``
* OSS-fuzz [45718](https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=45718)
Heap-double-free in ``Imf_3_1::RgbaInputFile::~RgbaInputFile``
* OSS-fuzz [45716](https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=45716)
Abrt in ``Imf_3_1::RgbaInputFile::~RgbaInputFile``
* OSS-fuzz [43771](https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=43771)
Direct-leak in ``Imf_3_1::RgbaInputFile::RgbaInputFile``
### Merged Pull Requests
* [1527](https://github.com/AcademySoftwareFoundation/openexr/pull/1527)
`OpenEXRConfig.h.in` uses version extracted from `openexr_version.h`
* [1525](https://github.com/AcademySoftwareFoundation/openexr/pull/1525)
Add bzlmod support
* [1523](https://github.com/AcademySoftwareFoundation/openexr/pull/1523)
Add `DEPENDENCIES Imath::Imath` for OpenEXRCore (#1523)
* [1522](https://github.com/AcademySoftwareFoundation/openexr/pull/1522)
Rename cifuzz workflow to OSS-Fuzz, and filter out unnecessary triggers
* [1520](https://github.com/AcademySoftwareFoundation/openexr/pull/1520)
fix memory leaks in exrmultipart
* [1519](https://github.com/AcademySoftwareFoundation/openexr/pull/1519)
Remove .bazelrc file
* [1518](https://github.com/AcademySoftwareFoundation/openexr/pull/1518)
Bazel support: Simplify use of libdeflate dependency
* [1517](https://github.com/AcademySoftwareFoundation/openexr/pull/1517)
Streamline Python wheel workflow, and add tests and a CMake setup for bindings
* [1516](https://github.com/AcademySoftwareFoundation/openexr/pull/1516)
Bazel support: Remove Bazel specific example and use same examples as CMake build
* [1513](https://github.com/AcademySoftwareFoundation/openexr/pull/1513)
Separate Actions workflow for the website
* [1511](https://github.com/AcademySoftwareFoundation/openexr/pull/1511)
Website "Attributes" page now describes all attributes
* [1510](https://github.com/AcademySoftwareFoundation/openexr/pull/1510)
Deprecate renderingTransform and lookModTransform
* [1509](https://github.com/AcademySoftwareFoundation/openexr/pull/1509)
Initialize regs[] to 0 in check_for_x86_simd
* [1507](https://github.com/AcademySoftwareFoundation/openexr/pull/1507)
Fix CPUID detection with ``-march=x86-64-v3``
* [1505](https://github.com/AcademySoftwareFoundation/openexr/pull/1505)
Add missing copyright/license specifiers
* [1504](https://github.com/AcademySoftwareFoundation/openexr/pull/1504)
Rename "docs" to "website"
* [1503](https://github.com/AcademySoftwareFoundation/openexr/pull/1503)
Reorganize ``share/util`` and remove unnecessary files
* [1502](https://github.com/AcademySoftwareFoundation/openexr/pull/1502)
multipart code examples
* [1501](https://github.com/AcademySoftwareFoundation/openexr/pull/1501)
Add website example source files to the CMake build for validation
* [1500](https://github.com/AcademySoftwareFoundation/openexr/pull/1500)
Add 2023 Virtual Town Hall to news
* [1498](https://github.com/AcademySoftwareFoundation/openexr/pull/1498)
Update and simplify SO versioning policy
* [1496](https://github.com/AcademySoftwareFoundation/openexr/pull/1496)
Bazel update
* [1495](https://github.com/AcademySoftwareFoundation/openexr/pull/1495)
Rename ``IMATH_REPO/TAG`` to ``OPENEXR_IMATH_REPO/TAG`` and update install docs
* [1494](https://github.com/AcademySoftwareFoundation/openexr/pull/1494)
Reorder attributes in doc to match order in header
* [1493](https://github.com/AcademySoftwareFoundation/openexr/pull/1493)
adds deep examples, fixes the deep examples in docs
* [1490](https://github.com/AcademySoftwareFoundation/openexr/pull/1490)
Readdress #1456: disallow NaNs in ``testOptimizedInterleavePatterns``
* [1489](https://github.com/AcademySoftwareFoundation/openexr/pull/1489)
Add ``sensorCenterOffset``, ``sensorOverallDimensions``, ``sensorPhotositePitch``
* [1488](https://github.com/AcademySoftwareFoundation/openexr/pull/1488)
Revert pre-computed values
* [1487](https://github.com/AcademySoftwareFoundation/openexr/pull/1487)
Python wheels
* [1486](https://github.com/AcademySoftwareFoundation/openexr/pull/1486)
Replace ``ILMBASE_THREADING_ENABLED`` with ``ILMTHREAD_THREADING_ENABLED``
* [1484](https://github.com/AcademySoftwareFoundation/openexr/pull/1484)
Fix handling for corrupt number of DC components
* [1483](https://github.com/AcademySoftwareFoundation/openexr/pull/1483)
Add ``ImfMisc.h`` and ``ImfCompressor.h`` as installed headers
* [1482](https://github.com/AcademySoftwareFoundation/openexr/pull/1482)
Add ``OPENEXR_MISSING_ARM_VLD1`` workaround to ``internal_dwa_simd.h``
* [1475](https://github.com/AcademySoftwareFoundation/openexr/pull/1475)
Update CI with vfx2023 Linux jobs.
* [1473](https://github.com/AcademySoftwareFoundation/openexr/pull/1473)
consolidate project configurations to one place
* [1472](https://github.com/AcademySoftwareFoundation/openexr/pull/1472)
Fix range check in dwa compressor
* [1471](https://github.com/AcademySoftwareFoundation/openexr/pull/1471)
Add detailed instructions for making both patch and major/minor release
* [1468](https://github.com/AcademySoftwareFoundation/openexr/pull/1468)
Remove old zlib reference
* [1464](https://github.com/AcademySoftwareFoundation/openexr/pull/1464)
v3.1.9/v3.1.8 notes and news
* [1453](https://github.com/AcademySoftwareFoundation/openexr/pull/1453)
CIFuzz skips PRs that only modify markdown
* [1428](https://github.com/AcademySoftwareFoundation/openexr/pull/1428)
Add simple abi checker util
* [1427](https://github.com/AcademySoftwareFoundation/openexr/pull/1427)
Fix handling of builddir and cxxwarns in ``clang_coverage.sh``
* [1426](https://github.com/AcademySoftwareFoundation/openexr/pull/1426)
Prevent re-download of images if already in place
* [1425](https://github.com/AcademySoftwareFoundation/openexr/pull/1425)
prepare for new version of libdeflate with thread-safe alloc functions
* [1424](https://github.com/AcademySoftwareFoundation/openexr/pull/1424)
Start working on improving test coverage
* [1422](https://github.com/AcademySoftwareFoundation/openexr/pull/1422)
Fix reference to the number of supported compression types
* [1421](https://github.com/AcademySoftwareFoundation/openexr/pull/1421)
after other merges, need to fix include
* [1420](https://github.com/AcademySoftwareFoundation/openexr/pull/1420)
Document DWAA/DWAB compression in Technical Introduction
* [1417](https://github.com/AcademySoftwareFoundation/openexr/pull/1417)
ci: set minimal permissions on GitHub workflows
* [1411](https://github.com/AcademySoftwareFoundation/openexr/pull/1411)
Shift MacOS versions in flight
* [1410](https://github.com/AcademySoftwareFoundation/openexr/pull/1410)
Revert fix of spelling mistakes in PR messages
* [1403](https://github.com/AcademySoftwareFoundation/openexr/pull/1403)
ensure we are passing through valid function pointers
* [1399](https://github.com/AcademySoftwareFoundation/openexr/pull/1399)
Fix version h
* [1398](https://github.com/AcademySoftwareFoundation/openexr/pull/1398)
More robust ``openexr_version.h`` handling
* [1396](https://github.com/AcademySoftwareFoundation/openexr/pull/1396)
Fix spelling mistakes
* [1395](https://github.com/AcademySoftwareFoundation/openexr/pull/1395)
Bazel support update
* [1394](https://github.com/AcademySoftwareFoundation/openexr/pull/1394)
Remove unused private member ``variable`` _maxScanLineSize (ABI break)
* [1388](https://github.com/AcademySoftwareFoundation/openexr/pull/1388)
Updated Mac and Windows jobs for VFX platform 2023.
* [1387](https://github.com/AcademySoftwareFoundation/openexr/pull/1387)
Switch to embedding libdeflate into EXRCore
* [1386](https://github.com/AcademySoftwareFoundation/openexr/pull/1386)
Govern library version by ``OpenEXRVersion.h``
* [1383](https://github.com/AcademySoftwareFoundation/openexr/pull/1383)
Add selected SMPTE camdkit or camdkit-enabling standard optional attributes
* [1381](https://github.com/AcademySoftwareFoundation/openexr/pull/1381)
Deprecate ``exrbuild.cpp``
* [1380](https://github.com/AcademySoftwareFoundation/openexr/pull/1380)
Tool manpages, doc page, and standardized ``--help`` messages
* [1379](https://github.com/AcademySoftwareFoundation/openexr/pull/1379)
Reorder attribute definitions in ``ImfStandardAttributes.h`` by functional group
* [1375](https://github.com/AcademySoftwareFoundation/openexr/pull/1375)
notes and news for v3.1.7
* [1372](https://github.com/AcademySoftwareFoundation/openexr/pull/1372)
Test Images page for website
* [1364](https://github.com/AcademySoftwareFoundation/openexr/pull/1364)
Extend Iex test coverage
* [1363](https://github.com/AcademySoftwareFoundation/openexr/pull/1363)
Fix ``run_gcov.sh`` to use proper ``_build/_coverage`` dirs
* [1357](https://github.com/AcademySoftwareFoundation/openexr/pull/1357)
Fix coverage analysis for .c files
* [1352](https://github.com/AcademySoftwareFoundation/openexr/pull/1352)
Add 3.1.6 to release notes and news
* [1351](https://github.com/AcademySoftwareFoundation/openexr/pull/1351)
Add tests for bin programs
* [1350](https://github.com/AcademySoftwareFoundation/openexr/pull/1350)
Bazel Support: Switch to Imath 3.1.7
* [1310](https://github.com/AcademySoftwareFoundation/openexr/pull/1310)
Switch to Imath 3.1.6 for Bazel build
* [1288](https://github.com/AcademySoftwareFoundation/openexr/pull/1288)
Update bazel build
* [1258](https://github.com/AcademySoftwareFoundation/openexr/pull/1258)
Bazel support: Bump OpenEXR version to 3.2
* [1257](https://github.com/AcademySoftwareFoundation/openexr/pull/1257)
Refactor ``ImfCheckFile`` and oss-fuzz tests
* [1256](https://github.com/AcademySoftwareFoundation/openexr/pull/1256)
Fix Bazel Imath version defines
* [1243](https://github.com/AcademySoftwareFoundation/openexr/pull/1243)
Update GitHub checkout action from V2 to V3
* [1241](https://github.com/AcademySoftwareFoundation/openexr/pull/1241)
Bump version to 3.2.0 on the main branch
* [1240](https://github.com/AcademySoftwareFoundation/openexr/pull/1240)
prevent double-free of ``RgbaInputFile::_inputPart``
* [1228](https://github.com/AcademySoftwareFoundation/openexr/pull/1228)
Fix build script so auto-build of imath uses the new branch name
* [1226](https://github.com/AcademySoftwareFoundation/openexr/pull/1226)
Merge release notes and SECURITY.md from RB-3.1
* [1221](https://github.com/AcademySoftwareFoundation/openexr/pull/1221)
fix memory leak in ``RgbaInputFile`` constructor
* [1201](https://github.com/AcademySoftwareFoundation/openexr/pull/1201)
Extend multipart ``RgbaInputFile`` API
* [1198](https://github.com/AcademySoftwareFoundation/openexr/pull/1198)
Fix version number of Imath for Bazel build
* [1194](https://github.com/AcademySoftwareFoundation/openexr/pull/1194)
RgbaInputFile: Multipart support
* [1171](https://github.com/AcademySoftwareFoundation/openexr/pull/1171)
Merge v3.1.2 release notes to master
* [1139](https://github.com/AcademySoftwareFoundation/openexr/pull/1139)
Bazel update
* [1127](https://github.com/AcademySoftwareFoundation/openexr/pull/1127)
Bazel build: Update Imath version to 3.1.2
* [1103](https://github.com/AcademySoftwareFoundation/openexr/pull/1103)
Update Imath to 3.1.1 and bazelisk to 1.10.1
* [1096](https://github.com/AcademySoftwareFoundation/openexr/pull/1096)
Update Imath to 3.1.0 for Bazel build
* [1093](https://github.com/AcademySoftwareFoundation/openexr/pull/1093)
Use Bazel standard convention for repository names
* [1091](https://github.com/AcademySoftwareFoundation/openexr/pull/1091)
Analysis CI updates
* [1089](https://github.com/AcademySoftwareFoundation/openexr/pull/1089)
Release notes for v3.1.0
* [1085](https://github.com/AcademySoftwareFoundation/openexr/pull/1085)
Cherry-pick v3.0.5 release notes into master
* [1083](https://github.com/AcademySoftwareFoundation/openexr/pull/1083)
Do Bazel CI builds also for pull requests
* [1079](https://github.com/AcademySoftwareFoundation/openexr/pull/1079)
Bazel build: Update Imath to version 3.0.5
* [1078](https://github.com/AcademySoftwareFoundation/openexr/pull/1078)
Bazel build: Fix download hash for Imath
* [1071](https://github.com/AcademySoftwareFoundation/openexr/pull/1071)
Do not do a Bazel Build on old OpenEXR branches
* [1070](https://github.com/AcademySoftwareFoundation/openexr/pull/1070)
Fix bazel build: Add missing headers to exrenvmap
* [1068](https://github.com/AcademySoftwareFoundation/openexr/pull/1068)
Bazel build: Add some OpenEXR tools
* [1067](https://github.com/AcademySoftwareFoundation/openexr/pull/1067)
Sort source files in CMake targets
* [1060](https://github.com/AcademySoftwareFoundation/openexr/pull/1060)
Improve Bazel Build
* [1058](https://github.com/AcademySoftwareFoundation/openexr/pull/1058)
Add ``validate_openexr_libs.sh`` to validate .so symlinks
## Version 3.1.11 (August 13, 2023)
Patch release that fixes a build failure with ``-march=x86-64-v3``
### Merged Pull Requests
* [1509](https://github.com/AcademySoftwareFoundation/openexr/pull/1509)
Initialize ``regs[]`` to 0 in ``check_for_x86_simd``
* [1507](https://github.com/AcademySoftwareFoundation/openexr/pull/1507)
Fix CPUID detection with ``-march=x86-64-v3``
## Version 3.1.10 (August 2, 2023)
Patch release that addresses miscellaneous build issues, test
failures, and performance regressions, as well as:
* OSS-fuzz [59457](https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=59457)
Heap-buffer-overflow in ``LossyDctDecoder_execute``
### Merged Pull Requests
* [1490](https://github.com/AcademySoftwareFoundation/openexr/pull/1490) Readdress #1456: disallow NaNs in ``testOptimizedInterleavePatterns``
* [1488](https://github.com/AcademySoftwareFoundation/openexr/pull/1488) Revert pre-computed values
* [1484](https://github.com/AcademySoftwareFoundation/openexr/pull/1484) Fix handling for corrupt number of DC components
* [1482](https://github.com/AcademySoftwareFoundation/openexr/pull/1482) Add ``OPENEXR_MISSING_ARM_VLD1`` workaround to ``internal_dwa_simd.h``
* [1480](https://github.com/AcademySoftwareFoundation/openexr/pull/1480) Fix Huffman performance regression on Linux/clang
* [1472](https://github.com/AcademySoftwareFoundation/openexr/pull/1472) Fix range check in dwa compressor
* [1470](https://github.com/AcademySoftwareFoundation/openexr/pull/1470) Fix build with i386 and musl libc
* [1469](https://github.com/AcademySoftwareFoundation/openexr/pull/1469) Fix the code contains unhandled character
* [1467](https://github.com/AcademySoftwareFoundation/openexr/pull/1467) Fix cpu detection of sse2 on non-64 x86
* [1466](https://github.com/AcademySoftwareFoundation/openexr/pull/1466) Fix the code contains unhandled character
* [1463](https://github.com/AcademySoftwareFoundation/openexr/pull/1463) Fix gcc-11 warnings: signed/unsigned integer comparison, unused variables
* [1462](https://github.com/AcademySoftwareFoundation/openexr/pull/1462) Fix macOS and Windows build failures when threading is disabled
* [1447](https://github.com/AcademySoftwareFoundation/openexr/pull/1447) Fix build error on win_arm64
## Version 3.1.9 (June 25, 2023)
Patch release that addresses miscelleneous build, doc, test issues, in
particular:
- Build fix for older macOS versions
Also:
* OSS-fuzz [59382](https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=59382)
Heap-buffer-overflow in ``internal_huf_decompress``
### Merged Pull Requests
* [1461](https::/github.com/AcademySoftwareFoundation/openexr/pull/1461)
don't use NaNs/infs in testOptimizedInterleavePatterns
* [1457](https::/github.com/AcademySoftwareFoundation/openexr/pull/1457)
Bazel support: Switch back to VS2019 due to a toolchain issue in Bazel
* [1454](https::/github.com/AcademySoftwareFoundation/openexr/pull/1454)
Add ``OPENEXR_IMF_INTERNAL_NAMESPACE`` for ``WidenFilename``
* [1452](https::/github.com/AcademySoftwareFoundation/openexr/pull/1452)
Use ``security@openexr.com`` for consistency
* [1448](https::/github.com/AcademySoftwareFoundation/openexr/pull/1448)
compression.cpp: fix isnan
* [1443](https::/github.com/AcademySoftwareFoundation/openexr/pull/1443)
Bazel bump imath
* [1439](https::/github.com/AcademySoftwareFoundation/openexr/pull/1439)
Fix scenario where malformed dwa file could read past end of buffer
* [1416](https::/github.com/AcademySoftwareFoundation/openexr/pull/1416)
IlmThread: fix defines for older macOS: do not prefix with ``__``
## Version 3.1.8 (June 2, 2023)
Patch release that addresses miscellaneous build issues, for macOS in
particular, but also includes:
* Support for DWA compression in OpenEXRCore
* Fix for threadpool deadlocks during shutdown on Windows
This release also addresses:
* OSS-fuzz [59070](https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=59070) Stack-buffer-overflow in DwaCompressor_readChannelRules
### Merged Pull Requests
* [1429](https::/github.com/AcademySoftwareFoundation/openexr/pull/1429)
fix out of bounds check with a full channel name vs. byte count
* [1414](https::/github.com/AcademySoftwareFoundation/openexr/pull/1414)
Add #include <cmath> for isnan
* [1409](https::/github.com/AcademySoftwareFoundation/openexr/pull/1409)
Use posix compat code for old macOS without libdispatch
* [1408](https::/github.com/AcademySoftwareFoundation/openexr/pull/1408)
internal_xdr.h: fix endian logic for Apple
* [1406](https::/github.com/AcademySoftwareFoundation/openexr/pull/1406)
internal_structs.h: __STDC_FORMAT_MACROS should be defined prior to inttypes.h
* [1402](https::/github.com/AcademySoftwareFoundation/openexr/pull/1402)
Add dwa support to core
* [1389](https::/github.com/AcademySoftwareFoundation/openexr/pull/1389)
fix typo
* [1382](https::/github.com/AcademySoftwareFoundation/openexr/pull/1382)
Update macOS installation instructions
* [1378](https::/github.com/AcademySoftwareFoundation/openexr/pull/1378)
Fix typo in README.md
* [1377](https::/github.com/AcademySoftwareFoundation/openexr/pull/1377)
Only install exrinfo when OPENEXR_INSTALL_TOOLS is on
* [1291](https::/github.com/AcademySoftwareFoundation/openexr/pull/1291)
Change setNumThreads to wait for thread start
## Version 3.1.7 (March 28, 2023)
Patch release that fixes a regression on ARMv7, and fixes a build
@@ -165,8 +603,8 @@ Check for null pointer passed to ``memcpy``
* [1295](https://github.com/AcademySoftwareFoundation/openexr/pull/1295)
Remove TSC meeting notes from repo
* [1294](https://github.com/AcademySoftwareFoundation/openexr/pull/1294)
Change reference to ``IlmBase`` to ``Imath`` in ``README.md
*`` [1293](https://github.com/AcademySoftwareFoundation/openexr/pull/1293)
Change reference to ``IlmBase`` to ``Imath`` in ``README.md``
* [1293](https://github.com/AcademySoftwareFoundation/openexr/pull/1293)
Update Christina's affiliation
* [1292](https://github.com/AcademySoftwareFoundation/openexr/pull/1292)
Fix typo in the documentation's example reading class
@@ -486,7 +924,7 @@ Patch release with various bug fixes, build improvements, and
documentation updates.
With this version, the OpenEXR technical documentation formerly
distributed exclusivly as pdf's is now published online at
distributed exclusively as pdf's is now published online at
https://openexr.readthedocs.io, with the document source now
maintained as .rst files in the repo's docs subfolder.
@@ -546,7 +984,7 @@ Specific OSS-fuzz issues:
* [1130](https://github.com/AcademySoftwareFoundation/openexr/pull/1130)
Clean up OpenEXRCore doxygen comments
* [1129](https://github.com/AcademySoftwareFoundation/openexr/pull/1129)
Guard `__has_attribute` for compilers that don't support it
Guard ``__has_attribute`` for compilers that don't support it
* [1124](https://github.com/AcademySoftwareFoundation/openexr/pull/1124)
Remove throw from ~IlmThread
* [1123](https://github.com/AcademySoftwareFoundation/openexr/pull/1123)
@@ -560,7 +998,7 @@ Specific OSS-fuzz issues:
* [1108](https://github.com/AcademySoftwareFoundation/openexr/pull/1108)
Fix formatting in InterpretingDeepPixels.rst:
* [1104](https://github.com/AcademySoftwareFoundation/openexr/pull/1104)
'TheoryDeepPixels.rst' first pass converson from latex
``TheoryDeepPixels.rst`` first pass converson from latex
* [1042](https://github.com/AcademySoftwareFoundation/openexr/pull/1042)
Fix broken link for releases
@@ -891,7 +1329,7 @@ Specific OSS-fuzz issues addressed include:
* [956](https://github.com/AcademySoftwareFoundation/openexr/pull/956) Replace stray Imath:: with IMATH_NAMESPACE::
* [955](https://github.com/AcademySoftwareFoundation/openexr/pull/955) Usability improvements for submodule use.
* [953](https://github.com/AcademySoftwareFoundation/openexr/pull/953) Add GLOBAL to add_library(zlib)
* [952](https://github.com/AcademySoftwareFoundation/openexr/pull/952) Remove 'long' overloads for Xdr::read and Xdr::write functions
* [952](https://github.com/AcademySoftwareFoundation/openexr/pull/952) Remove ``long`` overloads for Xdr::read and Xdr::write functions
* [951](https://github.com/AcademySoftwareFoundation/openexr/pull/951) Change copyright notices to standard SPDX format
* [950](https://github.com/AcademySoftwareFoundation/openexr/pull/950) Don't install ImfB44Compressor.h
* [949](https://github.com/AcademySoftwareFoundation/openexr/pull/949) Bazel build: Bump Imath version to current master
@@ -909,7 +1347,7 @@ Specific OSS-fuzz issues addressed include:
* [930](https://github.com/AcademySoftwareFoundation/openexr/pull/930) exrcheck: use 64 bit integer math to prevent pointer overflows
* [929](https://github.com/AcademySoftwareFoundation/openexr/pull/929) Remove all references to "IlmBase"
* [928](https://github.com/AcademySoftwareFoundation/openexr/pull/928) exrcheck: better tile checks in reduceMemory mode
* [926](https://github.com/AcademySoftwareFoundation/openexr/pull/926) exrcheck: Revert to using 'getStep' for Rgba interfaces
* [926](https://github.com/AcademySoftwareFoundation/openexr/pull/926) exrcheck: Revert to using ``getStep`` for Rgba interfaces
* [925](https://github.com/AcademySoftwareFoundation/openexr/pull/925) handle reallocation of idmanifest attributes
* [923](https://github.com/AcademySoftwareFoundation/openexr/pull/923) free up memory if DWA unRle throws
* [921](https://github.com/AcademySoftwareFoundation/openexr/pull/921) Only wait for and join joinable threads
@@ -921,7 +1359,7 @@ Specific OSS-fuzz issues addressed include:
* [911](https://github.com/AcademySoftwareFoundation/openexr/pull/911) Prevent reading or writing OpenEXR images with no channels
* [909](https://github.com/AcademySoftwareFoundation/openexr/pull/909) Add idmanifest attribute support
* [906](https://github.com/AcademySoftwareFoundation/openexr/pull/906) expand testCompression to better test DWAA, DWAB and tiled images
* [902](https://github.com/AcademySoftwareFoundation/openexr/pull/902) exrcheck: rework 'reduceMemory' and 'reduceTime' modes
* [902](https://github.com/AcademySoftwareFoundation/openexr/pull/902) exrcheck: rework ``reduceMemory`` and ``reduceTime`` modes
* [899](https://github.com/AcademySoftwareFoundation/openexr/pull/899) Change NOTICE to STATUS to address #891
* [898](https://github.com/AcademySoftwareFoundation/openexr/pull/898) Add support for Bazel
* [895](https://github.com/AcademySoftwareFoundation/openexr/pull/895) exrcheck: make reduced memory/time modes more sensitive
@@ -1060,7 +1498,7 @@ Specific OSS-fuzz issues include:
* [844](https://github.com/AcademySoftwareFoundation/openexr/pull/844) check EXRAllocAligned succeeded to allocate ScanlineInputFile lineBuffers (ZhiWei Sun from Topsec Alpha Lab)
* [845](https://github.com/AcademySoftwareFoundation/openexr/pull/845) test channels are DCT compressed before DWA decompression (ZhiWei Sun from Topsec Alpha Lab)
* [849](https://github.com/AcademySoftwareFoundation/openexr/pull/849) check for valid Huf code lengths (OSS-fuzz 26229)
* [860](https://github.com/AcademySoftwareFoundation/openexr/pull/860) check 1 part files with 'nonimage' bit have type attribute (OSS-fuzz 26658)
* [860](https://github.com/AcademySoftwareFoundation/openexr/pull/860) check 1 part files with ``nonimage`` bit have type attribute (OSS-fuzz 26658)
* [861](https://github.com/AcademySoftwareFoundation/openexr/pull/861) Fix overflow computing deeptile sample table size (OSS-fuzz 26956)
* [863](https://github.com/AcademySoftwareFoundation/openexr/pull/863) re-order shift/compare in FastHuf to prevent undefined shift overflow (OSS-fuzz 27409)
* Also, partial fixes from [842](https://github.com/AcademySoftwareFoundation/openexr/pull/842) which do not change the ABI: (OSS-fuzz 25892 , OSS-fuzz 25894)
@@ -1329,7 +1767,7 @@ Minor release with miscellaneous bug fixes and small features
### Closed Issues
* [689](https://github.com/AcademySoftwareFoundation/openexr/issues/689) I was able to get OpenEXR to install by adding `-std=c++11` to the `extra_compile_flags` in setup.py, as lgritz and peterhillman suggested. Here's the file with it added:
* [689](https://github.com/AcademySoftwareFoundation/openexr/issues/689) I was able to get OpenEXR to install by adding ``-std=c++11`` to the ``extra_compile_flags`` in setup.py, as lgritz and peterhillman suggested. Here's the file with it added:
* [688](https://github.com/AcademySoftwareFoundation/openexr/issues/688) Invalid shift (141647077)
* [687](https://github.com/AcademySoftwareFoundation/openexr/issues/687) ZLIB not found
* [686](https://github.com/AcademySoftwareFoundation/openexr/issues/686) Using the example Chromacity files - issue with chromaticities
@@ -1723,8 +2161,8 @@ This version fixes the following security vulnerabilities:
* [379](https://github.com/AcademySoftwareFoundation/openexr/issues/379) ZLIB_LIBRARY ZLIB_INCLUDE_DIR being ignored (LNK2019 errors) in OpenEXR\IlmImf\IlmImf.vcxproj
* [377](https://github.com/AcademySoftwareFoundation/openexr/issues/377) 2.3.0: test suite is failing
* [364](https://github.com/AcademySoftwareFoundation/openexr/issues/364) Standalone build of openexr on windows - (with already installed ilmbase)
* [363](https://github.com/AcademySoftwareFoundation/openexr/issues/363) `OpenEXRSettings.cmake` is missing from the release tarball
* [362](https://github.com/AcademySoftwareFoundation/openexr/issues/362) Cmake macro `SET_ILMBASE_INCLUDE_DIRS` assumes
* [363](https://github.com/AcademySoftwareFoundation/openexr/issues/363) ``OpenEXRSettings.cmake`` is missing from the release tarball
* [362](https://github.com/AcademySoftwareFoundation/openexr/issues/362) Cmake macro ``SET_ILMBASE_INCLUDE_DIRS`` assumes
* [360](https://github.com/AcademySoftwareFoundation/openexr/issues/360) Specified Boost.Python not found on Boost versions < 1.67
* [359](https://github.com/AcademySoftwareFoundation/openexr/issues/359) [VS2015] Compile error C2782: 'ssize_t' in PyImathFixedMatrix
* [357](https://github.com/AcademySoftwareFoundation/openexr/issues/357) Move ILMBASE_HAVE_CONTROL_REGISTER_SUPPORT to a private header
@@ -1745,7 +2183,7 @@ This version fixes the following security vulnerabilities:
* [282](https://github.com/AcademySoftwareFoundation/openexr/issues/282) IlmBase should link pthread
* [281](https://github.com/AcademySoftwareFoundation/openexr/issues/281) Error in installing OpenEXR
* [276](https://github.com/AcademySoftwareFoundation/openexr/issues/276) The savanah.nongnu.org tar.gz hosting
* [274](https://github.com/AcademySoftwareFoundation/openexr/issues/274) Cmake installation of ilmbase places .dll files under `/lib` instead of `/bin`
* [274](https://github.com/AcademySoftwareFoundation/openexr/issues/274) Cmake installation of ilmbase places .dll files under ``/lib`` instead of ``/bin``
* [271](https://github.com/AcademySoftwareFoundation/openexr/issues/271) heap-buffer-overflow
* [270](https://github.com/AcademySoftwareFoundation/openexr/issues/270) Out of Memory in TileOffsets (73566621)
* [268](https://github.com/AcademySoftwareFoundation/openexr/issues/268) Invalid Shift at FastHufDecoder (72367575)
@@ -1760,8 +2198,8 @@ This version fixes the following security vulnerabilities:
* [257](https://github.com/AcademySoftwareFoundation/openexr/issues/257) Out of Memory / Invalid allocation in lmfArray resizeErase (72828572, 72837441)
* [255](https://github.com/AcademySoftwareFoundation/openexr/issues/255) Process for reporting security bugs
* [254](https://github.com/AcademySoftwareFoundation/openexr/issues/254) [VS 2015] Can't run tests and OpenVDB compile errors
* [253](https://github.com/AcademySoftwareFoundation/openexr/issues/253) C++11-style compile-time type information for `half`.
* [252](https://github.com/AcademySoftwareFoundation/openexr/issues/252) `std::numeric_limits<half>::digits10` value is wrong.
* [253](https://github.com/AcademySoftwareFoundation/openexr/issues/253) C++11-style compile-time type information for ``half``.
* [252](https://github.com/AcademySoftwareFoundation/openexr/issues/252) ``std::numeric_limits<half>::digits10` value is wrong.
* [250](https://github.com/AcademySoftwareFoundation/openexr/issues/250) SO version change in 2.2.1
* [246](https://github.com/AcademySoftwareFoundation/openexr/issues/246) half.h default user-provided constructor breaks c++ semantics (value/zero initialization vs default initialization)
* [244](https://github.com/AcademySoftwareFoundation/openexr/issues/244) Cannot write to Z channel
@@ -1777,7 +2215,7 @@ This version fixes the following security vulnerabilities:
* [224](https://github.com/AcademySoftwareFoundation/openexr/issues/224) Make PyIlmBase compatible with Python 3.x
* [217](https://github.com/AcademySoftwareFoundation/openexr/issues/217) Issue with optimized build compiled with Intel C/C++ compiler (ICC)
* [213](https://github.com/AcademySoftwareFoundation/openexr/issues/213) AddressSanitizer CHECK failed in ImageMagick fuzz test.
* [208](https://github.com/AcademySoftwareFoundation/openexr/issues/208) build issues on OSX: ImfDwaCompressorSimd.h:483:no such instruction: `vmovaps (%rsi), %ymm0'
* [208](https://github.com/AcademySoftwareFoundation/openexr/issues/208) build issues on OSX: ``ImfDwaCompressorSimd.h:483:no such instruction: vmovaps (%rsi), %ymm0``
* [205](https://github.com/AcademySoftwareFoundation/openexr/issues/205) Building with VS 2015
* [202](https://github.com/AcademySoftwareFoundation/openexr/issues/202) Documentation error: File Layout "Verson Field" lists wrong bits
* [199](https://github.com/AcademySoftwareFoundation/openexr/issues/199) Unexpected rpaths on macOS
@@ -2370,7 +2808,7 @@ Signed-off-by: Kimball Thurston <kdt3rd@gmail.com>
* [Remove unused headers](https://github.com/AcademySoftwareFoundation/openexr/commit/db9fcdc9c448a9f0d0da78010492398a394c87e7) ([Grant Kim](@6302240+enpinion@users.noreply.github.com) 2019-06-13)
* [WIN32 to _WIN32 for Compiler portability](https://github.com/AcademySoftwareFoundation/openexr/commit/6e2a73ed8721da899a5bd844397444d5b15a5c71) ([Grant Kim](@6302240+enpinion@users.noreply.github.com) 2019-06-11) https://docs.microsoft.com/en-us/cpp/preprocessor/predefined-macros?view=vs-2019
* [WIN32 to _WIN32 for Compiler portability](https://github.com/AcademySoftwareFoundation/openexr/commit/6e2a73ed8721da899a5bd844397444d5b15a5c71) ([Grant Kim](@6302240+enpinion@users.noreply.github.com) 2019-06-11) https://docs.microsoft.com/en-us/cpp/preprocessor/predefined-macros?view=vs-2019
_WIN32 is the standard according to the official documentation from Microsoft and also this fixes MinGW compile error.
* [Update README.md](https://github.com/AcademySoftwareFoundation/openexr/commit/45e9910be6009ac4ddf4db51c3c505daafc942a3) ([Huibean Luo](@huibean.luo@gmail.com) 2019-04-08)
@@ -2832,7 +3270,7 @@ Signed-off-by: Kimball Thurston <kdt3rd@gmail.com>
* [CHANGES.md](https://github.com/AcademySoftwareFoundation/openexr/commit/471d7bd1c558c54ecc3cbbb2a65932f1e448a370) ([Cary Phillips](@cary@ilm.com), 2018-08-07)
* [OpenEXR_Viewers/README.md formatting](https://github.com/AcademySoftwareFoundation/openexr/commit/806db743cf0bcb7710d08f56ee6f2ece10e31367) ([Cary Phillips](@cary@ilm.com), 2018-08-07)
* [OpenEXR_Viewers/README.md formatting](https://github.com/AcademySoftwareFoundation/openexr/commit/806db743cf0bcb7710d08f56ee6f2ece10e31367) ([Cary Phillips](@cary@ilm.com), 2018-08-07)
* [more README fixes.](https://github.com/AcademySoftwareFoundation/openexr/commit/82bc701e605e092ae5f31d142450d921c293ded1) ([Cary Phillips](@cary@ilm.com), 2018-08-07)
@@ -3377,11 +3815,11 @@ This release addresses the following security vulnerabilities:
### Detailed Changes:
* Added support for targetting builds on 64bit Windows and minimising
* Added support for targeting builds on 64bit Windows and minimising
number of compiler warnings on Windows. Thanks to Ger Hobbelt for
his contributions to CreateDLL. (Ji Hun Yu)
* Added new atttribute types (Florian Kainz):
* Added new attribute types (Florian Kainz):
* **M33dAttribute** 3x3 double-precision matrix
* **M44dAttribute** 4x4 double-precision matrix
* **V2d** 2D double-precision vector
@@ -3722,7 +4160,7 @@ Here's a summary of the changes since version 1.2.2:
* Support for building universal binaries on OS X 10.4. (Drew Hess,
Paul Schneider)
* Minor configure.ac fix to accomodate OS X's automake. (Drew Hess)
* Minor configure.ac fix to accommodate OS X's automake. (Drew Hess)
* Removed CPU-specific optimizations from configure.ac, autoconf's
guess at the CPU type isn't very useful, anyway. Closes
@@ -3754,7 +4192,7 @@ Hess)
header file, which is included by any OpenEXR source files that need
these macros. This method of specifying **HAVE_** macros guarantees
that projects will get the proper settings without needing to add
compile- time flags to accomodate OpenEXR. Note that this isn't
compile- time flags to accommodate OpenEXR. Note that this isn't
implemented properly for Windows yet. (Drew Hess)
* Platform cleanups:
@@ -3857,7 +4295,7 @@ This is a relatively minor update to the project, with the following changes:
(Drew Hess)
* Some older versions of gcc don't support a full iomanip
implemenation; check for this during configuration.
implementation; check for this during configuration.
(Drew Hess)
* Install PDF versions of documentation, remove old/out-of-date
@@ -3901,7 +4339,7 @@ This is a relatively minor update to the project, with the following changes:
horizontally and vertically (image is surrounded by black /
outermost row of pixels repeats / entire image repeats /
entire image repeats, every other copy is a mirror image).
exrdisplay: added option to swap the top and botton half,
exrdisplay: added option to swap the top and bottom half,
and the left and right half of an image, so that the image's
four corners end up in the center. This is useful for checking
the seams of wrap-around texture map images.
@@ -4374,7 +4812,7 @@ the source code.
compile- and link-time flags.
* exrdisplay uses Imath::Math<T>::pow instead of powf now.
powf is not availble on all platforms.
powf is not available on all platforms.
* Roll OS X "hack" into the source until Apple fixes their
istream implementation.
+36 -27
View File
@@ -19,35 +19,32 @@ endif()
# configuration files
#######################################
project(OpenEXR VERSION 3.2.0 LANGUAGES C CXX)
file(READ "src/lib/OpenEXRCore/openexr_version.h" VERSION_H)
string(REGEX MATCH "VERSION_MAJOR ([0-9]*)" _ ${VERSION_H})
set(OPENEXR_VERSION_MAJOR ${CMAKE_MATCH_1})
string(REGEX MATCH "VERSION_MINOR ([0-9]*)" _ ${VERSION_H})
set(OPENEXR_VERSION_MINOR ${CMAKE_MATCH_1})
string(REGEX MATCH "VERSION_PATCH ([0-9]*)" _ ${VERSION_H})
set(OPENEXR_VERSION_PATCH ${CMAKE_MATCH_1})
set(OPENEXR_VERSION_RELEASE_TYPE "-dev" CACHE STRING "Extra version tag string for OpenEXR build, such as -dev, -beta1, etc.")
project(OpenEXR VERSION ${OPENEXR_VERSION_MAJOR}.${OPENEXR_VERSION_MINOR}.${OPENEXR_VERSION_PATCH} LANGUAGES C CXX)
set(OPENEXR_VERSION_RELEASE_TYPE "" CACHE STRING "Extra version tag string for OpenEXR build, such as -dev, -beta1, etc.")
set(OPENEXR_VERSION ${OpenEXR_VERSION})
set(OPENEXR_VERSION_API "${OpenEXR_VERSION_MAJOR}_${OpenEXR_VERSION_MINOR}")
# Library/shared-object version using libtool versioning policy.
# See https://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html
# The SOVERSION (i.e. numerical component of SONAME) tracks the ABI
# version. Increment this number whenever, and only when, the ABI changes in
# non-backwards-compatible ways.
#
# Library API version (CMake's library VERSION attribute) is of the
# form CURRENT.REVISION.AGE; the CMake SOVERSION attribute corresponds
# to just CURRENT. These produce a .so and a symlink symlink, e.g.:
# libOpenEXR-3_1.so.29 -> libOpenEXR-3_1.so.29.0.0
# ^ ^ ^ ^
# | | | |
# CURRENT | | AGE
# | REVISION
# CURRENT
# When updating:
# 1. no API change: CURRENT.REVISION+1.AGE
# 2. API added: CURRENT+1.0.AGE+1
# 3. API changed: CURRENT+1.0.0
#
set(OPENEXR_LIBTOOL_CURRENT 29)
set(OPENEXR_LIBTOOL_REVISION 0)
set(OPENEXR_LIBTOOL_AGE 0)
set(OPENEXR_LIB_VERSION "${OPENEXR_LIBTOOL_CURRENT}.${OPENEXR_LIBTOOL_REVISION}.${OPENEXR_LIBTOOL_AGE}")
set(OPENEXR_LIB_SOVERSION ${OPENEXR_LIBTOOL_CURRENT})
# The OpenEXR project policy is to append the library version
# "major.minor.patch" to the SONAME to form the real shared library name.
# For example, in "libOpenEXR.so.31.3.2.0", "libOpenEXR.so.31" is the SONAME
# and ".3.2.0" identifies the corresponding library release.
set(OPENEXR_LIB_SOVERSION 31)
set(OPENEXR_LIB_VERSION "${OPENEXR_LIB_SOVERSION}.${OPENEXR_VERSION}") # e.g. "31.3.2.0"
option(OPENEXR_INSTALL "Install OpenEXR libraries" ON)
option(OPENEXR_INSTALL_TOOLS "Install OpenEXR tools" ON)
@@ -58,7 +55,6 @@ endif()
include(cmake/LibraryDefine.cmake)
include(cmake/OpenEXRSetup.cmake)
add_subdirectory(cmake)
message(STATUS "Configure ${OPENEXR_PACKAGE_NAME}, library API version: ${OPENEXR_LIB_VERSION}")
# Hint: This can be set to enable custom find_package
@@ -126,9 +122,22 @@ if(NOT OPENEXR_IS_SUBPROJECT)
include(cmake/clang-format.cmake)
endif()
option(BUILD_DOCS "Set ON to build html documentation")
if (BUILD_DOCS AND NOT OPENEXR_IS_SUBPROJECT)
option(INSTALL_DOCS "Set ON to install html documentation" ON)
option(OPENEXR_INSTALL_DOCS "Set ON to install tool manpages")
if (OPENEXR_INSTALL_DOCS AND NOT OPENEXR_IS_SUBPROJECT)
add_subdirectory(docs)
endif()
option(BUILD_WEBSITE "Set ON to build website source")
if (BUILD_WEBSITE AND NOT OPENEXR_IS_SUBPROJECT)
add_subdirectory(website)
endif()
if (NOT OPENEXR_IS_SUBPROJECT)
# Even if not building the website, still make sure the website example code compiles.
add_subdirectory(website/src)
endif()
option(OPENEXR_BUILD_PYTHON "Set ON to build python bindings")
if (OPENEXR_BUILD_PYTHON AND NOT OPENEXR_IS_SUBPROJECT)
add_subdirectory(src/wrappers/python)
endif()
+291 -10
View File
@@ -11,7 +11,8 @@ explains our contribution process and procedures:
* [Development Workflow](#Development-Workflow)
* [Coding Style](#Coding-Style)
* [Versioning Policy](#Versioning-Policy)
* [Creating a Release](#Creating-a-Release)
* [Creating a Patch Release](#Creating-a-Patch-Release)
* [Creating a Major/Minor Release](#Creating-a-Major/Minor-Release)
For a description of the roles and responsibilities of the various
members of the OpenEXR community, see [GOVERNANCE](GOVERNANCE.md), and
@@ -258,7 +259,7 @@ submitted, in order to solicit feedback, try to get as much consensus
as possible, and alert all the stakeholders to be on the lookout for
the eventual PR when it appears.
* Trivial changes that don't affect functionality (typos, docs, tests)
* Trivial changes that don't affect functionality (typos, tests, website)
can be approved by the committer without review, after waiting at
least 48 hours.
@@ -452,19 +453,299 @@ each version with three numbers: ``major.minor.patch``, where:
* ``minor`` - indicates functionality added in a backwards-compatible manner
* ``patch`` - indicates backwards-compatible bug fixes
## Creating a Release
## Creating a Patch Release
Making a patch release typically involves merging changes from the
main branch into the release branch, since all development generally
takes place on the main branch. The usual workflow is to group these
changes together and merge them all just prior to a release, rather
than merging one-by-one as the changes go into main, although merging
along the way is acceptable as well. For OpenEXR and Imath, a patch
release typically involves under a dozen commits, so it's not a huge
amount of work to organize them all at once.
A patch release *must* be ABI-compatible with preceding minor releases
and should be validated with an ABI-checker tool such as
[``abipkgdiff``](https://manpages.ubuntu.com/manpages/lunar/en/man1/abipkgdiff.1.html).
These instructions are for project administrators who have "push"
access on the GitHub repo.
The preferred workflow is:
1. Make a PR that merges appropriate changes from the main branch to
the release branch:
a. In a forked clone, create a branch to hold the patch commits,
e.g. ``v3.1.9-fixes``.
b. Cherry-pick the appropriate commits from ``main``, resolving any
merge conflicts.
c. Increment ``OPENEXR_VERSION_PATCH`` in
[src/lib/OpenEXRCore/openexr_version.h](src/lib/OpenEXRCore/openexr_version.h)
d. Update the ``IMATH_TAG`` setting in
[cmake/OpenEXRSetup.cmake](cmake/OpenEXRSetup.cmake) to
correspond to the proper Imath release.
e. Add release notes to [CHANGES.md](CHANGES.md):
- Generate a list of links to merged pull requests.
Use ``git log`` to identify the merged commits, and for each
commit, and add a link in the notes to the corresponding PR
that merged it to ``main``. Citing PR's in the release notes
is preferable to citing raw commits because the PR's often
have helpful information and discussion missing from the
commit descriptions, and the commit history is readily
accessible via ``git log`` anyway.
The typical OpenEXR project workflow uses "squash and merge"
to merge PR's into ``main``, so the changes involved in each
PR end up on ``main`` as a single commit. This is preferable
because a raw PR often includes numerous commits that address
comments and feedback or fix typos or mistakes, intermediate
steps not helpful to the preserved history of the main
development thread. Note that GitHub's "squash and merge"
helpfully appends the PR number to the commit subject line.
Note that when this PR is merged to the release branch, it
should go in via "rebase and merge" that the release branch
retains the granular changes, described below.
- Generate a list of OSS-Fuzz issues addressed.
These are security concerns, so they deserve special
attention. Provide a link in the notes to the issue at
https://bugs.chromium.org/p/oss-fuzz, including the issue id
number and description.
- If there are any public CVE's, mention them explicitly with a
link to the CVE registry item.
- Provide an executive summary of the patch changes, in a few
sentences as well as bullet points if appropriate.
- Choose a proposed release date at least several days in
advance.
f. If there are any public CVE's, reference them in
[SECURITY.md](SECURITY.md).
g. Submit the PR for others to review. The PR should go *to the
release branch, not ``main``*, obviously.
h. After others have had a chance to sanity-check the changes,
merge the PR *with "rebase and merge"*. Unlike with the usual
PR's merged to main, it is essential to retain the individual
commits on the release branch. That way, the release branch
commit history retains the details of the changes.
i. If further fixes come in that need to go into the release, push
them to the PR branch. It's not absolutely essential that all
changes to the release branch go in via a PR. The PR is simply a
convient forum for publicly discussing and reviewing the
composition of the release.
2. Tag the release with a ``-rc`` "release candidate" tag,
e.g. ``v3.1.9-rc``.
3. Validate ABI compatibility. Build at the release candidate tag and
run
[abipkgdiff](https://manpages.ubuntu.com/manpages/lunar/en/man1/abipkgdiff.1.html)
against a build of the previous patch release to confirm that no
ABI changes have leaked in. Additions to the ABI are acceptable for
a patch release, but there should be no symbol changes and no
symbols removed. If there are, back up and fix them before proceeding.
4. Send mail to ``openexr-dev@lists.aswf.io`` announcing the staging
of the release with link to the release candidate tag. Include the
release notes from [CHANGES.md](CHANGES.md) for review.
5. Draft the release on the GitHub
[Releases](https://github.com/AcademySoftwareFoundation/openexr/releases)
page. Include the summary from the notes in
[CHANGES.md](CHANGES.md), but don't include the list of PR's.
Create the release from the latest ``--rc`` tag, and give it a name
that begins with ``v``, i.e. ``v3.1.9``.
Save the release as a "draft".
6. Wait at least 48 hours, to give the community time to discover and
report any obvious problems. Avoid the temptation to rush changes
into a release and publish it immediately, as that is uncomfortably
error prone.
If additional fixes need to go in before release:
a. Merge commits to the release branch. Push them directly, no need
for a pull request.
b. Update the release notes in a separate commit.
c. Re-tag with a incremented "release candidate" number,
e.g. ``v3.1.9-rc2``.
d. Send an email update to ``openexr-dev@lists.aswf.io`` notifying
the community of the addition and the new tag.
7. Publish the release
a. Click the "Publish release" button on the GitHub release draft
b. Send an email to ``openexr-dev@lists.aswf.io`` officially
annoucing the release.
8. Update the ``release`` branch, which should always point to the
most recent patch of the most recent minor release, i.e. the most
preferred release.
From a clone of the main repo:
% git checkout release
% git merge RB-3.1
% git push
9. Submit a PR that adds the release notes to [CHANGES.md](CHANGES.md)
on the main branch. Cherry-pick the release notes commit from
the release branch.
- If any changes have gone into [SECURITY.md](SECURITY), cherry-pick
the associated commit as well.
- Also include in this PR edits to [``docs/news.rst``](docs/news.rst)
that add an announcment of the release.
10. After review/merge of the updates to ``docs/news.rst``, build the
website at https://readthedocs.org/projects/openexr.
11. If the release has resolved any OSS-Fuzz issues, update the
associated pages at https://bugs.chromium.org/p/oss-fuzz with a
reference to the release.
12. If the release has resolved any public CVE's, request an update
from the registry service providing the release and a link to the
release notes.
## Creating a Major/Minor Release
A major/minor release is created from the main branch, assuming there
are no changes on ``main`` that should *not* go into the release. We
don't generally allow experimental changes onto ``main``. Anything
accepted onto ``main`` should be intended for the next release.
The overall workflow is similar to a patch release, as described
above, but it's simpler because there is no cherry-picking and merging
of commits. The major/minor release is simply a snapshot of ``main``.
To create a new release from the ``main`` branch:
1. Update the release notes in ``CHANGES.md``.
1. Confirm that the ``OPENEXR_VERSION_MAJOR``,
``OPENEXR_VERSION_MINOR``, and ``OPENEXR_VERSION_PATCH`` value in
[src/lib/OpenEXRCore/openexr_version.h](src/lib/OpenEXRCore/openexr_version.h)
are correct. The OpenEXR project policy is that the values on the
main branch, which is the bleeding edge of development, correspond
to the next minor release, with the patch set to 0.
Write a high-level summary of the features and
improvements. Include the summary in ``CHANGES.md`` and also in the
Release comments.
2. Update the release notes in [CHANGES.md](CHANGES.md):
Include the log of all PR's included beyond the previous release.
- Write a high-level summary of the features and improvements.
2. Create a new release on the GitHub Releases page.
- Include the log of all PR's that have *not* been merged into the
previous minor release.
3. Tag the release with name beginning with ``v``', e.g. ``v2.3.0``.
- Mention any OSS-Fuzz issues. Provide a link in the notes to the issue at
https://bugs.chromium.org/p/oss-fuzz, including the issue id
number and description.
- If there are any public CVE's, mention them explicitly with a
link to the CVE registry item.
- Submit this change as a separate PR.
3. Add a mention of the release to [``docs/news.rst``](docs/news.rst)
- Submit this change as a separate PR.
4. Increment the ``OPENEXR_LIB_SOVERSION`` setting in [CMakeLists.txt](CMakeLists.txt).
- The SO version increases whenever, and only when, the ABI changes
in non-backwards-compatible ways. Consistent with the semantic
versioning policy, this usually happens at major and minor
releases, but never on a patch release.
- Submit this change as a separate PR for review.
5. Once the above PR's are merged, create the release branch with the
``RB`` prefix, e.g. ``RB-3.2``.
6. Update the ``IMATH_TAG`` setting in
[cmake/OpenEXRSetup.cmake](cmake/OpenEXRSetup.cmake) to correspond
to the proper Imath release.
7. Tag the release with a ``-rc`` "release candidate" tag,
e.g. ``v3.2.0-rc``.
8. Send mail to ``openexr-dev@lists.aswf.io`` announcing the staging
of the release with link to the release candidate tag. Include the
release notes from [CHANGES.md](CHANGES.md) for review.
9. If additonal fixes need to go in before release:
a. Merge commits to the release branch. Push them directly, no need
for a pull request.
b. Update the release notes in a separate commit.
c. Re-tag with a incremented "release candidate" number,
e.g. ``v3.2.0-rc2``.
d. Send a email update to ``openexr-dev@lists.aswf.io`` notifying
the community of the addition.
10. Draft the release on the GitHub
[Releases](https://github.com/AcademySoftwareFoundation/openexr/releases)
page. Include the summary from the notes in
[CHANGES.md](CHANGES.md), but don't include the list of PR's.
- Create the release from the latest ``--rc`` tag, and give it a name
that begins with ``v`` and ends in ``0``, e.g. ``v3.2.0``.
- Save the release as a "draft".
11. Wait at least 48 hours after the email announcement.
12. Publish the release
a. Click the "Publish release" button on the GitHub release draft
b. Send an email to ``openexr-dev@lists.aswf.io`` officially
annoucing the release.
13. Update the ``release`` branch, which should always point to the
most recent release.
From a clone of the main repo:
% git checkout release
% git merge RB-3.1
% git push
14. Increment ``OPENEXR_VERSION_MINOR`` in
[src/lib/OpenEXRCore/openexr_version.h](src/lib/OpenEXRCore/openexr_version.h) on the main branch
- Submit a PR for this. This leaves the release version on the
main branch pointing to the next minor release, as described in
Step #1.
15. Build the website at https://readthedocs.org/projects/openexr.
16. If the release has resolved any OSS-Fuzz issues, update the
associated pages at https://bugs.chromium.org/p/oss-fuzz with a
reference to the release.
17. If the release has resolved any public CVE's, request an update
from the registry service providing the release and a link to the
release notes.
+1 -1
View File
@@ -51,7 +51,7 @@ namespace PxDeep
//-*****************************************************************************
// DENSITY
//-*****************************************************************************
// "Density" refers to the the optical density which, when integrated
// "Density" refers to the optical density which, when integrated
// through a line, produces an alpha. The relationship between alpha, density,
// and line segment of a given length "dz" is as follows:
//
+9
View File
@@ -0,0 +1,9 @@
module(
name = "openexr",
version = "0.0.0", # The version "0.0.0" is set here and will be patched within the Bazel Central Registry
compatibility_level = 1,
)
bazel_dep(name = "bazel_skylib", version = "1.4.2")
bazel_dep(name = "imath", version = "3.1.9")
bazel_dep(name = "libdeflate", version = "1.18")
+1 -1
View File
@@ -52,7 +52,7 @@ package.
OpenEXR is a project of the [Academy Software
Foundation](https://www.aswf.io). See the project's [governance
policies](GOVERNANCE.md), [contribution guidelines](CONTRIBzuTING.md), and [code of conduct](CODE_OF_CONDUCT)
policies](GOVERNANCE.md), [contribution guidelines](CONTRIBUTING.md), and [code of conduct](CODE_OF_CONDUCT)
for more information.
# Quick Start
+1 -1
View File
@@ -6,7 +6,7 @@
## Reporting a Vulnerability
If you think you've found a potential vulnerability in OpenEXR, please
report it by emailing security@openexr.org. Only Technical Steering
report it by emailing security@openexr.com. Only Technical Steering
Committee members and Academy Software Foundation project management
have access to these messages. Include detailed steps to reproduce the
issue, and any other information that could aid an investigation. Our
+3
View File
@@ -1,3 +1,6 @@
# SPDX-License-Identifier: BSD-3-Clause
# Copyright Contributors to the OpenEXR Project.
workspace(name = "com_openexr")
load("//:bazel/third_party/openexr_deps.bzl", "openexr_deps")
-8
View File
@@ -1,8 +0,0 @@
# SPDX-License-Identifier: BSD-3-Clause
# Copyright (c) Contributors to the OpenEXR Project.
cc_binary(
name = "Demo",
srcs = ["main.cpp"],
deps = ["//:OpenEXR"],
)
-61
View File
@@ -1,61 +0,0 @@
#include <ImfRgba.h>
#include <ImfRgbaFile.h>
#include <string>
// Function copied (with minor modifications) from pbrt-v3 (https://github.com/mmp/pbrt-v3) which is under BSD-2-Clause License
static void
WriteImageEXR (
const std::string& name,
const float* pixels,
int xRes,
int yRes,
int totalXRes,
int totalYRes,
int xOffset,
int yOffset)
{
using namespace Imf;
using namespace Imath;
Rgba* hrgba = new Rgba[xRes * yRes];
for (int i = 0; i < xRes * yRes; ++i)
hrgba[i] = Rgba (pixels[3 * i], pixels[3 * i + 1], pixels[3 * i + 2]);
// OpenEXR uses inclusive pixel bounds.
Box2i displayWindow (V2i (0, 0), V2i (totalXRes - 1, totalYRes - 1));
Box2i dataWindow (
V2i (xOffset, yOffset), V2i (xOffset + xRes - 1, yOffset + yRes - 1));
try
{
RgbaOutputFile file (
name.c_str (), displayWindow, dataWindow, WRITE_RGB);
file.setFrameBuffer (hrgba - xOffset - yOffset * xRes, 1, xRes);
file.writePixels (yRes);
}
catch (const std::exception& exc)
{
throw std::runtime_error ("Error writing");
}
delete[] hrgba;
}
int
main ()
{
float data[3 * 100 * 100];
for (int y = 0; y < 100; ++y)
for (int x = 0; x < 100; ++x)
{
data[(y * 100 + x) * 3 + 0] = 0.f;
data[(y * 100 + x) * 3 + 1] = 1.f;
data[(y * 100 + x) * 3 + 2] = 0.f;
}
WriteImageEXR ("test.exr", data, 100, 100, 100, 100, 0, 0);
return 0;
}
+6 -6
View File
@@ -8,14 +8,14 @@ expand_template(
out = "src/Imath/ImathConfig.h",
substitutions = {
"@IMATH_INTERNAL_NAMESPACE@": "Imath_3_1",
"@IMATH_LIB_VERSION@": "3.1.7",
"@IMATH_LIB_VERSION@": "3.1.9",
"@IMATH_NAMESPACE_CUSTOM@": "0",
"@IMATH_NAMESPACE@": "Imath",
"@IMATH_PACKAGE_NAME@": "Imath 3.1.7",
"@IMATH_VERSION_MAJOR@": "3",
"@IMATH_VERSION_MINOR@": "1",
"@IMATH_VERSION_PATCH@": "7",
"@IMATH_VERSION@": "3.1.7",
"@IMATH_PACKAGE_NAME@": "Imath 3.1.9",
"@Imath_VERSION_MAJOR@": "3",
"@Imath_VERSION_MINOR@": "1",
"@Imath_VERSION_PATCH@": "9",
"@IMATH_VERSION@": "3.1.9",
"#cmakedefine IMATH_HALF_USE_LOOKUP_TABLE": "#define IMATH_HALF_USE_LOOKUP_TABLE",
"#cmakedefine IMATH_ENABLE_API_VISIBILITY": "#define IMATH_ENABLE_API_VISIBILITY",
"#cmakedefine IMATH_HAVE_LARGE_STACK": "/* #undef IMATH_HAVE_LARGE_STACK */",
+55
View File
@@ -0,0 +1,55 @@
# SPDX-License-Identifier: BSD-3-Clause
# Copyright (c) Contributors to the OpenEXR Project.
cc_library(
name = "deflate",
srcs = [
"common_defs.h",
"lib/adler32.c",
"lib/adler32_vec_template.h",
"lib/arm/adler32_impl.h",
"lib/arm/cpu_features.c",
"lib/arm/cpu_features.h",
"lib/arm/crc32_impl.h",
"lib/arm/crc32_pmull_helpers.h",
"lib/arm/crc32_pmull_wide.h",
"lib/arm/matchfinder_impl.h",
"lib/bt_matchfinder.h",
"lib/cpu_features_common.h",
"lib/crc32.c",
"lib/crc32_multipliers.h",
"lib/crc32_tables.h",
"lib/decompress_template.h",
"lib/deflate_compress.c",
"lib/deflate_compress.h",
"lib/deflate_constants.h",
"lib/deflate_decompress.c",
"lib/gzip_compress.c",
"lib/gzip_constants.h",
"lib/gzip_decompress.c",
"lib/hc_matchfinder.h",
"lib/ht_matchfinder.h",
"lib/lib_common.h",
"lib/matchfinder_common.h",
"lib/utils.c",
"lib/x86/adler32_impl.h",
"lib/x86/cpu_features.c",
"lib/x86/cpu_features.h",
"lib/x86/crc32_impl.h",
"lib/x86/crc32_pclmul_template.h",
"lib/x86/decompress_impl.h",
"lib/x86/matchfinder_impl.h",
"lib/zlib_compress.c",
"lib/zlib_constants.h",
"lib/zlib_decompress.c",
],
hdrs = ["libdeflate.h"],
includes = ["."],
visibility = ["//visibility:public"],
)
alias(
name = "libdeflate",
actual = ":deflate",
visibility = ["//visibility:public"],
)
+14 -16
View File
@@ -7,34 +7,32 @@ load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
load("@bazel_tools//tools/build_defs/repo:utils.bzl", "maybe")
def openexr_deps():
"""Fetches dependencies (zlib and Imath) of OpenEXR and Skylib for header generation."""
"""Fetches dependencies (libdeflate and Imath) of OpenEXR and Skylib for header generation."""
maybe(
http_archive,
name = "net_zlib_zlib",
build_file = "@com_openexr//:bazel/third_party/zlib.BUILD",
sha256 = "b3a24de97a8fdbc835b9833169501030b8977031bcb54b3b3ac13740f846ab30",
strip_prefix = "zlib-1.2.13",
urls = [
"https://mirror.bazel.build/zlib.net/zlib-1.2.13.tar.gz",
"https://zlib.net/zlib-1.2.13.tar.gz",
],
name = "libdeflate",
build_file = "@com_openexr//:bazel/third_party/libdeflate.BUILD",
sha256 = "225d982bcaf553221c76726358d2ea139bb34913180b20823c782cede060affd",
strip_prefix = "libdeflate-1.18",
urls = ["https://github.com/ebiggers/libdeflate/archive/refs/tags/v1.18.tar.gz"],
)
maybe(
http_archive,
name = "Imath",
build_file = "@com_openexr//:bazel/third_party/Imath.BUILD",
strip_prefix = "Imath-3.1.7",
sha256 = "bff1fa140f4af0e7f02c6cb78d41b9a7d5508e6bcdfda3a583e35460eb6d4b47",
urls = ["https://github.com/AcademySoftwareFoundation/Imath/archive/refs/tags/v3.1.7.tar.gz"],
strip_prefix = "Imath-3.1.9",
sha256 = "f1d8aacd46afed958babfced3190d2d3c8209b66da451f556abd6da94c165cf3",
urls = ["https://github.com/AcademySoftwareFoundation/Imath/archive/refs/tags/v3.1.9.tar.gz"],
)
http_archive(
maybe(
http_archive,
name = "bazel_skylib",
sha256 = "b8a1527901774180afc798aeb28c4634bdccf19c4d98e7bdd1ce79d1fe9aaad7",
sha256 = "66ffd9315665bfaafc96b52278f57c7e2dd09f5ede279ea6d39b2be471e7e3aa",
urls = [
"https://mirror.bazel.build/github.com/bazelbuild/bazel-skylib/releases/download/1.4.1/bazel-skylib-1.4.1.tar.gz",
"https://github.com/bazelbuild/bazel-skylib/releases/download/1.4.1/bazel-skylib-1.4.1.tar.gz",
"https://mirror.bazel.build/github.com/bazelbuild/bazel-skylib/releases/download/1.4.2/bazel-skylib-1.4.2.tar.gz",
"https://github.com/bazelbuild/bazel-skylib/releases/download/1.4.2/bazel-skylib-1.4.2.tar.gz",
],
)
-98
View File
@@ -1,98 +0,0 @@
# Copied from https://github.com/protocolbuffers/protobuf/blob/master/third_party/zlib.BUILD
# Copyright 2008 Google Inc. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above
# copyright notice, this list of conditions and the following disclaimer
# in the documentation and/or other materials provided with the
# distribution.
# * Neither the name of Google Inc. nor the names of its
# contributors may be used to endorse or promote products derived from
# this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
# Code generated by the Protocol Buffer compiler is owned by the owner
# of the input file used when generating it. This code is not
# standalone and requires a support library to be linked with it. This
# support library is itself covered by the above license.
load("@rules_cc//cc:defs.bzl", "cc_library")
licenses(["notice"]) # BSD/MIT-like license (for zlib)
_ZLIB_HEADERS = [
"crc32.h",
"deflate.h",
"gzguts.h",
"inffast.h",
"inffixed.h",
"inflate.h",
"inftrees.h",
"trees.h",
"zconf.h",
"zlib.h",
"zutil.h",
]
_ZLIB_PREFIXED_HEADERS = ["zlib/include/" + hdr for hdr in _ZLIB_HEADERS]
# In order to limit the damage from the `includes` propagation
# via `:zlib`, copy the public headers to a subdirectory and
# expose those.
genrule(
name = "copy_public_headers",
srcs = _ZLIB_HEADERS,
outs = _ZLIB_PREFIXED_HEADERS,
cmd = "cp $(SRCS) $(@D)/zlib/include/",
)
cc_library(
name = "zlib",
srcs = [
"adler32.c",
"compress.c",
"crc32.c",
"deflate.c",
"gzclose.c",
"gzlib.c",
"gzread.c",
"gzwrite.c",
"infback.c",
"inffast.c",
"inflate.c",
"inftrees.c",
"trees.c",
"uncompr.c",
"zutil.c",
# Include the un-prefixed headers in srcs to work
# around the fact that zlib isn't consistent in its
# choice of <> or "" delimiter when including itself.
] + _ZLIB_HEADERS,
hdrs = _ZLIB_PREFIXED_HEADERS,
copts = select({
"@bazel_tools//src/conditions:windows": [],
"//conditions:default": [
"-Wno-unused-variable",
"-Wno-implicit-function-declaration",
],
}),
includes = ["zlib/include/"],
visibility = ["//visibility:public"],
)
+2 -3
View File
@@ -71,6 +71,8 @@ endif()
configure_file(OpenEXRConfig.h.in ${CMAKE_CURRENT_BINARY_DIR}/OpenEXRConfig.h)
configure_file(OpenEXRConfigInternal.h.in ${CMAKE_CURRENT_BINARY_DIR}/OpenEXRConfigInternal.h)
# make a temp copy in the binary dir for OpenEXRConfig.h to include
configure_file(../src/lib/OpenEXRCore/openexr_version.h ${CMAKE_CURRENT_BINARY_DIR}/OpenEXRCore/openexr_version.h COPYONLY)
if(OPENEXR_INSTALL)
install(
@@ -209,9 +211,6 @@ if(OPENEXR_INSTALL_PKG_CONFIG)
endif()
set(exr_pthread_libs ${CMAKE_THREAD_LIBS_INIT})
endif()
if(NOT zlib_INTERNAL_DIR)
set(zlib_link "-lz")
endif()
string(REPLACE ".in" "" pcout ${pcinfile})
configure_file(${pcinfile} ${CMAKE_CURRENT_BINARY_DIR}/${pcout} @ONLY)
install(
+3
View File
@@ -27,6 +27,9 @@ function(OPENEXR_DEFINE_LIBRARY libname)
PRIVATE cxx_std_${OPENEXR_CXX_STANDARD}
INTERFACE cxx_std_11 )
# we are embedding libdeflate
target_include_directories(${objlib} PRIVATE ${EXR_DEFLATE_INCLUDE_DIR})
if(OPENEXR_CURLIB_PRIV_EXPORT AND BUILD_SHARED_LIBS)
target_compile_definitions(${objlib} PRIVATE ${OPENEXR_CURLIB_PRIV_EXPORT})
if(WIN32)
+1 -1
View File
@@ -17,4 +17,4 @@ Version: @OPENEXR_VERSION@
Libs: @exr_pthread_libs@ -L${libdir} -lOpenEXR${libsuffix} -lOpenEXRUtil${libsuffix} -lOpenEXRCore${libsuffix} -lIex${libsuffix} -lIlmThread${libsuffix}
Cflags: -I${includedir} -I${OpenEXR_includedir} @exr_pthread_cflags@
Requires: Imath
Libs.private: @zlib_link@
-1
View File
@@ -12,7 +12,6 @@ if (openexr_needthreads)
endif()
unset(openexr_needthreads)
find_dependency(ZLIB REQUIRED)
find_dependency(Imath REQUIRED)
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake")
+15 -4
View File
@@ -8,6 +8,20 @@
#pragma once
//
// The OpenEXR release version is defined officially in
// src/lib/OpenEXRCore/openexr_version.h, but CMake doesn't readily allow
// that to be included here, so duplicate the settings for
// backwards-compatibility with applications that may expect to get the
// defines from this include.
//
#ifndef INCLUDED_OPENEXR_VERSION_H
#define OPENEXR_VERSION_MAJOR @OpenEXR_VERSION_MAJOR@
#define OPENEXR_VERSION_MINOR @OpenEXR_VERSION_MINOR@
#define OPENEXR_VERSION_PATCH @OpenEXR_VERSION_PATCH@
#endif
//
// Options / configuration based on O.S. / compiler
/////////////////////
@@ -45,9 +59,6 @@
#define OPENEXR_VERSION_STRING "@OPENEXR_VERSION@"
#define OPENEXR_PACKAGE_STRING "@OPENEXR_PACKAGE_NAME@"
#define OPENEXR_VERSION_MAJOR @OpenEXR_VERSION_MAJOR@
#define OPENEXR_VERSION_MINOR @OpenEXR_VERSION_MINOR@
#define OPENEXR_VERSION_PATCH @OpenEXR_VERSION_PATCH@
#define OPENEXR_VERSION_RELEASE_TYPE "@OPENEXR_VERSION_RELEASE_TYPE@"
// Deprecated, for back compatibility:
#define OPENEXR_VERSION_EXTRA "@OPENEXR_VERSION_RELEASE_TYPE@"
@@ -74,7 +85,7 @@
/// \defgroup ExportMacros Macros to manage symbol visibility
///
/// See docs/SymbolVisibility.md for more discussion about the
/// See website/SymbolVisibility.rst for more discussion about the
/// motivation for these macros
///
/// If we are compiling a DLL for Windows, there needs to be custom
+59 -92
View File
@@ -157,100 +157,67 @@ if(OPENEXR_ENABLE_THREADING)
endif()
endif()
option(OPENEXR_FORCE_INTERNAL_ZLIB "Force using an internal zlib" OFF)
if (NOT OPENEXR_FORCE_INTERNAL_ZLIB)
if(NOT TARGET ZLIB::ZLIB)
find_package(ZLIB QUIET)
endif()
option(OPENEXR_FORCE_INTERNAL_DEFLATE "Force using an internal libdeflate" OFF)
set(OPENEXR_DEFLATE_REPO "https://github.com/ebiggers/libdeflate.git" CACHE STRING "Repo path for libdeflate source")
set(OPENEXR_DEFLATE_TAG "v1.18" CACHE STRING "Tag to use for libdeflate source repo (defaults to primary if empty)")
if(NOT OPENEXR_FORCE_INTERNAL_DEFLATE)
#TODO: ^^ Release should not clone from main, this is a place holder
set(CMAKE_IGNORE_PATH "${CMAKE_CURRENT_BINARY_DIR}/_deps/deflate-src/config;${CMAKE_CURRENT_BINARY_DIR}/_deps/deflate-build/config")
include(FindPkgConfig)
pkg_check_modules(deflate IMPORTED_TARGET GLOBAL libdeflate)
set(CMAKE_IGNORE_PATH)
endif()
if(OPENEXR_FORCE_INTERNAL_ZLIB OR NOT TARGET ZLIB::ZLIB)
set(zlib_VER "1.2.11")
if(OPENEXR_FORCE_INTERNAL_ZLIB)
message(STATUS "Compiling internal copy of zlib version ${zlib_VER}")
if(NOT TARGET PkgConfig::deflate AND NOT deflate_FOUND)
if(OPENEXR_FORCE_INTERNAL_DEFLATE)
message(STATUS "libdeflate forced internal, installing from ${OPENEXR_DEFLATE_REPO} (${OPENEXR_DEFLATE_TAG})")
else()
message(STATUS "zlib library not found, compiling ${zlib_VER}")
message(STATUS "libdeflate was not found, installing from ${OPENEXR_DEFLATE_REPO} (${OPENEXR_DEFLATE_TAG})")
endif()
# Unfortunately, zlib has an ancient cmake setup which does not include
# modern cmake exports, so we can't use the faster / more integrated
# FetchContent as we do for Imath below. There may be a way, but
# external project is just as easy
include(ExternalProject)
set(cmake_cc_arg)
if (CMAKE_CROSSCOMPILING)
set(cmake_cc_arg -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE})
endif ()
if(NOT (APPLE OR WIN32) AND NOT OPENEXR_FORCE_INTERNAL_ZLIB)
set(zlib_INTERNAL_DIR "${CMAKE_INSTALL_PREFIX}" CACHE PATH "zlib install dir")
else()
set(zlib_INTERNAL_DIR "${CMAKE_BINARY_DIR}/zlib-install" CACHE PATH "zlib install dir")
endif()
# Need to set byproducts so ninja generator knows where the targets come from
ExternalProject_Add(zlib_external
GIT_REPOSITORY "https://github.com/madler/zlib.git"
include(FetchContent)
FetchContent_Declare(Deflate
GIT_REPOSITORY "${OPENEXR_DEFLATE_REPO}"
GIT_TAG "${OPENEXR_DEFLATE_TAG}"
GIT_SHALLOW ON
GIT_TAG "v${zlib_VER}"
UPDATE_COMMAND ""
SOURCE_DIR zlib-src
BINARY_DIR zlib-build
INSTALL_DIR ${zlib_INTERNAL_DIR}
BUILD_BYPRODUCTS
"${zlib_INTERNAL_DIR}/lib/${CMAKE_SHARED_LIBRARY_PREFIX}z${CMAKE_SHARED_LIBRARY_SUFFIX}"
"${zlib_INTERNAL_DIR}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}z${CMAKE_STATIC_LIBRARY_SUFFIX}"
CMAKE_ARGS
-D CMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
-D CMAKE_POSITION_INDEPENDENT_CODE=ON
-D CMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
-D CMAKE_GENERATOR:STRING=${CMAKE_GENERATOR}
${cmake_cc_arg}
)
file(MAKE_DIRECTORY "${zlib_INTERNAL_DIR}")
file(MAKE_DIRECTORY "${zlib_INTERNAL_DIR}/include")
file(MAKE_DIRECTORY "${zlib_INTERNAL_DIR}/lib")
if(WIN32)
set(zliblibname "zlib")
set(zlibstaticlibname "zlibstatic")
else()
set(zliblibname "z")
set(zlibstaticlibname "z")
endif()
if(MSVC)
set(zlibpostfix "d")
endif()
add_library(zlib_static STATIC IMPORTED GLOBAL)
add_dependencies(zlib_static zlib_external)
set_property(TARGET zlib_static PROPERTY
IMPORTED_LOCATION "${zlib_INTERNAL_DIR}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}${zlibstaticlibname}${CMAKE_STATIC_LIBRARY_SUFFIX}"
)
set_property(TARGET zlib_static PROPERTY
IMPORTED_LOCATION_DEBUG "${zlib_INTERNAL_DIR}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}${zlibstaticlibname}${zlibpostfix}${CMAKE_STATIC_LIBRARY_SUFFIX}"
)
target_include_directories(zlib_static INTERFACE "${zlib_INTERNAL_DIR}/include")
if(NOT (APPLE OR WIN32) AND BUILD_SHARED_LIBS AND NOT OPENEXR_FORCE_INTERNAL_ZLIB)
add_library(zlib_shared SHARED IMPORTED GLOBAL)
add_dependencies(zlib_shared zlib_external)
set_property(TARGET zlib_shared PROPERTY
IMPORTED_LOCATION "${zlib_INTERNAL_DIR}/lib/${CMAKE_SHARED_LIBRARY_PREFIX}${zliblibname}${CMAKE_SHARED_LIBRARY_SUFFIX}"
)
set_property(TARGET zlib_static PROPERTY
IMPORTED_LOCATION_DEBUG "${zlib_INTERNAL_DIR}/lib/${CMAKE_SHARED_LIBRARY_PREFIX}${zliblibname}${zlibpostfix}${CMAKE_SHARED_LIBRARY_SUFFIX}"
)
target_include_directories(zlib_shared INTERFACE "${zlib_INTERNAL_DIR}/include")
FetchContent_GetProperties(Deflate)
if(NOT Deflate_POPULATED)
FetchContent_Populate(Deflate)
endif()
if(NOT (APPLE OR WIN32) AND BUILD_SHARED_LIBS AND NOT OPENEXR_FORCE_INTERNAL_ZLIB)
add_library(ZLIB::ZLIB ALIAS zlib_shared)
else()
add_library(ZLIB::ZLIB ALIAS zlib_static)
endif()
# Rather than actually compile something, just embed the sources
# into exrcore. This could in theory cause issues when compiling as
# a static library into another application which also uses
# libdeflate but we switch the export symbol to hidden which should
# hide the symbols when linking...
set(EXR_DEFLATE_SOURCES
lib/arm/cpu_features.c
lib/x86/cpu_features.c
lib/utils.c
lib/deflate_compress.c
lib/deflate_decompress.c
lib/adler32.c
lib/zlib_compress.c
lib/zlib_decompress.c)
# don't need these
# lib/crc32.c
# lib/gzip_compress.c
# lib/gzip_decompress.c
file(READ ${deflate_SOURCE_DIR}/lib/lib_common.h DEFLATE_HIDE)
string(REPLACE "visibility(\"default\")" "visibility(\"hidden\")" DEFLATE_HIDE "${DEFLATE_HIDE}")
string(REPLACE "__declspec(dllexport)" "/**/" DEFLATE_HIDE "${DEFLATE_HIDE}")
file(WRITE ${deflate_SOURCE_DIR}/lib/lib_common.h "${DEFLATE_HIDE}")
# cmake makes fetch content name lowercase for the properties (to deflate)
list(TRANSFORM EXR_DEFLATE_SOURCES PREPEND ${deflate_SOURCE_DIR}/)
set(EXR_DEFLATE_INCLUDE_DIR ${deflate_SOURCE_DIR})
set(EXR_DEFLATE_LIB)
else()
set(EXR_DEFLATE_INCLUDE_DIR)
set(EXR_DEFLATE_LIB PkgConfig::deflate)
set(EXR_DEFLATE_SOURCES)
endif()
#######################################
@@ -259,9 +226,9 @@ endif()
option(OPENEXR_FORCE_INTERNAL_IMATH "Force using an internal imath" OFF)
# Check to see if Imath is installed outside of the current build directory.
set(IMATH_REPO "https://github.com/AcademySoftwareFoundation/Imath.git" CACHE STRING
set(OPENEXR_IMATH_REPO "https://github.com/AcademySoftwareFoundation/Imath.git" CACHE STRING
"Repo for auto-build of Imath")
set(IMATH_TAG "main" CACHE STRING
set(OPENEXR_IMATH_TAG "v3.1.9" CACHE STRING
"Tag for auto-build of Imath (branch, tag, or SHA)")
if(NOT OPENEXR_FORCE_INTERNAL_IMATH)
#TODO: ^^ Release should not clone from main, this is a place holder
@@ -272,14 +239,14 @@ endif()
if(NOT TARGET Imath::Imath AND NOT Imath_FOUND)
if(OPENEXR_FORCE_INTERNAL_IMATH)
message(STATUS "Imath forced internal, installing from ${IMATH_REPO} (${IMATH_TAG})")
message(STATUS "Imath forced internal, installing from ${OPENEXR_IMATH_REPO} (${OPENEXR_IMATH_TAG})")
else()
message(STATUS "Imath was not found, installing from ${IMATH_REPO} (${IMATH_TAG})")
message(STATUS "Imath was not found, installing from ${OPENEXR_IMATH_REPO} (${OPENEXR_IMATH_TAG})")
endif()
include(FetchContent)
FetchContent_Declare(Imath
GIT_REPOSITORY ${IMATH_REPO}
GIT_TAG ${IMATH_TAG}
GIT_REPOSITORY "${OPENEXR_IMATH_REPO}"
GIT_TAG "${OPENEXR_IMATH_TAG}"
GIT_SHALLOW ON
)
+42 -34
View File
@@ -3,50 +3,58 @@
set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH})
find_package(Doxygen REQUIRED)
find_package(Sphinx REQUIRED)
# man pages for the bin programs
include(FindPythonPackage)
find_python_package(sphinx-press-theme REQUIRED)
find_program(HELP2MAN help2man)
set(DOXYGEN_INPUT_DIR ${PROJECT_SOURCE_DIR}/src/lib/OpenEXRCore)
set(DOXYGEN_OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/doxygen)
set(DOXYGEN_INDEX_FILE ${DOXYGEN_OUTPUT_DIR}/html/index.html)
set(DOXYFILE_IN ${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in)
set(DOXYFILE_OUT ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile)
set(MANPAGE_OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/man)
file(MAKE_DIRECTORY ${MANPAGE_OUTPUT_DIR}/man1)
set(SPHINX_SOURCE ${CMAKE_CURRENT_SOURCE_DIR})
set(SPHINX_BUILD ${CMAKE_CURRENT_BINARY_DIR}/sphinx)
set(SPHINX_INDEX_FILE ${SPHINX_BUILD}/index.html)
message(STATUS "MANPAGE_OUTPUT_DIR=${MANPAGE_OUTPUT_DIR}")
message(STATUS "CMAKE_INSTALL_MANDIR=${CMAKE_INSTALL_MANDIR}")
set(SPHINX_OPTS "-W" CACHE STRING "Sphinx build options")
set(manpage_files "")
configure_file(${DOXYFILE_IN} ${DOXYFILE_OUT} @ONLY)
function(DEFINE_MANPAGE tool description)
file(MAKE_DIRECTORY ${DOXYGEN_OUTPUT_DIR})
set(manpage_file ${MANPAGE_OUTPUT_DIR}/man1/${tool}.1)
set(manpage_files "${manpage_files};${manpage_file}" PARENT_SCOPE)
add_custom_command(OUTPUT ${DOXYGEN_INDEX_FILE}
COMMAND ${DOXYGEN_EXECUTABLE} ${DOXYFILE_OUT}
MAIN_DEPENDENCY ${DOXYFILE_OUT} ${DOXYFILE_IN}
COMMENT "Running doxygen"
VERBATIM)
add_custom_command(OUTPUT ${SPHINX_INDEX_FILE}
COMMAND
${SPHINX_EXECUTABLE} -b html ${SPHINX_OPTS}
# Tell Breathe where to find the Doxygen output
-Dbreathe_projects.OpenEXR=${DOXYGEN_OUTPUT_DIR}/xml
${SPHINX_SOURCE} ${SPHINX_BUILD}
add_custom_command(OUTPUT ${manpage_file}
COMMAND
${HELP2MAN} -n ${description} --output=${manpage_file} -N
${CMAKE_CURRENT_BINARY_DIR}/../bin/${tool}
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
DEPENDS ${DOXYGEN_INDEX_FILE}
MAIN_DEPENDENCY conf.py
COMMENT "Generating documentation with Sphinx")
DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/../bin/${tool}
COMMENT "Generating man page for ${tool}"
VERBATIM)
endfunction()
add_custom_target(docs ALL DEPENDS ${SPHINX_INDEX_FILE} ${DOXYGEN_INDEX_FILE})
# Provide help2man a useful single-line program description. There's
# no especially good way to embed this in the program's --help text so
# that help2man can detect it.
define_manpage(exr2aces "convert exr images to ACES format")
define_manpage(exrcheck "validate exr files")
define_manpage(exrenvmap "convert exr image environment maps")
define_manpage(exrheader "print exr image header metadata")
define_manpage(exrinfo "print exr image header metadata")
define_manpage(exrmakepreview "generate exr preview thumbnail images")
define_manpage(exrmaketiled "convert exr images to tiled format")
define_manpage(exrmultipart "combine or split multipart exr images")
define_manpage(exrmultiview "convert between single/multi-view exr images")
define_manpage(exrstdattr "set exr image metadata")
add_custom_target(docs ALL DEPENDS
${manpage_files})
# Add a target to install the manpages
# Add an install target to install the docs
if(INSTALL_DOCS)
include(GNUInstallDirs)
install(DIRECTORY ${SPHINX_BUILD}
DESTINATION ${CMAKE_INSTALL_DOCDIR})
install(DIRECTORY ${MANPAGE_OUTPUT_DIR}/man1 DESTINATION ${CMAKE_INSTALL_MANDIR})
endif()
# build the example code to verify that it compiles
-199
View File
@@ -1,199 +0,0 @@
..
SPDX-License-Identifier: BSD-3-Clause
Copyright Contributors to the OpenEXR Project.
Standard Optional Attributes
############################
.. toctree::
:caption: Standard Optional Attributes
By default, OpenEXR files have the following attributes:
**chromaticities**
For RGB images, specifies the CIE (x,y) chromaticities of the
primaries and the white point.
**whiteLuminance**
For RGB images, defines the luminance, in Nits (candelas per square
meter) of the RGB value (1.0, 1.0, 1.0).
If the chromaticities and the whiteLuminance of an RGB image are
known, then it is possible to convert the image's pixels from RGB to
CIE XYZ tristimulus values.
**adoptedNeutral**
Specifies the CIE (x,y) coordinates that should be considered
neutral during color rendering. Pixels in the image file whose
(x,y) coordinates match the adoptedNeutral value should be mapped to
neutral values on the display.
**renderingTransform**, lookModTransform
Specify the names of the CTL functions that implements the intended
color rendering and look modification transforms for this image.
**xDensity**
Horizontal output density, in pixels per inch. The image's vertical
output density is xDensity * pixelAspectRatio.
**owner**
Name of the owner of the image.
**comments**
Additional image information in human-readable form, for example a
verbal description of the image.
**capDate**
The date when the image was created or captured, in local time, and
formatted as ``YYYY:MM:DD hh:mm:ss``, where ``YYYY`` is the year (4
digits, e.g. 2003), ``MM`` is the month (2 digits, 01, 02, ... 12),
``DD`` is the day of the month (2 digits, 01, 02, ... 31), hh is the
hour (2 digits, 00, 01, ... 23), mm is the minute, and ss is the
second (2 digits, 00, 01, ... 59).
**utcOffset**
Universal Coordinated Time (UTC), in seconds: UTC == local time +
utcOffset
**longitude**, **latitude**, **altitude**
For images of real objects, the location where the image was
recorded. Longitude and latitude are in degrees east of Greenwich
and north of the equator. Altitude is in meters above sea level.
For example, Kathmandu, Nepal is at longitude 85.317, latitude
27.717, altitude 1305.
**focus**
The camera's focus distance, in meters.
**exposure**
Exposure time, in seconds.
**aperture**
The camera's lens aperture, in f-stops (focal length of the lens
divided by the diameter of the iris opening).
**isoSpeed**
The ISO speed of the film or image sensor that was used to record
the image.
**envmap**
If this attribute is present, the image represents an environment
map. The attribute's value defines how 3D directions are mapped to
2D pixel locations.
**keyCode**
For motion picture film frames. Identifies film manufacturer, film
type, film roll and frame position within the roll.
**timeCode**
Time and control code
**wrapmodes**
Determines how texture map images are extrapolated. If an OpenEXR
file is used as a texture map for 3D rendering, texture coordinates
(0.0, 0.0) and (1.0, 1.0) correspond to the upper left and lower
right corners of the data window. If the image is mapped onto a
surface with texture coordinates outside the zero-to-one range, then
the image must be extrapolated. This attribute tells the renderer
how to do this extrapolation. The attribute contains either a pair
of comma-separated keywords, to specify separate extrapolation modes
for the horizontal and vertical directions; or a single keyword, to
specify extrapolation in both directions (e.g. "clamp,periodic" or
"clamp"). Extra white space surrounding the keywords is allowed,
but should be ignored by the renderer ("clamp, black " is equivalent
to "clamp,black"). The keywords listed below are predefined; some
renderers may support additional extrapolation modes:
**black**
pixels outside the zero-to-one range are black
**clamp**
texture coordinates less than 0.0 and greater than 1.0 are clamped
to 0.0 and 1.0 respectively.
**periodic**
the texture image repeats periodically
**mirror**
the texture image repeats periodically, but every other instance
is mirrored
**framesPerSecond**
Defines the nominal playback frame rate for image sequences, in
frames per second. Every image in a sequence should have a
framesPerSecond attribute, and the attribute value should be the
same for all images in the sequence. If an image sequence has no
framesPerSecond attribute, playback software should assume that the
frame rate for the sequence is 24 frames per second.
In order to allow exact representation of NTSC frame and field
rates, framesPerSecond is stored as a rational number. A rational
number is a pair of integers, n and d, that represents the value
n/d.
**multiView**
Defines the view names for multi-view image files. A multi-view
image contains two or more views of the same scene, as seen from
different viewpoints, for example a left-eye and a right-eye view
for stereo displays. The multiView attribute lists the names of the
views in an image, and a naming convention identifies the channels
that belong to each view.
**worldToCamera**
For images generated by 3D computer graphics rendering, a matrix
that transforms 3D points from the world to the camera coordinate
space of the renderer.
The camera coordinate space is left-handed. Its origin indicates
the location of the camera. The positive x and y axes correspond to
the "right" and "up" directions in the rendered image. The positive
z axis indicates the camera's viewing direction. (Objects in front
of the camera have positive z coordinates.)
Camera coordinate space in OpenEXR is the same as in Pixar's
Renderman.
**worldToNDC**
For images generated by 3D computer graphics rendering, a matrix
that transforms 3D points from the world to the Normalized Device
Coordinate (NDC) space of the renderer.
NDC is a 2D coordinate space that corresponds to the image plane,
with positive x and pointing to the right and y positive pointing
down. The coordinates (0, 0) and (1, 1) correspond to the upper
left and lower right corners of the OpenEXR display window.
To transform a 3D point in word space into a 2D point in NDC space,
multiply the 3D point by the worldToNDC matrix and discard the z
coordinate.
NDC space in OpenEXR is the same as in Pixar's Renderman.
**deepImageState**
Specifies whether the pixels in a deep image are sorted and
non-overlapping.
Note: this attribute can be set by application code that writes a
file in order to tell applications that read the file whether the
pixel data must be cleaned up prior to image processing operations
such as flattening. The OpenEXR library does not verify that the
attribute is consistent with the actual state of the pixels.
Application software may assume that the attribute is valid, as long
as the software will not crash or lock up if any pixels are
inconsistent with the deepImageState attribute.
**originalDataWindow**
If application software crops an image, then it should save the data
window of the original, un-cropped image in the originalDataWindow
attribute.
**dwaCompressionLevel**
Sets the quality level for images compressed with the DWAA or DWAB
method.
**ID Manifest**
ID manifest.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 158 KiB

-154
View File
@@ -1,154 +0,0 @@
#FIG 3.2
Landscape
Center
Metric
A4
60.00
Single
-2
1200 2
0 32 #d3d3d3
6 11025 900 17775 12150
6 13275 900 16650 12150
2 2 0 3 0 7 48 -1 -1 0.000 0 0 -1 0 0 5
13500 1125 15300 1125 15300 2925 13500 2925 13500 1125
2 1 0 3 0 7 48 -1 -1 0.000 0 0 -1 0 0 2
13950 2025 14850 2025
2 1 0 3 0 7 48 -1 -1 0.000 0 0 -1 0 0 2
14400 1575 14400 2475
2 2 0 3 0 7 48 -1 -1 0.000 0 0 -1 0 0 5
13500 2925 15300 2925 15300 4725 13500 4725 13500 2925
2 1 0 3 0 7 48 -1 -1 0.000 0 0 -1 0 0 2
13950 3825 14850 3825
2 1 0 3 0 7 48 -1 -1 0.000 0 0 -1 0 0 2
14400 3375 14400 4275
2 2 0 3 0 7 48 -1 -1 0.000 0 0 -1 0 0 5
13500 4725 15300 4725 15300 6525 13500 6525 13500 4725
2 1 0 3 0 7 48 -1 -1 0.000 0 0 -1 0 0 2
13950 5625 14850 5625
2 1 0 3 0 7 48 -1 -1 0.000 0 0 -1 0 0 2
14400 5175 14400 6075
2 2 0 3 0 7 48 -1 -1 0.000 0 0 -1 0 0 5
13500 6525 15300 6525 15300 8325 13500 8325 13500 6525
2 1 0 3 0 7 48 -1 -1 0.000 0 0 -1 0 0 2
13950 7425 14850 7425
2 1 0 3 0 7 48 -1 -1 0.000 0 0 -1 0 0 2
14400 6975 14400 7875
2 2 0 3 0 7 48 -1 -1 0.000 0 0 -1 0 0 5
13500 8325 15300 8325 15300 10125 13500 10125 13500 8325
2 1 0 3 0 7 48 -1 -1 0.000 0 0 -1 0 0 2
13950 9225 14850 9225
2 1 0 3 0 7 48 -1 -1 0.000 0 0 -1 0 0 2
14400 8775 14400 9675
2 2 0 3 0 7 48 -1 -1 0.000 0 0 -1 0 0 5
13500 10125 15300 10125 15300 11925 13500 11925 13500 10125
2 1 0 3 0 7 48 -1 -1 0.000 0 0 -1 0 0 2
13950 11025 14850 11025
2 1 0 3 0 7 48 -1 -1 0.000 0 0 -1 0 0 2
14400 10575 14400 11475
4 1 0 48 -1 22 18 0.0000 4 195 135 15075 2115 Z\001
4 1 0 48 -1 22 18 0.0000 4 195 150 14400 1440 Y\001
4 0 0 48 -1 22 18 0.0000 4 195 780 15750 2115 +X face\001
4 1 0 48 -1 22 18 0.0000 4 195 150 14400 3240 Y\001
4 1 0 48 -1 22 18 0.0000 4 195 135 13770 3915 Z\001
4 1 0 48 -1 22 18 0.0000 4 195 150 14400 8640 Y\001
4 1 0 48 -1 22 18 0.0000 4 195 150 14400 10440 Y\001
4 1 0 48 -1 22 18 0.0000 4 180 120 13725 1440 3\001
4 1 0 48 -1 22 18 0.0000 4 180 120 15075 1440 7\001
4 1 0 48 -1 22 18 0.0000 4 195 120 13725 2790 1\001
4 1 0 48 -1 22 18 0.0000 4 180 120 15075 2790 5\001
4 1 0 48 -1 22 18 0.0000 4 180 120 13725 3240 6\001
4 1 0 48 -1 22 18 0.0000 4 180 120 15075 3240 2\001
4 1 0 48 -1 22 18 0.0000 4 195 120 13725 4590 4\001
4 1 0 48 -1 22 18 0.0000 4 180 120 15075 4590 0\001
4 1 0 48 -1 22 18 0.0000 4 180 120 13725 5040 6\001
4 1 0 48 -1 22 18 0.0000 4 180 120 15075 5040 7\001
4 1 0 48 -1 22 18 0.0000 4 180 120 13725 6390 2\001
4 1 0 48 -1 22 18 0.0000 4 180 120 15075 6390 3\001
4 1 0 48 -1 22 18 0.0000 4 180 120 13725 6840 0\001
4 1 0 48 -1 22 18 0.0000 4 195 120 15075 6840 1\001
4 1 0 48 -1 22 18 0.0000 4 195 120 13725 8190 4\001
4 1 0 48 -1 22 18 0.0000 4 180 120 15075 8190 5\001
4 1 0 48 -1 22 18 0.0000 4 180 120 13725 8640 7\001
4 1 0 48 -1 22 18 0.0000 4 180 120 15075 8640 6\001
4 1 0 48 -1 22 18 0.0000 4 180 120 13725 9990 5\001
4 1 0 48 -1 22 18 0.0000 4 195 120 15075 9990 4\001
4 1 0 48 -1 22 18 0.0000 4 180 120 13725 10440 2\001
4 1 0 48 -1 22 18 0.0000 4 180 120 15075 10440 3\001
4 1 0 48 -1 22 18 0.0000 4 180 120 13725 11790 0\001
4 1 0 48 -1 22 18 0.0000 4 195 120 15075 11790 1\001
4 0 0 48 -1 22 18 0.0000 4 195 720 15750 3915 -X face\001
4 0 0 48 -1 22 18 0.0000 4 195 780 15750 5715 +Y face\001
4 0 0 48 -1 22 18 0.0000 4 195 720 15750 7515 -Y face\001
4 0 0 48 -1 22 18 0.0000 4 195 765 15750 9315 +Z face\001
4 0 0 48 -1 22 18 0.0000 4 195 705 15750 11115 -Z face\001
4 1 0 48 -1 22 18 0.0000 4 195 135 14400 5040 Z\001
4 1 0 48 -1 22 18 0.0000 4 195 150 15075 5715 X\001
4 1 0 48 -1 22 18 0.0000 4 195 150 15075 7515 X\001
4 1 0 48 -1 22 18 0.0000 4 195 135 14400 8190 Z\001
4 1 0 48 -1 22 18 0.0000 4 195 150 13770 9315 X\001
4 1 0 48 -1 22 18 0.0000 4 195 150 15075 11115 X\001
-6
2 1 0 1 0 7 48 -1 -1 0.000 0 0 -1 1 0 2
1 1 1.00 60.00 120.00
15750 11925 15390 11925
4 0 0 48 -1 22 18 0.0000 4 195 1785 15885 12015 dataWindow.max\001
4 2 0 48 -1 22 18 0.0000 4 195 1740 12915 1215 dataWindow.min\001
-6
2 1 0 3 32 7 49 -1 -1 0.000 0 0 -1 0 0 2
8329 6919 10269 6919
2 1 0 3 32 7 49 -1 -1 0.000 0 0 -1 0 0 2
8323 6905 8323 4972
2 2 0 3 0 7 48 -1 -1 0.000 0 0 -1 0 0 5
5403 5406 9443 5406 9443 9446 5403 9446 5403 5406
2 1 0 3 0 7 48 -1 -1 0.000 0 0 -1 0 0 2
5409 5406 7335 4618
2 1 0 3 0 7 48 -1 -1 0.000 0 0 -1 0 0 2
9449 9452 11029 8319
2 1 0 3 0 7 48 -1 -1 0.000 0 0 -1 0 0 3
7329 4619 11023 4619 11023 8319
2 1 0 3 0 7 48 -1 -1 0.000 0 0 -1 0 0 2
9449 5406 11029 4612
2 1 0 3 0 7 46 -1 -1 0.000 0 0 -1 1 0 2
1 1 3.00 180.00 360.00
7428 7417 6515 7924
2 1 0 3 0 7 46 -1 -1 0.000 0 0 -1 1 0 2
1 1 3.00 180.00 360.00
8323 4992 8323 3059
2 1 0 3 0 7 46 -1 -1 0.000 0 0 -1 1 0 2
1 1 3.00 180.00 360.00
10262 6919 12202 6919
2 1 0 3 32 7 52 -1 -1 0.000 0 0 -1 0 0 3
7323 4619 7323 8326 11029 8326
2 1 0 3 32 7 52 -1 -1 0.000 0 0 -1 0 0 2
5403 9452 7316 8326
2 1 0 9 7 7 47 -1 -1 0.000 0 0 -1 0 0 2
7139 7578 7629 7328
2 1 0 3 32 7 46 -1 -1 0.000 0 0 -1 0 0 2
8345 6917 7432 7424
2 1 0 9 7 7 47 -1 -1 0.000 0 0 -1 0 0 2
10800 6930 11250 6930
2 1 0 9 7 7 47 -1 -1 0.000 0 0 -1 0 0 2
8325 4815 8325 4410
2 1 0 9 7 7 49 -1 -1 0.000 0 0 -1 0 0 2
7065 5400 7515 5400
2 1 0 9 7 7 49 -1 -1 0.000 0 0 -1 0 0 2
9450 8145 9450 8595
2 1 0 9 7 7 49 -1 -1 0.000 0 0 -1 0 0 2
8100 5400 8550 5400
2 1 0 9 7 7 49 -1 -1 0.000 0 0 -1 0 0 2
9450 6750 9450 7200
2 1 0 1 0 7 48 -1 -1 0.000 0 0 -1 1 0 2
1 1 1.00 60.00 120.00
13050 1125 13410 1125
4 1 0 48 -1 22 18 0.0000 4 195 150 8325 2817 Y\001
4 1 0 48 -1 22 18 0.0000 4 195 120 5400 9810 4\001
4 1 0 48 -1 22 18 0.0000 4 180 120 9450 9810 5\001
4 1 0 48 -1 22 18 0.0000 4 180 120 7335 4410 2\001
4 1 0 48 -1 22 18 0.0000 4 180 120 11025 4410 3\001
4 1 0 48 -1 22 18 0.0000 4 180 120 9450 5220 7\001
4 1 0 48 -1 22 18 0.0000 4 180 120 5400 5220 6\001
4 1 0 48 -1 22 18 0.0000 4 180 120 7335 8685 0\001
4 1 0 48 -1 22 18 0.0000 4 195 120 11025 8685 1\001
4 1 0 48 -1 22 18 0.0000 4 195 135 6255 8190 Z\001
4 1 0 48 -1 22 18 0.0000 4 195 150 12510 7020 X\001
-973
View File
@@ -1,973 +0,0 @@
#FIG 3.2
Landscape
Center
Metric
A4
80.00
Single
-2
1200 2
0 32 #d0d0d0
6 3330 6480 4140 7020
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 3375 6525 45 45 3375 6525 3375 6570
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 3375 6750 45 45 3375 6750 3375 6795
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 3375 6975 45 45 3375 6975 3375 7020
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 3600 6525 45 45 3600 6525 3600 6570
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 3600 6750 45 45 3600 6750 3600 6795
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 3600 6975 45 45 3600 6975 3600 7020
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 3825 6525 45 45 3825 6525 3825 6570
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 3825 6750 45 45 3825 6750 3825 6795
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 3825 6975 45 45 3825 6975 3825 7020
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 4050 6525 45 45 4050 6525 4050 6570
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 4050 6750 45 45 4050 6750 4050 6795
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 4050 6975 45 45 4050 6975 4050 7020
-6
6 3330 8460 4140 9090
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 3375 8550 45 45 3375 8550 3375 8595
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 3375 8775 45 45 3375 8775 3375 8820
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 3375 9000 45 45 3375 9000 3375 9045
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 3600 8550 45 45 3600 8550 3600 8595
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 3600 8775 45 45 3600 8775 3600 8820
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 3600 9000 45 45 3600 9000 3600 9045
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 3825 8550 45 45 3825 8550 3825 8595
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 3825 8775 45 45 3825 8775 3825 8820
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 3825 9000 45 45 3825 9000 3825 9045
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 4050 8550 45 45 4050 8550 4050 8595
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 4050 8775 45 45 4050 8775 4050 8820
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 4050 9000 45 45 4050 9000 4050 9045
-6
6 3240 9090 4140 9810
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 3375 9225 45 45 3375 9225 3375 9270
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 3375 9450 45 45 3375 9450 3375 9495
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 3375 9675 45 45 3375 9675 3375 9720
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 3600 9225 45 45 3600 9225 3600 9270
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 3600 9450 45 45 3600 9450 3600 9495
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 3600 9675 45 45 3600 9675 3600 9720
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 3825 9225 45 45 3825 9225 3825 9270
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 3825 9450 45 45 3825 9450 3825 9495
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 3825 9675 45 45 3825 9675 3825 9720
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 4050 9225 45 45 4050 9225 4050 9270
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 4050 9450 45 45 4050 9450 4050 9495
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 4050 9675 45 45 4050 9675 4050 9720
-6
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 1575 450 45 45 1575 450 1575 495
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 1575 675 45 45 1575 675 1575 720
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 1575 900 45 45 1575 900 1575 945
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 1575 1125 45 45 1575 1125 1575 1170
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 1575 1350 45 45 1575 1350 1575 1395
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 1575 1575 45 45 1575 1575 1575 1620
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 1575 1800 45 45 1575 1800 1575 1845
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 1575 2025 45 45 1575 2025 1575 2070
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 1575 2250 45 45 1575 2250 1575 2295
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 1575 2475 45 45 1575 2475 1575 2520
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 1575 2700 45 45 1575 2700 1575 2745
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 1575 2925 45 45 1575 2925 1575 2970
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 1575 3150 45 45 1575 3150 1575 3195
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 1575 3375 45 45 1575 3375 1575 3420
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 1575 3600 45 45 1575 3600 1575 3645
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 1575 3825 45 45 1575 3825 1575 3870
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 1575 4050 45 45 1575 4050 1575 4095
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 1575 4275 45 45 1575 4275 1575 4320
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 1575 4500 45 45 1575 4500 1575 4545
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 1575 4725 45 45 1575 4725 1575 4770
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 1575 4950 45 45 1575 4950 1575 4995
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 1575 5175 45 45 1575 5175 1575 5220
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 1575 5400 45 45 1575 5400 1575 5445
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 1575 5625 45 45 1575 5625 1575 5670
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 1575 5850 45 45 1575 5850 1575 5895
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 1800 450 45 45 1800 450 1800 495
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 1800 675 45 45 1800 675 1800 720
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 1800 900 45 45 1800 900 1800 945
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 1800 1125 45 45 1800 1125 1800 1170
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 1800 1350 45 45 1800 1350 1800 1395
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 1800 1575 45 45 1800 1575 1800 1620
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 1800 1800 45 45 1800 1800 1800 1845
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 1800 2025 45 45 1800 2025 1800 2070
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 1800 2250 45 45 1800 2250 1800 2295
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 1800 2475 45 45 1800 2475 1800 2520
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 1800 2700 45 45 1800 2700 1800 2745
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 1800 2925 45 45 1800 2925 1800 2970
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 1800 3150 45 45 1800 3150 1800 3195
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 1800 3375 45 45 1800 3375 1800 3420
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 1800 3600 45 45 1800 3600 1800 3645
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 1800 3825 45 45 1800 3825 1800 3870
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 1800 4050 45 45 1800 4050 1800 4095
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 1800 4275 45 45 1800 4275 1800 4320
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 1800 4500 45 45 1800 4500 1800 4545
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 1800 4725 45 45 1800 4725 1800 4770
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 1800 4950 45 45 1800 4950 1800 4995
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 1800 5175 45 45 1800 5175 1800 5220
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 1800 5400 45 45 1800 5400 1800 5445
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 1800 5625 45 45 1800 5625 1800 5670
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 1800 5850 45 45 1800 5850 1800 5895
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2025 450 45 45 2025 450 2025 495
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2025 675 45 45 2025 675 2025 720
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2025 900 45 45 2025 900 2025 945
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2025 1125 45 45 2025 1125 2025 1170
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2025 1350 45 45 2025 1350 2025 1395
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2025 1575 45 45 2025 1575 2025 1620
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2025 1800 45 45 2025 1800 2025 1845
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2025 2025 45 45 2025 2025 2025 2070
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2025 2250 45 45 2025 2250 2025 2295
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2025 2475 45 45 2025 2475 2025 2520
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2025 2700 45 45 2025 2700 2025 2745
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2025 2925 45 45 2025 2925 2025 2970
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2025 3150 45 45 2025 3150 2025 3195
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2025 3375 45 45 2025 3375 2025 3420
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2025 3600 45 45 2025 3600 2025 3645
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2025 3825 45 45 2025 3825 2025 3870
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2025 4050 45 45 2025 4050 2025 4095
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2025 4275 45 45 2025 4275 2025 4320
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2025 4500 45 45 2025 4500 2025 4545
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2025 4725 45 45 2025 4725 2025 4770
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2025 4950 45 45 2025 4950 2025 4995
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2025 5175 45 45 2025 5175 2025 5220
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2025 5400 45 45 2025 5400 2025 5445
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2025 5625 45 45 2025 5625 2025 5670
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2025 5850 45 45 2025 5850 2025 5895
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2250 450 45 45 2250 450 2250 495
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2250 675 45 45 2250 675 2250 720
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2250 900 45 45 2250 900 2250 945
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2250 1125 45 45 2250 1125 2250 1170
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2250 1350 45 45 2250 1350 2250 1395
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2250 1575 45 45 2250 1575 2250 1620
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2250 1800 45 45 2250 1800 2250 1845
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2250 2025 45 45 2250 2025 2250 2070
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2250 2250 45 45 2250 2250 2250 2295
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2250 2475 45 45 2250 2475 2250 2520
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2250 2700 45 45 2250 2700 2250 2745
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2250 2925 45 45 2250 2925 2250 2970
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2250 3150 45 45 2250 3150 2250 3195
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2250 3375 45 45 2250 3375 2250 3420
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2250 3600 45 45 2250 3600 2250 3645
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2250 3825 45 45 2250 3825 2250 3870
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2250 4050 45 45 2250 4050 2250 4095
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2250 4275 45 45 2250 4275 2250 4320
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2250 4500 45 45 2250 4500 2250 4545
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2250 4725 45 45 2250 4725 2250 4770
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2250 4950 45 45 2250 4950 2250 4995
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2250 5175 45 45 2250 5175 2250 5220
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2250 5400 45 45 2250 5400 2250 5445
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2250 5625 45 45 2250 5625 2250 5670
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2250 5850 45 45 2250 5850 2250 5895
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2475 450 45 45 2475 450 2475 495
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2475 675 45 45 2475 675 2475 720
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2475 900 45 45 2475 900 2475 945
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2475 1125 45 45 2475 1125 2475 1170
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2475 1350 45 45 2475 1350 2475 1395
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2475 1575 45 45 2475 1575 2475 1620
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2475 1800 45 45 2475 1800 2475 1845
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2475 5400 45 45 2475 5400 2475 5445
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2475 5625 45 45 2475 5625 2475 5670
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2475 5850 45 45 2475 5850 2475 5895
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2700 450 45 45 2700 450 2700 495
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2700 675 45 45 2700 675 2700 720
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2700 900 45 45 2700 900 2700 945
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2700 1125 45 45 2700 1125 2700 1170
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2700 1350 45 45 2700 1350 2700 1395
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2700 1575 45 45 2700 1575 2700 1620
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2700 1800 45 45 2700 1800 2700 1845
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2700 5400 45 45 2700 5400 2700 5445
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2700 5625 45 45 2700 5625 2700 5670
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2700 5850 45 45 2700 5850 2700 5895
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2925 450 45 45 2925 450 2925 495
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2925 675 45 45 2925 675 2925 720
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2925 900 45 45 2925 900 2925 945
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2925 1125 45 45 2925 1125 2925 1170
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2925 1350 45 45 2925 1350 2925 1395
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2925 1575 45 45 2925 1575 2925 1620
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2925 1800 45 45 2925 1800 2925 1845
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2925 5400 45 45 2925 5400 2925 5445
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2925 5625 45 45 2925 5625 2925 5670
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 2925 5850 45 45 2925 5850 2925 5895
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 3150 450 45 45 3150 450 3150 495
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 3150 675 45 45 3150 675 3150 720
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 3150 900 45 45 3150 900 3150 945
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 3150 1125 45 45 3150 1125 3150 1170
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 3150 1350 45 45 3150 1350 3150 1395
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 3150 1575 45 45 3150 1575 3150 1620
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 3150 1800 45 45 3150 1800 3150 1845
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 3150 5400 45 45 3150 5400 3150 5445
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 3150 5625 45 45 3150 5625 3150 5670
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 3150 5850 45 45 3150 5850 3150 5895
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 3375 450 45 45 3375 450 3375 495
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 3375 675 45 45 3375 675 3375 720
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 3375 900 45 45 3375 900 3375 945
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 3375 1125 45 45 3375 1125 3375 1170
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 3375 1350 45 45 3375 1350 3375 1395
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 3375 1575 45 45 3375 1575 3375 1620
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 3375 1800 45 45 3375 1800 3375 1845
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 3375 5400 45 45 3375 5400 3375 5445
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 3375 5625 45 45 3375 5625 3375 5670
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 3375 5850 45 45 3375 5850 3375 5895
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 3600 450 45 45 3600 450 3600 495
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 3600 675 45 45 3600 675 3600 720
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 3600 900 45 45 3600 900 3600 945
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 3600 1125 45 45 3600 1125 3600 1170
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 3600 1350 45 45 3600 1350 3600 1395
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 3600 1575 45 45 3600 1575 3600 1620
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 3600 1800 45 45 3600 1800 3600 1845
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 3600 5400 45 45 3600 5400 3600 5445
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 3600 5625 45 45 3600 5625 3600 5670
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 3600 5850 45 45 3600 5850 3600 5895
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 3825 450 45 45 3825 450 3825 495
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 3825 675 45 45 3825 675 3825 720
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 3825 1125 45 45 3825 1125 3825 1170
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 3825 1350 45 45 3825 1350 3825 1395
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 3825 1575 45 45 3825 1575 3825 1620
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 3825 1800 45 45 3825 1800 3825 1845
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 3825 5400 45 45 3825 5400 3825 5445
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 3825 5625 45 45 3825 5625 3825 5670
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 3825 5850 45 45 3825 5850 3825 5895
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 4050 450 45 45 4050 450 4050 495
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 4050 675 45 45 4050 675 4050 720
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 4050 900 45 45 4050 900 4050 945
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 4050 5400 45 45 4050 5400 4050 5445
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 4050 5625 45 45 4050 5625 4050 5670
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 4050 5850 45 45 4050 5850 4050 5895
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 4275 450 45 45 4275 450 4275 495
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 4275 675 45 45 4275 675 4275 720
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 4275 900 45 45 4275 900 4275 945
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 4275 5400 45 45 4275 5400 4275 5445
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 4275 5625 45 45 4275 5625 4275 5670
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 4275 5850 45 45 4275 5850 4275 5895
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 4500 450 45 45 4500 450 4500 495
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 4500 675 45 45 4500 675 4500 720
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 4500 900 45 45 4500 900 4500 945
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 4500 5400 45 45 4500 5400 4500 5445
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 4500 5625 45 45 4500 5625 4500 5670
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 4500 5850 45 45 4500 5850 4500 5895
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 4725 450 45 45 4725 450 4725 495
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 4725 675 45 45 4725 675 4725 720
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 4725 900 45 45 4725 900 4725 945
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 4725 5400 45 45 4725 5400 4725 5445
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 4725 5625 45 45 4725 5625 4725 5670
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 4725 5850 45 45 4725 5850 4725 5895
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 4950 450 45 45 4950 450 4950 495
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 4950 675 45 45 4950 675 4950 720
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 4950 900 45 45 4950 900 4950 945
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 5175 450 45 45 5175 450 5175 495
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 5175 675 45 45 5175 675 5175 720
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 5175 900 45 45 5175 900 5175 945
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 5175 5400 45 45 5175 5400 5175 5445
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 5400 450 45 45 5400 450 5400 495
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 5400 675 45 45 5400 675 5400 720
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 5400 900 45 45 5400 900 5400 945
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 5400 5400 45 45 5400 5400 5400 5445
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 5625 450 45 45 5625 450 5625 495
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 5625 675 45 45 5625 675 5625 720
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 5625 900 45 45 5625 900 5625 945
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 5625 5400 45 45 5625 5400 5625 5445
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 5850 450 45 45 5850 450 5850 495
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 5850 675 45 45 5850 675 5850 720
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 5850 900 45 45 5850 900 5850 945
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 5850 5400 45 45 5850 5400 5850 5445
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 5850 5625 45 45 5850 5625 5850 5670
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 5850 5850 45 45 5850 5850 5850 5895
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 6075 450 45 45 6075 450 6075 495
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 6075 675 45 45 6075 675 6075 720
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 6075 900 45 45 6075 900 6075 945
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 6075 5400 45 45 6075 5400 6075 5445
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 6075 5625 45 45 6075 5625 6075 5670
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 6075 5850 45 45 6075 5850 6075 5895
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 6300 450 45 45 6300 450 6300 495
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 6300 675 45 45 6300 675 6300 720
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 6300 900 45 45 6300 900 6300 945
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 6300 5400 45 45 6300 5400 6300 5445
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 6300 5625 45 45 6300 5625 6300 5670
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 6300 5850 45 45 6300 5850 6300 5895
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 6525 450 45 45 6525 450 6525 495
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 6525 675 45 45 6525 675 6525 720
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 6525 900 45 45 6525 900 6525 945
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 6525 5400 45 45 6525 5400 6525 5445
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 6525 5625 45 45 6525 5625 6525 5670
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 6525 5850 45 45 6525 5850 6525 5895
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 6750 450 45 45 6750 450 6750 495
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 6750 675 45 45 6750 675 6750 720
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 6750 900 45 45 6750 900 6750 945
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 6750 5400 45 45 6750 5400 6750 5445
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 6750 5625 45 45 6750 5625 6750 5670
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 6750 5850 45 45 6750 5850 6750 5895
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 6975 450 45 45 6975 450 6975 495
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 6975 675 45 45 6975 675 6975 720
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 6975 900 45 45 6975 900 6975 945
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 6975 5400 45 45 6975 5400 6975 5445
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 6975 5625 45 45 6975 5625 6975 5670
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 6975 5850 45 45 6975 5850 6975 5895
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 7200 450 45 45 7200 450 7200 495
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 7200 675 45 45 7200 675 7200 720
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 7200 900 45 45 7200 900 7200 945
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 7200 5400 45 45 7200 5400 7200 5445
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 7200 5625 45 45 7200 5625 7200 5670
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 7200 5850 45 45 7200 5850 7200 5895
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 7425 450 45 45 7425 450 7425 495
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 7425 675 45 45 7425 675 7425 720
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 7425 900 45 45 7425 900 7425 945
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 7425 5400 45 45 7425 5400 7425 5445
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 7425 5625 45 45 7425 5625 7425 5670
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 7425 5850 45 45 7425 5850 7425 5895
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 7650 450 45 45 7650 450 7650 495
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 7650 675 45 45 7650 675 7650 720
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 7650 900 45 45 7650 900 7650 945
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 7650 5400 45 45 7650 5400 7650 5445
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 7650 5625 45 45 7650 5625 7650 5670
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 7650 5850 45 45 7650 5850 7650 5895
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 7875 450 45 45 7875 450 7875 495
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 7875 675 45 45 7875 675 7875 720
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 7875 900 45 45 7875 900 7875 945
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 7875 4725 45 45 7875 4725 7875 4770
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 7875 4950 45 45 7875 4950 7875 4995
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 7875 5175 45 45 7875 5175 7875 5220
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 7875 5400 45 45 7875 5400 7875 5445
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 7875 5625 45 45 7875 5625 7875 5670
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 7875 5850 45 45 7875 5850 7875 5895
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 8100 450 45 45 8100 450 8100 495
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 8100 675 45 45 8100 675 8100 720
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 8100 900 45 45 8100 900 8100 945
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 8100 4725 45 45 8100 4725 8100 4770
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 8100 4950 45 45 8100 4950 8100 4995
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 8100 5175 45 45 8100 5175 8100 5220
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 8100 5400 45 45 8100 5400 8100 5445
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 8100 5625 45 45 8100 5625 8100 5670
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 8100 5850 45 45 8100 5850 8100 5895
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 8325 450 45 45 8325 450 8325 495
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 8325 675 45 45 8325 675 8325 720
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 8325 900 45 45 8325 900 8325 945
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 8325 4725 45 45 8325 4725 8325 4770
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 8325 4950 45 45 8325 4950 8325 4995
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 8325 5175 45 45 8325 5175 8325 5220
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 8325 5400 45 45 8325 5400 8325 5445
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 8325 5625 45 45 8325 5625 8325 5670
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 8325 5850 45 45 8325 5850 8325 5895
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 8550 450 45 45 8550 450 8550 495
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 8550 675 45 45 8550 675 8550 720
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 8550 900 45 45 8550 900 8550 945
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 8550 4725 45 45 8550 4725 8550 4770
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 8550 4950 45 45 8550 4950 8550 4995
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 8550 5175 45 45 8550 5175 8550 5220
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 8550 5400 45 45 8550 5400 8550 5445
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 8550 5625 45 45 8550 5625 8550 5670
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 8550 5850 45 45 8550 5850 8550 5895
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 8775 450 45 45 8775 450 8775 495
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 8775 675 45 45 8775 675 8775 720
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 8775 900 45 45 8775 900 8775 945
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 8775 1125 45 45 8775 1125 8775 1170
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 8775 1350 45 45 8775 1350 8775 1395
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 8775 1575 45 45 8775 1575 8775 1620
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 8775 1800 45 45 8775 1800 8775 1845
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 8775 2025 45 45 8775 2025 8775 2070
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 8775 2250 45 45 8775 2250 8775 2295
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 8775 2475 45 45 8775 2475 8775 2520
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 8775 2700 45 45 8775 2700 8775 2745
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 8775 2925 45 45 8775 2925 8775 2970
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 8775 3150 45 45 8775 3150 8775 3195
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 8775 3375 45 45 8775 3375 8775 3420
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 8775 3600 45 45 8775 3600 8775 3645
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 8775 3825 45 45 8775 3825 8775 3870
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 8775 4050 45 45 8775 4050 8775 4095
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 8775 4275 45 45 8775 4275 8775 4320
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 8775 4500 45 45 8775 4500 8775 4545
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 8775 4725 45 45 8775 4725 8775 4770
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 8775 4950 45 45 8775 4950 8775 4995
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 8775 5175 45 45 8775 5175 8775 5220
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9000 450 45 45 9000 450 9000 495
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9000 675 45 45 9000 675 9000 720
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9000 900 45 45 9000 900 9000 945
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9000 1125 45 45 9000 1125 9000 1170
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9000 1350 45 45 9000 1350 9000 1395
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9000 1575 45 45 9000 1575 9000 1620
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9000 1800 45 45 9000 1800 9000 1845
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9000 2025 45 45 9000 2025 9000 2070
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9000 2250 45 45 9000 2250 9000 2295
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9000 2475 45 45 9000 2475 9000 2520
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9000 2700 45 45 9000 2700 9000 2745
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9000 2925 45 45 9000 2925 9000 2970
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9000 3150 45 45 9000 3150 9000 3195
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9000 3375 45 45 9000 3375 9000 3420
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9000 3600 45 45 9000 3600 9000 3645
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9000 3825 45 45 9000 3825 9000 3870
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9000 4050 45 45 9000 4050 9000 4095
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9000 4275 45 45 9000 4275 9000 4320
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9000 4500 45 45 9000 4500 9000 4545
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9000 4725 45 45 9000 4725 9000 4770
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9000 4950 45 45 9000 4950 9000 4995
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9000 5175 45 45 9000 5175 9000 5220
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9225 450 45 45 9225 450 9225 495
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9225 675 45 45 9225 675 9225 720
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9225 900 45 45 9225 900 9225 945
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9225 1125 45 45 9225 1125 9225 1170
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9225 1350 45 45 9225 1350 9225 1395
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9225 1575 45 45 9225 1575 9225 1620
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9225 1800 45 45 9225 1800 9225 1845
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9225 2025 45 45 9225 2025 9225 2070
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9225 2250 45 45 9225 2250 9225 2295
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9225 2475 45 45 9225 2475 9225 2520
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9225 2700 45 45 9225 2700 9225 2745
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9225 2925 45 45 9225 2925 9225 2970
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9225 3150 45 45 9225 3150 9225 3195
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9225 3375 45 45 9225 3375 9225 3420
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9225 3600 45 45 9225 3600 9225 3645
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9225 3825 45 45 9225 3825 9225 3870
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9225 4050 45 45 9225 4050 9225 4095
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9225 4275 45 45 9225 4275 9225 4320
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9225 4500 45 45 9225 4500 9225 4545
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9225 4725 45 45 9225 4725 9225 4770
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9225 4950 45 45 9225 4950 9225 4995
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9225 5175 45 45 9225 5175 9225 5220
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9450 450 45 45 9450 450 9450 495
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9450 675 45 45 9450 675 9450 720
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9450 900 45 45 9450 900 9450 945
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9450 1125 45 45 9450 1125 9450 1170
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9450 1350 45 45 9450 1350 9450 1395
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9450 1575 45 45 9450 1575 9450 1620
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9450 1800 45 45 9450 1800 9450 1845
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9450 2025 45 45 9450 2025 9450 2070
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9450 2250 45 45 9450 2250 9450 2295
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9450 2475 45 45 9450 2475 9450 2520
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9450 2700 45 45 9450 2700 9450 2745
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9450 2925 45 45 9450 2925 9450 2970
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9450 3150 45 45 9450 3150 9450 3195
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9450 3375 45 45 9450 3375 9450 3420
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9450 3600 45 45 9450 3600 9450 3645
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9450 3825 45 45 9450 3825 9450 3870
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9450 4050 45 45 9450 4050 9450 4095
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9450 4275 45 45 9450 4275 9450 4320
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9450 4500 45 45 9450 4500 9450 4545
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9450 4725 45 45 9450 4725 9450 4770
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9450 4950 45 45 9450 4950 9450 4995
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9450 5175 45 45 9450 5175 9450 5220
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 3825 900 45 45 3825 900 3825 945
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 2475 2025 45 45 2475 2025 2475 2070
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 2475 2250 45 45 2475 2250 2475 2295
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 2475 2475 45 45 2475 2475 2475 2520
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 2475 2700 45 45 2475 2700 2475 2745
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 2475 2925 45 45 2475 2925 2475 2970
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 2475 3150 45 45 2475 3150 2475 3195
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 2475 3375 45 45 2475 3375 2475 3420
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 2475 3600 45 45 2475 3600 2475 3645
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 2475 3825 45 45 2475 3825 2475 3870
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 2475 4050 45 45 2475 4050 2475 4095
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 2475 4275 45 45 2475 4275 2475 4320
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 2475 4500 45 45 2475 4500 2475 4545
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 2475 4725 45 45 2475 4725 2475 4770
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 2475 4950 45 45 2475 4950 2475 4995
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 2475 5175 45 45 2475 5175 2475 5220
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 2700 2025 45 45 2700 2025 2700 2070
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 2700 2250 45 45 2700 2250 2700 2295
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 2700 2475 45 45 2700 2475 2700 2520
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 2700 2700 45 45 2700 2700 2700 2745
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 2700 2925 45 45 2700 2925 2700 2970
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 2700 3150 45 45 2700 3150 2700 3195
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 2700 3375 45 45 2700 3375 2700 3420
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 2700 3600 45 45 2700 3600 2700 3645
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 2700 3825 45 45 2700 3825 2700 3870
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 2700 4050 45 45 2700 4050 2700 4095
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 2700 4275 45 45 2700 4275 2700 4320
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 2700 4500 45 45 2700 4500 2700 4545
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 2700 4725 45 45 2700 4725 2700 4770
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 2700 4950 45 45 2700 4950 2700 4995
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 2700 5175 45 45 2700 5175 2700 5220
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 2925 2025 45 45 2925 2025 2925 2070
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 2925 2250 45 45 2925 2250 2925 2295
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 2925 2475 45 45 2925 2475 2925 2520
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 2925 2700 45 45 2925 2700 2925 2745
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 2925 2925 45 45 2925 2925 2925 2970
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 2925 3150 45 45 2925 3150 2925 3195
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 2925 3375 45 45 2925 3375 2925 3420
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 2925 3600 45 45 2925 3600 2925 3645
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 2925 3825 45 45 2925 3825 2925 3870
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 2925 4050 45 45 2925 4050 2925 4095
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 2925 4275 45 45 2925 4275 2925 4320
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 2925 4500 45 45 2925 4500 2925 4545
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 2925 4725 45 45 2925 4725 2925 4770
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 2925 4950 45 45 2925 4950 2925 4995
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 2925 5175 45 45 2925 5175 2925 5220
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 3150 2025 45 45 3150 2025 3150 2070
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 3150 2250 45 45 3150 2250 3150 2295
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 3150 2475 45 45 3150 2475 3150 2520
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 3150 2700 45 45 3150 2700 3150 2745
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 3150 2925 45 45 3150 2925 3150 2970
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 3150 3150 45 45 3150 3150 3150 3195
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 3150 3375 45 45 3150 3375 3150 3420
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 3150 3600 45 45 3150 3600 3150 3645
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 3150 3825 45 45 3150 3825 3150 3870
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 3150 4050 45 45 3150 4050 3150 4095
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 3150 4275 45 45 3150 4275 3150 4320
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 3150 4500 45 45 3150 4500 3150 4545
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 3150 4725 45 45 3150 4725 3150 4770
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 3150 4950 45 45 3150 4950 3150 4995
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 3150 5175 45 45 3150 5175 3150 5220
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 3375 2025 45 45 3375 2025 3375 2070
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 3375 2250 45 45 3375 2250 3375 2295
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 3375 2475 45 45 3375 2475 3375 2520
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 3375 2700 45 45 3375 2700 3375 2745
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 3375 2925 45 45 3375 2925 3375 2970
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 3375 3150 45 45 3375 3150 3375 3195
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 3375 3375 45 45 3375 3375 3375 3420
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 3375 3600 45 45 3375 3600 3375 3645
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 3375 3825 45 45 3375 3825 3375 3870
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 3375 4050 45 45 3375 4050 3375 4095
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 3375 4275 45 45 3375 4275 3375 4320
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 3375 4500 45 45 3375 4500 3375 4545
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 3375 4725 45 45 3375 4725 3375 4770
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 3375 4950 45 45 3375 4950 3375 4995
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 3375 5175 45 45 3375 5175 3375 5220
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 3600 2025 45 45 3600 2025 3600 2070
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 3600 2250 45 45 3600 2250 3600 2295
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 3600 2475 45 45 3600 2475 3600 2520
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 3600 2700 45 45 3600 2700 3600 2745
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 3600 2925 45 45 3600 2925 3600 2970
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 3600 3150 45 45 3600 3150 3600 3195
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 3600 3375 45 45 3600 3375 3600 3420
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 3600 3600 45 45 3600 3600 3600 3645
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 3600 3825 45 45 3600 3825 3600 3870
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 3600 4050 45 45 3600 4050 3600 4095
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 3600 4275 45 45 3600 4275 3600 4320
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 3600 4500 45 45 3600 4500 3600 4545
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 3600 4725 45 45 3600 4725 3600 4770
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 3600 4950 45 45 3600 4950 3600 4995
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 3600 5175 45 45 3600 5175 3600 5220
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 3825 2025 45 45 3825 2025 3825 2070
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 3825 2250 45 45 3825 2250 3825 2295
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 3825 2475 45 45 3825 2475 3825 2520
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 3825 2700 45 45 3825 2700 3825 2745
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 3825 2925 45 45 3825 2925 3825 2970
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 3825 3150 45 45 3825 3150 3825 3195
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 3825 3375 45 45 3825 3375 3825 3420
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 3825 3600 45 45 3825 3600 3825 3645
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 3825 3825 45 45 3825 3825 3825 3870
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 3825 4050 45 45 3825 4050 3825 4095
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 3825 4275 45 45 3825 4275 3825 4320
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 3825 4950 45 45 3825 4950 3825 4995
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 3825 5175 45 45 3825 5175 3825 5220
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 4050 4950 45 45 4050 4950 4050 4995
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 4050 5175 45 45 4050 5175 4050 5220
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 4275 4725 45 45 4275 4725 4275 4770
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 4275 4950 45 45 4275 4950 4275 4995
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 4275 5175 45 45 4275 5175 4275 5220
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 4500 4725 45 45 4500 4725 4500 4770
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 4500 4950 45 45 4500 4950 4500 4995
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 4500 5175 45 45 4500 5175 4500 5220
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 4725 4725 45 45 4725 4725 4725 4770
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 4725 4950 45 45 4725 4950 4725 4995
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 4725 5175 45 45 4725 5175 4725 5220
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 4950 4725 45 45 4950 4725 4950 4770
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 4950 4950 45 45 4950 4950 4950 4995
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 4950 5175 45 45 4950 5175 4950 5220
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 5175 4725 45 45 5175 4725 5175 4770
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 5175 4950 45 45 5175 4950 5175 4995
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 5175 5175 45 45 5175 5175 5175 5220
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 5400 4725 45 45 5400 4725 5400 4770
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 5400 4950 45 45 5400 4950 5400 4995
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 5400 5175 45 45 5400 5175 5400 5220
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 5625 4725 45 45 5625 4725 5625 4770
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 5625 4950 45 45 5625 4950 5625 4995
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 5625 5175 45 45 5625 5175 5625 5220
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 5850 4725 45 45 5850 4725 5850 4770
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 5850 4950 45 45 5850 4950 5850 4995
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 5850 5175 45 45 5850 5175 5850 5220
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 6075 4725 45 45 6075 4725 6075 4770
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 6075 4950 45 45 6075 4950 6075 4995
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 6075 5175 45 45 6075 5175 6075 5220
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 6300 4725 45 45 6300 4725 6300 4770
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 6300 4950 45 45 6300 4950 6300 4995
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 6300 5175 45 45 6300 5175 6300 5220
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 6525 4725 45 45 6525 4725 6525 4770
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 6525 4950 45 45 6525 4950 6525 4995
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 6525 5175 45 45 6525 5175 6525 5220
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 6750 4725 45 45 6750 4725 6750 4770
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 6750 4950 45 45 6750 4950 6750 4995
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 6750 5175 45 45 6750 5175 6750 5220
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 6975 4725 45 45 6975 4725 6975 4770
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 6975 4950 45 45 6975 4950 6975 4995
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 6975 5175 45 45 6975 5175 6975 5220
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 7200 4725 45 45 7200 4725 7200 4770
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 7200 4950 45 45 7200 4950 7200 4995
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 7200 5175 45 45 7200 5175 7200 5220
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 7425 4725 45 45 7425 4725 7425 4770
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 7425 4950 45 45 7425 4950 7425 4995
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 7425 5175 45 45 7425 5175 7425 5220
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 7650 4725 45 45 7650 4725 7650 4770
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 7650 4950 45 45 7650 4950 7650 4995
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 3825 4500 45 45 3825 4500 3825 4545
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 3825 4725 45 45 3825 4725 3825 4770
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 4050 4725 45 45 4050 4725 4050 4770
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 4500 1125 45 45 4500 1125 4500 1170
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 4725 1125 45 45 4725 1125 4725 1170
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 4950 1125 45 45 4950 1125 4950 1170
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 5175 1125 45 45 5175 1125 5175 1170
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 5400 1125 45 45 5400 1125 5400 1170
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 5625 1125 45 45 5625 1125 5625 1170
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 5850 1125 45 45 5850 1125 5850 1170
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 6075 1125 45 45 6075 1125 6075 1170
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 6300 1125 45 45 6300 1125 6300 1170
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 6525 1125 45 45 6525 1125 6525 1170
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 6750 1125 45 45 6750 1125 6750 1170
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 6975 1125 45 45 6975 1125 6975 1170
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 7200 1125 45 45 7200 1125 7200 1170
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 7425 1125 45 45 7425 1125 7425 1170
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 7650 1125 45 45 7650 1125 7650 1170
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 7875 1125 45 45 7875 1125 7875 1170
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 8100 1125 45 45 8100 1125 8100 1170
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 8325 1125 45 45 8325 1125 8325 1170
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 8550 1125 45 45 8550 1125 8550 1170
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 8550 1350 45 45 8550 1350 8550 1395
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 8550 1575 45 45 8550 1575 8550 1620
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 8550 1800 45 45 8550 1800 8550 1845
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 8550 2025 45 45 8550 2025 8550 2070
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 8550 2250 45 45 8550 2250 8550 2295
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 8550 2475 45 45 8550 2475 8550 2520
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 8550 2700 45 45 8550 2700 8550 2745
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 8550 2925 45 45 8550 2925 8550 2970
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 8550 3150 45 45 8550 3150 8550 3195
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 8550 3375 45 45 8550 3375 8550 3420
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 8550 3600 45 45 8550 3600 8550 3645
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 8550 3825 45 45 8550 3825 8550 3870
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 8550 4050 45 45 8550 4050 8550 4095
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 8550 4275 45 45 8550 4275 8550 4320
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 8550 4500 45 45 8550 4500 8550 4545
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 5400 1350 45 45 5400 1350 5400 1395
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 5400 1575 45 45 5400 1575 5400 1620
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 5400 1800 45 45 5400 1800 5400 1845
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 5625 1350 45 45 5625 1350 5625 1395
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 5625 1575 45 45 5625 1575 5625 1620
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 5625 1800 45 45 5625 1800 5625 1845
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 5850 1350 45 45 5850 1350 5850 1395
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 5850 1575 45 45 5850 1575 5850 1620
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 5850 1800 45 45 5850 1800 5850 1845
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 6075 1350 45 45 6075 1350 6075 1395
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 6075 1575 45 45 6075 1575 6075 1620
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 6075 1800 45 45 6075 1800 6075 1845
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 6300 1350 45 45 6300 1350 6300 1395
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 6300 1575 45 45 6300 1575 6300 1620
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 6300 1800 45 45 6300 1800 6300 1845
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 6525 1350 45 45 6525 1350 6525 1395
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 6525 1575 45 45 6525 1575 6525 1620
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 6525 1800 45 45 6525 1800 6525 1845
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 6750 1350 45 45 6750 1350 6750 1395
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 6750 1575 45 45 6750 1575 6750 1620
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 6750 1800 45 45 6750 1800 6750 1845
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 6975 1350 45 45 6975 1350 6975 1395
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 6975 1575 45 45 6975 1575 6975 1620
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 6975 1800 45 45 6975 1800 6975 1845
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 7200 1350 45 45 7200 1350 7200 1395
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 7200 1575 45 45 7200 1575 7200 1620
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 7200 1800 45 45 7200 1800 7200 1845
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 7425 1350 45 45 7425 1350 7425 1395
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 7425 1575 45 45 7425 1575 7425 1620
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 7425 1800 45 45 7425 1800 7425 1845
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 7650 1350 45 45 7650 1350 7650 1395
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 7650 1575 45 45 7650 1575 7650 1620
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 7650 1800 45 45 7650 1800 7650 1845
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 7875 1350 45 45 7875 1350 7875 1395
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 7875 1575 45 45 7875 1575 7875 1620
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 7875 1800 45 45 7875 1800 7875 1845
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 7875 2025 45 45 7875 2025 7875 2070
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 7875 2250 45 45 7875 2250 7875 2295
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 7875 2475 45 45 7875 2475 7875 2520
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 7875 2700 45 45 7875 2700 7875 2745
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 7875 2925 45 45 7875 2925 7875 2970
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 7875 3150 45 45 7875 3150 7875 3195
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 7875 3375 45 45 7875 3375 7875 3420
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 7875 3600 45 45 7875 3600 7875 3645
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 7875 3825 45 45 7875 3825 7875 3870
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 7875 4050 45 45 7875 4050 7875 4095
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 7875 4275 45 45 7875 4275 7875 4320
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 7875 4500 45 45 7875 4500 7875 4545
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 8100 1350 45 45 8100 1350 8100 1395
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 8100 1575 45 45 8100 1575 8100 1620
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 8100 1800 45 45 8100 1800 8100 1845
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 8100 2025 45 45 8100 2025 8100 2070
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 8100 2250 45 45 8100 2250 8100 2295
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 8100 2475 45 45 8100 2475 8100 2520
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 8100 2700 45 45 8100 2700 8100 2745
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 8100 2925 45 45 8100 2925 8100 2970
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 8100 3150 45 45 8100 3150 8100 3195
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 8100 3375 45 45 8100 3375 8100 3420
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 8100 3600 45 45 8100 3600 8100 3645
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 8100 3825 45 45 8100 3825 8100 3870
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 8100 4050 45 45 8100 4050 8100 4095
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 8100 4275 45 45 8100 4275 8100 4320
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 8100 4500 45 45 8100 4500 8100 4545
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 8325 1350 45 45 8325 1350 8325 1395
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 8325 1575 45 45 8325 1575 8325 1620
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 8325 1800 45 45 8325 1800 8325 1845
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 8325 2025 45 45 8325 2025 8325 2070
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 8325 2250 45 45 8325 2250 8325 2295
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 8325 2475 45 45 8325 2475 8325 2520
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 8325 2700 45 45 8325 2700 8325 2745
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 8325 2925 45 45 8325 2925 8325 2970
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 8325 3150 45 45 8325 3150 8325 3195
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 8325 3375 45 45 8325 3375 8325 3420
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 8325 3600 45 45 8325 3600 8325 3645
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 8325 3825 45 45 8325 3825 8325 3870
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 8325 4050 45 45 8325 4050 8325 4095
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 8325 4275 45 45 8325 4275 8325 4320
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 8325 4500 45 45 8325 4500 8325 4545
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 4050 1350 45 45 4050 1350 4050 1395
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 4050 1575 45 45 4050 1575 4050 1620
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 4050 1800 45 45 4050 1800 4050 1845
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 4050 3150 45 45 4050 3150 4050 3195
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 4050 3375 45 45 4050 3375 4050 3420
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 4050 3600 45 45 4050 3600 4050 3645
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 4050 3825 45 45 4050 3825 4050 3870
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 4050 4050 45 45 4050 4050 4050 4095
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 4050 4275 45 45 4050 4275 4050 4320
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 4050 4500 45 45 4050 4500 4050 4545
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 4275 2025 45 45 4275 2025 4275 2070
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 4275 2250 45 45 4275 2250 4275 2295
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 4275 2475 45 45 4275 2475 4275 2520
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 4275 2700 45 45 4275 2700 4275 2745
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 4275 2925 45 45 4275 2925 4275 2970
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 4275 3150 45 45 4275 3150 4275 3195
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 4275 3375 45 45 4275 3375 4275 3420
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 4275 3600 45 45 4275 3600 4275 3645
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 4275 3825 45 45 4275 3825 4275 3870
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 4275 4050 45 45 4275 4050 4275 4095
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 4275 4275 45 45 4275 4275 4275 4320
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 4275 4500 45 45 4275 4500 4275 4545
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 4500 2025 45 45 4500 2025 4500 2070
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 4500 2250 45 45 4500 2250 4500 2295
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 4500 2475 45 45 4500 2475 4500 2520
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 4500 2700 45 45 4500 2700 4500 2745
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 4500 2925 45 45 4500 2925 4500 2970
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 4500 3150 45 45 4500 3150 4500 3195
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 4500 3375 45 45 4500 3375 4500 3420
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 4500 3600 45 45 4500 3600 4500 3645
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 4500 3825 45 45 4500 3825 4500 3870
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 4500 4050 45 45 4500 4050 4500 4095
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 4500 4275 45 45 4500 4275 4500 4320
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 4500 4500 45 45 4500 4500 4500 4545
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 4725 2025 45 45 4725 2025 4725 2070
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 4725 2250 45 45 4725 2250 4725 2295
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 4725 2475 45 45 4725 2475 4725 2520
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 4725 2700 45 45 4725 2700 4725 2745
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 4725 2925 45 45 4725 2925 4725 2970
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 4725 3150 45 45 4725 3150 4725 3195
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 4725 3375 45 45 4725 3375 4725 3420
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 4725 3600 45 45 4725 3600 4725 3645
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 4725 3825 45 45 4725 3825 4725 3870
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 4725 4050 45 45 4725 4050 4725 4095
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 4725 4275 45 45 4725 4275 4725 4320
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 4725 4500 45 45 4725 4500 4725 4545
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 4950 2025 45 45 4950 2025 4950 2070
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 4950 2250 45 45 4950 2250 4950 2295
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 4950 2475 45 45 4950 2475 4950 2520
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 4950 2700 45 45 4950 2700 4950 2745
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 4950 2925 45 45 4950 2925 4950 2970
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 4950 3150 45 45 4950 3150 4950 3195
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 4950 3375 45 45 4950 3375 4950 3420
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 4950 3600 45 45 4950 3600 4950 3645
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 4950 3825 45 45 4950 3825 4950 3870
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 4950 4050 45 45 4950 4050 4950 4095
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 4950 4275 45 45 4950 4275 4950 4320
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 4950 4500 45 45 4950 4500 4950 4545
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 5175 2025 45 45 5175 2025 5175 2070
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 5175 2250 45 45 5175 2250 5175 2295
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 5175 2475 45 45 5175 2475 5175 2520
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 5175 2700 45 45 5175 2700 5175 2745
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 5175 2925 45 45 5175 2925 5175 2970
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 5175 3150 45 45 5175 3150 5175 3195
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 5175 3375 45 45 5175 3375 5175 3420
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 5175 3600 45 45 5175 3600 5175 3645
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 5175 3825 45 45 5175 3825 5175 3870
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 5175 4050 45 45 5175 4050 5175 4095
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 5175 4275 45 45 5175 4275 5175 4320
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 5175 4500 45 45 5175 4500 5175 4545
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 5400 2025 45 45 5400 2025 5400 2070
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 5400 2250 45 45 5400 2250 5400 2295
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 5400 2475 45 45 5400 2475 5400 2520
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 5400 2700 45 45 5400 2700 5400 2745
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 5400 2925 45 45 5400 2925 5400 2970
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 5400 3150 45 45 5400 3150 5400 3195
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 5400 3375 45 45 5400 3375 5400 3420
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 5400 3600 45 45 5400 3600 5400 3645
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 5400 3825 45 45 5400 3825 5400 3870
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 5400 4050 45 45 5400 4050 5400 4095
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 5400 4275 45 45 5400 4275 5400 4320
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 5400 4500 45 45 5400 4500 5400 4545
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 5625 2025 45 45 5625 2025 5625 2070
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 5625 2250 45 45 5625 2250 5625 2295
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 5625 2475 45 45 5625 2475 5625 2520
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 5625 2700 45 45 5625 2700 5625 2745
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 5625 2925 45 45 5625 2925 5625 2970
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 5625 3150 45 45 5625 3150 5625 3195
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 5625 3375 45 45 5625 3375 5625 3420
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 5625 3600 45 45 5625 3600 5625 3645
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 5625 3825 45 45 5625 3825 5625 3870
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 5625 4050 45 45 5625 4050 5625 4095
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 5625 4275 45 45 5625 4275 5625 4320
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 5625 4500 45 45 5625 4500 5625 4545
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 5850 2025 45 45 5850 2025 5850 2070
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 5850 2250 45 45 5850 2250 5850 2295
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 5850 2475 45 45 5850 2475 5850 2520
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 5850 2700 45 45 5850 2700 5850 2745
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 5850 2925 45 45 5850 2925 5850 2970
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 5850 3150 45 45 5850 3150 5850 3195
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 5850 3375 45 45 5850 3375 5850 3420
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 5850 3600 45 45 5850 3600 5850 3645
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 5850 3825 45 45 5850 3825 5850 3870
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 5850 4050 45 45 5850 4050 5850 4095
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 5850 4275 45 45 5850 4275 5850 4320
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 5850 4500 45 45 5850 4500 5850 4545
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 6075 2025 45 45 6075 2025 6075 2070
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 6075 2250 45 45 6075 2250 6075 2295
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 6075 2475 45 45 6075 2475 6075 2520
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 6075 2700 45 45 6075 2700 6075 2745
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 6075 2925 45 45 6075 2925 6075 2970
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 6075 3150 45 45 6075 3150 6075 3195
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 6075 3375 45 45 6075 3375 6075 3420
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 6075 3600 45 45 6075 3600 6075 3645
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 6075 3825 45 45 6075 3825 6075 3870
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 6075 4050 45 45 6075 4050 6075 4095
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 6075 4275 45 45 6075 4275 6075 4320
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 6075 4500 45 45 6075 4500 6075 4545
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 6300 2025 45 45 6300 2025 6300 2070
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 6300 2250 45 45 6300 2250 6300 2295
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 6300 2475 45 45 6300 2475 6300 2520
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 6300 2700 45 45 6300 2700 6300 2745
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 6300 2925 45 45 6300 2925 6300 2970
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 6300 3150 45 45 6300 3150 6300 3195
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 6300 3375 45 45 6300 3375 6300 3420
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 6300 3600 45 45 6300 3600 6300 3645
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 6300 3825 45 45 6300 3825 6300 3870
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 6300 4050 45 45 6300 4050 6300 4095
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 6300 4275 45 45 6300 4275 6300 4320
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 6300 4500 45 45 6300 4500 6300 4545
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 6525 2025 45 45 6525 2025 6525 2070
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 6525 2250 45 45 6525 2250 6525 2295
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 6525 2475 45 45 6525 2475 6525 2520
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 6525 2700 45 45 6525 2700 6525 2745
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 6525 2925 45 45 6525 2925 6525 2970
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 6525 3150 45 45 6525 3150 6525 3195
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 6525 3375 45 45 6525 3375 6525 3420
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 6525 3600 45 45 6525 3600 6525 3645
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 6525 3825 45 45 6525 3825 6525 3870
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 6525 4050 45 45 6525 4050 6525 4095
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 6525 4275 45 45 6525 4275 6525 4320
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 6525 4500 45 45 6525 4500 6525 4545
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 6750 2025 45 45 6750 2025 6750 2070
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 6750 2250 45 45 6750 2250 6750 2295
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 6750 2475 45 45 6750 2475 6750 2520
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 6750 2700 45 45 6750 2700 6750 2745
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 6750 2925 45 45 6750 2925 6750 2970
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 6750 3150 45 45 6750 3150 6750 3195
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 6750 3375 45 45 6750 3375 6750 3420
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 6750 3600 45 45 6750 3600 6750 3645
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 6750 3825 45 45 6750 3825 6750 3870
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 6750 4050 45 45 6750 4050 6750 4095
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 6750 4275 45 45 6750 4275 6750 4320
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 6750 4500 45 45 6750 4500 6750 4545
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 6975 2025 45 45 6975 2025 6975 2070
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 6975 2250 45 45 6975 2250 6975 2295
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 6975 2475 45 45 6975 2475 6975 2520
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 6975 2700 45 45 6975 2700 6975 2745
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 6975 2925 45 45 6975 2925 6975 2970
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 6975 3150 45 45 6975 3150 6975 3195
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 6975 3375 45 45 6975 3375 6975 3420
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 6975 3600 45 45 6975 3600 6975 3645
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 6975 3825 45 45 6975 3825 6975 3870
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 6975 4050 45 45 6975 4050 6975 4095
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 6975 4275 45 45 6975 4275 6975 4320
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 6975 4500 45 45 6975 4500 6975 4545
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 7200 2025 45 45 7200 2025 7200 2070
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 7200 2250 45 45 7200 2250 7200 2295
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 7200 2475 45 45 7200 2475 7200 2520
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 7200 2700 45 45 7200 2700 7200 2745
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 7200 2925 45 45 7200 2925 7200 2970
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 7200 3150 45 45 7200 3150 7200 3195
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 7200 3375 45 45 7200 3375 7200 3420
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 7200 3600 45 45 7200 3600 7200 3645
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 7200 3825 45 45 7200 3825 7200 3870
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 7200 4050 45 45 7200 4050 7200 4095
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 7200 4275 45 45 7200 4275 7200 4320
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 7200 4500 45 45 7200 4500 7200 4545
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 7425 2025 45 45 7425 2025 7425 2070
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 7425 2250 45 45 7425 2250 7425 2295
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 7425 2475 45 45 7425 2475 7425 2520
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 7425 2700 45 45 7425 2700 7425 2745
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 7425 2925 45 45 7425 2925 7425 2970
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 7425 3150 45 45 7425 3150 7425 3195
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 7425 3375 45 45 7425 3375 7425 3420
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 7425 3600 45 45 7425 3600 7425 3645
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 7425 3825 45 45 7425 3825 7425 3870
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 7425 4050 45 45 7425 4050 7425 4095
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 7425 4275 45 45 7425 4275 7425 4320
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 7425 4500 45 45 7425 4500 7425 4545
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 7650 2025 45 45 7650 2025 7650 2070
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 7650 2250 45 45 7650 2250 7650 2295
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 7650 2475 45 45 7650 2475 7650 2520
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 7650 2700 45 45 7650 2700 7650 2745
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 7650 2925 45 45 7650 2925 7650 2970
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 7650 3150 45 45 7650 3150 7650 3195
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 7650 3375 45 45 7650 3375 7650 3420
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 7650 3600 45 45 7650 3600 7650 3645
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 7650 3825 45 45 7650 3825 7650 3870
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 7650 4050 45 45 7650 4050 7650 4095
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 7650 4275 45 45 7650 4275 7650 4320
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 7650 4500 45 45 7650 4500 7650 4545
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 4050 2025 45 45 4050 2025 4050 2070
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 4050 2250 45 45 4050 2250 4050 2295
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 4050 2475 45 45 4050 2475 4050 2520
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 4050 2700 45 45 4050 2700 4050 2745
1 3 0 2 4 1 50 0 20 0.000 1 0.0000 4050 2925 45 45 4050 2925 4050 2970
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 4275 1125 45 45 4275 1125 4275 1170
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 5175 1350 45 45 5175 1350 5175 1395
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 5175 1575 45 45 5175 1575 5175 1620
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 5175 1800 45 45 5175 1800 5175 1845
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 4275 1350 45 45 4275 1350 4275 1395
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 4275 1575 45 45 4275 1575 4275 1620
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 4275 1800 45 45 4275 1800 4275 1845
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 4500 1350 45 45 4500 1350 4500 1395
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 4500 1575 45 45 4500 1575 4500 1620
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 4500 1800 45 45 4500 1800 4500 1845
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 4725 1350 45 45 4725 1350 4725 1395
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 4725 1575 45 45 4725 1575 4725 1620
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 4725 1800 45 45 4725 1800 4725 1845
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 4950 1350 45 45 4950 1350 4950 1395
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 4950 1575 45 45 4950 1575 4950 1620
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 4950 1800 45 45 4950 1800 4950 1845
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 4950 5400 45 45 4950 5400 4950 5445
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 4950 5625 45 45 4950 5625 4950 5670
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 4950 5850 45 45 4950 5850 4950 5895
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 5175 5625 45 45 5175 5625 5175 5670
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 5175 5850 45 45 5175 5850 5175 5895
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 5400 5625 45 45 5400 5625 5400 5670
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 5400 5850 45 45 5400 5850 5400 5895
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 5625 5625 45 45 5625 5625 5625 5670
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 5625 5850 45 45 5625 5850 5625 5895
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 8775 5400 45 45 8775 5400 8775 5445
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 8775 5625 45 45 8775 5625 8775 5670
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 8775 5850 45 45 8775 5850 8775 5895
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9000 5400 45 45 9000 5400 9000 5445
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9000 5625 45 45 9000 5625 9000 5670
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9000 5850 45 45 9000 5850 9000 5895
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9225 5400 45 45 9225 5400 9225 5445
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9225 5625 45 45 9225 5625 9225 5670
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9225 5850 45 45 9225 5850 9225 5895
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9450 5400 45 45 9450 5400 9450 5445
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9450 5625 45 45 9450 5625 9450 5670
1 3 0 1 32 7 50 0 -1 0.000 1 0.0000 9450 5850 45 45 9450 5850 9450 5895
1 3 0 2 4 7 50 0 -1 0.000 1 0.0000 4050 1125 45 45 4050 1125 4050 1170
1 3 0 1 32 1 50 0 20 0.000 1 0.0000 7650 5175 45 45 7650 5175 7650 5220
2 1 0 2 0 7 52 0 -1 0.000 0 0 -1 1 0 2
1 1 2.00 120.00 240.00
2475 0 2475 6525
2 1 0 2 0 7 52 0 -1 0.000 0 0 -1 1 0 2
1 1 2.00 120.00 240.00
1125 2025 10125 2025
2 2 0 4 28 1 51 0 -1 0.000 0 0 -1 0 0 5
3375 7875 4050 7875 4050 8325 3375 8325 3375 7875
2 2 0 4 11 1 51 0 -1 0.000 0 0 -1 0 0 5
3375 7200 4050 7200 4050 7650 3375 7650 3375 7200
2 2 0 4 11 1 51 0 -1 0.000 0 0 -1 0 0 5
2475 2025 7650 2025 7650 5175 2475 5175 2475 2025
2 2 0 4 28 1 51 0 -1 0.000 0 0 -1 0 0 5
4050 1125 8550 1125 8550 4500 4050 4500 4050 1125
4 0 0 50 0 16 18 0.0000 4 210 210 2700 6525 Y\001
4 0 0 50 0 16 18 0.0000 4 210 195 9900 2475 X\001
4 0 0 50 0 16 18 0.0000 4 270 1785 4365 6840 pixel positions\001
4 0 0 50 0 16 18 0.0000 4 270 1905 4365 7515 display window\001
4 0 0 50 0 16 18 0.0000 4 210 1560 4365 8190 data window\001
4 0 0 50 0 16 18 0.0000 4 270 3855 4365 8865 pixels that are part of the image\001
4 0 0 50 0 16 18 0.0000 4 270 4545 4365 9540 pixels for which the file contains data\001
Binary file not shown.

Before

Width:  |  Height:  |  Size: 613 KiB

-116
View File
@@ -1,116 +0,0 @@
#FIG 3.2
Landscape
Center
Metric
A4
60.00
Single
-2
1200 2
0 32 #d2d2d2
6 11025 2250 11925 2700
4 2 0 50 -1 22 18 0.0000 4 195 315 11340 2565 lat.\001
4 0 0 50 -1 32 20 0.0000 4 195 510 11385 2565 +p/2\001
-6
6 10800 2475 11925 2925
4 0 0 50 -1 32 20 0.0000 4 135 300 11565 2835 +p\001
4 2 0 50 -1 22 18 0.0000 4 255 525 11520 2835 long.\001
-6
6 8010 3060 9135 3375
6 8010 3060 9135 3375
4 0 0 50 -1 32 20 0.0000 4 195 510 8595 3285 +p/2\001
4 2 0 50 -1 22 18 0.0000 4 255 525 8550 3285 long.\001
-6
-6
1 1 0 3 0 7 48 -1 -1 0.000 1 0.0000 5595 2437 62 43 5595 2437 5657 2480
1 3 0 3 0 7 50 -1 -1 0.000 1 0.0000 5602 4453 2269 2269 5602 4453 7871 4453
2 2 0 3 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
10800 2250 15300 2250 15300 4500 10800 4500 10800 2250
2 1 0 1 0 7 47 -1 -1 0.000 0 0 -1 1 0 2
1 1 1.00 60.00 120.00
7965 3285 7110 3825
2 1 0 1 0 7 47 -1 -1 0.000 0 0 -1 1 0 2
1 1 1.00 60.00 120.00
3420 3060 4275 3510
2 1 0 1 0 7 47 -1 -1 0.000 0 0 -1 1 0 2
1 1 1.00 60.00 120.00
4950 1710 5490 2340
2 1 0 9 7 7 48 -1 -1 0.000 0 0 -1 0 0 2
3420 3060 4275 3510
2 1 0 9 7 7 48 -1 -1 0.000 0 0 -1 0 0 2
4950 1710 5450 2290
2 1 0 9 7 7 48 -1 -1 0.000 0 0 -1 0 0 2
7965 3285 7110 3825
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
1 1 1.00 60.00 120.00
10800 1755 10800 2160
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
1 1 1.00 60.00 120.00
15300 4995 15300 4590
2 1 0 3 32 7 51 -1 -1 0.000 0 0 -1 0 0 2
5604 4454 3867 5459
2 1 0 3 32 7 51 -1 -1 0.000 0 0 -1 0 0 2
5607 4452 7336 5456
2 1 0 3 32 7 51 -1 -1 0.000 0 0 -1 0 0 2
5604 4455 5604 2448
2 1 0 9 7 7 52 -1 -1 0.000 0 0 -1 0 0 2
4498 3292 4951 2808
2 1 0 9 7 7 52 -1 -1 0.000 0 0 -1 0 0 2
6246 2822 6686 3248
2 1 0 9 7 7 52 -1 -1 0.000 0 0 -1 0 0 2
5594 2689 5594 3177
2 1 0 3 0 7 47 -1 -1 0.000 0 0 -1 1 0 2
1 1 3.00 113.44 226.88
3866 5462 2910 6016
2 1 0 3 0 7 47 -1 -1 0.000 0 0 -1 1 0 2
1 1 3.00 113.44 226.88
7341 5461 8300 6021
2 1 0 3 0 7 47 -1 -1 0.000 0 0 -1 1 0 2
1 1 3.00 113.44 226.88
5601 2449 5601 1339
2 1 0 9 7 7 48 -1 -1 0.000 0 0 -1 0 0 2
5598 2292 5598 2022
2 1 0 9 7 7 48 -1 -1 0.000 0 0 -1 0 0 2
3712 5554 3565 5638
2 1 0 9 7 7 48 -1 -1 0.000 0 0 -1 0 0 2
7497 5549 7679 5656
3 0 0 3 0 7 50 -1 -1 0.000 0 0 0 17
4520 6452 4387 6381 4207 6230 4033 5989 3926 5754 3851 5468
3818 5041 3905 4454 4104 3903 4494 3274 4943 2817 5401 2514
5771 2376 6138 2322 6431 2366 6574 2405 6726 2482
0.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000
1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000
0.000
3 0 0 3 0 7 50 -1 -1 0.000 0 0 0 17
7871 4389 7876 4539 7835 4771 7713 5043 7563 5253 7353 5461
7000 5703 6448 5920 5871 6023 5132 6000 4512 5839 4020 5594
3715 5343 3486 5053 3377 4777 3339 4634 3330 4464
0.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000
1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000
0.000
3 0 0 3 0 7 50 -1 -1 0.000 0 0 0 17
4411 2520 4539 2441 4760 2360 5056 2329 5313 2354 5599 2432
5984 2617 6449 2986 6826 3434 7176 4086 7347 4704 7380 5252
7316 5641 7179 5986 6995 6217 6889 6322 6746 6415
0.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000
1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000
0.000
3 0 0 3 32 7 53 -1 -1 0.000 0 0 0 17
7871 4535 7876 4385 7835 4153 7713 3881 7563 3671 7353 3463
7000 3221 6448 3003 5871 2901 5132 2923 4512 3084 4020 3329
3715 3580 3486 3871 3377 4146 3339 4290 3330 4460
0.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000
1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000
0.000
4 1 0 50 -1 22 18 0.0000 4 195 150 5625 1170 Y\001
4 1 0 50 -1 22 18 0.0000 4 195 135 2700 6255 Z\001
4 1 0 50 -1 22 18 0.0000 4 195 150 8550 6255 X\001
4 2 0 50 -1 22 18 0.0000 4 255 525 14760 4365 long.\001
4 2 0 50 -1 22 18 0.0000 4 195 315 14580 4095 lat.\001
4 0 0 50 -1 32 20 0.0000 4 195 495 14625 4095 -p/2\001
4 0 0 50 -1 32 20 0.0000 4 135 285 14805 4365 -p\001
4 2 0 50 -1 22 18 0.0000 4 195 315 4365 1665 lat.\001
4 0 0 50 -1 32 20 0.0000 4 195 510 4410 1665 +p/2\001
4 2 0 50 -1 22 18 0.0000 4 195 1740 10845 1665 dataWindow.min\001
4 0 0 50 -1 22 18 0.0000 4 195 1785 15255 5265 dataWindow.max\001
4 2 0 50 -1 22 18 0.0000 4 255 705 3375 3060 long. 0\001
-164
View File
@@ -1,164 +0,0 @@
#FIG 3.2
Landscape
Center
Metric
A4
70.00
Single
-2
1200 2
0 32 #afafaf
6 11250 7875 11700 8325
2 3 0 0 0 0 52 -1 20 4.000 0 0 -1 0 0 4
11250 7983 11538 7955 11250 8213 11250 7983
-6
6 9675 9675 10125 10350
2 3 0 0 0 0 52 -1 20 4.000 0 0 -1 0 0 4
9787 9959 9899 10240 10011 9846 9787 9959
-6
6 10800 6525 11250 6975
2 3 0 0 0 0 52 -1 20 4.000 0 0 -1 0 0 4
10800 6633 11088 6605 10800 6863 10800 6633
-6
6 2925 4275 3150 4725
2 3 0 0 0 0 52 -1 20 4.000 0 0 -1 0 0 4
3150 4613 2942 4378 3150 4404 3150 4613
-6
6 8325 3600 8775 4275
2 3 0 0 0 0 52 -1 20 4.000 0 0 -1 0 0 4
8663 3992 8551 3711 8439 4104 8663 3992
-6
6 7425 3375 7875 3600
2 3 0 0 0 0 38 -1 20 4.000 0 0 -1 0 0 4
7516 3389 7660 3375 7516 3504 7516 3389
-6
6 4950 4500 5175 4725
2 3 0 0 0 0 38 -1 20 4.000 0 0 -1 0 0 4
5104 4711 4960 4725 5104 4596 5104 4711
-6
1 3 0 1 0 0 42 -1 20 4.000 1 0.0000 6750 6750 41 41 6750 6750 6761 6789
1 3 0 1 0 0 33 -1 20 4.000 1 0.0000 8550 7875 41 41 8550 7875 8561 7914
1 3 0 1 0 0 42 -1 20 4.000 1 0.0000 6300 6075 41 41 6300 6075 6311 6114
2 1 0 2 0 0 42 -1 -1 6.000 1 1 -1 0 0 2
9900 8775 9900 9900
2 1 0 2 0 0 42 -1 -1 6.000 1 1 -1 0 0 2
9900 8775 11250 8100
2 3 0 0 0 7 43 -1 20 2.000 1 1 -1 0 0 5
7287 6845 7429 6934 7500 6894 7366 6814 7287 6845
2 3 0 0 0 7 41 -1 20 2.000 1 1 -1 0 0 5
6914 6611 7012 6668 7065 6637 6963 6584 6914 6611
2 3 0 0 0 7 41 -1 20 2.000 1 1 -1 0 0 5
6781 6691 6879 6748 6932 6717 6830 6664 6781 6691
2 3 0 0 0 7 43 -1 20 2.000 1 1 -1 0 0 5
7014 6982 7170 7073 7256 7023 7122 6943 7014 6982
2 3 0 0 0 7 43 -1 20 2.000 1 1 -1 0 0 5
7123 6925 7265 7014 7340 6978 7194 6899 7123 6925
2 3 0 0 0 7 39 -1 20 2.000 1 1 -1 0 0 5
6231 6309 6329 6366 6382 6335 6280 6282 6231 6309
2 3 0 0 0 7 39 -1 20 2.000 1 1 -1 0 0 5
6240 6194 6338 6251 6391 6220 6289 6167 6240 6194
2 3 0 0 0 7 41 -1 20 2.000 1 1 -1 0 0 5
6675 6620 6773 6677 6826 6646 6724 6593 6675 6620
2 3 0 0 0 7 41 -1 20 2.000 1 1 -1 0 0 5
6683 6469 6781 6526 6834 6495 6732 6442 6683 6469
2 3 0 0 0 7 41 -1 20 2.000 1 1 -1 0 0 5
6342 6565 6342 6437 6256 6384 6259 6514 6342 6565
2 3 0 0 0 7 41 -1 20 2.000 1 1 -1 0 0 5
4911 5536 4911 5678 5000 5736 5004 5589 4911 5536
2 3 0 0 0 7 39 -1 20 2.000 1 1 -1 0 0 5
8422 7507 8617 7626 8617 7564 8417 7449 8422 7507
2 3 0 0 0 7 39 -1 20 2.000 1 1 -1 0 0 5
7907 7147 8164 7293 8195 7382 7929 7227 7907 7147
2 3 0 0 0 7 39 -1 20 2.000 1 1 -1 0 0 5
8727 7698 8922 7817 8922 7755 8722 7640 8727 7698
2 3 0 0 0 7 49 -1 20 2.000 1 1 -1 0 0 5
8345 7134 8376 7245 8443 7267 8403 7143 8345 7134
2 3 0 0 0 7 49 -1 20 2.000 1 1 -1 0 0 5
8514 7209 8514 7338 8585 7373 8580 7254 8514 7209
2 3 0 0 0 7 49 -1 20 2.000 1 1 -1 0 0 5
8989 7609 9104 7551 9188 7604 9073 7657 8989 7609
2 3 0 0 0 7 43 -1 20 2.000 1 1 -1 0 0 5
8518 4506 8518 4622 8589 4671 8589 4542 8518 4506
2 3 0 0 0 7 43 -1 20 2.000 1 1 -1 0 0 5
10394 8454 10521 8392 10640 8468 10506 8540 10394 8454
2 3 0 0 0 7 43 -1 20 2.000 1 1 -1 0 0 5
9571 7968 9722 7900 9835 7980 9684 8045 9571 7968
2 1 0 3 11 0 40 -1 -1 6.000 1 1 -1 0 0 3
9450 10800 9450 8100 12150 6750
2 1 0 3 11 0 44 -1 -1 6.000 1 1 -1 0 0 3
9450 10800 12150 9450 12150 6750
2 3 0 0 32 7 41 -1 20 0.000 1 1 -1 0 0 5
6020 6160 6118 6226 6167 6204 6060 6133 6020 6160
2 3 0 0 32 7 41 -1 20 2.000 1 1 -1 0 0 5
6100 6115 6211 6178 6247 6151 6153 6093 6100 6115
2 3 0 0 32 7 43 -1 20 2.000 1 1 -1 0 0 5
5845 6245 5972 6186 6061 6245 5916 6313 5845 6245
2 1 2 1 32 0 38 -1 -1 1.500 1 1 -1 0 0 2
4950 5400 9450 8100
2 1 2 1 32 0 38 -1 -1 1.500 1 1 -1 0 0 2
8550 7875 4950 5400
2 1 2 1 32 0 42 -1 -1 1.500 1 1 -1 0 0 2
8550 7875 4950 8100
2 1 2 1 32 0 42 -1 -1 1.500 1 1 -1 0 0 2
4950 8100 1350 8325
2 1 2 1 32 0 42 -1 -1 1.500 1 1 -1 0 0 2
4950 5400 1350 2925
2 1 2 1 32 0 42 -1 -1 1.500 1 1 -1 0 0 2
8550 7875 7650 4050
2 1 2 1 32 0 44 -1 -1 1.500 1 1 -1 0 0 2
7650 4050 12150 6750
2 1 2 1 32 0 50 -1 -1 1.500 1 1 -1 0 0 2
7650 6750 12150 9450
2 1 2 1 32 0 42 -1 -1 1.500 1 1 -1 0 0 2
4950 8100 9450 10800
2 1 2 1 32 0 42 -1 -1 1.500 1 1 -1 0 0 2
8550 7875 7650 6750
2 1 0 3 0 7 42 -1 -1 6.000 1 1 -1 0 0 2
8550 7875 6750 6750
2 1 0 3 0 7 42 -1 -1 6.000 1 1 -1 0 0 2
4950 5625 3150 4500
2 1 0 3 0 0 42 -1 -1 6.000 1 1 -1 0 0 2
8550 7875 8550 4050
2 1 0 3 0 0 42 -1 -1 6.000 1 1 -1 0 0 2
8550 7875 10800 6750
2 1 0 1 0 7 38 -1 20 4.000 1 1 -1 0 0 2
4950 5310 4950 4500
2 1 0 1 0 7 38 -1 20 4.000 1 1 -1 0 0 2
7650 3960 7650 3150
2 1 2 1 32 0 42 -1 -1 1.500 1 1 -1 0 0 2
7650 4050 6750 225
2 3 0 0 0 7 40 -1 20 2.000 1 1 -1 0 0 7
7552 3354 7495 3354 7468 3402 7481 3513 7503 3544 7570 3518
7552 3354
2 2 0 0 0 7 37 -1 20 2.000 1 1 -1 0 0 5
6075 3825 6525 3825 6525 4275 6075 4275 6075 3825
2 1 0 1 0 7 38 -1 20 4.000 1 1 -1 0 0 2
4950 4725 7650 3375
2 1 0 3 12 0 40 -1 -1 6.000 1 1 -1 0 0 3
4950 8100 4950 5400 7650 4050
2 1 0 3 12 0 44 -1 -1 6.000 1 1 -1 0 0 3
4950 8100 7650 6750 7650 4050
2 3 0 0 0 7 33 -1 20 2.000 1 1 -1 0 0 5
10759 8471 10539 8591 10749 8801 10989 8661 10759 8471
2 1 0 2 0 0 42 -1 -1 0.000 1 1 -1 0 0 2
4950 6750 7650 5400
2 1 0 2 0 0 40 -1 -1 0.000 1 1 -1 0 0 2
6300 7425 6300 4725
2 1 0 2 0 0 40 -1 -1 4.000 1 1 -1 0 0 2
6300 6975 6750 6750
2 1 0 2 0 0 42 -1 -1 0.000 1 1 -1 0 0 2
6750 6750 6750 5850
2 1 0 2 32 7 44 -1 -1 6.000 1 1 -1 0 0 2
6750 6750 4950 5625
4 0 0 30 -1 22 18 0.0000 4 195 150 10125 9900 Y\001
4 0 0 30 -1 22 18 0.0000 4 195 150 8775 4410 Y\001
4 0 0 30 -1 22 18 0.0000 4 195 135 3375 5130 Z\001
4 0 0 30 -1 22 18 0.0000 4 195 150 10440 6705 X\001
4 0 0 30 -1 22 18 0.0000 4 195 150 11700 7965 X\001
4 1 0 36 -1 22 18 0.0000 4 195 210 6300 4140 W\001
4 1 0 36 -1 22 18 0.0000 4 195 120 6705 7070 1\001
4 0 0 43 -1 22 18 0.0000 4 195 165 6048 5957 C\001
4 0 0 36 -1 22 18 0.0000 4 195 165 8679 8111 O\001
4 0 0 36 -1 23 18 0.4461 4 195 1560 5775 8015 screen window\001
4 0 0 30 -1 23 18 0.4461 4 255 1170 10115 9000 pixel space\001
4 0 0 30 -1 23 18 0.4461 4 255 1605 10155 10845 display window\001
Binary file not shown.

Before

Width:  |  Height:  |  Size: 943 KiB

-120
View File
@@ -1,120 +0,0 @@
#FIG 3.2
Landscape
Center
Metric
A4
60.00
Single
-2
1200 2
0 32 #cdcdcd
6 1575 1575 3150 8325
2 2 0 2 10 7 47 -1 -1 0.000 0 0 -1 0 0 5
1800 1800 2925 1800 2925 3375 1800 3375 1800 1800
2 2 0 2 10 7 47 -1 -1 0.000 0 0 -1 0 0 5
1800 3375 2925 3375 2925 4950 1800 4950 1800 3375
2 2 0 2 10 7 47 -1 -1 0.000 0 0 -1 0 0 5
1800 4950 2925 4950 2925 6525 1800 6525 1800 4950
2 2 0 2 10 7 47 -1 -1 0.000 0 0 -1 0 0 5
1800 6525 2925 6525 2925 8100 1800 8100 1800 6525
-6
6 2700 1575 4275 8325
2 2 0 2 10 7 47 -1 -1 0.000 0 0 -1 0 0 5
2925 1800 4050 1800 4050 3375 2925 3375 2925 1800
2 2 0 2 10 7 47 -1 -1 0.000 0 0 -1 0 0 5
2925 3375 4050 3375 4050 4950 2925 4950 2925 3375
2 2 0 2 10 7 47 -1 -1 0.000 0 0 -1 0 0 5
2925 4950 4050 4950 4050 6525 2925 6525 2925 4950
2 2 0 2 10 7 47 -1 -1 0.000 0 0 -1 0 0 5
2925 6525 4050 6525 4050 8100 2925 8100 2925 6525
-6
6 3825 1575 5400 8325
2 2 0 2 10 7 47 -1 -1 0.000 0 0 -1 0 0 5
4050 1800 5175 1800 5175 3375 4050 3375 4050 1800
2 2 0 2 10 7 47 -1 -1 0.000 0 0 -1 0 0 5
4050 3375 5175 3375 5175 4950 4050 4950 4050 3375
2 2 0 2 10 7 47 -1 -1 0.000 0 0 -1 0 0 5
4050 4950 5175 4950 5175 6525 4050 6525 4050 4950
2 2 0 2 10 7 47 -1 -1 0.000 0 0 -1 0 0 5
4050 6525 5175 6525 5175 8100 4050 8100 4050 6525
-6
6 4950 1575 6525 8325
2 2 0 2 10 7 47 -1 -1 0.000 0 0 -1 0 0 5
5175 1800 6300 1800 6300 3375 5175 3375 5175 1800
2 2 0 2 10 7 47 -1 -1 0.000 0 0 -1 0 0 5
5175 3375 6300 3375 6300 4950 5175 4950 5175 3375
2 2 0 2 10 7 47 -1 -1 0.000 0 0 -1 0 0 5
5175 4950 6300 4950 6300 6525 5175 6525 5175 4950
2 2 0 2 10 7 47 -1 -1 0.000 0 0 -1 0 0 5
5175 6525 6300 6525 6300 8100 5175 8100 5175 6525
-6
6 6075 1575 7650 8325
2 2 0 2 10 7 47 -1 -1 0.000 0 0 -1 0 0 5
6300 1800 7425 1800 7425 3375 6300 3375 6300 1800
2 2 0 2 10 7 47 -1 -1 0.000 0 0 -1 0 0 5
6300 3375 7425 3375 7425 4950 6300 4950 6300 3375
2 2 0 2 10 7 47 -1 -1 0.000 0 0 -1 0 0 5
6300 4950 7425 4950 7425 6525 6300 6525 6300 4950
2 2 0 2 10 7 47 -1 -1 0.000 0 0 -1 0 0 5
6300 6525 7425 6525 7425 8100 6300 8100 6300 6525
-6
6 7200 1575 8775 8325
2 2 0 2 10 7 47 -1 -1 0.000 0 0 -1 0 0 5
7425 1800 8550 1800 8550 3375 7425 3375 7425 1800
2 2 0 2 10 7 47 -1 -1 0.000 0 0 -1 0 0 5
7425 3375 8550 3375 8550 4950 7425 4950 7425 3375
2 2 0 2 10 7 47 -1 -1 0.000 0 0 -1 0 0 5
7425 4950 8550 4950 8550 6525 7425 6525 7425 4950
2 2 0 2 10 7 47 -1 -1 0.000 0 0 -1 0 0 5
7425 6525 8550 6525 8550 8100 7425 8100 7425 6525
-6
6 8325 1575 9900 8325
2 2 0 2 10 7 47 -1 -1 0.000 0 0 -1 0 0 5
8550 1800 9675 1800 9675 3375 8550 3375 8550 1800
2 2 0 2 10 7 47 -1 -1 0.000 0 0 -1 0 0 5
8550 3375 9675 3375 9675 4950 8550 4950 8550 3375
2 2 0 2 10 7 47 -1 -1 0.000 0 0 -1 0 0 5
8550 4950 9675 4950 9675 6525 8550 6525 8550 4950
2 2 0 2 10 7 47 -1 -1 0.000 0 0 -1 0 0 5
8550 6525 9675 6525 9675 8100 8550 8100 8550 6525
-6
6 9450 1575 11025 8325
2 2 0 2 10 7 47 -1 -1 0.000 0 0 -1 0 0 5
9675 1800 10800 1800 10800 3375 9675 3375 9675 1800
2 2 0 2 10 7 47 -1 -1 0.000 0 0 -1 0 0 5
9675 3375 10800 3375 10800 4950 9675 4950 9675 3375
2 2 0 2 10 7 47 -1 -1 0.000 0 0 -1 0 0 5
9675 4950 10800 4950 10800 6525 9675 6525 9675 4950
2 2 0 2 10 7 47 -1 -1 0.000 0 0 -1 0 0 5
9675 6525 10800 6525 10800 8100 9675 8100 9675 6525
-6
2 5 0 1 0 -1 50 0 -1 0.000 0 0 -1 0 0 5
0 kapaa.png
1800 1800 10260 1800 10260 7560 1800 7560 1800 1800
2 2 1 4 20 7 46 0 -1 10.000 0 0 -1 0 0 5
1800 1800 10260 1800 10260 7560 1800 7560 1800 1800
2 2 0 4 28 7 48 0 -1 0.000 0 0 -1 0 0 5
1800 1800 10260 1800 10260 7560 1800 7560 1800 1800
2 2 0 0 0 32 55 -1 20 0.000 0 0 -1 0 0 5
1800 1800 10800 1800 10800 8100 1800 8100 1800 1800
2 2 0 0 10 32 51 0 20 0.000 0 0 -1 0 0 5
5400 8775 6075 8775 6075 9225 5400 9225 5400 8775
2 2 0 4 28 1 51 0 -1 0.000 0 0 -1 0 0 5
1800 9450 2475 9450 2475 9900 1800 9900 1800 9450
2 2 1 4 20 7 47 0 -1 10.000 0 0 -1 0 0 5
1800 9450 2475 9450 2475 9900 1800 9900 1800 9450
2 2 0 2 10 13 51 0 -1 0.000 0 0 -1 0 0 5
1800 8775 2475 8775 2475 9225 1800 9225 1800 8775
4 0 0 50 0 18 24 0.0000 4 285 750 2790 9090 tiles\001
4 0 0 50 0 18 24 0.0000 4 285 2205 2790 9765 data window\001
4 0 0 50 0 18 24 0.0000 4 360 4635 6390 9090 pixels not stored in the file\001
4 0 10 50 -1 18 20 0.0000 4 270 585 2025 2700 (0,0)\001
4 0 10 50 -1 18 20 0.0000 4 270 585 3150 2700 (1,0)\001
4 0 10 50 -1 18 20 0.0000 4 270 585 4275 2700 (2,0)\001
4 0 10 50 -1 18 20 0.0000 4 270 585 5400 2700 (3,0)\001
4 0 10 50 -1 18 20 0.0000 4 270 585 2025 4275 (0,1)\001
4 0 10 50 -1 18 20 0.0000 4 270 585 3150 4275 (1,1)\001
4 0 10 50 -1 18 20 0.0000 4 270 585 4275 4275 (2,1)\001
4 0 10 50 -1 18 20 0.0000 4 270 585 6525 2700 (4,0)\001
4 0 10 50 -1 18 20 0.0000 4 270 660 2025 5850 (0, 2)\001
4 0 10 50 -1 18 20 0.0000 4 270 660 3150 5850 (1, 2)\001
-55
View File
@@ -1,55 +0,0 @@
#FIG 3.2
Landscape
Center
Metric
A4
60.00
Single
-2
1200 2
0 32 #d0d0d0
2 5 0 1 0 -1 50 0 -1 0.000 0 0 -1 0 0 5
0 still.png
1800 1800 11340 1800 11340 7560 1800 7560 1800 1800
2 1 0 2 0 7 50 0 -1 0.000 0 0 -1 1 0 2
1 1 2.00 120.00 240.00
2250 1350 2250 8325
2 1 0 2 0 7 50 0 -1 0.000 0 0 -1 1 0 2
1 1 2.00 120.00 240.00
1350 2250 11925 2250
2 1 0 2 0 7 50 0 -1 0.000 0 0 -1 0 0 2
1800 1350 1800 1800
2 1 0 2 0 7 50 0 -1 0.000 0 0 -1 0 0 2
1350 1800 1800 1800
2 1 0 2 0 7 50 0 -1 0.000 0 0 -1 0 0 2
1350 7560 1800 7560
2 1 0 2 0 7 50 0 -1 0.000 0 0 -1 0 0 2
1350 7110 1800 7110
2 1 0 2 0 7 50 0 -1 0.000 0 0 -1 0 0 2
10890 1350 10890 1800
2 1 0 2 0 7 50 0 -1 0.000 0 0 -1 0 0 2
11340 1350 11340 1800
2 2 0 4 28 1 51 0 -1 0.000 0 0 -1 0 0 5
5175 9000 5850 9000 5850 9450 5175 9450 5175 9000
2 2 0 4 11 1 51 0 -1 0.000 0 0 -1 0 0 5
5175 8325 5850 8325 5850 8775 5175 8775 5175 8325
2 2 0 4 11 7 49 0 -1 0.000 0 0 -1 0 0 5
2250 2250 10890 2250 10890 7110 2250 7110 2250 2250
2 2 0 4 28 7 49 0 -1 0.000 0 0 -1 0 0 5
1800 1800 11340 1800 11340 7560 1800 7560 1800 1800
2 2 1 4 20 7 47 0 -1 10.000 0 0 -1 0 0 5
1800 1800 11340 1800 11340 7560 1800 7560 1800 1800
2 2 1 4 20 7 47 0 -1 10.000 0 0 -1 0 0 5
5175 9000 5850 9000 5850 9450 5175 9450 5175 9000
4 2 0 50 0 18 24 0.0000 4 270 780 1260 7650 1179\001
4 2 0 50 0 18 24 0.0000 4 270 780 1260 7200 1079\001
4 0 0 50 0 18 24 0.0000 4 285 255 2475 8100 Y\001
4 2 0 50 0 18 24 0.0000 4 270 195 1260 2340 0\001
4 2 0 50 0 18 24 0.0000 4 270 705 1260 1890 -100\001
4 2 0 50 0 18 24 0.0000 4 270 705 1800 1260 -100\001
4 0 0 50 0 18 24 0.0000 4 270 195 2250 1260 0\001
4 2 0 50 0 18 24 0.0000 4 270 780 10890 1260 1919\001
4 0 0 50 0 18 24 0.0000 4 270 780 11340 1260 2019\001
4 0 0 50 0 18 24 0.0000 4 285 270 11700 2700 X\001
4 0 0 50 0 18 24 0.0000 4 360 2715 6165 8640 display window\001
4 0 0 50 0 18 24 0.0000 4 285 2205 6165 9315 data window\001
-57
View File
@@ -1,57 +0,0 @@
#FIG 3.2
Landscape
Center
Metric
A4
60.00
Single
-2
1200 2
0 32 #d0d0d0
2 1 0 2 0 7 50 0 -1 0.000 0 0 -1 1 0 2
1 1 2.00 120.00 240.00
2250 1800 2250 8325
2 1 0 2 0 7 50 0 -1 0.000 0 0 -1 1 0 2
1 1 2.00 120.00 240.00
1800 2250 11925 2250
2 5 0 1 0 -1 50 0 -1 0.000 0 0 -1 0 0 5
0 blobs.png
6750 4050 8550 4050 8550 5850 6750 5850 6750 4050
2 1 0 2 0 7 50 0 -1 0.000 0 0 -1 0 0 2
10890 1800 10890 2250
2 1 0 2 0 7 50 0 -1 0.000 0 0 -1 0 0 2
1800 7110 2250 7110
2 1 0 2 0 7 50 0 -1 0.000 0 0 -1 0 0 2
6300 4050 6750 4050
2 1 0 2 0 7 50 0 -1 0.000 0 0 -1 0 0 2
6750 3600 6750 4050
2 1 0 2 0 7 50 0 -1 0.000 0 0 -1 0 0 2
8550 3600 8550 4050
2 1 0 2 0 7 50 0 -1 0.000 0 0 -1 0 0 2
6300 5850 6750 5850
2 2 0 4 11 1 51 0 -1 0.000 0 0 -1 0 0 5
5175 7875 5850 7875 5850 8325 5175 8325 5175 7875
2 2 0 4 28 1 51 0 -1 0.000 0 0 -1 0 0 5
5175 8550 5850 8550 5850 9000 5175 9000 5175 8550
2 2 0 4 28 1 49 0 -1 0.000 0 0 -1 0 0 5
6750 4050 8550 4050 8550 5850 6750 5850 6750 4050
2 2 0 4 11 7 49 0 -1 0.000 0 0 -1 0 0 5
2250 2250 10890 2250 10890 7110 2250 7110 2250 2250
2 2 0 0 0 32 52 0 20 0.000 0 0 -1 0 0 5
2250 2250 10890 2250 10890 7110 2250 7110 2250 2250
2 2 1 4 20 7 47 0 -1 10.000 0 0 -1 0 0 5
6750 4050 8550 4050 8550 5850 6750 5850 6750 4050
2 2 1 4 20 7 47 0 -1 10.000 0 0 -1 0 0 5
5175 8550 5850 8550 5850 9000 5175 9000 5175 8550
4 0 0 50 0 18 24 0.0000 4 285 2205 6165 8865 data window\001
4 0 0 50 0 18 24 0.0000 4 360 2715 6165 8190 display window\001
4 2 0 50 0 18 24 0.0000 4 270 780 1710 7200 1079\001
4 0 0 50 0 18 24 0.0000 4 285 255 2475 8100 Y\001
4 0 0 50 0 18 24 0.0000 4 285 270 11700 2700 X\001
4 1 0 50 0 18 24 0.0000 4 270 780 10890 1710 1919\001
4 2 0 50 0 18 24 0.0000 4 270 195 1710 2340 0\001
4 1 0 50 0 18 24 0.0000 4 270 195 2250 1710 0\001
4 2 0 50 0 18 24 0.0000 4 270 585 6210 5940 800\001
4 2 0 50 0 18 24 0.0000 4 270 585 6210 4140 400\001
4 1 0 50 0 18 24 0.0000 4 270 780 6750 3510 1000\001
4 1 0 50 0 18 24 0.0000 4 270 780 8550 3510 1400\001
-55
View File
@@ -1,55 +0,0 @@
void
readGZ1 (
const char fileName[],
Array2D<half>& rPixels,
Array2D<half>& gPixels,
Array2D<float>& zPixels,
int& width,
int& height)
{
InputFile file (fileName);
Box2i dw = file.header ().dataWindow ();
width = dw.max.x - dw.min.x + 1;
height = dw.max.y - dw.min.y + 1;
rPixels.resizeErase (height, width);
gPixels.resizeErase (height, width);
zPixels.resizeErase (height, width);
FrameBuffer frameBuffer;
frameBuffer.insert ("R", // name
Slice (HALF, // type
(char *) (&rPixels[0][0] - // base
dw.min.x -
dw.min.y * width),
sizeof (rPixels[0][0]) * 1, // xStride
sizeof (rPixels[0][0]) * width, // yStride
1, 1, // x/y sampling
0.0)); // fillValue
frameBuffer.insert ("G", // name
Slice (HALF, // type
(char *) (&gPixels[0][0] - // base
dw.min.x -
dw.min.y * width),
sizeof (gPixels[0][0]) * 1, // xStride
sizeof (gPixels[0][0]) * width, // yStride
1, 1, // x/y sampling
0.0)); // fillValue
frameBuffer.insert ("Z", // name
Slice (FLOAT, // type
(char *) (&zPixels[0][0] - // base
dw.min.x -
dw.min.y * width),
sizeof (zPixels[0][0]) * 1, // xStride
sizeof (zPixels[0][0]) * width, // yStride
1, 1, // x/y sampling
FLT_MAX)); // fillValue
file.setFrameBuffer (frameBuffer);
file.readPixels (dw.min.y, dw.max.y);
}
@@ -1,5 +1,8 @@
#!/usr/bin/env bash
# SPDX-License-Identifier: BSD-3-Clause
# Copyright Contributors to the OpenEXR Project.
set -ex
VALGRIND_VERSION="3.15.0"
+3
View File
@@ -1,5 +1,8 @@
#!/usr/bin/env bash
# SPDX-License-Identifier: BSD-3-Clause
# Copyright Contributors to the OpenEXR Project.
set -ex
LOGDIR="$1"
@@ -1,5 +1,8 @@
#!/usr/bin/env bash
# SPDX-License-Identifier: BSD-3-Clause
# Copyright Contributors to the OpenEXR Project.
#
# Validate the library symlinks:
# * The actual elf binary is, e.g. libIlmThread-3_1.so.29.0.0
@@ -1,10 +0,0 @@
#!/usr/bin/env bash
# SPDX-License-Identifier: BSD-3-Clause
# Copyright Contributors to the OpenColorIO Project.
set -ex
HERE=$(dirname $0)
bash $HERE/install_doxygen.sh latest
pip3 install -r $HERE/../../../../../docs/requirements.txt
@@ -1,13 +0,0 @@
#!/usr/bin/env bash
# SPDX-License-Identifier: BSD-3-Clause
# Copyright Contributors to the OpenColorIO Project.
set -ex
DOXYGEN_VERSION="$1"
if [ "$DOXYGEN_VERSION" == "latest" ]; then
yum install -y doxygen
else
yum install -y doxygen-${DOXYGEN_VERSION}
fi
+109
View File
@@ -0,0 +1,109 @@
#! /bin/bash
# SPDX-License-Identifier: BSD-3-Clause
# Copyright Contributors to the OpenEXR Project.
buildtype=Debug
cflags="-ggdb3 -Og"
lib_names=(Iex IlmThread OpenEXRCore OpenEXR OpenEXRUtil)
libver_old=v3.1.7
sonames_old=(libIex-3_1_d.so.30.7.1 libIlmThread-3_1_d.so.30.7.1 libOpenEXRCore-3_1_d.so.30.7.1 libOpenEXRUtil-3_1_d.so.30.7.1 libOpenEXR-3_1_d.so.30.7.1)
libver_new=RB-3.1
sonames_new=(libIex-3_1_d.so.30.8.1 libIlmThread-3_1_d.so.30.8.1 libOpenEXRCore-3_1_d.so.30.8.1 libOpenEXRUtil-3_1_d.so.30.8.1 libOpenEXR-3_1_d.so.30.8.1)
srcdir=`pwd`
if [[ "$1" == distclean ]]; then
rm -rf abi_check
fi
mkdir -p abi_check
export PATH=${srcdir}/abi_check/bin:${PATH}
cd abi_check
if [[ ! -e bin/vtable-dumper ]]; then
mkdir -p src
cd src
git clone https://github.com/lvc/vtable-dumper
cd vtable-dumper
make
make install prefix=${srcdir}/abi_check
cd ${srcdir}/abi_check
fi
if [[ ! -e bin/abi-dumper ]]; then
mkdir -p src
cd src
git clone https://github.com/lvc/abi-dumper
cd abi-dumper
perl Makefile.pl -install --prefix=${srcdir}/abi_check
cd ${srcdir}/abi_check
fi
if [[ ! -e bin/abi-compliance-checker ]]; then
mkdir -p src
cd src
git clone https://github.com/lvc/abi-compliance-checker
cd abi-compliance-checker
perl Makefile.pl -install --prefix=${srcdir}/abi_check
cd ${srcdir}/abi_check
fi
builddir_v1=build.${libver_old}
builddir_v2=build.${libver_new}
instdir_v1=inst.${libver_old}
instdir_v2=inst.${libver_new}
if [[ "$1" == clean ]]; then
rm -rf ${builddir_v1}
rm -rf ${builddir_v2}
rm -rf ${instdir_v1}
rm -rf ${instdir_v2}
rm -rf abidumps
fi
curhash=`git branch --show-current`
if [[ "${curhash}" == "" ]]; then
curhash=`git rev-parse HEAD`
fi
if [[ ! -e ${instdir_v1} ]]; then
rm -rf ${builddir_v1}
git checkout ${libver_old} || exit 1
cmake -B ${builddir_v1} -S ${srcdir} -G Ninja -DCMAKE_BUILD_TYPE=Debug -DBUILD_TESTING=OFF -DCMAKE_C_FLAGS="${cflags}" -DCMAKE_CXX_FLAGS="${cflags}" -DCMAKE_INSTALL_PREFIX=${srcdir}/abi_check/${instdir_v1} || exit 1
ninja -C ${builddir_v1} install || exit 1
git checkout ${curhash}
fi
if [[ ! -e ${instdir_v2} ]]; then
rm -rf ${builddir_v2}
git checkout ${libver_new} || exit 1
cmake -B ${builddir_v2} -S ${srcdir} -G Ninja -DCMAKE_BUILD_TYPE=Debug -DBUILD_TESTING=OFF -DCMAKE_C_FLAGS="${cflags}" -DCMAKE_CXX_FLAGS="${cflags}" -DCMAKE_INSTALL_PREFIX=${srcdir}/abi_check/${instdir_v2} || exit 1
ninja -C ${builddir_v2} install || exit 1
git checkout ${curhash}
fi
len=${#lib_names[@]}
mkdir -p abidumps/${libver_old}
mkdir -p abidumps/${libver_new}
for (( i=0; i<$len; i++ ));
do
name=${lib_names[$i]}
echo "Processing ${name}"
abi-dumper ${instdir_v1}/lib/${sonames_old[$i]} -o abidumps/${libver_old}/ABI-${name}.dump -vnum ${libver_old} -skip-cxx -all-symbols
abi-dumper ${instdir_v2}/lib/${sonames_new[$i]} -o abidumps/${libver_new}/ABI-${name}.dump -vnum ${libver_new} -skip-cxx -all-symbols
abi-compliance-checker -l ${name} -d1 abidumps/${libver_old}/ABI-${name}.dump -v1 ${libver_old} -d2 abidumps/${libver_new}/ABI-${name}.dump -v2 ${libver_new}
done
echo "Reports should be at:"
for (( i=0; i<$len; i++ ));
do
name=${lib_names[$i]}
echo "${name}: file://${srcdir}/abi_check/compat_reports/${name}/${libver_old}_to_${libver_new}/compat_report.html"
done
+100
View File
@@ -0,0 +1,100 @@
#! /bin/bash
# SPDX-License-Identifier: BSD-3-Clause
# Copyright Contributors to the OpenEXR Project.
# This script can be used to generate a local test coverage report
# using the clang / llvm toolset for doing so
# It should hopefully be obvious how to adjust, but should work
# on most linux distros
buildtype=Debug
builddir=build.coverage
haveninja=`which ninja`
#imathoverride="-DOPENEXR_FORCE_INTERNAL_IMATH=ON -DIMATH_REPO=/home/user/Development/Imath"
# also turn on most of the warnings because we should look at that
# as well...
cwarns="-fstack-protector-all -Weverything -Wno-reserved-identifier -Wno-covered-switch-default -Wno-cast-align -Wno-overlength-strings -fprofile-arcs -fprofile-instr-generate -fcoverage-mapping"
cxxwarns="-fstack-protector-all -Wno-sign-conversion -Wno-float-equal -Wno-padded -Wno-zero-as-null-pointer-constant -Wno-old-style-cast -Wno-c++98-compat -Wno-c++98-compat-pedantic -Wno-missing-braces -fprofile-instr-generate -fcoverage-mapping"
genargs=""
if [[ "$haveninja" != "" ]]; then
genargs="-G Ninja"
fi
if [[ ! -e "${builddir}" ]]; then
export CC=/usr/bin/clang
export CXX=/usr/bin/clang++
cmake -B ${builddir} -S . ${genargs} ${imathoverride} -DCMAKE_C_FLAGS="${cwarns}" -DCMAKE_CXX_FLAGS="${cxxwarns}" -DCMAKE_BUILD_TYPE=${buildtype} || exit 1
fi
if [[ "$haveninja" != "" ]]; then
ninja -C ${builddir} || exit 1
else
nproc=`cat /proc/cpuinfo|grep processor|wc -l`
make -j${nproc} -C ${builddir} || exit 1
fi
# archive previous runs????
rm -rf coverage
/usr/bin/env LLVM_PROFILE_FILE=coverage/core.profraw build.coverage/bin/OpenEXRCoreTest || exit 1
/usr/bin/env LLVM_PROFILE_FILE=coverage/exr.profraw build.coverage/bin/OpenEXRTest || exit 1
/usr/bin/env LLVM_PROFILE_FILE=coverage/util.profraw build.coverage/bin/OpenEXRUtilTest || exit 1
llvm-profdata merge -sparse -o coverage/exr.profdata coverage/core.profraw coverage/exr.profraw coverage/util.profraw
llvm-cov show \
build.coverage/bin/OpenEXRCoreTest \
-object build.coverage/src/lib/OpenEXRCore/libOpenEXRCore-3_2_d.so \
-instr-profile=coverage/exr.profdata \
-show-regions \
-show-expansions \
--output-dir=coverage/core_only \
--format="html" \
-ignore-filename-regex='src/test/.*' \
-ignore-filename-regex='build.coverage/.*' \
-ignore-filename-regex='src/lib/OpenEXR/Imf*'
llvm-cov show \
build.coverage/bin/OpenEXRTest \
-object build.coverage/src/lib/OpenEXR/libOpenEXR-3_2_d.so \
-instr-profile=coverage/exr.profdata \
-show-regions \
-show-expansions \
--output-dir=coverage/exr_only \
--format="html" \
-ignore-filename-regex='src/test/.*' \
-ignore-filename-regex='build.coverage/.*' \
-ignore-filename-regex='src/lib/OpenEXRCore/*'
llvm-cov show \
build.coverage/bin/OpenEXRUtilTest \
-object build.coverage/src/lib/OpenEXRUtil/libOpenEXRUtil-3_2_d.so \
-instr-profile=coverage/exr.profdata \
-show-regions \
-show-expansions \
--output-dir=coverage/util_only \
--format="html" \
-ignore-filename-regex='src/test/.*' \
-ignore-filename-regex='build.coverage/.*' \
-ignore-filename-regex='src/lib/OpenEXR/Imf*' \
-ignore-filename-regex='src/lib/OpenEXRCore/*'
llvm-cov show \
build.coverage/bin/OpenEXRCoreTest \
-object build.coverage/bin/OpenEXRTest \
-object build.coverage/bin/OpenEXRUtilTest \
-object build.coverage/src/lib/OpenEXRCore/libOpenEXRCore-3_2_d.so \
-object build.coverage/src/lib/OpenEXR/libOpenEXR-3_2_d.so \
-object build.coverage/src/lib/OpenEXRUtil/libOpenEXRUtil-3_2_d.so \
-instr-profile=coverage/exr.profdata \
-show-regions \
-show-expansions \
--output-dir=coverage/combined \
--format="html" \
-ignore-filename-regex='src/test/.*' \
-ignore-filename-regex='build.coverage/.*'
-224
View File
@@ -1,224 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?fileVersion 4.0.0?>
<cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
<storageModule moduleId="org.eclipse.cdt.core.settings">
<cconfiguration id="0.1157538972">
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="0.1157538972" moduleId="org.eclipse.cdt.core.settings" name="Default">
<externalSettings/>
<extensions>
<extension id="org.eclipse.cdt.core.VCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
</extensions>
</storageModule>
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
<configuration artifactName="${ProjName}" buildProperties="" description="" id="0.1157538972" name="Default" parent="org.eclipse.cdt.build.core.prefbase.cfg">
<folderInfo id="0.1157538972." name="/" resourcePath="">
<toolChain id="org.eclipse.cdt.build.core.prefbase.toolchain.1097826404" name="No ToolChain" resourceTypeBasedDiscovery="false" superClass="org.eclipse.cdt.build.core.prefbase.toolchain">
<targetPlatform id="org.eclipse.cdt.build.core.prefbase.toolchain.1097826404.578956434" name=""/>
<builder id="org.eclipse.cdt.build.core.settings.default.builder.1380660793" keepEnvironmentInBuildfile="false" managedBuildOn="false" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="3" superClass="org.eclipse.cdt.build.core.settings.default.builder"/>
<tool id="org.eclipse.cdt.build.core.settings.holder.libs.140385122" name="holder for library settings" superClass="org.eclipse.cdt.build.core.settings.holder.libs"/>
<tool id="org.eclipse.cdt.build.core.settings.holder.1295772254" name="Assembly" superClass="org.eclipse.cdt.build.core.settings.holder">
<inputType id="org.eclipse.cdt.build.core.settings.holder.inType.1142602772" languageId="org.eclipse.cdt.core.assembly" languageName="Assembly" sourceContentType="org.eclipse.cdt.core.asmSource" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
</tool>
<tool id="org.eclipse.cdt.build.core.settings.holder.902892435" name="GNU C++" superClass="org.eclipse.cdt.build.core.settings.holder">
<inputType id="org.eclipse.cdt.build.core.settings.holder.inType.515112128" languageId="org.eclipse.cdt.core.g++" languageName="GNU C++" sourceContentType="org.eclipse.cdt.core.cxxSource,org.eclipse.cdt.core.cxxHeader" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
</tool>
<tool id="org.eclipse.cdt.build.core.settings.holder.1755992095" name="GNU C" superClass="org.eclipse.cdt.build.core.settings.holder">
<inputType id="org.eclipse.cdt.build.core.settings.holder.inType.1394057810" languageId="org.eclipse.cdt.core.gcc" languageName="GNU C" sourceContentType="org.eclipse.cdt.core.cSource,org.eclipse.cdt.core.cHeader" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
</tool>
</toolChain>
</folderInfo>
</configuration>
</storageModule>
<storageModule moduleId="scannerConfiguration">
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="makefileGenerator">
<runAction arguments="-E -P -v -dD" command="" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/${specs_file}&quot;'" command="sh" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-c 'g++ -E -P -v -dD &quot;${plugin_state_location}/specs.cpp&quot;'" command="sh" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/specs.c&quot;'" command="sh" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<scannerConfigBuildInfo instanceId="0.1157538972">
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="makefileGenerator">
<runAction arguments="-E -P -v -dD" command="" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/${specs_file}&quot;'" command="sh" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-c 'g++ -E -P -v -dD &quot;${plugin_state_location}/specs.cpp&quot;'" command="sh" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/specs.c&quot;'" command="sh" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
</scannerConfigBuildInfo>
</storageModule>
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
<storageModule moduleId="org.eclipse.cdt.core.language.mapping"/>
<storageModule moduleId="org.eclipse.cdt.make.core.buildtargets">
<buildTargets>
<target name="IlmImfTest" path="IlmImfTest" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
<buildCommand>make</buildCommand>
<buildArguments/>
<buildTarget>IlmImfTest</buildTarget>
<stopOnError>true</stopOnError>
<useDefaultCommand>true</useDefaultCommand>
<runAllBuilders>true</runAllBuilders>
</target>
</buildTargets>
</storageModule>
<storageModule moduleId="org.eclipse.cdt.internal.ui.text.commentOwnerProjectMappings"/>
</cconfiguration>
</storageModule>
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
<project id="openexr.null.1533970790" name="openexr"/>
</storageModule>
</cproject>
-28
View File
@@ -1,28 +0,0 @@
IlmImf/b44ExpLogTable
IlmImf/dwaLookups
OpenEXR.pc
autom4te.cache/
config.guess
config.log
config.status
config.sub
config/OpenEXRConfig.h
config/stamp-h1
configure
depcomp
exr2aces/exr2aces
exrbuild/exrbuild
exrenvmap/exrenvmap
exrbuild/exrbuild
exrheader/exrheader
exrmakepreview/exrmakepreview
exrmaketiled/exrmaketiled
exrmultipart/exrmultipart
exrmultiview/exrmultiview
exrstdattr/exrstdattr
install-sh
libtool
ltmain.sh
missing
.metadata/
-79
View File
@@ -1,79 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>openexr</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
<triggers>clean,full,incremental,</triggers>
<arguments>
<dictionary>
<key>?name?</key>
<value></value>
</dictionary>
<dictionary>
<key>org.eclipse.cdt.make.core.append_environment</key>
<value>true</value>
</dictionary>
<dictionary>
<key>org.eclipse.cdt.make.core.autoBuildTarget</key>
<value>all</value>
</dictionary>
<dictionary>
<key>org.eclipse.cdt.make.core.buildArguments</key>
<value>-j3</value>
</dictionary>
<dictionary>
<key>org.eclipse.cdt.make.core.buildCommand</key>
<value>make</value>
</dictionary>
<dictionary>
<key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
<value>clean</value>
</dictionary>
<dictionary>
<key>org.eclipse.cdt.make.core.contents</key>
<value>org.eclipse.cdt.make.core.activeConfigSettings</value>
</dictionary>
<dictionary>
<key>org.eclipse.cdt.make.core.enableAutoBuild</key>
<value>false</value>
</dictionary>
<dictionary>
<key>org.eclipse.cdt.make.core.enableCleanBuild</key>
<value>true</value>
</dictionary>
<dictionary>
<key>org.eclipse.cdt.make.core.enableFullBuild</key>
<value>true</value>
</dictionary>
<dictionary>
<key>org.eclipse.cdt.make.core.fullBuildTarget</key>
<value>all</value>
</dictionary>
<dictionary>
<key>org.eclipse.cdt.make.core.stopOnError</key>
<value>true</value>
</dictionary>
<dictionary>
<key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
<value>true</value>
</dictionary>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
<triggers>full,incremental,</triggers>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.cdt.core.cnature</nature>
<nature>org.eclipse.cdt.core.ccnature</nature>
<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
</natures>
</projectDescription>
+60 -44
View File
@@ -13,6 +13,8 @@
#include <ImfAcesFile.h>
#include <ImfArray.h>
#include <ImfRgbaFile.h>
#include <ImfMisc.h>
#include <OpenEXRConfig.h>
#include <exception>
#include <iostream>
#include <stdlib.h>
@@ -28,44 +30,38 @@ namespace
{
void
usageMessage (const char argv0[], bool verbose = false)
usageMessage (ostream& stream, const char* program_name, bool verbose = false)
{
cerr << "Usage: " << argv0 << " [options] infile outfile" << endl;
stream << "Usage: " << program_name << " [options] infile outfile" << endl;
if (verbose)
{
cerr << "\n"
"Reads an OpenEXR file from infile and saves the contents\n"
"in ACES image file outfile.\n"
"\n"
"The ACES image file format is a subset of the OpenEXR file\n"
"format. ACES image files are restricted as follows:\n"
"\n"
"* Images are stored as scanlines; tiles are not allowed.\n"
"\n"
"* Images contain three color channels, either\n"
" R, G, B (red, green, blue) or\n"
" Y, RY, BY (luminance, sub-sampled chroma)\n"
"\n"
"* Images may optionally contain an alpha channel.\n"
"\n"
"* Only three compression types are allowed:\n"
" NO_COMPRESSION (file is not compressed)\n"
" PIZ_COMPRESSION (lossless)\n"
" B44A_COMPRESSION (lossy)\n"
"* The \"chromaticities\" header attribute must specify\n"
" the ACES RGB primaries and white point.\n"
"\n"
"Options:\n"
"\n"
"-v verbose mode\n"
"\n"
"-h prints this message\n";
cerr << endl;
}
exit (1);
stream << "\n"
"Read an OpenEXR file from infile and save the contents\n"
"in ACES image file outfile.\n"
"\n"
"The ACES image file format is a subset of the OpenEXR file\n"
"format. ACES image files are restricted as follows:\n"
"\n"
" * Images are stored as scanlines; tiles are not allowed.\n"
" * Images contain three color channels, either:\n"
" R, G, B (red, green, blue)\n"
" or:\n"
" Y, RY, BY (luminance, sub-sampled chroma)\n"
" * Images may optionally contain an alpha channel.\n"
" * Only three compression types are allowed:\n"
" NO_COMPRESSION (file is not compressed)\n"
" PIZ_COMPRESSION (lossless)\n"
" B44A_COMPRESSION (lossy)\n"
" * The \"chromaticities\" header attribute must specify\n"
" the ACES RGB primaries and white point.\n"
"\n"
"Options:\n"
" -v, --verbose verbose mode\n"
" -h, --help print this message\n"
" --version print version information\n"
"\n"
"Report bugs via https://github.com/AcademySoftwareFoundation/openexr/issues or email security@openexr.com\n"
"";
}
void
@@ -128,7 +124,11 @@ main (int argc, char** argv)
// Parse the command line.
//
if (argc < 2) usageMessage (argv[0], true);
if (argc < 2)
{
usageMessage (cerr, argv[0], false);
return -1;
}
int i = 1;
@@ -143,13 +143,27 @@ main (int argc, char** argv)
verbose = true;
i += 1;
}
else if (!strcmp (argv[i], "-h"))
else if (!strcmp (argv[i], "-h") || !strcmp (argv[i], "--help"))
{
//
// Print help message
//
usageMessage (argv[0], true);
usageMessage (cout, "exr2aces", true);
return 0;
}
else if (!strcmp (argv[i], "--version"))
{
const char* libraryVersion = getLibraryVersion();
cout << "exr2aces (OpenEXR) " << OPENEXR_VERSION_STRING;
if (strcmp(libraryVersion, OPENEXR_VERSION_STRING))
cout << "(OpenEXR version " << libraryVersion << ")";
cout << " https://openexr.com" << endl;
cout << "Copyright (c) Contributors to the OpenEXR Project" << endl;
cout << "License BSD-3-Clause" << endl;
return 0;
}
else
{
@@ -166,23 +180,25 @@ main (int argc, char** argv)
}
}
if (inFile == 0 || outFile == 0) usageMessage (argv[0]);
if (inFile == 0 || outFile == 0)
{
usageMessage (cerr, argv[0], false);
return -1;
}
//
// Load inFile, and save a tiled version in outFile.
//
int exitStatus = 0;
try
{
exr2aces (inFile, outFile, verbose);
}
catch (const exception& e)
{
cerr << e.what () << endl;
exitStatus = 1;
cerr << argv[0] << ": " << e.what () << endl;
return 1;
}
return exitStatus;
return 0;
}
-524
View File
@@ -1,524 +0,0 @@
//
// SPDX-License-Identifier: BSD-3-Clause
// Copyright (c) Weta Digital, Ltd and Contributors to the OpenEXR Project.
//
#include <ImfChannelList.h>
#include <ImfDeepFrameBuffer.h>
#include <ImfDeepScanLineInputPart.h>
#include <ImfDeepScanLineOutputPart.h>
#include <ImfInputPart.h>
#include <ImfMultiPartInputFile.h>
#include <ImfMultiPartOutputFile.h>
#include <ImfMultiView.h>
#include <ImfOutputPart.h>
#include <ImfPartType.h>
#include <ImfStandardAttributes.h>
#include <ImfStringAttribute.h>
#include <ImfTiledInputPart.h>
#include <ImfTiledOutputPart.h>
#include <iostream>
#include <stdlib.h>
#include <vector>
#include <OpenEXRConfig.h>
using namespace OPENEXR_IMF_NAMESPACE;
//
// constructs new EXRs from parts of others
// this code is deliberately inefficient - it decompresses
// and recompresses the file
//
//
using std::cerr;
using std::endl;
using std::max;
using std::min;
using std::ostringstream;
using std::set;
using std::string;
using std::vector;
void
copy_tiledimage (
MultiPartInputFile& input,
MultiPartOutputFile& output,
int inPart,
int outPart,
const std::string& inview = std::string (""))
{
int buffer_size;
FrameBuffer inFrameBuffer;
FrameBuffer outFrameBuffer;
TiledInputPart in (input, inPart);
TiledOutputPart out (output, outPart);
const Header& inhdr = input.header (inPart);
int channels = 0;
for (ChannelList::ConstIterator i = inhdr.channels ().begin ();
i != inhdr.channels ().end ();
++i)
++channels;
int x_levels = 0;
int y_levels = 0;
TileDescription t = inhdr.tileDescription ();
StringVector views;
if (hasMultiView (inhdr)) { views = multiView (inhdr); }
switch (t.mode)
{
case ONE_LEVEL:
x_levels = 1;
y_levels = 1;
break;
case MIPMAP_LEVELS:
x_levels = t.xSize;
y_levels = 1;
break;
case RIPMAP_LEVELS: x_levels = t.xSize; y_levels = t.ySize;
}
for (int x_level = 0; x_level < x_levels; x_level++)
{
for (int y_level = 0; y_level < y_levels; y_level++)
{
int actual_y_level = t.mode == RIPMAP_LEVELS ? y_level : x_level;
IMATH_NAMESPACE::Box2i dw =
in.dataWindowForLevel (x_level, actual_y_level);
int width = dw.max.x - dw.min.x + 1;
int height = dw.max.y - dw.min.y + 1;
int y = dw.min.y;
int x = dw.min.x;
// allocate at least enough memory to handle the data
// (biggest data is four bytes)
// we store the channels separately, one after the other
buffer_size = 4 * width * height * channels;
char* channelbuf = new char[buffer_size];
// pointer to where we put the first byte
char* bufptr = channelbuf;
for (ChannelList::ConstIterator i = inhdr.channels ().begin ();
i != inhdr.channels ().end ();
++i)
{
if (inview == "" || views.size () == 0 ||
viewFromChannelName (i.name (), views) == inview)
{
inFrameBuffer.insert (
i.name (),
Slice (
i.channel ().type,
bufptr - (y * width + x) * 4,
4,
width * 4));
outFrameBuffer.insert (
removeViewName (i.name (), inview),
Slice (
i.channel ().type,
bufptr - (y * width + x) * 4,
4,
width * 4));
bufptr += width * height * 4;
}
}
in.setFrameBuffer (inFrameBuffer);
out.setFrameBuffer (outFrameBuffer);
//
// copy tiles for level
//
for (int tileY = 0; tileY < out.numYTiles (actual_y_level); ++tileY)
for (int tileX = 0; tileX < out.numXTiles (x_level); ++tileX)
{
memset (channelbuf, 20, width * height * channels * 4);
in.readTile (tileX, tileY, x_level, actual_y_level);
out.writeTile (tileX, tileY, x_level, actual_y_level);
}
delete[] channelbuf;
}
}
}
void
copy_scanlineimage (
MultiPartInputFile& input,
MultiPartOutputFile& output,
int inPart,
int outPart,
const std::string& inview = std::string (""))
{
int buffer_size;
FrameBuffer inFrameBuffer;
FrameBuffer outFrameBuffer;
InputPart in (input, inPart);
OutputPart out (output, outPart);
const Header& inhdr = input.header (inPart);
int channels = 0;
for (ChannelList::ConstIterator i = inhdr.channels ().begin ();
i != inhdr.channels ().end ();
++i)
++channels;
int width = inhdr.dataWindow ().max.x - inhdr.dataWindow ().min.x + 1;
int height = inhdr.dataWindow ().max.y - inhdr.dataWindow ().min.y + 1;
int y = inhdr.dataWindow ().min.y;
int x = inhdr.dataWindow ().min.x;
//allocate at least enough memory to handle the data
//(biggest data is four bytes)
// we store the channels separately, one after the other
buffer_size = 4 * width * height * channels;
char* channelbuf = new char[buffer_size];
// now iterate over each channel and hook it all up
// pointer to where we put the first byte
char* bufptr = channelbuf;
StringVector views;
if (hasMultiView (inhdr)) { views = multiView (inhdr); }
for (ChannelList::ConstIterator i = inhdr.channels ().begin ();
i != inhdr.channels ().end ();
++i)
{
if (inview == "" || views.size () == 0 ||
viewFromChannelName (i.name (), views) == inview)
{
inFrameBuffer.insert (
i.name (),
Slice (
i.channel ().type,
bufptr - (y * width + x) * 4,
4,
width * 4));
outFrameBuffer.insert (
removeViewName (i.name (), inview),
Slice (
i.channel ().type,
bufptr - (y * width + x) * 4,
4,
width * 4));
}
bufptr += width * height * 4;
}
in.setFrameBuffer (inFrameBuffer);
out.setFrameBuffer (outFrameBuffer);
for (int row = inhdr.dataWindow ().min.y; row <= inhdr.dataWindow ().max.y;
row++)
{
in.readPixels (row);
out.writePixels (1);
}
delete[] channelbuf;
}
void
copy_scanlinedeep (
MultiPartInputFile& input,
MultiPartOutputFile& output,
int inPart,
int outPart)
{
DeepFrameBuffer inFrameBuffer;
DeepFrameBuffer outFrameBuffer;
DeepScanLineInputPart in (input, inPart);
DeepScanLineOutputPart out (output, outPart);
const Header& header = input.header (inPart);
int channels = 0;
for (ChannelList::ConstIterator i = header.channels ().begin ();
i != header.channels ().end ();
++i)
++channels;
int width = header.dataWindow ().max.x - header.dataWindow ().min.x + 1;
int height = header.dataWindow ().max.y - header.dataWindow ().min.y + 1;
int y = header.dataWindow ().min.y;
int x = header.dataWindow ().min.x;
//allocate enough memory to handle the sample counts for every pixel in the image
int counter_size = width * height;
int* countbuf = new int[counter_size];
//
//allocate enough memory to handle the pointers for every channel of every pixel in the image
//
int pointer_size = width * height * channels;
char** pointerbuf = new char*[pointer_size];
inFrameBuffer.insertSampleCountSlice (Slice (
UINT,
(char*) (countbuf - (y * width + x)),
sizeof (unsigned int) * 1, // xStride
sizeof (unsigned int) * width)); // yStride
outFrameBuffer.insertSampleCountSlice (Slice (
UINT,
(char*) (countbuf - (y * width + x)),
sizeof (unsigned int) * 1, // xStride
sizeof (unsigned int) * width)); // yStride
// for simplicity, allocate 4 bytes per channel per sample (even though halfs only take two)
// pointers are interleaved -pointers for all channels of pixel 0 go first, then pixel 1 etc
// within the data vector, samples will be stored contiguously (i.e. channels are interleaved)
int channel = 0;
for (ChannelList::ConstIterator i = header.channels ().begin ();
i != header.channels ().end ();
++i)
{
inFrameBuffer.insert (
i.name (),
DeepSlice (
i.channel ().type,
((char*) pointerbuf) -
((y * width + x) * channels + channel) * 4,
4 * channels,
width * 4 * channels,
4 * channels));
outFrameBuffer.insert (
i.name (),
DeepSlice (
i.channel ().type,
((char*) pointerbuf) -
((y * width + x) * channels + channel) * 4,
4 * channels,
width * 4 * channels,
4 * channels));
channel++;
}
in.setFrameBuffer (inFrameBuffer);
out.setFrameBuffer (outFrameBuffer);
//
// read the entire sample count array
//
in.readPixelSampleCounts (
header.dataWindow ().min.y, header.dataWindow ().max.y);
vector<char> samples;
int* count_start = countbuf; // pointer to first sample count in the image
char** pointer_start = pointerbuf;
//
// loop over each row of the image - at each row, allocate storage for this row only
// within the sample array
// we can reuse the array every row, so we only need as much memory as is required for the largest row
//
for (int row = header.dataWindow ().min.y;
row <= header.dataWindow ().max.y;
row++)
{
// count samples on the row
int count = 0;
for (int x = header.dataWindow ().min.x;
x <= header.dataWindow ().max.x;
x++)
count += count_start[x];
// allocate enough data for that row
samples.resize (count * channels);
// set pointers for row
count = 0;
for (int x = header.dataWindow ().min.x;
x <= header.dataWindow ().max.x;
x++)
{
for (int i = 0; i < channels; i++)
{
pointer_start[x * channels + i] =
&samples[count * channels + i];
}
count += count_start[x];
}
//
// set pointers for row z
//
in.readPixels (row);
out.writePixels (1);
// bump pointers to next row
count_start += width;
pointer_start += width * channels;
}
delete[] countbuf;
delete[] pointerbuf;
}
void
make_unique_names (vector<Header>& headers)
{
set<string> names;
for (size_t i = 0; i < headers.size (); i++)
{
std::string base_name;
// if no name at all, set it to <type><partnum> (first part is part 1)
if (!headers[i].hasName ())
{
ostringstream s;
s << headers[i].type () << (i + 1);
base_name = s.str ();
headers[i].setName (base_name);
}
else
{
base_name = headers[i].name ();
}
// check name hasn't already been used, if so add a _<number> to it
if (names.find (base_name) != names.end ())
{
ostringstream s;
size_t backup = 1;
do
{
s.clear ();
s << headers[i].type () << i << "_" << backup;
backup++;
} while (names.find (s.str ()) != names.end ());
headers[i].setName (s.str ());
}
}
}
int
main (int argc, char* argv[])
{
if (argc < 3)
{
cerr
<< argv[0]
<< " takes a collection of EXR images and outputs them as a single multipart EXR\n";
cerr
<< std::string (strlen (argv[0]), ' ') << " syntax: " << argv[0]
<< " [input.exr[:partnum[.view]]] [input2.exr[:partnum[.view]]] ... output.exr\n";
exit (1);
}
int numInputs = argc - 2;
vector<int> partnums (numInputs);
vector<MultiPartInputFile*> inputs (numInputs);
vector<Header> headers (numInputs);
vector<string> views (numInputs);
//
// parse all inputs
//
//
for (int i = 0; i < numInputs; i++)
{
// if input is <file>:<partnum>[.view] then extract part number (and also view if preset), else get part 0
string filename (argv[i + 1]);
size_t colon = filename.rfind (':');
if (colon == string::npos) { partnums[i] = 0; }
else
{
string num = filename.substr (colon + 1);
partnums[i] = atoi (num.c_str ());
filename = filename.substr (0, colon);
size_t dot = num.rfind ('.');
if (dot != string::npos) { views[i] = num.substr (dot + 1); }
}
// open and check
inputs[i] = new MultiPartInputFile (filename.c_str ());
if (partnums[i] >= inputs[i]->parts ())
{
std::cerr << "oops: you asked for part " << partnums[i] << " in "
<< argv[1 + i] << ", which only has "
<< inputs[i]->parts () << " parts\n";
exit (1);
}
//copy header from required part of input to our header array
headers[i] = inputs[i]->header (partnums[i]);
if (views[i] != "")
{
if (hasMultiView (headers[i]))
{
StringVector multiview = multiView (headers[i]);
ChannelList newList;
//
// also clean up channel names
//
for (ChannelList::Iterator c = headers[i].channels ().begin ();
c != headers[i].channels ().end ();
++c)
{
if (viewFromChannelName (c.name (), multiview) == views[i])
{
newList.insert (
removeViewName (c.name (), views[i]), c.channel ());
}
}
headers[i].channels () = newList;
headers[i].erase ("multiView");
}
headers[i].setView (views[i]);
}
}
// sort out names - make unique
if (numInputs > 1) { make_unique_names (headers); }
MultiPartOutputFile out (
argv[argc - 1], &headers[0], headers.size (), false, 4);
for (int p = 0; p < numInputs; p++)
{
//todo - this only works for regular images - make one of these
//for every type of data
Header header = headers[p];
std::string type = header.type ();
if (type == SCANLINEIMAGE)
{
copy_scanlineimage (*inputs[p], out, partnums[p], p, views[p]);
}
else if (type == TILEDIMAGE)
{
copy_tiledimage (*inputs[p], out, partnums[p], p, views[p]);
}
else if (type == DEEPSCANLINE)
{
copy_scanlinedeep (*inputs[p], out, partnums[p], p);
}
} //next part
}
+37 -30
View File
@@ -3,10 +3,13 @@
#include <ImathConfig.h>
#include <ImfCheckFile.h>
#include <ImfMisc.h>
#include <OpenEXRConfig.h>
#include <cstdint>
#include <fstream>
#include <iostream>
#include <ostream>
#include <string.h>
#if defined _WIN32 || defined _WIN64
# include <io.h>
@@ -16,25 +19,27 @@
#include <vector>
using namespace OPENEXR_IMF_NAMESPACE;
using std::cerr;
using std::cout;
using std::endl;
using std::ifstream;
using std::streampos;
using std::vector;
using namespace std;
void
usageMessage (const char argv0[])
usageMessage (ostream& stream, const char* program_name, bool verbose = false)
{
cerr << "Usage: " << argv0 << " [options] imagefile [imagefile ...]\n";
cerr << "options: \n";
cerr
<< " -m : avoid excessive memory allocation (some files will not be fully checked)\n";
cerr
<< " -t : avoid spending excessive time (some files will not be fully checked)\n";
cerr << " -s : use stream API instead of file API\n";
cerr << " -c : add core library checks\n";
cerr << " -v : print OpenEXR and Imath software library version info\n";
stream << "Usage: " << program_name << " [options] imagefile [imagefile ...]\n";
if (verbose)
stream << "\n"
"Read exr files to validate their contents and the correct behavior of the software.\n"
"\n"
"Options:\n"
" -m avoid excessive memory allocation (some files will not be fully checked)\n"
" -t avoid spending excessive time (some files will not be fully checked)\n"
" -s use stream API instead of file API\n"
" -c add core library checks\n"
" -h, --help print this message\n"
" --version print version information\n"
"\n"
"Report bugs via https://github.com/AcademySoftwareFoundation/openexr/issues or email security@openexr.com\n"
"";
}
bool
@@ -96,7 +101,7 @@ main (int argc, char** argv)
{
if (argc < 2)
{
usageMessage (argv[0]);
usageMessage (cerr, argv[0], false);
return 1;
}
@@ -107,10 +112,10 @@ main (int argc, char** argv)
bool useStream = false;
for (int i = 1; i < argc; ++i)
{
if (!strcmp (argv[i], "-h"))
if (!strcmp (argv[i], "-h") || !strcmp (argv[i], "--help"))
{
usageMessage (argv[0]);
return 1;
usageMessage (cout, "exrcheck", true);
return 0;
}
else if (!strcmp (argv[i], "-m"))
{
@@ -135,16 +140,18 @@ main (int argc, char** argv)
{
enableCoreCheck = true;
}
else if (!strcmp (argv[i], "-v"))
else if (!strcmp (argv[i], "--version"))
{
std::cout << OPENEXR_PACKAGE_STRING
<< " Lib API: " << OPENEXR_LIB_VERSION_STRING << ", "
<< IMATH_PACKAGE_STRING
#if defined(IMATH_LIB_VERSION_STRING)
<< " Lib API: " << IMATH_LIB_VERSION_STRING
#endif
<< std::endl;
exit (0);
const char* libraryVersion = getLibraryVersion();
cout << "exrcheck (OpenEXR) " << OPENEXR_VERSION_STRING;
if (strcmp(libraryVersion, OPENEXR_VERSION_STRING))
cout << "(OpenEXR version " << libraryVersion << ")";
cout << " https://openexr.com" << endl;
cout << "Copyright (c) Contributors to the OpenEXR Project" << endl;
cout << "License BSD-3-Clause" << endl;
return 0;
}
else
{
@@ -156,7 +163,7 @@ main (int argc, char** argv)
#endif
{
cerr << "No such file: " << argv[i] << endl;
exit (-1);
return -1;
}
cout << " file " << argv[i] << ' ';
+328 -313
View File
@@ -12,12 +12,16 @@
#include <EnvmapImage.h>
#include <ImfEnvmap.h>
#include <ImfHeader.h>
#include <ImfMisc.h>
#include <OpenEXRConfig.h>
#include <blurImage.h>
#include <makeCubeMap.h>
#include <makeLatLongMap.h>
#include <exception>
#include <stdexcept>
#include <iostream>
#include <sstream>
#include <stdlib.h>
#include <string.h>
#include <string>
@@ -30,102 +34,103 @@ namespace
{
void
usageMessage (const char argv0[], bool verbose = false)
usageMessage (ostream& stream, const char* program_name, bool verbose = false)
{
cerr << "Usage: " << argv0 << " [options] infile outfile" << endl;
stream << "Usage: " << program_name << " [options] infile outfile" << endl;
if (verbose)
{
cerr << "\n"
"Converts OpenEXR latitude-longitude environment maps\n"
"into cube-face environment maps or vice versa.\n"
"Reads an environment map image from infile, converts\n"
"it, and stores the result in outfile.\n"
"\n"
"If the input file name contains a '%' character, then an\n"
"input cube-face environment map is assembled from six\n"
"square sub-images that represent the six faces of the cube.\n"
"The names of the six image files are generated by replacing\n"
"the % with +X, -X, +Y, -Y, +Z and -Z respectively.\n"
"\n"
"If the output file name contains a '%' character and\n"
"the program has been instructed to produce a cube-face\n"
"environment map, then the output image is split into six\n"
"square sub-images that are saved in six separate output\n"
"files. The names of the files are generated by replacing\n"
"the % with +X, -X, +Y, -Y, +Z and -Z respectively.\n"
"\n"
"Options:\n"
"\n"
"-o produces a ONE_LEVEL output file (default)\n"
"\n"
"-m produces a MIPMAP_LEVELS output file (-m has\n"
" no effect if the output image is split into\n"
" multiple files)\n"
"\n"
"-c the output file will be a cube-face environment\n"
" map (default)\n"
"\n"
"-l the output file will be a latitude-longitude\n"
" environment map\n"
"\n"
"-ci the input file is interpreted as a cube-face\n"
" environment map, regardless of its envmap\n"
" attribute\n"
"\n"
"-li the input file is interpreted as a latitude-\n"
" longitude environment map, regardless of its\n"
" envmap attribute (-li has no effect if the\n"
" input image is assembled from multiple files)\n"
"\n"
"-w x sets the width of the output image to x pixels\n"
" (default is 256). The height of the output image\n"
" will be x*6 pixels for a cube-face map, or x/2\n"
" pixels for a latitude-longitude map.\n"
"\n"
"-f r n sets the antialiasing filter radius to r\n"
" (default is 1.0) and the sampling rate to\n"
" n by n (default is 5 by 5). Increasing r\n"
" makes the output image blurrier; decreasing r\n"
" makes the image sharper but may cause aliasing.\n"
" Increasing n improves antialiasing, but\n"
" generating the output image takes longer.\n"
"\n"
"-b blurs the environment map image by applying a\n"
" 180-degree-wide filter kernel such that point-\n"
" sampling the blurred image at a location that\n"
" corresponds to 3D direction N returns the color\n"
" that a white diffuse reflector with surface\n"
" normal N would have if it was illuminated using\n"
" the original non-blurred image.\n"
" Generating the blurred image can be fairly slow.\n"
"\n"
"-t x y sets the output file's tile size to x by y pixels\n"
" (default is 64 by 64)\n"
"\n"
"-p t b if the input image is a latitude-longitude map,\n"
" pad the image at the top and bottom with t*h\n"
" and b*h extra scan lines, where h is the height\n"
" of the input image. This is useful for images\n"
" from 360-degree panoramic scans that cover\n"
" less than 180 degrees vertically.\n"
"\n"
"-d sets level size rounding to ROUND_DOWN (default)\n"
"\n"
"-u sets level size rounding to ROUND_UP\n"
"\n"
"-z x sets the data compression method to x\n"
" (none/rle/zip/piz/pxr24/b44/b44a/dwaa/dwab,\n"
" default is zip)\n"
"\n"
"-v verbose mode\n"
"\n"
"-h prints this message\n";
cerr << endl;
stream << "\n"
"Convert an OpenEXR latitude-longitude environment map\n"
"into a cube-face environment map or vice versa.\n"
"Reads an environment map image from infile, converts\n"
"it, and stores the result in outfile.\n"
"\n"
"If the input file name contains a '%' character, then an\n"
"input cube-face environment map is assembled from six\n"
"square sub-images that represent the six faces of the cube.\n"
"The names of the six image files are generated by replacing\n"
"the % with +X, -X, +Y, -Y, +Z and -Z respectively.\n"
"\n"
"If the output file name contains a '%' character and\n"
"the program has been instructed to produce a cube-face\n"
"environment map, then the output image is split into six\n"
"square sub-images that are saved in six separate output\n"
"files. The names of the files are generated by replacing\n"
"the % with +X, -X, +Y, -Y, +Z and -Z respectively.\n"
"\n"
"Options:\n"
"\n"
" -o produces a ONE_LEVEL output file (default)\n"
"\n"
" -m produces a MIPMAP_LEVELS output file (-m has\n"
" no effect if the output image is split into\n"
" multiple files)\n"
"\n"
" -c the output file will be a cube-face environment\n"
" map (default)\n"
"\n"
" -l the output file will be a latitude-longitude\n"
" environment map\n"
"\n"
" -ci the input file is interpreted as a cube-face\n"
" environment map, regardless of its envmap\n"
" attribute\n"
"\n"
" -li the input file is interpreted as a latitude-\n"
" longitude environment map, regardless of its\n"
" envmap attribute (-li has no effect if the\n"
" input image is assembled from multiple files)\n"
"\n"
" -w x sets the width of the output image to x pixels\n"
" (default is 256). The height of the output image\n"
" will be x*6 pixels for a cube-face map, or x/2\n"
" pixels for a latitude-longitude map.\n"
"\n"
" -f r n sets the antialiasing filter radius to r\n"
" (default is 1.0) and the sampling rate to\n"
" n by n (default is 5 by 5). Increasing r\n"
" makes the output image blurrier; decreasing r\n"
" makes the image sharper but may cause aliasing.\n"
" Increasing n improves antialiasing, but\n"
" generating the output image takes longer.\n"
"\n"
" -b blurs the environment map image by applying a\n"
" 180-degree-wide filter kernel such that point-\n"
" sampling the blurred image at a location that\n"
" corresponds to 3D direction N returns the color\n"
" that a white diffuse reflector with surface\n"
" normal N would have if it was illuminated using\n"
" the original non-blurred image.\n"
" Generating the blurred image can be fairly slow.\n"
"\n"
" -t x y sets the output file's tile size to x by y pixels\n"
" (default is 64 by 64)\n"
"\n"
" -p t b if the input image is a latitude-longitude map,\n"
" pad the image at the top and bottom with t*h\n"
" and b*h extra scan lines, where h is the height\n"
" of the input image. This is useful for images\n"
" from 360-degree panoramic scans that cover\n"
" less than 180 degrees vertically.\n"
"\n"
" -d sets level size rounding to ROUND_DOWN (default)\n"
"\n"
" -u sets level size rounding to ROUND_UP\n"
"\n"
" -z x sets the data compression method to x\n"
" (none/rle/zip/piz/pxr24/b44/b44a/dwaa/dwab,\n"
" default is zip)\n"
"\n"
" -v verbose mode\n"
"\n"
" -h, --help print this message\n"
"\n"
" --version print version information\n"
"\n"
"Report bugs via https://github.com/AcademySoftwareFoundation/openexr/issues or email security@openexr.com\n"
"";
}
exit (1);
}
Compression
@@ -171,8 +176,9 @@ getCompression (const string& str)
}
else
{
cerr << "Unknown compression method \"" << str << "\"." << endl;
exit (1);
std::stringstream e;
e << "Unknown compression method \"" << str << "\"";
throw invalid_argument(e.str().c_str());
}
return c;
@@ -204,227 +210,236 @@ main (int argc, char** argv)
// Parse the command line.
//
if (argc < 2) usageMessage (argv[0], true);
int i = 1;
while (i < argc)
if (argc < 2)
{
if (!strcmp (argv[i], "-o"))
{
//
// generate a ONE_LEVEL image
//
levelMode = ONE_LEVEL;
i += 1;
}
else if (!strcmp (argv[i], "-m"))
{
//
// Generate a MIPMAP_LEVELS image
//
levelMode = MIPMAP_LEVELS;
i += 1;
}
else if (!strcmp (argv[i], "-c"))
{
//
// Generate a cube-face map
//
type = ENVMAP_CUBE;
i += 1;
}
else if (!strcmp (argv[i], "-l"))
{
//
// Generate a latitude-longitude map
//
type = ENVMAP_LATLONG;
i += 1;
}
else if (!strcmp (argv[i], "-ci"))
{
//
// Assume input is a cube-face map
//
overrideInputType = ENVMAP_CUBE;
i += 1;
}
else if (!strcmp (argv[i], "-li"))
{
//
// Assume input is a latitude-longitude map
//
overrideInputType = ENVMAP_LATLONG;
i += 1;
}
else if (!strcmp (argv[i], "-w"))
{
//
// Set output image width
//
if (i > argc - 2) usageMessage (argv[0]);
mapWidth = strtol (argv[i + 1], 0, 0);
if (mapWidth <= 0)
{
cerr << "Output image width must be greater than zero." << endl;
return 1;
}
i += 2;
}
else if (!strcmp (argv[i], "-f"))
{
//
// Set filter radius and supersampling rate
//
if (i > argc - 3) usageMessage (argv[0]);
filterRadius = strtod (argv[i + 1], 0);
numSamples = strtol (argv[i + 2], 0, 0);
if (filterRadius < 0)
{
cerr << "Filter radius must not be less than zero." << endl;
return 1;
}
if (numSamples <= 0)
{
cerr << "Sampling rate must be greater than zero." << endl;
return 1;
}
i += 3;
}
else if (!strcmp (argv[i], "-b"))
{
//
// Diffuse blur
//
diffuseBlur = true;
i += 1;
}
else if (!strcmp (argv[i], "-t"))
{
//
// Set tile size
//
if (i > argc - 3) usageMessage (argv[0]);
tileWidth = strtol (argv[i + 1], 0, 0);
tileHeight = strtol (argv[i + 2], 0, 0);
if (tileWidth <= 0 || tileHeight <= 0)
{
cerr << "Tile size must be greater than zero." << endl;
return 1;
}
i += 3;
}
else if (!strcmp (argv[i], "-p"))
{
//
// Set top and bottom padding
//
if (i > argc - 3) usageMessage (argv[0]);
padTop = strtod (argv[i + 1], 0);
padBottom = strtod (argv[i + 2], 0);
if (padTop < 0 || padBottom < 0)
{
cerr << "Padding must not be less than zero." << endl;
return 1;
}
i += 3;
}
else if (!strcmp (argv[i], "-d"))
{
//
// Round down
//
roundingMode = ROUND_DOWN;
i += 1;
}
else if (!strcmp (argv[i], "-u"))
{
//
// Round down
//
roundingMode = ROUND_UP;
i += 1;
}
else if (!strcmp (argv[i], "-z"))
{
//
// Set compression method
//
if (i > argc - 2) usageMessage (argv[0]);
compression = getCompression (argv[i + 1]);
i += 2;
}
else if (!strcmp (argv[i], "-v"))
{
//
// Verbose mode
//
verbose = true;
i += 1;
}
else if (!strcmp (argv[i], "-h"))
{
//
// Print help message
//
usageMessage (argv[0], true);
}
else
{
//
// Image file name
//
if (inFile == 0)
inFile = argv[i];
else
outFile = argv[i];
i += 1;
}
usageMessage (cerr, argv[0], false);
return -1;
}
if (inFile == 0 || outFile == 0) usageMessage (argv[0]);
//
// Load inFile, convert it, and save the result in outFile.
//
int exitStatus = 0;
try
{
int i = 1;
while (i < argc)
{
if (!strcmp (argv[i], "-o"))
{
//
// generate a ONE_LEVEL image
//
levelMode = ONE_LEVEL;
i += 1;
}
else if (!strcmp (argv[i], "-m"))
{
//
// Generate a MIPMAP_LEVELS image
//
levelMode = MIPMAP_LEVELS;
i += 1;
}
else if (!strcmp (argv[i], "-c"))
{
//
// Generate a cube-face map
//
type = ENVMAP_CUBE;
i += 1;
}
else if (!strcmp (argv[i], "-l"))
{
//
// Generate a latitude-longitude map
//
type = ENVMAP_LATLONG;
i += 1;
}
else if (!strcmp (argv[i], "-ci"))
{
//
// Assume input is a cube-face map
//
overrideInputType = ENVMAP_CUBE;
i += 1;
}
else if (!strcmp (argv[i], "-li"))
{
//
// Assume input is a latitude-longitude map
//
overrideInputType = ENVMAP_LATLONG;
i += 1;
}
else if (!strcmp (argv[i], "-w"))
{
//
// Set output image width
//
if (i > argc - 2)
throw invalid_argument("Missing width for -w argument");
mapWidth = strtol (argv[i + 1], 0, 0);
if (mapWidth <= 0)
throw invalid_argument("Output image width must be greater than zero");
i += 2;
}
else if (!strcmp (argv[i], "-f"))
{
//
// Set filter radius and supersampling rate
//
if (i > argc - 3)
throw invalid_argument("Missing filter radius with -f option");
filterRadius = strtod (argv[i + 1], 0);
numSamples = strtol (argv[i + 2], 0, 0);
if (filterRadius < 0)
throw invalid_argument("Filter radius must not be less than zero");
if (numSamples <= 0)
throw invalid_argument("Sampling rate must be greater than zero");
i += 3;
}
else if (!strcmp (argv[i], "-b"))
{
//
// Diffuse blur
//
diffuseBlur = true;
i += 1;
}
else if (!strcmp (argv[i], "-t"))
{
//
// Set tile size
//
if (i > argc - 3)
throw invalid_argument("missing tile size with -t option");
tileWidth = strtol (argv[i + 1], 0, 0);
tileHeight = strtol (argv[i + 2], 0, 0);
if (tileWidth <= 0 || tileHeight <= 0)
throw invalid_argument("Tile size must be greater than zero");
i += 3;
}
else if (!strcmp (argv[i], "-p"))
{
//
// Set top and bottom padding
//
if (i > argc - 3)
throw invalid_argument("missing padding value with -p option");
padTop = strtod (argv[i + 1], 0);
padBottom = strtod (argv[i + 2], 0);
if (padTop < 0 || padBottom < 0)
throw invalid_argument("Padding must not be less than zero");
i += 3;
}
else if (!strcmp (argv[i], "-d"))
{
//
// Round down
//
roundingMode = ROUND_DOWN;
i += 1;
}
else if (!strcmp (argv[i], "-u"))
{
//
// Round down
//
roundingMode = ROUND_UP;
i += 1;
}
else if (!strcmp (argv[i], "-z"))
{
//
// Set compression method
//
if (i > argc - 2)
throw invalid_argument("Missing compression method with -z option");
compression = getCompression (argv[i + 1]);
i += 2;
}
else if (!strcmp (argv[i], "-v"))
{
//
// Verbose mode
//
verbose = true;
i += 1;
}
else if (!strcmp (argv[i], "-h") || !strcmp (argv[i], "--help"))
{
//
// Print help message
//
usageMessage (cout, "exrenvmap", true);
return 0;
}
else if (!strcmp (argv[i], "--version"))
{
const char* libraryVersion = getLibraryVersion();
cout << "exrenvmap (OpenEXR) " << OPENEXR_VERSION_STRING;
if (strcmp(libraryVersion, OPENEXR_VERSION_STRING))
cout << "(OpenEXR version " << libraryVersion << ")";
cout << " https://openexr.com" << endl;
cout << "Copyright (c) Contributors to the OpenEXR Project" << endl;
cout << "License BSD-3-Clause" << endl;
return 0;
}
else
{
//
// Image file name
//
if (inFile == 0)
inFile = argv[i];
else
outFile = argv[i];
i += 1;
}
}
if (inFile == 0 || outFile == 0)
{
usageMessage (cerr, argv[0], false);
return -1;
}
//
// Load inFile, convert it, and save the result in outFile.
//
EnvmapImage image;
Header header;
RgbaChannels channels;
@@ -478,9 +493,9 @@ main (int argc, char** argv)
}
catch (const exception& e)
{
cerr << e.what () << endl;
exitStatus = 1;
cerr << argv[0] << ": " << e.what () << endl;
return 1;
}
return exitStatus;
return 0;
}
+36 -11
View File
@@ -31,6 +31,8 @@
#include <ImfTimeCodeAttribute.h>
#include <ImfVecAttribute.h>
#include <ImfVersion.h>
#include <ImfMisc.h>
#include <OpenEXRConfig.h>
#include <iomanip>
#include <iostream>
@@ -456,9 +458,20 @@ printInfo (const char fileName[])
}
void
usageMessage (const char argv0[])
usageMessage (ostream& stream, const char* program_name, bool verbose = false)
{
std::cerr << "Usage: " << argv0 << " imagefile [imagefile ...]\n";
stream << "Usage: " << program_name << " imagefile [imagefile ...]\n";
if (verbose)
stream << "\n"
"Read exr files and print the values of header attributes.\n"
"\n"
"Options:\n"
" -h, --help print this message\n"
" --version print version information\n"
"\n"
"Report bugs via https://github.com/AcademySoftwareFoundation/openexr/issues or email security@openexr.com\n"
"";
}
int
@@ -466,16 +479,28 @@ main (int argc, char** argv)
{
if (argc < 2)
{
usageMessage (argv[0]);
return 1;
usageMessage (cerr, argv[0], false);
return -1;
}
for (int i = 1; i < argc; ++i)
{
if (!strcmp (argv[i], "-h"))
if (!strcmp (argv[i], "-h") || !strcmp(argv[1], "--help"))
{
usageMessage (argv[0]);
return 1;
usageMessage (cout, "exrheader", true);
return 0;
}
else if (!strcmp (argv[i], "--version"))
{
const char* libraryVersion = getLibraryVersion();
cout << "exrheader (OpenEXR) " << OPENEXR_VERSION_STRING;
if (strcmp(libraryVersion, OPENEXR_VERSION_STRING))
cout << "(OpenEXR version " << libraryVersion << ")";
cout << " https://openexr.com" << endl;
cout << "Copyright (c) Contributors to the OpenEXR Project" << endl;
cout << "License BSD-3-Clause" << endl;
return 0;
}
}
@@ -483,12 +508,12 @@ main (int argc, char** argv)
{
for (int i = 1; i < argc; ++i)
printInfo (argv[i]);
return 0;
}
catch (const std::exception& e)
catch (const exception& e)
{
std::cerr << e.what () << std::endl;
cerr << argv[0] << ": " << e.what () << endl;
return 1;
}
return 0;
}
+4 -1
View File
@@ -6,7 +6,10 @@ target_link_libraries(exrinfo OpenEXR::OpenEXRCore)
set_target_properties(exrinfo PROPERTIES
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin"
)
install(TARGETS exrinfo DESTINATION ${CMAKE_INSTALL_BINDIR})
if(OPENEXR_INSTALL_TOOLS)
install(TARGETS exrinfo DESTINATION ${CMAKE_INSTALL_BINDIR})
endif()
if(WIN32 AND (BUILD_SHARED_LIBS OR OPENEXR_BUILD_BOTH_STATIC_SHARED))
target_compile_definitions(exrinfo PRIVATE OPENEXR_DLL)
endif()
+28 -10
View File
@@ -18,12 +18,25 @@
#include <stdlib.h>
static void
usage (const char* argv0)
usage (FILE* stream, const char* argv0, int verbose)
{
fprintf (
stderr,
"Usage: %s [-v|--verbose] [-a|--all-metadata] [-s|--strict] <filename> [<filename> ...]\n\n",
argv0);
fprintf (stream,
"Usage: %s [-v|--verbose] [-a|--all-metadata] [-s|--strict] <filename> [<filename> ...]\n\n",
argv0);
if (verbose)
fprintf(stream, "\n"
"Read exr files and print values of header attributes\n"
"\n"
"Options:\n"
" -s, --strict strict mode\n"
" -a, --all-metadata print all metadata\n"
" -v, --verbose verbose mode\n"
" -h, --help print this message\n"
" --version print version information\n"
"\n"
"Report bugs via https://github.com/AcademySoftwareFoundation/openexr/issues or email security@openexr.com\n"
"");
}
static void
@@ -129,14 +142,21 @@ process_file (const char* filename, int verbose, int allmeta, int strict)
int
main (int argc, const char* argv[])
{
int rv = 0, nfiles = 0, verbose = 0, allmeta = 0, strict = 0;
int rv = 0, verbose = 0, allmeta = 0, strict = 0;
for (int a = 1; a < argc; ++a)
{
if (!strcmp (argv[a], "-h") || !strcmp (argv[a], "-?") ||
!strcmp (argv[a], "--help"))
{
usage (argv[0]);
usage (stdout, "exrinfo", 1);
return 0;
}
else if (!strcmp (argv[a], "--version"))
{
printf("exrinfo (OpenEXR) %s https://openexr.com\n", OPENEXR_VERSION_STRING);
printf("Copyright (c) Contributors to the OpenEXR Project\n");
printf("License BSD-3-Clause\n");
return 0;
}
else if (!strcmp (argv[a], "-v") || !strcmp (argv[a], "--verbose"))
@@ -153,17 +173,15 @@ main (int argc, const char* argv[])
}
else if (!strcmp (argv[a], "-"))
{
++nfiles;
rv += process_stdin (verbose, allmeta, strict);
}
else if (argv[a][0] == '-')
{
usage (argv[0]);
usage (stderr, argv[0], 0);
return 1;
}
else
{
++nfiles;
rv += process_file (argv[a], verbose, allmeta, strict);
}
}
+129 -106
View File
@@ -12,43 +12,46 @@
#include "makePreview.h"
#include <ImfMisc.h>
#include <OpenEXRConfig.h>
#include <exception>
#include <iostream>
#include <stdlib.h>
#include <string.h>
using namespace OPENEXR_IMF_NAMESPACE;
using namespace std;
void
usageMessage (const char argv0[], bool verbose = false)
usageMessage (ostream& stream, const char* program_name, bool verbose = false)
{
cerr << "Usage: " << argv0 << " [options] infile outfile" << endl;
stream << "Usage: " << program_name << " [options] infile outfile" << endl;
if (verbose)
{
cerr << "\n"
"Reads an OpenEXR image from infile, generates a preview\n"
"image, adds it to the image's header, and saves the result\n"
"in outfile. Infile and outfile must not refer to the same\n"
"file (the program cannot edit an image file \"in place\").\n"
"\n"
"Options:\n"
"\n"
"-w x sets the width of the preview image to x pixels\n"
" (default is 100)\n"
"\n"
"-e s adjusts the preview image's exposure by s f-stops\n"
" (default is 0). Positive values make the image\n"
" brighter, negative values make it darker.\n"
"\n"
"-v verbose mode\n"
"\n"
"-h prints this message\n";
cerr << endl;
}
exit (1);
stream << "\n"
"Read an OpenEXR image from infile, generate a preview\n"
"image, add it to the image's header, and save the result\n"
"in outfile. Infile and outfile must not refer to the same\n"
"file (the program cannot edit an image file \"in place\").\n"
"\n"
"Options:\n"
"\n"
" -w x sets the width of the preview image to x pixels\n"
" (default is 100)\n"
"\n"
" -e s adjusts the preview image's exposure by s f-stops\n"
" (default is 0). Positive values make the image\n"
" brighter, negative values make it darker.\n"
"\n"
" -v verbose mode\n"
"\n"
" -h, --help print this message\n"
"\n"
" --version print version information\n"
"\n"
"Report bugs via https://github.com/AcademySoftwareFoundation/openexr/issues or email security@openexr.com\n"
"";
}
int
@@ -64,95 +67,115 @@ main (int argc, char** argv)
// Parse the command line.
//
if (argc < 2) usageMessage (argv[0], true);
int i = 1;
while (i < argc)
if (argc < 2)
{
if (!strcmp (argv[i], "-w"))
{
//
// Set preview image width
//
if (i > argc - 2) usageMessage (argv[0]);
previewWidth = strtol (argv[i + 1], 0, 0);
i += 2;
}
else if (!strcmp (argv[i], "-e"))
{
//
// Set preview image width
//
if (i > argc - 2) usageMessage (argv[0]);
exposure = strtod (argv[i + 1], 0);
i += 2;
}
else if (!strcmp (argv[i], "-v"))
{
//
// Verbose mode
//
verbose = true;
i += 1;
}
else if (!strcmp (argv[i], "-h"))
{
//
// Print help message
//
usageMessage (argv[0], true);
}
else
{
//
// Image file name
//
if (inFile == 0)
inFile = argv[i];
else
outFile = argv[i];
i += 1;
}
usageMessage (cerr, argv[0], false);
return -1;
}
if (inFile == 0 || outFile == 0) usageMessage (argv[0]);
if (!strcmp (inFile, outFile))
{
cerr << "Input and output cannot be the same file." << endl;
return 1;
}
if (previewWidth <= 0)
{
cerr << "Preview image width must be greater than zero." << endl;
return 1;
}
//
// Load inFile, add a preview image, and save the result in outFile.
//
int exitStatus = 0;
try
{
int i = 1;
while (i < argc)
{
if (!strcmp (argv[i], "-w"))
{
//
// Set preview image width
//
if (i > argc - 2)
throw invalid_argument("Missing width for -w argument");
previewWidth = strtol (argv[i + 1], 0, 0);
if (previewWidth <= 0)
throw invalid_argument("preview width must be greater than zero");
i += 2;
}
else if (!strcmp (argv[i], "-e"))
{
//
// Set exposure
//
if (i > argc - 2)
throw invalid_argument("missing exposure for -e argument");
exposure = strtod (argv[i + 1], 0);
i += 2;
}
else if (!strcmp (argv[i], "-v"))
{
//
// Verbose mode
//
verbose = true;
i += 1;
}
else if (!strcmp (argv[i], "-h") || !strcmp (argv[i], "--help"))
{
//
// Print help message
//
usageMessage (cout, "exrmakepreview", true);
return 0;
}
else if (!strcmp (argv[i], "--version"))
{
const char* libraryVersion = getLibraryVersion();
cout << "exrmakepreview (OpenEXR) " << OPENEXR_VERSION_STRING;
if (strcmp(libraryVersion, OPENEXR_VERSION_STRING))
cout << "(OpenEXR version " << libraryVersion << ")";
cout << " https://openexr.com" << endl;
cout << "Copyright (c) Contributors to the OpenEXR Project" << endl;
cout << "License BSD-3-Clause" << endl;
return 0;
}
else
{
//
// Image file name
//
if (inFile == 0)
inFile = argv[i];
else
outFile = argv[i];
i += 1;
}
}
if (inFile == 0 || outFile == 0)
{
usageMessage (cerr, argv[0], false);
return -1;
}
if (!strcmp (inFile, outFile))
throw invalid_argument("Input and output cannot be the same file");
if (previewWidth <= 0)
throw invalid_argument("Preview image width must be greater than zero");
//
// Load inFile, add a preview image, and save the result in outFile.
//
makePreview (inFile, outFile, previewWidth, exposure, verbose);
}
catch (const exception& e)
{
cerr << e.what () << endl;
exitStatus = 1;
cerr << argv[0] << ": " << e.what () << endl;
return 1;
}
return exitStatus;
return 0;
}
+240 -218
View File
@@ -13,9 +13,12 @@
#include "makeTiled.h"
#include <ImfHeader.h>
#include <ImfMisc.h>
#include <OpenEXRConfig.h>
#include <exception>
#include <iostream>
#include <sstream>
#include <stdlib.h>
#include <string.h>
#include <string>
@@ -28,61 +31,62 @@ namespace
{
void
usageMessage (const char argv0[], bool verbose = false)
usageMessage (ostream& stream, const char* program_name, bool verbose = false)
{
cerr << "Usage: " << argv0 << " [options] infile outfile" << endl;
stream << "Usage: " << program_name << " [options] infile outfile" << endl;
if (verbose)
{
cerr << "\n"
"Reads an OpenEXR image from infile, produces a tiled\n"
"version of the image, and saves the result in outfile.\n"
"\n"
"Options:\n"
"\n"
"-o produces a ONE_LEVEL image (default)\n"
"\n"
"-m produces a MIPMAP_LEVELS multiresolution image\n"
"\n"
"-r produces a RIPMAP_LEVELS multiresolution image\n"
"\n"
"-f c when a MIPMAP_LEVELS or RIPMAP_LEVELS image\n"
" is produced, image channel c will be resampled\n"
" without low-pass filtering. This option can\n"
" be specified multiple times to disable low-pass\n"
" filtering for multiple channels.\n"
"\n"
"-e x y when a MIPMAP_LEVELS or RIPMAP_LEVELS image\n"
" is produced, low-pass filtering takes samples\n"
" outside the image's data window. This requires\n"
" extrapolating the image. Option -e specifies\n"
" how the image is extrapolated horizontally and\n"
" vertically (black/clamp/periodic/mirror, default\n"
" is clamp).\n"
"\n"
"-t x y sets the tile size in the output image to\n"
" x by y pixels (default is 64 by 64)\n"
"\n"
"-d sets level size rounding to ROUND_DOWN (default)\n"
"\n"
"-u sets level size rounding to ROUND_UP\n"
"\n"
"-z x sets the data compression method to x\n"
" (none/rle/zip/piz/pxr24/b44/b44a/dwaa/dwab,\n"
" default is zip)\n"
"\n"
"-v verbose mode\n"
"\n"
"-h prints this message\n"
"\n"
"Multipart Options:\n"
"\n"
"-p i part number, default is 0\n";
cerr << endl;
stream << "\n"
"Read an OpenEXR image from infile, produce a tiled\n"
"version of the image, and save the result in outfile.\n"
"\n"
"Options:\n"
"\n"
" -o produces a ONE_LEVEL image (default)\n"
"\n"
" -m produces a MIPMAP_LEVELS multiresolution image\n"
"\n"
" -r produces a RIPMAP_LEVELS multiresolution image\n"
"\n"
" -f c when a MIPMAP_LEVELS or RIPMAP_LEVELS image\n"
" is produced, image channel c will be resampled\n"
" without low-pass filtering. This option can\n"
" be specified multiple times to disable low-pass\n"
" filtering for multiple channels.\n"
"\n"
" -e x y when a MIPMAP_LEVELS or RIPMAP_LEVELS image\n"
" is produced, low-pass filtering takes samples\n"
" outside the image's data window. This requires\n"
" extrapolating the image. Option -e specifies\n"
" how the image is extrapolated horizontally and\n"
" vertically (black/clamp/periodic/mirror, default\n"
" is clamp).\n"
"\n"
" -t x y sets the tile size in the output image to\n"
" x by y pixels (default is 64 by 64)\n"
"\n"
" -d sets level size rounding to ROUND_DOWN (default)\n"
"\n"
" -u sets level size rounding to ROUND_UP\n"
"\n"
" -z x sets the data compression method to x\n"
" (none/rle/zip/piz/pxr24/b44/b44a/dwaa/dwab,\n"
" default is zip)\n"
"\n"
" -v verbose mode\n"
"\n"
" -h, --help print this message\n"
"\n"
" --version print version information\n"
"\n"
"Multipart Options:\n"
"\n"
" -p i part number, default is 0\n"
"\n"
"Report bugs via https://github.com/AcademySoftwareFoundation/openexr/issues or email security@openexr.com\n"
"";
}
exit (1);
}
Compression
@@ -128,8 +132,9 @@ getCompression (const string& str)
}
else
{
cerr << "Unknown compression method \"" << str << "\"." << endl;
exit (1);
std::stringstream e;
e << "Unknown compression method \"" << str << "\"";
throw invalid_argument(e.str());
}
return c;
@@ -155,8 +160,9 @@ getExtrapolation (const string& str)
}
else
{
cerr << "Unknown extrapolation method \"" << str << "\"." << endl;
exit (1);
std::stringstream e;
e << "Unknown extrapolation method \"" << str << "\"";
throw invalid_argument(e.str());
}
return e;
@@ -165,7 +171,8 @@ getExtrapolation (const string& str)
void
getPartNum (int argc, char** argv, int& i, int* j)
{
if (i > argc - 2) usageMessage (argv[0]);
if (i > argc - 2)
throw invalid_argument("Missing part num with -p option");
*j = strtol (argv[i + 1], 0, 0);
cout << "part number: " << *j << endl;
@@ -193,163 +200,180 @@ main (int argc, char** argv)
// Parse the command line.
//
if (argc < 2) usageMessage (argv[0], true);
int i = 1;
int partnum = 0;
while (i < argc)
if (argc < 2)
{
if (!strcmp (argv[i], "-o"))
{
//
// generate a ONE_LEVEL image
//
mode = ONE_LEVEL;
i += 1;
}
else if (!strcmp (argv[i], "-m"))
{
//
// Generate a MIPMAP_LEVELS image
//
mode = MIPMAP_LEVELS;
i += 1;
}
else if (!strcmp (argv[i], "-r"))
{
//
// Generate a RIPMAP_LEVELS image
//
mode = RIPMAP_LEVELS;
i += 1;
}
else if (!strcmp (argv[i], "-f"))
{
//
// Don't low-pass filter the specified image channel
//
if (i > argc - 2) usageMessage (argv[0]);
doNotFilter.insert (argv[i + 1]);
i += 2;
}
else if (!strcmp (argv[i], "-e"))
{
//
// Set x and y extrapolation method
//
if (i > argc - 3) usageMessage (argv[0]);
extX = getExtrapolation (argv[i + 1]);
extY = getExtrapolation (argv[i + 2]);
i += 3;
}
else if (!strcmp (argv[i], "-t"))
{
//
// Set tile size
//
if (i > argc - 3) usageMessage (argv[0]);
tileSizeX = strtol (argv[i + 1], 0, 0);
tileSizeY = strtol (argv[i + 2], 0, 0);
if (tileSizeX <= 0 || tileSizeY <= 0)
{
cerr << "Tile size must be greater than zero." << endl;
return 1;
}
i += 3;
}
else if (!strcmp (argv[i], "-d"))
{
//
// Round down
//
roundingMode = ROUND_DOWN;
i += 1;
}
else if (!strcmp (argv[i], "-u"))
{
//
// Round down
//
roundingMode = ROUND_UP;
i += 1;
}
else if (!strcmp (argv[i], "-z"))
{
//
// Set compression method
//
if (i > argc - 2) usageMessage (argv[0]);
compression = getCompression (argv[i + 1]);
i += 2;
}
else if (!strcmp (argv[i], "-v"))
{
//
// Verbose mode
//
verbose = true;
i += 1;
}
else if (!strcmp (argv[i], "-h"))
{
//
// Print help message
//
usageMessage (argv[0], true);
}
else if (!strcmp (argv[i], "-p"))
{
getPartNum (argc, argv, i, &partnum);
}
else
{
//
// Image file name
//
if (inFile == 0)
inFile = argv[i];
else
outFile = argv[i];
i += 1;
}
usageMessage (cerr, argv[0], false);
return -1;
}
if (inFile == 0 || outFile == 0) usageMessage (argv[0]);
if (!strcmp (inFile, outFile))
{
cerr << "Input and output cannot be the same file." << endl;
return 1;
}
//
// Load inFile, and save a tiled version in outFile.
//
int exitStatus = 0;
try
{
int i = 1;
int partnum = 0;
while (i < argc)
{
if (!strcmp (argv[i], "-o"))
{
//
// generate a ONE_LEVEL image
//
mode = ONE_LEVEL;
i += 1;
}
else if (!strcmp (argv[i], "-m"))
{
//
// Generate a MIPMAP_LEVELS image
//
mode = MIPMAP_LEVELS;
i += 1;
}
else if (!strcmp (argv[i], "-r"))
{
//
// Generate a RIPMAP_LEVELS image
//
mode = RIPMAP_LEVELS;
i += 1;
}
else if (!strcmp (argv[i], "-f"))
{
//
// Don't low-pass filter the specified image channel
//
if (i > argc - 2)
throw invalid_argument("missing filter value with -f option");
doNotFilter.insert (argv[i + 1]);
i += 2;
}
else if (!strcmp (argv[i], "-e"))
{
//
// Set x and y extrapolation method
//
if (i > argc - 3)
throw invalid_argument("missing extrapolation values with -e option");
extX = getExtrapolation (argv[i + 1]);
extY = getExtrapolation (argv[i + 2]);
i += 3;
}
else if (!strcmp (argv[i], "-t"))
{
//
// Set tile size
//
if (i > argc - 3)
throw invalid_argument("missing tile size with -t option");
tileSizeX = strtol (argv[i + 1], 0, 0);
tileSizeY = strtol (argv[i + 2], 0, 0);
if (tileSizeX <= 0 || tileSizeY <= 0)
throw invalid_argument("Tile size must be greater than zero");
i += 3;
}
else if (!strcmp (argv[i], "-d"))
{
//
// Round down
//
roundingMode = ROUND_DOWN;
i += 1;
}
else if (!strcmp (argv[i], "-u"))
{
//
// Round down
//
roundingMode = ROUND_UP;
i += 1;
}
else if (!strcmp (argv[i], "-z"))
{
//
// Set compression method
//
if (i > argc - 2)
throw invalid_argument("Missing compression value with -z option");
compression = getCompression (argv[i + 1]);
i += 2;
}
else if (!strcmp (argv[i], "-v"))
{
//
// Verbose mode
//
verbose = true;
i += 1;
}
else if (!strcmp (argv[i], "-p"))
{
getPartNum (argc, argv, i, &partnum);
}
else if (!strcmp (argv[i], "-h") || !strcmp (argv[i], "--help"))
{
//
// Print help message
//
usageMessage (cout, "exrmaketiled", true);
return 0;
}
else if (!strcmp (argv[i], "--version"))
{
const char* libraryVersion = getLibraryVersion();
cout << "exrmaketiled (OpenEXR) " << OPENEXR_VERSION_STRING;
if (strcmp(libraryVersion, OPENEXR_VERSION_STRING))
cout << "(OpenEXR version " << libraryVersion << ")";
cout << " https://openexr.com" << endl;
cout << "Copyright (c) Contributors to the OpenEXR Project" << endl;
cout << "License BSD-3-Clause" << endl;
return 0;
}
else
{
//
// Image file name
//
if (inFile == 0)
inFile = argv[i];
else
outFile = argv[i];
i += 1;
}
}
if (inFile == 0 || outFile == 0)
{
usageMessage (cerr, argv[0], false);
return -1;
}
if (!strcmp (inFile, outFile))
throw invalid_argument("Input and output cannot be the same file");
//
// Load inFile, and save a tiled version in outFile.
//
//
// check input
//
@@ -359,18 +383,16 @@ main (int argc, char** argv)
if (partnum < 0 || partnum >= parts)
{
cerr << "ERROR: you asked for part " << partnum << " in "
<< inFile;
cerr << ", which only has " << parts << " parts\n";
exit (1);
std::stringstream e;
e << "You asked for part " << partnum << " in "
<< inFile
<< ", which only has " << parts << " parts";
throw invalid_argument(e.str());
}
Header h = input.header (partnum);
if (h.type () == DEEPTILE || h.type () == DEEPSCANLINE)
{
cerr << "Cannot make tile for deep data" << endl;
exit (1);
}
throw invalid_argument("Cannot make tile for deep data");
}
makeTiled (
@@ -389,9 +411,9 @@ main (int argc, char** argv)
}
catch (const exception& e)
{
cerr << e.what () << endl;
exitStatus = 1;
cerr << argv[0] << ": " << e.what () << endl;
return 1;
}
return exitStatus;
return 0;
}
+291 -361
View File
@@ -23,6 +23,8 @@
#include <ImfStringAttribute.h>
#include <ImfTiledInputPart.h>
#include <ImfTiledOutputPart.h>
#include <ImfMisc.h>
#include <OpenEXRConfig.h>
#include <Iex.h>
#include <OpenEXRConfig.h>
@@ -37,17 +39,7 @@
#include <vector>
using IMATH_NAMESPACE::Box2i;
using std::cerr;
using std::cout;
using std::endl;
using std::make_pair;
using std::max;
using std::min;
using std::ostringstream;
using std::pair;
using std::set;
using std::string;
using std::vector;
using namespace std;
using namespace OPENEXR_IMF_NAMESPACE;
@@ -182,10 +174,8 @@ parse_filename (
}
else
{
cerr << "\n"
<< "ERROR: part number must be a number" << endl;
exit (1);
}
throw invalid_argument("part number must be a number");
}
}
}
@@ -202,10 +192,7 @@ make_unique_names (vector<Header>& headers)
if (!h.hasName ())
{
// We should not be here, we have populated all headers with names.
cerr << "\n"
<< "Software Error: header does not have a valid name"
<< ":" << __LINE__ << endl;
exit (1);
throw invalid_argument("Software Error: header does not have a valid name");
}
else
{
@@ -235,16 +222,8 @@ filename_check (vector<string> names, const char* aname)
{
string bname (aname);
for (size_t i = 0; i < names.size (); i++)
{
if (bname.compare (names[i]) == 0)
{
cerr << "\n"
<< "ERROR: "
"input and output file names cannot be the same."
<< endl;
exit (1);
}
}
throw invalid_argument("input and output file names cannot be the same");
}
void
@@ -255,159 +234,133 @@ convert (
bool override)
{
if (in.size () != 1)
throw invalid_argument("can only convert one file at once - use 'combine' mode for multiple files");
MultiPartInputFile infile (in[0]);
if (infile.parts () != 1)
throw invalid_argument("can only convert single part EXRs to multipart EXR-2.0 files: use 'split' mode instead");
vector<MultiViewChannelName> input_channels;
string hero;
if (hasMultiView (infile.header (0)))
{
cerr
<< "\n"
<< "ERROR: "
"can only convert one file at once - use 'combine' mode for multiple files"
<< endl;
exit (1);
StringVector h = multiView (infile.header (0));
if (h.size () > 0) { hero = h[0]; }
}
try
// retrieve channel names from input file in view-friendly format
GetChannelsInMultiPartFile (infile, input_channels);
vector<MultiViewChannelName> output_channels = input_channels;
// remap channels to multiple output parts
int parts = SplitChannels (
output_channels.begin (), output_channels.end (), true, hero);
vector<Header> output_headers (parts);
vector<FrameBuffer> output_framebuffers (parts);
FrameBuffer input_framebuffer;
//
// make all output headers the same as the input header but
// with no channels
//
for (int i = 0; i < parts; i++)
{
MultiPartInputFile infile (in[0]);
Header& h = output_headers[i];
h = infile.header (0);
if (hasMultiView (h)) h.erase ("multiView");
if (infile.parts () != 1)
{
cerr
<< "\n"
<< "ERROR: "
"can only convert single part EXRs to multipart EXR-2.0 files: use 'split' mode instead"
<< endl;
exit (1);
}
string fn, pname;
int pnum;
bool pforce;
parse_filename (fn, pname, pforce, pnum);
if (!h.hasName () || pforce) h.setName (pname);
vector<MultiViewChannelName> input_channels;
string hero;
if (hasMultiView (infile.header (0)))
{
StringVector h = multiView (infile.header (0));
if (h.size () > 0) { hero = h[0]; }
}
// retrieve channel names from input file in view-friendly format
GetChannelsInMultiPartFile (infile, input_channels);
vector<MultiViewChannelName> output_channels = input_channels;
// remap channels to multiple output parts
int parts = SplitChannels (
output_channels.begin (), output_channels.end (), true, hero);
vector<Header> output_headers (parts);
vector<FrameBuffer> output_framebuffers (parts);
FrameBuffer input_framebuffer;
//
// make all output headers the same as the input header but
// with no channels
//
for (int i = 0; i < parts; i++)
{
Header& h = output_headers[i];
h = infile.header (0);
if (hasMultiView (h)) h.erase ("multiView");
string fn, pname;
int pnum;
bool pforce;
parse_filename (fn, pname, pforce, pnum);
if (!h.hasName () || pforce) h.setName (pname);
h.channels () = ChannelList ();
}
make_unique_names (output_headers);
const ChannelList& in_chanlist = infile.header (0).channels ();
int channel_count = 0;
for (ChannelList::ConstIterator i = in_chanlist.begin ();
i != in_chanlist.end ();
++i)
{
++channel_count;
}
Box2i dataWindow = infile.header (0).dataWindow ();
int pixel_count =
(dataWindow.size ().y + 1) * (dataWindow.size ().x + 1);
int pixel_width = dataWindow.size ().x + 1;
// offset in pixels between base of array and 0,0
int pixel_base = dataWindow.min.y * pixel_width + dataWindow.min.x;
vector<vector<char>> channelstore (channel_count);
//
// insert channels into correct header and framebuffers
//
for (size_t i = 0; i < input_channels.size (); i++)
{
// read the part we should be writing channel into, insert into header
int part = output_channels[i].part_number;
ChannelList::ConstIterator chan =
in_chanlist.find (input_channels[i].internal_name);
Header& h = output_headers[part];
h.channels ().insert (output_channels[i].name, chan.channel ());
if (output_channels[i].view != "")
{
h.setView (output_channels[i].view);
}
// compute size of channel
size_t samplesize = sizeof (float);
if (chan.channel ().type == HALF) { samplesize = sizeof (half); }
channelstore[i].resize (samplesize * pixel_count);
output_framebuffers[part].insert (
output_channels[i].name,
Slice (
chan.channel ().type,
&channelstore[i][0] - pixel_base * samplesize,
samplesize,
pixel_width * samplesize));
input_framebuffer.insert (
input_channels[i].internal_name,
Slice (
chan.channel ().type,
&channelstore[i][0] - pixel_base * samplesize,
samplesize,
pixel_width * samplesize));
}
//
// create output file
//
MultiPartOutputFile outfile (
outname, &output_headers[0], output_headers.size ());
InputPart inpart (infile, 0);
//
// read file
//
inpart.setFrameBuffer (input_framebuffer);
inpart.readPixels (dataWindow.min.y, dataWindow.max.y);
//
// write each part
//
for (size_t i = 0; i < output_framebuffers.size (); i++)
{
OutputPart outpart (outfile, i);
outpart.setFrameBuffer (output_framebuffers[i]);
outpart.writePixels (dataWindow.max.y + 1 - dataWindow.min.y);
}
h.channels () = ChannelList ();
}
catch (IEX_NAMESPACE::BaseExc& e)
make_unique_names (output_headers);
const ChannelList& in_chanlist = infile.header (0).channels ();
int channel_count = 0;
for (ChannelList::ConstIterator i = in_chanlist.begin ();
i != in_chanlist.end ();
++i)
{
cerr << "\n"
<< "ERROR:" << endl;
cerr << e.what () << endl;
exit (1);
++channel_count;
}
Box2i dataWindow = infile.header (0).dataWindow ();
int pixel_count =
(dataWindow.size ().y + 1) * (dataWindow.size ().x + 1);
int pixel_width = dataWindow.size ().x + 1;
// offset in pixels between base of array and 0,0
int pixel_base = dataWindow.min.y * pixel_width + dataWindow.min.x;
vector<vector<char>> channelstore (channel_count);
//
// insert channels into correct header and framebuffers
//
for (size_t i = 0; i < input_channels.size (); i++)
{
// read the part we should be writing channel into, insert into header
int part = output_channels[i].part_number;
ChannelList::ConstIterator chan =
in_chanlist.find (input_channels[i].internal_name);
Header& h = output_headers[part];
h.channels ().insert (output_channels[i].name, chan.channel ());
if (output_channels[i].view != "")
{
h.setView (output_channels[i].view);
}
// compute size of channel
size_t samplesize = sizeof (float);
if (chan.channel ().type == HALF) { samplesize = sizeof (half); }
channelstore[i].resize (samplesize * pixel_count);
output_framebuffers[part].insert (output_channels[i].name,
Slice (chan.channel ().type,
&channelstore[i][0] - pixel_base * samplesize,
samplesize,
pixel_width * samplesize));
input_framebuffer.insert (input_channels[i].internal_name,
Slice (chan.channel ().type,
&channelstore[i][0] - pixel_base * samplesize,
samplesize,
pixel_width * samplesize));
}
//
// create output file
//
MultiPartOutputFile outfile (outname, &output_headers[0], output_headers.size ());
InputPart inpart (infile, 0);
//
// read file
//
inpart.setFrameBuffer (input_framebuffer);
inpart.readPixels (dataWindow.min.y, dataWindow.max.y);
//
// write each part
//
for (size_t i = 0; i < output_framebuffers.size (); i++)
{
OutputPart outpart (outfile, i);
outpart.setFrameBuffer (output_framebuffers[i]);
outpart.writePixels (dataWindow.max.y + 1 - dataWindow.min.y);
}
}
@@ -447,57 +400,16 @@ combine (
{
fornamecheck.push_back (filename);
try
infile = new MultiPartInputFile (filename.c_str ());
fordelete.push_back (infile);
numparts = infile->parts ();
//copy header from all parts of input to our header array
for (int j = 0; j < numparts; j++)
{
infile = new MultiPartInputFile (filename.c_str ());
fordelete.push_back (infile);
numparts = infile->parts ();
//copy header from all parts of input to our header array
for (int j = 0; j < numparts; j++)
{
inputs.push_back (infile);
Header h = infile->header (j);
if (!h.hasName () || forcepartname) h.setName (partname);
headers.push_back (h);
if (views[i] != NULL)
headers[headers.size () - 1].setView (views[i]);
partnums.push_back (j);
}
}
catch (IEX_NAMESPACE::BaseExc& e)
{
cerr << "\n"
<< "ERROR:" << endl;
cerr << e.what () << endl;
exit (1);
}
} // no user parts specified
else
{
fornamecheck.push_back (filename);
try
{
infile = new MultiPartInputFile (filename.c_str ());
fordelete.push_back (infile);
if (partnum >= infile->parts ())
{
cerr << "ERROR: you asked for part " << partnum << " in "
<< in[i];
cerr << ", which only has " << infile->parts ()
<< " parts\n";
exit (1);
}
//copy header from required part of input to our header array
inputs.push_back (infile);
Header h = infile->header (partnum);
Header h = infile->header (j);
if (!h.hasName () || forcepartname) h.setName (partname);
headers.push_back (h);
@@ -505,15 +417,37 @@ combine (
if (views[i] != NULL)
headers[headers.size () - 1].setView (views[i]);
partnums.push_back (partnum);
partnums.push_back (j);
}
catch (IEX_NAMESPACE::BaseExc& e)
} // no user parts specified
else
{
fornamecheck.push_back (filename);
infile = new MultiPartInputFile (filename.c_str ());
fordelete.push_back (infile);
if (partnum >= infile->parts ())
{
cerr << "\n"
<< "ERROR:" << endl;
cerr << e.what () << endl;
exit (1);
std::stringstream e;
e << "You asked for part " << partnum << " in "
<< in[i]
<< ", which only has " << infile->parts ()
<< " parts";
throw invalid_argument(e.str());
}
//copy header from required part of input to our header array
inputs.push_back (infile);
Header h = infile->header (partnum);
if (!h.hasName () || forcepartname) h.setName (partname);
headers.push_back (h);
if (views[i] != NULL)
headers[headers.size () - 1].setView (views[i]);
partnums.push_back (partnum);
} // user parts specified
}
@@ -528,17 +462,8 @@ combine (
//
// early bail if need be
try
{
MultiPartOutputFile temp (
outname, &headers[0], headers.size (), override);
}
catch (IEX_NAMESPACE::BaseExc& e)
{
cerr << "\n"
<< "ERROR: " << e.what () << endl;
exit (1);
}
MultiPartOutputFile temp (outname, &headers[0], headers.size (), override);
MultiPartOutputFile out (outname, &headers[0], headers.size (), override);
for (size_t p = 0; p < partnums.size (); p++)
@@ -576,7 +501,6 @@ combine (
}
inputs.clear ();
fordelete.size ();
cout << "\n"
<< "Combine Success" << endl;
@@ -586,12 +510,7 @@ void
separate (vector<const char*> in, const char* out, bool override)
{
if (in.size () > 1)
{
cerr
<< "ERROR: -separate only take one input file\n"
"syntax: exrmultipart -separate -i infile.exr -o outfileBaseName\n";
exit (1);
}
throw invalid_argument("-separate only take one input file");
//
// parse the multipart input
@@ -602,16 +521,7 @@ separate (vector<const char*> in, const char* out, bool override)
vector<string> fornamecheck;
// add check for existence of the file
try
{
MultiPartInputFile temp (filename.c_str ());
}
catch (IEX_NAMESPACE::BaseExc& e)
{
cerr << "\n"
<< "ERROR: " << e.what () << endl;
exit (1);
}
MultiPartInputFile temp (filename.c_str ());
inputimage = new MultiPartInputFile (filename.c_str ());
numOutputs = inputimage->parts ();
@@ -674,129 +584,149 @@ separate (vector<const char*> in, const char* out, bool override)
}
void
usageMessage (const char argv[])
usageMessage (ostream& stream, const char* program_name, bool verbose = false)
{
cerr << "Usage: "
"exrmultipart -combine -i input.exr[:partnum][::partname] "
"[input2.exr[:partnum]][::partname] [...] -o outfile.exr [options]\n";
cerr << " or: exrmultipart -separate -i infile.exr -o outfileBaseName "
"[options]\n";
cerr << " or: exrmultipart -convert -i infile.exr -o outfile.exr "
"[options]\n";
cerr << "\n";
cerr << argv << " handles the combining and splitting of multipart data\n";
cerr << "\n";
cerr << "Options:\n";
cerr << "-override [0/1] 0-do not override conflicting shared "
"attributes [default]\n"
" 1-override conflicting shared attributes\n";
stream << "Usage: " << program_name << "-combine -i input.exr[:partnum][::partname] [input2.exr[:partnum]][::partname] [...] -o outfile.exr [options]\n";
stream << " or: exrmultipart -separate -i infile.exr -o outfileBaseName [options]\n";
stream << " or: exrmultipart -convert -i infile.exr -o outfile.exr [options]\n";
cout << "-view name (after specifying -i) "
"assign following inputs to view 'name'\n";
exit (1);
if (verbose)
stream << "\n"
"Combine or split multipart data\n"
"\n"
"Options:\n"
" -override [0/1] 0 = do not override conflicting shared "
" attributes [default]\n"
" 1 = override conflicting shared attributes\n"
" -view name (after specifying -i) assign following inputs to view 'name'\n"
" -h, --help print this message\n"
"\n"
" --version print version information\n"
"\n"
"Report bugs via https://github.com/AcademySoftwareFoundation/openexr/issues or email security@openexr.com\n"
"";
}
int
main (int argc, char* argv[])
{
if (argc < 6) { usageMessage (argv[0]); }
try {
vector<const char*> inFiles;
vector<const char*> views;
const char* view = 0;
const char* outFile = 0;
bool override = false;
vector<const char*> inFiles;
vector<const char*> views;
const char* view = 0;
const char* outFile = 0;
bool override = false;
int i = 1;
int mode = 0; // 0-do not read input, 1-infiles, 2-outfile, 3-override, 4-view
int i = 1;
int mode =
0; // 0-do not read input, 1-infiles, 2-outfile, 3-override, 4-view
while (i < argc)
{
if (!strcmp (argv[i], "-h")) { usageMessage (argv[0]); }
if (!strcmp (argv[i], "-i")) { mode = 1; }
else if (!strcmp (argv[i], "-o"))
while (i < argc)
{
mode = 2;
}
else if (!strcmp (argv[i], "-override"))
{
mode = 3;
}
else if (!strcmp (argv[i], "-view"))
{
if (mode != 1)
if (!strcmp (argv[i], "-h") || !strcmp (argv[i], "--help"))
{
usageMessage (argv[0]);
return 1;
usageMessage (cout, "exrmultipart", true);
return 0;
}
mode = 4;
if (!strcmp (argv[i], "--version"))
{
const char* libraryVersion = getLibraryVersion();
cout << "exrmultipart (OpenEXR) " << OPENEXR_VERSION_STRING;
if (strcmp(libraryVersion, OPENEXR_VERSION_STRING))
cout << "(OpenEXR version " << libraryVersion << ")";
cout << " https://openexr.com" << endl;
cout << "Copyright (c) Contributors to the OpenEXR Project" << endl;
cout << "License BSD-3-Clause" << endl;
return 0;
}
if (!strcmp (argv[i], "-i"))
{
mode = 1;
}
else if (!strcmp (argv[i], "-o"))
{
mode = 2;
}
else if (!strcmp (argv[i], "-override"))
{
mode = 3;
}
else if (!strcmp (argv[i], "-view"))
{
if (mode != 1)
throw invalid_argument("-view requires -i");
mode = 4;
}
else
{
switch (mode)
{
case 1:
inFiles.push_back (argv[i]);
views.push_back (view);
break;
case 2: outFile = argv[i]; break;
case 3: override = atoi (argv[i]); break;
case 4:
view = argv[i];
mode = 1;
break;
}
}
i++;
}
// check input and output files found or not
if (inFiles.size () == 0)
{
usageMessage(cerr, argv[0], false);
return 1;
}
cout << "input:" << endl;
for (size_t i = 0; i < inFiles.size (); i++)
{
cout << " " << inFiles[i];
if (views[i])
cout << " in view " << views[i];
cout << endl;
}
if (!outFile)
throw invalid_argument("No output file specified");
cout << "output:\n " << outFile << endl;
cout << "override:" << override << "\n" << endl;
if (!strcmp (argv[1], "-combine"))
{
cout << "-combine multipart input " << endl;
combine (inFiles, views, outFile, override);
}
else if (!strcmp (argv[1], "-separate"))
{
cout << "-separate multipart input " << endl;
separate (inFiles, outFile, override);
}
else if (!strcmp (argv[1], "-convert"))
{
cout << "-convert input to EXR2 multipart" << endl;
convert (inFiles, views, outFile, override);
}
else
{
switch (mode)
{
case 1:
inFiles.push_back (argv[i]);
views.push_back (view);
break;
case 2: outFile = argv[i]; break;
case 3: override = atoi (argv[i]); break;
case 4:
view = argv[i];
mode = 1;
break;
}
usageMessage (cerr, argv[0], false);
}
i++;
}
// check input and output files found or not
if (inFiles.size () == 0)
catch (const exception& e)
{
cerr << "\n"
<< "ERROR: found no input files" << endl;
exit (1);
cerr << argv[0] << ": " << e.what () << endl;
return 1;
}
cout << "input:" << endl;
for (size_t i = 0; i < inFiles.size (); i++)
{
cout << " " << inFiles[i];
if (views[i]) cout << " in view " << views[i];
cout << endl;
}
if (!outFile)
{
cerr << "\n"
<< "ERROR: found no output file" << endl;
exit (1);
}
cout << "output:\n " << outFile << endl;
cout << "override:" << override << "\n" << endl;
if (!strcmp (argv[1], "-combine"))
{
cout << "-combine multipart input " << endl;
combine (inFiles, views, outFile, override);
}
else if (!strcmp (argv[1], "-separate"))
{
cout << "-separate multipart input " << endl;
separate (inFiles, outFile, override);
}
else if (!strcmp (argv[1], "-convert"))
{
cout << "-convert input to EXR2 multipart" << endl;
convert (inFiles, views, outFile, override);
}
else
{
usageMessage (argv[0]);
}
return 0;
}
+114 -104
View File
@@ -11,10 +11,13 @@
//
//-----------------------------------------------------------------------------
#include <makeMultiView.h>
#include "makeMultiView.h"
#include <ImfMisc.h>
#include <OpenEXRConfig.h>
#include <exception>
#include <iostream>
#include <sstream>
#include <stdlib.h>
#include <string.h>
#include <string>
@@ -27,44 +30,38 @@ namespace
{
void
usageMessage (const char argv0[], bool verbose = false)
usageMessage (ostream& stream, const char* program_name, bool verbose = false)
{
cerr << "Usage: " << argv0
<< " "
"[options] viewname1 infile1 viewname2 infile2 ... outfile"
<< endl;
stream << "Usage: " << program_name << " [options] viewname1 infile1 viewname2 infile2 ... outfile" << endl;
if (verbose)
{
cerr << "\n"
"Combines two or more single-view OpenEXR image files into\n"
"a single multi-view image file. On the command line,\n"
"each single-view input image is specified together with\n"
"a corresponding view name. The first view on the command\n"
"line becomes the default view. Example:\n"
"\n"
" "
<< argv0
<< " left imgL.exr right imgR.exr imgLR.exr\n"
"\n"
"Here, imgL.exr and imgR.exr become the left and right\n"
"views in output file imgLR.exr. The left view becomes\n"
"the default view.\n"
"\n"
"Options:\n"
"\n"
"-z x sets the data compression method to x\n"
" (none/rle/zip/piz/pxr24/b44/b44a/dwaa/dwab,\n"
" default is piz)\n"
"\n"
"-v verbose mode\n"
"\n"
"-h prints this message\n";
cerr << endl;
}
exit (1);
stream << "\n"
"Combine two or more single-view OpenEXR image files into\n"
"a single multi-view image file. On the command line,\n"
"each single-view input image is specified together with\n"
"a corresponding view name. The first view on the command\n"
"line becomes the default view. Example:\n"
"\n"
" exrmultiview left imgL.exr right imgR.exr imgLR.exr\n"
"\n"
"Here, imgL.exr and imgR.exr become the left and right\n"
"views in output file imgLR.exr. The left view becomes\n"
"the default view.\n"
"\n"
"Options:\n"
"\n"
" -z x sets the data compression method to x\n"
" (none/rle/zip/piz/pxr24/b44/b44a/dwaa/dwab,\n"
" default is piz)\n"
"\n"
" -v verbose mode\n"
"\n"
" -h, --help print this message\n"
"\n"
" --version print version information\n"
"\n"
"Report bugs via https://github.com/AcademySoftwareFoundation/openexr/issues or email security@openexr.com\n"
"";
}
Compression
@@ -110,8 +107,9 @@ getCompression (const string& str)
}
else
{
cerr << "Unknown compression method \"" << str << "\"." << endl;
exit (1);
std::stringstream e;
e << "Unknown compression method \"" << str << "\"";
throw invalid_argument(e.str());
}
return c;
@@ -132,97 +130,109 @@ main (int argc, char** argv)
// Parse the command line.
//
if (argc < 2) usageMessage (argv[0], true);
int i = 1;
while (i < argc)
if (argc < 2)
{
if (!strcmp (argv[i], "-z"))
usageMessage (cerr, argv[0], false);
return -1;
}
try {
int i = 1;
while (i < argc)
{
//
// Set compression method
//
if (i > argc - 2) usageMessage (argv[0]);
compression = getCompression (argv[i + 1]);
i += 2;
}
else if (!strcmp (argv[i], "-v"))
{
//
// Verbose mode
//
verbose = true;
i += 1;
}
else if (!strcmp (argv[i], "-h"))
{
//
// Print help message
//
usageMessage (argv[0], true);
}
else
{
//
// View or image file name
//
if (i > argc - 2 || argv[i + 1][0] == '-')
if (!strcmp (argv[i], "-z"))
{
//
// Output file
// Set compression method
//
if (outFile) usageMessage (argv[0]);
if (i > argc - 2)
throw invalid_argument("Missing compression value with -z option");
outFile = argv[i];
compression = getCompression (argv[i + 1]);
i += 2;
}
else if (!strcmp (argv[i], "-v"))
{
//
// Verbose mode
//
verbose = true;
i += 1;
}
else if (!strcmp (argv[i], "-h") || !strcmp (argv[i], "--help"))
{
//
// Print help message
//
usageMessage (cout, "exrmultiview" , true);
return 0;
}
else if (!strcmp (argv[i], "--version"))
{
const char* libraryVersion = getLibraryVersion();
cout << "exrmultiview (OpenEXR) " << OPENEXR_VERSION_STRING;
if (strcmp(libraryVersion, OPENEXR_VERSION_STRING))
cout << "(OpenEXR version " << libraryVersion << ")";
cout << " https://openexr.com" << endl;
cout << "Copyright (c) Contributors to the OpenEXR Project" << endl;
cout << "License BSD-3-Clause" << endl;
return 0;
}
else
{
//
// View plus input file
// View or image file name
//
views.push_back (argv[i]);
inFiles.push_back (argv[i + 1]);
i += 2;
if (i > argc - 2 || argv[i + 1][0] == '-')
{
//
// Output file
//
if (outFile)
throw invalid_argument("improper output file specified");
outFile = argv[i];
i += 1;
}
else
{
//
// View plus input file
//
views.push_back (argv[i]);
inFiles.push_back (argv[i + 1]);
i += 2;
}
}
}
}
if (views.size () < 2)
{
cerr << "Must specify at least two views." << endl;
return 1;
}
if (views.size () < 2)
throw invalid_argument ("Must specify at least two views");
if (outFile == 0)
{
cerr << "Must specify an output file." << endl;
return 1;
}
if (outFile == 0)
throw invalid_argument("Must specify an output file");
//
// Load inFiles, and save a combined multi-view image in outFile.
//
//
// Load inFiles, and save a combined multi-view image in outFile.
//
int exitStatus = 0;
try
{
makeMultiView (views, inFiles, outFile, compression, verbose);
}
catch (const exception& e)
{
cerr << e.what () << endl;
exitStatus = 1;
cerr << argv[0] << ": " << e.what () << endl;
return -1;
}
return exitStatus;
return 0;
}
+243 -218
View File
@@ -5,8 +5,8 @@
//-----------------------------------------------------------------------------
//
// exrstdattr -- a program that can set the values of most
// standard attributes in an OpenEXR image file's header.
// exrstdattr -- a program that can set the values of most
// standard attributes in an OpenEXR image file's header.
//
//-----------------------------------------------------------------------------
@@ -29,9 +29,12 @@
#include <ImfTiledOutputFile.h>
#include <ImfTiledOutputPart.h>
#include <ImfVecAttribute.h>
#include <ImfMisc.h>
#include <OpenEXRConfig.h>
#include <exception>
#include <iostream>
#include <sstream>
#include <map>
#include <stdlib.h>
#include <string.h>
@@ -42,173 +45,171 @@ using namespace OPENEXR_IMF_NAMESPACE;
using namespace IMATH_NAMESPACE;
void
usageMessage (const char argv0[], bool verbose = false)
usageMessage (ostream& stream, const char* program_name, bool verbose = false)
{
cerr << "Usage: " << argv0 << " [commands] infile outfile" << endl;
stream << "Usage: " << program_name << " [commands] infile outfile" << endl;
if (verbose)
{
cerr << "\n"
"Reads OpenEXR image file infile, sets the values of one\n"
"or more attributes in the headers of the file, and saves\n"
"the result in outfile. Infile and outfile must not refer\n"
"to the same file (the program cannot edit an image file "
"\"in place\").\n"
"\n"
"Command for selecting headers:\n"
"\n"
" -part i\n"
" If i is greater than or equal to zero, and less\n"
" than the number of parts in the input file, then\n"
" the header for part i becomes \"current.\" If i\n"
" is \"any\" or -1, then all headers become current.\n"
" Subsequent attribute setting commands affect only\n"
" the current header or headers. All headers are\n"
" current before the first -part command.\n"
"\n"
" For example, the command sequence\n"
"\n"
" -focus 3 -part 2 -aperture 8 -expTime 0.01 "
"-part any -owner luke\n"
"\n"
" sets the focus and owner attributes in all\n"
" headers, as well as the aperture and expTime\n"
" attributes in the header of part 2.\n"
"\n"
"Commands for setting attribute values:\n"
"\n"
" -chromaticities f f f f f f f f\n"
" CIE xy chromaticities for the red, green\n"
" and blue primaries, and for the white point\n"
" (8 floats)\n"
"\n"
" -whiteLuminance f\n"
" white luminance, in candelas per square meter\n"
" (float, >= 0.0)\n"
"\n"
" -adoptedNeutral f f\n"
" CIE xy coordinates that should be considered\n"
" \"neutral\" during color rendering. Pixels in\n"
" the image file whose xy coordinates match the\n"
" adoptedNeutral value should be mapped to neutral\n"
" values on the display. (2 floats)\n"
"\n"
" -renderingTransform s\n"
" name of the CTL rendering transform for this\n"
" image (string)\n"
"\n"
" -lookModTransform s\n"
" name of the CTL look modification transform for\n"
" this image (string)\n"
"\n"
" -xDensity f\n"
" horizontal output density, in pixels per inch\n"
" (float, >= 0.0)\n"
"\n"
" -owner s\n"
" name of the owner of the image (string)\n"
"\n"
" -comments s\n"
" additional information about the image (string)\n"
"\n"
" -capDate s\n"
" date when the image was created or\n"
" captured, in local time (string,\n"
" formatted as YYYY:MM:DD hh:mm:ss)\n"
"\n"
" -utcOffset f\n"
" offset of local time at capDate from UTC, in\n"
" seconds (float, UTC == local time + x)\n"
"\n"
" -longitude f\n"
" -latitude f\n"
" -altitude f\n"
" location where the image was recorded, in\n"
" degrees east of Greenwich and north of the\n"
" equator, and in meters above sea level\n"
" (float)\n"
"\n"
" -focus f\n"
" the camera's focus distance, in meters\n"
" (float, > 0, or \"infinity\")\n"
"\n"
" -expTime f\n"
" exposure time, in seconds (float, >= 0)\n"
"\n"
" -aperture f\n"
" lens apterture, in f-stops (float, >= 0)\n"
"\n"
" -isoSpeed f\n"
" effective speed of the film or image\n"
" sensor that was used to record the image\n"
" (float, >= 0)\n"
"\n"
" -envmap s\n"
" indicates that the image is an environment map\n"
" (string, LATLONG or CUBE)\n"
"\n"
" -framesPerSecond i i\n"
" playback frame rate expressed as a ratio of two\n"
" integers, n and d (the frame rate is n/d frames\n"
" per second)\n"
"\n"
" -keyCode i i i i i i i\n"
" key code that uniquely identifies a motion\n"
" picture film frame using 7 integers:\n"
" * film manufacturer code (0 - 99)\n"
" * film type code (0 - 99)\n"
" * prefix to identify film roll (0 - 999999)\n"
" * count, increments once every perfsPerCount\n"
" perforations (0 - 9999)\n"
" * offset of frame, in perforations from\n"
" zero-frame reference mark (0 - 119)\n"
" * number of perforations per frame (1 - 15)\n"
" * number of perforations per count (20 - 120)\n"
"\n"
" -timeCode i i\n"
" SMPTE time and control code, specified as a pair\n"
" of 8-digit base-16 integers. The first number\n"
" contains the time address and flags (drop frame,\n"
" color frame, field/phase, bgf0, bgf1, bgf2).\n"
" The second number contains the user data and\n"
" control codes.\n"
"\n"
" -wrapmodes s\n"
" if the image is used as a texture map, specifies\n"
" how the image should be extrapolated outside the\n"
" zero-to-one texture coordinate range\n"
" (string, e.g. \"clamp\" or \"periodic,clamp\")\n"
"\n"
" -pixelAspectRatio f\n"
" width divided by height of a pixel\n"
" (float, >= 0)\n"
"\n"
" -screenWindowWidth f\n"
" width of the screen window (float, >= 0)\n"
"\n"
" -screenWindowCenter f f\n"
" center of the screen window (2 floats)\n"
"\n"
" -string s s\n"
" custom string attribute\n"
" (2 strings, attribute name and value)\n"
"\n"
" -float s f\n"
" custom float attribute (string + float,\n"
" attribute name and value)\n"
"\n"
" -int s i\n"
" custom integer attribute (string + integer,\n"
" attribute name and value)\n"
"\n"
"Other Commands:\n"
"\n"
" -h prints this message\n";
cerr << endl;
}
exit (1);
stream << "\n"
"Read OpenEXR image file infile, set the values of one\n"
"or more attributes in the headers of the file, and save\n"
"the result in outfile. Infile and outfile must not refer\n"
"to the same file (the program cannot edit an image file "
"\"in place\").\n"
"\n"
"Command for selecting headers:\n"
"\n"
" -part i\n"
" If i is greater than or equal to zero, and less\n"
" than the number of parts in the input file, then\n"
" the header for part i becomes \"current.\" If i\n"
" is \"any\" or -1, then all headers become current.\n"
" Subsequent attribute setting commands affect only\n"
" the current header or headers. All headers are\n"
" current before the first -part command.\n"
"\n"
" For example, the command sequence\n"
"\n"
" -focus 3 -part 2 -aperture 8 -expTime 0.01 "
"-part any -owner luke\n"
"\n"
" sets the focus and owner attributes in all\n"
" headers, as well as the aperture and expTime\n"
" attributes in the header of part 2.\n"
"\n"
"Commands for setting attribute values:\n"
"\n"
" -chromaticities f f f f f f f f\n"
" CIE xy chromaticities for the red, green\n"
" and blue primaries, and for the white point\n"
" (8 floats)\n"
"\n"
" -whiteLuminance f\n"
" white luminance, in candelas per square meter\n"
" (float, >= 0.0)\n"
"\n"
" -adoptedNeutral f f\n"
" CIE xy coordinates that should be considered\n"
" \"neutral\" during color rendering. Pixels in\n"
" the image file whose xy coordinates match the\n"
" adoptedNeutral value should be mapped to neutral\n"
" values on the display. (2 floats)\n"
"\n"
" -renderingTransform s\n"
" name of the CTL rendering transform for this\n"
" image (string). This attribute is deprecated.\n"
"\n"
" -lookModTransform s\n"
" name of the CTL look modification transform for\n"
" this image (string). This attribute is deprecated.\n"
"\n"
" -xDensity f\n"
" horizontal output density, in pixels per inch\n"
" (float, >= 0.0)\n"
"\n"
" -owner s\n"
" name of the owner of the image (string)\n"
"\n"
" -comments s\n"
" additional information about the image (string)\n"
"\n"
" -capDate s\n"
" date when the image was created or\n"
" captured, in local time (string,\n"
" formatted as YYYY:MM:DD hh:mm:ss)\n"
"\n"
" -utcOffset f\n"
" offset of local time at capDate from UTC, in\n"
" seconds (float, UTC == local time + x)\n"
"\n"
" -longitude f\n"
" -latitude f\n"
" -altitude f\n"
" location where the image was recorded, in\n"
" degrees east of Greenwich and north of the\n"
" equator, and in meters above sea level\n"
" (float)\n"
"\n"
" -focus f\n"
" the camera's focus distance, in meters\n"
" (float, > 0, or \"infinity\")\n"
"\n"
" -expTime f\n"
" exposure time, in seconds (float, >= 0)\n"
"\n"
" -aperture f\n"
" lens apterture, in f-stops (float, >= 0)\n"
"\n"
" -isoSpeed f\n"
" effective speed of the film or image\n"
" sensor that was used to record the image\n"
" (float, >= 0)\n"
"\n"
" -envmap s\n"
" indicates that the image is an environment map\n"
" (string, LATLONG or CUBE)\n"
"\n"
" -framesPerSecond i i\n"
" playback frame rate expressed as a ratio of two\n"
" integers, n and d (the frame rate is n/d frames\n"
" per second)\n"
"\n"
" -keyCode i i i i i i i\n"
" key code that uniquely identifies a motion\n"
" picture film frame using 7 integers:\n"
" * film manufacturer code (0 - 99)\n"
" * film type code (0 - 99)\n"
" * prefix to identify film roll (0 - 999999)\n"
" * count, increments once every perfsPerCount\n"
" perforations (0 - 9999)\n"
" * offset of frame, in perforations from\n"
" zero-frame reference mark (0 - 119)\n"
" * number of perforations per frame (1 - 15)\n"
" * number of perforations per count (20 - 120)\n"
"\n"
" -timeCode i i\n"
" SMPTE time and control code, specified as a pair\n"
" of 8-digit base-16 integers. The first number\n"
" contains the time address and flags (drop frame,\n"
" color frame, field/phase, bgf0, bgf1, bgf2).\n"
" The second number contains the user data and\n"
" control codes.\n"
"\n"
" -wrapmodes s\n"
" if the image is used as a texture map, specifies\n"
" how the image should be extrapolated outside the\n"
" zero-to-one texture coordinate range\n"
" (string, e.g. \"clamp\" or \"periodic,clamp\")\n"
"\n"
" -pixelAspectRatio f\n"
" width divided by height of a pixel\n"
" (float, >= 0)\n"
"\n"
" -screenWindowWidth f\n"
" width of the screen window (float, >= 0)\n"
"\n"
" -screenWindowCenter f f\n"
" center of the screen window (2 floats)\n"
"\n"
" -string s s\n"
" custom string attribute\n"
" (2 strings, attribute name and value)\n"
"\n"
" -float s f\n"
" custom float attribute (string + float,\n"
" attribute name and value)\n"
"\n"
" -int s i\n"
" custom integer attribute (string + integer,\n"
" attribute name and value)\n"
"\n"
"Other options:\n"
"\n"
" -h, --help print this message\n"
" --version print version information\n"
"\n"
"Report bugs via https://github.com/AcademySoftwareFoundation/openexr/issues or email security@openexr.com\n"
"";
}
struct SetAttr
@@ -229,11 +230,10 @@ isNonNegative (const char attrName[], float f)
{
if (f < 0)
{
cerr << "The value for the " << attrName
<< " attribute "
"must not be less than zero."
<< endl;
exit (1);
std::stringstream e;
e << "The value for the " << attrName
<< " attribute must not be less than zero";
throw invalid_argument(e.str());
}
}
@@ -242,22 +242,20 @@ isPositive (const char attrName[], float f)
{
if (f <= 0)
{
cerr << "The value for the " << attrName
<< " attribute "
"must be greater than zero."
<< endl;
exit (1);
std::stringstream e;
e << "The value for the " << attrName
<< " attribute must be greater than zero";
throw invalid_argument(e.str());
}
}
void
notValidDate (const char attrName[])
{
cerr << "The value for the " << attrName
<< " attribute "
"is not a valid date of the form \"YYYY:MM:DD yy:mm:ss\"."
<< endl;
exit (1);
std::stringstream e;
e << "The value for the " << attrName
<< " attribute is not a valid date of the form \"YYYY:MM:DD yy:mm:ss\"";
throw invalid_argument(e.str());
}
int
@@ -328,7 +326,8 @@ getFloat (
SetAttrVector& attrs,
void (*check) (const char attrName[], float f) = 0)
{
if (i > argc - 2) usageMessage (argv[0]);
if (i > argc - 2)
throw invalid_argument("Expected a float");
float f = static_cast<float> (strtod (argv[i + 1], 0));
@@ -347,8 +346,9 @@ getPosFloatOrInf (
int part,
SetAttrVector& attrs)
{
if (i > argc - 2) usageMessage (argv[0]);
if (i > argc - 2)
throw invalid_argument("Expected a positive float (or \"infinity\")");
float f;
if (!strcmp (argv[i + 1], "inf") || !strcmp (argv[i + 1], "infinity"))
@@ -361,11 +361,10 @@ getPosFloatOrInf (
if (f <= 0)
{
cerr << "The value for the " << attrName
<< " attribute "
"must be greater than zero, or \"infinity\"."
<< endl;
exit (1);
std::stringstream e;
e << "The value for the " << attrName
<< " attribute must be greater than zero, or \"infinity\"";
throw invalid_argument(e.str());
}
}
@@ -383,7 +382,8 @@ getV2f (
SetAttrVector& attrs,
void (*check) (const char attrName[], const V2f& v) = 0)
{
if (i > argc - 3) usageMessage (argv[0]);
if (i > argc - 3)
throw invalid_argument ("Expected two floats");
V2f v (
static_cast<float> (strtod (argv[i + 1], 0)),
@@ -405,7 +405,8 @@ getRational (
SetAttrVector& attrs,
void (*check) (const char attrName[], const Rational& r) = 0)
{
if (i > argc - 3) usageMessage (argv[0]);
if (i > argc - 3)
throw invalid_argument("Expected a rational");
Rational r (strtol (argv[i + 1], 0, 0), strtol (argv[i + 2], 0, 0));
@@ -425,7 +426,8 @@ getString (
SetAttrVector& attrs,
void (*check) (const char attrName[], const char str[]) = 0)
{
if (i > argc - 2) usageMessage (argv[0]);
if (i > argc - 2)
throw invalid_argument("Expected a string");
const char* str = argv[i + 1];
@@ -438,7 +440,8 @@ getString (
void
getNameAndString (int argc, char** argv, int& i, int part, SetAttrVector& attrs)
{
if (i > argc - 3) usageMessage (argv[0]);
if (i > argc - 3)
throw invalid_argument("Expected a name and string");
const char* attrName = argv[i + 1];
const char* str = argv[i + 2];
@@ -449,7 +452,8 @@ getNameAndString (int argc, char** argv, int& i, int part, SetAttrVector& attrs)
void
getNameAndFloat (int argc, char** argv, int& i, int part, SetAttrVector& attrs)
{
if (i > argc - 3) usageMessage (argv[0]);
if (i > argc - 3)
throw invalid_argument("Expected a name and a float");
const char* attrName = argv[i + 1];
float f = static_cast<float> (strtod (argv[i + 2], 0));
@@ -460,7 +464,8 @@ getNameAndFloat (int argc, char** argv, int& i, int part, SetAttrVector& attrs)
void
getNameAndInt (int argc, char** argv, int& i, int part, SetAttrVector& attrs)
{
if (i > argc - 3) usageMessage (argv[0]);
if (i > argc - 3)
throw invalid_argument("Expected a name and an integer");
const char* attrName = argv[i + 1];
int j = strtol (argv[i + 2], 0, 0);
@@ -477,7 +482,8 @@ getChromaticities (
int part,
SetAttrVector& attrs)
{
if (i > argc - 9) usageMessage (argv[0]);
if (i > argc - 9)
throw invalid_argument("Expected 8 chromaticity values");
ChromaticitiesAttribute* a = new ChromaticitiesAttribute;
attrs.push_back (SetAttr (attrName, part, a));
@@ -502,7 +508,8 @@ getEnvmap (
int part,
SetAttrVector& attrs)
{
if (i > argc - 2) usageMessage (argv[0]);
if (i > argc - 2)
throw invalid_argument("Expected an env map");
char* str = argv[i + 1];
Envmap type;
@@ -517,11 +524,10 @@ getEnvmap (
}
else
{
cerr << "The value for the " << attrName
<< " attribute "
"must be either LATLONG or CUBE."
<< endl;
exit (1);
std::stringstream e;
e << "The value for the " << attrName
<< " attribute must be either LATLONG or CUBE";
throw invalid_argument(e.str());
}
attrs.push_back (SetAttr (attrName, part, new EnvmapAttribute (type)));
@@ -537,7 +543,8 @@ getKeyCode (
int part,
SetAttrVector& attrs)
{
if (i > argc - 8) usageMessage (argv[0]);
if (i > argc - 8)
throw invalid_argument("Expected a key code");
KeyCodeAttribute* a = new KeyCodeAttribute;
attrs.push_back (SetAttr (attrName, part, a));
@@ -561,7 +568,8 @@ getTimeCode (
int part,
SetAttrVector& attrs)
{
if (i > argc - 3) usageMessage (argv[0]);
if (i > argc - 3)
throw invalid_argument("Expected a time code");
TimeCodeAttribute* a = new TimeCodeAttribute;
attrs.push_back (SetAttr (attrName, part, a));
@@ -574,7 +582,8 @@ getTimeCode (
void
getPart (const char attrName[], int argc, char** argv, int& i, int& part)
{
if (i > argc - 2) usageMessage (argv[0]);
if (i > argc - 2)
throw invalid_argument("Expected a part number (or \"any\")");
if (!strcmp (argv[i + 1], "any"))
part = -1;
@@ -591,9 +600,11 @@ main (int argc, char** argv)
// Parse the command line.
//
if (argc < 2) usageMessage (argv[0], true);
int exitStatus = 0;
if (argc < 2)
{
usageMessage (cerr, argv[0], false);
return 1;
}
try
{
@@ -724,9 +735,23 @@ main (int argc, char** argv)
{
getNameAndInt (argc, argv, i, part, attrs);
}
else if (!strcmp (argv[i], "-h"))
else if (!strcmp (argv[i], "-h") || !strcmp (argv[i], "--help"))
{
usageMessage (argv[0], true);
usageMessage (cout, "exrstdattr", true);
return 0;
}
else if (!strcmp (argv[i], "--version"))
{
const char* libraryVersion = getLibraryVersion();
cout << "exrstdattr (OpenEXR) " << OPENEXR_VERSION_STRING;
if (strcmp(libraryVersion, OPENEXR_VERSION_STRING))
cout << "(OpenEXR version " << libraryVersion << ")";
cout << " https://openexr.com" << endl;
cout << "Copyright (c) Contributors to the OpenEXR Project" << endl;
cout << "License BSD-3-Clause" << endl;
return 0;
}
else
{
@@ -739,13 +764,13 @@ main (int argc, char** argv)
}
}
if (inFileName == 0 || outFileName == 0) usageMessage (argv[0]);
if (inFileName == 0)
throw invalid_argument("Missing input filename");
if (outFileName == 0)
throw invalid_argument("Missing input filename");
if (!strcmp (inFileName, outFileName))
{
cerr << "Input and output cannot be the same file." << endl;
return 1;
}
throw invalid_argument("Input and output cannot be the same file");
//
// Load the headers from the input file
@@ -826,9 +851,9 @@ main (int argc, char** argv)
}
catch (const exception& e)
{
cerr << e.what () << endl;
exitStatus = 1;
cerr << argv[0] << ": " << e.what () << endl;
return 1;
}
return exitStatus;
return 0;
}
+28
View File
@@ -0,0 +1,28 @@
cc_test(
name = "OpenEXRExamples",
srcs = [
"deepExamples.cpp",
"deepExamples.h",
"deepTiledExamples.cpp",
"deepTiledExamples.h",
"drawImage.cpp",
"drawImage.h",
"generalInterfaceExamples.cpp",
"generalInterfaceExamples.h",
"generalInterfaceTiledExamples.cpp",
"generalInterfaceTiledExamples.h",
"lowLevelIoExamples.cpp",
"lowLevelIoExamples.h",
"main.cpp",
"multipartExamples.cpp",
"multipartExamples.h",
"namespaceAlias.h",
"previewImageExamples.cpp",
"previewImageExamples.h",
"rgbaInterfaceExamples.cpp",
"rgbaInterfaceExamples.h",
"rgbaInterfaceTiledExamples.cpp",
"rgbaInterfaceTiledExamples.h",
],
deps = ["//:OpenEXR"],
)
+12
View File
@@ -29,6 +29,12 @@ add_executable(OpenEXRExamples
rgbaInterfaceExamples.h
rgbaInterfaceTiledExamples.cpp
rgbaInterfaceTiledExamples.h
deepExamples.cpp
deepExamples.h
deepTiledExamples.cpp
deepTiledExamples.h
multipartExamples.cpp
multipartExamples.h
)
target_link_libraries(OpenEXRExamples OpenEXR::OpenEXR)
@@ -58,6 +64,12 @@ install(
rgbaInterfaceExamples.h
rgbaInterfaceTiledExamples.cpp
rgbaInterfaceTiledExamples.h
deepExamples.cpp
deepExamples.h
deepTiledExamples.cpp
deepTiledExamples.h
multipartExamples.cpp
multipartExamples.h
DESTINATION
${CMAKE_INSTALL_DOCDIR}/examples
)
+256
View File
@@ -0,0 +1,256 @@
//
// SPDX-License-Identifier: BSD-3-Clause
// Copyright (c) Contributors to the OpenEXR Project.
//
//-----------------------------------------------------------------------------
//
// Code examples that show how class DeepScanLineInputFile and
// class DeepScanLineOutputFile can be used to read and write
// OpenEXR image files with 16-bit floating-point green,
// and 32-bit floating point depth channels.
//
//-----------------------------------------------------------------------------
#include <ImfArray.h>
#include <ImfHeader.h>
#include <ImfPartType.h>
#include <ImfChannelList.h>
#include <ImfDeepFrameBuffer.h>
#include <ImfDeepScanLineInputFile.h>
#include <ImfDeepScanLineOutputFile.h>
#include "drawImage.h"
#include "namespaceAlias.h"
using namespace IMF;
using namespace std;
using namespace IMATH_NAMESPACE;
void
readDeepScanlineFile (
const char filename[],
Box2i& displayWindow,
Box2i& dataWindow,
Array2D<float*>& dataZ,
Array2D<half*>& dataA,
Array2D<unsigned int>& sampleCount)
{
//
// Read a deep image using class DeepScanLineInputFile. Try to read one
// channel, A, of type HALF, and one channel, Z,
// of type FLOAT. Store the A, and Z pixels in two
// separate memory buffers.
//
// - open the file
// - allocate memory for the pixels
// - describe the layout of the A, and Z pixel buffers
// - read the sample counts from the file
// - allocate the memory requred to store the samples
// - read the pixels from the file
//
DeepScanLineInputFile file (filename);
const Header& header = file.header ();
dataWindow = header.dataWindow ();
displayWindow = header.displayWindow ();
int width = dataWindow.max.x - dataWindow.min.x + 1;
int height = dataWindow.max.y - dataWindow.min.y + 1;
sampleCount.resizeErase (height, width);
dataZ.resizeErase (height, width);
dataA.resizeErase (height, width);
DeepFrameBuffer frameBuffer;
frameBuffer.insertSampleCountSlice (Slice (
UINT,
(char*) (&sampleCount[0][0] - dataWindow.min.x - dataWindow.min.y * width),
sizeof (unsigned int) * 1, // xStride
sizeof (unsigned int) * width)); // yStride
frameBuffer.insert (
"dataZ",
DeepSlice (
FLOAT,
(char*) (&dataZ[0][0] - dataWindow.min.x - dataWindow.min.y * width),
sizeof (float*) * 1, // xStride for pointer array
sizeof (float*) * width, // yStride for pointer array
sizeof (float) * 1)); // stride for Z data sample
frameBuffer.insert (
"dataA",
DeepSlice (
HALF,
(char*) (&dataA[0][0] - dataWindow.min.x - dataWindow.min.y * width),
sizeof (half*) * 1, // xStride for pointer array
sizeof (half*) * width, // yStride for pointer array
sizeof (half) * 1)); // stride for O data sample
file.setFrameBuffer (frameBuffer);
file.readPixelSampleCounts (dataWindow.min.y, dataWindow.max.y);
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
dataZ[i][j] = new float[sampleCount[i][j]];
dataA[i][j] = new half[sampleCount[i][j]];
}
}
file.readPixels (dataWindow.min.y, dataWindow.max.y);
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
delete[] dataZ[i][j];
delete[] dataA[i][j];
}
}
}
unsigned int getPixelSampleCount (int i, int j)
{
// Dummy code creating deep data from a flat image
return 1;
}
Array2D<float> testDataZ;
Array2D<half> testDataA;
void getPixelSampleData(
int i,
int j,
Array2D<float*>& dataZ,
Array2D<half*>& dataA)
{
// Dummy code creating deep data from a flat image
dataZ[i][j][0] = testDataZ[i][j];
dataA[i][j][0] = testDataA[i][j];
}
void
writeDeepScanlineFile (
const char filename[],
Box2i displayWindow,
Box2i dataWindow,
Array2D<float*>& dataZ,
Array2D<half*>& dataA,
Array2D<unsigned int>& sampleCount)
{
//
// Write a deep image with only a A (alpha) and a Z (depth) channel,
// using class DeepScanLineOutputFile.
//
// - create a file header
// - add A and Z channels to the header
// - open the file, and store the header in the file
// - describe the memory layout of the A and Z pixels
// - store the pixels in the file
//
int height = dataWindow.max.y - dataWindow.min.y + 1;
int width = dataWindow.max.x - dataWindow.min.x + 1;
Header header (displayWindow, dataWindow);
header.channels ().insert ("Z", Channel (FLOAT));
header.channels ().insert ("A", Channel (HALF));
header.setType (DEEPSCANLINE);
header.compression () = ZIPS_COMPRESSION;
DeepScanLineOutputFile file (filename, header);
DeepFrameBuffer frameBuffer;
frameBuffer.insertSampleCountSlice (Slice (
UINT,
(char*) (&sampleCount[0][0] - dataWindow.min.x - dataWindow.min.y * width),
sizeof (unsigned int) * 1, // xS
sizeof (unsigned int) * width)); // yStride
frameBuffer.insert (
"Z",
DeepSlice (
FLOAT,
(char*) (&dataZ[0][0] - dataWindow.min.x - dataWindow.min.y * width),
sizeof (float*) * 1, // xStride for pointer
sizeof (float*) * width, // yStride for pointer array
sizeof (float) * 1)); // stride for Z data sample
frameBuffer.insert (
"A",
DeepSlice (
HALF,
(char*) (&dataA[0][0] - dataWindow.min.x - dataWindow.min.y * width),
sizeof (half*) * 1, // xStride for pointer array
sizeof (half*) * width, // yStride for pointer array
sizeof (half) * 1)); // stride for A data sample
file.setFrameBuffer (frameBuffer);
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
sampleCount[i][j] = getPixelSampleCount (i, j);
dataZ[i][j] = new float[sampleCount[i][j]];
dataA[i][j] = new half[sampleCount[i][j]];
// Generate data for dataZ and dataA.
getPixelSampleData(i, j, dataZ, dataA);
}
file.writePixels (1);
}
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
delete[] dataZ[i][j];
delete[] dataA[i][j];
}
}
}
void deepExamples()
{
int w = 800;
int h = 600;
Box2i window;
window.min.setValue(0, 0);
window.max.setValue(w - 1, h - 1);
Array2D<float *> dataZ;
dataZ.resizeErase(h, w);
Array2D<half *> dataA;
dataA.resizeErase(h, w);
Array2D<unsigned int> sampleCount;
sampleCount.resizeErase(h, w);
// Create an image to be used as a source for deep data
testDataA.resizeErase(h, w);
testDataZ.resizeErase(h, w);
drawImage2(testDataA, testDataZ, w, h);
writeDeepScanlineFile("test.deep.exr", window, window, dataZ, dataA, sampleCount);
readDeepScanlineFile ("test.deep.exr", window, window, dataZ, dataA, sampleCount);
}
+6
View File
@@ -0,0 +1,6 @@
//
// SPDX-License-Identifier: BSD-3-Clause
// Copyright (c) Contributors to the OpenEXR Project.
//
void deepExamples ();
+278
View File
@@ -0,0 +1,278 @@
//
// SPDX-License-Identifier: BSD-3-Clause
// Copyright (c) Contributors to the OpenEXR Project.
//
//-----------------------------------------------------------------------------
//
// Code examples that show how class DeepTiledInputFile and
// class DeepTiledOutputFile can be used to read and write
// OpenEXR image files with 16-bit floating-point green,
// and 32-bit floating point depth channels.
//
//-----------------------------------------------------------------------------
#include <ImfArray.h>
#include <ImfHeader.h>
#include <ImfPartType.h>
#include <ImfChannelList.h>
#include <ImfDeepFrameBuffer.h>
#include <ImfDeepTiledInputFile.h>
#include <ImfDeepTiledOutputFile.h>
#include "drawImage.h"
#include "namespaceAlias.h"
using namespace IMF;
using namespace std;
using namespace IMATH_NAMESPACE;
// defined in deepExamples.cpp
extern Array2D<float> testDataZ;
extern Array2D<half> testDataA;
extern unsigned int getPixelSampleCount (int i, int j);
extern void getPixelSampleData(
int i,
int j,
Array2D<float*>& dataZ,
Array2D<half*>& dataA);
void
readDeepTiledFile (
const char filename[],
Box2i& displayWindow,
Box2i& dataWindow,
Array2D<float*>& dataZ,
Array2D<half*>& dataA,
Array2D<unsigned int>& sampleCount)
{
//
// Read a deep image using class DeepTiledInputFile. Try to read one
// channel, A, of type HALF, and one channel, Z,
// of type FLOAT. Store the A, and Z pixels in two
// separate memory buffers.
//
// - open the file
// - allocate memory for the pixels
// - describe the layout of the A, and Z pixel buffers
// - read the sample counts from the file
// - allocate the memory requred to store the samples
// - read the pixels from the file
//
DeepTiledInputFile file (filename);
int width = dataWindow.max.x - dataWindow.min.x + 1;
int height = dataWindow.max.y - dataWindow.min.y + 1;
sampleCount.resizeErase (height, width);
dataZ.resizeErase (height, width);
dataA.resizeErase (height, width);
DeepFrameBuffer frameBuffer;
frameBuffer.insertSampleCountSlice (Slice (
UINT,
(char*) (&sampleCount[0][0] - dataWindow.min.x - dataWindow.min.y * width),
sizeof (unsigned int) * 1, // xStride
sizeof (unsigned int) * width)); // yStride
frameBuffer.insert (
"Z",
DeepSlice (
FLOAT,
(char*) (&dataZ[0][0] - dataWindow.min.x - dataWindow.min.y * width),
sizeof (float*) * 1, // xStride for pointer array
sizeof (float*) * width, // yStride for pointer array
sizeof (float) * 1)); // stride for samples
frameBuffer.insert (
"A",
DeepSlice (
HALF,
(char*) (&dataA[0][0] - dataWindow.min.x - dataWindow.min.y * width),
sizeof (half*) * 1, // xStride for pointer array
sizeof (half*) * width, // yStride for pointer array
sizeof (half) * 1)); // stride for samples
file.setFrameBuffer (frameBuffer);
int numXTiles = file.numXTiles (0);
int numYTiles = file.numYTiles (0);
file.readPixelSampleCounts (0, numXTiles - 1, 0, numYTiles - 1);
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
dataZ[i][j] = new float[sampleCount[i][j]];
dataA[i][j] = new half[sampleCount[i][j]];
}
}
file.readTiles (0, numXTiles - 1, 0, numYTiles - 1);
// (after read data is processed, data must be freed:)
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
delete[] dataZ[i][j];
delete[] dataA[i][j];
}
}
}
void getSampleDataForTile (
int i,
int j,
int tileSizeX,
int tileSizeY,
Array2D<unsigned int>& sampleCount,
Array2D<float*>& dataZ,
Array2D<half*>& dataA)
{
for (int k = 0; k < tileSizeY; k++)
{
int y = j * tileSizeY + k;
if (y >= sampleCount.height()) break;
for (int l = 0; l < tileSizeX; l++)
{
int x = i * tileSizeX + l;
if (x >= sampleCount.width()) break;
sampleCount[y][x] = getPixelSampleCount(y, x);
dataZ[y][x] = new float[sampleCount[y][x]];
dataA[y][x] = new half [sampleCount[y][x]];
getPixelSampleData(y, x, dataZ, dataA);
}
}
}
void
writeDeepTiledFile (
const char filename[],
Box2i displayWindow,
Box2i dataWindow,
int tileSizeX,
int tileSizeY)
{
//
// Write a deep image with only a A (alpha) and a Z (depth) channel,
// using class DeepTiledOutputFile.
//
// - create a file header
// - add A and Z channels to the header
// - open the file, and store the header in the file
// - describe the memory layout of the A and Z pixels
// - store the pixels in the file
//
int height = dataWindow.max.y - dataWindow.min.y + 1;
int width = dataWindow.max.x - dataWindow.min.x + 1;
Header header (displayWindow, dataWindow);
header.channels ().insert ("Z", Channel (FLOAT));
header.channels ().insert ("A", Channel (HALF));
header.setType (DEEPTILE);
header.compression () = ZIPS_COMPRESSION;
header.setTileDescription (
TileDescription (tileSizeX, tileSizeY, ONE_LEVEL));
Array2D<float*> dataZ;
dataZ.resizeErase (height, width);
Array2D<half*> dataA;
dataA.resizeErase (height, width);
Array2D<unsigned int> sampleCount;
sampleCount.resizeErase (height, width);
DeepTiledOutputFile file (filename, header);
DeepFrameBuffer frameBuffer;
frameBuffer.insertSampleCountSlice (Slice (
UINT,
(char*) (&sampleCount[0][0] - dataWindow.min.x - dataWindow.min.y * width),
sizeof (unsigned int) * 1, // xStride
sizeof (unsigned int) * width)); // yStride
frameBuffer.insert (
"Z",
DeepSlice (
FLOAT,
(char*) (&dataZ[0][0] - dataWindow.min.x - dataWindow.min.y * width),
sizeof (float*) * 1, // xStride for pointer array
sizeof (float*) * width, // yStride for pointer array
sizeof (float) * 1)); // stride for samples
frameBuffer.insert (
"A",
DeepSlice (
HALF,
(char*) (&dataA[0][0] - dataWindow.min.x - dataWindow.min.y * width),
sizeof (half*) * 1, // xStride for pointer array
sizeof (half*) * width, // yStride for pointer array
sizeof (half) * 1)); // stride for samples
file.setFrameBuffer (frameBuffer);
for (int j = 0; j < file.numYTiles (0); j++)
{
for (int i = 0; i < file.numXTiles (0); i++)
{
// Generate data for sampleCount, dataZ and dataA.
getSampleDataForTile (i, j, tileSizeX, tileSizeY, sampleCount, dataZ, dataA);
file.writeTile (i, j, 0);
}
}
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
delete[] dataZ[i][j];
delete[] dataA[i][j];
}
}
}
void deepTiledExamples()
{
int w = 800;
int h = 600;
int tileSizeX = 64;
int tileSizeY = 64;
Box2i window;
window.min.setValue(0, 0);
window.max.setValue(w - 1, h - 1);
Array2D<float *> dataZ;
dataZ.resizeErase(h, w);
Array2D<half *> dataA;
dataA.resizeErase(h, w);
Array2D<unsigned int> sampleCount;
sampleCount.resizeErase(h, w);
// Create an image to be used as a source for deep data
testDataA.resizeErase(h, w);
testDataZ.resizeErase(h, w);
drawImage2(testDataA, testDataZ, w, h);
writeDeepTiledFile("testTiled.deep.exr", window, window, tileSizeX, tileSizeY);
readDeepTiledFile ("testTiled.deep.exr", window, window, dataZ, dataA, sampleCount);
}
+6
View File
@@ -0,0 +1,6 @@
//
// SPDX-License-Identifier: BSD-3-Clause
// Copyright (c) Contributors to the OpenEXR Project.
//
void deepTiledExamples ();
+1 -1
View File
@@ -44,7 +44,7 @@ writeGZ1 (
// - create a file header
// - add G and Z channels to the header
// - open the file, and store the header in the file
// - describe the memory layout of the G anx Z pixels
// - describe the memory layout of the G and Z pixels
// - store the pixels in the file
//
+13
View File
@@ -9,6 +9,9 @@
#include "previewImageExamples.h"
#include "rgbaInterfaceExamples.h"
#include "rgbaInterfaceTiledExamples.h"
#include "deepExamples.h"
#include "deepTiledExamples.h"
#include "multipartExamples.h"
#include <iostream>
#include <stdexcept>
@@ -24,9 +27,19 @@ main (int argc, char* argv[])
rgbaInterfaceTiledExamples ();
generalInterfaceTiledExamples ();
deepExamples ();
deepTiledExamples ();
lowLevelIoExamples ();
previewImageExamples ();
// This example uses the files created by
// generalInterfaceExamples,
// generalInterfaceTiledExamples,
// deepExamples,
// deepTiledExamples
multipartExamples ();
}
catch (const std::exception& exc)
{
+491
View File
@@ -0,0 +1,491 @@
//
// SPDX-License-Identifier: BSD-3-Clause
// Copyright (c) Contributors to the OpenEXR Project.
//
//-----------------------------------------------------------------------------
//
// Code examples that show how class MultiPartInputFile and
// class MultiPartOutputFile can be used to read and write
// OpenEXR image files containing multiple images.
//
//-----------------------------------------------------------------------------
#include <ImfHeader.h>
#include <ImfPartType.h>
#include <ImfChannelList.h>
#include <ImfArray.h>
#include <ImfFrameBuffer.h>
#include <ImfDeepFrameBuffer.h>
#include <ImfMultiPartInputFile.h>
#include <ImfMultiPartOutputFile.h>
#include <ImfInputPart.h>
#include <ImfTiledInputPart.h>
#include <ImfDeepScanLineInputPart.h>
#include <ImfDeepTiledInputPart.h>
#include <ImfOutputPart.h>
#include <ImfTiledOutputPart.h>
#include <ImfDeepScanLineOutputPart.h>
#include <ImfDeepTiledOutputPart.h>
#include <vector>
#include <list>
#include "namespaceAlias.h"
using namespace IMF;
using namespace std;
using namespace IMATH_NAMESPACE;
template <class InputPartType, class OutputPartType>
void copyPixels (
MultiPartInputFile & inputFile,
MultiPartOutputFile & outputFile,
int inputPartNumber,
int outputPartNumber)
{
InputPartType inPart (inputFile, inputPartNumber);
OutputPartType outPart (outputFile, outputPartNumber);
outPart.copyPixels (inPart);
}
void copyPixels(
const std::string & type,
MultiPartInputFile & inputFile,
MultiPartOutputFile & outputFile,
int inputPartNumber,
int outputPartNumber)
{
//
// Copy pixels from a given part of a multipart input file
// to a given part of a multipart output file.
//
if (type == SCANLINEIMAGE)
{
copyPixels<InputPart, OutputPart> (inputFile, outputFile, inputPartNumber, outputPartNumber);
}
else if (type == TILEDIMAGE)
{
copyPixels<TiledInputPart, TiledOutputPart> (inputFile, outputFile, inputPartNumber, outputPartNumber);
}
else if (type == DEEPSCANLINE)
{
copyPixels<DeepScanLineInputPart, DeepScanLineOutputPart> (inputFile, outputFile, inputPartNumber, outputPartNumber);
}
else if (type == DEEPTILE)
{
copyPixels<DeepTiledInputPart, DeepTiledOutputPart> (inputFile, outputFile, inputPartNumber, outputPartNumber);
}
}
void combineFiles ()
{
//
// Read multiple single-part input files and write them as a multi-part file.
// If an input file is multi-part, only one part is copied.
// All input files dimentions must be the same.
//
std::vector<MultiPartInputFile *> inputFiles;
std::vector<Header> headers;
const char * filenames[] = {"gz1.exr", "tiledgz1.exr", "test.deep.exr", "testTiled.deep.exr"};
for (int i = 0; i < sizeof (filenames) / sizeof (filenames[0]); i++)
{
MultiPartInputFile * in_file = new MultiPartInputFile (filenames[i]);
Header header = in_file->header (0);
if (!header.hasName ())
{
header.setName (filenames[i]);
}
inputFiles.push_back (in_file);
headers.push_back (header);
}
MultiPartOutputFile outputFile ("multipart.exr", headers.data (), (int)headers.size ());
for (int i = 0; i < sizeof (filenames) / sizeof (filenames[0]); i++)
{
Header & header = headers[i];
const string& type = header.type ();
copyPixels (type, *inputFiles[i], outputFile, 0, i);
delete inputFiles[i];
}
}
void splitFiles ()
{
//
// Read a multi-part input file and write all parts as separate files.
//
MultiPartInputFile inputFile ("modified.exr");
for (int i = 0; i < inputFile.parts (); i++)
{
Header header = inputFile.header (i);
string out_path = string ("split_part_") + to_string (i) + string (".exr");
const string& type = header.type ();
MultiPartOutputFile outputFile (out_path.c_str (), &header, 1);
copyPixels (type, inputFile, outputFile, i, 0);
}
}
template <typename ValueType>
void insertSlice(
Box2i & dataWindow,
FrameBuffer & frameBuffer,
const char name[],
PixelType pixelType,
list<Array2D<ValueType>> & channels)
{
//
// Allocate a pixel buffer and describe the layout of
// the buffer in the FrameBuffer object.
//
size_t width = dataWindow.max.x - dataWindow.min.x + 1;
size_t height = dataWindow.max.y - dataWindow.min.y + 1;
channels.emplace_back ();
Array2D<ValueType> & buffer = channels.back ();
buffer.resizeErase (height, width);
char * base = (char *)(&buffer[0][0] - dataWindow.min.x - dataWindow.min.y * width);
frameBuffer.insert (
name, // name
Slice (
pixelType, // type
base, // base
sizeof (ValueType) * 1, // xStride
sizeof (ValueType) * width // yStride
)
);
}
template <typename ValueType>
void insertDeepSlice(
Box2i & dataWindow,
DeepFrameBuffer & frameBuffer,
const char name[],
PixelType pixelType,
list<Array2D<ValueType *>> & channels)
{
//
// Allocate a pixel buffer and describe the layout of
// the buffer in the DeepFrameBuffer object.
//
size_t width = dataWindow.max.x - dataWindow.min.x + 1;
size_t height = dataWindow.max.y - dataWindow.min.y + 1;
channels.emplace_back ();
Array2D<ValueType *> & buffer = channels.back ();
buffer.resizeErase (height, width);
char * base = (char *)(&buffer[0][0] - dataWindow.min.x - dataWindow.min.y * width);
frameBuffer.insert (
name, // name
DeepSlice (
pixelType, // type
base, // base
sizeof (ValueType *) * 1, // xStride
sizeof (ValueType *) * width, // yStride
sizeof (ValueType) * width // sample stride
)
);
}
FrameBuffer setupFramebuffer (
const Header & header,
list<Array2D<uint32_t>> & intChannels,
list<Array2D<half>> & halfChannels,
list<Array2D<float>> & floatChannels
)
{
//
// Allocate pixel buffers for all channels specified in the header, describe the layout of
// the buffers in the FrameBuffer object.
//
FrameBuffer frameBuffer;
Box2i dataWindow = header.dataWindow ();
for (auto i = header.channels ().begin (); i != header.channels ().end (); i++)
{
if (i.channel ().type == UINT)
{
insertSlice<uint32_t> (dataWindow, frameBuffer, i.name (), i.channel ().type, intChannels);
}
else if (i.channel ().type == HALF)
{
insertSlice<half> (dataWindow, frameBuffer, i.name (), i.channel ().type, halfChannels);
}
else if (i.channel ().type == FLOAT)
{
insertSlice<float> (dataWindow, frameBuffer, i.name (), i.channel ().type, floatChannels);
}
}
return frameBuffer;
}
DeepFrameBuffer setupDeepFramebuffer (
const Header & header,
Array2D<uint32_t> & sampleCount,
list<Array2D<uint32_t *>> & intChannels,
list<Array2D<half *>> & halfChannels,
list<Array2D<float *>> & floatChannels
)
{
//
// Allocate pixel buffers for all channels specified in the header, describe the layout of
// the buffers in the DeepFrameBuffer object.
//
DeepFrameBuffer frameBuffer;
Box2i dataWindow = header.dataWindow ();
size_t width = dataWindow.max.x - dataWindow.min.x + 1;
size_t height = dataWindow.max.y - dataWindow.min.y + 1;
sampleCount.resizeErase (height, width);
frameBuffer.insertSampleCountSlice (
Slice (
UINT,
(char*) (&sampleCount[0][0] - dataWindow.min.x - dataWindow.min.y * width),
sizeof (unsigned int) * 1, // xStride
sizeof (unsigned int) * width // yStride
)
);
for (auto i = header.channels ().begin (); i != header.channels ().end (); i++)
{
if (i.channel ().type == UINT)
{
insertDeepSlice<uint32_t> (dataWindow, frameBuffer, i.name (), i.channel ().type, intChannels);
}
else if (i.channel ().type == HALF)
{
insertDeepSlice<half> (dataWindow, frameBuffer, i.name (), i.channel ().type, halfChannels);
}
else if (i.channel ().type == FLOAT)
{
insertDeepSlice<float> (dataWindow, frameBuffer, i.name (), i.channel ().type, floatChannels);
}
}
return frameBuffer;
}
template <typename T>
void resizeDeepBuffers (
Array2D<uint32_t> & sampleCount,
list<Array2D<T *>> & channels
)
{
//
// Allocate memory for samples in all pixel buffers according to the data in sampleCount buffer.
//
for (auto i = channels.begin (); i != channels.end (); i++)
{
Array2D<T *> & channel = *i;
for (int y = 0; y < channel.height (); y++)
{
for (int x = 0; x < channel.width (); x++)
{
uint32_t count = sampleCount[y][x];
channel[y][x] = new T [count];
}
}
}
}
template <typename T>
void modifyChannels(list<Array2D<T>> & channels, T delta)
{
//
// Dummy code modifying each pixel by incrementing every channel by a given delta.
//
for (auto i = channels.begin (); i != channels.end (); i++)
{
Array2D<T> & channel = *i;
for (int y = 0; y < channel.height (); y++)
{
for (int x = 0; x < channel.width (); x++)
{
channel[y][x] += delta;
}
}
}
}
template <typename T>
void modifyDeepChannels(Array2D<uint32_t> & sampleCount, list<Array2D<T *>> & channels, T delta)
{
//
// Dummy code modifying each deep pixel by incrementing every sample of each channel by a given delta.
//
for (auto i = channels.begin (); i != channels.end (); i++)
{
Array2D<T *> & channel = *i;
for (int y = 0; y < channel.height (); y++)
{
for (int x = 0; x < channel.width (); x++)
{
uint32_t count = sampleCount[y][x];
for (int j = 0; j < count; j++)
channel[y][x][j] += delta;
}
}
}
}
void modifyMultipart ()
{
//
// Read all channels from a multi-part file, modify each pixel value, write the modified data as a multi-part file.
// The parts in the file can be scanline- or tile-based, either flat or deep.
// Every channel of the input file gets modified.
//
MultiPartInputFile inputFile ("multipart.exr");
std::vector<Header> headers (inputFile.parts ());
for (int i = 0; i < inputFile.parts (); i++)
{
headers[i] = inputFile.header (i);
}
MultiPartOutputFile outputFile("modified.exr", headers.data (), (int)headers.size ());
for (int i = 0; i < inputFile.parts (); i++)
{
Header & header = headers[i];
const string& type = header.type ();
if (type == SCANLINEIMAGE ||
type == TILEDIMAGE)
{
list<Array2D<uint32_t>> intChannels;
list<Array2D<half>> halfChannels;
list<Array2D<float>> floatChannels;
FrameBuffer frameBuffer = setupFramebuffer (header, intChannels, halfChannels, floatChannels);
if (type == SCANLINEIMAGE)
{
InputPart inputPart (inputFile, i);
inputPart.setFrameBuffer (frameBuffer);
inputPart.readPixels (header.dataWindow ().min.y, header.dataWindow ().max.y);
}
else
{
TiledInputPart inputPart (inputFile, i);
inputPart.setFrameBuffer (frameBuffer);
inputPart.readTiles (0, inputPart.numXTiles () - 1, 0, inputPart.numYTiles () - 1);
}
modifyChannels<uint32_t> (intChannels, 1);
modifyChannels<half> (halfChannels, 0.3);
modifyChannels<float> (floatChannels, 0.5);
if (type == SCANLINEIMAGE)
{
Box2i dataWindow = header.dataWindow ();
OutputPart outputPart (outputFile, i);
outputPart.setFrameBuffer (frameBuffer);
outputPart.writePixels (header.dataWindow ().max.y - header.dataWindow ().min.y + 1);
}
else
{
TiledOutputPart outputPart (outputFile, i);
outputPart.setFrameBuffer (frameBuffer);
outputPart.writeTiles (0, outputPart.numXTiles () - 1, 0, outputPart.numYTiles () - 1);
}
}
else if (type == DEEPSCANLINE || type == DEEPTILE)
{
Array2D<uint32_t> sampleCount;
list<Array2D<uint32_t *>> intChannels;
list<Array2D<half *>> halfChannels;
list<Array2D<float *>> floatChannels;
DeepFrameBuffer frameBuffer = setupDeepFramebuffer (header, sampleCount, intChannels, halfChannels, floatChannels);
if (type == DEEPSCANLINE)
{
DeepScanLineInputPart inputPart (inputFile, i);
inputPart.setFrameBuffer (frameBuffer);
inputPart.readPixelSampleCounts (header.dataWindow ().min.y, header.dataWindow ().max.y);
resizeDeepBuffers<uint32_t> (sampleCount, intChannels);
resizeDeepBuffers<half> (sampleCount, halfChannels);
resizeDeepBuffers<float> (sampleCount, floatChannels);
inputPart.readPixels (header.dataWindow ().min.y, header.dataWindow ().max.y);
}
else
{
DeepTiledInputPart inputPart (inputFile, i);
inputPart.setFrameBuffer (frameBuffer);
inputPart.readPixelSampleCounts (0, inputPart.numXTiles () - 1, 0, inputPart.numYTiles () - 1);
resizeDeepBuffers<uint32_t> (sampleCount, intChannels);
resizeDeepBuffers<half> (sampleCount, halfChannels);
resizeDeepBuffers<float> (sampleCount, floatChannels);
inputPart.readTiles (0, inputPart.numXTiles () - 1, 0, inputPart.numYTiles () - 1);
}
modifyDeepChannels<uint32_t> (sampleCount, intChannels, 1);
modifyDeepChannels<half> (sampleCount, halfChannels, 0.3);
modifyDeepChannels<float> (sampleCount, floatChannels, 0.5);
if (type == DEEPSCANLINE)
{
Box2i dataWindow = header.dataWindow ();
DeepScanLineOutputPart outputPart (outputFile, i);
outputPart.setFrameBuffer (frameBuffer);
outputPart.writePixels (header.dataWindow ().max.y - header.dataWindow ().min.y + 1);
}
else
{
DeepTiledOutputPart outputPart (outputFile, i);
outputPart.setFrameBuffer (frameBuffer);
outputPart.writeTiles (0, outputPart.numXTiles () - 1, 0, outputPart.numYTiles () - 1);
}
}
}
}
void multipartExamples()
{
// Read multiple single-part files and write them out as a single multi-part file.
combineFiles ();
// Read all parts from a multi-part file, modify each channel of every pixel by incrementing its value, write out as a multi-part file.
modifyMultipart ();
// Read a multi-part file and write out as multiple single-part files.
splitFiles ();
}
+7
View File
@@ -0,0 +1,7 @@
//
// SPDX-License-Identifier: BSD-3-Clause
// Copyright (c) Contributors to the OpenEXR Project.
//
void multipartExamples ();
+2 -2
View File
@@ -243,14 +243,14 @@ restoreControlRegs (const ucontext_t& ucon, bool clearExceptions)
inline void
restoreControlRegs (const ucontext_t& ucon, bool clearExceptions)
{
# if (defined(__GLIBC__) && defined(__i386__)) || defined(__ANDROID_API__)
# if (defined(__linux__) && defined(__i386__)) || defined(__ANDROID_API__)
setCw ((ucon.uc_mcontext.fpregs->cw & cwRestoreMask) | cwRestoreVal);
# else
setCw ((ucon.uc_mcontext.fpregs->cwd & cwRestoreMask) | cwRestoreVal);
# endif
_fpstate* kfp = reinterpret_cast<_fpstate*> (ucon.uc_mcontext.fpregs);
# if defined(__GLIBC__) && defined(__i386__)
# if defined(__linux__) && defined(__i386__)
setMxcsr (kfp->magic == 0 ? kfp->mxcsr : 0, clearExceptions);
# else
setMxcsr (kfp->mxcsr, clearExceptions);
+1 -1
View File
@@ -8,7 +8,7 @@
#include "OpenEXRConfig.h"
// See docs/SymbolVisibility.md for more discussion
// See website/SymbolVisibility.rst for more discussion
/// \addtogroup ExportMacros
/// @{
+299 -412
View File
@@ -15,12 +15,17 @@
#include "IlmThreadSemaphore.h"
#include <atomic>
#include <limits>
#include <memory>
#include <mutex>
#include <thread>
#include <vector>
using namespace std;
#if (defined(_WIN32) || defined(_WIN64))
# include <windows.h>
#else
# include <unistd.h>
#endif
ILMTHREAD_INTERNAL_NAMESPACE_SOURCE_ENTER
@@ -28,10 +33,56 @@ ILMTHREAD_INTERNAL_NAMESPACE_SOURCE_ENTER
# define ENABLE_THREADING
#endif
#if defined(__GNU_LIBRARY__) && \
(__GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ < 21))
# define ENABLE_SEM_DTOR_WORKAROUND
#endif
namespace
{
static inline void
handleProcessTask (Task* task)
{
if (task)
{
TaskGroup* taskGroup = task->group ();
task->execute ();
// kill the task prior to notifying the group
// such that any internal reference-based
// semantics will be handled prior to
// the task group destructor letting it out
// of the scope of those references
delete task;
if (taskGroup) taskGroup->finishOneTask ();
}
}
struct DefaultThreadPoolData
{
Semaphore _taskSemaphore; // threads wait on this for ready tasks
mutable std::mutex _taskMutex; // mutual exclusion for the tasks list
std::vector<Task*> _tasks; // the list of tasks to execute
mutable std::mutex _threadMutex; // mutual exclusion for threads list
std::vector<std::thread> _threads; // the list of all threads
std::atomic<int> _threadCount;
std::atomic<bool> _stopping;
inline bool stopped () const
{
return _stopping.load (std::memory_order_relaxed);
}
inline void stop () { _stopping = true; }
inline void resetAtomics ()
{
_threadCount = 0;
_stopping = false;
}
};
} // namespace
#ifdef ENABLE_THREADING
@@ -39,172 +90,46 @@ struct TaskGroup::Data
{
Data ();
~Data ();
Data (const Data&) = delete;
Data& operator= (const Data&) = delete;
Data (Data&&) = delete;
Data& operator= (Data&&) = delete;
void addTask ();
void removeTask ();
void waitForEmpty ();
void addTask ();
void removeTask ();
std::atomic<int> numPending;
std::atomic<int> inFlight;
Semaphore isEmpty; // used to signal that the taskgroup is empty
# if defined(ENABLE_SEM_DTOR_WORKAROUND)
// this mutex is also used to lock numPending in the legacy c++ mode...
std::mutex dtorMutex; // used to work around the glibc bug:
// http://sources.redhat.com/bugzilla/show_bug.cgi?id=12674
# endif
};
struct ThreadPool::Data
{
typedef ThreadPoolProvider* TPPointer;
using ProviderPtr = std::shared_ptr<ThreadPoolProvider>;
Data ();
~Data ();
Data (const Data&) = delete;
Data (const Data&) = delete;
Data& operator= (const Data&) = delete;
Data (Data&&) = delete;
Data& operator= (Data&&) = delete;
Data& operator= (Data&&) = delete;
struct SafeProvider
ProviderPtr getProvider () const { return std::atomic_load (&_provider); }
void setProvider (ProviderPtr provider)
{
SafeProvider (Data* d, ThreadPoolProvider* p) : _data (d), _ptr (p) {}
ProviderPtr curp = std::atomic_exchange (&_provider, provider);
if (curp && curp != provider) curp->finish ();
}
~SafeProvider ()
{
if (_data) _data->coalesceProviderUse ();
}
SafeProvider (const SafeProvider& o) : _data (o._data), _ptr (o._ptr)
{
if (_data) _data->bumpProviderUse ();
}
SafeProvider& operator= (const SafeProvider& o)
{
if (this != &o)
{
if (o._data) o._data->bumpProviderUse ();
if (_data) _data->coalesceProviderUse ();
_data = o._data;
_ptr = o._ptr;
}
return *this;
}
SafeProvider (SafeProvider&& o) : _data (o._data), _ptr (o._ptr)
{
o._data = nullptr;
}
SafeProvider& operator= (SafeProvider&& o)
{
std::swap (_data, o._data);
std::swap (_ptr, o._ptr);
return *this;
}
inline ThreadPoolProvider* get () const { return _ptr; }
ThreadPoolProvider* operator-> () const { return get (); }
Data* _data;
ThreadPoolProvider* _ptr;
};
// NB: In C++20, there is full support for atomic shared_ptr, but that is not
// yet in use or finalized. Once stabilized, add appropriate usage here
inline SafeProvider getProvider ();
inline void coalesceProviderUse ();
inline void bumpProviderUse ();
inline void setProvider (ThreadPoolProvider* p);
std::atomic<int> provUsers;
std::atomic<ThreadPoolProvider*> provider;
std::shared_ptr<ThreadPoolProvider> _provider;
};
namespace
{
class DefaultWorkerThread;
struct DefaultWorkData
{
Semaphore taskSemaphore; // threads wait on this for ready tasks
mutable std::mutex taskMutex; // mutual exclusion for the tasks list
vector<Task*> tasks; // the list of tasks to execute
Semaphore threadSemaphore; // signaled when a thread starts executing
mutable std::mutex threadMutex; // mutual exclusion for threads list
vector<DefaultWorkerThread*> threads; // the list of all threads
std::atomic<bool> hasThreads;
std::atomic<bool> stopping;
inline bool stopped () const
{
return stopping.load (std::memory_order_relaxed);
}
inline void stop () { stopping = true; }
};
//
// class WorkerThread
//
class DefaultWorkerThread : public Thread
{
public:
DefaultWorkerThread (DefaultWorkData* data);
virtual void run ();
private:
DefaultWorkData* _data;
};
DefaultWorkerThread::DefaultWorkerThread (DefaultWorkData* data) : _data (data)
{
start ();
}
void
DefaultWorkerThread::run ()
{
//
// Signal that the thread has started executing
//
_data->threadSemaphore.post ();
while (true)
{
//
// Wait for a task to become available
//
_data->taskSemaphore.wait ();
{
std::unique_lock<std::mutex> taskLock (_data->taskMutex);
//
// If there is a task pending, pop off the next task in the FIFO
//
if (!_data->tasks.empty ())
{
Task* task = _data->tasks.back ();
_data->tasks.pop_back ();
// release the mutex while we process
taskLock.unlock ();
TaskGroup* taskGroup = task->group ();
task->execute ();
delete task;
taskGroup->_data->removeTask ();
}
else if (_data->stopped ())
{
break;
}
}
}
}
//
// class DefaultThreadPoolProvider
//
@@ -212,168 +137,193 @@ class DefaultThreadPoolProvider : public ThreadPoolProvider
{
public:
DefaultThreadPoolProvider (int count);
virtual ~DefaultThreadPoolProvider ();
DefaultThreadPoolProvider (const DefaultThreadPoolProvider&) = delete;
DefaultThreadPoolProvider&
operator= (const DefaultThreadPoolProvider&) = delete;
DefaultThreadPoolProvider (DefaultThreadPoolProvider&&) = delete;
DefaultThreadPoolProvider& operator= (DefaultThreadPoolProvider&&) = delete;
~DefaultThreadPoolProvider () override;
virtual int numThreads () const;
virtual void setNumThreads (int count);
virtual void addTask (Task* task);
int numThreads () const override;
void setNumThreads (int count) override;
void addTask (Task* task) override;
virtual void finish ();
void finish () override;
private:
DefaultWorkData _data;
void lockedFinish ();
void threadLoop (std::shared_ptr<DefaultThreadPoolData> d);
std::shared_ptr<DefaultThreadPoolData> _data;
};
DefaultThreadPoolProvider::DefaultThreadPoolProvider (int count)
: _data (std::make_shared<DefaultThreadPoolData> ())
{
_data->resetAtomics ();
setNumThreads (count);
}
DefaultThreadPoolProvider::~DefaultThreadPoolProvider ()
{
finish ();
}
{}
int
DefaultThreadPoolProvider::numThreads () const
{
std::lock_guard<std::mutex> lock (_data.threadMutex);
return static_cast<int> (_data.threads.size ());
return _data->_threadCount.load ();
}
void
DefaultThreadPoolProvider::setNumThreads (int count)
{
//
// Lock access to thread list and size
//
// since we're a private class, the thread pool won't call us if
// we aren't changing size so no need to check that...
std::lock_guard<std::mutex> lock (_data.threadMutex);
std::lock_guard<std::mutex> lock (_data->_threadMutex);
size_t desired = static_cast<size_t> (count);
if (desired > _data.threads.size ())
size_t curThreads = _data->_threads.size ();
size_t nToAdd = static_cast<size_t> (count);
if (nToAdd < curThreads)
{
//
// Add more threads
//
while (_data.threads.size () < desired)
_data.threads.push_back (new DefaultWorkerThread (&_data));
}
else if ((size_t) count < _data.threads.size ())
{
//
// Wait until all existing threads are finished processing,
// then delete all threads.
//
finish ();
//
// Add in new threads
//
while (_data.threads.size () < desired)
_data.threads.push_back (new DefaultWorkerThread (&_data));
// no easy way to only shutdown the n threads at the end of
// the vector (well, really, guaranteeing they are the ones to
// be woken up), so just kill all of the threads
lockedFinish ();
curThreads = 0;
}
_data.hasThreads = !(_data.threads.empty ());
_data->_threads.resize (nToAdd);
for (size_t i = curThreads; i < nToAdd; ++i)
{
_data->_threads[i] =
std::thread (&DefaultThreadPoolProvider::threadLoop, this, _data);
}
_data->_threadCount = static_cast<int> (_data->_threads.size ());
}
void
DefaultThreadPoolProvider::addTask (Task* task)
{
//
// Lock the threads, needed to access numThreads
//
bool doPush = _data.hasThreads.load (std::memory_order_relaxed);
if (doPush)
// the thread pool will kill us and switch to a null provider
// if the thread count is set to 0, so we can always
// go ahead and lock and assume we have a thread to do the
// processing
{
//
// Get exclusive access to the tasks queue
//
{
std::lock_guard<std::mutex> taskLock (_data.taskMutex);
//
// Push the new task into the FIFO
//
_data.tasks.push_back (task);
}
std::lock_guard<std::mutex> taskLock (_data->_taskMutex);
//
// Signal that we have a new task to process
// Push the new task into the FIFO
//
_data.taskSemaphore.post ();
}
else
{
// this path shouldn't normally happen since we have the
// NullThreadPoolProvider, but just in case...
task->execute ();
task->group ()->_data->removeTask ();
delete task;
_data->_tasks.push_back (task);
}
//
// Signal that we have a new task to process
//
_data->_taskSemaphore.post ();
}
void
DefaultThreadPoolProvider::finish ()
{
_data.stop ();
std::lock_guard<std::mutex> lock (_data->_threadMutex);
lockedFinish ();
}
void
DefaultThreadPoolProvider::lockedFinish ()
{
_data->stop ();
//
// Signal enough times to allow all threads to stop.
//
// Wait until all threads have started their run functions.
// If we do not wait before we destroy the threads then it's
// possible that the threads have not yet called their run
// functions.
// If this happens then the run function will be called off
// of an invalid object and we will crash, most likely with
// an error like: "pure virtual method called"
// NB: we must do this as many times as we have threads.
//
size_t curT = _data.threads.size ();
// If there is still work in the queue, or this call happens "too
// quickly", threads will not be waiting on the semaphore, so we
// need to ensure the semaphore is at a count equal to the amount
// of work left plus the number of threads to ensure exit of a
// thread. There can be threads in a few states:
// - still starting up (successive calls to setNumThreads)
// - in the middle of processing a task / looping
// - waiting in the semaphore
size_t curT = _data->_threads.size ();
for (size_t i = 0; i != curT; ++i)
{
if (_data.threads[i]->joinable ())
{
_data.taskSemaphore.post ();
_data.threadSemaphore.wait ();
}
}
_data->_taskSemaphore.post ();
//
// Join all the threads
// We should not need to check joinability, they should all, by
// definition, be joinable (assuming normal start)
//
for (size_t i = 0; i != curT; ++i)
{
if (_data.threads[i]->joinable ()) _data.threads[i]->join ();
delete _data.threads[i];
// This isn't quite right in that the thread may have actually
// be in an exited / signalled state (needing the
// WaitForSingleObject call), and so already have an exit code
// (I think, but the docs are vague), but if we don't do the
// join, the stl thread seems to then throw an exception. The
// join should just return invalid handle and continue, and is
// more of a windows bug... except maybe someone needs to work
// around it...
//# ifdef TEST_FOR_WIN_THREAD_STATUS
//
// // per OIIO issue #2038, on exit / dll unload, windows may
// // kill the thread, double check that it is still active prior
// // to joining.
// DWORD tstatus;
// if (GetExitCodeThread (_threads[i].native_handle (), &tstatus))
// {
// if (tstatus != STILL_ACTIVE) { continue; }
// }
//# endif
_data->_threads[i].join ();
}
std::lock_guard<std::mutex> lk (_data.taskMutex);
_data->_threads.clear ();
_data.threads.clear ();
_data.tasks.clear ();
_data.stopping = false;
_data->resetAtomics ();
}
class NullThreadPoolProvider : public ThreadPoolProvider
void
DefaultThreadPoolProvider::threadLoop (
std::shared_ptr<DefaultThreadPoolData> data)
{
virtual ~NullThreadPoolProvider () {}
virtual int numThreads () const { return 0; }
virtual void setNumThreads (int count) {}
virtual void addTask (Task* t)
while (true)
{
t->execute ();
t->group ()->_data->removeTask ();
delete t;
//
// Wait for a task to become available
//
data->_taskSemaphore.wait ();
{
std::unique_lock<std::mutex> taskLock (data->_taskMutex);
//
// If there is a task pending, pop off the next task in the FIFO
//
if (!data->_tasks.empty ())
{
Task* task = data->_tasks.back ();
data->_tasks.pop_back ();
// release the mutex while we process
taskLock.unlock ();
handleProcessTask (task);
// do not need to reacquire the lock at all since we
// will just loop around, pull any other task
}
else if (data->stopped ()) { break; }
}
}
virtual void finish () {}
};
}
} //namespace
@@ -381,164 +331,80 @@ class NullThreadPoolProvider : public ThreadPoolProvider
// struct TaskGroup::Data
//
TaskGroup::Data::Data () : numPending (0), isEmpty (1)
{
// empty
}
TaskGroup::Data::Data () : numPending (0), inFlight (0), isEmpty (1)
{}
TaskGroup::Data::~Data ()
{}
void
TaskGroup::Data::waitForEmpty ()
{
//
// A TaskGroup acts like an "inverted" semaphore: if the count
// is above 0 then waiting on the taskgroup will block. This
// is above 0 then waiting on the taskgroup will block. The
// destructor waits until the taskgroup is empty before returning.
//
isEmpty.wait ();
# ifdef ENABLE_SEM_DTOR_WORKAROUND
// Update: this was fixed in v. 2.2.21, so this ifdef checks for that
//
// Alas, given the current bug in glibc we need a secondary
// syncronisation primitive here to account for the fact that
// destructing the isEmpty Semaphore in this thread can cause
// an error for a separate thread that is issuing the post() call.
// We are entitled to destruct the semaphore at this point, however,
// that post() call attempts to access data out of the associated
// memory *after* it has woken the waiting threads, including this one,
// potentially leading to invalid memory reads.
// http://sources.redhat.com/bugzilla/show_bug.cgi?id=12674
std::lock_guard<std::mutex> lock (dtorMutex);
# endif
// pseudo spin to wait for the notifying thread to finish the post
// to avoid a premature deletion of the semaphore
int count = 0;
while (inFlight.load () > 0)
{
++count;
if (count > 100)
{
std::this_thread::yield ();
count = 0;
}
}
}
void
TaskGroup::Data::addTask ()
{
//
// in c++11, we use an atomic to protect numPending to avoid the
// extra lock but for c++98, to add the ability for custom thread
// pool we add the lock here
//
if (numPending++ == 0) isEmpty.wait ();
inFlight.fetch_add (1);
// if we are the first task off the rank, clear the
// isEmpty semaphore such that the group will actually pause
// until the task finishes
if (numPending.fetch_add (1) == 0) { isEmpty.wait (); }
}
void
TaskGroup::Data::removeTask ()
{
// Alas, given the current bug in glibc we need a secondary
// syncronisation primitive here to account for the fact that
// destructing the isEmpty Semaphore in a separate thread can
// cause an error. Issuing the post call here the current libc
// implementation attempts to access memory *after* it has woken
// waiting threads.
// Since other threads are entitled to delete the semaphore the
// access to the memory location can be invalid.
// http://sources.redhat.com/bugzilla/show_bug.cgi?id=12674
// Update: this bug has been fixed, but how do we know which
// glibc version we're in?
// if we are the last task, notify the group we're done
if (numPending.fetch_sub (1) == 1) { isEmpty.post (); }
// Further update:
// in theory, a background thread could actually finish a task
// prior to the next task being added. The fetch_add / fetch_sub
// logic between addTask and removeTask are fine to keep the
// inverted semaphore straight. All addTask must happen prior to
// the TaskGroup destructor.
//
// we could remove this if it is a new enough glibc, however
// we've changed the API to enable a custom override of a
// thread pool. In order to provide safe access to the numPending,
// we need the lock anyway, except for c++11 or newer
if (--numPending == 0)
{
# ifdef ENABLE_SEM_DTOR_WORKAROUND
std::lock_guard<std::mutex> lk (dtorMutex);
# endif
isEmpty.post ();
}
// But to let the taskgroup thread waiting know we're actually
// finished with the last one and finished posting (the semaphore
// might wake up the other thread while in the middle of post) so
// we don't destroy the semaphore while posting to it, keep a
// separate counter that is modified pre / post semaphore
inFlight.fetch_sub (1);
}
//
// struct ThreadPool::Data
//
ThreadPool::Data::Data () : provUsers (0), provider (NULL)
ThreadPool::Data::Data ()
{
// empty
}
ThreadPool::Data::~Data ()
{
ThreadPoolProvider* p = provider.load (std::memory_order_relaxed);
p->finish ();
delete p;
}
inline ThreadPool::Data::SafeProvider
ThreadPool::Data::getProvider ()
{
provUsers.fetch_add (1, std::memory_order_relaxed);
return SafeProvider (this, provider.load (std::memory_order_relaxed));
}
inline void
ThreadPool::Data::coalesceProviderUse ()
{
int ov = provUsers.fetch_sub (1, std::memory_order_relaxed);
// ov is the previous value, so one means that now it might be 0
if (ov == 1)
{
// do we have anything to do here?
}
}
inline void
ThreadPool::Data::bumpProviderUse ()
{
provUsers.fetch_add (1, std::memory_order_relaxed);
}
inline void
ThreadPool::Data::setProvider (ThreadPoolProvider* p)
{
ThreadPoolProvider* old = provider.load (std::memory_order_relaxed);
// work around older gcc bug just in case
do
{
if (!provider.compare_exchange_weak (
old, p, std::memory_order_release, std::memory_order_relaxed))
continue;
} while (false); // NOSONAR - suppress SonarCloud bug report.
// wait for any other users to finish prior to deleting, given
// that these are just mostly to query the thread count or push a
// task to the queue (so fast), just spin...
//
// (well, and normally, people don't do this mid stream anyway, so
// this will be 0 99.999% of the time, but just to be safe)
//
while (provUsers.load (std::memory_order_relaxed) > 0)
std::this_thread::yield ();
if (old)
{
old->finish ();
delete old;
}
// NB: the shared_ptr mechanism is safer and means we don't have
// to have the provUsers counter since the shared_ptr keeps that
// for us. However, gcc 4.8/9 compilers which many people are
// still using even though it is 2018 forgot to add the shared_ptr
// functions... once that compiler is fully deprecated, switch to
// using the below, change provider to a std::shared_ptr and remove
// provUsers...
//
// std::shared_ptr<ThreadPoolProvider> newp( p );
// std::shared_ptr<ThreadPoolProvider> curp = std::atomic_load_explicit( &provider, std::memory_order_relaxed );
// do
// {
// if ( ! std::atomic_compare_exchange_weak_explicit( &provider, &curp, newp, std::memory_order_release, std::memory_order_relaxed ) )
// continue;
// } while ( false );
// if ( curp )
// curp->finish();
setProvider (nullptr);
}
#endif // ENABLE_THREADING
@@ -568,7 +434,7 @@ Task::group ()
TaskGroup::TaskGroup ()
:
#ifdef ENABLE_THREADING
_data (new Data ())
_data (new Data)
#else
_data (nullptr)
#endif
@@ -579,6 +445,7 @@ TaskGroup::TaskGroup ()
TaskGroup::~TaskGroup ()
{
#ifdef ENABLE_THREADING
_data->waitForEmpty ();
delete _data;
#endif
}
@@ -614,16 +481,15 @@ ThreadPool::ThreadPool (unsigned nthreads)
#endif
{
#ifdef ENABLE_THREADING
if (nthreads == 0)
_data->setProvider (new NullThreadPoolProvider);
else
_data->setProvider (new DefaultThreadPoolProvider (int (nthreads)));
setNumThreads (static_cast<int> (nthreads));
#endif
}
ThreadPool::~ThreadPool ()
{
#ifdef ENABLE_THREADING
// ensures any jobs / threads are finished & shutdown
_data->setProvider (nullptr);
delete _data;
#endif
}
@@ -632,7 +498,8 @@ int
ThreadPool::numThreads () const
{
#ifdef ENABLE_THREADING
return _data->getProvider ()->numThreads ();
Data::ProviderPtr sp = _data->getProvider ();
return (sp) ? sp->numThreads () : 0;
#else
return 0;
#endif
@@ -647,34 +514,29 @@ ThreadPool::setNumThreads (int count)
"Attempt to set the number of threads "
"in a thread pool to a negative value.");
bool doReset = false;
{
Data::SafeProvider sp = _data->getProvider ();
int curT = sp->numThreads ();
if (curT == count) return;
Data::ProviderPtr sp = _data->getProvider ();
if (sp)
{
int curT = sp->numThreads ();
if (curT == count) return;
if (curT == 0)
{
NullThreadPoolProvider* npp =
dynamic_cast<NullThreadPoolProvider*> (sp.get ());
if (npp) doReset = true;
if (count != 0)
{
sp->setNumThreads (count);
return;
}
}
else if (count == 0)
{
DefaultThreadPoolProvider* dpp =
dynamic_cast<DefaultThreadPoolProvider*> (sp.get ());
if (dpp) doReset = true;
}
if (!doReset) sp->setNumThreads (count);
}
if (doReset)
{
if (count == 0)
_data->setProvider (new NullThreadPoolProvider);
else
_data->setProvider (new DefaultThreadPoolProvider (count));
}
// either a null provider or a case where we should switch from
// a default provider to a null one or vice-versa
if (count == 0)
_data->setProvider (nullptr);
else
_data->setProvider (
std::make_shared<DefaultThreadPoolProvider> (count));
#else
// just blindly ignore
(void) count;
@@ -685,7 +547,8 @@ void
ThreadPool::setThreadProvider (ThreadPoolProvider* provider)
{
#ifdef ENABLE_THREADING
_data->setProvider (provider);
// contract is we take ownership and will free the provider
_data->setProvider (Data::ProviderPtr (provider));
#else
throw IEX_INTERNAL_NAMESPACE::ArgExc (
"Attempt to set a thread provider on a system with threads"
@@ -696,12 +559,19 @@ ThreadPool::setThreadProvider (ThreadPoolProvider* provider)
void
ThreadPool::addTask (Task* task)
{
if (task)
{
#ifdef ENABLE_THREADING
_data->getProvider ()->addTask (task);
#else
task->execute ();
delete task;
Data::ProviderPtr p = _data->getProvider ();
if (p)
{
p->addTask (task);
return;
}
#endif
handleProcessTask (task);
}
}
ThreadPool&
@@ -726,7 +596,24 @@ unsigned
ThreadPool::estimateThreadCountForFileIO ()
{
#ifdef ENABLE_THREADING
return std::thread::hardware_concurrency ();
unsigned rv = std::thread::hardware_concurrency ();
// hardware concurrency is not required to work
if (rv == 0 ||
rv > static_cast<unsigned> (std::numeric_limits<int>::max ()))
{
rv = 1;
# if (defined(_WIN32) || defined(_WIN64))
SYSTEM_INFO si;
GetNativeSystemInfo (&si);
rv = si.dwNumberOfProcessors;
# else
// linux, bsd, and mac are fine with this
// other *nix should be too, right?
rv = sysconf (_SC_NPROCESSORS_ONLN);
# endif
}
return rv;
#else
return 0;
#endif
+3 -5
View File
@@ -10,11 +10,9 @@
//
//-----------------------------------------------------------------------------
#include "IlmThreadConfig.h"
#include "IlmThreadSemaphore.h"
#if !(ILMTHREAD_THREADING_ENABLED)
# include "IlmThreadSemaphore.h"
#if ILMTHREAD_SEMAPHORE_DISABLED
ILMTHREAD_INTERNAL_NAMESPACE_SOURCE_ENTER
@@ -41,4 +39,4 @@ Semaphore::value () const
ILMTHREAD_INTERNAL_NAMESPACE_SOURCE_EXIT
#endif
#endif // ILMTHREAD_SEMAPHORE_DISABLED
+29 -6
View File
@@ -18,21 +18,41 @@
#include "IlmThreadConfig.h"
#include "IlmThreadNamespace.h"
//
// Decipher the platform-specific threading support.
// Set the ILMTHREAD_SEMAPHORE_* defines to indicate the corresponding
// implementation of the Semaphore class. Only one of these should be
// defined.
//
#if ILMTHREAD_THREADING_ENABLED
# if ILMTHREAD_HAVE_POSIX_SEMAPHORES
# include <semaphore.h>
# define ILMTHREAD_SEMAPHORE_POSIX 1
# elif defined(__APPLE__)
# include <dispatch/dispatch.h>
# include <AvailabilityMacros.h>
# if MAC_OS_X_VERSION_MIN_REQUIRED > 1050 && !defined(__ppc__)
# include <dispatch/dispatch.h>
# define ILMTHREAD_SEMAPHORE_OSX 1
# else
# include <condition_variable>
# include <mutex>
# define ILMTHREAD_SEMAPHORE_OTHER 1
# endif
# elif (defined(_WIN32) || defined(_WIN64))
# ifdef NOMINMAX
# undef NOMINMAX
# endif
# define NOMINMAX
# include <windows.h>
# define ILMTHREAD_SEMAPHORE_WINDOWS 1
# else
# include <condition_variable>
# include <mutex>
# define ILMTHREAD_SEMAPHORE_OTHER 1
# endif
#else
# define ILMTHREAD_SEMAPHORE_DISABLED 1
#endif
ILMTHREAD_INTERNAL_NAMESPACE_HEADER_ENTER
@@ -49,20 +69,23 @@ public:
ILMTHREAD_EXPORT int value () const;
private:
#if ILMTHREAD_HAVE_POSIX_SEMAPHORES
#if ILMTHREAD_SEMAPHORE_POSIX
mutable sem_t _semaphore;
#elif defined(__APPLE__)
#elif ILMTHREAD_SEMAPHORE_OSX
mutable dispatch_semaphore_t _semaphore;
#elif (defined(_WIN32) || defined(_WIN64))
#elif ILMTHREAD_SEMAPHORE_WINDOWS
mutable HANDLE _semaphore;
#elif ILMTHREAD_THREADING_ENABLED
#elif ILMTHREAD_SEMAPHORE_OTHER
//
// If the platform has threads but no semapohores,
// If the platform has threads but no semaphores,
// then we implement them ourselves using condition variables
//
+8 -5
View File
@@ -5,15 +5,18 @@
//-----------------------------------------------------------------------------
//
// class Semaphore -- implementation for OSX platform(it don't support unnamed Posix semaphores)
// class Semaphore -- implementation for OSX platform (it doesn't
// support unnamed Posix semaphores)
//
// std::condition_variable + std::mutex emulation show poor performance
//
//-----------------------------------------------------------------------------
#if defined(__APPLE__) && !ILMTHREAD_HAVE_POSIX_SEMAPHORES
#include "IlmThreadSemaphore.h"
# include "Iex.h"
# include "IlmThreadSemaphore.h"
#if ILMTHREAD_SEMAPHORE_OSX
#include "Iex.h"
ILMTHREAD_INTERNAL_NAMESPACE_SOURCE_ENTER
@@ -59,4 +62,4 @@ Semaphore::value () const
ILMTHREAD_INTERNAL_NAMESPACE_SOURCE_EXIT
#endif
#endif // ILMTHREAD_SEMAPHORE_OSX
@@ -10,14 +10,13 @@
//
//-----------------------------------------------------------------------------
#include "IlmThreadConfig.h"
#include "IlmThreadSemaphore.h"
#if ILMTHREAD_HAVE_POSIX_SEMAPHORES
#if ILMTHREAD_SEMAPHORE_POSIX
# include "Iex.h"
# include "IlmThreadSemaphore.h"
# include <assert.h>
# include <errno.h>
#include "Iex.h"
#include <assert.h>
#include <errno.h>
ILMTHREAD_INTERNAL_NAMESPACE_SOURCE_ENTER
@@ -70,4 +69,4 @@ Semaphore::value () const
ILMTHREAD_INTERNAL_NAMESPACE_SOURCE_EXIT
#endif
#endif // ILMTHREAD_SEMAPHORE_POSIX
@@ -10,14 +10,11 @@
//
//-----------------------------------------------------------------------------
#include "IlmThreadConfig.h"
#include "IlmThreadSemaphore.h"
#if ILMTHREAD_THREADING_ENABLED
# if ( \
!(ILMTHREAD_HAVE_POSIX_SEMAPHORES) && !defined(__APPLE__) && \
!defined(_WIN32) && !defined(_WIN64))
#if ILMTHREAD_SEMAPHORE_OTHER
# include "IlmThreadSemaphore.h"
// Use this code as a fallback for macOS versions without libdispatch.
ILMTHREAD_INTERNAL_NAMESPACE_SOURCE_ENTER
@@ -79,5 +76,4 @@ Semaphore::value () const
ILMTHREAD_INTERNAL_NAMESPACE_SOURCE_EXIT
# endif // posix semaphore compat
#endif // enable threading
#endif // ILMTHREAD_SEMAPHORE_OTHER
@@ -9,15 +9,14 @@
//
//-----------------------------------------------------------------------------
#include "IlmThreadConfig.h"
#include "IlmThreadSemaphore.h"
#if (defined(_WIN32) || defined(_WIN64)) && !ILMTHREAD_HAVE_POSIX_SEMAPHORES
#if ILMTHREAD_SEMAPHORE_WINDOWS
# include "Iex.h"
# include "IlmThreadSemaphore.h"
# include <assert.h>
# include <iostream>
# include <string>
#include "Iex.h"
#include <assert.h>
#include <iostream>
#include <string>
ILMTHREAD_INTERNAL_NAMESPACE_SOURCE_ENTER
@@ -126,4 +125,5 @@ Semaphore::value () const
ILMTHREAD_INTERNAL_NAMESPACE_SOURCE_EXIT
#endif // _WIN32
#endif // ILMTHREAD_SEMAPHORE_WINDOWS
+3 -1
View File
@@ -134,6 +134,7 @@ openexr_define_library(OpenEXR
ImfCompositeDeepScanLine.h
ImfCompression.h
ImfCompressionAttribute.h
ImfCompressor.h
ImfConvert.h
ImfCRgbaFile.h
ImfDeepCompositing.h
@@ -174,6 +175,7 @@ openexr_define_library(OpenEXR
ImfLineOrderAttribute.h
ImfLut.h
ImfMatrixAttribute.h
ImfMisc.h
ImfMultiPartInputFile.h
ImfMultiPartOutputFile.h
ImfMultiView.h
@@ -216,5 +218,5 @@ openexr_define_library(OpenEXR
OpenEXR::Config
OpenEXR::Iex
OpenEXR::IlmThread
ZLIB::ZLIB
OpenEXR::OpenEXRCore
)
-1
View File
@@ -427,7 +427,6 @@ B44Compressor::B44Compressor (
size_t numScanLines,
bool optFlatFields)
: Compressor (hdr)
, _maxScanLineSize (static_cast<int> (maxScanLineSize))
, _optFlatFields (optFlatFields)
, _format (XDR)
, _numScanLines (static_cast<int> (numScanLines))
-1
View File
@@ -71,7 +71,6 @@ private:
IMATH_NAMESPACE::Box2i range,
const char*& outPtr);
int _maxScanLineSize;
bool _optFlatFields;
Format _format;
int _numScanLines;
+1 -1
View File
@@ -59,7 +59,7 @@ typedef struct ImfRgba ImfRgba;
#define IMF_VERSION_NUMBER 2
/*
** Line order; values must the the same as in Imf::LineOrder.
** Line order; values must be the same as in Imf::LineOrder.
*/
#define IMF_INCREASING_Y 0
+55 -54
View File
@@ -139,7 +139,7 @@
# endif
# define NOMINMAX
#endif
#include <zlib.h>
#include <openexr_compression.h>
OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER
@@ -2074,15 +2074,15 @@ DwaCompressor::compress (
if (*unknownUncompressedSize > 0)
{
uLong inSize = static_cast<uLong> (*unknownUncompressedSize);
uLong outSize = compressBound (inSize);
if (Z_OK != ::compress2 (
reinterpret_cast<Bytef*> (outDataPtr),
&outSize,
reinterpret_cast<const Bytef*> (_planarUncBuffer[UNKNOWN]),
inSize,
9))
size_t outSize;
if (EXR_ERR_SUCCESS != exr_compress_buffer(
nullptr,
9, // TODO: use default??? the old call to zlib had 9 hardcoded
_planarUncBuffer[UNKNOWN],
*unknownUncompressedSize,
outDataPtr,
exr_compress_max_buffer_size (*unknownUncompressedSize),
&outSize))
{
throw IEX_NAMESPACE::BaseExc ("Data compression (zlib) failed.");
}
@@ -2114,16 +2114,16 @@ DwaCompressor::compress (
case DEFLATE:
{
uLong sourceLen = static_cast<uLong> (*totalAcUncompressedCount * sizeof (unsigned short));
uLong destLen = compressBound (sourceLen);
if (Z_OK !=
::compress2 (
reinterpret_cast<Bytef*> (outDataPtr),
&destLen,
reinterpret_cast<Bytef*> (_packedAcBuffer),
size_t sourceLen = *totalAcUncompressedCount * sizeof (unsigned short);
size_t destLen;
if (EXR_ERR_SUCCESS != exr_compress_buffer(
nullptr,
9, // TODO: use default??? the old call to zlib had 9 hardcoded
_packedAcBuffer,
sourceLen,
9))
outDataPtr,
exr_compress_max_buffer_size (sourceLen),
&destLen))
{
throw IEX_NAMESPACE::InputExc (
"Data compression (zlib) failed.");
@@ -2166,15 +2166,15 @@ DwaCompressor::compress (
_planarUncBuffer[RLE],
(signed char*) _rleBuffer);
uLong srcLen = static_cast<uLong> (*rleUncompressedSize);
uLong dstLen = compressBound (srcLen);
if (Z_OK != ::compress2 (
reinterpret_cast<Bytef*> (outDataPtr),
&dstLen,
reinterpret_cast<const Bytef*> (_rleBuffer),
srcLen,
9))
size_t dstLen;
if (EXR_ERR_SUCCESS != exr_compress_buffer(
nullptr,
9, // TODO: use default??? the old call to zlib had 9 hardcoded
_rleBuffer,
*rleUncompressedSize,
outDataPtr,
exr_compress_max_buffer_size (*rleUncompressedSize),
&dstLen))
{
throw IEX_NAMESPACE::BaseExc ("Error compressing RLE'd data.");
}
@@ -2405,14 +2405,13 @@ DwaCompressor::uncompress (
"(corrupt header).");
}
uLong inSize = static_cast<uLong> (unknownCompressedSize);
uLong outSize = static_cast<uLong> (unknownUncompressedSize);
if (Z_OK != ::uncompress (
reinterpret_cast<Bytef*> (_planarUncBuffer[UNKNOWN]),
&outSize,
reinterpret_cast<const Bytef*> (compressedUnknownBuf),
inSize))
if (EXR_ERR_SUCCESS != exr_uncompress_buffer (
nullptr,
compressedUnknownBuf,
unknownCompressedSize,
_planarUncBuffer[UNKNOWN],
unknownUncompressedSize,
nullptr))
{
throw IEX_NAMESPACE::BaseExc ("Error uncompressing UNKNOWN data.");
}
@@ -2449,14 +2448,15 @@ DwaCompressor::uncompress (
break;
case DEFLATE: {
uLong destLen = static_cast<uLong> (totalAcUncompressedCount * sizeof (unsigned short));
uLong sourceLen = static_cast<uLong> (acCompressedSize);
size_t destLen;
if (Z_OK != ::uncompress (
reinterpret_cast<Bytef*> (_packedAcBuffer),
&destLen,
reinterpret_cast<const Bytef*> (compressedAcBuf),
sourceLen))
if (EXR_ERR_SUCCESS != exr_uncompress_buffer (
nullptr,
compressedAcBuf,
acCompressedSize,
_packedAcBuffer,
totalAcUncompressedCount * sizeof (unsigned short),
&destLen))
{
throw IEX_NAMESPACE::InputExc (
"Data decompression (zlib) failed.");
@@ -2520,14 +2520,15 @@ DwaCompressor::uncompress (
"(corrupt header).");
}
uLong dstLen = static_cast<uLong> (rleUncompressedSize);
uLong srcLen = static_cast<uLong> (rleCompressedSize);
size_t dstLen;
if (Z_OK != ::uncompress (
reinterpret_cast<Bytef*> (_rleBuffer),
&dstLen,
reinterpret_cast<const Bytef*> (compressedRleBuf),
srcLen))
if (EXR_ERR_SUCCESS != exr_uncompress_buffer (
nullptr,
compressedRleBuf,
rleCompressedSize,
_rleBuffer,
rleUncompressedSize,
&dstLen))
{
throw IEX_NAMESPACE::BaseExc ("Error uncompressing RLE data.");
}
@@ -2882,7 +2883,7 @@ DwaCompressor::initializeBuffers (size_t& outBufferSize)
maxOutBufferSize += std::max (
2lu * maxLossyDctAcSize + 65536lu,
static_cast<uint64_t> (compressBound (static_cast<uLong> (maxLossyDctAcSize))));
static_cast<uint64_t> (exr_compress_max_buffer_size (maxLossyDctAcSize)));
numLossyDctChans++;
break;
@@ -2922,14 +2923,14 @@ DwaCompressor::initializeBuffers (size_t& outBufferSize)
// which could take slightly more space
//
maxOutBufferSize += static_cast<uint64_t> (compressBound (static_cast<uLong> (rleBufferSize)));
maxOutBufferSize += static_cast<uint64_t> (exr_compress_max_buffer_size (rleBufferSize));
//
// And the same goes for the UNKNOWN data
//
maxOutBufferSize +=
static_cast<uint64_t> (compressBound (static_cast<uLong> (unknownBufferSize)));
static_cast<uint64_t> (exr_compress_max_buffer_size (unknownBufferSize));
//
// Allocate a zip/deflate compressor big enough to hold the DC data
@@ -3048,7 +3049,7 @@ DwaCompressor::initializeBuffers (size_t& outBufferSize)
if (planarUncBufferSize[UNKNOWN] > 0)
{
planarUncBufferSize[UNKNOWN] = static_cast<uint64_t> (
compressBound (static_cast<uLong> (planarUncBufferSize[UNKNOWN])));
exr_compress_max_buffer_size (planarUncBufferSize[UNKNOWN]));
}
for (int i = 0; i < NUM_COMPRESSOR_SCHEMES; ++i)
+3 -6
View File
@@ -14,14 +14,11 @@
// Static enabling/disabling the fast huffman decode
#if defined(__clang__)
#if defined(__APPLE__) && defined(__clang__)
//
// Enabled for clang on Apple platforms (tested):
//
# if defined(__APPLE__)
# define OPENEXR_IMF_ENABLE_FAST_HUF_DECODER
# endif
# define OPENEXR_IMF_ENABLE_FAST_HUF_DECODER
#elif defined(__INTEL_COMPILER) || defined(__GNUC__)
//
@@ -294,7 +291,7 @@ FastHufDecoder::~FastHufDecoder ()
// Static check if the decoder is enabled.
//
// ATM, I only have access to little endian hardware for testing,
// so I'm not entirely sure that we are reading fom the bit stream
// so I'm not entirely sure that we are reading from the bit stream
// properly on BE.
//
// If you happen to have more obscure hardware, check that the
+12 -11
View File
@@ -45,7 +45,7 @@
#include <sstream>
#include <stdlib.h>
#include <time.h>
#include <zlib.h>
#include <openexr_base.h>
#include "ImfNamespace.h"
#include "ImfTiledMisc.h"
@@ -64,15 +64,13 @@ using IMATH_NAMESPACE::V2i;
namespace
{
static int s_DefaultZipCompressionLevel = 4;
static float s_DefaultDwaCompressionLevel = 45.f;
struct CompressionRecord
{
CompressionRecord ()
: zip_level (s_DefaultZipCompressionLevel)
, dwa_level (s_DefaultDwaCompressionLevel)
{}
{
exr_get_default_zip_compression_level(&zip_level);
exr_get_default_dwa_compression_quality(&dwa_level);
}
int zip_level;
float dwa_level;
};
@@ -259,13 +257,13 @@ sanityCheckDisplayWindow (int width, int height)
void
setDefaultZipCompressionLevel (int level)
{
s_DefaultZipCompressionLevel = level;
exr_set_default_zip_compression_level (level);
}
void
setDefaultDwaCompressionLevel (float level)
{
s_DefaultDwaCompressionLevel = level;
exr_set_default_dwa_compression_quality (level);
}
Header::Header (
@@ -421,7 +419,10 @@ Header::erase (const char name[])
"Image attribute name cannot be an empty string.");
AttributeMap::iterator i = _map.find (name);
if (i != _map.end ()) _map.erase (i);
if (i != _map.end ()) {
delete i->second;
_map.erase (i);
}
}
void
@@ -961,7 +962,7 @@ Header::sanityCheck (bool isTiled, bool isMultipartFile) const
//
// The pixel aspect ratio must be greater than 0.
// In applications, numbers like the the display or
// In applications, numbers like the display or the
// data window dimensions are likely to be multiplied
// or divided by the pixel aspect ratio; to avoid
// arithmetic exceptions, we limit the pixel aspect
+24 -16
View File
@@ -11,7 +11,7 @@
#include "ImfXdr.h"
#include <Iex.h>
#include <ImfIDManifest.h>
#include <zlib.h>
#include <openexr_compression.h>
#include <algorithm>
#include <stdint.h>
@@ -247,7 +247,7 @@ writeStringList (char*& outPtr, const T& stringList, int entries = 0)
//
// variable length encoding:
// values between 0 and 127 inclusive are stored in a single byte
// values betwwen 128 and 16384 are encoded with two bytes: 1LLLLLLL 0MMMMMMMM where L and M are the least and most significant bits of the value
// values between 128 and 16384 are encoded with two bytes: 1LLLLLLL 0MMMMMMMM where L and M are the least and most significant bits of the value
// in general, values are stored least significant values first, with the top bit of each byte indicating more values follow
// the top bit is clear in the last byte of the value
// (this scheme requires two bytes to store values above 1<<7, and five bytes to store values above 1<<28)
@@ -536,14 +536,16 @@ IDManifest::IDManifest (const CompressedIDManifest& compressed)
// decompress the compressed manifest
//
vector<Bytef> uncomp (compressed._uncompressedDataSize);
uLong outSize = static_cast<uLong> (compressed._uncompressedDataSize);
uLong inSize = static_cast<uLong> (compressed._compressedDataSize);
if (Z_OK != ::uncompress (
uncomp.data(),
&outSize,
reinterpret_cast<const Bytef*> (compressed._data),
inSize))
vector<char> uncomp (compressed._uncompressedDataSize);
size_t outSize;
size_t inSize = static_cast<size_t> (compressed._compressedDataSize);
if (EXR_ERR_SUCCESS != exr_uncompress_buffer (
nullptr,
compressed._data,
inSize,
uncomp.data(),
compressed._uncompressedDataSize,
&outSize))
{
throw IEX_NAMESPACE::InputExc (
"IDManifest decompression (zlib) failed.");
@@ -1062,16 +1064,22 @@ CompressedIDManifest::CompressedIDManifest (const IDManifest& manifest)
manifest.serialize (serial);
uLong outputSize = static_cast<uLong> (serial.size ());
size_t outputSize = serial.size ();
//
// allocate a buffer which is guaranteed to be big enough for compression
//
uLong compressedDataSize = compressBound (outputSize);
_data = (unsigned char*) malloc (compressedDataSize);
if (Z_OK !=
::compress (
_data, &compressedDataSize, reinterpret_cast<Bytef*> (serial.data ()), outputSize))
size_t compressedBufferSize = exr_compress_max_buffer_size (outputSize);
size_t compressedDataSize;
_data = (unsigned char*) malloc (compressedBufferSize);
if (EXR_ERR_SUCCESS != exr_compress_buffer (
nullptr,
-1,
serial.data (),
outputSize,
_data,
compressedBufferSize,
&compressedDataSize))
{
throw IEX_NAMESPACE::InputExc ("ID manifest compression failed");
}
+3 -3
View File
@@ -40,12 +40,12 @@ IDManifestAttribute::readValueFrom (
OPENEXR_IMF_INTERNAL_NAMESPACE::IStream& is, int size, int version)
{
if (size < 4)
if (size < static_cast<int>(sizeof (uint64_t)))
{
throw IEX_NAMESPACE::InputExc (
"Invalid size field reading idmanifest attribute");
}
_value._compressedDataSize = size - 4;
_value._compressedDataSize = size - sizeof (uint64_t);
if (_value._data)
{
@@ -65,7 +65,7 @@ IDManifestAttribute::readValueFrom (
//
// allocate memory for compressed storage and read data
//
_value._data = static_cast<unsigned char*> (malloc (size - 4));
_value._data = static_cast<unsigned char*> (malloc (size - sizeof (uint64_t)));
char* input = (char*) _value._data;
Xdr::read<StreamIO> (is, input, _value._compressedDataSize);
}
+14 -8
View File
@@ -331,7 +331,7 @@ copyIntoFrameBuffer (
else if (format == Compressor::XDR)
{
//
// The the line or tile buffer is in XDR format.
// The line or tile buffer is in XDR format.
//
// Convert the pixels from the file's machine-
// independent representation, and store the
@@ -470,7 +470,7 @@ copyIntoFrameBuffer (
else
{
//
// The the line or tile buffer is in NATIVE format.
// The line or tile buffer is in NATIVE format.
// Copy the results into the frame buffer.
//
@@ -765,7 +765,7 @@ copyIntoDeepFrameBuffer (
else if (format == Compressor::XDR)
{
//
// The the line or tile buffer is in XDR format.
// The line or tile buffer is in XDR format.
//
// Convert the pixels from the file's machine-
// independent representation, and store the
@@ -1095,7 +1095,7 @@ copyIntoDeepFrameBuffer (
else
{
//
// The the line or tile buffer is in NATIVE format.
// The line or tile buffer is in NATIVE format.
// Copy the results into the frame buffer.
//
@@ -1542,7 +1542,7 @@ copyFromFrameBuffer (
if (format == Compressor::XDR)
{
//
// The the line or tile buffer is in XDR format.
// The line or tile buffer is in XDR format.
//
switch (type)
@@ -1583,7 +1583,7 @@ copyFromFrameBuffer (
else
{
//
// The the line or tile buffer is in NATIVE format.
// The line or tile buffer is in NATIVE format.
//
switch (type)
@@ -1656,7 +1656,7 @@ copyFromDeepFrameBuffer (
if (format == Compressor::XDR)
{
//
// The the line or tile buffer is in XDR format.
// The line or tile buffer is in XDR format.
//
switch (type)
@@ -1737,7 +1737,7 @@ copyFromDeepFrameBuffer (
else
{
//
// The the line or tile buffer is in NATIVE format.
// The line or tile buffer is in NATIVE format.
//
switch (type)
@@ -1991,4 +1991,10 @@ WidenFilename (const char* filename)
return converter.from_bytes (filename);
}
const char*
getLibraryVersion()
{
return OPENEXR_VERSION_STRING;
}
OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT
+6
View File
@@ -442,6 +442,12 @@ int getChunkOffsetTableSize (const Header& header);
IMF_EXPORT
std::wstring WidenFilename (const char* filename);
//
// Return the string that describes the major.minor.patch release version
//
IMF_EXPORT const char* getLibraryVersion();
OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT
#endif
+24 -21
View File
@@ -48,7 +48,7 @@
#include <algorithm>
#include <assert.h>
#include <half.h>
#include <zlib.h>
#include <openexr_compression.h>
using namespace std;
using namespace IMATH_NAMESPACE;
@@ -160,8 +160,7 @@ Pxr24Compressor::Pxr24Compressor (
{
size_t maxInBytes = uiMult (maxScanLineSize, numScanLines);
size_t maxOutBytes = uiAdd (
uiAdd (maxInBytes, size_t (ceil (maxInBytes * 0.01))), size_t (100));
size_t maxOutBytes = exr_compress_max_buffer_size (maxInBytes);
_tmpBuffer = new unsigned char[maxInBytes];
_outBuffer = new char[maxOutBytes];
@@ -341,14 +340,17 @@ Pxr24Compressor::compress (
}
}
uLong inBufferSize = static_cast<uLong> (tmpBufferEnd - _tmpBuffer);
uLong outSize = compressBound (inBufferSize);
size_t inBufferSize = static_cast<size_t> (tmpBufferEnd - _tmpBuffer);
size_t outSize = exr_compress_max_buffer_size (inBufferSize);
if (Z_OK != ::compress (
reinterpret_cast<Bytef*> (_outBuffer),
&outSize,
reinterpret_cast<const Bytef*> (_tmpBuffer),
inBufferSize))
if (EXR_ERR_SUCCESS != exr_compress_buffer (
nullptr,
-1,
_tmpBuffer,
inBufferSize,
_outBuffer,
outSize,
&outSize))
{
throw IEX_NAMESPACE::BaseExc ("Data compression (zlib) failed.");
}
@@ -367,14 +369,15 @@ Pxr24Compressor::uncompress (
return 0;
}
uLong tmpSize = static_cast<uLong> (_maxScanLineSize * _numScanLines);
size_t tmpSize = static_cast<size_t> (_maxScanLineSize * _numScanLines);
if (Z_OK !=
::uncompress (
reinterpret_cast<Bytef*> (_tmpBuffer),
&tmpSize,
reinterpret_cast<const Bytef*> (inPtr),
inSize))
if (EXR_ERR_SUCCESS != exr_uncompress_buffer(
nullptr,
inPtr,
inSize,
_tmpBuffer,
tmpSize,
&tmpSize))
{
throw IEX_NAMESPACE::InputExc ("Data decompression (zlib) failed.");
}
@@ -412,7 +415,7 @@ Pxr24Compressor::uncompress (
ptr[3] = ptr[2] + n;
tmpBufferEnd = ptr[3] + n;
if (static_cast<uLong> (tmpBufferEnd - _tmpBuffer) > tmpSize)
if (static_cast<size_t> (tmpBufferEnd - _tmpBuffer) > tmpSize)
notEnoughData ();
for (int j = 0; j < n; ++j)
@@ -437,7 +440,7 @@ Pxr24Compressor::uncompress (
ptr[1] = ptr[0] + n;
tmpBufferEnd = ptr[1] + n;
if (static_cast<uLong> (tmpBufferEnd - _tmpBuffer) > tmpSize)
if (static_cast<size_t> (tmpBufferEnd - _tmpBuffer) > tmpSize)
notEnoughData ();
for (int j = 0; j < n; ++j)
@@ -460,7 +463,7 @@ Pxr24Compressor::uncompress (
ptr[2] = ptr[1] + n;
tmpBufferEnd = ptr[2] + n;
if (static_cast<uLong> (tmpBufferEnd - _tmpBuffer) > tmpSize)
if (static_cast<size_t> (tmpBufferEnd - _tmpBuffer) > tmpSize)
notEnoughData ();
for (int j = 0; j < n; ++j)
@@ -483,7 +486,7 @@ Pxr24Compressor::uncompress (
}
}
if (static_cast<uLong> (tmpBufferEnd - _tmpBuffer) < tmpSize) tooMuchData ();
if (static_cast<size_t> (tmpBufferEnd - _tmpBuffer) < tmpSize) tooMuchData ();
outPtr = _outBuffer;
return writePtr - _outBuffer;
+1 -1
View File
@@ -223,7 +223,7 @@ public:
// Rounding control for luminance/chroma images:
//
// If the output file contains luminance and chroma channels (WRITE_YC
// or WRITE_YCA), then the the significands of the luminance and
// or WRITE_YCA), then the significands of the luminance and
// chroma values are rounded to roundY and roundC bits respectively (see
// function half::round()). Rounding improves compression with minimal
// image degradation, usually much less than the degradation caused by

Some files were not shown because too many files have changed in this diff Show More