Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
456bf42dc2 | ||
|
|
fdaee4bd27 | ||
|
|
4713cf0da6 | ||
|
|
b2cfe364db | ||
|
|
a8609d9252 | ||
|
|
311c6e691e | ||
|
|
22b99053b9 | ||
|
|
15aa9a726c | ||
|
|
ce7d8606d1 | ||
|
|
318536c09e | ||
|
|
aed455ff67 | ||
|
|
faceebdfa1 | ||
|
|
e8809d45e3 | ||
|
|
e1a8ce0831 | ||
|
|
69b1297563 | ||
|
|
9852be60a5 | ||
|
|
0dba5e3663 | ||
|
|
d688d05d99 | ||
|
|
5bd66ff6ea | ||
|
|
772208b45d | ||
|
|
09f8aeae66 | ||
|
|
ebeb5676cb | ||
|
|
8f6849f6a8 | ||
|
|
726fde32bc | ||
|
|
ce8f39a23a | ||
|
|
f0c76e1bff | ||
|
|
8f8be506c9 | ||
|
|
649b25473b | ||
|
|
af87558c60 | ||
|
|
881f4989ce | ||
|
|
da9f785d6c | ||
|
|
34fd6433b9 | ||
|
|
cfd1c76eab | ||
|
|
54dd0411dd | ||
|
|
83c57cb4b9 | ||
|
|
ae32ed6c6e | ||
|
|
e452e5fd23 | ||
|
|
4d683ec76e | ||
|
|
2e27f41b79 | ||
|
|
c9b6b73e1f | ||
|
|
811c941e42 | ||
|
|
114cc6453b | ||
|
|
f3fc12b490 | ||
|
|
a30498e76e | ||
|
|
2c9bf6f8a2 | ||
|
|
e4bb5997b9 | ||
|
|
fe463369d1 | ||
|
|
a5de20e817 | ||
|
|
0853c73bdf | ||
|
|
56ca398f36 | ||
|
|
f1d662064f | ||
|
|
1367e0a0da | ||
|
|
049eb3aa38 | ||
|
|
11a99dfd58 | ||
|
|
fe2a8f5817 | ||
|
|
ff27eeb9e4 | ||
|
|
7447f9930a | ||
|
|
3147ffacdf | ||
|
|
e504fb2ec3 | ||
|
|
7a8ae78f8b | ||
|
|
729f42648d | ||
|
|
425d4b24e0 | ||
|
|
379a2884af | ||
|
|
4d49374dc5 | ||
|
|
af517234b3 | ||
|
|
7fe4e3bfbc | ||
|
|
6f235a803c | ||
|
|
200613925d | ||
|
|
b4899a6788 | ||
|
|
a5428248c1 | ||
|
|
9e47dfdfad | ||
|
|
a00bac506f | ||
|
|
a91df5206e | ||
|
|
447451f0a6 | ||
|
|
62cf13cd69 | ||
|
|
39a77f22ae | ||
|
|
6773e77bad | ||
|
|
2e4c5229e8 | ||
|
|
7c40603eb2 | ||
|
|
7862c23a2b | ||
|
|
b7446c0ec5 | ||
|
|
2dcc1b80e3 | ||
|
|
663708e53d | ||
|
|
cf19b5491b | ||
|
|
83210c7c7b | ||
|
|
9293eef977 | ||
|
|
d2460f0192 | ||
|
|
1f7de5aeef | ||
|
|
8c1fde8eca | ||
|
|
0d1d0c38f2 | ||
|
|
9ef5625b19 | ||
|
|
80f798b0d7 | ||
|
|
6903f8a920 | ||
|
|
2e24872d03 | ||
|
|
714d90288b | ||
|
|
9120defaf3 | ||
|
|
eda96c308d | ||
|
|
d98a34bff4 | ||
|
|
9ce8ef819a | ||
|
|
434a962771 | ||
|
|
5aa18bca26 | ||
|
|
ef4b710f73 | ||
|
|
faf1bc1e90 | ||
|
|
358eec4516 | ||
|
|
67f7d05973 | ||
|
|
60611ccd5f | ||
|
|
fc7f898ef0 | ||
|
|
b6480cffe0 | ||
|
|
71a7141556 |
@@ -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
@@ -1 +1 @@
|
||||
6.0.0
|
||||
6.3.2
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
# SPDX-License-Identifier: BSD-3-Clause
|
||||
# Copyright Contributors to the OpenEXR Project.
|
||||
---
|
||||
Language: Cpp
|
||||
# BasedOnStyle: LLVM
|
||||
|
||||
@@ -12,6 +12,9 @@ on:
|
||||
- cron: "0 0 * * 0"
|
||||
workflow_dispatch:
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
@@ -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
@@ -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
|
||||
@@ -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
|
||||
@@ -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
@@ -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-*
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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.
|
||||
|
||||
@@ -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:
|
||||
//
|
||||
|
||||
@@ -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")
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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"],
|
||||
)
|
||||
@@ -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;
|
||||
}
|
||||
Vendored
+6
-6
@@ -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 */",
|
||||
|
||||
Vendored
+55
@@ -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"],
|
||||
)
|
||||
Vendored
+14
-16
@@ -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",
|
||||
],
|
||||
)
|
||||
|
||||
Vendored
-98
@@ -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"],
|
||||
)
|
||||
@@ -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(
|
||||
|
||||
@@ -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
@@ -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@
|
||||
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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
@@ -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
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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 |
@@ -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
|
||||
@@ -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 |
@@ -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
|
||||
@@ -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 |
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
Executable
+109
@@ -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
|
||||
|
||||
Executable
+100
@@ -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/.*'
|
||||
@@ -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 "${plugin_state_location}/${specs_file}"'" 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 "${plugin_state_location}/specs.cpp"'" 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 "${plugin_state_location}/specs.c"'" 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 "${plugin_state_location}/${specs_file}"'" 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 "${plugin_state_location}/specs.cpp"'" 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 "${plugin_state_location}/specs.c"'" 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>
|
||||
@@ -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/
|
||||
|
||||
@@ -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
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
@@ -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
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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"],
|
||||
)
|
||||
@@ -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
|
||||
)
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
//
|
||||
// SPDX-License-Identifier: BSD-3-Clause
|
||||
// Copyright (c) Contributors to the OpenEXR Project.
|
||||
//
|
||||
|
||||
void deepExamples ();
|
||||
@@ -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);
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
//
|
||||
// SPDX-License-Identifier: BSD-3-Clause
|
||||
// Copyright (c) Contributors to the OpenEXR Project.
|
||||
//
|
||||
|
||||
void deepTiledExamples ();
|
||||
@@ -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
|
||||
//
|
||||
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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 ();
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
//
|
||||
// SPDX-License-Identifier: BSD-3-Clause
|
||||
// Copyright (c) Contributors to the OpenEXR Project.
|
||||
//
|
||||
|
||||
void multipartExamples ();
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
//
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
)
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -71,7 +71,6 @@ private:
|
||||
IMATH_NAMESPACE::Box2i range,
|
||||
const char*& outPtr);
|
||||
|
||||
int _maxScanLineSize;
|
||||
bool _optFlatFields;
|
||||
Format _format;
|
||||
int _numScanLines;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user