diff --git a/.github/workflows/ci_workflow.yml b/.github/workflows/ci_workflow.yml index 779e9105f8..7015e68e17 100644 --- a/.github/workflows/ci_workflow.yml +++ b/.github/workflows/ci_workflow.yml @@ -47,8 +47,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: @@ -74,7 +73,6 @@ jobs: label: threads-enabled: 'ON' vfx-cy: 2022 - build-docs: 'ON' exclude-tests: # Shared, Release, Threads OFF @@ -88,7 +86,6 @@ jobs: label: threads-enabled: 'OFF' vfx-cy: 2022 - build-docs: 'OFF' exclude-tests: # Shared, Debug @@ -102,7 +99,6 @@ jobs: label: threads-enabled: 'ON' vfx-cy: 2022 - build-docs: 'OFF' exclude-tests: # Static, Release @@ -116,7 +112,6 @@ jobs: label: threads-enabled: 'ON' vfx-cy: 2022 - build-docs: 'OFF' exclude-tests: # Static, Debug @@ -130,7 +125,6 @@ jobs: label: threads-enabled: 'ON' vfx-cy: 2022 - build-docs: 'OFF' exclude-tests: # ------------------------------------------------------------------- @@ -147,7 +141,6 @@ jobs: label: threads-enabled: 'ON' vfx-cy: 2022 - build-docs: 'OFF' exclude-tests: # Debug @@ -161,7 +154,6 @@ jobs: label: threads-enabled: 'ON' vfx-cy: 2022 - build-docs: 'OFF' exclude-tests: # Static, Release @@ -175,7 +167,6 @@ jobs: label: threads-enabled: 'ON' vfx-cy: 2022 - build-docs: 'OFF' exclude-tests: # Static, Debug @@ -188,7 +179,6 @@ jobs: compiler-desc: clang10 label: threads-enabled: 'ON' - build-docs: 'OFF' vfx-cy: 2022 exclude-tests: @@ -205,7 +195,6 @@ jobs: compiler-desc: gcc9.3.1 label: threads-enabled: 'ON' - build-docs: 'OFF' vfx-cy: 2021 exclude-tests: @@ -222,7 +211,6 @@ jobs: compiler-desc: gcc6.3.1 label: threads-enabled: 'ON' - build-docs: 'OFF' vfx-cy: 2020 exclude-tests: @@ -239,7 +227,6 @@ jobs: compiler-desc: gcc6.3.1 label: threads-enabled: 'ON' - build-docs: 'OFF' vfx-cy: 2019 exclude-tests: @@ -256,7 +243,6 @@ jobs: compiler-desc: gcc6.3.1 label: 'Legacy ' threads-enabled: 'ON' - build-docs: 'OFF' vfx-cy: 2019 exclude-tests: @@ -271,9 +257,6 @@ 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: Configure run: | cmake .. \ @@ -283,7 +266,6 @@ 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_RUN_FUZZ_TESTS='OFF' \ -DOPENEXR_ENABLE_THREADING=${{ matrix.threads-enabled }} @@ -332,8 +314,7 @@ jobs: C++${{ matrix.cxx-standard }}, config=${{ matrix.build-type }}, shared=${{ matrix.build-shared }}, - cxx=${{ matrix.cxx-standard }}, - docs=${{ matrix.build-docs }}>' + cxx=${{ matrix.cxx-standard }}>' runs-on: macos-${{ matrix.osver }} strategy: matrix: @@ -346,7 +327,6 @@ jobs: - build: 1 build-type: Release build-shared: 'ON' - build-docs: 'OFF' compiler-desc: AppleClang11.0 cxx-standard: 17 osver: 10.15 @@ -356,7 +336,6 @@ jobs: - build: 2 build-type: Release build-shared: 'OFF' - build-docs: 'OFF' compiler-desc: AppleClang11.0 cxx-standard: 17 osver: 10.15 @@ -366,7 +345,6 @@ jobs: - build: 3 build-type: Debug build-shared: 'ON' - build-docs: 'OFF' compiler-desc: AppleClang11.0 cxx-standard: 17 osver: 10.15 @@ -430,8 +408,7 @@ jobs: <${{ matrix.compiler-desc }}, config=${{ matrix.build-type }}, shared=${{ matrix.build-shared }}, - cxx=${{ matrix.cxx-standard }}, - docs=${{ matrix.build-docs }}>' + cxx=${{ matrix.cxx-standard }}>' runs-on: windows-${{ matrix.osver }} strategy: matrix: @@ -444,7 +421,6 @@ jobs: - build: 1 build-type: Release build-shared: 'ON' - build-docs: 'OFF' compiler-desc: msvc16.11 cxx-standard: 17 vfx-cy: 2021 @@ -455,7 +431,6 @@ jobs: - build: 2 build-type: Release build-shared: 'OFF' - build-docs: 'OFF' compiler-desc: msvc16.11 cxx-standard: 17 vfx-cy: 2021 @@ -469,7 +444,6 @@ jobs: - build: 3 build-type: Release build-shared: 'ON' - build-docs: 'OFF' compiler-desc: msvc17.1 cxx-standard: 17 vfx-cy: 2021 @@ -480,7 +454,6 @@ jobs: - build: 4 build-type: Release build-shared: 'OFF' - build-docs: 'OFF' compiler-desc: msvc17.1 cxx-standard: 17 vfx-cy: 2021 @@ -547,3 +520,37 @@ jobs: -VV shell: bash working-directory: _build + + Docs: + + # Build the documentation, 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 + # docs/script/test_images.py script to generate the "Test Images" + # page. + + name: 'Docs' + 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 docs/requirements.txt + - name: Configure + run: cmake .. -DBUILD_DOCS='ON' + working-directory: _build + - name: Build + run: | + cmake --build . \ + --target docs \ + --config Release + working-directory: _build + diff --git a/.gitignore b/.gitignore index 4535b8077a..8d1326855d 100644 --- a/.gitignore +++ b/.gitignore @@ -49,4 +49,5 @@ build/ build-win/ build-nuget/ *~ -.vscode \ No newline at end of file +.vscode +docs/_test_images/ diff --git a/.readthedocs.yml b/.readthedocs.yml new file mode 100644 index 0000000000..12a8dbf59e --- /dev/null +++ b/.readthedocs.yml @@ -0,0 +1,25 @@ +# .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 docs/scripts/test_images.py + +sphinx: + configuration: docs/conf.py + +python: + install: + - requirements: docs/requirements.txt diff --git a/docs/CMakeLists.txt b/docs/CMakeLists.txt index 993e1694bf..cff4fed524 100644 --- a/docs/CMakeLists.txt +++ b/docs/CMakeLists.txt @@ -21,6 +21,14 @@ set(SPHINX_INDEX_FILE ${SPHINX_BUILD}/index.html) set(SPHINX_OPTS "-W" CACHE STRING "Sphinx build options") +set(OPENEXR_TEST_IMAGE_REPO "https://raw.githubusercontent.com/AcademySoftwareFoundation/openexr-images" + CACHE STRING "Repo for test images") +set(OPENEXR_TEST_IMAGE_TAG "main" + CACHE STRING "Tag for test image repo") + +set(TEST_IMAGE_INDEX_FILE ${PROJECT_SOURCE_DIR}/docs/_test_images/index.rst) +set(TEST_IMAGE_PY_FILE ${PROJECT_SOURCE_DIR}/docs/scripts/test_images.py) +set(TEST_IMAGE_INPUT_FILE ${PROJECT_SOURCE_DIR}/docs/test_images.txt) configure_file(${DOXYFILE_IN} ${DOXYFILE_OUT} @ONLY) file(MAKE_DIRECTORY ${DOXYGEN_OUTPUT_DIR}) @@ -31,6 +39,18 @@ add_custom_command(OUTPUT ${DOXYGEN_INDEX_FILE} COMMENT "Running doxygen" VERBATIM) +add_custom_command(OUTPUT ${TEST_IMAGE_INDEX_FILE} + # run the test_images.py script with the PATH set + # to include the build's bin directory, to pick up + # the local bin/exrheader executable + COMMAND ${CMAKE_COMMAND} -E env "PATH=${CMAKE_CURRENT_BINARY_DIR}/../bin:$ENV{PATH}" + ${Python3_EXECUTABLE} ${TEST_IMAGE_PY_FILE} ${OPENEXR_TEST_IMAGE_REPO} ${OPENEXR_TEST_IMAGE_TAG} + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} + DEPENDS + ${TEST_IMAGE_PY_FILE} ${TEST_IMAGE_INPUT_FILE} + COMMENT "Generating test image pages" + VERBATIM) + add_custom_command(OUTPUT ${SPHINX_INDEX_FILE} COMMAND ${SPHINX_EXECUTABLE} -b html ${SPHINX_OPTS} @@ -38,11 +58,14 @@ add_custom_command(OUTPUT ${SPHINX_INDEX_FILE} -Dbreathe_projects.OpenEXR=${DOXYGEN_OUTPUT_DIR}/xml ${SPHINX_SOURCE} ${SPHINX_BUILD} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} - DEPENDS ${DOXYGEN_INDEX_FILE} - MAIN_DEPENDENCY conf.py + DEPENDS ${DOXYGEN_INDEX_FILE} ${TEST_IMAGE_INDEX_FILE} ${TEST_IMAGE_PY_FILE} ${TEST_IMAGE_INPUT_FILE} + MAIN_DEPENDENCY ${SPHINX_CONF_PY_FILE} COMMENT "Generating documentation with Sphinx") -add_custom_target(docs ALL DEPENDS ${SPHINX_INDEX_FILE} ${DOXYGEN_INDEX_FILE}) +add_custom_target(docs ALL DEPENDS + ${SPHINX_INDEX_FILE} + ${DOXYGEN_INDEX_FILE} + ${TEST_IMAGE_INDEX_FILE}) # Add an install target to install the docs if(INSTALL_DOCS) diff --git a/docs/scripts/test_images.py b/docs/scripts/test_images.py new file mode 100755 index 0000000000..50a74bfe0a --- /dev/null +++ b/docs/scripts/test_images.py @@ -0,0 +1,475 @@ +#!/usr/bin/env python3 + +# SPDX-License-Identifier: BSD-3-Clause +# Copyright (c) Contributors to the OpenEXR Project. + +# +# Generate the "Test Images" page for the openexr.com website +# +# The file "docs/test_images.txt" contains urls for either .exr files +# or README.txt files from +# https://github.com/AcademySoftwareFoundation/openexr-images. This +# script processes them into .rst files with a main index listing all +# images (with thumbnails and summaries) and a separate page per image +# file showing the full image and the header contents in a table. +# +# The test_images.txt file references url's, which get downloaded and +# converted to proxy .jpg files via 'wget' and 'exrheader'. +# +# The README.rst files are expected to have a heading, summary text, +# and a ".. list-table::" with descriptive text for selected +# images. The main index pages gets the main summary text, with the +# per-image descriptive text in the table next to the image thumbnail. +# +# Note that the README.rst files in the openexr-images repo are never +# actually processed directly by sphinx. +# +# The generated .rst and .jpg files all go in the "docs/_test_images" +# directory underneath the source root. Ideally, these would go in the +# build root, but sphinx expects all source content under a single +# root. +# + +import sys, os, tempfile +from subprocess import PIPE, run + +def exr_header(exr_path): + '''Return a dict of the attributes in the exr file's header(s) + The index of the dict is the part number as a string, i.e. "0", "1", etc. + The value of each entry is a dict of attribute/value pairs. + + Also return in rows the the list of all attributes across all + parts, which equates to the complete list of rows in the table, + since not all parts will necessarily have the same attributes. + ''' + + result = run (['exrheader', exr_path], + stdout=PIPE, stderr=PIPE, universal_newlines=True) + if result.returncode != 0: + raise Exception(f'failed to read header for {exr_path}') + + lines = result.stdout.split('\n') + + name,version = lines[3].split(':') + + header = {} + current_part = "0" + current_attr = None + + for line in lines[4:]: + if line.startswith(' part '): + current_part = line[6:].rstrip(':') + continue + + continuation = line.startswith(" ") + line = line.strip() + if len(line) == 0: # blank line + continue + if continuation: + words = line.split(',') + if len(words) > 1: + line = words[0] + line = line.strip().strip('"').replace(' ',' ') + if header[current_part][current_attr]: + header[current_part][current_attr] += ', ' + header[current_part][current_attr] += line + continue + + name_value = line.split(':') + if len(name_value) > 1: + current_attr = name_value[0].split(' ')[0] + if current_part not in header: + header[current_part] = {} + header[current_part][current_attr] = name_value[1].strip().strip('"').replace(' ',' ') + + rows = set() + for part_name,part in header.items(): + for attr_name,value in part.items(): + rows.add(attr_name) + + return header, rows + +def write_rst_list_table_row(outfile, attr_name, header, rows, ignore_attr_name=False): + '''Write a row in the rst list-table of parts/attributes on the website page for an exr file''' + + if ignore_attr_name: + outfile.write(f' * -\n') + else: + outfile.write(f' * - {attr_name}\n') + for part_number,part in header.items(): + if attr_name in part: + value = part[attr_name] + if type(value) is list: + value = ' '.join(value) + else: + value = '' + outfile.write(f' - {value}\n') + +def write_exr_page(rst_lpath, exr_url, exr_filename, exr_lpath, jpg_lpath, readme): + '''Write the website page for each exr: title, image, and list-table of attribute name/value for each part + + rst_lpath: the name of .rst file to write, including directory relative to the source root + exr_url: the url of exr + exr_filename: the exr filename without directory + exr_lpath: the exr filename with directory relative to the source root + jpg_lpath: the jpg filename with directory relative to the source root + + Return a dict of of the header parts/attributes + ''' + + # Download the exr to a temp file + fd, local_exr = tempfile.mkstemp(".exr") + os.close(fd) + + header = None + + try: + + # Download the exr via wget + + print(f'wget {exr_url}') + result = run (['wget', exr_url, '-O', local_exr], + stdout=PIPE, stderr=PIPE, universal_newlines=True) + if result.returncode != 0 or not os.path.isfile(local_exr): + raise Exception(f'failed to read {exr_url}: no such file {local_exr}') + + # Convert to .jpg, but only if it doesn't already exist + + if not os.path.isfile(jpg_lpath): + print(f'convert {jpg_lpath}') + result = run (['convert', local_exr, jpg_lpath], + stdout=PIPE, stderr=PIPE, universal_newlines=True) + + if result.returncode != 0 or not os.path.isfile(jpg_lpath): + raise Exception(f'error: failed to convert {exr_url} to {jpg_lpath}: returncode={result.returncode}, stderr={result.stderr}') + + # Read the header + + header, rows = exr_header(local_exr) + + os.remove(local_exr) + + if not header: + raise Exception(f'can\'t read header for {local_exr}') + + print(f'write {rst_lpath}') + + with open(rst_lpath, 'w') as rst_file: + + # copyright + rst_file.write(f'..\n') + rst_file.write(f' SPDX-License-Identifier: BSD-3-Clause\n') + rst_file.write(f' Copyright Contributors to the OpenEXR Project.\n') + rst_file.write(f'\n') + + # :download: + rst_file.write(f'{exr_filename}\n') + for i in range(0,len(exr_filename)): + rst_file.write('#') + rst_file.write(f'\n') + rst_file.write(f'\n') + rst_file.write(f':download:`{exr_url}<{exr_url}>`\n') + rst_file.write(f'\n') + + # .. image:: + rst_file.write(f'.. image:: {os.path.basename(jpg_lpath)}\n') + rst_file.write(f' :target: {exr_url}\n') + rst_file.write(f'\n') + + if readme: + notes = readme_notes(readme, exr_filename, False) + if notes: + rst_file.write(f'\n') + rst_file.write(notes) + rst_file.write(f'\n') + + # .. list-table:: + rst_file.write(f'.. list-table::\n') + rst_file.write(f' :align: left\n') + + # For multi-part files, add a header. For single-part, put the 'name' attribute at the top, if there is one + if 'name' in rows: + if len(header) > 2: + rst_file.write(f' :header-rows: 1\n') + rst_file.write(f'\n') + write_rst_list_table_row(rst_file, 'name', header, rows, True) + else: + rst_file.write(f'\n') + write_rst_list_table_row(rst_file, 'name', header, rows) + else: + rst_file.write(f'\n') + + # Write each attribute + for attr_name in rows: + if attr_name == 'name': + continue + write_rst_list_table_row(rst_file, attr_name, header, rows) + + except Exception as e: + + os.remove(local_exr) + + raise e + + return header + +def write_readme(index_file, repo, tag, lpath): + '''Download the README.txt file and write its contents up to the first ".. list-table::" + Return a list of all lines in the file. + ''' + + # Download to a temp file + + fd, local_readme = tempfile.mkstemp(".rst") + + try: + + # Download via wget + + readme_url = f'{repo}/{tag}/{lpath}' + result = run (['wget', readme_url, '-O', local_readme], + stdout=PIPE, stderr=PIPE, universal_newlines=True) + if result.returncode != 0: + raise FileNotFoundError(result.stderr) + + text = '' + found = False + with open(local_readme, 'r') as readme_file: + lines = readme_file.readlines() + for line in lines: + if '.. list-table::' in line: + break + index_file.write(line[:-1]) + index_file.write('\n') + + os.unlink(local_readme) + return lines + + except Exception as e: + + os.unlink(local_readme) + + raise e + + return None + +def readme_notes(readme, exr_filename, html): + '''Extract the section of the README.rst file's list-table for the given exr file. + + The list-table line lists the exr as a row header, i.e. with "* -" prefix. Return the lines up to the next row. + + Return None if there's no entry. + ''' + + found = False + text = '' + + for line in readme: + if line.startswith(' * -'): + if exr_filename in line: + found = True + elif found: + break + else: + if found and line != '\n': + if not line.startswith(' '): + break + if html: + text += ' ' + text += line[7:].replace(' ``',' ').replace('``','') + else: + text += line[7:] + return text + +def write_exr_to_index(index_file, repo, tag, exr_lpath, readme): + '''Write an entry to the index.rst file for the give exr, in raw html format. + + index_file: the open index.rst file descriptor + repo: the repo url + tag: the tag/branch of the repo + exr_lpath: the name of the exr file, with directory relative to the repo root + readme: the lines of the README.txt, returned by write_readme() + ''' + + # Examples: + # repo = 'https://raw.githubusercontent.com/cary-ilm/openexr-images' + # tag = 'docs' + # exr_lpath = v2/LeftView/Ground.exr + + test_images = 'docs/_test_images/' + output_dirname = test_images + os.path.dirname(exr_lpath) # docs/_test_images/v2/LeftView + os.makedirs(output_dirname, exist_ok=True) + base_path = os.path.splitext(exr_lpath)[0] # v2/LeftView/Ground + exr_filename = os.path.basename(exr_lpath) # Ground.exr + exr_basename = os.path.splitext(exr_filename)[0] # Ground + exr_dirname = os.path.dirname(exr_lpath) # v2/LeftView + rst_lpath = f'{test_images}{exr_dirname}/{exr_basename}.rst' # docs/_test_images/v2/LeftView/Ground.rst + jpg_rpath = f'{exr_dirname}/{exr_dirname.replace("/", "_")}_{exr_basename}.jpg' + jpg_lpath = test_images + jpg_rpath # docs/_test_images/v2/LeftView/Ground.K@#YSDF.jpg + + exr_url = f'{repo}/{tag}/{exr_lpath}' + + # Write the exr page + + header = write_exr_page(rst_lpath, exr_url, exr_filename, exr_lpath, jpg_lpath, readme) + + if not header: + raise Exception(f'no header for {exr_lpath}') + + num_parts = len(header) + num_channels = 0 + for p,v in header.items(): + num_channels += len(v) + + # open the row + index_file.write(' \n') + + # row for the image + index_file.write(f' \n') + index_file.write(f' \n') + index_file.write(f' \n') + + # row for the summary + index_file.write(f' \n') + index_file.write(f' {exr_filename} \n') + index_file.write(f' \n') + index_file.write(f' \n') + + # row for the readme notes, if there are any + + if readme: + notes = readme_notes(readme, exr_filename, True) + if notes: + index_file.write(f' \n') + index_file.write(f'

