Click or drag to probe coordinates. Gamut triangles overlay automatically for active spaces.
Standards are always here. Anything you import or clone sits alongside them and can be loaded into the diagram or removed.
| Name | Type | White | Transfer | Actions |
|---|
IEC 61966-2-1 primaries + transfer
sRGB. Primaries and D65 white identical to BT.709; the piecewise curve with a linear toe below 0.04045 that nine of this page’s thirteen spaces are encoded through. Its effective exponent is about 2.2, which is where the habit of writing “γ 2.2” for it comes from.
ITU-R BT.709-6 primaries
HDTV parameter values: primaries (0.64, 0.33), (0.30, 0.60), (0.15, 0.06) and D65. Its OETF is not sRGB’s — BT.709 specifies α 1.099, β 0.018 and an exponent of 0.45 — so this page takes the primaries from it and the curve from IEC 61966-2-1.
ITU-R BT.2020-2 primaries + transfer
UHDTV. Near-spectral primaries covering 63.4% of the CIE 1931 xy locus as this page measures it; the 75.8% usually quoted is against a smaller locus area than the one drawn here. Table 4 gives the transfer curve, α = 1.09929683, β = 0.01805397.
ITU-R BT.2100-2 transfer
HDR-TV over BT.2020 primaries. Defines both PQ and HLG, and in Table 5 the OOTF that turns the HLG OETF into an EOTF — the part this page does not apply.
SMPTE ST 2084 transfer
The perceptual quantiser. Its output is an absolute luminance, 0 to 10 000 cd/m², which is why it is the one curve on this page with an axis of its own.
ARIB STD-B67 transfer, partial
Hybrid Log-Gamma. What runs here is the inverse OETF; the system gamma of the full EOTF depends on a nominal peak luminance and a surround this tool never asks for.
SMPTE RP 431-2 primaries + transfer
The DCI reference projector: primaries, a green-shifted white at x 0.314, y 0.351, and a pure γ 2.6.
SMPTE ST 2065-1 primaries
ACES 2065-1, which fixes the AP0 primaries. Its blue sits at (0.0001, −0.077), outside the spectral locus, so the triangle encloses every real colour and then some.
ACES S-2014-004 primaries
ACEScg, which fixes AP1 — a working-space subset of AP0 with all three primaries inside the locus.
AMPAS TB-2018-001 cited only
Derives the ACES white point chromaticity. It is not the document that defines AP0 and AP1, which is what this page used to cite it for.
Adobe RGB (1998) primaries + transfer
A wider display gamut at D65. Its exponent is 563/256, i.e. 2.19921875; the 2.2 everyone writes is a rounding of it, and this page ran the rounding until the rebuild.
ISO 22028-2 primaries + transfer
ROMM RGB, which is what ProPhoto is: a very wide gamut at D50, γ 1.8 with a linear segment below 1/512. Not ISO 12640-3, which is CIELAB/SCID standard colour image data and was cited here by mistake.
Adobe Wide Gamut RGB primaries
Near-locus primaries at D50. A vendor encoding rather than a standard, which is why no document number sits beside it.
NTSC primaries
The original US television primaries, with a wider green than sRGB and an Illuminant C white. No receiver ever really had this gamut.
EBU Tech 3213 primaries
The PAL/SECAM primaries, close to sRGB’s. The γ 2.8 this page runs for it is the assumed display gamma of the system, not a curve this document specifies.
CIE 015:2018 observer
Colorimetry, 4th ed., superseding 15:2004. Table 1 is the 1931 2° colour matching functions this page integrates the spectral locus from, at 5 nm and four decimals.
CIE 170-1:2006 cited only
The cone-fundamental-based chromaticity diagram. This page draws the 1931 and 1976 diagrams; it does not draw this one.
ICC.1:2022 cited only
The ICC profile specification, v4.4. Relevant to how colour moves between spaces, which is the neighbouring tool’s job, not this one’s.
CIE 1931 xy chromaticity drawn
x = X / (X + Y + Z) y = Y / (X + Y + Z) CIE 1976 u′v′: u′ = 4X / (X + 15Y + 3Z) v′ = 9Y / (X + 15Y + 3Z)
Both diagrams come from the same tristimulus values; only the projection differs. Equal distances in u′v′ are closer to equal perceived differences, which is why every share on this page is quoted there.
RGB ↔ XYZ matrix derivation derived
Given primaries (xₕ, yₕ), (xₛ, yₛ), (xₖ, yₖ) and white (X₩, Y₩, Z₩): 1. xy → XYZ: Xᵢ = xᵢ/yᵢ, Yᵢ = 1, Zᵢ = (1 − xᵢ − yᵢ)/yᵢ 2. M has columns [Xₕ Xₛ Xₖ], [Yₕ Yₛ Yₖ], [Zₕ Zₛ Zₖ] 3. S = M⁻¹ · [X₩ Y₩ Z₩]ᵀ 4. M_rgb2xyz = M · diag(Sₕ, Sₛ, Sₖ) 5. M_xyz2rgb = (M_rgb2xyz)⁻¹
Steps 3 and 5 read M¹ here until the rebuild — a superscript one where an inverse belongs, which makes both lines say something the code does not do.
sRGB OETF runs
V = 12.92 × C for C ≤ 0.0031308 V = 1.055 × C^(1/2.4) − 0.055 otherwise
The curve nine spaces share. Its toe is what makes the “γ 2.2” shorthand wrong in the darkest half-percent.
ST 2084 PQ EOTF runs
Y = 10000 × max(0, V^(1/m₂) − c₁)^(1/m₁)
÷ (c₂ − c₃ × V^(1/m₂))^(1/m₁)
m₁ = 2610/16384 = 0.1593017578125
m₂ = 2523/4096 × 128 = 78.84375
c₁ = 3424/4096 = 0.8359375
c₂ = 2413/4096 × 32 = 18.8515625
c₃ = 2392/4096 × 32 = 18.6875
The rational forms are what ST 2084 gives; the decimals beside them are exact, not rounded. This block printed four-figure roundings and an exponent of 1/n where the standard says 1/m₁.
HLG OETF runs, partial
V = √(3E) for E ≤ 1/12 V = a × ln(12E − b) + c otherwise a = 0.17883277, b = 1 − 4a, c = 0.5 − a × ln(4a)
This is the OETF. The EOTF adds the OOTF from BT.2100 Table 5, whose system gamma needs a nominal peak luminance this tool does not ask for — so the row in Transfer reads partial.
Gamut area — shoelace runs
A = ½ · |xₕ(yₛ − yₖ) + xₛ(yₖ − yₕ) + xₖ(yₕ − yₛ)|
Used for the primaries’ triangle and, over the whole locus polygon, for the denominator it is divided by. The share is quoted against the locus, in the plane named; the ratio to sRGB is a separate column, because the two answer different questions.
Gamut volume in CIELAB runs
box = the a,b extent of this space, measured, padded 4% V ≈ (in-gamut / N) × L₀₀ × (a₁ − a₀) × (b₁ − b₀) spread = |V(N) − V(N/2)|
The box is fitted to each space. A fixed a, b ±128 — which is what this block used to describe — truncates ProPhoto and Adobe Wide Gamut and cuts ACES AP0 off well inside itself. The samples are Halton, so the error falls faster than 1/√N and a Monte Carlo standard error would overstate it; the spread against a half-size run is quoted instead.
Gamut overlap runs
J(A, B) = |A ∩ B| / |A ∪ B|
Halton sampling in u′v′, with point-in-triangle classification. It sampled CIE xy until the rebuild, where equal areas are nothing like equal differences and green is overstated.
Twenty-two references, each with what this page takes from it. A ● marks one the rebuild corrected — a wrong document, a misattributed author, or a year that belonged to another edition.
What each space holds computed
Every figure below is computed by this page’s engine when the view opens. It was six typed rows, and they disagreed with the tool around them: sRGB’s xy triangle was printed as 0.0639, roughly its u′v′ area, and Adobe RGB as 112% of sRGB where it is 135%.
| Space | Area (xy) | Area (u′v′) | % sRGB (xy) | % locus (u′v′) |
|---|---|---|---|---|
| Measuring… | ||||
Areas are the primaries’ triangle in the named plane. The share is against the spectral locus measured in the same plane, so a space whose primaries fall outside it can exceed 100% — that is real, not an error.
The transfer curves runs
- sRGB — piecewise, linear toe below 0.04045, effective γ ≈ 2.2.
- PQ (ST 2084) — perceptual quantiser, 0 to 10 000 cd/m² with near-JND spacing.
- HLG — hybrid log-gamma, backward-compatible with SDR on conventional displays.
- BT.2020 — its own piecewise curve, α 1.09929683, β 0.01805397. Not sRGB’s, which is what ran here under the label “≈ γ 2.4”.
- ROMM (ProPhoto) — γ 1.8 above 1/512, linear (× 16) below it.
- Adobe RGB (1998) — γ 563/256, i.e. 2.19921875.
- Pure gamma — 2.4 (BT.1886), 2.6 (DCI), 2.8 (PAL/SECAM).
MacAdam ellipses stand-in
MacAdam (1942) measured 25 chromaticity discrimination ellipses and published them as (g₁₁, g₁₂, g₂₂) coefficients, showing that the xy plane is not perceptually uniform.
The overlay here is not that set. It holds 24 ellipses given directly as semi-axes and an angle, and every one of those values is a whole number but a single 6.4 — a shape no coefficient fit produces. It is a hand-drawn approximation of the published figure, useful for showing that the ellipses vary in size and tilt, and no basis for reading a discrimination threshold off the diagram. The register records it as a stand-in; the ellipses are also drawn at a fixed exaggeration, as they are in every published reproduction.
The u′v′ diagram flattens much of the non-uniformity — the ellipses come out rounder — but evenness of that kind needs CIELAB or OKLab, not a chromaticity plane.
A spread, not a ± computed
Pseudo-random Monte Carlo converges as O(1/√N), and that is the formula behind the ± most tools print. These samples are Halton — quasi-random, low discrepancy — so the error falls faster than 1/√N and quoting a Monte Carlo standard error would overstate it.
What is quoted is the spread between the run and a half-size one. It is not a confidence interval and is not offered as one; it is the honest question of whether the count is high enough, answered by asking the estimator itself. Raising the sample count narrows it, and you can watch that happen.
The sampling box matters more than the count. It is measured to fit each space and padded slightly; the fixed a, b ±128 that stood here truncated the widest spaces inside their own gamuts, which is a bias no number of samples removes.
Boundaries, not mapping context
An earlier version of this section said “three mapping intents are implemented” and described clip, scale and a sigmoid rolloff. None of them is in this tool — the string “intent” does not appear in its engine. They belong to Gamut Map, which is where a colour outside a destination gamut is actually brought inside one.
What the Gamut Lab does is define and measure: where a space ends, how much it holds, and through which curve it is encoded. Rendering intents are the next question, in the next tool.
Imaginary primaries context
ACES AP0 places its blue primary at (0.0001, −0.077), outside the spectral locus. An imaginary primary lets the triangle enclose every real colour, which is the point of an archival encoding — and the reason its share against the locus reads “> 100%” rather than a coverage percentage.
The XYZ-to-RGB matrix that follows produces negative linear RGB for some visible colours. Those are valid scene-referred values in an ACES pipeline, not errors, and the volume figure counts them because the encoding does.
OKLab against CIELAB context
CIELAB (1976) was built for surface colours and loses evenness in saturated regions and at the extremes of lightness. OKLab (Ottosson, 2020) holds hue lines straighter and chroma more evenly, so a slice through it comes out rounder and more symmetric — easier to read a boundary from, particularly for sRGB and Display P3.
The volume figure on this page is still CIELAB, because that is what is comparable with what everyone else publishes.