Commit Graph

1326 Commits

Author SHA1 Message Date
phanium
0f80229468 Fix edit-in-kitty +lnum path 2026-01-01 18:28:07 +08:00
Kovid Goyal
e14e34948e More cleanups for color parsing
Using rounding when converting float to uint8 for more accuracy.
Fix rgb:3 and rgbi: parsing in Go code. Various other minor cleanups.
2025-12-31 09:35:09 +05:30
Kovid Goyal
a4d88beddb Micro-optimisation 2025-12-30 13:40:49 +05:30
Jökull Sólberg
64abd87a9e Add wide gamut color support with OKLCH and LAB formats
Implements modern wide gamut color formats with CSS Color Module Level 4
gamut mapping, addressing PR feedback with Go implementation, performance
benchmarks, and reorganized documentation.

Features:
- OKLCH (perceptually uniform color space)
- CIE LAB (device-independent color space)
- CSS Color 4 compliant gamut mapping algorithm
- Inline comment support in color config parsing

Addressing PR Feedback:

1. Go Implementation (tools/utils/style/):
   - Complete OKLCH and LAB parsing with gamut mapping
   - Matches Python implementation structure
   - Comprehensive test suite (all tests passing)
   - Performance benchmarks showing acceptable overhead

2. Performance Benchmarks:
   - OKLCH: ~4.6 µs/op
   - LAB: ~1.5 µs/op
   - 10 mixed colors: ~13 µs total
   - Typical config (50 colors): <0.5ms startup impact

3. Documentation Reorganization:
   - Moved detailed color docs to docs/wide-gamut-colors.rst
   - Configuration docs now link to separate documentation
   - Reduces size of main configuration documentation

Gamut Mapping:
- Binary search chroma reduction from CSS Color Module Level 4
- Preserves lightness and hue while reducing chroma for out-of-gamut colors
- Uses deltaE OK (JND threshold: 0.02) for perceptual difference
- Ensures graceful degradation on sRGB displays

Python Implementation:
- parse_oklch(): OKLCH color parsing with gamut mapping
- parse_lab(): CIE LAB parsing with gamut mapping via OKLCH conversion
- lab_to_oklch(): LAB to OKLCH conversion for consistent gamut mapping
- oklch_to_srgb_gamut_map(): CSS Color 4 gamut mapping algorithm
- srgb_to_oklab(): Reverse conversion for deltaE calculations
- deltaE_ok(): Perceptual color difference in OKLab space

Go Implementation:
- colorspaces.go: All color space conversions and gamut mapping
- wrapper.go: ParseColor() updated to support OKLCH and LAB
- Comprehensive test coverage with benchmarks
- Matches Python implementation behavior

Robustness:
- NaN and infinity validation in all color parsing functions
- Defense-in-depth with validation at parsing and gamut mapping levels
- Returns None/error for invalid input (consistent error handling)
- Validates before clamping operations to prevent NaN propagation

Files changed:
- Python: kitty/rgb.py, kitty_tests/datatypes.py (+250 lines)
- Go: tools/utils/style/colorspaces.go, wrapper.go (+350 lines, tests)
- Docs: docs/wide-gamut-colors.rst (moved from inline)
- Config: kitty/options/definition.py (simplified, links to docs)

References:
- CSS Color Module Level 4: https://www.w3.org/TR/css-color-4/
- OKLCH Color Space: https://bottosson.github.io/posts/oklab/

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-27 14:34:34 +00:00
Kovid Goyal
f1cc676ea6 ... 2025-12-08 20:47:20 +05:30
Kovid Goyal
fee4cb0975 fix warning from linter 2025-12-02 23:37:53 +05:30
Kovid Goyal
f8db2702db choose files: Add a few more output formats 2025-11-26 21:13:57 +05:30
Kovid Goyal
fae50137a9 Add a clear cache action 2025-11-23 12:15:29 +05:30
Kovid Goyal
6de4e5237f Resize method should not use bounds 2025-11-17 12:59:04 +05:30
Kovid Goyal
68805850a5 Preserve opacity when resizing on image load 2025-11-15 14:56:21 +05:30
Kovid Goyal
25cf8622bc Avoid double is_opaque scan 2025-11-15 13:06:17 +05:30
Kovid Goyal
fb6332d8e2 Resize frames in parallel 2025-11-15 12:41:14 +05:30
Kovid Goyal
1d19942811 Store more metadata about pixel data shape when serializing 2025-11-15 12:23:56 +05:30
Kovid Goyal
9bc29a7fa6 Dont write to ~/.gitconfig in the tests
Just in case the tests are run without setting HOME
2025-11-13 18:50:42 +05:30
Kovid Goyal
9be602f94f ... 2025-11-11 21:39:12 +05:30
Kovid Goyal
6f588a0c29 run modernize 2025-11-11 17:09:37 +05:30
Kovid Goyal
d19fc375ba Switch to external shm package 2025-11-10 12:01:05 +05:30
Kovid Goyal
1c8e8e9530 Switch over to the new imaging backend for icat
Greatly simplifies a whole bunch of code. The new backend takes care of
falling back to ImageMagick efficiently itself.
2025-11-10 11:34:56 +05:30
Kovid Goyal
57f7c8f65e Bump version of imaging for a few more fixes 2025-11-08 10:27:56 +05:30
Kovid Goyal
375aeae689 Clean up imagemagick disposal processing 2025-11-07 14:44:26 +05:30
Kovid Goyal
f8c78909fa Use an explicit APNG identifier for apng files with ImageMagick
Required as per Imagemgick docs: https://imagemagick.org/script/formats.php
2025-11-07 11:33:13 +05:30
Kovid Goyal
1e6d67b975 Update to the latest version of imaging
Gives us a bunch of new features and allows us to move a bunch of code
into imaging
2025-11-06 22:31:31 +05:30
Eng Zer Jun
d5455ab072 Update github.com/shirou/gopsutil to v4
v4 is the latest version with bug fixes and enhancements, notably the
removal of CGO implementations on Darwin in v4.24.9 [1].