\n') + index_file.write(notes) + index_file.write(f'

\n') + index_file.write(f' \n') + + # close the row + index_file.write(' \n') + + return base_path + +def write_table_open(index_file): + + index_file.write(f'\n') + index_file.write(f'.. raw:: html\n') + index_file.write(f'\n') + index_file.write(f' \n') + index_file.write(f' \n') + index_file.write(f'\n') + +def write_table_close(index_file): + + index_file.write(f'\n') + index_file.write(f'
\n') + index_file.write(f' \n') + index_file.write(f'\n') + +print(f'generating rst for test images ...') + +print(f'PATH={os.environ["PATH"]}') +result = run (['which', 'exrheader'], + stdout=PIPE, stderr=PIPE, universal_newlines=True) +print(f'exrheader={result.stdout}') + +repo = sys.argv[1] if len(sys.argv) > 1 else 'https://raw.githubusercontent.com/AcademySoftwareFoundation/openexr-images' +tag = sys.argv[2] if len(sys.argv) > 2 else 'main' + +try: + + os.makedirs('docs/_test_images', exist_ok=True) + + with open('docs/_test_images/index.rst', 'w') as index_file: + + index_file.write('Test Images\n') + index_file.write('###########\n') + index_file.write('\n') + index_file.write('.. toctree::\n') + index_file.write(' :caption: Test Images\n') + index_file.write(' :maxdepth: 2\n') + index_file.write('\n') + index_file.write(' toctree\n') + index_file.write('\n') + + toctree = [] + readme = None + table_opened = False + + # Process each url in the .txt file + + with open('docs/test_images.txt', 'r') as test_images_file: + for line in test_images_file.readlines(): + + if line.startswith('#'): + continue + + lpath = line.strip('\n') + + if os.path.basename(lpath) == "README.rst": + + if table_opened: + write_table_close(index_file) + table_opened = False + + readme = write_readme(index_file, repo, tag, lpath) + + elif lpath.endswith('.exr'): + + if not table_opened: + write_table_open(index_file) + table_opened = True + + base_path = write_exr_to_index(index_file, repo, tag, lpath, readme) + if base_path: + toctree.append(base_path) + + if table_opened: + write_table_close(index_file) + + # Write the toctree file, one entry per .exr page + + with open('docs/_test_images/toctree.rst', 'w') as toctree_file: + toctree_file.write('..\n') + toctree_file.write(' SPDX-License-Identifier: BSD-3-Clause\n') + toctree_file.write(' Copyright Contributors to the OpenEXR Project.\n') + toctree_file.write('\n') + toctree_file.write('.. toctree::\n') + toctree_file.write(' :maxdepth: 0\n') + toctree_file.write(' :hidden:\n') + toctree_file.write('\n') + for t in toctree: + toctree_file.write(f' {t}\n') + +except Exception as e: + + print(f'error: {str(e)}', file=sys.stderr) + exit(-1) + +exit(0) + + + diff --git a/docs/test_images.txt b/docs/test_images.txt new file mode 100644 index 0000000000..e4cf3510a3 --- /dev/null +++ b/docs/test_images.txt @@ -0,0 +1,118 @@ +TestImages/README.rst +TestImages/AllHalfValues.exr +TestImages/BrightRings.exr +TestImages/BrightRingsNanInf.exr +TestImages/GammaChart.exr +TestImages/GrayRampsDiagonal.exr +TestImages/GrayRampsHorizontal.exr +TestImages/RgbRampsDiagonal.exr +TestImages/SquaresSwirls.exr +TestImages/WideColorGamut.exr +TestImages/WideFloatRange.exr + +ScanLines/README.rst +ScanLines/Blobbies.exr +ScanLines/CandleGlass.exr +ScanLines/Cannon.exr +ScanLines/Desk.exr +ScanLines/MtTamWest.exr +ScanLines/PrismsLenses.exr +ScanLines/StillLife.exr +ScanLines/Tree.exr + +Tiles/README.rst +Tiles/GoldenGate.exr +Tiles/Ocean.exr +Tiles/Spirals.exr + +Chromaticities/README.rst +Chromaticities/Rec709.exr +Chromaticities/Rec709_YC.exr +Chromaticities/XYZ.exr +Chromaticities/XYZ_YC.exr + +LuminanceChroma/README.rst +LuminanceChroma/CrissyField.exr +LuminanceChroma/Flowers.exr +LuminanceChroma/Garden.exr +LuminanceChroma/MtTamNorth.exr +LuminanceChroma/StarField.exr + +DisplayWindow/README.rst +DisplayWindow/t01.exr +DisplayWindow/t02.exr +DisplayWindow/t03.exr +DisplayWindow/t04.exr +DisplayWindow/t05.exr +DisplayWindow/t06.exr +DisplayWindow/t07.exr +DisplayWindow/t08.exr +DisplayWindow/t09.exr +DisplayWindow/t10.exr +DisplayWindow/t11.exr +DisplayWindow/t12.exr +DisplayWindow/t13.exr +DisplayWindow/t14.exr +DisplayWindow/t15.exr +DisplayWindow/t16.exr + +Beachball/README.rst +Beachball/multipart.0001.exr +Beachball/multipart.0002.exr +Beachball/multipart.0003.exr +Beachball/multipart.0004.exr +Beachball/multipart.0005.exr +Beachball/multipart.0006.exr +Beachball/multipart.0007.exr +Beachball/multipart.0008.exr +Beachball/singlepart.0001.exr +Beachball/singlepart.0002.exr +Beachball/singlepart.0003.exr +Beachball/singlepart.0004.exr +Beachball/singlepart.0005.exr +Beachball/singlepart.0006.exr +Beachball/singlepart.0007.exr +Beachball/singlepart.0008.exr + +MultiView/README.rst +MultiView/Adjuster.exr +MultiView/Balls.exr +MultiView/Fog.exr +MultiView/Impact.exr +MultiView/LosPadres.exr + +MultiResolution/README.rst +MultiResolution/Bonita.exr +MultiResolution/ColorCodedLevels.exr +MultiResolution/Kapaa.exr +MultiResolution/KernerEnvCube.exr +MultiResolution/KernerEnvLatLong.exr +MultiResolution/MirrorPattern.exr +MultiResolution/OrientationCube.exr +MultiResolution/OrientationLatLong.exr +MultiResolution/PeriodicPattern.exr +MultiResolution/StageEnvCube.exr +MultiResolution/StageEnvLatLong.exr +MultiResolution/WavyLinesCube.exr +MultiResolution/WavyLinesLatLong.exr +MultiResolution/WavyLinesSphere.exr + +v2/Stereo/README.rst +v2/Stereo/Balls.exr +v2/Stereo/Ground.exr +v2/Stereo/Leaves.exr +v2/Stereo/Trunks.exr +v2/Stereo/composited.exr + +v2/LeftView/README.rst +v2/LeftView/Balls.exr +v2/LeftView/Ground.exr +v2/LeftView/Leaves.exr +v2/LeftView/Trunks.exr + +v2/LowResLeftView/README.rst +v2/LowResLeftView/Balls.exr +v2/LowResLeftView/Ground.exr +v2/LowResLeftView/Leaves.exr +v2/LowResLeftView/Trunks.exr +v2/LowResLeftView/composited.exr diff --git a/docs/toc_redirect.rst b/docs/toc_redirect.rst index 3977c17e20..93747a231b 100644 --- a/docs/toc_redirect.rst +++ b/docs/toc_redirect.rst @@ -32,6 +32,11 @@ about +.. toctree:: + :hidden: + + _test_images/index + diff --git a/share/ci/scripts/linux/yum/install_docs_env.sh b/share/ci/scripts/linux/yum/install_docs_env.sh deleted file mode 100755 index c97f661b87..0000000000 --- a/share/ci/scripts/linux/yum/install_docs_env.sh +++ /dev/null @@ -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 diff --git a/share/ci/scripts/linux/yum/install_doxygen.sh b/share/ci/scripts/linux/yum/install_doxygen.sh deleted file mode 100755 index d51d2611fe..0000000000 --- a/share/ci/scripts/linux/yum/install_doxygen.sh +++ /dev/null @@ -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