diff --git a/docs/guides/amf/index.md b/docs/amf/guides/index.md similarity index 99% rename from docs/guides/amf/index.md rename to docs/amf/guides/index.md index 89f75d1..ad5a466 100644 --- a/docs/guides/amf/index.md +++ b/docs/amf/guides/index.md @@ -10,7 +10,6 @@ ACES Metadata File Implementation Guidelines and Best Practices Scope ---------------- - This document is a guide that recommends implementation guidelines and best practices related to the usage of the ACES Metadata File (AMF) in various workflows. These workflows may involve one or more tools that support the AMF @@ -18,20 +17,11 @@ specification and this guide attempts to help both implementers and users in order to facilitate interoperability. -References ----------------- - - -The following standards, specifications, articles, presentations, and texts are referenced in this text: - -* [Academy S-2019-001, ACES Metadata File (AMF)](https://aces.mp/S-2019-001) -* [IETF RFC 4122, A Universally Unique IDentifier (UUID) URN Namespace](https://standards.globalspec.com/std/1524451/RFC%204122) Introduction ---------------- - The Academy Color Encoding System (ACES) is a color processing framework that enables the mix of various sources within a standardized color space in order to produce one or more outputs. @@ -64,7 +54,6 @@ and tools that support those workflows. What is AMF ---------------- - AMF is an XML specification that describes the configuration of an ACES color pipeline, together with the various input transforms, look transforms and output transforms. @@ -87,7 +76,6 @@ be described as a "many to many" relationship. Why is AMF needed ---------------- - The ACES framework is expanding and becoming richer in terms of input, look, and output transforms. AMF describes the exact list of these different transforms, in the order in which they have been or should be applied to obtain the desired @@ -999,6 +987,16 @@ A validation process can log any differences and present the results to the user of the product/tool processing the EDL+AMF files. +References +---------------- + + +The following standards, specifications, articles, presentations, and texts are referenced in this text: + +* [Academy S-2019-001, ACES Metadata File (AMF)](https://aces.mp/S-2019-001) +* [IETF RFC 4122, A Universally Unique IDentifier (UUID) URN Namespace](https://standards.globalspec.com/std/1524451/RFC%204122) + + + + + + + + + +ACES RGBinput +RGB toJMh +Tonescale(J only) +Chromacompression(M only) +Gamutcompression(M & J) +Encodeoutput RGB + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/output-transforms/technical-details/gamut-compression/images/cusp_label.svg b/docs/output-transforms/technical-details/gamut-compression/images/cusp_label.svg new file mode 100644 index 0000000..928db7c --- /dev/null +++ b/docs/output-transforms/technical-details/gamut-compression/images/cusp_label.svg @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + J + + + + + + + M + + + + + + J + max + + + + + + + + + + + + + + + + + + cusp + + midJ + + focusJ + + cuspJ + + diff --git a/docs/output-transforms/technical-details/gamut-compression/images/cusp_vis.gif b/docs/output-transforms/technical-details/gamut-compression/images/cusp_vis.gif new file mode 100644 index 0000000..cae7fe5 Binary files /dev/null and b/docs/output-transforms/technical-details/gamut-compression/images/cusp_vis.gif differ diff --git a/docs/output-transforms/technical-details/gamut-compression/images/gamma_intersection.svg b/docs/output-transforms/technical-details/gamut-compression/images/gamma_intersection.svg new file mode 100644 index 0000000..3599d63 --- /dev/null +++ b/docs/output-transforms/technical-details/gamut-compression/images/gamma_intersection.svg @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + intersectJ + + intersectJ′ + + intersectCusp + + boundaryM + + + + + + + + + J + + + + + + + M + + + + + + J + max + + diff --git a/docs/output-transforms/technical-details/gamut-compression/images/hue_lines.png b/docs/output-transforms/technical-details/gamut-compression/images/hue_lines.png new file mode 100644 index 0000000..3d5aa28 Binary files /dev/null and b/docs/output-transforms/technical-details/gamut-compression/images/hue_lines.png differ diff --git a/docs/output-transforms/technical-details/gamut-compression/images/reach_intersection.svg b/docs/output-transforms/technical-details/gamut-compression/images/reach_intersection.svg new file mode 100644 index 0000000..5e90b7a --- /dev/null +++ b/docs/output-transforms/technical-details/gamut-compression/images/reach_intersection.svg @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + intersectJ + + intersectReach J′ + + intersectCusp + + boundaryM + + reachM + + reachCuspM + + Reach gamut + Reach ‘cusp’ + + + + + + + + + + + + + + + Target gamut + + + + + + + + + J + + + + + + + M + + + + + + J + max + + diff --git a/docs/output-transforms/technical-details/gamut-compression/index.md b/docs/output-transforms/technical-details/gamut-compression/index.md new file mode 100644 index 0000000..1b2da38 --- /dev/null +++ b/docs/output-transforms/technical-details/gamut-compression/index.md @@ -0,0 +1,258 @@ +--- +title: Invertible Gamut Compression in a Perceptual Polar Space +--- + + +ACES 2.0 Output Transform Gamut Compression +================ + +Introduction +---------------- + +This method of gamut compression was developed for use in the ACES 2.0 Output Transforms, and presented to the [Virtual Working Group](https://paper.dropbox.com/doc/Output-Transforms-Architecture-Virtual-Working-Group--CE~GmViDNqm6I4Wo~5RmQFtFAg-HKNpj824NA0Z8tn7jiPS0), for use with a display rendering based on a modified [Hellwig 2022](https://doi.org/10.1002/col.22792) Color Appearance Model (CAM). It would however be equally applicable to the compression of out of gamut values in any similar color model. +The Hellwig model represents color using a number of different correlates, but for the purposes of display rendering in the ACES 2.0 Output Transform, three are used: + +- **J** : perceived lightness +- **M** : perceived colorfulness +- **h** : perceived hue + +
+ ![The flow of the ACES 2.0 Display Rendering Transform](./images/DRT_flow.svg){ width="900" } +
The flow of the ACES 2.0 Display Rendering Transform (DRT)
+
+ +Gamut compression aims to compute a representation of a color which lies outside a target gamut (the range of colors a particular display is able to reproduce) such that the new representation lies within the target gamut, while maintaining as much of the perceived appearance of the original color as possible. + +A base assumption is that when compressing a color to within the gamut available on a given target display, the correlate of hue should be left unchanged. Therefore compression will take place in a two dimensional space, whose axes are $M$ and $J$, representing a ‘slice’ in hue. The boundary of the corresponding slice of the target gamut has been shown to be well approximated by curved lines using a power law (gamma) function joining the maximum and minimum values on the J-axis to a cusp which represents the lines joining the primary and secondary colors in the RGB cube of the target gamut. + +
+ ![The cusp path](./images/cusp_vis.gif){ width="900" } +
The cusp path shown in an RGB cube and JMh 3D polar plot
+
+ +
+ ![Hie slice](./images/cusp_label.svg){ width="900" } +
A ‘hue slice’ of a gamut plotted in M vs. J
+
+ +To bring a color within the target gamut, it must be moved towards the J-axis. In order to reach the gamut boundary at a larger $M$ value, thus preserving more colorfulness, it has been found to be beneficial to compress along a vector which is not perpendicular to the J-axis. While intuitively it might seem that values above the cusp should be compressed along a vector which decreases $J$, and those above it with one which increases $J$, it has been found by experimentation that an aesthetically preferable result is achieved by choosing a $J$ value ($focusJ$) part way between that of the cusp and that of mid grey, and compressing $J$ values above that downwards, and values below it upwards. + +The Compression Vector +---------------- + +The compression vector is defined by a straight line, so has an equation with the classic form of a straight line, $y = m\cdot x + c$. In this case the y-axis represents $J$, and the x-axis represents $M$, so the equation becomes: + +$$ +J = slope\times M + intersectJ +$$ + + +Where $slope$ is the gradient of the line and $intersectJ$ is the $J$ value where it hits the J-axis. + +For the line to have positive slope above $focusJ$, and negative slope above it, it must be horizontal (zero slope) at $focusJ$. It has also been agreed that it is desirable for the slope to be zero at $J$ values of zero and $J_{max}$, where $J_{max}$ is the J value for the peak white of the target display. The formula for slope chosen to achieve this is: + +$$ +slope=\begin{cases}\frac{intersectJ\times(intersectJ-focusJ)}{slopeGain\times focusJ}&\text{if } intersectJ\leq focusJ\\ +\frac{(J_{max}-intersectJ)\times(intersectJ-focusJ)}{slopeGain\times focusJ}&\text{if }intersectJ>focusJ +\end{cases} +$$ + +Where $slopeGain$ is a constant controlling how steep the slope becomes between the horizontals. An interactive version of the above equation can be seen in [this Desmos plot](). + +In the ACES 2.0 transform, the value of $slopeGain$ is calculated as a user parameter (called $focusDistance$) multiplied by $J_{max}$, to scale it with peak lightness. + +Invertibility +---------------- + +This equation for compression slope is controlled only by $intersectJ$ ($slopeGain$ being a user parameter and $focusJ$ being a constant for a given hue). So if the value of $intersectJ$ which produces a line passing through a particular set of $(M, J)$ coordinates is solved for, and new coordinates $(M^\prime, J^\prime)$ are calculated by compressing along that line, the same value will be found when solving for the $intersectJ$ which leads to a line passing through $(M^\prime, J^\prime)$. Thus, providing an invertible compression curve is used, an inverse compression will map $(M^\prime, J^\prime)$ back along the same line, and result in $(M, J)$. + +Because the slope is zero when $intersectJ$ is equal to $focusJ$, when solving for $intersectJ$ at $(M, J)$ the value of $J$ can be used in place of $intersectJ$ in the condition for the slope equation. Thus, substituting the slope expression into the equation of the line: + +When $J\leq focusJ$: + +$$ +J=\frac{intersectJ\times M \times(intersectJ - focusJ)}{slopeGain \times focusJ} + intersectJ +$$ + +This can be rearranged to: + +$$ +intersectJ^2\times\frac{M}{slopeGain\times focusJ}+intersectJ \times\left( 1-\frac{M}{slopeGain}\right)-J=0 +$$ + +This has the form of a quadratic equation in $intersectJ$, and therefore the solution can be found using one of the variations of the quadratic formula. + +Similarly when $J>focusJ$: + +$$ +J=\frac{M\times(J_{max}-intersectJ)\times(intersectJ-focusJ)}{slopeGain\times focusJ}+intersectJ +$$ + +This can be rearranged to: + +$$ +intersectJ^2\times\frac{M}{slopeGain\times focusJ}-intersectJ\times\left(1+\frac{M}{slopeGain}+\frac{J_{max}\times M}{slopeGain\times focusJ}\right)+\frac{J_{max}\times M}{slopeGain}+J=0 +$$ + +This also has the form of a quadratic equation in $intersectJ$, and the two can be expressed using the form of the quadratic equation required for use of a formula solution: + +$$ +a\cdot x^2+b\cdot x + c = 0 +$$ + +Where the values of a, b and c are: + +$$ +\begin{aligned} +a&=\frac{M}{slopeGain\times focusJ}\\\\ +b&=\begin{cases}1-\frac{M}{slopeGain}&\text{ if }J\leq focusJ\\ +-\left(1 + \frac{M}{slopeGain} + \frac{J_{max}\times M}{slopeGain\times focusJ}\right)&\text{ if }J>focusJ +\end{cases}\\\\ +c&=\begin{cases}-M&\text{ if }J\leq focusJ\\ +\frac{J_{max}\times M}{slopeGain}+M\phantom{123456789012345678.}&\text{ if }J>focusJ +\end{cases} +\end{aligned} +$$ + +Due to division of small numbers as $J$ and $M$ both approach zero, the ‘classic’ quadratic equation formula can suffer from numerical precision issues when this solve is implemented in single precision 32-bit float. So an alternate formulation is preferable. + +This is: + +$$ +x=\frac{2\cdot c}{-b\pm\sqrt{b^2-4\cdot a\cdot c}} +$$ + +Although quadratic equations have two roots, in this instance it is not necessary to find both roots for each condition. In each case, one of the roots is always outside the zero to $J_{max}$ range for input $J$ and $M$ values in the meaningful range for this use case. + +Thus in this case: + +$$ +intersectJ=\begin{cases}\frac{2\cdot c}{-b+\sqrt{b^2-4\cdot a\cdot c}}&\text{ if }J\leq focusJ\\ +\frac{2\cdot c}{-b-\sqrt{b^2-4\cdot a\cdot c}}&\text{ if }J>focusJ +\end{cases} +$$ + +This result can then be used in the slope equation to give both constants needed for the equation of the line along which compression is to take place. + +Compression +---------------- + +The compression method operates by taking the $M$ value of the source color, and normalizing by the $M$ value of the intersection of the compression line and target gamut boundary ($boundaryM$ — see [next section](#boundary-intersection)). A parametric compression curve is then applied, with the three parameters being threshold ($t$), limit ($l$) and exponent ($p$). The threshold is the normalized value below which the input is unchanged. The limit is the normalized value which will be compressed to the gamut boundary (a normalized value of 1.0). The exponent controls the aggressiveness of the roll-off above the threshold. + +The compression curve used in the ACES 2.0 display rendering gamut compression is referred to as the powerP curve. This is the same curve as used in the ACES 1.3 [Reference Gamut Compression](../../guides/rgc-implementation). The equations are as follows. + +First a scale factor is calculated: + +$$ +s=\frac{\left(l-t\right)}{\left(\left(\frac{1-t}{l-t}\right)^{-p}-1\right)^{\frac{1}{p}}} +$$ + +This is then used in the compression function: + +$$ +f(x)=\begin{cases}x&\text{ if }x < t\\ +t+\frac{x-t}{\left(1+\left(\frac{x-t}{s}\right)^{p}\right)^{\frac{1}{p}}}&\text{ if }x\geq t +\end{cases} +$$ + +After compression the compressed $M$ value is multiplied back by the normalization factor ($boundaryM$). The compressed $J$ value can then be found by using the compressed $M$ value in the compression straight line equation. + +Boundary Intersection +---------------- + +Since the gamut boundary curvature is approximated by a power law (gamma) curve with non-integer exponent, and it is not possible to analytically find the intersection of such a curve with a straight line, an approximation of the intersection is needed. As the gamma curve itself is only an approximation of the true gamut boundary, provided that the approximation method for the intersection leads to points which lie on a curve similar in shape to the gamma curve, the result is as valid an approximation as the gamma curve. As the slope and offset of the compression line are defined in terms of the J-axis intersection ($intersectJ$) rather than the source $J$ and $M$ values, and the compressed and uncompressed values both lie on that same line, an intersection method based only on slope and offset will yield the same result in both directions, ensuring invertibility of the compression. + +The intersection of two straight lines is mathematically simple to find. So a first order approximation of the intersection of the curved gamut boundary with the compression line would be the intersection of that line with the straight line joining the cusp to the origin (black) or to the peak of the target gamut (white) depending on whether the line passes above or below the cusp. This can be easily ascertained by using the cusp $M$ value in the compression line equation, and determining whether the resulting $J$ value is greater or less than the cusp $J$ value. + +The straight line intersection approximation will give a value which is too small, assuming the gamma curve is bending the boundary outwards. A method is needed to increase the value found in the middle part of the curve, but converging to return exactly the straight line intersection result at either end. Looking only at the lower part of the boundary (an inverted version of the same thing will work for the upper part) a good approximation of the necessary modification of the straight line intersection can be found by raising the $intersectJ$ value to the reciprocal of the exponent used by the boundary curve, and then finding the straight line intersection. This will not alter the result at the origin, but an appropriate normalization factor is needed to divide $intersectJ$ by prior to exponentiation, and to then multiply it by afterwards, so that the result at the cusp is not affected either. This normalization factor is found as the J-axis intersection of the compression line which passes through the cusp, by putting the $J$ and $M$ values of the cusp into the same [quadratic intersection solve formula](#invertibility) as was used to find the J-axis intersection for the source. This value is referred to as $intersectCusp$. + +So: + +$$ +intersectJ^\prime=intersectCusp\times\left(\frac{intersectJ}{intersectCusp}\right)^{\frac{1}{\gamma}} +$$ + +At the intersection of a line from $intersectJ^\prime$ with gradient $slope$ and a line from the origin to $(cuspM, cuspJ)$: + +$$ +intersectJ^\prime+boundaryM\times slope=boundaryM\times \frac{cuspJ}{cuspM} +$$ + +Solving for $boundaryM$: + +$$ +boundaryM=\frac{intersectJ^\prime\times cuspM}{cuspJ-slope\times cuspM} +$$ + +
+ ![Gamma intersection approximation](./images/gamma_intersection.svg){ width="640" } +
Approximation of intersection with a gamma curve
+
+ +As can be seen from the figure above, the value of $boundaryM$ is not precisely the $M$ value of the true intersection with the curve. However, as mentioned previously, because the approximation follows a path similar in shape to the gamma curve, this can be used as an approximation of the true gamut boundary. For the upper part, the same methodology can be used, simply replacing $intersectJ$ with $Jmax - intersectJ$, and the same for the cusp intersection. + +So if $intersectJ+slope\times cuspM>cuspJ$: + +$$ +intersectJ^\prime=J_{max}-(J_{max}-intersectCusp)\times\left(\frac{J_{max}-intersectJ}{J_{max}-intersectCusp}\right)^\frac{1}{\gamma} +$$ + +Thus: + +$$ +boundaryM=\frac{cuspM\times(J_{max}-intersectCusp)\times\left(\frac{J_{max}-intersectJ}{J_{max}-intersectCusp}\right)^\frac{1}{\gamma}}{slope\times cuspM+J_{max}-cuspJ} +$$ + +!!! note + The $\gamma$ values for the upper and lower parts are not necessarily the same. In the ACES 2.0 rendering, a constant value is adequate for the lower part of the gamut hull, but a varying value is needed to approximate the upper part. + +[This Desmos plot](https://www.desmos.com/calculator/bbyrfbbbul) shows the intersection solves, slope calculation and boundary approximation, as the source $(M, J)$ and cusp are dragged interactively. + +Optionally, in order to smooth the abrupt change of compression across the cusp, smoothing can be applied by finding the intersections with both the upper and lower boundary lines, and then taking a ‘[smooth minimum](https://www.desmos.com/calculator/a1uny6zrtf)’ between them. Simply using this value will round off the cusp, thus cutting into the gamut volume. In order to ensure that the smoothed approximation contains the whole true gamut, the cusp used in the boundary calculations must be moved out slightly from the actual cusp position. This ‘puffing out’ of the approximated boundary has the additional benefit that the exact value of the gamma used to approximate it is less crucial. + + +‘Reach-mode’ gamut compression +---------------- + +For the compression function described [previously](#compression), constant values may be used for the threshold and limit. However it has been proposed that for the ACES DRT it is beneficial if the limit is set such that compression maps the boundary of a particular ‘reach gamut’ (ACES AP1 has been decided to be suitable) to the target gamut boundary. This ensures that when the inverse gamut compression is applied, values within the target gamut will be mapped to values inside the reach gamut. This mapping will map points on the boundary of one gamut to the boundary of the other, but will not necessarily map the primaries of one gamut to those of the other, because the mapping occurs along lines of constant perceptual hue as defined by the JMh space. + +
+ ![Hue lines](./images/hue_lines.png){ width="512" } +
CIE 1931 Chromaticity plot of lines of constant JMh hue
+
+ +To achieve this, another boundary intersection needs to be found — that of the compression vector with the reach gamut boundary. This boundary will have the same shape as the lower part of the target gamut but, being scene-referred, it is unbounded so the curve will continue up indefinitely, rather than tapering above a cusp, as the target gamut does. + +Therefore a point on the reach gamut boundary at the hue under consideration must be found, which can then be treated in the same way as the target gamut cusp for the purposes of fitting a power law approximation to the true shape. The same $\gamma$ value can be used as for the lower part of the target gamut. + +If the sampled point used as a cusp for the reach gamut has a $J$ value equal to $J_{max}$, then the compression vector for this point will be horizontal. Thus $J_{max}$ can be used as the normalization factor for intersectJ in the same boundary intersection approximation as used for the target gamut. + +Thus: + +$$ +intersectReachJ^\prime=J_{max}\times\left(\frac{intersectJ}{J_{max}}\right)^{\frac{1}{\gamma}} +$$ + +
+ ![Gamut intersections](./images/reach_intersection.svg){ width="900" } +
Intersections with the target and reach gamuts
+
+ +and: + +$$ +reachM=\frac{intersectReachJ^\prime\times reachCuspM}{J_{max}-slope\times reachCuspM} +$$ + +and the limit value for reach-mode compression is: + +$$ +limit=\frac{reachM}{boundaryM} +$$ + +There are no objectively correct values for the threshold and exponent parameters. An exponent of 1.2 has been found to produce satisfactory results, and is the same exponent used in the ACES 1.3 [Reference Gamut Compression]((../../guides/rgc-implementation)). For the threshold, fixed values of about 0.75 have been found to work well, but later (v049+) versions of the ACES 2.0 candidate DRT use a variable threshold, proposed by Pekka Riikonen, which is the reciprocal of the limit value. This has been shown to reduce certain artifacts for HDR display targets. + + + diff --git a/docs/output-transforms/technical-details/index.md b/docs/output-transforms/technical-details/index.md new file mode 100644 index 0000000..8f86242 --- /dev/null +++ b/docs/output-transforms/technical-details/index.md @@ -0,0 +1,41 @@ +Overview +======== + + +Introduction +------------ +The Output Transform is a display rendering transform essential to consistently and predictably rendering ACES2065-encoded image date to a particular display. The Output Transform is based on a simplified version of the [Hellwig 2022](https://doi.org/10.1002/col.22792) Color Appearance Model (CAM). The Hellwig model represents color using a number of different color correlates, but for the purposes of display rendering in the ACES 2.0 Output Transform, three are used: + +- **J** : perceived lightness +- **M** : perceived colorfulness +- **h** : perceived hue + + +### Overview of the rendering steps +``` mermaid +flowchart LR + A("ACES + RGB + Input") --> + B[ACES + to + JMh] --> + C["Tonescale + (J Only)"] --> + D["Chroma + Compression + (M Only)"] --> + E["Gamut + Compression + (J & M)"] --> + F[Display + Encoding] --> + G(Display + RGB + Output); +``` +
The flow of the ACES 2.0 Display Rendering Transform (DRT)
+ + +Design Goals +------------ diff --git a/docs/overview.md b/docs/overview.md new file mode 100644 index 0000000..c51070c --- /dev/null +++ b/docs/overview.md @@ -0,0 +1 @@ +# ACES System Overview \ No newline at end of file diff --git a/docs/guides/rgc-implementation/images/gc_test_image_v007_odt_sRGB.png b/docs/rgc/guides/rgc-implementation/images/gc_test_image_v007_odt_sRGB.png similarity index 100% rename from docs/guides/rgc-implementation/images/gc_test_image_v007_odt_sRGB.png rename to docs/rgc/guides/rgc-implementation/images/gc_test_image_v007_odt_sRGB.png diff --git a/docs/guides/rgc-implementation/images/resolve-parametric.png b/docs/rgc/guides/rgc-implementation/images/resolve-parametric.png similarity index 100% rename from docs/guides/rgc-implementation/images/resolve-parametric.png rename to docs/rgc/guides/rgc-implementation/images/resolve-parametric.png diff --git a/docs/guides/rgc-implementation/images/rgc-collage.png b/docs/rgc/guides/rgc-implementation/images/rgc-collage.png similarity index 100% rename from docs/guides/rgc-implementation/images/rgc-collage.png rename to docs/rgc/guides/rgc-implementation/images/rgc-collage.png diff --git a/docs/guides/rgc-implementation/index.md b/docs/rgc/guides/rgc-implementation/index.md similarity index 100% rename from docs/guides/rgc-implementation/index.md rename to docs/rgc/guides/rgc-implementation/index.md diff --git a/docs/guides/rgc-user/images/blue-bar-after.jpeg b/docs/rgc/guides/rgc-user/images/blue-bar-after.jpeg similarity index 100% rename from docs/guides/rgc-user/images/blue-bar-after.jpeg rename to docs/rgc/guides/rgc-user/images/blue-bar-after.jpeg diff --git a/docs/guides/rgc-user/images/blue-bar-before.jpeg b/docs/rgc/guides/rgc-user/images/blue-bar-before.jpeg similarity index 100% rename from docs/guides/rgc-user/images/blue-bar-before.jpeg rename to docs/rgc/guides/rgc-user/images/blue-bar-before.jpeg diff --git a/docs/guides/rgc-user/images/bluescreen-after.jpeg b/docs/rgc/guides/rgc-user/images/bluescreen-after.jpeg similarity index 100% rename from docs/guides/rgc-user/images/bluescreen-after.jpeg rename to docs/rgc/guides/rgc-user/images/bluescreen-after.jpeg diff --git a/docs/guides/rgc-user/images/bluescreen-before.jpeg b/docs/rgc/guides/rgc-user/images/bluescreen-before.jpeg similarity index 100% rename from docs/guides/rgc-user/images/bluescreen-before.jpeg rename to docs/rgc/guides/rgc-user/images/bluescreen-before.jpeg diff --git a/docs/guides/rgc-user/images/dj-after.jpeg b/docs/rgc/guides/rgc-user/images/dj-after.jpeg similarity index 100% rename from docs/guides/rgc-user/images/dj-after.jpeg rename to docs/rgc/guides/rgc-user/images/dj-after.jpeg diff --git a/docs/guides/rgc-user/images/dj-before.jpeg b/docs/rgc/guides/rgc-user/images/dj-before.jpeg similarity index 100% rename from docs/guides/rgc-user/images/dj-before.jpeg rename to docs/rgc/guides/rgc-user/images/dj-before.jpeg diff --git a/docs/guides/rgc-user/images/guitarist-after.jpeg b/docs/rgc/guides/rgc-user/images/guitarist-after.jpeg similarity index 100% rename from docs/guides/rgc-user/images/guitarist-after.jpeg rename to docs/rgc/guides/rgc-user/images/guitarist-after.jpeg diff --git a/docs/guides/rgc-user/images/guitarist-before.jpeg b/docs/rgc/guides/rgc-user/images/guitarist-before.jpeg similarity index 100% rename from docs/guides/rgc-user/images/guitarist-before.jpeg rename to docs/rgc/guides/rgc-user/images/guitarist-before.jpeg diff --git a/docs/guides/rgc-user/images/okja-after.jpeg b/docs/rgc/guides/rgc-user/images/okja-after.jpeg similarity index 100% rename from docs/guides/rgc-user/images/okja-after.jpeg rename to docs/rgc/guides/rgc-user/images/okja-after.jpeg diff --git a/docs/guides/rgc-user/images/okja-before.jpeg b/docs/rgc/guides/rgc-user/images/okja-before.jpeg similarity index 100% rename from docs/guides/rgc-user/images/okja-before.jpeg rename to docs/rgc/guides/rgc-user/images/okja-before.jpeg diff --git a/docs/guides/rgc-user/images/pronto-after.jpeg b/docs/rgc/guides/rgc-user/images/pronto-after.jpeg similarity index 100% rename from docs/guides/rgc-user/images/pronto-after.jpeg rename to docs/rgc/guides/rgc-user/images/pronto-after.jpeg diff --git a/docs/guides/rgc-user/images/pronto-before.jpeg b/docs/rgc/guides/rgc-user/images/pronto-before.jpeg similarity index 100% rename from docs/guides/rgc-user/images/pronto-before.jpeg rename to docs/rgc/guides/rgc-user/images/pronto-before.jpeg diff --git a/docs/guides/rgc-user/images/red-xmas-after.jpeg b/docs/rgc/guides/rgc-user/images/red-xmas-after.jpeg similarity index 100% rename from docs/guides/rgc-user/images/red-xmas-after.jpeg rename to docs/rgc/guides/rgc-user/images/red-xmas-after.jpeg diff --git a/docs/guides/rgc-user/images/red-xmas-before.jpeg b/docs/rgc/guides/rgc-user/images/red-xmas-before.jpeg similarity index 100% rename from docs/guides/rgc-user/images/red-xmas-before.jpeg rename to docs/rgc/guides/rgc-user/images/red-xmas-before.jpeg diff --git a/docs/guides/rgc-user/images/resolve-clip-settings.png b/docs/rgc/guides/rgc-user/images/resolve-clip-settings.png similarity index 100% rename from docs/guides/rgc-user/images/resolve-clip-settings.png rename to docs/rgc/guides/rgc-user/images/resolve-clip-settings.png diff --git a/docs/guides/rgc-user/images/resolve-cm-settings.png b/docs/rgc/guides/rgc-user/images/resolve-cm-settings.png similarity index 100% rename from docs/guides/rgc-user/images/resolve-cm-settings.png rename to docs/rgc/guides/rgc-user/images/resolve-cm-settings.png diff --git a/docs/guides/rgc-user/images/rgc-workflow.png b/docs/rgc/guides/rgc-user/images/rgc-workflow.png similarity index 100% rename from docs/guides/rgc-user/images/rgc-workflow.png rename to docs/rgc/guides/rgc-user/images/rgc-workflow.png diff --git a/docs/guides/rgc-user/index.md b/docs/rgc/guides/rgc-user/index.md similarity index 100% rename from docs/guides/rgc-user/index.md rename to docs/rgc/guides/rgc-user/index.md diff --git a/docs/specifications/rgc/images/rgc-after.jpg b/docs/rgc/specification/images/rgc-after.jpg similarity index 100% rename from docs/specifications/rgc/images/rgc-after.jpg rename to docs/rgc/specification/images/rgc-after.jpg diff --git a/docs/specifications/rgc/images/rgc-before.jpg b/docs/rgc/specification/images/rgc-before.jpg similarity index 100% rename from docs/specifications/rgc/images/rgc-before.jpg rename to docs/rgc/specification/images/rgc-before.jpg diff --git a/docs/specifications/rgc/images/rgc-cc24.jpg b/docs/rgc/specification/images/rgc-cc24.jpg similarity index 100% rename from docs/specifications/rgc/images/rgc-cc24.jpg rename to docs/rgc/specification/images/rgc-cc24.jpg diff --git a/docs/specifications/rgc/images/rgc-compression.gif b/docs/rgc/specification/images/rgc-compression.gif similarity index 100% rename from docs/specifications/rgc/images/rgc-compression.gif rename to docs/rgc/specification/images/rgc-compression.gif diff --git a/docs/specifications/rgc/images/rgc-distance.jpg b/docs/rgc/specification/images/rgc-distance.jpg similarity index 100% rename from docs/specifications/rgc/images/rgc-distance.jpg rename to docs/rgc/specification/images/rgc-distance.jpg diff --git a/docs/specifications/rgc/images/rgc-polar-plot.gif b/docs/rgc/specification/images/rgc-polar-plot.gif similarity index 100% rename from docs/specifications/rgc/images/rgc-polar-plot.gif rename to docs/rgc/specification/images/rgc-polar-plot.gif diff --git a/docs/specifications/rgc/index.md b/docs/rgc/specification/index.md similarity index 100% rename from docs/specifications/rgc/index.md rename to docs/rgc/specification/index.md diff --git a/docs/system-components/organization/index.md b/docs/system-components/organization/index.md index a9e3ced..26cc01c 100644 --- a/docs/system-components/organization/index.md +++ b/docs/system-components/organization/index.md @@ -5,22 +5,16 @@ The ACES system consists of the many Academy-supplied transforms – standard co ## Github The ACES components are distributed across a few separate Github repositories: -* `aces-core` - * Intended for the core algorithms and math that is ACES -* `aces-colorspace-and-input` - * Intended for color space definitions and their conversion to/from ACES (or another color space) +* `aces-core` : Algorithms and maths that are the core of the ACES rendering transforms +* `aces-colorspace-and-input` : Contains color space definitions and the conversion between them to and/or from ACES (or another color space) * All Input Transforms are Color Space Transforms but not all Color Space Transforms are Input Transforms. Some ACES Color Space transforms can be used as Input Transforms, or if they convert the other direction, as Inverse Input Transforms -* `aces-output` - * Output Transforms structured essentially as “macros” that call aces-core transforms with preset parameters -* `aces-look` - * Any Transform that modifies the default appearance of images through an ACES pipeline. Can be empirical or analytical Transforms. -* `aces-util` - * Functions that are not core essential to any of the other categories but might have use when building a pipeline or debugging (e.g. Unity). Some of these might also be called with certain preset parameters to be used as Look Transforms (e.g. ASC_CDL, exposure adjustment, etc.) -* `aces-amf` - * schema and example files for ACES Metadata File (AMF) -* `aces-docs` - * ACES documentation hosted in mkdocs +* `aces-output` : Transforms that are wrapper functions with preset parameters to common display standards, and which rely on the functions defined in aces-core +* `aces-look` : Transforms that modify the default appearance of images through an ACES pipeline. Can be analytical or empirical transforms. +* `aces-util` : Any transforms that are not essential to any of the other categories but might have some use when building a pipeline or debugging (e.g. Unity). Some of these might also be called with certain preset parameters to be used as Look Transforms (e.g. ASC_CDL, exposure adjustment, etc.) +* `aces-amf` : XSD schema and example files for ACES Metadata File (AMF) +* `aces-docs` : ACES documentation written in markdown and published using mkdocs -The components are divided across separate repositories to enforce the notion that the system is flexible and extensible, and that new transforms can be added without breaking compatibility with the rest of the system. The addition of a new input, output, or look transform should have no impact on the ACES System Version number. For example, if a new camera is released, an Input Transform can be developed for that camera and contributed to the aces-input repository. This is done independent of the overall ACES system and thus does not warrant a change to the current version of ACES. +## Rationale +The ACES system components are divided across separate repositories to enforce the notion that the system is flexible and extensible, and that new transforms can be added without breaking compatibility with the rest of the system. The addition of a new Input, Output, or Look Transform should have no impact on the ACES System Version number. For example, if a new camera is released, an Input Transform can be developed for that camera and contributed to the aces-input repository. This is done independent of the overall ACES system and thus does not warrant a change to the current version of ACES. In the opposite sense, transforms need not be included in an “official” release in order to be deemed usable on an ACES project. New transforms can be considered “official” as soon as they have been reviewed and accepted into the repository. Developers can choose to keep up with adding support for new inputs or outputs however best fits into their development cycles. From time to time, we will “roll up” these changes into a commit on the main branch to summarize the new additions and provide a milestone marker against which to compare one’s available presets. diff --git a/docs/system-components/overview/index.md b/docs/system-components/overview/index.md index 929790a..f1ad43d 100644 --- a/docs/system-components/overview/index.md +++ b/docs/system-components/overview/index.md @@ -2,7 +2,9 @@ System Component Documentation Overview === # Introduction -The ACES system is composed of many core components: encodings, image files, transforms, and metadata. ACES 1.0 was the first official release of these components. It was anticipated that at some point after initial adoption, the ACES system would require a revision to address user feedback, fix bugs and create a stable release that could have all its components standardized. In addition, ACES would always require updates to add new transforms to support new cameras, displays, or industry standards. Therefore, a specification for versioning of ACES system components and a guide to consistent naming of components is needed. +The ACES system is composed of many core components: encodings, transforms, metadata, and associated image files. + +ACES 1.0 was the first official release of these components. It was anticipated that at some point after initial adoption, the ACES system would require a revision to address user feedback, fix bugs and create a stable release that could have all its components standardized. In addition, ACES would always require updates to add new transforms to support new cameras, displays, or industry standards. Therefore, a specification for versioning of ACES system components and a guide to consistent naming of components is needed. This document describes the versioning of the various engineering components that comprise the ACES System Release. These attributes can be referenced in the ACES Metadata File to describe the exact transforms used when ACES image files were viewed, created, or modified. diff --git a/docs/system-components/versioning/index.md b/docs/system-components/versioning/index.md new file mode 100644 index 0000000..0a43290 --- /dev/null +++ b/docs/system-components/versioning/index.md @@ -0,0 +1,19 @@ +Versioning +=== + +# ACES System Version +An increment to the ACES System Version indicates that some critical new feature or change has been implemented. The system version number is not incremented when new Colorspace, Input, Output, or Look transforms are added. + +The ACES System shall use the following versioning string to identify the overall version for the bundle of components supplied with a particular release: +ReleaseMajorVersionNumber.ReleaseMinorVersionNumber.ReleasePatchVersionNumber + +The 'patch' version number shall be incremented when backward compatible bug fixes are made. New patch versions shall not require an update to all transforms. + +The 'minor' version number shall be incremented with new functionality added in a backward compatible manner. Minor versions shall not require an update to all ACES core and vendor/user-supplied components but may be used to indicate that a new feature has been added. + +The 'major' version number shall be incremented if substantive changes are made to the ACES core components in a backward incompatible way. An increment of the major version number indicates that all core and vendor/user-supplied components should be checked and updated to confirm compatibility with the new ACES major version. + +ACES implementations shall report the version of the ACES System to at least the minor version number. Reporting of the patch version is optional. + +The ACES System version reflects Academy-supplied transforms included in the ACES-hosted Github repositories (or derivative transforms) and shall not require incrementation when custom-created or ACES vendor/user-supplied components are updated. + diff --git a/docs/tb/white-point/images/PrintThroughChromaticities-dark.png b/docs/white-point/images/PrintThroughChromaticities-dark.png similarity index 100% rename from docs/tb/white-point/images/PrintThroughChromaticities-dark.png rename to docs/white-point/images/PrintThroughChromaticities-dark.png diff --git a/docs/tb/white-point/images/PrintThroughChromaticities-light.png b/docs/white-point/images/PrintThroughChromaticities-light.png similarity index 100% rename from docs/tb/white-point/images/PrintThroughChromaticities-light.png rename to docs/white-point/images/PrintThroughChromaticities-light.png diff --git a/docs/tb/white-point/images/cieuv-dark.png b/docs/white-point/images/cieuv-dark.png similarity index 100% rename from docs/tb/white-point/images/cieuv-dark.png rename to docs/white-point/images/cieuv-dark.png diff --git a/docs/tb/white-point/images/cieuv-light.png b/docs/white-point/images/cieuv-light.png similarity index 100% rename from docs/tb/white-point/images/cieuv-light.png rename to docs/white-point/images/cieuv-light.png diff --git a/docs/tb/white-point/index.md b/docs/white-point/index.md similarity index 100% rename from docs/tb/white-point/index.md rename to docs/white-point/index.md diff --git a/mkdocs.yml b/mkdocs.yml index ac3ccce..f9a3825 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -112,26 +112,31 @@ nav: - 'ACES Documentation': - 'Getting Started': index.md - 'System Overview': overview.md - - 'System Component Documentation': + - 'Component Names': component-names/index.md + - 'Technical Documentation': - 'Overview': system-components/overview/index.md - 'Organization': system-components/organization/index.md - 'Encodings': - - 'ACEScg': - - 'Specification': specifications/acescg/index.md - - 'ACES 2065-1': - - 'Specification': specifications/aces2065/index.md + - 'Overview': encodings/overview.md + - 'ACES2065-1': encodings/aces2065/index.md + - 'ACEScg': encodings/acescg/index.md + - 'ACEScct': encodings/acescct/index.md + - 'ACEScc': encodings/acescc/index.md + - 'ACESproxy': acesproxy/index.md - 'Transforms': - - 'Reference Gamut Compression': - - 'Specification': specifications/rgc/index.md - - 'User Guide': guides/rgc-user/index.md - - 'Implementation Guide': guides/rgc-implementation/index.md + - 'Reference Gamut Compression': rgc/specification/index.md + - 'Output Transforms': + - output-transforms/technical-details/index.md + - 'Chroma Compression': output-transforms/technical-details/chroma-compression/index.md + - 'Gamut Compression': output-transforms/technical-details/gamut-compression/index.md - 'File Formats': - - 'ACES Container': - - 'Specification': specifications/aces-container/index.md - - 'ACES Metadata File': - - 'Specification': specifications/amf/index.md - - 'User Guide': guides/amf/index.md + - 'ACES Metadata File': + - 'Specification': amf/specification/index.md + - 'User Guide': amf/guides/index.md + - 'Common LUT Format': + - 'Specification': clf/specification/index.md + - 'Implementation Guide': clf/guides/index.md - 'Recommended Procedures': procedures/index.md - - 'Workflow Guides': workflows/index.md + - 'User Guides': workflows/index.md - 'Production Tool Guides': tools/index.md - 'Glossary': glossary/index.md