Note: Due to the library's versioning policy, v4.24.5 is the first v4
release [2].

[1]: https://github.com/shirou/gopsutil/releases/tag/v4.24.9
[2]: https://github.com/shirou/gopsutil/releases/tag/v4.24.5

Signed-off-by: Eng Zer Jun <engzerjun@gmail.com>
2025-10-31 23:14:38 +08:00
Kovid Goyal
1e1a1851d0 Add support for Unicode 17
This is preliminary, all tests pass, but needs more careful review.
2025-10-18 09:59:53 +05:30
Kovid Goyal
1c2c01722b Bump version of imaging
Fixes an out of bounds error when processing opaque images
2025-10-15 08:29:23 +05:30
Kovid Goyal
284ae74201 icat: Report panics in the render function correctly
Also, only fallback to imagemagick on error when the engine is not
specified as builtin
2025-10-15 08:17:53 +05:30
Kovid Goyal
b627d2e4ab Move error handling code into its own library 2025-10-12 13:51:16 +05:30
Kovid Goyal
471831831b move more imaging code into the imaging module 2025-10-12 08:29:30 +05:30
Kovid Goyal
44df0c85c4 Mark the netPBM image types as decodable 2025-10-11 13:43:00 +05:30
Kovid Goyal
a1168be6c7 ... 2025-10-11 13:25:46 +05:30
Kovid Goyal
4c0c5c01f2 Bump version of imaging 2025-10-11 13:17:15 +05:30
Kovid Goyal
29e80f2c1b Remove unused code 2025-10-10 08:23:22 +05:30
Kovid Goyal
b543956638 ... 2025-10-09 20:29:15 +05:30
Kovid Goyal
ec7da87905 An endpoint to develop resizing code 2025-10-09 20:09:15 +05:30
Kovid Goyal
436ab9a95a Add a convenient entry point to test and work on the image serialization code 2025-10-09 19:26:05 +05:30
Kovid Goyal
35093d2105 Fix frame origins not be de-serialized 2025-10-09 19:22:22 +05:30
Kovid Goyal
9212c08638 Faster conversion of plaette to NRGB for opaque colors 2025-10-09 16:57:28 +05:30
Kovid Goyal
2dea3087b3 Faster is_opaque implementation for paletted images 2025-10-09 16:52:13 +05:30
Kovid Goyal
c48ed15007 ... 2025-10-09 16:12:39 +05:30
Kovid Goyal
127459012a Fix incorrect alpha values returned by NRGB color model 2025-10-09 11:39:39 +05:30
Kovid Goyal
298daa4e83 Utility method to save frame as uncompressed PNG 2025-10-09 10:56:33 +05:30
Kovid Goyal
9be66bfe4a When rendering with Go image libraries fails fallback to ImageMagick 2025-10-09 09:40:46 +05:30
Kovid Goyal
2ac2c17929 Fix transmission by file 2025-10-09 09:35:06 +05:30
Kovid Goyal
c6582e9f51 ... 2025-10-09 09:25:47 +05:30
Kovid Goyal
ceb712f791 DRYer 2025-10-09 09:00:37 +05:30
Kovid Goyal
aecf13302a Fix off-by-one in NRGB 2025-10-09 08:30:20 +05:30
Kovid Goyal
e61e95da3a ... 2025-10-09 08:04:58 +05:30
Kovid Goyal
37bd77f4a8 Bump version of imaging
imaging is now panic safe. Also format nested panics a bit better.
2025-10-09 08:00:31 +05:30
Kovid Goyal
f067e9cd92 Make various goroutines panic-safe 2025-10-09 07:17:53 +05:30
Kovid Goyal
49d8b1a9d0 More work on image preview rendering 2025-10-08 22:00:12 +05:30