mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-03-06 01:40:22 -05:00
scripts: srgb: use 2.2 gamma TF instead of piece-wise sRGB TF
This commit is contained in:
parent
1ea20b1b70
commit
ce424e0990
2 changed files with 20 additions and 24 deletions
15
CHANGELOG.md
15
CHANGELOG.md
|
|
@ -64,9 +64,24 @@
|
||||||
## Unreleased
|
## Unreleased
|
||||||
### Added
|
### Added
|
||||||
### Changed
|
### Changed
|
||||||
|
|
||||||
|
* `gamma-correct-blending=yes` now uses a pure gamma 2.2 transfer
|
||||||
|
function, instead of the piece-wise sRGB transfer function, to match
|
||||||
|
what compositors do.
|
||||||
|
|
||||||
|
|
||||||
### Deprecated
|
### Deprecated
|
||||||
### Removed
|
### Removed
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|
||||||
|
* Wrong colors when `gamma-correct-blending=yes` (the default when
|
||||||
|
there is compositor support). Note that some colors will still be
|
||||||
|
off by a **very** small amount, due to loss of precision when
|
||||||
|
converting to a linear color space. ([#2035][2035]).
|
||||||
|
|
||||||
|
[2035]: https://codeberg.org/dnkl/foot/issues/2035
|
||||||
|
|
||||||
|
|
||||||
### Security
|
### Security
|
||||||
### Contributors
|
### Contributors
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5,21 +5,16 @@ import math
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
|
|
||||||
|
# Note: we use a pure gamma 2.2 function, rather than the piece-wise
|
||||||
|
# sRGB transfer function, since that is what all compositors do.
|
||||||
|
|
||||||
def srgb_to_linear(f: float) -> float:
|
def srgb_to_linear(f: float) -> float:
|
||||||
assert(f >= 0 and f <= 1.0)
|
assert(f >= 0 and f <= 1.0)
|
||||||
|
return math.pow(f, 2.2)
|
||||||
if f <= 0.04045:
|
|
||||||
return f / 12.92
|
|
||||||
|
|
||||||
return math.pow((f + 0.055) / 1.055, 2.4)
|
|
||||||
|
|
||||||
|
|
||||||
def linear_to_srgb(f: float) -> float:
|
def linear_to_srgb(f: float) -> float:
|
||||||
if f < 0.0031308:
|
return math.pow(f, 1 / 2.2)
|
||||||
return f * 12.92
|
|
||||||
|
|
||||||
return 1.055 * math.pow(f, 1 / 2.4) - 0.055
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
|
|
@ -29,24 +24,10 @@ def main():
|
||||||
opts = parser.parse_args()
|
opts = parser.parse_args()
|
||||||
|
|
||||||
linear_table: list[int] = []
|
linear_table: list[int] = []
|
||||||
srgb_table: list[int] = []
|
|
||||||
|
|
||||||
for i in range(256):
|
for i in range(256):
|
||||||
linear_table.append(int(srgb_to_linear(float(i) / 255) * 65535 + 0.5))
|
linear_table.append(int(srgb_to_linear(float(i) / 255) * 65535 + 0.5))
|
||||||
|
|
||||||
for i in range(4096):
|
|
||||||
srgb_table.append(int(linear_to_srgb(float(i) / 4095) * 255 + 0.5))
|
|
||||||
|
|
||||||
for i in range(256):
|
|
||||||
while True:
|
|
||||||
linear = linear_table[i]
|
|
||||||
srgb = srgb_table[linear >> 4]
|
|
||||||
|
|
||||||
if i == srgb:
|
|
||||||
break
|
|
||||||
|
|
||||||
linear_table[i] += 1
|
|
||||||
|
|
||||||
|
|
||||||
opts.h_output.write("#pragma once\n")
|
opts.h_output.write("#pragma once\n")
|
||||||
opts.h_output.write("#include <stdint.h>\n")
|
opts.h_output.write("#include <stdint.h>\n")
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue